7#include "absl/flags/declare.h"
8#include "absl/flags/flag.h"
9#include "absl/strings/str_format.h"
34 const std::array<gfx::SnesColor, 32>& colors) {
35 std::vector<std::array<uint8_t, 4>> out(32);
36 for (
int i = 0; i < 32; ++i) {
37 auto rgb = colors[i].rgb();
38 uint8_t alpha = (i % 4 == 0) ? 0 : 255;
39 out[i] = {
static_cast<uint8_t
>(rgb.x),
static_cast<uint8_t
>(rgb.y),
40 static_cast<uint8_t
>(rgb.z), alpha};
46 std::string rom_path = absl::GetFlag(FLAGS_rom);
47 if (rom_path.empty()) {
48 return absl::InvalidArgumentError(
49 absl::StrFormat(
"--rom is required (%s)", why));
62 std::string chr_source = parser.
GetString(
"chr-source").value_or(
"rom");
63 if (chr_source !=
"rom" && chr_source !=
"file") {
64 return absl::InvalidArgumentError(
"--chr-source must be 'rom' or 'file'");
66 if (chr_source ==
"file" && !parser.
GetString(
"chr-file").has_value()) {
67 return absl::InvalidArgumentError(
"--chr-source file needs --chr-file");
70 std::string palette_source =
71 parser.
GetString(
"palette-source").value_or(
"symbol");
72 if (palette_source !=
"symbol" && palette_source !=
"hud" &&
73 palette_source !=
"file" && palette_source !=
"asm") {
74 return absl::InvalidArgumentError(
75 "--palette-source must be 'symbol', 'asm', 'hud' or 'file'");
77 if (palette_source ==
"asm" && !parser.
GetString(
"palette-asm").has_value()) {
78 return absl::InvalidArgumentError(
79 "--palette-source asm needs --palette-asm <Menu/menu_palette.asm>");
81 if (palette_source ==
"file" &&
82 !parser.
GetString(
"palette-file").has_value()) {
83 return absl::InvalidArgumentError(
84 "--palette-source file needs --palette-file");
86 if (palette_source ==
"symbol" && !parser.
GetString(
"symbols").has_value()) {
87 return absl::InvalidArgumentError(
88 "--palette-source symbol needs --symbols <sym file> (and --rom)");
90 return absl::OkStatus();
96 const std::string tilemap_path = *parser.
GetString(
"tilemap");
97 const std::string out_path = *parser.
GetString(
"out");
103 const std::string chr_source = parser.
GetString(
"chr-source").value_or(
"rom");
104 std::vector<uint8_t> chr_sheet;
105 if (chr_source ==
"file") {
114 const std::string palette_source =
115 parser.
GetString(
"palette-source").value_or(
"symbol");
116 std::array<gfx::SnesColor, 32> colors{};
117 std::string palette_label;
118 if (palette_source ==
"file") {
120 if (
auto off = parser.
GetString(
"palette-file-offset"); off.has_value()) {
125 static_cast<size_t>(offset)));
126 }
else if (palette_source ==
"asm") {
130 palette_label = parser.
GetString(
"palette-label").value_or(
"Menu_Palette");
133 *parser.
GetString(
"palette-asm"), palette_label));
134 }
else if (palette_source ==
"hud") {
136 LoadRomArg(
"--palette-source hud needs a ROM"));
147 parser.
GetString(
"palette-label").value_or(kDefaultPaletteLabel);
149 LoadRomArg(
"--palette-source symbol needs a ROM"));
154 pal_rom, symbols, palette_label));
160 std::vector<std::array<uint8_t, 4>> palette = ToRgbaPalette(colors);
163 std::vector<uint8_t> png,
168 formatter.
AddField(
"tilemap", tilemap_path);
169 formatter.
AddField(
"out", out_path);
174 formatter.
AddField(
"chr_source", chr_source);
175 formatter.
AddField(
"palette_source", palette_source);
176 if (palette_source ==
"asm") {
179 if (!palette_label.empty()) {
180 formatter.
AddField(
"palette_label", palette_label);
182 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
Utility for parsing common CLI argument patterns.
std::optional< std::string > GetString(const std::string &name) const
Parse a named argument (e.g., –format=json or –format json)
absl::Status RequireArgs(const std::vector< std::string > &required) const
Validate that required arguments are present.
absl::StatusOr< int > GetInt(const std::string &name) const
Parse an integer argument (supports hex with 0x prefix)
Provider for symbol (label) resolution in disassembly.
absl::Status LoadSymbolFile(const std::string &path, SymbolFormat format=SymbolFormat::kAuto)
Load symbols from a .sym file (various formats)
ABSL_DECLARE_FLAG(std::string, rom)
#define ASSIGN_OR_RETURN(type_variable_name, expression)
constexpr char kDefaultPaletteLabel[]
absl::StatusOr< Rom > LoadRomArg(const char *why)
std::vector< std::array< uint8_t, 4 > > ToRgbaPalette(const std::array< gfx::SnesColor, 32 > &colors)
absl::Status WriteBinaryFile(const std::string &path, const std::vector< uint8_t > &bytes)
absl::StatusOr< std::vector< uint8_t > > EncodeIndexedPng(int width, int height, const std::vector< uint8_t > &indices, const std::vector< std::array< uint8_t, 4 > > &palette)
absl::StatusOr< std::array< gfx::SnesColor, 32 > > ResolveMenuPaletteFromHud(const GameData &game_data)
absl::StatusOr< std::array< gfx::SnesColor, 32 > > ResolveMenuPaletteFromFile(const std::string &path, size_t byte_offset)
absl::StatusOr< std::vector< uint8_t > > ResolveMenuChrFromRom(const Rom &rom)
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.
absl::StatusOr< std::vector< uint8_t > > ResolveMenuChrFromFile(const std::string &path)
absl::StatusOr< std::array< gfx::SnesColor, 32 > > ResolveMenuPaletteFromAsm(const std::string &path, const std::string &label)
absl::StatusOr< std::array< gfx::SnesColor, 32 > > ResolveMenuPaletteFromSymbol(const Rom &rom, const emu::debug::SymbolProvider &symbols, const std::string &label)
MenuTilemapDocument::ChrPixelFn MakeChrPixelFn(const std::vector< uint8_t > &sheet_8bpp_indexed)
#define RETURN_IF_ERROR(expr)