8#include "absl/strings/str_format.h"
26 std::istringstream ss(s);
28 while (std::getline(ss, tok,
',')) {
29 tok.erase(0, tok.find_first_not_of(
" \t"));
31 tok.erase(tok.find_last_not_of(
" \t") + 1);
32 if (tok ==
"collision")
34 else if (tok ==
"sprites")
36 else if (tok ==
"objects")
38 else if (tok ==
"track")
40 else if (tok ==
"camera")
42 else if (tok ==
"grid")
44 else if (tok ==
"all")
55 if (parser.
GetString(
"output")->empty()) {
56 return absl::InvalidArgumentError(
"--output cannot be empty");
58 if (
const auto scale = parser.
GetString(
"scale"); scale.has_value()) {
61 return absl::OkStatus();
68 if (rom !=
nullptr && !rom->
filename().empty()) {
81 auto room_str = parser.
GetString(
"room").value();
84 room_id = std::stoi(room_str,
nullptr, 0);
86 return absl::InvalidArgumentError(
87 absl::StrFormat(
"Invalid room id: %s", room_str));
91 const std::string output_path = parser.
GetString(
"output").value();
95 "--output", resolved_output, invocation_context));
99 if (
auto ov = parser.
GetString(
"overlays"); ov.has_value()) {
100 overlay_flags = ParseOverlays(ov.value());
105 if (
auto sc = parser.
GetString(
"scale"); sc.has_value()) {
110 return absl::FailedPreconditionError(
"ROM not loaded");
116 if (!gd_status.ok()) {
117 return absl::InternalError(
118 absl::StrFormat(
"Failed to load game data: %s", gd_status.message()));
130 return result_or.status();
131 const auto& result = *result_or;
137 "--output", resolved_output, invocation_context));
138 std::ofstream out(resolved_output, std::ios::binary);
140 return absl::InternalError(
141 absl::StrFormat(
"Cannot open output file: %s", output_path));
143 out.write(
reinterpret_cast<const char*
>(result.png_data.data()),
144 static_cast<std::streamsize
>(result.png_data.size()));
146 return absl::InternalError(
147 absl::StrFormat(
"Write failed for: %s", output_path));
151 return absl::InternalError(
152 absl::StrFormat(
"Close failed for: %s", output_path));
155 formatter.
AddField(
"room_id", absl::StrFormat(
"0x%02X", room_id));
156 formatter.
AddField(
"output", output_path);
157 formatter.
AddField(
"width", result.width);
158 formatter.
AddField(
"height", result.height);
159 formatter.
AddField(
"size_bytes",
static_cast<int>(result.png_data.size()));
160 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.
absl::Status ExecuteWithContext(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter, const resources::CommandInvocationContext &invocation_context) override
Execute with immutable, invocation-scoped ROM path identity.
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.
#define ASSIGN_OR_RETURN(type_variable_name, expression)
constexpr uint32_t kCollision
constexpr uint32_t kSprites
constexpr uint32_t kCameraQuads
constexpr uint32_t kObjects
constexpr uint32_t kTrack
absl::StatusOr< float > ParseRenderScale(absl::string_view value)
uint32_t ParseOverlays(const std::string &s)
absl::StatusOr< std::filesystem::path > ResolveStableArtifactPath(const std::filesystem::path &path)
absl::Status RejectArtifactRomAliases(absl::string_view option_name, const std::filesystem::path &artifact_path, const CommandInvocationContext &invocation_context)
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.
#define RETURN_IF_ERROR(expr)
std::optional< std::filesystem::path > active_rom_path
std::optional< std::filesystem::path > source_rom_path