Fix the dumbest bug in the universe
This commit is contained in:
@@ -85,7 +85,8 @@ Bytes PackBppTile(const tile8& tile, const uint32_t bpp) {
|
|||||||
// 2bpp format
|
// 2bpp format
|
||||||
if (bpp >= 2) {
|
if (bpp >= 2) {
|
||||||
output[col * 2] += (uint8_t)((color & 1) << (7 - row));
|
output[col * 2] += (uint8_t)((color & 1) << (7 - row));
|
||||||
output[col * 2 + 1] += (uint8_t)((uint8_t)((color & 2) == 2) << (7 - row));
|
output[col * 2 + 1] +=
|
||||||
|
(uint8_t)((uint8_t)((color & 2) == 2) << (7 - row));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3bpp format
|
// 3bpp format
|
||||||
@@ -101,7 +102,8 @@ Bytes PackBppTile(const tile8& tile, const uint32_t bpp) {
|
|||||||
// 8bpp format
|
// 8bpp format
|
||||||
if (bpp == 8) {
|
if (bpp == 8) {
|
||||||
output[32 + col * 2] += (uint8_t)(((color & 16) == 16) << (7 - row));
|
output[32 + col * 2] += (uint8_t)(((color & 16) == 16) << (7 - row));
|
||||||
output[32 + col * 2 + 1] += (uint8_t)(((color & 32) == 32) << (7 - row));
|
output[32 + col * 2 + 1] +=
|
||||||
|
(uint8_t)(((color & 32) == 32) << (7 - row));
|
||||||
output[48 + col * 2] += (uint8_t)(((color & 64) == 64) << (7 - row));
|
output[48 + col * 2] += (uint8_t)(((color & 64) == 64) << (7 - row));
|
||||||
output[48 + col * 2 + 1] +=
|
output[48 + col * 2 + 1] +=
|
||||||
(uint8_t)(((color & 128) == 128) << (7 - row));
|
(uint8_t)(((color & 128) == 128) << (7 - row));
|
||||||
@@ -346,8 +348,8 @@ uint16_t TileInfoToShort(TileInfo tile_info) {
|
|||||||
|
|
||||||
TileInfo GetTilesInfo(uint16_t tile) {
|
TileInfo GetTilesInfo(uint16_t tile) {
|
||||||
// vhopppcc cccccccc
|
// vhopppcc cccccccc
|
||||||
auto tid = (uint16_t)(tile & core::TileNameMask);
|
uint16_t tid = (uint16_t)(tile & core::TileNameMask);
|
||||||
auto p = (uint8_t)((tile >> 10) & 0x07);
|
uint8_t p = (uint8_t)((tile >> 10) & 0x07);
|
||||||
|
|
||||||
bool o = ((tile & core::TilePriorityBit) == core::TilePriorityBit);
|
bool o = ((tile & core::TilePriorityBit) == core::TilePriorityBit);
|
||||||
bool h = ((tile & core::TileHFlipBit) == core::TileHFlipBit);
|
bool h = ((tile & core::TileHFlipBit) == core::TileHFlipBit);
|
||||||
|
|||||||
@@ -411,7 +411,7 @@ class ROM : public core::ExperimentFlags {
|
|||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::Status WriteShort(uint32_t addr, uint16_t value) {
|
absl::Status WriteShort(int addr, uint16_t value) {
|
||||||
if (addr + 1 >= rom_data_.size()) {
|
if (addr + 1 >= rom_data_.size()) {
|
||||||
return absl::InvalidArgumentError(absl::StrFormat(
|
return absl::InvalidArgumentError(absl::StrFormat(
|
||||||
"Attempt to write short %#04x value failed, address %d out of range",
|
"Attempt to write short %#04x value failed, address %d out of range",
|
||||||
|
|||||||
@@ -697,15 +697,14 @@ absl::Status Overworld::SaveOverworldMaps() {
|
|||||||
|
|
||||||
absl::Status Overworld::SaveLargeMaps() {
|
absl::Status Overworld::SaveLargeMaps() {
|
||||||
core::Logger::log("Saving Large Maps");
|
core::Logger::log("Saving Large Maps");
|
||||||
|
std::vector<uint8_t> checked_map;
|
||||||
|
|
||||||
for (int i = 0; i < 0x40; i++) {
|
for (int i = 0; i < 0x40; i++) {
|
||||||
int y_pos = i / 8;
|
int y_pos = i / 8;
|
||||||
int x_pos = i % 8;
|
int x_pos = i % 8;
|
||||||
int parent_y_pos = overworld_maps_[i].parent() / 8;
|
int parent_y_pos = overworld_maps_[i].parent() / 8;
|
||||||
int parent_x_pos = overworld_maps_[i].parent() % 8;
|
int parent_x_pos = overworld_maps_[i].parent() % 8;
|
||||||
|
|
||||||
// std::unordered_map<uint8_t, uint8_t> checked_map;
|
|
||||||
std::vector<uint8_t> checked_map;
|
|
||||||
|
|
||||||
// Always write the map parent since it should not matter
|
// Always write the map parent since it should not matter
|
||||||
RETURN_IF_ERROR(
|
RETURN_IF_ERROR(
|
||||||
rom()->Write(overworldMapParentId + i, overworld_maps_[i].parent()))
|
rom()->Write(overworldMapParentId + i, overworld_maps_[i].parent()))
|
||||||
@@ -718,7 +717,7 @@ absl::Status Overworld::SaveLargeMaps() {
|
|||||||
// If it's large then save parent pos *
|
// If it's large then save parent pos *
|
||||||
// 0x200 otherwise pos * 0x200
|
// 0x200 otherwise pos * 0x200
|
||||||
if (overworld_maps_[i].is_large_map()) {
|
if (overworld_maps_[i].is_large_map()) {
|
||||||
const int large_map_offsets[] = {0, 1, 8, 9};
|
const uint8_t large_map_offsets[] = {0, 1, 8, 9};
|
||||||
for (const auto &offset : large_map_offsets) {
|
for (const auto &offset : large_map_offsets) {
|
||||||
// Check 1
|
// Check 1
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(overworldMapSize + i + offset, 0x20));
|
RETURN_IF_ERROR(rom()->WriteByte(overworldMapSize + i + offset, 0x20));
|
||||||
@@ -779,6 +778,7 @@ absl::Status Overworld::SaveLargeMaps() {
|
|||||||
RETURN_IF_ERROR(rom()->WriteShort(
|
RETURN_IF_ERROR(rom()->WriteShort(
|
||||||
overworldTransitionPositionY + (i * 2) + 02, (parent_y_pos * 0x200)));
|
overworldTransitionPositionY + (i * 2) + 02, (parent_y_pos * 0x200)));
|
||||||
|
|
||||||
|
// problematic
|
||||||
RETURN_IF_ERROR(rom()->WriteShort(
|
RETURN_IF_ERROR(rom()->WriteShort(
|
||||||
overworldTransitionPositionX + (i * 2) + 16, (parent_x_pos * 0x200)));
|
overworldTransitionPositionX + (i * 2) + 16, (parent_x_pos * 0x200)));
|
||||||
RETURN_IF_ERROR(rom()->WriteShort(
|
RETURN_IF_ERROR(rom()->WriteShort(
|
||||||
@@ -876,7 +876,7 @@ absl::Status Overworld::SaveLargeMaps() {
|
|||||||
|
|
||||||
// Always 0x2000
|
// Always 0x2000
|
||||||
RETURN_IF_ERROR(rom()->WriteShort(
|
RETURN_IF_ERROR(rom()->WriteShort(
|
||||||
OverworldScreenTileMapChangeByScreen4 + (i * 2), 0x2000));
|
OverworldScreenTileMapChangeByScreen4 + (i * 2) + 00, 0x2000));
|
||||||
RETURN_IF_ERROR(rom()->WriteShort(
|
RETURN_IF_ERROR(rom()->WriteShort(
|
||||||
OverworldScreenTileMapChangeByScreen4 + (i * 2) + 16, 0x2000));
|
OverworldScreenTileMapChangeByScreen4 + (i * 2) + 16, 0x2000));
|
||||||
// Right side always 0x2040
|
// Right side always 0x2040
|
||||||
@@ -1130,7 +1130,8 @@ absl::Status Overworld::SaveMap32Tiles() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Top Left.
|
// Top Left.
|
||||||
const auto top_left = rom()->version_constants().kMap32TileTL;
|
auto top_left = rom()->version_constants().kMap32TileTL;
|
||||||
|
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
top_left + i,
|
top_left + i,
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index].tile0_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index].tile0_ & 0xFF)));
|
||||||
@@ -1157,7 +1158,7 @@ absl::Status Overworld::SaveMap32Tiles() {
|
|||||||
0x0F))));
|
0x0F))));
|
||||||
|
|
||||||
// Top Right.
|
// Top Right.
|
||||||
const auto top_right = rom()->version_constants().kMap32TileTR;
|
auto top_right = rom()->version_constants().kMap32TileTR;
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
top_right + i,
|
top_right + i,
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index].tile1_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index].tile1_ & 0xFF)));
|
||||||
@@ -1184,52 +1185,54 @@ absl::Status Overworld::SaveMap32Tiles() {
|
|||||||
0x0F))));
|
0x0F))));
|
||||||
|
|
||||||
// Bottom Left.
|
// Bottom Left.
|
||||||
|
const auto map32TilesBL = rom()->version_constants().kMap32TileBL;
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBL + i,
|
map32TilesBL + i,
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index].tile2_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index].tile2_ & 0xFF)));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBL + (i + 1),
|
map32TilesBL + (i + 1),
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile2_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile2_ & 0xFF)));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBL + (i + 2),
|
map32TilesBL + (i + 2),
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile2_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile2_ & 0xFF)));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBL + (i + 3),
|
map32TilesBL + (i + 3),
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile2_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile2_ & 0xFF)));
|
||||||
|
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBL + (i + 4),
|
map32TilesBL + (i + 4),
|
||||||
(uint8_t)(((tiles32_unique_[unique_tile_index].tile2_ >> 4) & 0xF0) |
|
(uint8_t)(((tiles32_unique_[unique_tile_index].tile2_ >> 4) & 0xF0) |
|
||||||
((tiles32_unique_[unique_tile_index + 1].tile2_ >> 8) &
|
((tiles32_unique_[unique_tile_index + 1].tile2_ >> 8) &
|
||||||
0x0F))));
|
0x0F))));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBL + (i + 5),
|
map32TilesBL + (i + 5),
|
||||||
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile2_ >> 4) &
|
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile2_ >> 4) &
|
||||||
0xF0) |
|
0xF0) |
|
||||||
((tiles32_unique_[unique_tile_index + 3].tile2_ >> 8) &
|
((tiles32_unique_[unique_tile_index + 3].tile2_ >> 8) &
|
||||||
0x0F))));
|
0x0F))));
|
||||||
|
|
||||||
// Bottom Right.
|
// Bottom Right.
|
||||||
|
const auto map32TilesBR = rom()->version_constants().kMap32TileBR;
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBR + i,
|
map32TilesBR + i,
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index].tile3_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index].tile3_ & 0xFF)));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBR + (i + 1),
|
map32TilesBR + (i + 1),
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile3_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile3_ & 0xFF)));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBR + (i + 2),
|
map32TilesBR + (i + 2),
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile3_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile3_ & 0xFF)));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBR + (i + 3),
|
map32TilesBR + (i + 3),
|
||||||
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile3_ & 0xFF)));
|
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile3_ & 0xFF)));
|
||||||
|
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBR + (i + 4),
|
map32TilesBR + (i + 4),
|
||||||
(uint8_t)(((tiles32_unique_[unique_tile_index].tile3_ >> 4) & 0xF0) |
|
(uint8_t)(((tiles32_unique_[unique_tile_index].tile3_ >> 4) & 0xF0) |
|
||||||
((tiles32_unique_[unique_tile_index + 1].tile3_ >> 8) &
|
((tiles32_unique_[unique_tile_index + 1].tile3_ >> 8) &
|
||||||
0x0F))));
|
0x0F))));
|
||||||
RETURN_IF_ERROR(rom()->WriteByte(
|
RETURN_IF_ERROR(rom()->WriteByte(
|
||||||
rom()->version_constants().kMap32TileBR + (i + 5),
|
map32TilesBR + (i + 5),
|
||||||
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile3_ >> 4) &
|
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile3_ >> 4) &
|
||||||
0xF0) |
|
0xF0) |
|
||||||
((tiles32_unique_[unique_tile_index + 3].tile3_ >> 8) &
|
((tiles32_unique_[unique_tile_index + 3].tile3_ >> 8) &
|
||||||
|
|||||||
@@ -422,8 +422,8 @@ constexpr int OverworldScreenTileMapChangeByScreen4 = 0x127B4;
|
|||||||
|
|
||||||
constexpr int OverworldMapDataOverflow = 0x130000;
|
constexpr int OverworldMapDataOverflow = 0x130000;
|
||||||
|
|
||||||
constexpr int transition_target_north = 0x13ee2;
|
constexpr int transition_target_north = 0x13EE2;
|
||||||
constexpr int transition_target_west = 0x13f62;
|
constexpr int transition_target_west = 0x13F62;
|
||||||
constexpr int overworldCustomMosaicASM = 0x1301D0;
|
constexpr int overworldCustomMosaicASM = 0x1301D0;
|
||||||
constexpr int overworldCustomMosaicArray = 0x1301F0;
|
constexpr int overworldCustomMosaicArray = 0x1301F0;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user