yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
graphics_context_commands.cc
Go to the documentation of this file.
2
3#include "absl/strings/str_format.h"
4#include "core/project.h"
5#include "util/hex.h"
6#include "util/macro.h"
8#include "zelda3/game_data.h"
11
12namespace yaze::cli {
13namespace {
14
15absl::StatusOr<int> ParseId(const resources::ArgumentParser& parser,
16 const char* flag, int limit) {
17 const auto text = parser.GetString(flag);
18 if (!text.has_value()) {
19 return absl::InvalidArgumentError(
20 absl::StrFormat("--%s is required", flag));
21 }
22 uint32_t value = 0;
23 if (!util::ParseHexString(*text, &value) ||
24 value >= static_cast<uint32_t>(limit)) {
25 return absl::InvalidArgumentError(
26 absl::StrFormat("--%s must be a hex id below 0x%X", flag, limit));
27 }
28 return static_cast<int>(value);
29}
30
32 const project::YazeProject* project) {
34 if (project != nullptr) {
35 identity.project_name = project->name;
36 }
37 return identity;
38}
39
40} // namespace
41
43 const resources::ArgumentParser& parser) {
44 const bool has_map = parser.GetString("map").has_value();
45 const bool has_room = parser.GetString("room").has_value();
46 if (has_map == has_room) {
47 return absl::InvalidArgumentError("Pass exactly one of --map or --room");
48 }
49 return absl::OkStatus();
50}
51
53 Rom* rom, const resources::ArgumentParser& parser,
54 resources::OutputFormatter& formatter) {
55 if (rom == nullptr || !rom->is_loaded()) {
56 return absl::InvalidArgumentError("ROM not loaded");
57 }
59 zelda3::LoadOptions options;
60 options.expand_rom = false;
61 RETURN_IF_ERROR(zelda3::LoadGameData(*rom, data, options));
62 const auto identity = IdentityFor(project_);
63
65 if (parser.GetString("map").has_value()) {
66 ASSIGN_OR_RETURN(const int map_id, ParseId(parser, "map", 0xA0));
67 zelda3::OverworldMap map(map_id, rom, &data);
68 map.LoadAreaGraphics();
70 context = zelda3::DescribeOverworldGraphicsContext(map, identity);
71 } else {
72 ASSIGN_OR_RETURN(const int room_id, ParseId(parser, "room", 0x128));
73 zelda3::Room room = zelda3::LoadRoomFromRom(rom, room_id);
74 room.SetGameData(&data);
75 room.LoadRoomGraphics();
76 context = zelda3::DescribeDungeonGraphicsContext(room, identity);
77 }
78 if (!context.graphics_loaded || !context.loader_agrees) {
79 return absl::FailedPreconditionError(
80 "Graphics context did not match the loader");
81 }
82 formatter.AddRawJsonField("graphics_context", context.ToJson());
83 return absl::OkStatus();
84}
85
86} // namespace yaze::cli
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:49
bool is_loaded() const
Definition rom.h:187
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
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)
Utility for consistent output formatting across commands.
void AddRawJsonField(const std::string &key, const std::string &json)
Add a field whose value is already-serialized JSON (numbers, nested arrays, null)....
Represents a single Overworld map screen.
void LoadRoomGraphics(std::optional< uint8_t > entrance_blockset=std::nullopt)
Definition room.cc:953
void SetGameData(GameData *data)
Definition room.h:1088
#define ASSIGN_OR_RETURN(type_variable_name, expression)
Definition macro.h:62
absl::StatusOr< int > ParseId(const resources::ArgumentParser &parser, const char *flag, int limit)
zelda3::GraphicsContextIdentity IdentityFor(const project::YazeProject *project)
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.
Definition game_data.cc:123
ResolvedGraphicsContext DescribeDungeonGraphicsContext(const Room &room, const GraphicsContextIdentity &identity)
Room LoadRoomFromRom(Rom *rom, int room_id)
Definition room.cc:655
ResolvedGraphicsContext DescribeOverworldGraphicsContext(const OverworldMap &map, const GraphicsContextIdentity &identity)
#define RETURN_IF_ERROR(expr)
Definition snes.cc:22
Modern project structure with comprehensive settings consolidation.
Definition project.h:287