|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
Simule et rend un seul niveau (déjà validé, en mémoire), indépendamment de toute infrastructure d'écran. More...
#include <GameSession.h>
Public Member Functions | |
| 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é. | |
| core::LevelOutcome | update (const InputState &input, float fixedDelta) |
| Simule le niveau d'un pas fixe (mécanismes, blocs, physique, animation, dangers). | |
| core::LevelOutcome | update (const core::PlayerInput &input, float fixedDelta) |
| Simule le niveau d'un pas fixe à partir d'une intention déjà résolue, sans passer par hmi::InputState/toPlayerInput (LOT-ANNEXE-18, TACHE-01) : cœur de simulation partagé, utilisé aussi bien par le jeu réel (via update(const InputState&, float), qui ne fait plus que traduire puis déléguer ici) que par la lecture d'un rejeu (hmi::ReplayPlayback), sans aucune divergence possible entre les deux chemins. | |
| void | reload () |
| Recharge le niveau courant (personnage à l'entrée, mécanismes et budgets remis). | |
| void | render (int viewportWidth, int viewportHeight, RenderMode mode, float interpolationAlpha) |
| Dessine la scène du niveau (rien si le chargement a échoué). | |
| void | setSkins (const SkinCatalog *skins, std::string skinSet={}) |
| Désigne le catalogue de skins et le jeu à utiliser en mode Texture (LOT-42). | |
| bool | loaded () const |
| const std::string & | loadError () const |
| const std::vector< GameEvent > & | lastStepEvents () const noexcept |
| Événements de jeu détectés lors du dernier appel à update() (LOT-60 TACHE-03). | |
| SceneStatistics | renderStatistics () const noexcept |
| void | setGameMode (std::unique_ptr< IGameMode > mode) |
| Remplace le mode de jeu courant (EX-ARCH-002). | |
| const IGameMode & | gameMode () const noexcept |
Private Member Functions | |
| void | snapshotPreviousPositions () override |
| Fige la position courante de chaque entité mobile comme sa position « précédente », avant que le pas ne la modifie (interpolation de rendu, EX-ARCH-031). | |
| void | advanceParticles (float fixedDelta) override |
| Avance les particules déjà émises (LOT-53), avant que ce pas n'en émette de nouvelles. | |
| void | advanceScreenShake (float fixedDelta) override |
| Fait décroître la secousse d'écran courante (LOT-53). | |
| void | moveCharacter (const core::PlayerInput &input, float fixedDelta) override |
| Déplace le personnage selon l'intention de ce pas. | |
| void | advanceAnimations (float fixedDelta) override |
| Avance les animations d'entités et l'horloge des tuiles animées (EX-REN-012). | |
| void | updateCamera (float fixedDelta) override |
| Recadre la caméra selon le mode de cadrage résolu du niveau (EX-LVL-006). | |
| void | updateMechanisms (const core::PlayerInput &input) override |
| Résout les mécanismes à partir de la boîte du personnage et de son intention. | |
| void | detectEvents () override |
| Relève les transitions du pas (personnage, mécanismes) en événements de jeu (LOT-60). | |
| void | updateMechanismVisuals (float fixedDelta) override |
| Projette l'état logique des mécanismes sur leur apparence (LOT-47, EX-REN-006). | |
| core::LevelOutcome | evaluateOutcome () override |
| void | onLevelLost () override |
| Conséquences d'un échec : éclatement, secousse, puis rechargement du niveau. | |
| core::Aabb | playerBox () |
| void | loadLevel (core::Level level) |
| void | spawnPlayer (core::GridPosition entry) |
| 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 lié (via le point de résolution unique hmi::resolveTileAppearance, jamais dupliqué ici), avance son horloge propre et écrit l'image courante sur son TileSkinTag (LOT-47 TACHE-02). | |
| 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'assets animés et doit conserver un moyen de distinguer un mécanisme actif d'un mécanisme inactif. | |
| std::vector< core::Aabb > | collectActiveDangerBoxes () |
| void | refreshPlayerSprite () |
| void | centerCameraOnRoom (core::GridPosition roomIndex) |
| void | updateCurrentRoom () |
| void | centerCameraOnZone (const core::CameraZone &zone) |
| Centre la caméra sur une zone dessinée à la main (mode PerRoom, _cameraFraming.zones non vide, EX-LVL-007) : symétrique à centerCameraOnRoom, pour le découpage manuel plutôt qu'automatique. | |
| void | updateCurrentCameraZone () |
| Équivalent de updateCurrentRoom quand _cameraFraming.zones est non vide : résout la zone active (hmi::activeCameraZoneIndex) plutôt que l'indice de grille de _roomGrid. | |
| void | centerCameraOnWholeLevel () |
| Centre la caméra sur le niveau entier (mode WholeLevel, LOT-64) : centre fixe, posé une fois au chargement – symétrique à centerCameraOnRoom, jamais recalculé au pas fixe. | |
| 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 personnage, sans jamais l'écrire (EX-ARCH-012). | |
| 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::CameraFramingMode, LOT-64) : seul point d'application du cadrage, appelé une fois par image depuis render(). | |
| 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 de _tileAnimations par asset animé du jeu de skins courant, en mode SkinMode::Single sans silhouette (bitmask16 et silhouette détourée excluent l'animation, signalé une fois par asset via _warnedExcludedAnimations). | |
| void | renderHud (int viewportWidth, int viewportHeight) |
| Compose et soumet l'affichage tête haute (budgets, nom du tableau), en espace écran, sur sa propre projection (hmi::screenProjectionMatrix) — jamais affecté par le zoom de la caméra ni par son culling (LOT-52 TACHE-02/03). | |
| Private Member Functions inherited from hmi::IGameModePasses | |
| IGameModePasses ()=default | |
| virtual | ~IGameModePasses ()=default |
| IGameModePasses (const IGameModePasses &)=delete | |
| IGameModePasses & | operator= (const IGameModePasses &)=delete |
| IGameModePasses (IGameModePasses &&)=delete | |
| IGameModePasses & | operator= (IGameModePasses &&)=delete |
Private Attributes | |
| const TextureAtlas & | _atlas |
| TextureCache & | _cache |
| const GameKeyBindings & | _gameBindings |
| const GamepadBindings & | _gamepadBindings |
| SpriteBatch & | _batch |
| const BitmapFont & | _font |
| const Localization * | _localization |
| core::World | _world |
| Camera2D | _camera |
| SpriteRenderer | _renderer |
| ComposedScene | _hudScene |
| Scène composée du HUD, distincte de celle de _renderer (LOT-52 TACHE-02) : jamais de cadrage de culling actif dessus (ComposedScene::setVisibleBounds), le texte est en espace écran et n'a pas de position monde. | |
| std::optional< core::Level > | _level |
| std::optional< core::MechanismController > | _mechanisms |
| std::vector< core::Entity > | _doorEntities |
| std::vector< core::Entity > | _switchEntities |
| Entité-tuile du déclencheur (interrupteur/plaque de pression) de chaque mécanisme, même ordre que _doorEntities (LOT-47 : le déclencheur change aussi d'apparence, plus seulement la porte qu'il actionne). | |
| core::AnimationSystem | _animation |
| core::TopDownConfig | _movementConfig |
| Réglages du déplacement en vue de dessus (LOT-06) : valeurs par défaut, une par session. | |
| core::ParticleSystem | _particles |
| Particules du personnage (dash, atterrissage, mort ; LOT-53 TACHE-02) : simulées au pas fixe, vidées à chaque (re)chargement (loadLevel) comme le reste de l'état de session. | |
| ScreenShakeState | _screenShake |
| Secousse d'écran courante (LOT-53 TACHE-03) : déclenchée à un atterrissage lourd et à la mort, avancée au pas fixe, appliquée à la caméra de rendu uniquement (render()). | |
| core::Entity | _player {} |
| int | _levelWidth = 0 |
| int | _levelHeight = 0 |
| std::optional< RoomGrid > | _roomGrid |
| core::GridPosition | _currentRoomIndex {} |
| std::optional< std::size_t > | _currentZoneIndex |
| Zone de caméra active courante (mode PerRoom avec zones dessinées à la main, EX-LVL-007) ; std::nullopt = aucune zone ne contient le personnage (repli niveau entier). | |
| core::CameraFramingConfig | _cameraFraming |
| Cadrage de caméra résolu du niveau courant (LOT-64), copié une fois au chargement – n'affecte jamais la simulation (EX-ARCH-012), seulement applyCameraFraming/ updateFollowCamera. | |
| FollowCameraState | _followCameraState |
| État de la caméra de suivi (mode Follow), avancé au pas fixe par updateFollowCamera. | |
| core::Vector2 | _previousFollowCenter {} |
| Centre de la caméra de suivi au pas fixe PRÉCÉDENT, capturé par snapshotPreviousPositions – même patron que PreviousPosition pour les entités : render() interpole entre les deux pour rester synchrone avec le personnage (lui-même interpolé), sinon il tremblerait par rapport au décor (tache-02). | |
| std::string | _loadError |
| const SkinCatalog * | _tileSkins = nullptr |
| std::string | _tileSkinSet |
| std::unordered_map< std::string, core::Animation > | _tileAnimations |
| Horloge d'animation partagee, une entree par asset de tuile anime (nom de fichier -> etat). | |
| std::set< std::string > | _warnedExcludedAnimations |
| Assets pour lesquels la combinaison (bitmask16 ou silhouette) + animation a deja ete signalee : evite de journaliser a chaque pas fixe (GraphicsLog proscrit un message par image/pas). | |
| std::vector< MechanismVisualState > | _doorVisuals |
| std::vector< MechanismVisualState > | _switchVisuals |
| std::vector< MechanismVisualState > | _dangerSwitchedVisuals |
| std::vector< MechanismVisualState > | _dangerBlinkVisuals |
| std::vector< MechanismVisualState > | _dangerMoverVisuals |
| std::set< std::string > | _warnedMissingMechanismClips |
| Couples (asset, clip attendu) deja signales comme manquants : un seul message par combinaison pour toute la session, meme principe que _warnedExcludedAnimations (LOT-47 TACHE-02). | |
| std::unique_ptr< IGameMode > | _mode |
| Mode de jeu courant (LOT-05) : l'ordre des passes du pas fixe. | |
| MechanismEventState | _previousMechanismEventState |
| bool | _gameEventsInitialized = false |
| std::vector< GameEvent > | _lastStepEvents |
Simule et rend un seul niveau (déjà validé, en mémoire), indépendamment de toute infrastructure d'écran.
Extraite de l'écran de jeu historique (LOT-34) pour être utilisée par l'éditeur Qt (viewport) : toute la logique de jeu (chargement de la scène ECS, apparition du personnage, physique, mécanismes, blocs, dangers, caméra par salle, animation, interpolation) vit ici, une seule fois.
update() avance d'un pas fixe et renvoie l'issue (core::LevelOutcome) ; sur un échec (danger/chute), le niveau est rechargé en interne (personnage à l'entrée, mécanismes/budgets remis) — l'appelant décide quoi faire d'une réussite (enchaîner, revenir au menu, etc.). render() dessine la scène via le SpriteRenderer (lecture seule de l'ECS, EX-ARCH-012), avec interpolation (EX-ARCH-031). Un échec de chargement est récupérable (EX-NFR-040) : la session reste dans un état neutre, loaded() est faux et loadError() renseigné.
| hmi::GameSession::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é.
| batch | Lot de sprites partagé (rendu). |
| atlas | Atlas de tuiles fournissant les régions de sprites. |
| viewportWidth | Largeur initiale de la surface de rendu, en pixels. |
| viewportHeight | Hauteur initiale de la surface de rendu, en pixels. |
| cache | Cache de textures, propriétaire du damier de repli du mode Texture (référence conservée, doit survivre à la session, LOT-41). |
| level | Niveau déjà validé à jouer. |
| gameBindings | Touches clavier de jeu (référence conservée, doit survivre à la session). |
| gamepadBindings | Boutons manette de jeu (référence conservée, doit survivre à la session). |
| font | Police bitmap de l'affichage tête haute (référence conservée, doit survivre à la session, LOT-52). |
| localization | Catalogue de traduction des libellés du HUD (EX-REN-033) ; nullptr désactive le HUD sans plantage (EX-NFR-040), état de démarrage légitime avant que le catalogue ne soit chargé. |
|
overrideprivatevirtual |
Avance les animations d'entités et l'horloge des tuiles animées (EX-REN-012).
Implements hmi::IGameModePasses.
|
overrideprivatevirtual |
Avance les particules déjà émises (LOT-53), avant que ce pas n'en émette de nouvelles.
Implements hmi::IGameModePasses.
|
overrideprivatevirtual |
Fait décroître la secousse d'écran courante (LOT-53).
Implements hmi::IGameModePasses.
|
private |
Sélectionne le zoom et le centre effectifs de _camera selon le mode de cadrage résolu du niveau (core::CameraFramingMode, LOT-64) : seul point d'application du cadrage, appelé une fois par image depuis render().
|
private |
Applique la correspondance état → clip à une entité-tuile de mécanisme : résout l'asset effectivement lié (via le point de résolution unique hmi::resolveTileAppearance, jamais dupliqué ici), avance son horloge propre et écrit l'image courante sur son TileSkinTag (LOT-47 TACHE-02).
Sans effet (répli sur l'image statique existante) si l'entité n'est pas repérée, si son type n'est pas un mécanisme à état, ou si l'asset résolu n'est pas animé.
|
private |
|
private |
Centre la caméra sur le niveau entier (mode WholeLevel, LOT-64) : centre fixe, posé une fois au chargement – symétrique à centerCameraOnRoom, jamais recalculé au pas fixe.
|
private |
Centre la caméra sur une zone dessinée à la main (mode PerRoom, _cameraFraming.zones non vide, EX-LVL-007) : symétrique à centerCameraOnRoom, pour le découpage manuel plutôt qu'automatique.
|
nodiscardprivate |
|
overrideprivatevirtual |
Relève les transitions du pas (personnage, mécanismes) en événements de jeu (LOT-60).
Implements hmi::IGameModePasses.
|
nodiscardoverrideprivatevirtual |
Implements hmi::IGameModePasses.
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
Événements de jeu détectés lors du dernier appel à update() (LOT-60 TACHE-03).
Transitions du personnage et des mécanismes, plus l'issue du pas (Died/ExitReached). Vide si aucune transition, ou lors du tout premier pas après un chargement (état initial, rien à signaler — même principe que MechanismVisualState::initialized). Présentation pure : ne modifie jamais la simulation (EX-ARCH-012), à consommer par l'appelant pour déclencher des sons (hmi::SoundTriggers) ou, plus tard, des particules (LOT-53).
|
inlinenodiscard |
|
inlinenodiscard |
|
private |
|
overrideprivatevirtual |
Déplace le personnage selon l'intention de ce pas.
Implements hmi::IGameModePasses.
|
overrideprivatevirtual |
Conséquences d'un échec : éclatement, secousse, puis rechargement du niveau.
Implements hmi::IGameModePasses.
|
nodiscardprivate |
|
private |
Modulation d'opacité de diagnostic, réservée au mode Physique (LOT-47 TACHE-03) : ce mode n'a pas d'assets animés et doit conserver un moyen de distinguer un mécanisme actif d'un mécanisme inactif.
Appelée à chaque render() (décision purement visuelle, dépendante du mode courant) ; force l'alpha à 1 en mode Texture, où l'état se voit désormais au clip.
|
private |
| void hmi::GameSession::reload | ( | ) |
Recharge le niveau courant (personnage à l'entrée, mécanismes et budgets remis).
| void hmi::GameSession::render | ( | int | viewportWidth, |
| int | viewportHeight, | ||
| RenderMode | mode, | ||
| float | interpolationAlpha ) |
Dessine la scène du niveau (rien si le chargement a échoué).
mode choisit le rendu Physique ou Texture (EX-REN-046, LOT-41) : bascule purement visuelle, sans effet sur la simulation ni sur la scène ECS.
|
private |
Compose et soumet l'affichage tête haute (budgets, nom du tableau), en espace écran, sur sa propre projection (hmi::screenProjectionMatrix) — jamais affecté par le zoom de la caméra ni par son culling (LOT-52 TACHE-02/03).
Sans effet si _localization est nul.
|
inlinenodiscardnoexcept |
| void hmi::GameSession::setGameMode | ( | std::unique_ptr< IGameMode > | mode | ) |
Remplace le mode de jeu courant (EX-ARCH-002).
Le mode sortant reçoit onUnload, l'entrant onLoad — dans cet ordre, pour qu'un mode puisse défaire ce qu'il avait posé avant que le suivant ne pose le sien. Un pointeur nul est refusé sans rien changer : une session sans mode n'aurait plus d'ordre de passes du tout (EX-NFR-040).
| mode | Nouveau mode (la session en prend possession). |
|
inline |
Désigne le catalogue de skins et le jeu à utiliser en mode Texture (LOT-42).
Le catalogue n'est pas copié : l'appelant en reste propriétaire et doit le maintenir en vie au moins aussi longtemps que la session.
| skins | Catalogue, ou nullptr pour retomber entièrement sur le damier. |
| skinSet | Nom du jeu courant ; vide pour le jeu par défaut du catalogue. |
|
overrideprivatevirtual |
Fige la position courante de chaque entité mobile comme sa position « précédente », avant que le pas ne la modifie (interpolation de rendu, EX-ARCH-031).
Implements hmi::IGameModePasses.
|
private |
| core::LevelOutcome hmi::GameSession::update | ( | const core::PlayerInput & | input, |
| float | fixedDelta ) |
Simule le niveau d'un pas fixe à partir d'une intention déjà résolue, sans passer par hmi::InputState/toPlayerInput (LOT-ANNEXE-18, TACHE-01) : cœur de simulation partagé, utilisé aussi bien par le jeu réel (via update(const InputState&, float), qui ne fait plus que traduire puis déléguer ici) que par la lecture d'un rejeu (hmi::ReplayPlayback), sans aucune divergence possible entre les deux chemins.
| input | Intention de jeu déjà résolue (entrée réelle traduite, ou rejeu enregistré). |
| fixedDelta | Durée du pas fixe, en secondes. |
| core::LevelOutcome hmi::GameSession::update | ( | const InputState & | input, |
| float | fixedDelta ) |
Simule le niveau d'un pas fixe (mécanismes, blocs, physique, animation, dangers).
| input | État des entrées de ce pas. |
| fixedDelta | Durée du pas fixe, en secondes. |
|
overrideprivatevirtual |
Recadre la caméra selon le mode de cadrage résolu du niveau (EX-LVL-006).
Implements hmi::IGameModePasses.
|
private |
Équivalent de updateCurrentRoom quand _cameraFraming.zones est non vide : résout la zone active (hmi::activeCameraZoneIndex) plutôt que l'indice de grille de _roomGrid.
Repli sur centerCameraOnWholeLevel si aucune zone ne contient le personnage (jamais un état indéfini).
|
private |
|
private |
Avance la caméra de suivi d'un pas fixe (mode Follow, LOT-64 TACHE-02) : lit la position simulée du personnage, sans jamais l'écrire (EX-ARCH-012).
|
overrideprivatevirtual |
Résout les mécanismes à partir de la boîte du personnage et de son intention.
Implements hmi::IGameModePasses.
|
overrideprivatevirtual |
Projette l'état logique des mécanismes sur leur apparence (LOT-47, EX-REN-006).
Implements hmi::IGameModePasses.
|
private |
Avance l'horloge d'animation partagée des tuiles animées (LOT-46 TACHE-05), au pas fixe : une entrée de _tileAnimations par asset animé du jeu de skins courant, en mode SkinMode::Single sans silhouette (bitmask16 et silhouette détourée excluent l'animation, signalé une fois par asset via _warnedExcludedAnimations).
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
Cadrage de caméra résolu du niveau courant (LOT-64), copié une fois au chargement – n'affecte jamais la simulation (EX-ARCH-012), seulement applyCameraFraming/ updateFollowCamera.
|
private |
|
private |
Zone de caméra active courante (mode PerRoom avec zones dessinées à la main, EX-LVL-007) ; std::nullopt = aucune zone ne contient le personnage (repli niveau entier).
Seulement significatif quand _cameraFraming.zones est non vide – sinon _roomGrid/ _currentRoomIndex font foi (découpage automatique en grille, inchangé).
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
État de la caméra de suivi (mode Follow), avancé au pas fixe par updateFollowCamera.
|
private |
|
private |
|
private |
|
private |
|
private |
Scène composée du HUD, distincte de celle de _renderer (LOT-52 TACHE-02) : jamais de cadrage de culling actif dessus (ComposedScene::setVisibleBounds), le texte est en espace écran et n'a pas de position monde.
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
Mode de jeu courant (LOT-05) : l'ordre des passes du pas fixe.
Jamais nul — la session démarre en exploration, et setGameMode refuse un pointeur nul.
|
private |
Réglages du déplacement en vue de dessus (LOT-06) : valeurs par défaut, une par session.
Un jour réglables par tableau, comme le cadrage de caméra l'est depuis le LOT-64.
|
private |
Particules du personnage (dash, atterrissage, mort ; LOT-53 TACHE-02) : simulées au pas fixe, vidées à chaque (re)chargement (loadLevel) comme le reste de l'état de session.
|
private |
|
private |
Centre de la caméra de suivi au pas fixe PRÉCÉDENT, capturé par snapshotPreviousPositions – même patron que PreviousPosition pour les entités : render() interpole entre les deux pour rester synchrone avec le personnage (lui-même interpolé), sinon il tremblerait par rapport au décor (tache-02).
|
private |
|
private |
|
private |
|
private |
Secousse d'écran courante (LOT-53 TACHE-03) : déclenchée à un atterrissage lourd et à la mort, avancée au pas fixe, appliquée à la caméra de rendu uniquement (render()).
|
private |
Entité-tuile du déclencheur (interrupteur/plaque de pression) de chaque mécanisme, même ordre que _doorEntities (LOT-47 : le déclencheur change aussi d'apparence, plus seulement la porte qu'il actionne).
|
private |
|
private |
Horloge d'animation partagee, une entree par asset de tuile anime (nom de fichier -> etat).
Avancee une fois par asset et par pas fixe, jamais une fois par case (LOT-46 TACHE-05).
|
private |
|
private |
|
private |
Assets pour lesquels la combinaison (bitmask16 ou silhouette) + animation a deja ete signalee : evite de journaliser a chaque pas fixe (GraphicsLog proscrit un message par image/pas).
|
private |
Couples (asset, clip attendu) deja signales comme manquants : un seul message par combinaison pour toute la session, meme principe que _warnedExcludedAnimations (LOT-47 TACHE-02).
|
private |