JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
GameSession.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Valentin Eloy
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <memory>
7#include <optional>
8#include <set>
9#include <string>
10#include <unordered_map>
11#include <vector>
12
15#include "Core/Ecs/World.h"
19#include "Core/Levels/Level.h"
21#include "Core/Physics/Aabb.h"
24#include "HMI/Game/GameEvents.h"
25#include "HMI/Game/IGameMode.h"
34
39
40namespace hmi {
41
42class SpriteBatch;
43class TextureAtlas;
44class TextureCache;
45class InputState;
46class BitmapFont;
47class Localization;
48
65public:
85 GameSession(SpriteBatch& batch, const TextureAtlas& atlas, TextureCache& cache,
86 int viewportWidth, int viewportHeight, core::Level level,
87 const GameKeyBindings& gameBindings, const GamepadBindings& gamepadBindings,
88 const BitmapFont& font, const Localization* localization = nullptr);
89
96 core::LevelOutcome update(const InputState& input, float fixedDelta);
97
109 core::LevelOutcome update(const core::PlayerInput& input, float fixedDelta);
110
112 void reload();
113
117 void render(int viewportWidth, int viewportHeight, RenderMode mode, float interpolationAlpha);
118
127 void setSkins(const SkinCatalog* skins, std::string skinSet = {}) {
128 _tileSkins = skins;
129 _tileSkinSet = skinSet;
130 _renderer.setSkins(skins, std::move(skinSet));
131 }
132
134 [[nodiscard]] bool loaded() const {
135 return _level.has_value();
136 }
137
139 [[nodiscard]] const std::string& loadError() const {
140 return _loadError;
141 }
142
152 [[nodiscard]] const std::vector<GameEvent>& lastStepEvents() const noexcept {
153 return _lastStepEvents;
154 }
155
159 [[nodiscard]] SceneStatistics renderStatistics() const noexcept {
160 return _renderer.lastScene().statistics();
161 }
162
172 void setGameMode(std::unique_ptr<IGameMode> mode);
173
175 [[nodiscard]] const IGameMode& gameMode() const noexcept {
176 return *_mode;
177 }
178
179private:
180 // --- Passes du pas fixe (hmi::IGameModePasses, LOT-05) ---
181 //
182 // Heritage PRIVE : ces passes sont offertes au mode de jeu, pas a l'appelant de la session.
183 // Elles ne font chacune que ce que leur nom dit, et aucune ne decide de ce qui vient apres --
184 // c'est tout l'objet de la separation (EX-ARCH-002).
185 void snapshotPreviousPositions() override;
186 void advanceParticles(float fixedDelta) override;
187 void advanceScreenShake(float fixedDelta) override;
188 void moveCharacter(const core::PlayerInput& input, float fixedDelta) override;
189 void advanceAnimations(float fixedDelta) override;
190 void updateCamera(float fixedDelta) override;
191 void updateMechanisms(const core::PlayerInput& input) override;
192 void detectEvents() override;
193 void updateMechanismVisuals(float fixedDelta) override;
194 [[nodiscard]] core::LevelOutcome evaluateOutcome() override;
195 void onLevelLost() override;
196
201 [[nodiscard]] core::Aabb playerBox();
202
203 void loadLevel(core::Level level);
210 void applyMechanismVisual(core::Entity entity, bool active, MechanismVisualState& state,
211 const SceneTextures& textures, float fixedDelta);
220 [[nodiscard]] std::vector<core::Aabb> collectActiveDangerBoxes();
221 void refreshPlayerSprite();
223 void updateCurrentRoom();
227 void centerCameraOnZone(const core::CameraZone& zone);
238 void updateFollowCamera(float fixedDelta);
242 void applyCameraFraming(int viewportWidth, int viewportHeight, float interpolationAlpha);
247 void updateTileAnimations(float fixedDelta);
251 void renderHud(int viewportWidth, int viewportHeight);
252
259 const Localization* _localization; // non possede ; nul = HUD desactive (EX-NFR-040)
267 std::optional<core::Level> _level;
268 std::optional<core::MechanismController> _mechanisms;
269 std::vector<core::Entity> _doorEntities;
273 std::vector<core::Entity> _switchEntities;
285 int _levelWidth = 0;
287 std::optional<RoomGrid> _roomGrid;
294 std::optional<std::size_t> _currentZoneIndex;
306 std::string _loadError;
307
308 // Habillage des tuiles (LOT-46 TACHE-05) : copie locale de ce que setSkins() transmet aussi a
309 // _renderer, necessaire pour decouvrir les assets animes au pas fixe (update()), independamment
310 // du rendu (render()).
311 const SkinCatalog* _tileSkins = nullptr; // non possede
312 std::string _tileSkinSet;
315 std::unordered_map<std::string, core::Animation> _tileAnimations;
319 std::set<std::string> _warnedExcludedAnimations;
320
321 // Apparence des mecanismes pilotee par l'etat (LOT-47) : une horloge par instance suivie
322 // (porte, declencheur, danger commute/temporise/mobile), independante de _tileAnimations
323 // ci-dessus.
324 std::vector<MechanismVisualState> _doorVisuals;
325 std::vector<MechanismVisualState> _switchVisuals;
326 std::vector<MechanismVisualState> _dangerSwitchedVisuals;
327 std::vector<MechanismVisualState> _dangerBlinkVisuals;
328 std::vector<MechanismVisualState> _dangerMoverVisuals;
332 std::set<std::string> _warnedMissingMechanismClips;
333
334 // Détection d'événements (LOT-60 TACHE-03) : snapshots du pas précédent, pour ne diffuser une
335 // transition qu'au pas où elle a réellement lieu (même discipline que MechanismVisualState
336 // ci-dessus -- previousXxx/initialized).
339 std::unique_ptr<IGameMode> _mode;
340
343 std::vector<GameEvent> _lastStepEvents;
344};
345
346} // namespace hmi
Boîte englobante alignée aux axes (AABB) et fabrique associée.
Système d'animation générique, piloté par données (LOT-46).
Caméra 2D : conversion entre unités monde et pixels écran.
Mode de cadrage de caméra porté par le niveau (EX-LVL-006, EX-REN-016, LOT-64).
Résolution de la zone de caméra active parmi des zones dessinées à la main (mode par salle,...
Caméra de suivi du personnage : zone morte, anticipation, lissage, bornage (EX-REN-016,...
Détection pure des transitions d'état du jeu et de l'IHM (EX-REN-047, LOT-60).
Association remappable action de jeu -> touche clavier, avec persistance (EX-CTRL-012).
Association remappable action de jeu -> bouton manette, avec persistance (EX-CTRL-002,...
Position entière dans la grille d'un niveau (colonne, ligne).
Mode de jeu : l'ordre des passes d'un pas fixe, séparé de l'orchestrateur (LOT-05).
Issue d'un niveau (en cours / gagné / perdu) évaluée depuis la position du personnage.
Niveau chargé : grille de tuiles, entrée/sortie et mécanismes.
Comportement des mécanismes interrupteur↔porte : état + grille de collision.
Correspondance état logique d'un mécanisme → nom de clip d'animation (LOT-47 TACHE-01).
Émetteur et simulation de particules, au pas fixe, déterministe, budget borné (LOT-53 TACHE-01,...
Intention de déplacement du personnage, neutre vis-à-vis de l'entrée physique.
Partition d'un niveau en salles de taille fixe, pour le cadrage caméra (LOT-32).
Rend les entités de l'ECS possédant un Transform et un Sprite.
Réglages du déplacement en vue de dessus (données pures).
Façade de l'ECS : entités, composants, vues et orchestration des systèmes.
Fait progresser l'animation de toute entité portant core::Animation, et projette l'état physique du p...
Definition AnimationSystem.h:77
Definition Level.h:125
Émet et simule des particules visuelles au pas fixe, strictement déterministe.
Definition ParticleSystem.h:85
Point d'entrée unique de la simulation : possède les entités, les composants et les systèmes.
Definition World.h:35
Police bitmap chargée depuis Assets/Fonts/, avec repli procédural (EX-NFR-040).
Definition BitmapFont.h:39
Caméra 2D orthographique : projette le monde vers l'écran pour le rendu.
Definition Camera2D.h:79
Liste ordonnée des primitives d'une image, indépendante de Direct3D.
Definition ComposedScene.h:134
Association action de jeu -> touche, avec persistance JSON (EX-CTRL-012, LOT-29).
Definition GameKeyBindings.h:50
const SkinCatalog * _tileSkins
Definition GameSession.h:311
core::Entity _player
Definition GameSession.h:284
TextureCache & _cache
Definition GameSession.h:254
core::World _world
Definition GameSession.h:260
void refreshMechanismDiagnosticTint(RenderMode mode)
Modulation d'opacité de diagnostic, réservée au mode Physique (LOT-47 TACHE-03) : ce mode n'a pas d'a...
Definition GameSession.cpp:370
void moveCharacter(const core::PlayerInput &input, float fixedDelta) override
Déplace le personnage selon l'intention de ce pas.
Definition GameSession.cpp:659
std::vector< MechanismVisualState > _doorVisuals
Definition GameSession.h:324
ComposedScene _hudScene
Scène composée du HUD, distincte de celle de _renderer (LOT-52 TACHE-02) : jamais de cadrage de culli...
Definition GameSession.h:266
const TextureAtlas & _atlas
Definition GameSession.h:253
core::CameraFramingConfig _cameraFraming
Cadrage de caméra résolu du niveau courant (LOT-64), copié une fois au chargement – n'affecte jamais ...
Definition GameSession.h:298
void advanceScreenShake(float fixedDelta) override
Fait décroître la secousse d'écran courante (LOT-53).
Definition GameSession.cpp:655
int _levelWidth
Definition GameSession.h:285
std::set< std::string > _warnedMissingMechanismClips
Couples (asset, clip attendu) deja signales comme manquants : un seul message par combinaison pour to...
Definition GameSession.h:332
void applyCameraFraming(int viewportWidth, int viewportHeight, float interpolationAlpha)
Sélectionne le zoom et le centre effectifs de _camera selon le mode de cadrage résolu du niveau (core...
Definition GameSession.cpp:565
void onLevelLost() override
Conséquences d'un échec : éclatement, secousse, puis rechargement du niveau.
Definition GameSession.cpp:742
SceneStatistics renderStatistics() const noexcept
Definition GameSession.h:159
void updateCurrentCameraZone()
Équivalent de updateCurrentRoom quand _cameraFraming.zones est non vide : résout la zone active (hmi:...
Definition GameSession.cpp:516
const GameKeyBindings & _gameBindings
Definition GameSession.h:255
const GamepadBindings & _gamepadBindings
Definition GameSession.h:256
core::Aabb playerBox()
Definition GameSession.cpp:690
void applyMechanismVisual(core::Entity entity, bool active, MechanismVisualState &state, const SceneTextures &textures, float fixedDelta)
Applique la correspondance état → clip à une entité-tuile de mécanisme : résout l'asset effectivement...
Definition GameSession.cpp:295
std::unique_ptr< IGameMode > _mode
Mode de jeu courant (LOT-05) : l'ordre des passes du pas fixe.
Definition GameSession.h:339
core::GridPosition _currentRoomIndex
Definition GameSession.h:288
void updateFollowCamera(float fixedDelta)
Avance la caméra de suivi d'un pas fixe (mode Follow, LOT-64 TACHE-02) : lit la position simulée du p...
Definition GameSession.cpp:537
void spawnPlayer(core::GridPosition entry)
Definition GameSession.cpp:267
void updateMechanismVisuals(float fixedDelta) override
Projette l'état logique des mécanismes sur leur apparence (LOT-47, EX-REN-006).
Definition GameSession.cpp:352
void centerCameraOnWholeLevel()
Centre la caméra sur le niveau entier (mode WholeLevel, LOT-64) : centre fixe, posé une fois au charg...
Definition GameSession.cpp:503
std::string _tileSkinSet
Definition GameSession.h:312
void centerCameraOnZone(const core::CameraZone &zone)
Centre la caméra sur une zone dessinée à la main (mode PerRoom, _cameraFraming.zones non vide,...
Definition GameSession.cpp:509
core::AnimationSystem _animation
Definition GameSession.h:274
void updateMechanisms(const core::PlayerInput &input) override
Résout les mécanismes à partir de la boîte du personnage et de son intention.
Definition GameSession.cpp:696
std::optional< core::Level > _level
Definition GameSession.h:267
void updateCurrentRoom()
Definition GameSession.cpp:488
std::set< std::string > _warnedExcludedAnimations
Assets pour lesquels la combinaison (bitmask16 ou silhouette) + animation a deja ete signalee : evite...
Definition GameSession.h:319
void loadLevel(core::Level level)
Definition GameSession.cpp:120
std::unordered_map< std::string, core::Animation > _tileAnimations
Horloge d'animation partagee, une entree par asset de tuile anime (nom de fichier -> etat).
Definition GameSession.h:315
std::vector< GameEvent > _lastStepEvents
Definition GameSession.h:343
void renderHud(int viewportWidth, int viewportHeight)
Compose et soumet l'affichage tête haute (budgets, nom du tableau), en espace écran,...
Definition GameSession.cpp:782
SpriteRenderer _renderer
Definition GameSession.h:262
std::vector< MechanismVisualState > _dangerSwitchedVisuals
Definition GameSession.h:326
bool _gameEventsInitialized
Definition GameSession.h:342
core::LevelOutcome update(const InputState &input, float fixedDelta)
Simule le niveau d'un pas fixe (mécanismes, blocs, physique, animation, dangers).
Definition GameSession.cpp:633
core::LevelOutcome evaluateOutcome() override
Definition GameSession.cpp:731
std::vector< MechanismVisualState > _dangerMoverVisuals
Definition GameSession.h:328
void render(int viewportWidth, int viewportHeight, RenderMode mode, float interpolationAlpha)
Dessine la scène du niveau (rien si le chargement a échoué).
Definition GameSession.cpp:752
void advanceAnimations(float fixedDelta) override
Avance les animations d'entités et l'horloge des tuiles animées (EX-REN-012).
Definition GameSession.cpp:666
void refreshPlayerSprite()
Definition GameSession.cpp:401
GameSession(SpriteBatch &batch, const TextureAtlas &atlas, TextureCache &cache, int viewportWidth, int viewportHeight, core::Level level, const GameKeyBindings &gameBindings, const GamepadBindings &gamepadBindings, const BitmapFont &font, const Localization *localization=nullptr)
Construit la session et charge la scène du niveau donné.
Definition GameSession.cpp:94
void updateTileAnimations(float fixedDelta)
Avance l'horloge d'animation partagée des tuiles animées (LOT-46 TACHE-05), au pas fixe : une entrée ...
Definition GameSession.cpp:465
void snapshotPreviousPositions() override
Fige la position courante de chaque entité mobile comme sa position « précédente »,...
Definition GameSession.cpp:470
core::TopDownConfig _movementConfig
Réglages du déplacement en vue de dessus (LOT-06) : valeurs par défaut, une par session.
Definition GameSession.h:277
std::vector< MechanismVisualState > _switchVisuals
Definition GameSession.h:325
std::vector< core::Aabb > collectActiveDangerBoxes()
Definition GameSession.cpp:385
void setGameMode(std::unique_ptr< IGameMode > mode)
Remplace le mode de jeu courant (EX-ARCH-002).
Definition GameSession.cpp:247
Camera2D _camera
Definition GameSession.h:261
FollowCameraState _followCameraState
État de la caméra de suivi (mode Follow), avancé au pas fixe par updateFollowCamera.
Definition GameSession.h:300
const std::string & loadError() const
Definition GameSession.h:139
const std::vector< GameEvent > & lastStepEvents() const noexcept
Événements de jeu détectés lors du dernier appel à update() (LOT-60 TACHE-03).
Definition GameSession.h:152
bool loaded() const
Definition GameSession.h:134
std::optional< std::size_t > _currentZoneIndex
Zone de caméra active courante (mode PerRoom avec zones dessinées à la main, EX-LVL-007) ; std::nullo...
Definition GameSession.h:294
const Localization * _localization
Definition GameSession.h:259
const BitmapFont & _font
Definition GameSession.h:258
void reload()
Recharge le niveau courant (personnage à l'entrée, mécanismes et budgets remis).
Definition GameSession.cpp:260
std::vector< core::Entity > _switchEntities
Entité-tuile du déclencheur (interrupteur/plaque de pression) de chaque mécanisme,...
Definition GameSession.h:273
core::Vector2 _previousFollowCenter
Centre de la caméra de suivi au pas fixe PRÉCÉDENT, capturé par snapshotPreviousPositions – même patr...
Definition GameSession.h:305
int _levelHeight
Definition GameSession.h:286
std::string _loadError
Definition GameSession.h:306
void updateCamera(float fixedDelta) override
Recadre la caméra selon le mode de cadrage résolu du niveau (EX-LVL-006).
Definition GameSession.cpp:673
std::optional< core::MechanismController > _mechanisms
Definition GameSession.h:268
MechanismEventState _previousMechanismEventState
Definition GameSession.h:341
std::optional< RoomGrid > _roomGrid
Definition GameSession.h:287
void advanceParticles(float fixedDelta) override
Avance les particules déjà émises (LOT-53), avant que ce pas n'en émette de nouvelles.
Definition GameSession.cpp:651
std::vector< core::Entity > _doorEntities
Definition GameSession.h:269
void detectEvents() override
Relève les transitions du pas (personnage, mécanismes) en événements de jeu (LOT-60).
Definition GameSession.cpp:704
core::ParticleSystem _particles
Particules du personnage (dash, atterrissage, mort ; LOT-53 TACHE-02) : simulées au pas fixe,...
Definition GameSession.h:280
ScreenShakeState _screenShake
Secousse d'écran courante (LOT-53 TACHE-03) : déclenchée à un atterrissage lourd et à la mort,...
Definition GameSession.h:283
std::vector< MechanismVisualState > _dangerBlinkVisuals
Definition GameSession.h:327
const IGameMode & gameMode() const noexcept
Definition GameSession.h:175
SpriteBatch & _batch
Definition GameSession.h:257
void setSkins(const SkinCatalog *skins, std::string skinSet={})
Désigne le catalogue de skins et le jeu à utiliser en mode Texture (LOT-42).
Definition GameSession.h:127
void centerCameraOnRoom(core::GridPosition roomIndex)
Definition GameSession.cpp:481
Association action de jeu (GameAction, partagée avec GameKeyBindings) -> bouton manette,...
Definition GamepadBindings.h:31
IGameModePasses()=default
Un mode de jeu : l'ordre dans lequel les passes d'un pas fixe s'enchaînent.
Definition IGameMode.h:78
État des entrées d'une frame, avec détection des fronts (pressée / relâchée).
Definition InputState.h:97
Catalogue de traduction (i18n) : associe des clés stables à des chaînes selon la langue active,...
Definition Localization.h:29
Catalogue des jeux de skins : (jeu, type de tuile) → { asset, mode }.
Definition SkinCatalog.h:100
Dessine des quads texturés au travers de QRhi, avec transparence et échantillonnage nearest (pixel ar...
Definition SpriteBatch.h:59
Pont ECS → écran : dessine chaque entité affichable, triée par calque puis par texture.
Definition SpriteRenderer.h:144
void setSkins(const SkinCatalog *skins, std::string skinSet={})
Désigne le catalogue de skins et le jeu à utiliser en mode Texture (LOT-42).
Definition SpriteRenderer.h:225
Texture d'atlas et table de régions, chargée depuis un fichier image avec repli procédural (EX-REN-04...
Definition TextureAtlas.h:40
Charge, valide et met en cache des textures GPU désignées par leur nom de fichier logique.
Definition TextureCache.h:60
LevelOutcome
Issue courante d'un niveau, déduite de la position du personnage.
Definition LevelOutcome.h:20
Definition AudioEngine.cpp:15
RenderMode
Mode de rendu de la scène : lecture directe des collisions, ou habillage.
Definition RenderMode.h:23
Rectangle aligné aux axes, décrit par ses coins min (haut-gauche) et max (bas-droite),...
Definition Aabb.h:23
Cadrage de caméra résolu d'un niveau : le mode retenu et ses paramètres.
Definition CameraFraming.h:71
Rectangle de caméra dessiné à la main par le level designer (mode par salle), en cases.
Definition CameraFraming.h:53
Handle générationnel identifiant une entité de l'ECS.
Definition Entity.h:24
Position d'une case dans la grille d'un niveau, en coordonnées entières.
Definition GridPosition.h:20
Intention de déplacement transmise à la physique, dissociée de toute touche.
Definition PlayerInput.h:21
Paramètres réglables du déplacement top-down, regroupés pour faciliter le tuning.
Definition TopDownConfig.h:24
Vecteur bidimensionnel en coordonnées monde (composantes float).
Definition Vector2.h:21
État déterministe de la caméra de suivi, avancé une fois par pas fixe.
Definition FollowCamera.h:44
État « porte ouverte » de chaque mécanisme, même index que core::MechanismController::mechanisms().
Definition GameEvents.h:64
État de présentation d'un mécanisme animé, par instance (LOT-47 TACHE-02).
Definition MechanismVisuals.h:100
Compteurs d'une image composée, pour l'observabilité du volume soumis (EX-NFR-005).
Definition ComposedScene.h:92
Textures liables par la composition d'une scène, et de quoi choisir laquelle lier.
Definition TileAppearance.h:85
État déterministe d'une secousse d'écran en cours de décroissance vers zéro.
Definition Camera2D.h:33