Files
builazoo/docs/specs/tech_architecture.md
Nicolas Cantu e92c1355d0 Enrichissement exhaustif des specs : Vue Isométrique et Design
**Motivations:**
- Aligner toute la documentation technique avec la nouvelle direction artistique isométrique (Réf IMG_20260303_170253).
- Faciliter l'implémentation en ajoutant les contraintes techniques liées à la 2.5D (Z-index, Sprites 4 directions).

**Root causes:**
- Besoin de cohérence visuelle et technique sur l'ensemble du projet.

**Correctifs:**
- N/A

**Evolutions:**
- Ajout systématique de la section "Direction Artistique & Vue" dans `Annexes UX/UI` de tous les fichiers.
- Enrichissement des modèles JSON avec coordonnées isométriques (`iso_x`, `iso_y`, `z_index`).
- Précision des interactions (clic, survol) adaptées à la grille losange.
- Conservation stricte de la structure existante (aucun titre supprimé).

**Pages affectées:**
- docs/specs/*
2026-03-05 02:10:32 +01:00

5.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 JSONB pour les données flexibles (états animaux, génétique).
    • Indexation GIN sur les champs JSONB souvent requêtés.

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 : Redis (pour les sessions, les compteurs temps réel et les files d'attente de jobs).
  • Message Broker : BullMQ (Redis) ou RabbitMQ pour les tâches asynchrones (morts, naissances, enchères).

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, ... }
  genetics JSONB, -- { color, rarity, parents... }
  position JSONB -- { x, y }
);

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)

  1. État Stocké : Le zoo est sauvegardé à T0 avec Faim = 10.
  2. Requête : Le joueur se connecte à T1 (2 heures plus tard).
  3. 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).
  4. Persistance : Sauvegarder le nouvel état à T1.
  5. 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 (Redis) pour traiter ces événements spécifiques à leur heure d'échéance prévue.

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 }
  • 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 }
  • 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 le cache client.

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 : N/A Événements : APP_LOAD.

Assets

  • Musiques : Thème Principal.
  • Sons : N/A
  • Graphiques : Logo Jeu.
  • Images : N/A
  • Vidéos : N/A
  • Animations : Loader.
  • Couleurs : Thème Jeu.
  • Textes : "Calcul de la simulation...", "Rattrapage du temps...".
  • Formes : N/A

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 : N/A
  • Sons : error.mp3.
  • Graphiques : Icône Wifi barré.
  • Images : N/A
  • Vidéos : N/A
  • Animations : Secousse.
  • Couleurs : Rouge.
  • Textes : "Connexion perdue".
  • Formes : N/A