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。 以下為已儲存的摘錄。
A small top-down neon-city driving game (the game itself is in French, ages 10+, cartoon/arcade tone, nothing explicit). Play as Marco or Nadia: take deliveries at the Depot (drive to the map marker to get paid), spend your cash at the dealership on faster cars, and enter races — the view switches to a behind-the-car arcade racing mode (pseudo-3D road into a neon sunset). Take a "hot" job for a big payout and the police give chase (wanted level) — outrun them or get a repaint at the garage to shake them off. Climb the ranks from Bleu to Caïd. ▶ Play GTA 7 · Neon City檢視完整 README ↗
A small top-down neon-city driving game (the game itself is in French, ages 10+, cartoon/arcade tone, nothing explicit). Play as Marco or Nadia: take deliveries at the Depot (drive to the map marker to get paid), spend your cash at the dealership on faster cars, and enter races — the view switches to a behind-the-car arcade racing mode (pseudo-3D road into a neon sunset). Take a "hot" job for a big payout and the police give chase (wanted level) — outrun them or get a repaint at the garage to shake them off. Climb the ranks from Bleu to Caïd.
GTA 7 is built on a generic, reusable 2D game engine (Phaser 3, 100% static, no build). The whole game lives in
game.config.js+ assets (all art generated fromtools/art/neon.cjs); the city systems — missions, chase, models, race — are generic, config-gated engine features. The rest of this README is that engine's documentation.
This repo is a GitHub template — each game lives in its own repository, so the engine stays clean and you can make as many games as you like.
my-space-game). You get
a fresh, independent repo containing the whole engine + a game that already runs.main branch (see the warning below)./new-game. It interviews you — theme, target age/audience, art style,
language, core loop — then writes your game.config.js, creates/sources the assets,
themes the look, tests it, and can deploy. It never edits engine.js.https://<you>.github.io/<repo>/, and every later
push to main redeploys automatically.That's it — you now have your own game. Keep shaping it by iterating.
⚠️ Run the Claude Code session on
main. When you open your game repo in Claude Code (web), make sure it develops onmain— a session can otherwise spin up a separate branch. If the game is pushed to another branch, GitHub Pages won't publish it (Pages deploys the default branch) and the first deploy fails. Working onmainkeeps every push a one-click deploy.
Start small. A new game should be tiny: one place, one creature, 1–2 needs, two actions, maybe a small goal. You grow it by iterating — that's the whole workflow, so don't pile on features up front.
(Prefer a hands-on start? You can skip /new-game and edit game.config.js yourself —
the full field-by-field schema is in ENGINE.md.)
Most changes are a small config edit, each with a dedicated skill — just ask in plain language (e.g. “add a pink critter”, “let me ride them”, “add a shop”):
| Want to add… | Where it lives | Skill |
|---|---|---|
| A new colour/skin for the creature | creature.variants (a tint, or a sheet drawn in tools/art/) | add-creature-variant |
| Rename / restyle creatures | creature.customize | — |
| A shop & coins | economy + shop (and meta.showCoins) | — |
| Buyable, placeable decorations | GAME.decor | add-decor-item |
| Riding + obstacles to hop | creature.ride (+ environment.arena) | add-collision |
| Babies / growing up | creature.breeding, creature.aging | — |
| A scattered forest / trail loop | GAME.environment | place-scatter |
| More goals / levels | GAME.objectives.levels | — |
| Another playable character | GAME.characters | add-character |
| Brand-new art | tools/art/<game>.cjs → assets/ (SVG → PNG) | asset-add (or asset-search for external art) |
| New UI icons | GAME.icons (_shared/icon-kit.cjs) | — |
| Theme-specific effects (e.g. stars when playing) | action.anim particles | — |
Nothing here ships in the starter on purpose — you switch features on as you need them. For non-technical feedback (the players, even children), the feedback-session skill lets them drive changes in plain words while the technical work happens silently.
Game-authoring helpers in .claude/skills/ — invoke with /<name> or just describe what
you want.
| Skill | What it does |
|---|---|
| new-game | Scaffold a brand-new game (interactive; starts minimal). |
| feedback-session | Non-technical “playtester” mode — changes from plain-language feedback. |
| add-character · add-creature-variant · add-decor-item · add-collision · place-scatter | Add the matching piece of content. |
| asset-search · asset-add | Find (with content + license checks) and integrate art. |
| state-migration | Add a saved field without breaking existing saves. |
| test-debug · map-verify | Prove a change works / check map placement (headless, with proof). |
| visual-review | Art + UI QA at full size (anatomy, clipping, icons, short/tall screens) — before every publish. |
| capitalize-learnings · sync-engine | Fold learnings back into the engine/skills; backport them into the template. |
| ios-pwa-check | Keep the iPhone/PWA layout clean. |
| release-deploy | Cache-bust, push to main, verify the Pages deploy. |
You rarely need this — Claude Code tests for you — but to run the game yourself:
bash .claude/skills/_shared/serve.sh 8099 # open http://localhost:8099/
Phaser is vendored (vendor/phaser.min.js) — no CDN, works offline. A headless
Playwright harness (playtest.cjs) drives the real game with screenshots and assertions;
the test-debug / map-verify skills use it.
Pushing to main runs .github/workflows/deploy.yml, which publishes to GitHub Pages
(enable it once, step 4 above). Whenever JS/CSS/images change, the cache version vN
must be bumped — the release-deploy skill (and bump-version.mjs) does it, commits,
pushes, and confirms the deploy went green.
You don't need this to make a game (the steps above do), but it explains what's actually happening, and it's what you'll edit for advanced changes.
The model — a game is engine + config + assets. At load, index.html runs three
scripts in order:
vendor/phaser.min.js → game.config.js → engine.js
(window.GAME) (reads window.GAME)
engine.js is the generic engine: it implements every system (movement, rendering,
collisions, UI, day cycle, save…) but contains no game content. You don't edit it.game.config.js is your whole game: all data, strings, world geometry, the
creature and its needs/actions, economy, objectives, and references to assets — set on
the global window.GAME.style.css is the theme (CSS variables at the top). assets/ holds the art.Anatomy of game.config.js. It assigns one object whose top-level keys are the
game's building blocks:
window.GAME = {
meta, // title, icons, save key, theme colours, audience, UI strings
world, camera, // size, ground tile, background, zoom
assets, fence, // images + spritesheets to load
player, characters, // avatar(s) and the create screen
creature, // the creature system (needs, actions, variants, ride, breeding…)
zones, stations, // the pen; buildings (rest / shop / custom)
economy, shop, decor, // coins, shop, placeable decorations
environment, scenery, // arena + trail loop + scattered props
objectives, help, // gamification levels; help screen
};
For example, the demo's creature is described — not coded — like this:
creature: {
label: "critters", sheet: "critter", scale: 1.0,
moodNeed: "joy", moodFrom: ["fuel", "joy"],
needs: [ { id: "fuel", icon: "battery", start: 70, perDay: -22 }, { id: "joy", icon: "joy", start: 80 } ],
actions: [
{ id: "feed", label: "Feed", icon: "battery", effects: { fuel: 35, joy: 8 },
anim: { motion: "nod", particle: "spark", colors: ["#9fe8ff", "#ffffff"] }, message: "{i:battery} {name} recharged!" },
{ id: "play", label: "Play", icon: "ball", effects: { joy: 22, fuel: -6 },
anim: { motion: "hop", particle: "star", colors: ["#fff2a8", "#a8e6ff"] }, message: "{i:ball} {name} had fun!" },
],
names: ["Zib", "Lumi", "Pulse"], startCount: 3,
},
Handy to know:
meta.
Strings interpolate {name}, {day}, {names}, {item}; {i:key} inserts an
illustrated icon from GAME.icons (never emoji).motion + a particle shape + colors). Stars, sparks, hearts… are
chosen here, not hard-coded.check(state) function, so a goal can test anything in the game
state (state.coins, state.creatures, state.stats, …).ride, breeding, aging, shop, decor,
environment, objectives); meta.showCoins:false hides the economy.Everything the engine can do (all optional, switched on from config): tiled world + camera/zoom · walkcycle avatars + create screen · creatures with needs/actions/variants/customize/aging/breeding · ride + hop-over obstacles · stations (rest/shop/menus) · economy + shop + placeable decor · AABB collisions · arena + trail-loop environment · day/night · objectives/levels · theme-driven particle effects · close-up mini-scene · vehicles (top-down sheets, missions, chase, buyable models, pseudo-3D race) · localStorage save (+ legacy save migration) · PWA/iOS. The full field-by-field schema is in ENGINE.md.
Golden rule: never put game content in
engine.js. If the engine truly lacks a capability, add it there as a generic, config-gated feature and document it in ENGINE.md — so every game can use it.
index.html · style.css · engine.js · game.config.js the site
ENGINE.md full config schema + capabilities
assets/ (img · sheet · ui · CREDITS.md) · vendor/phaser.min.js
.claude/skills/ (+ _shared/ tooling) · .github/workflows/deploy.yml
All art is generated (CC0) from tools/art/neon.cjs. Phaser 3 is MIT; the Fredoka
font is OFL. See assets/CREDITS.md.