- Nouveau server/src/game/buildings.js : 2 bâtiments, chacun couvrant 2
attributs, coût réparti sur les deux jauges, garantit +1 par tour sur
chaque attribut, avec bonus de synergie +1 si l'objet correspondant est
aussi possédé (Église+Trousse/Sceau, Château+Charrue/Trébuchet).
- Room.js : buyBuilding() (validation coût multi-jauges), résolution des
achats en attente avec la même priorité/stock unique que les objets,
_applyBuildingEffects() (garantie de base + synergie, jamais de recul par
rapport aux gains déjà boostés par un objet). getStateFor/getPlayersInfo
exposent buildings/myBuildings/availableBuildings/pendingBuyBuildingId.
- Nouvel event socket 'buy-building', boughtBuildings inclus dans round-result.
- Client : buildings.js (miroir), BootScene génère les textures portrait des
bâtiments (méthode _generatePortraitTexture généralisée, réutilisée avec
les objets). ItemBoardToken généralisé (kind='item'|'building', hAnchor
'left'|'right') pour afficher indifféremment un objet ou un bâtiment, avec
coût détaillé par jauge affiché sur la carte agrandie pour les bâtiments.
- GameScene : boutique de bâtiments en colonne à DROITE du plateau
(symétrique à la boutique d'objets à gauche), mes bâtiments possédés
affichés à GAUCHE de ma main (symétrique à mes objets à droite), bâtiments
des adversaires affichés sous leurs objets au niveau de leur slot.
- Fix : la carte détaillée héritait par défaut d'un ancrage "s'étend vers la
droite" adapté à la boutique d'objets (bord gauche du canvas) mais cassait
la boutique de bâtiments (bord droit) — le bouton ACHETER se retrouvait
hors du canvas et donc injoignable au clic. Ajout du paramètre hAnchor.
- 26 nouveaux tests unitaires serveur (buildings.js + Room.js : validations
d'achat multi-jauges, priorité/stock unique, effets de base et synergie).
- 6 nouveaux tests E2E Playwright (boutique bâtiments : affichage, position,
carte détaillée dans les limites du canvas, coût affiché, achat complet).
- Fix flakiness des tests E2E d'achat (item-shop + building-shop) : le mode
'min' de playCard garantit désormais que l'adversaire joue sa carte la
plus faible sur l'attribut ciblé, au lieu de simplement jouer un autre
attribut (insuffisant, le gain dépend de la comparaison au voisin gauche).