JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
SkinCatalog.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 <filesystem>
7#include <map>
8#include <optional>
9#include <string>
10#include <string_view>
11#include <vector>
12
14
20
22
23namespace hmi {
24
32enum class SkinMode {
39};
40
46[[nodiscard]] const char* skinModeName(SkinMode mode) noexcept;
47
54[[nodiscard]] std::optional<SkinMode> skinModeFromName(std::string_view name) noexcept;
55
57struct SkinEntry {
60 std::string asset;
62
63 [[nodiscard]] friend bool operator==(const SkinEntry& lhs, const SkinEntry& rhs) {
64 return lhs.asset == rhs.asset && lhs.mode == rhs.mode;
65 }
66};
67
83
84// Le resultat contient un SkinCatalog par valeur : il ne peut etre defini qu'apres la classe. Une
85// declaration de fonction, elle, peut renvoyer un type incomplet — d'ou cette annonce.
86struct SkinCatalogResult;
87
101public:
109 static constexpr int FORMAT_VERSION = 1;
110
116 [[nodiscard]] static SkinCatalogResult loadFromString(std::string_view json);
117
127 [[nodiscard]] static SkinCatalogResult loadFromFile(const std::filesystem::path& path);
128
129private:
137 [[nodiscard]] static SkinCatalogResult fromDocument(const core::JsonDocument& document);
138
139public:
141 [[nodiscard]] std::string toJsonString() const;
142
148 [[nodiscard]] bool saveToFile(const std::filesystem::path& path) const;
149
160 [[nodiscard]] std::optional<SkinEntry> resolve(std::string_view setName,
161 core::TileType type) const;
162
164 [[nodiscard]] const std::string& defaultSetName() const noexcept {
165 return _defaultSet;
166 }
167
173 [[nodiscard]] bool setDefaultSetName(const std::string& setName);
174
176 [[nodiscard]] std::vector<std::string> setNames() const;
177
179 void addSet(const std::string& setName);
180
187 void assign(const std::string& setName, core::TileType type, SkinEntry entry);
188
194 void clearAssignment(const std::string& setName, core::TileType type);
195
201 [[nodiscard]] std::map<core::TileType, SkinEntry> assignments(std::string_view setName) const;
202
203private:
204 // std::map (et non unordered_map) : l'ordre de parcours est deterministe, ce qui rend
205 // l'ecriture du fichier stable d'une execution a l'autre — un diff de skins.json ne doit
206 // montrer que ce que l'utilisateur a change.
207 std::map<std::string, std::map<core::TileType, SkinEntry>, std::less<>> _sets;
208 std::string _defaultSet;
209};
210
219 std::optional<SkinCatalog> catalog;
220 std::string error;
222
224 [[nodiscard]] bool ok() const noexcept {
225 return catalog.has_value();
226 }
227};
228
229} // namespace hmi
Brique de lecture JSON partagée par tous les catalogues (EX-CNT-012).
Types de tuiles d'une carte et utilitaires associés.
Catalogue des jeux de skins : (jeu, type de tuile) → { asset, mode }.
Definition SkinCatalog.h:100
static SkinCatalogResult fromDocument(const core::JsonDocument &document)
Construit le résultat depuis l'enveloppe déjà lue par core::readJsonObject.
Definition SkinCatalog.cpp:83
std::string toJsonString() const
Definition SkinCatalog.cpp:160
std::optional< SkinEntry > resolve(std::string_view setName, core::TileType type) const
Résout l'apparence d'un type de tuile dans un jeu donné.
Definition SkinCatalog.cpp:199
void addSet(const std::string &setName)
Crée un jeu vide s'il n'existe pas.
Definition SkinCatalog.cpp:234
std::map< std::string, std::map< core::TileType, SkinEntry >, std::less<> > _sets
Definition SkinCatalog.h:207
void assign(const std::string &setName, core::TileType type, SkinEntry entry)
Assigne une apparence à un type de tuile dans un jeu, en créant le jeu au besoin.
Definition SkinCatalog.cpp:243
std::map< core::TileType, SkinEntry > assignments(std::string_view setName) const
Assignations d'un jeu, sans repli sur le jeu par défaut.
Definition SkinCatalog.cpp:255
std::vector< std::string > setNames() const
Definition SkinCatalog.cpp:224
bool setDefaultSetName(const std::string &setName)
Désigne le jeu par défaut.
Definition SkinCatalog.cpp:216
bool saveToFile(const std::filesystem::path &path) const
Écrit le catalogue dans un fichier, en créant les dossiers parents au besoin.
Definition SkinCatalog.cpp:183
static SkinCatalogResult loadFromFile(const std::filesystem::path &path)
Lit un catalogue depuis un fichier.
Definition SkinCatalog.cpp:156
static SkinCatalogResult loadFromString(std::string_view json)
Lit un catalogue depuis une chaîne JSON.
Definition SkinCatalog.cpp:79
std::string _defaultSet
Definition SkinCatalog.h:208
static constexpr int FORMAT_VERSION
Version du format écrite dans le fichier, et plus élevée qui soit lue.
Definition SkinCatalog.h:109
void clearAssignment(const std::string &setName, core::TileType type)
Retire l'assignation d'un type de tuile dans un jeu (le type redevient non skinné).
Definition SkinCatalog.cpp:248
const std::string & defaultSetName() const noexcept
Definition SkinCatalog.h:164
TileType
Type d'une tuile de la grille d'une carte (EX-GP-001).
Definition TileType.h:32
Definition AudioEngine.cpp:15
@ UnsupportedVersion
Numéro de version supérieur à SoundCatalog::FORMAT_VERSION.
Definition SoundCatalog.h:30
@ FileNotFound
Fichier absent. Cas légitime (catalogue vide), pas une anomalie.
Definition SoundCatalog.h:28
@ None
Pas d'erreur.
Definition SoundCatalog.h:27
@ MalformedStructure
Structure inattendue (« sons » absent, entrée invalide…).
Definition SoundCatalog.h:31
@ ParseError
JSON malformé, ou racine qui n'est pas un objet.
Definition SoundCatalog.h:29
const char * skinModeName(SkinMode mode) noexcept
Nom persisté d'un mode de skin (valeur écrite dans skins.json).
Definition SkinCatalog.cpp:58
std::optional< SkinMode > skinModeFromName(std::string_view name) noexcept
Mode de skin correspondant à un nom lu dans un fichier.
Definition SkinCatalog.cpp:69
SkinMode
Manière dont l'asset d'un type de tuile est découpé à l'affichage (EX-EDIT-025).
Definition SkinCatalog.h:32
@ Bitmask16
Planche de 4×4 cases, dont celle affichée est choisie selon les quatre voisins solides (hmi::autotile...
Definition SkinCatalog.h:38
@ Single
Image unique, utilisée telle quelle.
Definition SkinCatalog.h:35
SkinCatalogError
Catégorie d'échec de lecture d'un skins.json (même esprit que core::LevelValidationError).
Definition SkinCatalog.h:76
@ None
Pas d'erreur.
Definition SkinCatalog.h:77
Résultat de la lecture de l'enveloppe commune d'un document JSON.
Definition JsonDocument.h:53
Résultat d'une lecture de catalogue : soit un SkinCatalog, soit une erreur décrite.
Definition SkinCatalog.h:218
std::string error
Definition SkinCatalog.h:220
bool ok() const noexcept
Definition SkinCatalog.h:224
SkinCatalogError errorCode
Definition SkinCatalog.h:221
std::optional< SkinCatalog > catalog
Definition SkinCatalog.h:219
Apparence assignée à un type de tuile : le fichier à utiliser et son découpage.
Definition SkinCatalog.h:57
SkinMode mode
Definition SkinCatalog.h:61
friend bool operator==(const SkinEntry &lhs, const SkinEntry &rhs)
Definition SkinCatalog.h:63
std::string asset
Nom de fichier, relatif au dossier Assets/Skins/.
Definition SkinCatalog.h:60