Architecture
Stack retenue
| Couche | Choix | Pourquoi |
|---|---|---|
| Rendu client | PixiJS 8 + TypeScript strict + Vite | WebGL 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éel | Colyseus (Node/TS) | Modèle room-based qui épouse exactement « une chambre = une room », state sync autoritatif intégré, schema binaire compact |
| Persistance | PostgreSQL | Comptes, chambres, inventaires, transactions d'économie (ACID obligatoire dès qu'on troque) |
| Cache/présence | Redis | Présence en ligne, rate-limit chat, pub/sub inter-processus quand on scalera |
| Déploiement | Docker Swarm sur VPS beben0.com, Traefik v3 | Infra existante et maîtrisée ; WebSocket derrière Traefik (readTimeout: 0s, cf. memory) |
| Monorepo | pnpm 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 + ypuisz. - 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.