Porytiles
Loading...
Searching...
No Matches
tileset_artifact_key_provider.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <optional>
4#include <set>
5#include <string>
6
10
11namespace porytiles {
12
29 public:
30 virtual ~TilesetArtifactKeyProvider() = default;
31
32 // Porymap artifacts
33 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_metatiles_bin(const std::string &tileset_name) const = 0;
34
35 [[nodiscard]] virtual ChainableResult<ArtifactKey>
36 key_for_metatile_attributes_bin(const std::string &tileset_name) const = 0;
37
38 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_tiles_png(const std::string &tileset_name) const = 0;
39
40 [[nodiscard]] virtual ChainableResult<ArtifactKey>
41 key_for_porymap_palette_n(const std::string &tileset_name, std::size_t index) const = 0;
42
44 const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const = 0;
45
46 [[nodiscard]] virtual ChainableResult<ArtifactKey>
47 key_for_porymap_anim_params(const std::string &tileset_name) const = 0;
48
49 // Porytiles artifacts
50 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_bottom_png(const std::string &tileset_name) const = 0;
51
52 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_middle_png(const std::string &tileset_name) const = 0;
53
54 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_top_png(const std::string &tileset_name) const = 0;
55
56 [[nodiscard]] virtual ChainableResult<ArtifactKey>
57 key_for_attributes_csv(const std::string &tileset_name) const = 0;
58
59 [[nodiscard]] virtual ChainableResult<ArtifactKey>
60 key_for_porytiles_palette_n(const std::string &tileset_name, std::size_t index) const = 0;
61
63 const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const = 0;
64
73 [[nodiscard]] virtual ChainableResult<ArtifactKey>
74 key_for_porytiles_anim_params(const std::string &tileset_name) const = 0;
75
76 // Utilities
77
86 [[nodiscard]] virtual bool artifact_exists(const ArtifactKey &key) const = 0;
87
96 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
97 discover_porymap_anims(const std::string &tileset_name) const = 0;
98
109 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
110 discover_porymap_anim_frames(const std::string &tileset_name, const std::string &anim_name) const = 0;
111
120 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
121 discover_porytiles_anims(const std::string &tileset_name) const = 0;
122
133 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
134 discover_porytiles_anim_frames(const std::string &tileset_name, const std::string &anim_name) const = 0;
135
144 [[nodiscard]] virtual ChainableResult<std::vector<ArtifactKey>>
145 get_porymap_artifact_keys(const std::string &tileset_name) const
146 {
147 std::vector<ArtifactKey> result;
148
150 metatiles_key,
151 key_for_metatiles_bin(tileset_name),
152 std::vector<ArtifactKey>,
153 "Failed to get Porymap artifact keys.");
154 if (artifact_exists(metatiles_key)) {
155 result.push_back(metatiles_key);
156 }
157
159 attribute_key,
161 std::vector<ArtifactKey>,
162 "Failed to get Porymap artifact keys.");
163 if (artifact_exists(attribute_key)) {
164 result.push_back(attribute_key);
165 }
166
168 tiles_png_key,
169 key_for_tiles_png(tileset_name),
170 std::vector<ArtifactKey>,
171 "Failed to get Porymap artifact keys.");
172 if (artifact_exists(tiles_png_key)) {
173 result.push_back(tiles_png_key);
174 }
175
176 for (std::size_t i = 0; i < palette::num_palettes; i++) {
178 palette_key,
179 key_for_porymap_palette_n(tileset_name, i),
180 std::vector<ArtifactKey>,
181 "Failed to get Porymap artifact keys.");
182 if (artifact_exists(palette_key)) {
183 result.push_back(palette_key);
184 }
185 }
186
188 porymap_anims,
189 discover_porymap_anims(tileset_name),
190 std::vector<ArtifactKey>,
191 "Failed to get Porymap artifact keys.");
192 for (const auto &anim : porymap_anims) {
194 frames,
195 discover_porymap_anim_frames(tileset_name, anim),
196 std::vector<ArtifactKey>,
197 "Failed to get Porymap artifact keys.");
198 for (const auto &frame : frames) {
200 frame_n_key,
201 key_for_porymap_anim_frame(tileset_name, anim, frame),
202 std::vector<ArtifactKey>,
203 "Failed to get Porymap artifact keys.");
204 if (artifact_exists(frame_n_key)) {
205 result.push_back(frame_n_key);
206 }
207 }
208 }
209
211 generated_anim_code_key,
212 key_for_porymap_anim_params(tileset_name),
213 std::vector<ArtifactKey>,
214 "Failed to get Porymap artifact keys.");
215 if (artifact_exists(generated_anim_code_key)) {
216 result.push_back(generated_anim_code_key);
217 }
218
219 return result;
220 }
221
230 [[nodiscard]] virtual ChainableResult<std::vector<ArtifactKey>>
231 get_porytiles_artifact_keys(const std::string &tileset_name) const
232 {
233 std::vector<ArtifactKey> result;
234
236 bottom_png_key,
237 key_for_bottom_png(tileset_name),
238 std::vector<ArtifactKey>,
239 "Failed to get Porytiles artifact keys.");
240 if (artifact_exists(bottom_png_key)) {
241 result.push_back(bottom_png_key);
242 }
243
245 middle_png_key,
246 key_for_middle_png(tileset_name),
247 std::vector<ArtifactKey>,
248 "Failed to get Porytiles artifact keys.");
249 if (artifact_exists(middle_png_key)) {
250 result.push_back(middle_png_key);
251 }
252
254 top_png_key,
255 key_for_top_png(tileset_name),
256 std::vector<ArtifactKey>,
257 "Failed to get Porytiles artifact keys.");
258 if (artifact_exists(top_png_key)) {
259 result.push_back(top_png_key);
260 }
261
263 attribute_csv_key,
264 key_for_attributes_csv(tileset_name),
265 std::vector<ArtifactKey>,
266 "Failed to get Porytiles artifact keys.");
267 if (artifact_exists(attribute_csv_key)) {
268 result.push_back(attribute_csv_key);
269 }
270
271 for (std::size_t i = 0; i < palette::num_palettes; i++) {
273 override_key,
274 key_for_porytiles_palette_n(tileset_name, i),
275 std::vector<ArtifactKey>,
276 "Failed to get Porytiles artifact keys.");
277 if (artifact_exists(override_key)) {
278 result.push_back(override_key);
279 }
280 }
281
283 porytiles_anims,
284 discover_porytiles_anims(tileset_name),
285 std::vector<ArtifactKey>,
286 "Failed to get Porytiles artifact keys.");
287 for (const auto &anim : porytiles_anims) {
289 key_frame_key,
290 key_for_porytiles_anim_frame(tileset_name, anim, "key"),
291 std::vector<ArtifactKey>,
292 "Tileset load failed.");
293
295 frames,
296 discover_porytiles_anim_frames(tileset_name, anim),
297 std::vector<ArtifactKey>,
298 "Failed to get Porytiles artifact keys.");
299 for (const auto &frame : frames) {
301 frame_n_key,
302 key_for_porytiles_anim_frame(tileset_name, anim, frame),
303 std::vector<ArtifactKey>,
304 "Failed to get Porytiles artifact keys.");
305 if (artifact_exists(frame_n_key)) {
306 result.push_back(frame_n_key);
307 }
308 }
309 }
310
312 anim_json_key,
313 key_for_porytiles_anim_params(tileset_name),
314 std::vector<ArtifactKey>,
315 "Failed to get Porytiles artifact keys.");
316 if (artifact_exists(anim_json_key)) {
317 result.push_back(anim_json_key);
318 }
319
320 return result;
321 }
322
332 [[nodiscard]] virtual ChainableResult<std::vector<ArtifactKey>>
333 get_all_artifact_keys(const std::string &tileset_name) const
334 {
336 porytiles_keys,
337 get_porytiles_artifact_keys(tileset_name),
338 std::vector<ArtifactKey>,
339 "Failed to get Porytiles artifact keys.");
341 porymap_keys,
342 get_porymap_artifact_keys(tileset_name),
343 std::vector<ArtifactKey>,
344 "Failed to get Porymap artifact keys.");
345
346 std::vector<ArtifactKey> result;
347 result.reserve(porytiles_keys.size() + porymap_keys.size());
348 result.insert(result.end(), porytiles_keys.begin(), porytiles_keys.end());
349 result.insert(result.end(), porymap_keys.begin(), porymap_keys.end());
350
351 return result;
352 }
353};
354
355} // namespace porytiles
#define PT_TRY_ASSIGN_CHAIN_ERR(var, expr, return_type,...)
Unwraps a ChainableResult, chaining a new error message on failure.
A type-safe wrapper for artifact keys.
A result type that maintains a chainable sequence of errors for debugging and error reporting.
Abstract interface for generating keys and discovering tileset artifacts in a backing store.
virtual ChainableResult< ArtifactKey > key_for_porytiles_palette_n(const std::string &tileset_name, std::size_t index) const =0
virtual ChainableResult< ArtifactKey > key_for_porymap_palette_n(const std::string &tileset_name, std::size_t index) const =0
virtual ChainableResult< std::set< std::string > > discover_porytiles_anims(const std::string &tileset_name) const =0
Discovers the names of all Porytiles animations available for a tileset.
virtual ChainableResult< std::vector< ArtifactKey > > get_all_artifact_keys(const std::string &tileset_name) const
Gets the keys for all tileset artifacts (both Porytiles and Porymap) present in the given Tileset.
virtual ChainableResult< std::set< std::string > > discover_porymap_anims(const std::string &tileset_name) const =0
Discovers the names of all Porymap animations available for a tileset.
virtual ChainableResult< ArtifactKey > key_for_attributes_csv(const std::string &tileset_name) const =0
virtual ChainableResult< ArtifactKey > key_for_metatiles_bin(const std::string &tileset_name) const =0
virtual ChainableResult< std::vector< ArtifactKey > > get_porytiles_artifact_keys(const std::string &tileset_name) const
Gets the keys for all Porytiles artifacts present in the given Tileset.
virtual ChainableResult< ArtifactKey > key_for_porytiles_anim_frame(const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const =0
virtual ChainableResult< ArtifactKey > key_for_metatile_attributes_bin(const std::string &tileset_name) const =0
virtual ChainableResult< std::set< std::string > > discover_porymap_anim_frames(const std::string &tileset_name, const std::string &anim_name) const =0
Discovers the frame indices for a specific Porymap animation.
virtual ChainableResult< ArtifactKey > key_for_porytiles_anim_params(const std::string &tileset_name) const =0
Returns the key for Porytiles animation parameters.
virtual ChainableResult< ArtifactKey > key_for_porymap_anim_params(const std::string &tileset_name) const =0
virtual ChainableResult< std::set< std::string > > discover_porytiles_anim_frames(const std::string &tileset_name, const std::string &anim_name) const =0
Discovers the frame indices for a specific Porytiles animation.
virtual ChainableResult< ArtifactKey > key_for_middle_png(const std::string &tileset_name) const =0
virtual ChainableResult< std::vector< ArtifactKey > > get_porymap_artifact_keys(const std::string &tileset_name) const
Gets the keys for all Porymap artifacts present in the given Tileset.
virtual ChainableResult< ArtifactKey > key_for_porymap_anim_frame(const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const =0
virtual ~TilesetArtifactKeyProvider()=default
virtual ChainableResult< ArtifactKey > key_for_tiles_png(const std::string &tileset_name) const =0
virtual ChainableResult< ArtifactKey > key_for_top_png(const std::string &tileset_name) const =0
virtual ChainableResult< ArtifactKey > key_for_bottom_png(const std::string &tileset_name) const =0
virtual bool artifact_exists(const ArtifactKey &key) const =0
Checks whether an artifact exists in the backing store for the given key.
constexpr std::size_t num_palettes
Definition palette.hpp:21