yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
oracle_hack_workflow_backend.cc
Go to the documentation of this file.
2
3#include <vector>
4
5#include "absl/strings/str_format.h"
11#include "core/project.h"
12
13namespace yaze::editor {
14namespace {
15
16absl::StatusOr<core::OracleProgressionState> ReadOracleProgressionState(
18 constexpr uint32_t kBaseAddress = 0x7EF000;
19 constexpr uint16_t kStartOffset =
21 constexpr uint16_t kEndOffset =
23 constexpr size_t kReadLength = kEndOffset - kStartOffset + 1;
24 constexpr uint32_t kReadAddress = kBaseAddress + kStartOffset;
25
26 auto bytes_or = client.ReadBlock(kReadAddress, kReadLength);
27 if (!bytes_or.ok()) {
28 return bytes_or.status();
29 }
30 if (bytes_or->size() < kReadLength) {
31 return absl::DataLossError("SRAM read returned truncated data");
32 }
33
35 const auto read_byte = [&](uint16_t offset) -> uint8_t {
36 return (*bytes_or)[offset - kStartOffset];
37 };
38
40 state.crystal_bitfield =
46 return state;
47}
48
51 const absl::Status& status) {
52 if (preflight.ok) {
53 return preflight.error_count == 0 && preflight.errors.empty() &&
54 status.ok();
55 }
56
57 if (status.ok() || preflight.error_count <= 0 ||
58 preflight.errors.size() !=
59 static_cast<std::size_t>(preflight.error_count)) {
60 return false;
61 }
62
63 const auto& first_error = preflight.errors.front();
64 std::string expected_message = first_error.message;
65 if (preflight.error_count > 1) {
66 expected_message =
67 absl::StrFormat("%s (plus %d additional safety issue(s))",
68 first_error.message, preflight.error_count - 1);
69 }
70
71 return first_error.status_code == absl::StatusCodeToString(status.code()) &&
72 expected_message == status.message();
73}
74
75} // namespace
76
78 return "oracle";
79}
80
83 const oracle_validation::SmokeOptions& smoke_options,
84 const oracle_validation::PreflightOptions& preflight_options,
85 Rom* rom_context) const {
87 result.mode = mode;
89
91 auto args = oracle_validation::BuildPreflightArgs(preflight_options);
92 result.cli_command =
93 oracle_validation::BuildCliCommand("dungeon-oracle-preflight", args);
94
96 auto status = handler.Run(args, rom_context, &result.raw_output);
97 result.status_code = status.code();
98
99 if (result.raw_output.empty()) {
100 result.error_message = status.ok()
101 ? "dungeon-oracle-preflight produced no output"
102 : std::string(status.message());
103 return result;
104 }
105
107 if (!parsed.ok()) {
108 result.json_parse_failed = true;
109 result.error_message = status.ok()
110 ? std::string(parsed.status().message())
111 : std::string(status.message());
112 return result;
113 }
114
115 result.preflight = *parsed;
116 if (MatchesExpectedPreflightStatus(*parsed, status)) {
117 result.command_ok = true;
118 return result;
119 }
120
121 result.error_message =
122 status.ok()
123 ? "dungeon-oracle-preflight output did not match command status"
124 : std::string(status.message());
125 return result;
126 }
127
128 auto args = oracle_validation::BuildSmokeArgs(smoke_options);
129 result.cli_command =
130 oracle_validation::BuildCliCommand("oracle-smoke-check", args);
131
133 auto status = handler.Run(args, rom_context, &result.raw_output);
134 result.command_ok =
135 status.ok() || status.code() == absl::StatusCode::kFailedPrecondition;
136 result.status_code = status.code();
137 if (!status.ok() && status.code() != absl::StatusCode::kFailedPrecondition) {
138 result.error_message = std::string(status.message());
139 return result;
140 }
141
143 if (parsed.ok()) {
144 result.smoke = *parsed;
145 } else {
146 result.json_parse_failed = true;
147 }
148 return result;
149}
150
152 project::YazeProject* project) const {
153 if (project && project->hack_manifest.loaded()) {
154 return &project->hack_manifest;
155 }
156 return nullptr;
157}
158
159std::optional<core::OracleProgressionState>
164
170
175
176absl::StatusOr<core::OracleProgressionState>
178 const std::string& filepath) const {
180}
181
182absl::StatusOr<core::OracleProgressionState>
184 emu::mesen::MesenSocketClient& client) const {
185 return ReadOracleProgressionState(client);
186}
187
189 const core::HackManifest& manifest) const {
190 if (!manifest.HasProjectRegistry()) {
191 return nullptr;
192 }
193 return &manifest.project_registry().story_events;
194}
195
196} // namespace yaze::editor
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
absl::Status Run(const std::vector< std::string > &args, Rom *rom_context, std::string *captured_output=nullptr)
Execute the command.
Loads and queries the hack manifest JSON for yaze-ASM integration.
const ProjectRegistry & project_registry() const
bool HasProjectRegistry() const
std::optional< OracleProgressionState > oracle_progression_state() const
bool loaded() const
Check if the manifest has been loaded.
void SetOracleProgressionState(const OracleProgressionState &state)
The complete Oracle narrative progression graph.
oracle_validation::OracleRunResult RunValidation(oracle_validation::RunMode mode, const oracle_validation::SmokeOptions &smoke_options, const oracle_validation::PreflightOptions &preflight_options, Rom *rom_context) const override
core::HackManifest * ResolveManifest(project::YazeProject *project) const override
void SetProgressionState(core::HackManifest &manifest, const core::OracleProgressionState &state) const override
const core::StoryEventGraph * GetStoryGraph(const core::HackManifest &manifest) const override
std::optional< core::OracleProgressionState > GetProgressionState(const core::HackManifest &manifest) const override
absl::StatusOr< core::OracleProgressionState > LoadProgressionStateFromFile(const std::string &filepath) const override
absl::StatusOr< core::OracleProgressionState > ReadProgressionStateFromLiveSram(emu::mesen::MesenSocketClient &client) const override
void ClearProgressionState(core::HackManifest &manifest) const override
Unix socket client for Mesen2-OoS fork.
absl::StatusOr< std::vector< uint8_t > > ReadBlock(uint32_t addr, size_t len)
Read a block of bytes from memory.
absl::StatusOr< OracleProgressionState > LoadOracleProgressionFromSrmFile(const std::string &srm_path)
bool MatchesExpectedPreflightStatus(const oracle_validation::PreflightResult &preflight, const absl::Status &status)
absl::StatusOr< core::OracleProgressionState > ReadOracleProgressionState(emu::mesen::MesenSocketClient &client)
std::vector< std::string > BuildSmokeArgs(const SmokeOptions &opts)
std::vector< std::string > BuildPreflightArgs(const PreflightOptions &opts)
std::string BuildCliCommand(const std::string &command_name, const std::vector< std::string > &args)
absl::StatusOr< SmokeResult > ParseSmokeCheckOutput(const std::string &json_str)
absl::StatusOr< PreflightResult > ParsePreflightOutput(const std::string &json_str)
Editors are the view controllers for the application.
Oracle of Secrets game progression state parsed from SRAM.
static constexpr uint16_t kSideQuestOffset
static constexpr uint16_t kPendantOffset
static constexpr uint16_t kGameStateOffset
static constexpr uint16_t kOosProgOffset
static constexpr uint16_t kOosProg2Offset
static constexpr uint16_t kCrystalOffset
Modern project structure with comprehensive settings consolidation.
Definition project.h:172
core::HackManifest hack_manifest
Definition project.h:212