**Motivations:** - Make docs/specs implementation-ready without empty sections or placeholders. **Root causes:** - Multiple specs still contained non-actionable placeholders (N/A, “see above”, "..."), and inconsistent “no cache” wording. **Correctifs:** - Replace placeholders with explicit tables, structures, and typed examples. - Align “no cache / no memorization” statements where relevant. **Evolutions:** - Add a features doc entry to track the documentation enrichment effort. **Pages affectées:** - docs/specs/* - docs/features/docs-specs-enrichment.md - docs/leo.md - docs/plan-enrich-docs-specs.md
6.3 KiB
Spécifications Techniques : Architecture et Performance
1. Stack Technologique Recommandée
Backend
- Langage : Node.js (TypeScript) ou Go (pour la performance brute des workers).
- Framework : NestJS (Node) ou Gin (Go).
- Base de Données : PostgreSQL.
- Utilisation intensive du type
JSONBpour les données flexibles (états animaux, génétique). - Indexation GIN sur les champs JSONB souvent requêtés.
- Utilisation intensive du type
Frontend
- Framework : React ou Vue.js.
- État : Zustand ou Pinia (léger et performant).
- Rendu Grille : Canvas API (via PixiJS ou Konva) pour la Vue Isométrique.
- Gestion de la profondeur (z-index) pour les bâtiments et animaux.
- Système de tuiles (Tilemap) isométriques.
- Optimisation : Culling (ne pas rendre ce qui est hors écran).
Infrastructure
- Cache : Interdit (aucun cache applicatif, aucune mémorisation). Les lectures doivent refléter l’état courant calculé/stocké, sans couche de cache.
- Queue / Jobs : File de tâches sans cache.
- Option A : RabbitMQ (messages durables) pour les tâches asynchrones (morts, naissances, enchères).
- Option B : Jobs en base PostgreSQL (table
jobs+ workers) avec verrous transactionnels (SKIP LOCKED) pour éviter les doubles traitements.
2. Modélisation des Données (Hybride Relationnel / Document)
L'approche hybride permet de garder l'intégrité référentielle sur les entités (Zoo, User) tout en gardant la souplesse sur les attributs de gameplay.
Schéma SQL Simplifié
CREATE TABLE zoos (
id UUID PRIMARY KEY,
owner_id UUID NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
resources JSONB DEFAULT '{"coins": 200, "research": 0}',
stats JSONB DEFAULT '{"reputation": 0, "survival": 100}',
last_update TIMESTAMPTZ DEFAULT NOW() -- Clé pour le Lazy Update
);
CREATE TABLE animals (
id UUID PRIMARY KEY,
zoo_id UUID REFERENCES zoos(id),
type VARCHAR(50),
birth_date TIMESTAMPTZ,
state JSONB, -- { health, hunger, stress, happiness, lastFedAt, lastVisitedAt }
genetics JSONB, -- { color, rarity, parents, mutations, lineageId }
position JSONB -- { x, y, iso_x, iso_y, z_index }
);
3. Stratégie de Performance : "Lazy Updates"
Le calcul temps réel pour 1000 joueurs * 50 animaux est impossible à scaler naïvement.
Principe
Ne jamais mettre à jour la BDD à chaque seconde ("tick"). Calculer l'état d'un zoo uniquement quand c'est nécessaire (lecture par le joueur ou interaction).
Algorithme de Mise à Jour Différée (Lazy Update)
- État Stocké : Le zoo est sauvegardé à
T0avecFaim = 10. - Requête : Le joueur se connecte à
T1(2 heures plus tard). - Calcul à la Volée :
Delta_Temps = T1 - T0.Faim_Actuelle = Faim_Initiale + (Vitesse_Faim * Delta_Temps).- Appliquer les seuils (si Faim > 100, déclencher Mort).
- Persistance : Sauvegarder le nouvel état à
T1. - Réponse : Envoyer l'état à jour au client.
Exceptions (Workers)
Certains événements doivent arriver même si le joueur est hors ligne (ex: Enchères, Morts impactant le marché).
- Utiliser des Cron Jobs ou des Delayed Jobs sans cache pour traiter ces événements à l’heure d’échéance prévue.
- Option A : messages planifiés via RabbitMQ (plugin de scheduling si utilisé).
- Option B : table PostgreSQL
jobs(colonnesrun_at,locked_at,attempts,last_error) + worker(s) avecSELECT FOR UPDATE SKIP LOCKED.
4. API : Définition des Endpoints (REST)
Core Loop (Jeu)
GET /api/zoo/me: Récupère l'état complet du zoo (déclenche le Lazy Update).POST /api/zoo/move: Déplace un élément (Animal/Bâtiment).- Body:
{ "entity_id": "uuid", "x": 10, "y": 5 }
- Body:
POST /api/zoo/feed: Nourrit les animaux (Global ou Ciblé).
Économie & Marché
GET /api/market/auctions: Liste les enchères actives (Filtres: Type, Rareté).POST /api/market/bid: Placer une offre.- Body:
{ "auction_id": "uuid", "amount": 500 }
- Body:
POST /api/market/sell: Créer une enchère.
Système
POST /api/auth/login: Authentification par clé.GET /api/config: Récupère les tables statiques (Animaux, Coûts, Saisons) pour initialiser le client, sans mécanisme de cache applicatif.
Annexes UX/UI
0. Direction Artistique & Vue
- Vue : Isométrique (2.5D).
- Style : Coloré, vivant, détails foisonnants (Réf: IMG_20260303_170253.jpg).
- Sprites : 4 directions.
- Interactions :
- Sélection : Cliquer sur la base de l'élément (ou son sprite principal) pour le sélectionner.
- Feedback : Surbrillance (outline blanc/jaune) au survol de la souris.
1. Expérience Utilisateur (UX)
Chargement (Feedback)
Description UX : Le joueur attend le calcul du Lazy Update à la connexion.
Description UI : Écran de chargement avec barre de progression ou animation (Animal qui marche).
Emplacement : Plein écran (Démarrage).
Intégration : Bloquant.
Navigation : Aucune (écran d’attente avant accès au jeu).
Événements : APP_LOAD.
Assets
- Musiques : Thème Principal.
- Sons :
ui_loader_tick.mp3(boucle courte et discrète),ui_loaded_pop.mp3(fin de chargement). - Graphiques : Logo Jeu.
- Images :
loading_mascot.png(mascotte),loading_background.png(fond). - Vidéos :
loading_anim.webm(animation courte, loop). - Animations : Loader.
- Couleurs : Thème Jeu.
- Textes : "Calcul de la simulation", "Rattrapage du temps".
- Formes : Cercle (spinner), barre (progress).
Erreur Connexion (Feedback)
Description UX : Perte de connexion ou erreur API.
Description UI : Toast ou Modal "Erreur Réseau". Bouton "Réessayer".
Emplacement : Overlay.
Intégration : Bloquant ou Non-bloquant.
Navigation : Clic Réessayer.
Événements : NETWORK_ERROR.
Assets
- Musiques : Ducking du thème principal (-6 dB) pendant l’affichage de l’erreur.
- Sons :
error.mp3. - Graphiques : Icône Wifi barré.
- Images :
icon_wifi_off.png,modal_error_bg.png. - Vidéos :
network_error_glitch.webm(optionnel, 0.8s loop). - Animations : Secousse.
- Couleurs : Rouge.
- Textes : "Connexion perdue".
- Formes : Rectangle arrondi (modal), toast (pill).