15 const std::vector<uint8_t>& data, uint32_t address,
24 response.
summary = absl::StrFormat(
"Address 0x%06X contains %s (%zu bytes)",
25 address, data_type, data.size());
28 std::ostringstream detailed;
29 detailed << absl::StrFormat(
"Raw hex at 0x%06X:\n", address);
30 for (
size_t i = 0; i < data.size(); i += 16) {
31 detailed << absl::StrFormat(
"%06X: ", address + i);
32 for (
size_t j = i; j < std::min(i + 16, data.size()); ++j) {
33 detailed << absl::StrFormat(
"%02X ", data[j]);
36 for (
size_t j = i; j < std::min(i + 16, data.size()); ++j) {
38 detailed << (isprint(c) ? c :
'.');
43 if (!patterns.empty()) {
44 detailed <<
"\nDetected patterns:\n";
45 for (
const auto& pattern : patterns) {
46 detailed <<
"- " << pattern <<
"\n";
53 if (data_type.find(
"sprite") != std::string::npos) {
55 "Use resource-list --type=sprite to identify sprite IDs";
56 }
else if (data_type.find(
"tile") != std::string::npos) {
58 "Use overworld-find-tile to see where this tile appears";
59 }
else if (data_type.find(
"palette") != std::string::npos) {
60 response.
next_steps =
"Use palette-get-colors to see full palette";
62 response.
next_steps =
"Use hex-search to find similar patterns in ROM";
94 const std::vector<uint16_t>& colors,
const RouteContext& ctx) {
98 int unique_colors = 0;
99 std::map<uint16_t, int> color_counts;
100 for (uint16_t c : colors) {
103 unique_colors = color_counts.size();
105 response.
summary = absl::StrFormat(
"Palette has %zu colors (%d unique)",
106 colors.size(), unique_colors);
109 std::ostringstream detailed;
110 detailed <<
"Color breakdown:\n";
111 for (
size_t i = 0; i < colors.size(); ++i) {
112 uint16_t snes = colors[i];
113 uint8_t r = (snes & 0x1F) << 3;
114 uint8_t g = ((snes >> 5) & 0x1F) << 3;
115 uint8_t b = ((snes >> 10) & 0x1F) << 3;
116 detailed << absl::StrFormat(
" [%zu] $%04X = #%02X%02X%02X\n", i, snes, r,
120 if (color_counts.size() < colors.size()) {
121 detailed <<
"\nDuplicates found - optimization possible\n";
125 response.
next_steps =
"Use palette-set-color to modify colors";
170 const std::vector<uint8_t>& data) {
171 std::vector<std::string> patterns;
174 if (data.size() > 2) {
175 bool all_same =
true;
176 for (
size_t i = 1; i < data.size(); ++i) {
177 if (data[i] != data[0]) {
183 patterns.push_back(absl::StrFormat(
"Repeating byte: 0x%02X", data[0]));
188 if (data.size() > 3) {
189 bool ascending =
true, descending =
true;
190 for (
size_t i = 1; i < data.size(); ++i) {
191 if (data[i] != data[i - 1] + 1)
193 if (data[i] != data[i - 1] - 1)
197 patterns.push_back(
"Ascending sequence");
199 patterns.push_back(
"Descending sequence");