61 for (
const auto &porymap_anim :
tileset.porymap_component().anims() | std::views::values) {
62 for (
const auto &frame : porymap_anim.frames_values()) {
67 "Tileset save failed.");
70 !result.has_value()) {
79 generated_anim_code_key,
82 "Tileset save failed.");
134 for (
const auto &porytiles_anim :
tileset.porytiles_component().anims() | std::views::values) {
136 if (porytiles_anim.has_key_frame()) {
140 tileset.name(), porytiles_anim.name(), porytiles_anim.key_frame().frame_name()),
142 "Tileset save failed.");
144 key_frame_key,
tileset, porytiles_anim.name(), porytiles_anim.key_frame().frame_name());
145 !result.has_value()) {
153 for (
const auto &frame : porytiles_anim.frames_values()) {
158 "Tileset save failed.");
161 !result.has_value()) {
178 if (
auto result = writer_->
commit(); !result.has_value()) {
189 "Failed to get artifact keys for tileset save.");
192 if (!cache_result.has_value()) {
200 constexpr auto missing_required_artifact_tag =
"missing-required-artifact";
201 constexpr auto missing_required_artifact_msg =
"Missing required artifact: '{}'.";
202 constexpr auto missing_optional_artifact_tag =
"missing-optional-artifact";
203 constexpr auto missing_optional_artifact_msg =
"Missing optional artifact: '{}'.";
206 bool fail_at_exit =
false;
213 auto porytiles_component = std::make_unique<PorytilesTilesetComponent>();
214 auto porymap_component = std::make_unique<PorymapTilesetComponent>();
215 auto tileset = std::make_unique<Tileset>(name, std::move(porytiles_component), std::move(porymap_component));
223 std::unique_ptr<Tileset>,
230 std::unique_ptr<Tileset>,
231 "Failed to read artifact: '{}'.",
237 std::unique_ptr<Tileset>,
244 std::unique_ptr<Tileset>,
245 "Failed to read artifact: '{}'.",
251 std::unique_ptr<Tileset>,
258 std::unique_ptr<Tileset>,
259 "Failed to read artifact '{}'.",
266 std::unique_ptr<Tileset>,
276 std::unique_ptr<Tileset>,
277 "Failed to read artifact '{}'.",
282 porymap_anim_params_key,
284 std::unique_ptr<Tileset>,
290 std::unique_ptr<Tileset>,
293 for (
const auto &porymap_anim_name : porymap_anims) {
297 std::unique_ptr<Tileset>,
300 std::vector<std::pair<std::string, ArtifactKey>> frames_keys{};
301 for (
const auto &frame_name : frames) {
305 std::unique_ptr<Tileset>,
311 frames_keys.emplace_back(frame_name, frame_key);
316 std::unique_ptr<Tileset>,
317 "Failed to read animation '{}'.",
327 std::unique_ptr<Tileset>,
332 std::unique_ptr<Tileset>,
333 "Failed to read artifact '{}'.",
340 std::unique_ptr<Tileset>,
345 std::unique_ptr<Tileset>,
346 "Failed to read artifact '{}'.",
353 std::unique_ptr<Tileset>,
358 std::unique_ptr<Tileset>,
359 "Failed to read artifact '{}'.",
366 std::unique_ptr<Tileset>,
371 std::unique_ptr<Tileset>,
372 "Failed to read artifact '{}'.",
377 missing_optional_artifact_tag, missing_optional_artifact_msg,
FormatParam{attr_csv_key.key(),
Style::bold});
378 diag_->
warning_note(missing_optional_artifact_tag,
"All attributes will receive default or inferred values.");
385 std::unique_ptr<Tileset>,
390 std::unique_ptr<Tileset>,
391 "Failed to read artifact '{}'.",
398 porytiles_params_key,
400 std::unique_ptr<Tileset>,
407 std::unique_ptr<Tileset>,
410 for (
const auto &anim_name : porytiles_anims) {
413 key_frame_key_candidate,
415 std::unique_ptr<Tileset>,
418 std::optional<ArtifactKey> key_frame_key{};
420 key_frame_key = key_frame_key_candidate;
426 std::unique_ptr<Tileset>,
430 std::vector<std::pair<std::string, ArtifactKey>> frame_keys{};
431 bool anim_has_missing_frames =
false;
432 for (
const auto &frame_name : frame_names) {
434 if (frame_name ==
"key") {
441 std::unique_ptr<Tileset>,
443 "Failed to load tileset '{}'.",
FormatParam{tileset->name(), Style::bold}));
447 missing_required_artifact_tag,
448 missing_required_artifact_msg,
451 anim_has_missing_frames =
true;
454 frame_keys.emplace_back(frame_name, frame_key);
457 if (anim_has_missing_frames) {
464 std::unique_ptr<Tileset>,
465 "Failed to load Porytiles animation '{}'.",
472 std::unique_ptr<Tileset>,
473 "Failed to load primary animation references.");
485 return metadata_provider_->
exists(tileset_name);
#define PT_TRY_ASSIGN_CHAIN_ERR(var, expr, return_type,...)
Unwraps a ChainableResult, chaining a new error message on failure.
#define PT_TRY_CALL_CHAIN_ERR(expr, return_type,...)
Unwraps a void ChainableResult, chaining a new error message on failure.
virtual ChainableResult< void > cache_tileset_checksums(const std::string &name, const std::unordered_map< ArtifactKey, std::string > &checksums) const =0
Caches checksums for the given Tileset to persistent storage.
virtual std::unordered_map< ArtifactKey, std::string > compute_tileset_artifact_checksums(const std::vector< ArtifactKey > &keys) const =0
Computes checksums for the given Tileset artifacts.
A result type that maintains a chainable sequence of errors for debugging and error reporting.
static const Style bold
Bold text formatting.
virtual std::string format(const std::string &format_str, const std::vector< FormatParam > ¶ms) const
Formats a string with styled parameters using fmtlib syntax.
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< 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< ArtifactKey > key_for_porymap_anim_frame(const std::string &tileset_name, const std::string &anim_name, const std::string &frame_name) const =0
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.
virtual ChainableResult< void > read_attributes_csv(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > read_porymap_anim(Tileset &dest, const std::string &anim_name, const ArtifactKey ¶ms_key, const std::vector< std::pair< std::string, ArtifactKey > > &frame_keys) const =0
virtual ChainableResult< void > read_tiles_png(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > read_porytiles_pal_n(Tileset &dest, const ArtifactKey &src_key, std::size_t index) const =0
virtual ChainableResult< void > read_porymap_pal_n(Tileset &dest, const ArtifactKey &src_key, std::size_t index) const =0
virtual ChainableResult< void > read_top_png(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > read_metatile_attributes_bin(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > read_porytiles_anim(Tileset &dest, const std::string &anim_name, const ArtifactKey ¶ms_key, const std::optional< ArtifactKey > &key_frame_key, const std::vector< std::pair< std::string, ArtifactKey > > &frame_keys) const =0
virtual ChainableResult< void > read_middle_png(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > read_porytiles_primary_anim_references(Tileset &dest, const ArtifactKey ¶ms_key) const =0
virtual ChainableResult< void > read_metatiles_bin(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > read_bottom_png(Tileset &dest, const ArtifactKey &src_key) const =0
virtual ChainableResult< void > write_porytiles_anim_frame(const ArtifactKey &dest_key, const Tileset &src, const std::string &anim_name, const std::string &frame_name)=0
virtual ChainableResult< void > write_porytiles_pal_n(const ArtifactKey &dest_key, const Tileset &src, std::size_t index)=0
virtual ChainableResult< void > write_porymap_anim_params(const ArtifactKey &dest_key, const Tileset &src)=0
Writes the animation parameters to the Porymap component backing store.
virtual ChainableResult< void > write_metatiles_bin(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > begin_transaction()=0
Begins a new transaction for atomic write operations.
virtual ChainableResult< void > write_porymap_pal_n(const ArtifactKey &dest_key, const Tileset &src, std::size_t index)=0
virtual ChainableResult< void > write_tiles_png(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > rollback()=0
Rolls back all buffered write operations in the current transaction.
virtual ChainableResult< void > write_bottom_png(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > write_top_png(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > write_porytiles_anim_params(const ArtifactKey &dest_key, const Tileset &src)=0
Writes animation parameters to the Porytiles component backing store.
virtual ChainableResult< void > write_metatile_attributes_bin(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > write_attributes_csv(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > write_middle_png(const ArtifactKey &dest_key, const Tileset &src)=0
virtual ChainableResult< void > write_porymap_anim_frame(const ArtifactKey &dest_key, const Tileset &src, const std::string &anim_name, const std::string &frame_name)=0
virtual ChainableResult< void > commit()=0
Commits all buffered write operations in the current transaction.
ChainableResult< void > save(const Tileset &tileset) const
Persists a given Tileset and caches new artifact checksums.
bool exists(const std::string &tileset_name) const
Checks if the given Tileset exists in the backing store.
ChainableResult< std::unique_ptr< Tileset > > load(const std::string &name) const
Loads an existing Tileset from storage.
A complete tileset containing both Porytiles and Porymap components.
virtual void warning_note(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged note message associated with a warning.
const TextFormatter & formatter() const
virtual void warning(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged warning message.
virtual void error(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged error message.
constexpr std::size_t num_pals
@ tileset
Configuration scoped to a specific tileset.