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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證arena game where superpowered balls battle it out. Pick a squad of 3, aim, dash and fire your super. 12 characters, trophy road, skins, quests, online leaderboards and friend challenges via link. Vanilla JS + Canvas, no build step.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A browser game where balls with superpowers fight in an arena. You build a squad of 3 balls, aim and launch. During a fight you tap the arena to dash (2 charges), and when the meter fills up you hit SUPER: every ball has its own super move.
15 balls: Basic, Leech, Cell, Spider, Ninja, Train, Magnet, Bomb, Turtle, Lightning, Hedgehog, Ice, Spike, Shackles, Forge. Each has its own ability and super. Every round starts with an 8-second aim phase: ability cards for both balls, and the opponent's aim arrow is shown too.檢視完整 README ↗Play: https://ballbrawl-5gr.pages.dev (mirror: https://ballbrawl-silk.vercel.app)
A browser game where balls with superpowers fight in an arena. You build a squad of 3 balls, aim and launch. During a fight you tap the arena to dash (2 charges), and when the meter fills up you hit SUPER: every ball has its own super move. 15 balls: Basic, Leech, Cell, Spider, Ninja, Train, Magnet, Bomb, Turtle, Lightning, Hedgehog, Ice, Spike, Shackles, Forge. Each has its own ability and super. Every round starts with an 8-second aim phase: ability cards for both balls, and the opponent's aim arrow is shown too. Arenas, Clash Royale style: Night Arena, Canyon, Frost Peak, Jungle, Lava Crater and Space unlock at 0, 120, 350, 700, 1200 and 1900 best trophies. Each arena repaints the battle floor and walls and the whole menu, and the first visit gets a celebration. Glory Road from the main menu: wins earn trophies, and the road (to 3000 trophies) unlocks balls, skins, coins and chests. Rewards are kept forever, even if your trophies drop. Chests are earned only, every 3 wins and on the road. They are never sold, and the chest screen shows the real odds for the player. There are skins (cosmetic only), 3 daily quests, a 7-day login reward and achievements. Brawl Stars style progression: every ball has its own path with ranks 1–10 (coins, chests, the Gold skin at rank 7, a Master title at rank 10). Leagues from Bronze I to Masters by trophies, titles under your nickname, the Silver skin for coins. Emotes in battle (six preset stickers, the computer answers). 8 languages: Russian, English, Kazakh, Uzbek, Turkish, Spanish, Portuguese, Indonesian, with a picker in the profile. Modes and maps: Classic (squads take turns, trophies), 2 vs 2 and a co-op Boss fight. Every arena has its own map: canyon rocks, frost ice crystals, jungle bouncy mushrooms, lava pools, space portals, each with its own scenery. Player level from XP; levels pay coins and gems. Shop and gems: auras, banners and decorations for your name card, 15 character emotes (some animated), arena maps, daily deals and skins. Gems come from chests, the Glory Road, ball paths, day 7 and rewarded ads; buying gems with money is not built yet. Chests: wins put chests into 4 slots in a fixed order; each unlocks on a timer (gems or an ad skip it). Chests give coins and sometimes skin fragments (20 make a skin), gems, an emote, a new ball or a boss ticket, with the odds shown. A boss beaten while holding a ticket gives a big chest; a lost fight never uses one. Clans: create (500 coins), join, leave; names from the nickname word lists, 8 emblems, members and clan trophies. No chat, for kids' safety. Inbox and settings: messages and gifts from the team (posted with SQL, see below), sound, opponent emotes and language in settings. Email account (optional): turns the anonymous player into an account that can sign in on another device, and gives the Rainbow skin as a thank-you. Challenge a friend by link: the squad, seed, nickname and level live right in the link, no server needed. Your friend plays with the same squad and can send back a reply challenge with their result. Nicknames are built only from preset words ("Fast Hedgehog 482"), never free text. The game is made for kids, so ads run in child-safe mode (non-personalized). Works offline (service worker). Revenue comes from Google AdSense ads (H5 Games Ads); haram categories are blocked in the AdSense dashboard.
Plain JavaScript and Canvas, no dependencies and no build step. The folder is the website.
The game UI is in 8 languages (src/i18n.js for Russian and English, src/lang/ for the rest). The browser language picks one; the player can change it in the profile.
npm run dev
Open http://localhost:5173. Python is required (tools/dev.py is a plain static server that only tells the browser not to cache files). Double-clicking index.html won't work because of ES modules.
On localhost Google shows test ads ("Rewarded ad example"), so every ad button can be checked.
On localhost the game does not connect to the live server by default, so test profiles never reach the leaderboard. To test online mode, open http://localhost:5173/?online.
npm test
npm run balance
balance runs thousands of computer-vs-computer fights, with dashes and supers, and prints a win table: row vs column, in percent.
Rule: keep every ball's average win rate roughly within 35–65%. Right now all 15 balls are within 43–57%, and there are counter-picks (e.g. Leech beats Basic, Ninja beats Leech).
| File | What it does |
|---|---|
src/sim.js | Physics of one round: movement, bounces, homing, contact damage, dash, super meter, sudden death. Deterministic, no DOM. Player commands go through act() and are recorded in world.log: "seed + log" replays a fight exactly. |
src/balls.js | Balls: HP, colour, price and abilities. All balance numbers are at the top of the file. |
src/match.js | Squads, rounds, AI aiming, revive. |
src/progress.js | Trophies, arenas, Glory Road, chests, skins, quests, daily reward, achievements, old-save migration and cloud merge. Pure functions, covered by tests. |
src/themes.js | How each arena looks: sky, floor, walls, floor pattern, neon ring colours. Pure data. |
src/meta.js | Main menu (lobby: the squad standing in the current arena, road bar, chests, Play, a six-tile dock) and the pages it opens with a back button: Glory Road, Balls (skins), Quests, Leaders, Profile with the email account. |
src/ai.js | The computer opponent: leading dashes, dodging the train, supers. Gets stronger with level. |
src/render.js | Drawing: the bevelled arena box in the current arena's colours, glossy balls with HP in the centre and a glowing team rim, webs, train, shurikens, pixel debris, damage numbers, screen shake. |
src/main.js | Screens, aiming, game loop, saving, ads. |
src/net.js, src/config.js | Online: Supabase client (anonymous profile, cloud save, ranked matches, leaderboards). |
src/ads.js | Wrapper around the AdSense Ad Placement API. |
src/i18n.js | Russian and English texts. |
src/nick.js | Nicknames from vetted word lists, stored as word numbers. |
src/challenge.js | Encoding and strict validation of challenge links. |
src/sfx.js | Web Audio sound effects, no audio files. |
sw.js, manifest.webmanifest | Offline mode and install-to-phone. |
Adding a ball:
BALLS in src/balls.js, including onSuper.src/i18n.js, in both languages.deco() in src/render.js.npm test and npm run balance.Project ballbrawl (ref zowdpibgfnpqcvwgtryv, Frankfurt). The game signs in anonymously. An optional email account (no confirmation email is sent) is the only way to move to another device; transfer codes were removed.
supabase/migrations/. The client has no direct table access (RLS with no policies), it can only call vetted functions.src/config.js is public by design. The database password lives only in .env.local, which is not in git.supabase/migrations/, then run the command below (password from .env.local).
npx supabase db push
npx supabase db query --linked "insert into bb_news (title, body, gift) values ('{\"ru\":\"Обновление!\",\"en\":\"Update!\"}', '{\"ru\":\"Новые эмоции.\",\"en\":\"New emotes.\"}', '{\"gems\":5}')"
node tools/net-smoke.mjs
*.pages.dev address.ballbrawl). To ship a new version, run the command below: tools/dist.mjs copies only the site files into dist/ (no tests, supabase/ or .env.local) and uploads them. Always deploy dist, never the whole folder. Connect the domain in Cloudflare → project ballbrawl → Custom domains.
npm run deploy
Vercel mirror: https://ballbrawl-silk.vercel.app (project ballbrawl), deployed the same way:
npm run deploy:vercel
Vercel's free Hobby plan forbids sites with ads. Fine while there are no real ads; once AdSense goes live, keep the ads on Cloudflare only (or move Vercel to the Pro plan)./c/, so they show up as a separate page.CONTACT_EMAIL in privacy.html with your email.index.html.ca-pub-0000000000000000 with yours in two places: index.html and ads.txt. While the all-zeros ID is there, no ads show on a real domain at all.data-adbreak-test="on" from index.html, otherwise only test ads will play.Nobody finds a website on their own. The cheapest way is spectator mode:
/?record=leech,train (any two ball ids): a chrome-free 9:16 page that starts that fight at once, with the title in the balls' colours and "WHO WINS?" — screen-record it and post it to TikTok, YouTube Shorts or Reels;More balls, Kazakh language, a version for Yandex Games or CrazyGames.
MIT — see LICENSE.
c/index.html |
Challenge links point to /c/, so their opens show up as a separate page in analytics. |
data-tag-for-age-treatment="1", so every ad is non-personalized. The EU consent dialog must not offer personalization.