8#include "absl/strings/str_format.h"
25 std::istringstream ss(s);
27 while (std::getline(ss, tok,
',')) {
28 tok.erase(0, tok.find_first_not_of(
" \t"));
30 tok.erase(tok.find_last_not_of(
" \t") + 1);
31 if (tok ==
"collision")
33 else if (tok ==
"sprites")
35 else if (tok ==
"objects")
37 else if (tok ==
"track")
39 else if (tok ==
"camera")
41 else if (tok ==
"grid")
43 else if (tok ==
"all")
60 auto room_str = parser.
GetString(
"room").value();
63 room_id = std::stoi(room_str,
nullptr, 0);
65 return absl::InvalidArgumentError(
66 absl::StrFormat(
"Invalid room id: %s", room_str));
70 const std::string output_path = parser.
GetString(
"output").value();
74 if (
auto ov = parser.
GetString(
"overlays"); ov.has_value()) {
75 overlay_flags = ParseOverlays(ov.value());
80 if (
auto sc = parser.
GetString(
"scale"); sc.has_value()) {
82 scale = std::stof(sc.value());
88 return absl::InvalidArgumentError(
89 absl::StrFormat(
"Invalid scale value: %s", sc.value()));
96 if (!gd_status.ok()) {
97 return absl::InternalError(
98 absl::StrFormat(
"Failed to load game data: %s", gd_status.message()));
110 return result_or.status();
111 const auto& result = *result_or;
114 std::ofstream out(output_path, std::ios::binary);
116 return absl::InternalError(
117 absl::StrFormat(
"Cannot open output file: %s", output_path));
119 out.write(
reinterpret_cast<const char*
>(result.png_data.data()),
120 static_cast<std::streamsize
>(result.png_data.size()));
122 return absl::InternalError(
123 absl::StrFormat(
"Write failed for: %s", output_path));
127 formatter.
AddField(
"room_id", absl::StrFormat(
"0x%02X", room_id));
128 formatter.
AddField(
"output", output_path);
129 formatter.
AddField(
"width", result.width);
130 formatter.
AddField(
"height", result.height);
131 formatter.
AddField(
"size_bytes",
static_cast<int>(result.png_data.size()));
132 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::StatusOr< RenderResult > RenderDungeonRoom(const RenderRequest &req)
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.
constexpr uint32_t kCollision
constexpr uint32_t kSprites
constexpr uint32_t kCameraQuads
constexpr uint32_t kObjects
constexpr uint32_t kTrack
uint32_t ParseOverlays(const std::string &s)
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.