|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
Niveau mutable en cours d'édition, distinct de Level (immuable, LOT-07). More...
#include <LevelDraft.h>
Classes | |
| struct | State |
Configuration de la plateforme en position, créée aux valeurs par défaut si absente. More... | |
Public Member Functions | |
| void | paintTile (int column, int row, TileType type) |
Peint le type de tuile type en (column, row). | |
| void | paintRegion (int originColumn, int originRow, const std::vector< std::vector< TileType > > &block) |
Applique un bloc rectangulaire de types de tuiles à partir de (originColumn, originRow). | |
| void | setEntry (int column, int row) |
| Place l'entrée en (column, row) ; déplace l'occurrence existante s'il y en avait une (unicité, EX-EDIT-004). | |
| void | setExit (int column, int row) |
| Place la sortie en (column, row) ; déplace l'occurrence existante s'il y en avait une (unicité, EX-EDIT-004). | |
| void | linkMechanism (GridPosition switchPosition, GridPosition targetPosition) |
Lie un interrupteur/plaque de pression à une porte ou à un danger commuté (EX-EDIT-003, EX-GP-052), selon le type de tuile posé en targetPosition. | |
| void | unlinkMechanism (GridPosition targetPosition) |
Retire la liaison de porte à targetPosition, si elle en a une. | |
| void | setTextureOverride (GridPosition position, std::string assetName) |
| Assigne (ou remplace) la texture affichée pour une case précise (EX-EDIT-043), prioritaire sur le skin de son type (LOT-42). | |
| void | removeTextureOverride (GridPosition position) |
Retire l'override de texture de position, s'il y en a un. Sans effet sinon. | |
| void | resize (int width, int height) |
| Redimensionne la grille (EX-EDIT-005). | |
| bool | wouldResizeDropContent (int width, int height) const noexcept |
Indique si redimensionner à (width, height) supprimerait du contenu déjà posé. | |
| bool | undo () |
| Annule la dernière mutation (EX-EDIT-005). | |
| bool | redo () |
| Refait la dernière mutation annulée. | |
| bool | canUndo () const noexcept |
| bool | canRedo () const noexcept |
| void | setName (std::string name) |
| Renomme le niveau. | |
| void | setBackground (std::optional< std::string > background) |
| Assigne l'asset de fond du niveau (EX-REN-044), annulable. | |
| void | setSkinSet (std::optional< std::string > skinSet) |
| Assigne le jeu de skins du niveau (EX-EDIT-024), annulable. | |
| void | setCameraFraming (CameraFramingConfig cameraFraming) |
| Change le cadrage de caméra du niveau (EX-LVL-006, EX-EDIT-028), annulable. | |
| void | addCameraZone (CameraZone zone) |
| Ajoute une zone de caméra dessinée à la main en fin de liste (mode PerRoom, EX-LVL-007, EX-EDIT-029), annulable. | |
| void | removeCameraZone (std::size_t index) |
Retire la zone de caméra au rang index (EX-LVL-007, EX-EDIT-029), annulable. | |
| const std::string & | name () const noexcept |
| const TileMap & | tileMap () const noexcept |
| std::optional< GridPosition > | entry () const noexcept |
| std::optional< GridPosition > | exit () const noexcept |
| const std::vector< Mechanism > & | mechanisms () const noexcept |
| const std::vector< TileTextureOverride > & | textureOverrides () const noexcept |
| const std::vector< Plane > & | planes () const noexcept |
| const std::vector< TileLayer > & | layers () const noexcept |
| const std::vector< MapEntity > & | entities () const noexcept |
| bool | parallaxEnabled () const noexcept |
| const std::optional< std::string > & | background () const noexcept |
| const std::optional< std::string > & | skinSet () const noexcept |
| const CameraFramingConfig & | cameraFraming () const noexcept |
| LevelLoadResult | toLevel () const |
| Convertit le brouillon en Level validé (EX-EDIT-007), en repassant par la même validation que LevelLoader (sérialise puis recharge : aucune règle dupliquée, EX-EDIT-010). | |
Plans picturaux (<tt>EX-DEC-040</tt>, LOT-69) | |
Tous ces mutateurs empilent un pas d'annulation (pushUndo) et sont donc annulables et refaisables. Un rang hors bornes est sans effet et n'empile rien — même convention que les mutateurs de décor et de parcours. Contrairement aux décors, les plans ne sont pas regroupés par couche pour le réordonnancement : leur rang dans la liste est l'ordre de superposition, et la profondeur (core::PlaneDepth) est une propriété indépendante. Monter un plan le rapproche donc du premier plan de la liste, quelle que soit sa profondeur. | |
| void | addPlane (Plane plane) |
Ajoute plane en fin de liste (le plus en avant). | |
| void | removePlane (std::size_t index) |
Retire le plan au rang index. | |
| bool | setPlaneDensity (std::size_t index, int pixelsPerUnit) |
Change la densité du plan au rang index (EX-DEC-041). | |
| bool | setPlaneParallax (std::size_t index, float parallaxX, float parallaxY) |
Change les facteurs de parallaxe du plan au rang index (EX-DEC-043). | |
| bool | setPlaneOpacity (std::size_t index, float opacity) |
Change l'opacité du plan au rang index. | |
| bool | setPlaneDepth (std::size_t index, PlaneDepth depth) |
Change la profondeur du plan au rang index (EX-DEC-042). | |
| std::optional< std::size_t > | movePlaneForward (std::size_t index) |
Avance le plan au rang index d'un cran ; sans effet s'il est déjà le dernier. | |
| std::optional< std::size_t > | movePlaneBackward (std::size_t index) |
Recule le plan au rang index d'un cran ; sans effet s'il est déjà le premier. | |
| std::optional< std::size_t > | movePlaneToFront (std::size_t index) |
Amène le plan au rang index au dernier rang (le plus en avant). | |
| std::optional< std::size_t > | movePlaneToBack (std::size_t index) |
Envoie le plan au rang index au premier rang (le plus en arrière). | |
| void | setParallaxEnabled (bool enabled) |
| Active ou désactive la parallaxe des plans pour ce niveau (EX-DEC-043). | |
Static Public Member Functions | |
| static LevelDraft | empty (std::string name, int width, int height) |
| Crée un brouillon vierge (grille entièrement Empty), sans entrée ni sortie. | |
| static LevelDraft | fromLevel (const Level &level) |
| Crée un brouillon à partir d'un niveau déjà chargé (édition d'un fichier existant). | |
Private Member Functions | |
| LevelDraft (std::string name, TileMap tileMap) | |
| void | paintTileInternal (int column, int row, TileType type) |
| Logique de paintTile, sans pushUndo() : réutilisée cellule par cellule par paintRegion pour n'empiler qu'un seul snapshot par opération de bloc. | |
| void | setEntryInternal (int column, int row) |
| Logique de setEntry, sans pushUndo(). | |
| void | setExitInternal (int column, int row) |
| Logique de setExit, sans pushUndo(). | |
| void | removeLinkedDataAt (GridPosition position, bool keepTextureOverride=false) |
Retire toute liaison/configuration référençant position (déclencheur, porte, danger commuté, configuration de danger mobile/temporisé, ou override de texture) — appelé avant de reposer un autre type sur une case qui en portait une, pour ne jamais laisser d'entrée orpheline. | |
| State | snapshot () const |
| Capture l'état courant (pour empiler dans l'historique undo/redo). | |
| void | restore (State state) |
| Restitue un état capturé précédemment. | |
| void | pushUndo () |
| Empile l'état courant sur la pile d'annulation ; à appeler avant toute mutation undoable. | |
Private Attributes | |
| std::string | _name |
| TileMap | _tileMap |
| std::optional< GridPosition > | _entry |
| std::optional< GridPosition > | _exit |
| std::vector< Mechanism > | _mechanisms |
| std::vector< TileLayer > | _layers |
| std::vector< MapEntity > | _entities |
| std::optional< std::string > | _background |
| std::optional< std::string > | _skinSet |
| std::vector< TileTextureOverride > | _textureOverrides |
| CameraFramingConfig | _cameraFraming |
| std::vector< Plane > | _planes |
| bool | _parallaxEnabled = true |
| std::vector< State > | _undoHistory |
| std::vector< State > | _redoHistory |
Niveau mutable en cours d'édition, distinct de Level (immuable, LOT-07).
LevelDraft porte toute la mutabilité nécessaire à l'éditeur (EX-EDIT-002 à EX-EDIT-005) : peindre une tuile, déplacer l'entrée/la sortie, lier/délier un mécanisme, redimensionner la grille. Il ne duplique aucune règle de validation : toLevel() reconstruit le niveau en repassant par LevelLoader::loadFromString (même chemin que le chargement d'un fichier), garantissant que le niveau produit satisfait exactement les mêmes règles (EX-LVL-004, EX-EDIT-010).
Invariant maintenu par tous les mutateurs : la grille de tuiles reste la source de vérité des positions d'entrée/sortie/interrupteurs/portes (comme pour Level) ; entry()/exit() ne sont que des accès en cache, toujours synchronisés avec le contenu de tileMap().
Logique pure, sans dépendance rendu ni fenêtre — testable sans GPU (EX-NFR-010).
|
private |
| void core::LevelDraft::addCameraZone | ( | CameraZone | zone | ) |
Ajoute une zone de caméra dessinée à la main en fin de liste (mode PerRoom, EX-LVL-007, EX-EDIT-029), annulable.
L'ordre d'ajout fixe la priorité en cas de chevauchement (core::activeCameraZoneIndex côté HMI, même convention que addDecor) : une zone ajoutée après une autre ne prend le dessus que là où l'autre ne la couvre pas.
| zone | Zone à ajouter, en cases. |
| void core::LevelDraft::addPlane | ( | Plane | plane | ) |
Ajoute plane en fin de liste (le plus en avant).
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
staticnodiscard |
Crée un brouillon vierge (grille entièrement Empty), sans entrée ni sortie.
| name | Nom du niveau. |
| width | Largeur de la grille, en cases (> 0). |
| height | Hauteur de la grille, en cases (> 0). |
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
staticnodiscard |
Crée un brouillon à partir d'un niveau déjà chargé (édition d'un fichier existant).
| level | Niveau source. |
|
inlinenodiscardnoexcept |
Portees telles quelles, pas encore editables. Le brouillon les recoit du fichier et les rend a l'enregistrement ; c'est le LOT-11 qui donnera a l'editeur de quoi les creer et les peindre. Sans ce transport, ouvrir puis enregistrer une carte multi-couches les effacerait en silence – exactement le genre de perte qu'un editeur ne doit jamais infliger.
| void core::LevelDraft::linkMechanism | ( | GridPosition | switchPosition, |
| GridPosition | targetPosition ) |
Lie un interrupteur/plaque de pression à une porte ou à un danger commuté (EX-EDIT-003, EX-GP-052), selon le type de tuile posé en targetPosition.
Remplace toute liaison existante pour targetPosition (une cible n'a qu'un seul déclencheur associé) ; plusieurs cibles peuvent en revanche partager le même déclencheur. La liaison résultante est rangée dans mechanisms().
switchPosition porte un Switch/PressurePlate/Key, la case targetPosition porte une Door/LockedDoor.
|
inlinenodiscardnoexcept |
| std::optional< std::size_t > core::LevelDraft::movePlaneBackward | ( | std::size_t | index | ) |
Recule le plan au rang index d'un cran ; sans effet s'il est déjà le premier.
| std::optional< std::size_t > core::LevelDraft::movePlaneForward | ( | std::size_t | index | ) |
Avance le plan au rang index d'un cran ; sans effet s'il est déjà le dernier.
index est hors bornes. | std::optional< std::size_t > core::LevelDraft::movePlaneToBack | ( | std::size_t | index | ) |
Envoie le plan au rang index au premier rang (le plus en arrière).
| std::optional< std::size_t > core::LevelDraft::movePlaneToFront | ( | std::size_t | index | ) |
Amène le plan au rang index au dernier rang (le plus en avant).
|
inlinenodiscardnoexcept |
| void core::LevelDraft::paintRegion | ( | int | originColumn, |
| int | originRow, | ||
| const std::vector< std::vector< TileType > > & | block ) |
Applique un bloc rectangulaire de types de tuiles à partir de (originColumn, originRow).
Repasse par la même sémantique cellule-par-cellule que paintTile (déplacement entrée/sortie, nettoyage des liaisons) pour chaque case du bloc, mais ne pousse qu'un seul snapshot undo pour toute l'opération — sert au remplissage rectangulaire et au collage (EX-EDIT-014), sans dupliquer de règle de niveau (EX-EDIT-010). Les cases du bloc hors des bornes de la grille sont silencieusement ignorées (découpe aux bords, même principe que resize).
| originColumn | Colonne de la case (0,0) du bloc. |
| originRow | Ligne de la case (0,0) du bloc. |
| block | Bloc de types, indexé [ligne][colonne] ; sans effet si vide. |
| void core::LevelDraft::paintTile | ( | int | column, |
| int | row, | ||
| TileType | type ) |
Peint le type de tuile type en (column, row).
Cas particuliers : peindre Entry/Exit délègue à setEntry/setExit (unicité). Peindre un autre type sur une case qui portait l'entrée, la sortie, un interrupteur ou une porte efface l'état associé (entrée/sortie invalidée, liaisons de mécanismes retirées) pour ne jamais laisser d'incohérence entre la grille et ces caches.
| column | Colonne visée (doit être dans les bornes). |
| row | Ligne visée (doit être dans les bornes). |
| type | Type de tuile à poser. |
|
private |
Logique de paintTile, sans pushUndo() : réutilisée cellule par cellule par paintRegion pour n'empiler qu'un seul snapshot par opération de bloc.
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
private |
Empile l'état courant sur la pile d'annulation ; à appeler avant toute mutation undoable.
Une nouvelle mutation invalide toujours la branche de refaire.
| bool core::LevelDraft::redo | ( | ) |
| void core::LevelDraft::removeCameraZone | ( | std::size_t | index | ) |
Retire la zone de caméra au rang index (EX-LVL-007, EX-EDIT-029), annulable.
| index | Rang dans cameraFraming().zones ; sans effet si hors bornes. |
|
private |
Retire toute liaison/configuration référençant position (déclencheur, porte, danger commuté, configuration de danger mobile/temporisé, ou override de texture) — appelé avant de reposer un autre type sur une case qui en portait une, pour ne jamais laisser d'entrée orpheline.
keepTextureOverride préserve l'override de texture (repeindre le même type ne doit pas effacer un habillage, EX-EDIT-043) ; les autres données annexes sont toujours retirées, comme avant ce paramètre.
| void core::LevelDraft::removePlane | ( | std::size_t | index | ) |
Retire le plan au rang index.
Ne touche jamais au fichier PNG : le brouillon annule une entrée, il ne restaurerait pas un fichier supprimé (voir LOT-69 TACHE-08).
| void core::LevelDraft::removeTextureOverride | ( | GridPosition | position | ) |
Retire l'override de texture de position, s'il y en a un. Sans effet sinon.
| void core::LevelDraft::resize | ( | int | width, |
| int | height ) |
Redimensionne la grille (EX-EDIT-005).
Agrandir complète les nouvelles cases en Empty ; réduire tronque silencieusement le contenu hors des nouvelles bornes (entrée, sortie ou liaisons de mécanismes perdues sont invalidées en conséquence). L'avertissement de perte revient à l'appelant HMI, avant d'invoquer resize.
| width | Nouvelle largeur, en cases (> 0). |
| height | Nouvelle hauteur, en cases (> 0). |
|
private |
Restitue un état capturé précédemment.
| void core::LevelDraft::setBackground | ( | std::optional< std::string > | background | ) |
Assigne l'asset de fond du niveau (EX-REN-044), annulable.
| background | Nom de l'asset (ex. "forest.png"), ou vide pour retirer le fond posé. Une chaîne, jamais un handle : Core ignore tout du dossier d'assets. |
| void core::LevelDraft::setCameraFraming | ( | CameraFramingConfig | cameraFraming | ) |
Change le cadrage de caméra du niveau (EX-LVL-006, EX-EDIT-028), annulable.
| cameraFraming | Nouveau cadrage résolu (mode et, pour par salle, taille de salle). |
| void core::LevelDraft::setEntry | ( | int | column, |
| int | row ) |
Place l'entrée en (column, row) ; déplace l'occurrence existante s'il y en avait une (unicité, EX-EDIT-004).
|
private |
Logique de setEntry, sans pushUndo().
| void core::LevelDraft::setExit | ( | int | column, |
| int | row ) |
Place la sortie en (column, row) ; déplace l'occurrence existante s'il y en avait une (unicité, EX-EDIT-004).
|
private |
Logique de setExit, sans pushUndo().
|
inline |
Renomme le niveau.
| void core::LevelDraft::setParallaxEnabled | ( | bool | enabled | ) |
Active ou désactive la parallaxe des plans pour ce niveau (EX-DEC-043).
| bool core::LevelDraft::setPlaneDensity | ( | std::size_t | index, |
| int | pixelsPerUnit ) |
Change la densité du plan au rang index (EX-DEC-041).
index est hors bornes ou si pixelsPerUnit n'est pas une densité valide (core::isValidPlaneDensity) — auquel cas rien n'est empilé. | bool core::LevelDraft::setPlaneDepth | ( | std::size_t | index, |
| PlaneDepth | depth ) |
Change la profondeur du plan au rang index (EX-DEC-042).
index est hors bornes. | bool core::LevelDraft::setPlaneOpacity | ( | std::size_t | index, |
| float | opacity ) |
Change l'opacité du plan au rang index.
index est hors bornes ou si opacity sort de [0, 1]. | bool core::LevelDraft::setPlaneParallax | ( | std::size_t | index, |
| float | parallaxX, | ||
| float | parallaxY ) |
Change les facteurs de parallaxe du plan au rang index (EX-DEC-043).
index est hors bornes ou si un facteur n'est pas fini. | void core::LevelDraft::setSkinSet | ( | std::optional< std::string > | skinSet | ) |
Assigne le jeu de skins du niveau (EX-EDIT-024), annulable.
| skinSet | Nom du jeu (skins.json), ou vide pour le jeu par défaut. |
| void core::LevelDraft::setTextureOverride | ( | GridPosition | position, |
| std::string | assetName ) |
Assigne (ou remplace) la texture affichée pour une case précise (EX-EDIT-043), prioritaire sur le skin de son type (LOT-42).
Repeindre un autre type de tuile sur position retire l'override (funnel removeLinkedDataAt) ; repeindre le même type le conserve. Ne voyage pas avec paintRegion (collage) : un override reste attaché à sa case d'origine.
position porte un type de tuile non Empty.
|
inlinenodiscardnoexcept |
|
nodiscardprivate |
Capture l'état courant (pour empiler dans l'historique undo/redo).
|
inlinenodiscardnoexcept |
|
inlinenodiscardnoexcept |
|
nodiscard |
Convertit le brouillon en Level validé (EX-EDIT-007), en repassant par la même validation que LevelLoader (sérialise puis recharge : aucune règle dupliquée, EX-EDIT-010).
| bool core::LevelDraft::undo | ( | ) |
Annule la dernière mutation (EX-EDIT-005).
| void core::LevelDraft::unlinkMechanism | ( | GridPosition | targetPosition | ) |
Retire la liaison de porte à targetPosition, si elle en a une.
Sans effet sinon.
|
nodiscardnoexcept |
Indique si redimensionner à (width, height) supprimerait du contenu déjà posé.
Requête pure (n'altère rien) : vraie si les nouvelles bornes excluraient l'entrée, la sortie, ou une des deux extrémités d'une liaison de mécanisme actuellement posées. Permet à HMI d'avertir avant d'appeler resize (EX-EDIT-012), sans dupliquer la logique de troncature déjà portée par resize.
| width | Largeur envisagée, en cases (> 0). |
| height | Hauteur envisagée, en cases (> 0). |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |