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
Jugar juegos de lógica como Star Battle, Sudoku y Solitario sin conexión
Translation pending
AI summary · website and README
GamesJavaScript · CSSGitHub @nachomenaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Juegos de lógica como web app instalable que funciona sin conexión: • Star Battle 10×10, 2 estrellas (Fácil, Difícil, Experto). • Sudoku 9×9 (Fácil, Medio, Difícil). El Difícil siempre exige X-Wing o Swordfish. • Smart Dices: 12 piezas que forman 4 caras de dado con sumas por fila y columna (5 niveles). • Smart Circuit: 10 piezas de doble cara que unen los puntos con caminos en un tablero de 8×4 (5 niveles). • Solitario: el clásico de saltar bolas hasta dejar una, en tablero inglés (33) o europeo (37) a elegir en Ajustes.Read the full README ↗
Logic puzzles as an installable web app that works offline, in Spanish and English (the phone's language, or the one chosen in the picker settings). Every game with difficulties uses the same three: Easy, Hard and Expert.
Every board is generated on the device, has a single solution and its level is guaranteed by a logic solver that uses human techniques.
Daily challenge: one board a day for the whole app, at the top of the picker. The game changes every day and
doesn't repeat until every game has had its turn (the order comes from the date, so it is the same on every phone);
it is Hard on weekdays and Expert at the weekend. Solving it keeps a streak of days in a row (js/core/daily.js).
Free and Pro: free, every game on Easy plus the daily challenge; Pro, every level (js/core/membership.js). For
now the purchase is simulated and saved on the device; the stores' purchase will replace it.
Published with GitHub Pages. On iPhone: open in Safari → Share → "Add to Home Screen".
Progress is stored on the device and kept across updates: when there is a new version, the app says so ("A new version is available · Update") and there is no need to add it to the home screen again (deleting the icon also deletes its progress).
No build step: HTML, CSS and native ES modules. The only dependency is Playwright, for the browser tests (the app doesn't use it).
npm install # Playwright and the pre-commit hook (.githooks)
npm start # local server at http://localhost:8000 (modules don't load over file://)
npm test # engine, rules and infrastructure tests (node:test)
npm run test:e2e # browser tests (Playwright): every game, actions and offline use
npm run check # syntax and imports of all the JS, lint and sw.js up to date
npm run lint # ESLint alone
sw.js is not edited by hand: on commit, the pre-commit hook (scripts/build-sw.mjs) writes the list of files
cached for offline play and a VERSION that is the fingerprint of their content, so every published change reaches
the iPhone on its own. npm run build:sw does the same by hand.
ESLint (eslint.config.js) only looks for errors (unused or undefined names, unreachable code…), not style:
the code is formatted by hand, with the basics in .editorconfig (2 spaces, UTF-8, final newline).
GitHub Actions (.github/workflows/ci.yml) runs check, test and test:e2e on every push and pull request.
Each game's CSS (css/games/<id>.css) loads when the game opens; what several games share goes in
css/components.css. The font in fonts/ is a subset of Rubik (license in fonts/OFL.txt) with only the characters the
app uses (python3 scripts/build-fonts.py rebuilds it).
All visible text lives in js/i18n/es.js and js/i18n/en.js (same keys, checked by tests/i18n.test.js) and is
used with t(). Code, comments and docs are in English. Game names avoid trademarks; the storageKey of some games
keeps its old name so saved progress isn't lost.
index.html shell: game picker, level menu, shared overlays and icon sprite
css/
tokens.css colours, fonts and sizes (CSS variables)
base.css · components.css · menu.css · play.css · overlays.css · progress.css
games/<id>.css each game's own styles (loaded when it opens)
js/
main.js entry point
config.js shared constants (timings, history, supply)
app/app.js shell: navigation, action dispatch, timer, keyboard
i18n/ languages: es.js and en.js (every text, with the same keys) and t()
core/ generic infrastructure, unaware of any game
game-definition.js contract every game fulfils
game-controller.js base controller (template method): history, win, timer…
store.js persistent state per game (injectable storage)
puzzle-supply.js supply of boards per level, generated in the background
runners.js generation strategies: Web Worker or main thread
generator-worker.js shared worker loop
history.js undo / redo
ui/ reusable views: grid board, header, menus, overlays, dragging…
lib/ pure utilities (bits, grid, random, formatting, DOM)
games/
catalog.js catalogue: picker data + lazy loading of each game
star-battle/ engine, rules, controller, view, templates and definition
sudoku/ likewise
tests/ node:test tests
e2e/ browser tests (Playwright)
scripts/ data, sw.js and font generators; JS check
The 8,980 valid Dice arrangements are precomputed in js/games/dice/engine/arrangements-data.js
(node scripts/build-dice-arrangements.mjs regenerates them).
The 732 valid Circuit arrangements are in js/games/circuit/engine/arrangements-data.js
(node scripts/build-circuit-arrangements.mjs regenerates them).
The 322 Circle solutions (with the ribs in their starting position; the others are the same ones turned) are in
js/games/circle/engine/solutions-data.js, generated by node scripts/build-circle-solutions.mjs.
The 4,524 Hexagon solutions are stored as 377, one per group of solutions that are the same one turned or flipped, in
js/games/hexagon/engine/solutions-data.js (node scripts/build-hexagon-solutions.mjs, under a minute).
The 512 Pentominoes puzzles (rows of pieces, with a checked solution and the difficulty measured by the number of
solutions) are in js/games/pentominoes/engine/sets-data.js, generated by node scripts/build-pentomino-sets.mjs
(about 20 seconds).
The piece games (Dice, Circuit, Circle, Hexagon and Fit) sit together in the picker, in a "Pieces" row that expands
(group in their meta.js).
The Kakuro Expert puzzles (12×12) also come precomputed, in js/games/kakuro/engine/bank-data.js
(node scripts/build-kakuro-bank.mjs, a few minutes); each one comes in 4 versions (transposed and with the numbers
swapped for 10 − n), which keep the single solution.
The Gears puzzles of every level come precomputed in js/games/gears/engine/bank-data.js
(node scripts/build-gears-bank.mjs, about 15 minutes): on the computer the solver proves the single solution without
the phone's step limit, and Expert ends up with fewer numbers. Each one comes in 2 versions (upside down, or turned
half a turn with the crank and the lock swapped).
The Gridlock puzzles of the Hard and Expert levels, which would take several seconds to generate on the spot, are
precomputed in js/games/gridlock/engine/bank-data.js (node scripts/build-gridlock-bank.mjs, see the script). The
other levels and games are generated on the device.
The app icons come from icons/icon.svg: node scripts/make-icons.cjs regenerates the PNGs.
How to add a new game: js/games/README.md.