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
7대7 직접 플레이, 구단을 매니저로 운영해 컵·유럽컵 파이널 포어 승리, 다운로드 없이 PC·모바일에서 무료
7 gegen 7 selbst spielen, den Verein als Manager führen, Pokal und Europapokal mit Final Four gewinnen. Kostenlos, ohne Download, am Computer und am Handy.
게임HTML · JavaScriptGitHub @tobwil온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Retro-Handball im Pixel-Look: 7 gegen 7, 52 Vereine, Karriere mit Transfers, Pokal und Europapokal mit Final Four. Kostenloses Browsergame mit Tastatur-, Gamepad- und Touch-Steuerung.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Echte Szenen aus dem Spiel · real in-game footage · mehr Clips / more clips Echte Aufnahmen aus dem Browserspiel. Für die volle Ansicht auf ein Bild klicken. Actual browser gameplay and menus. Click any image to view it at full size. Retro-Handball im Pixel-Look, inspiriert von Legend Bowl. Ein komplettes Browserspiel in einer einzigen HTML-Datei: kein Server, keine Installation, keine externen Abhängigkeiten außer zwei Google-Schriften. ▶ Spielen: hallenlegenden.de · Wünsche und Ideen: Wunsch-FormularREADME 전문 보기 ↗
Screenshots · Pressekit / press kit · Deutsch · English
Echte Aufnahmen aus dem Browserspiel. Für die volle Ansicht auf ein Bild klicken.
Actual browser gameplay and menus. Click any image to view it at full size.
Retro-Handball im Pixel-Look, inspiriert von Legend Bowl. Ein komplettes Browserspiel in einer einzigen HTML-Datei: kein Server, keine Installation, keine externen Abhängigkeiten außer zwei Google-Schriften.
▶ Spielen: hallenlegenden.de · Wünsche und Ideen: Wunsch-Formular
Läuft im Browser am Desktop mit Tastatur oder Gamepad und auf dem Handy mit Touch-Steuerung (Querformat empfohlen, das Spielfeld nutzt auch breite Handys bis an den Rand). Für iPhone und iPad gibt es Hallen-Legenden auch kostenlos im App Store. Offline geht es auch: game/index.html herunterladen und im Browser öffnen.
Inoffizielles Fan-Projekt. Vereins- und Spielernamen sind Fantasienamen. Es gibt keine Logos und keine Verbindung zu einer Liga oder einem Verein. Im Editor lassen sich alle Namen und Farben lokal im eigenen Browser ändern.
Rechte Hand auf den Pfeiltasten zum Laufen, linke Hand auf WASD und Leertaste für die Aktionen.
| Taste | Angriff | Abwehr |
|---|---|---|
| Pfeile | Laufen | Laufen |
| W / Shift | Sprint | Sprint |
| S | Pass (Richtung = Laufrichtung), beim Aufladen auf dem Flügel: Dreher | Spieler wechseln: erst zum ballnächsten, mehrmals drücken = der Nähe nach weiter |
| A | Kempa-Trick (auch Shift + S) | wie S |
| Leertaste | Wurf (antippen = schnell, halten = mehr Wucht). Hoch/runter, auch schräg = ganz in diese Ecke, ohne hoch/runter ein Stück weg vom Torwart. Das Zielkreuz zeigt, wohin er geht | Blocksprung |
| D | Finte, beim Aufladen: Heber | Ball herausspielen |
| T | Team-Timeout (Deckung umstellen) | |
| Q | Wechselmenü | |
| Esc / P | Pause, im Menü: zurück | |
| M | Ton an/aus |
J, K und L funktionieren weiterhin als Alternative für Pass, Wurf und Finte.
In der Abwehr und bei freiem Ball steuerst du ohne Wechseltaste automatisch den ballnächsten Spieler. Nach einem Wechsel per Taste bleibt die Automatik kurz aus. Lässt du in der Abwehr die Pfeile länger als 0,8 s los, läuft dein Spieler selbst auf seinen Platz in der Deckung (Abwehr-Assistent), und ein Mitspieler stört den Ballführer. Sobald du wieder steuerst, gehorcht er dir; Wechsel, Block und Klauen gehen immer.
Training: Im Hauptmenü führt TRAINING in 8 Lektionen durch die Steuerung: Laufen, Passen, Werfen, Wurf in die Ecke, Kempa-Trick, Dreher, Finte und Abwehr. Die Anleitung oben zeigt die Tasten des Geräts, mit dem du gerade spielst (Tastatur, Gamepad oder Touch). Gegner und Mitspieler stehen dabei still (außer in der Abwehr-Lektion), die Uhr läuft nicht. Überspringen und Beenden gehen über die Pause.
Steuerhilfen: In den ersten 3 Spielen zeigt eine Leiste unten die Tasten passend zur Lage: im Angriff, beim Aufladen (Ecke, Heber, Dreher), in der Abwehr und beim 7-Meter, mit Gamepad die Knöpfe des Pads. Unter Optionen → STEUERHILFEN: AUTO, AN oder AUS. Am Touch sind die Knöpfe ohnehin beschriftet.
Menüs: Pfeiltasten wählen, Enter bestätigt, Esc oder Backspace geht zurück.
Gamepad: A Pass (beim Aufladen auf dem Flügel: Dreher), X Wurf, B Finte/Klau, RB Sprint, Start Pause. Im Menü: Steuerkreuz wählen, A bestätigen, B zurück. Links/rechts ändert Lautstärke-Regler und Vereinsliste (gehalten geht es schneller). Trikotfarben: A drücken, dann links/rechts, mit A oder B fertig. Das ganze Spiel ist ohne Maus und Tastatur bedienbar, die Hinweise zeigen dann die Controller-Tasten.
Touch (Handy):
index.html Landingpage mit Horizontal-Scroll und Wunsch-Formular
game/index.html das Spiel (wird von build.sh erzeugt)
spielen.html Weiterleitung auf game/ für alte Links
impressum.html Impressum
datenschutz.html Datenschutzerklärung
assets/ Story-Film, Umzugs-Skript, Styles und Kontakt-Skript für Impressum und Datenschutz
fonts/ Schriften lokal (Press Start 2P, VT323, SIL OFL)
tools/ Google-Apps-Script für die Wunschliste, tools/promo: Teaser, Spielclips, GIFs und Screenshots neu aufnehmen
netlify.toml Einstellungen für Netlify (Hosting von hallenlegenden.de)
hallen-legenden.html dieselbe Seite ohne <html>-Gerüst (für die Veröffentlichung als Claude-Artifact)
src/ Quellcode in Modulen, wird per build.sh zusammengesetzt
docs/screenshots/ echte Spielaufnahmen für README und Landingpage
docs/presse/ Pressekit: Teaser, Spielclips (Final Four, Aufstellungen, Europapokal), GIFs, Kurzbeschreibung, Profilbild und Banner
docs/LANDINGPAGE.md Landingpage, Wunsch-Formular und eigene Domain einrichten
docs/ARCHITEKTUR.md Aufbau des Codes, Datenmodell, Speicher-Schlüssel
docs/ENTWICKLUNG.md Entwicklungsgeschichte: Wünsche, Entscheidungen, Tests
CHANGELOG.md Versionen
LICENSE Lizenz (PolyForm Noncommercial 1.0.0)
Die Module in src/ werden in fester Reihenfolge zu einer HTML-Datei zusammengesetzt:
sh src/build.sh
Das erzeugt game/index.html und hallen-legenden.html. Die Landingpage index.html wird von Hand gepflegt. Es gibt keinen Bundler und keine Paketabhängigkeiten. Für einen Syntax-Check reicht node --check auf die zusammengefügten JS-Dateien.
Im Browser speichert das Spiel in localStorage. Eine Hülle wie eine Desktop-Version kann vor dem Spiel window.HL_PLATFORM setzen und damit Folgendes ersetzen oder ergänzen (alles optional, siehe src/p01_core.js):
| Feld | Zweck |
|---|---|
name | Name der Plattform, im Browser 'web'. Außerhalb des Browsers sagen Optionen und Editor „Gerät“ statt „Browser“, der Teilen-Text lässt „im Browser“ weg |
storage | Speicher mit getItem, setItem, removeItem, synchron wie localStorage |
event(name, data) | bekommt dieselben Ereignisse wie die Statistik, zum Beispiel spiel-ende mit { ergebnis } und titel mit { art } (meister, pokal, euro, meister2, aufstieg). meilenstein mit { id } (zum Beispiel für Game Center), nachgetragene Meilensteine älterer Karrieren mit { id, nachtrag: true }. Die IDs stehen in MILESTONES (src/p18_erfolge.js) |
quit() | zeigt BEENDEN im Hauptmenü |
legal | ersetzt die Copyright-Zeile auf dem Titelbildschirm |
shareUrl | Adresse im Teilen-Text, Standard https://hallenlegenden.de |
Regressionstests für das Spiel liegen in tests/ (Playwright mit Chromium). GitHub Actions (.github/workflows/tests.yml) führt sie bei jedem Pull Request und jedem Push auf main aus: Erst wird das Spiel gebaut, und die Prüfung schlägt fehl, wenn game/index.html oder hallen-legenden.html nicht zu src/ passen. Danach laufen npm test und npm run tief, das Ergebnis steht als Prüfung im Pull Request. Sie laufen Frame für Frame mit festem Zufall und prüfen unter anderem Tastenbelegung, Pässe, Eingabepuffer, Spielerwechsel, ein komplettes Spiel, Karriere mit Pokal und Europapokal, Finanzen, Potenzial, Erfolge und Teilen-Bild, Vergleich vor dem Spiel, Editor, Menüfenster, Handy-Steuerung und Darstellung auf breiten Bildschirmen. Nach sh src/build.sh und vor jedem Merge:
cd tests
npm install # einmalig
npx playwright-core install chromium # einmalig, falls noch kein Chromium da ist
npm test # alle 57 Tests, etwa eine Minute
npm test -- pass zoom # nur Tests, deren Name diese Wörter enthält
GAME=https://deploy-preview-14--hallenlegenden.netlify.app/game/ npm test # gegen eine Netlify-Vorschau
npm run tief # 9 tiefe Tests, etwa drei Minuten (vor größeren Versionen)
ALT=pfad/zur/alten/index.html npm run tief -- update # Update-Test gegen eine bestimmte Vorversion
Die tiefen Tests (tests/tief.mjs) prüfen, was in kurzen Tests nicht auffällt:
origin/main, oder ALT= Datei bzw. URL) und werden in der neuen weitergespielt, wie bei Spielern nach einem Deploy: laufendes Spiel, inzwischen simuliertes Pokalspiel, Karriere und Einstellungen.Die package.json liegt bewusst nur in tests/, damit Netlify beim Veröffentlichen nichts installiert.
Die Seite läuft unter hallenlegenden.de bei Netlify, direkt aus dem Branch main ohne Build-Schritt (netlify.toml). Die Landingpage liegt im Hauptordner, das Spiel unter /game/.
Die alte Adresse tobwil.github.io/HallenLegenden (GitHub Pages) leitet automatisch auf hallenlegenden.de weiter und nimmt dabei vorhandene Spielstände mit (assets/umzug.js). Details zu Formular, Domain und Umzug stehen in docs/LANDINGPAGE.md.
Das Spiel hat Tobias Wilhelm (tobwil) im Dialog mit Claude (Anthropic) in Claude Code entwickelt: von einer ersten Version mit fiktiven Teams über die Pixel-Halle, die Ligen 2026/27 und den Manager-Modus bis zur Touch-Steuerung. Den Verlauf mit allen Wünschen, Entscheidungen und Tests beschreibt docs/ENTWICKLUNG.md, die Versionen stehen in CHANGELOG.md.
Der Code steht unter der PolyForm Noncommercial License 1.0.0, © 2026 Tobias Wilhelm (tobwil). Der Quellcode ist offen einsehbar, das Spiel ist aber nicht für kommerzielle Zwecke freigegeben.
Erlaubt ist alles, was nicht kommerziell ist: das Spiel spielen, den Code lesen und daraus lernen, ihn verändern, eigene Versionen bauen und kostenlos weitergeben. Auch gemeinnützige Organisationen, Schulen, Vereine und Hochschulen dürfen es nutzen. Bedingung: Der Urheberhinweis „Copyright (c) 2026 Tobias Wilhelm“ und der Lizenztext (oder der Link darauf) müssen in allen Kopien und abgeleiteten Versionen erhalten bleiben.
Nicht erlaubt ist jede kommerzielle Nutzung, zum Beispiel das Spiel oder eine darauf basierende Version zu verkaufen, in einem App-Store gegen Geld oder mit Werbung und In-App-Käufen anzubieten oder in ein kommerzielles Produkt einzubauen. Wer das vorhat, braucht eine eigene Lizenz von Tobias Wilhelm (Kontakt über das Impressum).
Versionen bis einschließlich v8.11 wurden unter der MIT-Lizenz veröffentlicht. Für Kopien dieser älteren Versionen gilt weiterhin die MIT-Lizenz, für alle späteren Versionen gilt die PolyForm Noncommercial License.
Name und Logo sind von der Lizenz ausgenommen. Der Name „Hallen-Legenden“ und das Logo (der Schriftzug des Spiels) gehören nicht zum lizenzierten Code und bleiben Tobias Wilhelm vorbehalten. Das gilt auch für andere Schreibweisen und verwechselbare Abwandlungen, zum Beispiel „Hallenlegenden“, „Hallen Legenden“, „Legenden der Halle“, „Hall Legends“ oder „Hallen-Legenden 2“, und für die Domain hallenlegenden.de.
Wer eine veränderte Version veröffentlicht (zum Beispiel als Website, App oder Download):
Erlaubt und erwünscht ist ein Hinweis auf die Herkunft, etwa „Basiert auf Hallen-Legenden von Tobias Wilhelm“ mit Link auf dieses Repository. Ein Fork hier auf GitHub, um Änderungen beizutragen oder auszuprobieren, darf den Namen des Repositorys behalten.
Retro handball in pixel style, inspired by Legend Bowl. A complete browser game in a single HTML file: no server, no installation, no external dependencies apart from two Google Fonts.
▶ Play: hallenlegenden.de · Ideas and requests: feature request form (German)
Runs in the browser on desktop with keyboard or gamepad and on phones with touch controls (landscape recommended; the pitch fills wide phone screens edge to edge). For iPhone and iPad, Hallen-Legenden is also free on the App Store. Works offline too: download game/index.html and open it in your browser.
The game itself is in German (menus, commentary, newspaper). The controls below are all you need to get started.
Unofficial fan project. Club and player names are fictional. There are no logos and no affiliation with any league or club. All names and colours can be changed locally in your own browser using the built-in editor.
Right hand on the arrow keys to move, left hand on WASD and Space for the actions.
| Key | Attack | Defence |
|---|---|---|
| Arrows | Move | Move |
| W / Shift | Sprint | Sprint |
| S | Pass (direction = movement direction), while charging on the wing: spin shot | Switch player: first to the one closest to the ball, press again = next closest |
| A | Kempa trick (also Shift + S) | same as S |
| Space | Shoot (tap = quick, hold = more power). Up/down, also diagonally = all the way into that corner, without up/down a little away from the keeper. The reticle shows where it goes | Block jump |
| D | Feint, while charging: lob | Steal the ball |
| T | Team timeout (change defence) | |
| Q | Substitution menu | |
| Esc / P | Pause, in menus: back | |
| M | Sound on/off |
J, K and L still work as alternatives for pass, shoot and feint.
In defence and on loose balls you automatically control the player closest to the ball unless you switch manually. After a manual switch the automatic switching pauses briefly. If you let go of the arrows in defence for more than 0.8 s, your player moves to his place in the defence by himself (defence assist) and a teammate pressures the ball carrier. As soon as you steer again he follows you; switch, block and steal always work.
Training: TRAINING in the main menu walks you through the controls in 8 lessons: moving, passing, shooting, shooting into a corner, Kempa trick, spin shot, feint and defence. The instructions at the top show the keys of the device you are using (keyboard, gamepad or touch). Opponents and teammates stand still (except in the defence lesson) and the clock does not run. Skip or quit via pause.
Control hints: in your first 3 matches a bar at the bottom shows the keys for the current situation: attack, charging (corner, lob, spin shot), defence and 7-metre, with a gamepad its buttons. Options → STEUERHILFEN: AUTO, ON or OFF. On touch the buttons are labelled anyway.
Menus: arrow keys to select, Enter to confirm, Esc or Backspace to go back.
Gamepad: A pass (while charging on the wing: spin shot), X shoot, B feint/steal, RB sprint, Start pause. In menus: D-pad to select, A to confirm, B to go back. Left/right change volume sliders and the club list (hold to go faster). Kit colours: press A, then left/right, A or B when done. The whole game works without mouse and keyboard, and the on-screen hints then show controller buttons.
Touch (phone):
index.html landing page with horizontal scrolling and feature request form
game/index.html the game (generated by build.sh)
spielen.html redirect to game/ for old links
impressum.html legal notice (German)
datenschutz.html privacy policy (German)
assets/ story film, move script, styles and contact script for the legal pages
fonts/ self-hosted fonts (Press Start 2P, VT323, SIL OFL)
tools/ Google Apps Script for the wish list, tools/promo: re-record teaser, game clips, GIFs and screenshots
netlify.toml Netlify settings (hosting for hallenlegenden.de)
hallen-legenden.html same page without the <html> wrapper (for publishing as a Claude Artifact)
src/ modular source code, assembled by build.sh
docs/screenshots/ actual game screenshots used in this README and the landing page
docs/presse/ press kit: teaser, game clips (Final Four, line-ups, European cup), GIFs, short description, profile picture and banner
docs/LANDINGPAGE.md landing page, form and custom domain setup (German)
docs/ARCHITEKTUR.md code architecture, data model, storage keys (German)
docs/ENTWICKLUNG.md development history: requests, decisions, tests (German)
CHANGELOG.md versions (German)
LICENSE license (PolyForm Noncommercial 1.0.0)
The modules in src/ are concatenated in a fixed order into one HTML file:
sh src/build.sh
This generates game/index.html and hallen-legenden.html. The landing page index.html is maintained by hand. There is no bundler and there are no package dependencies. For a syntax check, node --check on the concatenated JS is enough.
In the browser the game saves to localStorage. A wrapper such as a desktop version can set window.HL_PLATFORM before the game loads to replace or add the following (all optional, see src/p01_core.js):
| Field | Purpose |
|---|---|
name | platform name, 'web' in the browser. Outside the browser, options and editor say “device” instead of “browser” and the share text drops “in the browser” |
storage | storage with getItem, setItem, removeItem, synchronous like localStorage |
event(name, data) | receives the same events as the analytics, for example spiel-ende with { ergebnis } and titel with { art } (meister, pokal, euro, meister2, aufstieg). meilenstein with { id } (for example for Game Center), milestones backfilled from older careers with { id, nachtrag: true }. The IDs are listed in MILESTONES (src/p18_erfolge.js) |
quit() | shows QUIT (BEENDEN) in the main menu |
legal | replaces the copyright line on the title screen |
shareUrl | address in the share text, default https://hallenlegenden.de |
Regression tests for the game live in tests/ (Playwright with Chromium). GitHub Actions (.github/workflows/tests.yml) runs them on every pull request and every push to main: it builds the game first and fails if game/index.html or hallen-legenden.html don't match src/, then runs npm test and npm run tief; the result shows up as a check on the pull request. They step the game frame by frame with a fixed random seed and cover key mapping, passing, input buffering, player switching, a full match, career with cup and European cup, finances, potential, achievements and share image, pre-match comparison, editor, menu windows, touch controls and wide-screen layout, among others. After sh src/build.sh and before every merge:
cd tests
npm install # once
npx playwright-core install chromium # once, if Chromium is not installed yet
npm test # all 57 tests, about one minute
npm test -- pass zoom # only tests whose name contains these words
GAME=https://deploy-preview-14--hallenlegenden.netlify.app/game/ npm test # against a Netlify deploy preview
npm run tief # 9 deep tests, about three minutes (before bigger releases)
ALT=path/to/old/index.html npm run tief -- update # update test against a specific previous version
The deep tests (tests/tief.mjs) cover what short tests miss:
origin/main, or ALT= file or URL) and continued in the new one, as players experience a deploy: a match in progress, a cup match simulated in the meantime, a career and settings.The package.json deliberately lives only in tests/ so Netlify does not install anything when deploying.
The site runs at hallenlegenden.de on Netlify, straight from the main branch without a build step (netlify.toml). The landing page is in the root folder, the game at /game/.
The old address tobwil.github.io/HallenLegenden (GitHub Pages) redirects to hallenlegenden.de and carries existing save games along (assets/umzug.js). Form, domain and move details are in docs/LANDINGPAGE.md (German).
Tobias Wilhelm (tobwil) developed the game in conversation with Claude (Anthropic) in Claude Code: from a first version with fictional teams, through the pixel arena, the 2026/27 leagues and the manager mode, to touch controls. The full history with all requests, decisions and tests is in docs/ENTWICKLUNG.md, the versions are listed in CHANGELOG.md.
The code is licensed under the PolyForm Noncommercial License 1.0.0, © 2026 Tobias Wilhelm (tobwil). The source code is openly available, but the game is not licensed for commercial use.
Allowed is anything non-commercial: playing the game, reading and learning from the code, modifying it, building your own versions and sharing them free of charge. Charities, schools, clubs and universities may use it as well. Condition: the copyright notice "Copyright (c) 2026 Tobias Wilhelm" and the license text (or a link to it) must be kept in all copies and derived versions.
Not allowed is any commercial use, for example selling the game or a version based on it, offering it in an app store for money or with ads and in-app purchases, or including it in a commercial product. If you plan to do that, you need a separate license from Tobias Wilhelm (contact via the imprint).
Versions up to and including v8.11 were published under the MIT License. Copies of those earlier versions remain under the MIT License; all later versions are under the PolyForm Noncommercial License.
The name and logo are not covered by the license. The name "Hallen-Legenden" and the logo (the game's wordmark) are not part of the licensed code and remain reserved to Tobias Wilhelm. This also applies to other spellings and confusingly similar variations, such as "Hallenlegenden", "Hallen Legenden", "Legenden der Halle", "Hall Legends" or "Hallen-Legenden 2", and to the domain hallenlegenden.de.
If you publish a modified version (for example as a website, app or download), you:
A note on where it comes from is allowed and welcome, such as "Based on Hallen-Legenden by Tobias Wilhelm" with a link to this repository. A fork here on GitHub for contributing or trying out changes may keep the repository name.
localStorage)localStorage)