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를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Un 4X spatial temps réel : bâtiments, unités, laboratoire de recherche, missions, combats entre joueurs — synchronisé en direct sur tous tes appareils. Réécriture complète du prototype HTML/CSS/JS d'origine (conservé dans legacy/ pour référence) vers une stack moderne :README 전문 보기 ↗
Un 4X spatial temps réel : bâtiments, unités, laboratoire de recherche, missions, combats entre joueurs — synchronisé en direct sur tous tes appareils.
Réécriture complète du prototype HTML/CSS/JS d'origine (conservé dans
legacy/ pour référence) vers une stack moderne :
npm run test.npm install
cp .env.example .env.local # renseigne VITE_POCKETBASE_URL
npm run dev
Sans VITE_POCKETBASE_URL, l'application vise http://127.0.0.1:8090 et
affiche un bandeau d'avertissement sur l'écran de connexion.
Une seule commande (relançable sans risque) crée les collections du jeu
avec leurs règles d'accès, et active la connexion par pseudo sur users :
PB_URL=https://ton-pocketbase PB_ADMIN_EMAIL=… PB_ADMIN_PASSWORD=… \
node pocketbase/setup.mjs
Le schéma est décrit dans pocketbase/pb_schema.json (importable aussi à la
main : admin PocketBase → Settings → Import collections). Pour le mot de
passe oublié, configure le SMTP dans Settings → Mail settings et l'URL de
l'application dans Settings → Application.
Toute la partie est arbitrée par le serveur : production, constructions,
unités, recherches, missions, échanges, dons et combats passent par les
routes /api/cosmic/* de pocketbase/pb_hooks/cosmic.pb.js. Les règles
d'accès (pb_schema.json) interdisent au navigateur d'écrire lui-même ses
ressources, niveaux, unités ou son XP.
Fichiers de pocketbase/pb_hooks/ :
| Fichier | Rôle |
|---|---|
cosmic_updater.pb.js | au démarrage, télécharge les autres fichiers depuis la branche main de GitHub |
cosmic.pb.js | les routes du jeu |
cosmic_db.js | lecture/écriture des joueurs en base |
cosmic_game.js | logique de jeu, générée depuis src/game (npm run build:hooks) |
cosmic_sync.js | la mise à jour depuis GitHub (utilisée par l'updater et l'administration) |
Installation (une seule fois) : seul cosmic_updater.pb.js est à copier
dans le dossier pb_hooks du serveur (volume Coolify monté sur
/pb/pb_hooks, voir la doc de ton image), puis redémarre PocketBase :
# dans le terminal du conteneur PocketBase
wget -O /pb/pb_hooks/cosmic_updater.pb.js \
https://raw.githubusercontent.com/fs0ciety7000/ogame-like/main/pocketbase/pb_hooks/cosmic_updater.pb.js
Ensuite, à chaque démarrage, PocketBase récupère la dernière version
des hooks sur main (seulement si tous les fichiers sont téléchargés et
valides ; sinon il garde ceux en place). Après un déploiement, le bouton
Administration → Outils → Mettre à jour les hooks fait la même chose sans
redémarrer à la main. Variables d'environnement facultatives :
COSMIC_HOOKS_AUTOUPDATE=0 (désactive), COSMIC_HOOKS_BRANCH=autre-branche.
La mise à jour est ignorée quand pb_hooks est celui d'une copie du dépôt
(développement local).
cosmic.pb.js résout aussi les flottes en vol (arrivée, combat, retour)
grâce à une tâche planifiée qui tourne chaque minute (cronAdd), et à
chaque action du joueur concerné.
cosmic.pb.js consigne aussi chaque modification faite par un
administrateur dans la collection admin_logs (onglet Journal de
l'administration). node pocketbase/setup.mjs active en plus une
sauvegarde automatique quotidienne (3 h UTC, 14 conservées).
Vérification : curl -X POST https://ton-pocketbase/api/cosmic/action
doit répondre 401 (route présente, connexion requise) et non 404.
Après toute modification des règles dans src/game, lance
npm run build:hooks et commite cosmic_game.js (un test échoue si le
fichier est périmé).
Remise à zéro de l'XP de tous les joueurs (ressources et bâtiments conservés) :
PB_URL=… PB_ADMIN_EMAIL=… PB_ADMIN_PASSWORD=… node scripts/reset-xp.mjs --dry-run
PB_URL=… PB_ADMIN_EMAIL=… PB_ADMIN_PASSWORD=… node scripts/reset-xp.mjs
Page Administration (icône clé à molette dans l'en-tête, /game/admin),
réservée aux comptes listés dans la collection admins :
# promouvoir un compte existant (inscris-toi d'abord dans le jeu)
PB_URL=… PB_ADMIN_EMAIL=… PB_ADMIN_PASSWORD=… [email protected] node pocketbase/setup.mjs
(ou dans l'admin PocketBase : collection admins → New record, id = id du compte).
Ce qu'on y règle, sans toucher au code :
game_assets. Chaque fiche
affiche un aperçu (coûts et production par niveau, puissance par place de
hangar, rentabilité par heure des missions). Le contenu est validé avant
enregistrement (références cassées, doublons, cycles de prérequis).Le contenu modifié est stocké dans game_config (une entrée par section ;
« Valeurs par défaut » la supprime et revient au code). Il s'applique en
direct chez tous les joueurs et côté serveur (combat arbitré par les
hooks). Les nouvelles mécaniques (nouveau type de ressource, nouvel effet
de techno ou de bâtiment) restent du code : src/game/.
Console Firebase → Paramètres du projet → Comptes de service →
« Générer une nouvelle clé privée » → enregistre le fichier sous
service-account.json à la racine (ignoré par git).
Lance d'abord une simulation, puis la vraie migration :
export GOOGLE_APPLICATION_CREDENTIALS=./service-account.json
export PB_URL=https://ton-pocketbase PB_ADMIN_EMAIL=… PB_ADMIN_PASSWORD=…
node scripts/migrate-firebase-to-pocketbase.mjs --dry-run
node scripts/migrate-firebase-to-pocketbase.mjs
Comptes, profils, files d'attente, notifications, alliances et messages,
rapports et dons sont copiés. Les mots de passe Firebase ne sont pas
transférables : chaque compte reçoit un mot de passe provisoire, listé dans
migration-output/passwords.csv (à transmettre en privé ; ajoute
--send-reset-emails pour envoyer aussi un lien de réinitialisation aux
comptes qui ont un vrai email). Le script est relançable.
npm run lint && npm run build && npm test # vérifications rapides
# Intégration, contre un PocketBase de TEST (jamais la production) :
PB_TEST_URL=http://127.0.0.1:8090 PB_TEST_ADMIN_EMAIL=… PB_TEST_ADMIN_PASSWORD=… \
npx vitest run src/services/pocketbase.integration.test.ts
# Parcours de fumée dans Chromium (client lancé avec VITE_POCKETBASE_URL de test) :
BASE_URL=http://localhost:5173 node e2e/smoke.mjs
GitHub Actions (.github/workflows/ci.yml) lance tout cela à chaque pull
request : un PocketBase vierge est démarré avec les hooks de la branche
(COSMIC_HOOKS_AUTOUPDATE=0), le schéma est installé, puis viennent les tests
d'intégration et le parcours de fumée (bureau et téléphone : erreurs
JavaScript, pages vides, débordement horizontal).
npm run build produit dist/ (SPA statique : rediriger toutes les routes
vers index.html, voir vercel.json). Renseigne VITE_POCKETBASE_URL dans
les variables d'environnement de l'hébergeur. Si le site est servi en
HTTPS, PocketBase doit l'être aussi (sinon le navigateur bloque les
requêtes).
src/
game/ formules pures du jeu (bâtiments, unités, recherche, combat…)
services/ accès PocketBase (actions de jeu, abonnements temps réel)
store/ état client (Zustand) alimenté par les abonnements
hooks/ synchro temps réel, ressources affichées en direct, tickers
components/ UI (primitives + composants de jeu)
pages/ une page par écran du jeu
pocketbase/ schéma (pb_schema.json), script d'installation, hooks serveur (pb_hooks/)
scripts/ migration Firebase -> PocketBase, remise à zéro de l'XP
src/server/ point d'entrée de la logique compilée pour les hooks
src/pages/admin/ interface d'administration (éditeurs de contenu, joueurs, outils)
legacy/ ancien prototype HTML/CSS/JS (référence, non utilisé)
users comptes (email, username = pseudo, name = pseudo affiché)
players/{id} profil, ressources, bâtiments, unités, techs (id = id du compte)
queues/{id} files d'attente (constructions/unités/recherches/missions)
notifications journal d'évènements (temps réel)
battle_reports rapports de combat (créés par l'attaquant, traités une
seule fois par le défenseur)
spy_reports, resource_gifts, alliances, alliance_messages
Toute la logique (production, files, combat) est rejouée côté client à
partir d'un horodatage (resourcesUpdatedAtMs) à chaque action et à
intervalle régulier (~20s), ce qui permet un rattrapage correct de la
progression pendant les périodes hors‑ligne.