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。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A daily photo guessing game. Every day there's one new photo, starting extremely zoomed in. Each wrong guess zooms out a step. Players get six zooms to name the object.
It's a plain static website (HTML, CSS and JavaScript, no build step), so it can be hosted for free.
| Path | What it is |
|---|---|
index.html | The game |
maker.html | Your private tool for turning photos into puzzles |
puzzles.json | The list of puzzles, one per day |
photos/ | The puzzle photos, named by date (2026-10-04.jpg) |
new-photos/ | Drop photos here to schedule them automatically |
js/config.js | Launch date and site address |
js/game.js | Game logic and animations |
js/maker.js | Puzzle maker logic |
js/core.js | Guess checking and zoom maths, shared by both pages |
css/style.css | All styling |
scripts/check-puzzles.mjs | Checks the puzzle list for mistakes and repeats |
scripts/schedule.mjs | Schedules everything in new-photos/ onto the next free days |
scripts/prepare-photos.ps1 | Shrinks photos and strips their GPS location (npm run photos) |
The three puzzles included (tennis ball, button, pencil) are drawn sample images so you can test everything. Replace them with your own photos before launch.
You need Node.js installed (the LTS version).
cd zoom-out
npm run dev
Then open http://localhost:3000. The game page needs this local server: opening index.html by double-clicking won't load the puzzle list.
The fastest way to build a backlog.
- for spaces and + between alternative answers:
tennis-ball+ball.jpg → answers "tennis ball" and "ball"sim-card.png → answer "sim card"new-photos/ folder.npm run photos. This turns each photo the right way up, shrinks it, and removes its hidden metadata, including the GPS location phones save. Photos that still have a location are refused by the next steps.near-words.json (see below).npm run schedule.Each photo gets the next free day (filling any gaps first), is moved into photos/ and renamed to its date, and gets an entry in puzzles.json. Add -- --shuffle to schedule them in random order instead of alphabetical, or -- --dry-run to see the plan without changing anything.
Empty new-photos/ before you upload the site by drag-and-drop, since the file names give away the answers. With GitHub it's ignored automatically.
It skips any photo that's already in the game, even under a different name, and warns you if an answer has been used before.
Scheduled photos start zoomed on the centre and have no close guesses. To fine-tune one, edit its focusX, focusY and near in puzzles.json. Use the puzzle maker to find good focus values: load the photo, tap the spot, and copy the numbers it shows.
Large phone photos load slowly. npm run check warns about anything over 2 MB. Running a photo through the puzzle maker shrinks it to about 0.5 MB.
A guess shows yellow when it's close but not right. There are two kinds:
near-words.json holds close words for each answer, like "biscuit" and "brownie" for cookie. The key is the puzzle's main answer, the first one in its file name.npm run schedule adds close words from that file to new photos automatically. If you edit the file later, apply the changes to puzzles already scheduled with:
node scripts/add-near.mjs
npm run check warns about any upcoming puzzle that has no close words yet.
npm run check stops you from showing the same photo twice:
It also warns, without blocking, when the same answer comes up again, for example two different tennis ball photos.
npm run dev and open http://localhost:3000/maker.htmlphotos/ folder.puzzles.json, inside the [ ] list. Put a comma between entries, but not after the last one.npm run check to make sure nothing is broken and see how many days you have scheduled.A puzzle entry looks like this:
{
"date": "2026-10-04",
"image": "photos/2026-10-04.jpg",
"answers": ["tennis ball", "ball"],
"near": ["golf ball", "lemon", "racket"],
"focusX": 0.43,
"focusY": 0.39,
"credit": "@nawar"
}
answers: the first one is shown as the solution. Small typos are accepted automatically.near: guesses that get an amber "Close" instead of red.focusX, focusY: where the zoom starts, from 0 to 1 (0.5, 0.5 is the centre).credit: optional, shown after the puzzle is solved.Photo tips: daylight near a window, sharp focus, highest resolution. Everyday objects with strange textures work best. Test each one on a friend: most people should get it around 4× or 2.4×.
date matches the player's local date, so it switches at each player's midnight.launchDate in js/config.js. Set it to your real launch day.Uses a free Supabase database. Until it's set up, the game simply doesn't show this section.
supabase/setup.sql, and click Run.js/config.js as supabaseUrl and supabaseKey, then commit and push.Both values are meant to be public. The database only lets players add one result per day and read a summary; nobody can read, change or delete individual results.
Free Supabase projects pause after a week with no activity. Once people play daily that won't happen; if it does, click Restore in the dashboard.
Cloudflare Web Analytics is free and needs no cookie banner.
zoomout.dev."token": "…". Copy just the token.js/config.js as cloudflareAnalyticsToken, then commit and push.Visits from the installed app are tagged ?source=app, so you can see how many people play from their home screen.
The site is installable (a "web app"): manifest.webmanifest, the icons in icons/, and sw.js for offline support. Players see an Install app card on the end screen. On Android and desktop Chrome it opens the install prompt; on iPhone it shows the two Safari steps. sw.js always loads fresh files when online and only uses saved copies offline, so new photos and deploys show up straight away.
og-image.jpg is the picture shown when someone shares zoomout.dev in WhatsApp, iMessage, Instagram, X or Discord. The tags are in the <head> of index.html. Some apps cache previews for days; to refresh one, use a preview debugger like https://www.opengraph.xyz.
npm run check warns you about any samples left.launchDate and siteUrl in js/config.js.Netlify, easiest: go to https://app.netlify.com/drop and drag the whole zoom-out folder onto the page. It's live in seconds. To update, drag it again.
Vercel or Netlify with GitHub, best long term:
Then buy a domain (around 10–15 CHF/EUR a year) and connect it in the Vercel or Netlify dashboard.
maker.html gets deployed too. That's harmless, because it only works in the browser and can't change the live site, but you can delete it from the deployed copy if you prefer.
puzzles.json, including future ones, to anyone who looks. Most players never will. A small backend that checks guesses on the server fixes this later.