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
10#include "core/project.h"
11
12namespace yaze::editor {
13namespace {
14
15absl::StatusOr<core::OracleProgressionState> ReadOracleProgressionState(
16 emu::mesen::MesenSocketClient& client) {
17 constexpr uint32_t kBaseAddress = 0x7EF000;
18 constexpr uint16_t kStartOffset = core::OracleProgressionState::kPendantOffset;
19 constexpr uint16_t kEndOffset = core::OracleProgressionState::kSideQuestOffset;
20 constexpr size_t kReadLength = kEndOffset - kStartOffset + 1;
21 constexpr uint32_t kReadAddress = kBaseAddress + kStartOffset;
22
23 auto bytes_or = client.ReadBlock(kReadAddress, kReadLength);
24 if (!bytes_or.ok()) {
25 return bytes_or.status();
26 }
27 if (bytes_or->size() < kReadLength) {
28 return absl::DataLossError("SRAM read returned truncated data");
29 }
30
31 core::OracleProgressionState state;
32 const auto read_byte = [&](uint16_t offset) -> uint8_t {
33 return (*bytes_or)[offset - kStartOffset];
34 };
35
36 state.pendants = read_byte(core::OracleProgressionState::kPendantOffset);
37 state.crystal_bitfield =
39 state.game_state = read_byte(core::OracleProgressionState::kGameStateOffset);
40 state.oosprog2 = read_byte(core::OracleProgressionState::kOosProg2Offset);
41 state.oosprog = read_byte(core::OracleProgressionState::kOosProgOffset);
42 state.side_quest = read_byte(core::OracleProgressionState::kSideQuestOffset);
43 return state;
44}
45
46} // namespace
47
49 return "oracle";
50}
51
52oracle_validation::OracleRunResult OracleHackWorkflowBackend::RunValidation(
54 const oracle_validation::SmokeOptions& smoke_options,
55 const oracle_validation::PreflightOptions& preflight_options,
56 Rom* rom_context) const {
57 oracle_validation::OracleRunResult result;
58 result.mode = mode;
59 result.timestamp = oracle_validation::CurrentTimestamp();
60
62 auto args = oracle_validation::BuildPreflightArgs(preflight_options);
63 result.cli_command =
64 oracle_validation::BuildCliCommand("dungeon-oracle-preflight", args);
65
66 cli::handlers::DungeonOraclePreflightCommandHandler handler;
67 auto status = handler.Run(args, rom_context, &result.raw_output);
68 result.command_ok =
69 status.ok() || status.code() == absl::StatusCode::kFailedPrecondition;
70 result.status_code = status.code();
71 if (!status.ok() && status.code() != absl::StatusCode::kFailedPrecondition) {
72 result.error_message = std::string(status.message());
73 return result;
74 }
75
76 auto parsed = oracle_validation::ParsePreflightOutput(result.raw_output);
77 if (parsed.ok()) {
78 result.preflight = *parsed;
79 } else {
80 result.json_parse_failed = true;
81 }
82 return result;
83 }
84
85 auto args = oracle_validation::BuildSmokeArgs(smoke_options);
86 result.cli_command =
87 oracle_validation::BuildCliCommand("oracle-smoke-check", args);
88
89 cli::handlers::OracleSmokeCheckCommandHandler handler;
90 auto status = handler.Run(args, rom_context, &result.raw_output);
91 result.command_ok =
92 status.ok() || status.code() == absl::StatusCode::kFailedPrecondition;
93 result.status_code = status.code();
94 if (!status.ok() && status.code() != absl::StatusCode::kFailedPrecondition) {
95 result.error_message = std::string(status.message());
96 return result;
97 }
98
99 auto parsed = oracle_validation::ParseSmokeCheckOutput(result.raw_output);
100 if (parsed.ok()) {
101 result.smoke = *parsed;
102 } else {
103 result.json_parse_failed = true;
104 }
105 return result;
106}
107
109 project::YazeProject* project) const {
110 if (project && project->hack_manifest.loaded()) {
111 return &project->hack_manifest;
112 }
113 return nullptr;
114}
115
116std::optional<core::OracleProgressionState>
118 const core::HackManifest& manifest) const {
119 return manifest.oracle_progression_state();
120}
121
123 core::HackManifest& manifest, const core::OracleProgressionState& state) const {
124 manifest.SetOracleProgressionState(state);
125}
126
128 core::HackManifest& manifest) const {
129 manifest.ClearOracleProgressionState();
130}
131
132absl::StatusOr<core::OracleProgressionState>
134 const std::string& filepath) const {
136}
137
138absl::StatusOr<core::OracleProgressionState>
140 emu::mesen::MesenSocketClient& client) const {
141 return ReadOracleProgressionState(client);
142}
143
144const core::StoryEventGraph* OracleHackWorkflowBackend::GetStoryGraph(
145 const core::HackManifest& manifest) const {
146 if (!manifest.HasProjectRegistry()) {
147 return nullptr;
148 }
149 return &manifest.project_registry().story_events;
150}
151
152} // namespace yaze::editor
std::optional< OracleProgressionState > oracle_progression_state() const
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
absl::StatusOr< OracleProgressionState > LoadOracleProgressionFromSrmFile(const std::string &srm_path)
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.
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