38 LayerModeConverter layer_mode_converter{format_, diag_, tile_printer_, extrinsic_transparency};
39 MetatileDecompiler metatile_decompiler{format_, diag_, tile_printer_, extrinsic_transparency};
44 layer_mode_converter.triple_layerize(
tileset.porymap_component()),
45 std::unique_ptr<Tileset>,
46 std::format(
"Failed to triple-layerize Porymap component for tileset '{}'.",
tileset.name()));
56 auto new_porymap_component = std::make_unique<PorymapTilesetComponent>(
tileset.porymap_component());
58 auto new_porytiles_component = std::make_unique<PorytilesTilesetComponent>();
60 for (
const auto &pal :
tileset.porytiles_component().pals()) {
62 if (pal.has_value()) {
63 new_porytiles_component->set_pal(i, pal.value());
69 const auto &porymap_attributes =
tileset.porymap_component().metatile_attributes_bin();
70 for (std::size_t metatile_id = 0; metatile_id < porymap_attributes.size(); metatile_id++) {
71 new_porytiles_component->insert_attribute(metatile_id, porymap_attributes[metatile_id]);
81 new_porymap_component->metatiles_bin(tilemap_entries);
83 if (
const auto &porymap_animations =
tileset.porymap_component().anims(); !porymap_animations.empty()) {
85 std::set<PixelTile<IndexPixel>> inter_anim_canonical_tiles;
87 AnimDecompiler anim_decompiler{config_, diag_, tile_printer_, pal_printer_};
89 for (
const auto &index_pixel_anim : porymap_animations | std::views::values) {
93 anim_decompiler.decompile_animation(
94 tileset.name(), index_pixel_anim, inter_anim_canonical_tiles, *new_porymap_component),
95 std::unique_ptr<Tileset>,
97 "Failed to decompile animation '{}'.",
FormatParam{index_pixel_anim.name(), Style::bold}));
103 const std::size_t anim_tile_offset = index_pixel_anim.params().tile_offset();
104 if (anim_tile_offset == 0) {
106 panic(
"anim '" + index_pixel_anim.name() +
"' offset is 0");
108 const std::size_t anim_tile_count = index_pixel_anim.params().tile_count();
109 const auto anim_tiles =
111 for (
const auto &t : anim_tiles) {
114 inter_anim_canonical_tiles.insert(base);
117 new_porytiles_component->add_anim(std::move(rgba_anim));
122 for (
const auto &key : per_anim_overrides.value() | std::views::keys) {
123 if (!porymap_animations.contains(key)) {
125 "unused-animation-config",
127 "Animation config for '{}' does not match any animation in tileset '{}'.",
135 new_porymap_component->metatiles_bin(
tileset.porymap_component().metatiles_bin());
140 metatile_decompiler.decompile_metatiles(
141 tilemap_entries, new_porymap_component->tiles_png(),
tileset.porymap_component().pals()),
142 std::unique_ptr<Tileset>,
143 std::format(
"Failed to decompile Porymap component for tileset '{}'.",
tileset.name()));
147 constexpr std::size_t metatiles_per_row = 8;
151 metatileizer.demetatileize(metatiles, metatiles_per_row),
152 std::unique_ptr<Tileset>,
154 "Failed to demetatileize metatiles for tileset '{}'.",
FormatParam{tileset.name(), Style::bold}));
156 auto &[bottom_image, middle_image, top_image] = layer_images;
159 new_porytiles_component->bottom(bottom_image);
160 new_porytiles_component->middle(middle_image);
161 new_porytiles_component->top(top_image);
164 std::make_unique<Tileset>(
tileset.name(), std::move(new_porytiles_component), std::move(new_porymap_component));
#define PT_TRY_ASSIGN_CHAIN_ERR(var, expr, return_type,...)
Unwraps a ChainableResult, chaining a new error message on failure.
Decompiles indexed animation tiles to RGBA format.
A PixelTile representation that stores the canonical (lexicographically minimal) orientation among al...
A result type that maintains a chainable sequence of errors for debugging and error reporting.
An 8x8 tile backed by literal-array-based per-pixel storage of an arbitrary pixel type.
ChainableResult< std::unique_ptr< Tileset > > decompile(const Tileset &tileset) const
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.
A complete tileset containing both Porytiles and Porymap components.
const TextFormatter & formatter() const
virtual void warning(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged warning message.
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
std::vector< PixelTile< PixelType > > extract_tiles_from_image(const Image< PixelType > &img, std::size_t tile_offset, std::size_t tile_count, std::size_t tiles_per_row=16)
Extracts a subset of 8x8 tiles from a tileset image at a specific offset.
@ canonical
Export tiles in canonical form without applying flip transformations.
@ tileset
Configuration scoped to a specific tileset.
#define PT_UNWRAP_TILESET_CONFIG_PTR(ptr, config, tileset_name, return_type)
Unwraps a tileset-scoped config value via pointer access, returning early if the value is not availab...