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,即可验证所有权并自行管理介绍。
一分钟完成验证A campaign engine for tabletop RPGs — generate content, build battle maps, and run live sessions with your table. Free to try at sparkdm.quest
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A campaign engine for tabletop RPGs — generate the content, build the maps, and run the
session live, in one place. Starting with D&D 5e.
Try it at sparkdm.quest — free for up to 3 worlds, no card required.
Spark covers the whole arc of a campaign rather than one slice of it:查看完整 README ↗A campaign engine for tabletop RPGs — generate the content, build the maps, and run the session live, in one place. Starting with D&D 5e.
Try it at sparkdm.quest — free for up to 3 worlds, no card required.
Spark covers the whole arc of a campaign rather than one slice of it:
Generation is meant to spark ideas, not cage them: once something's saved, every field is yours to rewrite from the Roster, and most entry types can also be written from a blank page with Create Your Own instead of generated. The Create tab covers NPCs & Monsters, Items, Locations, Quests, Factions, Encounter Tables, Dungeons, Regions, Settlements, Shops, and Adventures (multi-part quest chains) — each with its own "surprise me completely" fully-random mode, sampled from a curated SRD-based dataset so results vary run to run.
The Compendium tab is quick-reference material for the table: a Bestiary (SRD monster stat blocks by CR), a spell list, conditions, and core rules — searchable, no need to generate or save anything to look something up.
Everything generated can be saved to your Roster, tagged, annotated, linked to other entries (an NPC works for a Faction, is found at a Location, gives a Quest, carries an Item — bidirectional, cleaned up automatically when either side is deleted), and organized into Worlds (campaign containers). A world's owner can generate an invite code and hand it to players; anyone who joins gets read access to public content plus write access to the collaborative tools below (and none at all for DM-only planning content marked hidden).
The Combat tab is the at-the-table toolkit, and its panes work together in real time once a world is selected:
2d6+3), a personal
roll history, and in Party mode a shared party roll log with reactions everyone in the
world can see and post to. Any roll can be applied straight to combat.Every player gets a My Character page for a full character sheet (equipment, spellcasting resources, HP/rest state) that levels up with XP, and can be built through a guided Character Creation wizard or imported by pasting an existing sheet's text. A shared Party Ledger tracks gold and items with claimable loot drops from combat, and small activity badges across the World/Play tabs flag new rolls, notes, or live updates without needing a tab open.
The app is also an installable PWA with an offline app shell.
Billing runs on Stripe (server/src/routes/billing.ts), flipping each account's tier between
"free" and "paid" via webhook. Free tier is fully functional — paid removes a handful of
caps and unlocks table-wide DM tooling for whichever world a paying DM owns (one DM's
subscription covers the whole table). Current gates, defined in shared/src/billingLimits.ts
plus a few inline checks:
The Billing page's comparison table is the source of truth for exact current numbers.
There's no in-app way to grant admin access — it's controlled by a single environment
variable, ADMIN_USERNAMES (comma-separated usernames), the same way Stripe/R2 keys are
configured. server/src/routes/auth.ts checks that list on every signup/login/session check
and promotes or demotes the account's role to match automatically — add or remove a name and
it takes effect on that account's next request, no manual database edit either direction.
Admin role unlocks:
User at all, so this is the account-recovery path).Admin role is independent of subscription tier — promoting someone to admin does not give them paid-tier features, and vice versa.
tsx, no build step), structured logging via pinoshared workspace package with the SRD dataset, TypeScript types, Zod
validation schemas, and the generation/simulation engines, consumed directly by both client
and server (no separate build step)This is an npm-workspaces monorepo: shared/, server/, client/.
npm install
# one-time: create the SQLite database
cp server/.env.example server/.env
npm run --workspace server prisma:migrate
# run both in separate terminals
npm run dev:server # http://localhost:4000
npm run dev:client # http://localhost:5173 (proxies /api to the server)
Open http://localhost:5173.
Everything above works with zero configuration. A handful of things are optional and stay
fully functional without them — see server/.env.example and client/.env.example for the
full list, but briefly: Stripe keys (billing/checkout — routes just return 503 without
them), R2 credentials (automated database backups — no-ops without them), REDIS_URL
(only needed once you run more than one server instance), and Sentry DSNs (error
reporting — errors just stay in local logs without them).
npm test --workspace shared # unit tests
npm test --workspace server # integration tests (spins up a scratch SQLite test DB)
npm test --workspace client # component tests
npm run test:e2e --workspace client # Playwright, against a real running dev server
GitHub Actions runs the three npm test suites on every push/PR.
npm run build # builds the client to client/dist
npm run start:server # runs the API with tsx
In production the Express server serves the built client/dist itself (with an SPA
fallback for client-side routes) alongside /api/*, so a single running process is
enough — no separate static host or reverse proxy required.
render.yaml at the repo root is a Render Blueprint
that provisions this as one paid Starter web service with a 1GB persistent disk
(mounted at /var/data) holding the SQLite database, so everything you save survives
restarts and redeploys.
render.yaml and propose the spark service + disk.prisma migrate deploy before starting the
server, so the database schema is created automatically on the disk.sync: false env vars in Render's dashboard for whichever integrations
you want live: Stripe keys for billing, R2 credentials for backups, REDIS_URL if scaling
past one instance, SENTRY_DSN/VITE_SENTRY_DSN for error monitoring, and
ADMIN_USERNAMES for admin/moderation access — none of these are declared with a value in
render.yaml itself (secrets aren't committed), and the app runs fine with any or all of
them left unset. Note VITE_SENTRY_DSN is read at build time (Vite inlines it into the
client bundle), not runtime, so it needs to be set before a deploy, not just present at
startup.Want a free-tier deploy instead? Change plan: starter to plan: free and delete the
disk block in render.yaml — but note the SQLite file will then reset on every
redeploy and periodically on restart, so treat Roster/Worlds as non-persistent in that
configuration.
shared/ SRD dataset, types, Zod schemas, and the generation/simulation engines
(characters, items, locations, quests, factions, encounter tables, dungeons,
regions, settlements, vision/fog raycasting, grid movement, battle resolution,
encounter balance, house rules)
server/ Express API + Prisma/SQLite persistence: entity CRUD, cross-entity search &
links, world sharing, session notes, player characters & leveling, party
ledger/loot, live encounters & Battle Grid (incl. fog redaction), real-time
SSE + pub/sub, chat, Tavern/Home Base, Guild Board, the DM automation layer
(Trigger Rules, Doom Clock, Faction Relations, World Tick), Gallery publishing,
moderation/admin tooling, Stripe billing, R2 backups, structured logging
client/ React SPA, organized into four nav areas — Prep (Create, Compendium), World
(Overview, Worlds, Roster, Codex, Notes, Downtime, Tavern), Play (Combat incl.
Battle Grid, Map Builder, Shop), Account (Gallery, Profile, My Character,
Billing, Moderation, Users) — plus a mobile player-companion view and a
read-only Cast to Table presentation view
render.yaml Render Blueprint for a one-click paid deploy with a persistent disk
Stat blocks are derived from the D&D 5e System Reference Document (SRD), which is available for reuse. All other flavor text (names, personality/backstory tables, monster epithets, item/location/quest/faction/encounter flavor content) is original content written for this project.