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
31 public:
32 virtual ~TilesetArtifactKeyProvider() = default;
33
34 /*
35 * Porymap artifacts
36 */
37 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_metatiles_bin(const std::string &tileset_name) const = 0;
38
39 [[nodiscard]] virtual ChainableResult<ArtifactKey>
40 key_for_metatile_attributes_bin(const std::string &tileset_name) const = 0;
41
42 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_tiles_png(const std::string &tileset_name) const = 0;
43
44 [[nodiscard]] virtual ChainableResult<ArtifactKey>
45 key_for_porymap_pal_n(const std::string &tileset_name, std::size_t index) const = 0;
46
48 const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const = 0;
49
50 [[nodiscard]] virtual ChainableResult<ArtifactKey>
51 key_for_porymap_anim_params(const std::string &tileset_name) const = 0;
52
53 /*
54 * Porytiles artifacts
55 */
56 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_bottom_png(const std::string &tileset_name) const = 0;
57
58 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_middle_png(const std::string &tileset_name) const = 0;
59
60 [[nodiscard]] virtual ChainableResult<ArtifactKey> key_for_top_png(const std::string &tileset_name) const = 0;
61
62 [[nodiscard]] virtual ChainableResult<ArtifactKey>
63 key_for_attributes_csv(const std::string &tileset_name) const = 0;
64
65 [[nodiscard]] virtual ChainableResult<ArtifactKey>
66 key_for_porytiles_pal_n(const std::string &tileset_name, std::size_t index) const = 0;
67
69 const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const = 0;
70
81 [[nodiscard]] virtual ChainableResult<ArtifactKey>
82 key_for_porytiles_anim_params(const std::string &tileset_name) const = 0;
83
84 /*
85 * Utilities
86 */
87
98 [[nodiscard]] virtual bool artifact_exists(const ArtifactKey &key) const = 0;
99
110 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
111 discover_porymap_anims(const std::string &tileset_name) const = 0;
112
125 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
126 discover_porymap_anim_frames(const std::string &tileset_name, const std::string &anim_name) const = 0;
127
138 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
139 discover_porytiles_anims(const std::string &tileset_name) const = 0;
140
153 [[nodiscard]] virtual ChainableResult<std::set<std::string>>
154 discover_porytiles_anim_frames(const std::string &tileset_name, const std::string &anim_name) const = 0;
155
166 [[nodiscard]] virtual ChainableResult<std::vector<ArtifactKey>>
167 get_porymap_artifact_keys(const std::string &tileset_name) const
168 {
169 std::vector<ArtifactKey> result;
170
172 metatiles_key,
173 key_for_metatiles_bin(tileset_name),
174 std::vector<ArtifactKey>,
175 "Failed to get Porymap artifact keys.");
176 if (artifact_exists(metatiles_key)) {
177 result.push_back(metatiles_key);
178 }
179
181 attr_key,
183 std::vector<ArtifactKey>,
184 "Failed to get Porymap artifact keys.");
185 if (artifact_exists(attr_key)) {
186 result.push_back(attr_key);
187 }
188
190 tiles_png_key,
191 key_for_tiles_png(tileset_name),
192 std::vector<ArtifactKey>,
193 "Failed to get Porymap artifact keys.");
194 if (artifact_exists(tiles_png_key)) {
195 result.push_back(tiles_png_key);
196 }
197
198 for (std::size_t i = 0; i < pal::num_pals; i++) {
200 pal_key,
201 key_for_porymap_pal_n(tileset_name, i),
202 std::vector<ArtifactKey>,
203 "Failed to get Porymap artifact keys.");
204 if (artifact_exists(pal_key)) {
205 result.push_back(pal_key);
206 }
207 }
208
210 porymap_anims,
211 discover_porymap_anims(tileset_name),
212 std::vector<ArtifactKey>,
213 "Failed to get Porymap artifact keys.");
214 for (const auto &anim : porymap_anims) {
216 frames,
217 discover_porymap_anim_frames(tileset_name, anim),
218 std::vector<ArtifactKey>,
219 "Failed to get Porymap artifact keys.");
220 for (const auto &frame : frames) {
222 frame_n_key,
223 key_for_porymap_anim_frame(tileset_name, anim, frame),
224 std::vector<ArtifactKey>,
225 "Failed to get Porymap artifact keys.");
226 if (artifact_exists(frame_n_key)) {
227 result.push_back(frame_n_key);
228 }
229 }
230 }
231
233 generated_anim_code_key,
234 key_for_porymap_anim_params(tileset_name),
235 std::vector<ArtifactKey>,
236 "Failed to get Porymap artifact keys.");
237 if (artifact_exists(generated_anim_code_key)) {
238 result.push_back(generated_anim_code_key);
239 }
240
241 return result;
242 }
243
254 [[nodiscard]] virtual ChainableResult<std::vector<ArtifactKey>>
255 get_porytiles_artifact_keys(const std::string &tileset_name) const
256 {
257 std::vector<ArtifactKey> result;
258
260 bottom_png_key,
261 key_for_bottom_png(tileset_name),
262 std::vector<ArtifactKey>,
263 "Failed to get Porytiles artifact keys.");
264 if (artifact_exists(bottom_png_key)) {
265 result.push_back(bottom_png_key);
266 }
267
269 middle_png_key,
270 key_for_middle_png(tileset_name),
271 std::vector<ArtifactKey>,
272 "Failed to get Porytiles artifact keys.");
273 if (artifact_exists(middle_png_key)) {
274 result.push_back(middle_png_key);
275 }
276
278 top_png_key,
279 key_for_top_png(tileset_name),
280 std::vector<ArtifactKey>,
281 "Failed to get Porytiles artifact keys.");
282 if (artifact_exists(top_png_key)) {
283 result.push_back(top_png_key);
284 }
285
287 attr_csv_key,
288 key_for_attributes_csv(tileset_name),
289 std::vector<ArtifactKey>,
290 "Failed to get Porytiles artifact keys.");
291 if (artifact_exists(attr_csv_key)) {
292 result.push_back(attr_csv_key);
293 }
294
295 for (std::size_t i = 0; i < pal::num_pals; i++) {
297 override_key,
298 key_for_porytiles_pal_n(tileset_name, i),
299 std::vector<ArtifactKey>,
300 "Failed to get Porytiles artifact keys.");
301 if (artifact_exists(override_key)) {
302 result.push_back(override_key);
303 }
304 }
305
307 porytiles_anims,
308 discover_porytiles_anims(tileset_name),
309 std::vector<ArtifactKey>,
310 "Failed to get Porytiles artifact keys.");
311 for (const auto &anim : porytiles_anims) {
313 key_frame_key,
314 key_for_porytiles_anim_frame(tileset_name, anim, "key"),
315 std::vector<ArtifactKey>,
316 "Tileset load failed.");
317
319 frames,
320 discover_porytiles_anim_frames(tileset_name, anim),
321 std::vector<ArtifactKey>,
322 "Failed to get Porytiles artifact keys.");
323 for (const auto &frame : frames) {
325 frame_n_key,
326 key_for_porytiles_anim_frame(tileset_name, anim, frame),
327 std::vector<ArtifactKey>,
328 "Failed to get Porytiles artifact keys.");
329 if (artifact_exists(frame_n_key)) {
330 result.push_back(frame_n_key);
331 }
332 }
333 }
334
336 anim_json_key,
337 key_for_porytiles_anim_params(tileset_name),
338 std::vector<ArtifactKey>,
339 "Failed to get Porytiles artifact keys.");
340 if (artifact_exists(anim_json_key)) {
341 result.push_back(anim_json_key);
342 }
343
344 return result;
345 }
346
358 [[nodiscard]] virtual ChainableResult<std::vector<ArtifactKey>>
359 get_all_artifact_keys(const std::string &tileset_name) const
360 {
362 porytiles_keys,
363 get_porytiles_artifact_keys(tileset_name),
364 std::vector<ArtifactKey>,
365 "Failed to get Porytiles artifact keys.");
367 porymap_keys,
368 get_porymap_artifact_keys(tileset_name),
369 std::vector<ArtifactKey>,
370 "Failed to get Porymap artifact keys.");
371
372 std::vector<ArtifactKey> result;
373 result.reserve(porytiles_keys.size() + porymap_keys.size());
374 result.insert(result.end(), porytiles_keys.begin(), porytiles_keys.end());
375 result.insert(result.end(), porymap_keys.begin(), porymap_keys.end());
376
377 return result;
378 }
379};
380
381} // 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< 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< ArtifactKey > key_for_porytiles_pal_n(const std::string &tileset_name, std::size_t index) 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_porymap_pal_n(const std::string &tileset_name, std::size_t index) const =0
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_pals
Definition palette.hpp:21