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。 以下为已保存的摘录。
Kostenloses Social-Sport-Tippspiel als Web-App: Fußball, NFL, NBA und NHL tippen, mit virtuellen Sternen statt Echtgeld. Komplett auf Deutsch, Dark Theme, für das Handy gebaut (funktioniert auch am Desktop). Keine App-Store-App: die Seite lässt sich im Browser „zum Startbildschirm hinzufügen“.查看完整 README ↗
Kostenloses Social-Sport-Tippspiel als Web-App: Fußball, NFL, NBA und NHL tippen, mit virtuellen Sternen statt Echtgeld. Komplett auf Deutsch, Dark Theme, für das Handy gebaut (funktioniert auch am Desktop). Keine App-Store-App: die Seite lässt sich im Browser „zum Startbildschirm hinzufügen“.
| Teil | Was |
|---|---|
| Oberfläche | Next.js 14 (App Router), React 18, TypeScript, Tailwind CSS |
| Datenbank, Login, Live-Chat | Supabase (Postgres, Auth, Realtime) |
| Hosting | Vercel, baut automatisch bei jedem Push auf main |
| Echte Sportdaten | TheSportsDB (kostenloser Schlüssel, kein eigener Key nötig) |
Drei getrennte Zähler: Rangliste-Punkte (Elo-ähnlich), Saison-Pass-XP und Sterne (Einsatz-Währung).
app/ Seiten (eine Datei pro Seite, z. B. app/rangliste/page.tsx)
components/ wiederverwendbare Bausteine (Karten, Navigation, Chat, …)
lib/ Logik und Datenzugriff (Supabase-Anbindung, Punkte, Sportdaten)
public/ Bilder und App-Icons
supabase/ SQL-Skripte für die Datenbank
Die Skripte im Ordner supabase/ legen Tabellen, Regeln und Funktionen an.
Ausführen jeweils im Supabase-Dashboard unter SQL Editor → New query →
Skript einfügen → Run. Die Skripte sind so geschrieben, dass ein zweiter Durchlauf nichts kaputt macht.
Bei einer neuen, leeren Datenbank in dieser Reihenfolge:
profiles.sql – Spielerprofiletips.sql – Tippssocial-features.sql – Spiele, Teams, News, Kommentare, Feed, Chat, Duelle, Turnierefix-rechte-tabellen.sql – Grundrechte für die App-Tabellenfixes-features40.sql – Korrekturen (Sterne, Endstand-Korrektur, Sicherheit)tipprunden.sql – private Tipprundenvereinswertung.sql – Herzensverein und VereinstabellenDie Live-Datenbank hat alle sieben Skripte bereits. Kommt später ein neues Skript dazu, wird nur dieses eine ausgeführt.
Wichtig: Die Admin-E-Mail ist in der SQL-Funktion is_admin() hinterlegt
(social-features.sql). Neue Tabellen brauchen immer RLS-Regeln und
grant-Rechte für anon/authenticated.
Die App braucht zwei Werte aus Supabase (Project Settings → API):
NEXT_PUBLIC_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
.env.example nach .env.local kopieren und die Werte eintragen.
.env.local wird nie auf GitHub hochgeladen.Der „anon“-Key darf öffentlich sein, die Daten schützen die RLS-Regeln in Supabase.
Für Live-Stände auf den Tippkarten (Rene, 15.10.2026) braucht die App einen Schlüssel von API-Sports (Gratis-Plan: 100 Abfragen pro Tag je Sportart):
API_SPORTS_KEY=
NEXT_PUBLIC_,
der Schlüssel bleibt auf dem Server (Route app/api/live/route.ts).source, fetchedAt,
liveError, quota). Hängen die Daten, steht im Matchcenter „Live-Daten
verzögert“ und auf der Tippkarte „verzögert“ am LIVE-Pill. Der Admin-Bereich
zeigt in der Kachel „Live-Daten“ Anbieter, letzten Abruf, Fehler und die
Abfragen von heute (ohne zusätzliche Abfrage).Der Anbieter ist austauschbar (Rene, 16.10.2026). Gewählt wird er über die
Umgebungsvariable LIVE_PROVIDER (Standard api-sports):
LIVE_PROVIDER=api-sports
Aufbau:
| Datei | Was |
|---|---|
lib/live/types.ts | anbieterneutrale Typen (LiveGame, LiveSnapshot, LiveProvider …) – nur davon hängen Route und Browser ab |
lib/live/cache.ts | Server-Cache mit festen Ablaufzeiten, fasst gleichzeitige Abrufe zusammen |
lib/live/providers/apiSports.ts | alles API-Sports-Spezifische (URLs, Schlüssel, Umwandlung, Fehler, Quote) |
lib/live/index.ts | wählt den Anbieter über LIVE_PROVIDER |
Neuen Anbieter ergänzen:
lib/live/providers/<name>.ts anlegen, die ein LiveProvider-Objekt
exportiert (Vorlage: apiSports.ts): id, name, url,
configError() (fehlender Schlüssel), getDay({ sport, date, league })
und diagnostics().getDay die Spiele des Tages (Wiener Zeit) abrufen – mit
cachedLoad aus lib/live/cache.ts und cache: "no-store" – und in
LiveGame umwandeln. Status auf NS/LIVE/HT/BREAK/FT/AET/PEN/OTHER
abbilden, für die mitlaufende Minute statusShort „1H“/„2H“/„HT“ setzen.
Nur eingeschaltete Ligen liefern (isLiveLeagueEnabled aus lib/liveConfig.ts).source ehrlich setzen: live (frischer Live-Stand), day (nur
Tagesliste) oder stale (alter Live-Stand nach Fehler), Fehler beim
Live-Abruf in liveError, Quote in quota, falls der Anbieter sie mitschickt.lib/live/index.ts in PROVIDERS eintragen, Schlüssel und
LIVE_PROVIDER=<id> bei Vercel setzen.Voraussetzung: Node.js 18.17 oder neuer (empfohlen 20 oder 22).
npm install # einmalig, installiert genau die Versionen aus package-lock.json
npm run dev # startet die App auf http://localhost:3000
Weitere Befehle:
npm run build # Produktions-Build (prüft auch alle TypeScript-Typen)
npm run start # startet den fertigen Build
Jede Änderung auf dem Branch main wird von Vercel automatisch gebaut und
veröffentlicht, das dauert ein bis zwei Minuten.
Ändert sich die Datenbank, muss das neue SQL-Skript zusätzlich einmal im Supabase SQL Editor ausgeführt werden (siehe oben).
Hinweis: Vorschau-Deployments von Vercel für Pull Requests schlagen derzeit
oft fehl, obwohl der Code in Ordnung ist. Entscheidend ist der Deploy nach dem
Merge auf main.