Aller au contenu principal
Diagramme client / serveur / base de données

Architecture

Stack retenue

CoucheChoixPourquoi
Rendu clientPixiJS 8 + TypeScript strict + ViteWebGL 2D rapide ; l'isométrique est du sprite trié, pas de la 3D — Phaser apporterait un moteur de jeu dont on n'utiliserait rien
Temps réelColyseus (Node/TS)Modèle room-based qui épouse exactement « une chambre = une room », state sync autoritatif intégré, schema binaire compact
PersistancePostgreSQLComptes, chambres, inventaires, transactions d'économie (ACID obligatoire dès qu'on troque)
Cache/présenceRedisPrésence en ligne, rate-limit chat, pub/sub inter-processus quand on scalera
DéploiementDocker Swarm sur VPS beben0.com, Traefik v3Infra existante et maîtrisée ; WebSocket derrière Traefik (readTimeout: 0s, cf. memory)
Monorepopnpm workspaces : client/, server/, shared/shared/ porte les types du protocole et la logique grille/pathfinding, testée une fois, utilisée des deux côtés

Principe non négociable : serveur autoritatif

Le client n'est qu'un affichage plus des intentions (« je veux aller en (4,7) », « je pose l'item 42 ici »). Le serveur valide tout : déplacement, placement, échange, solde. Un jeu avec économie et troc attire les tricheurs dès le premier jour ; l'autorité serveur ne se rajoute pas après coup.

Découpage

client/ PixiJS. Rendu iso, input, interpolation, UI (catalogue, inventaire, chat)
shared/ Types du protocole, grille iso, A*, règles de placement. Zéro dépendance.
server/ Colyseus rooms (RoomState = avatars, furni posés, chat) + API REST
(auth, catalogue, inventaire) + accès Postgres

Frontière importante : la simulation de chambre (temps réel, Colyseus, éphémère) et le système économique (REST, Postgres, transactionnel) ne se parlent que par événements explicites. Poser un meuble = transaction Postgres d'abord, broadcast temps réel ensuite. Jamais l'inverse.

Rendu isométrique — décisions

  • Projection 2:1 classique (tuile 64×32), profondeur = x + y puis z.
  • Avatars : sprites pré-rendus 8 directions. Les assets viennent de MiniMax image-01 puis découpage manuel en spritesheet — pipeline dans docs/assets/PIPELINE.md (à écrire en phase 0).
  • Une chambre = grille ≤ 32×32, ~30 avatars max. Au-delà : instancier une seconde chambre, comme Habbo.

Ce qu'on refuse d'abstraire maintenant (YAGNI)

  • Multi-serveur / sharding : un seul process Colyseus jusqu'à preuve de saturation.
  • Microservices : un seul déployable serveur.
  • CDN d'assets : les sprites pèsent quelques Mo, Traefik suffit.