SaveLargeMaps, SaveMap32Tiles, SaveItems updates

This commit is contained in:
scawful
2024-01-31 01:31:44 -05:00
parent 1c133d3a08
commit 1e5d02ab6f
6 changed files with 164 additions and 140 deletions

View File

@@ -116,7 +116,7 @@ void Overworld::FetchLargeMaps() {
overworld_maps_[138].SetAsLargeMap(129, 3);
map_parent_[136] = 136;
overworld_maps_[136].SetAsSmallMap(0);
overworld_maps_[136].SetAsSmallMap();
std::vector<bool> mapChecked;
mapChecked.reserve(0x40);
@@ -155,8 +155,8 @@ void Overworld::FetchLargeMaps() {
} else {
map_parent_[i] = (uchar)i;
map_parent_[i + 64] = (uchar)(i + 64);
overworld_maps_[i].SetAsSmallMap(0);
overworld_maps_[i + 64].SetAsSmallMap(0);
overworld_maps_[i].SetAsSmallMap();
overworld_maps_[i + 64].SetAsSmallMap();
mapChecked[i] = true;
}
}
@@ -848,7 +848,7 @@ absl::Status Overworld::SaveLargeMaps() {
// If the area to the left is a large area.
if (overworld_maps_[i - 1].IsLargeMap()) {
// If the area to the left is the bottom right of a large area.
if (overworld_maps_[i - 1].ParentIndex() == 1) {
if (overworld_maps_[i - 1].large_index() == 1) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen1 + (i * 2) + 16,
0x0060));
@@ -875,7 +875,7 @@ absl::Status Overworld::SaveLargeMaps() {
// If the area to the right is a large area.
if (overworld_maps_[i + 2].IsLargeMap()) {
// If the area to the right is the top left of a large area.
if (overworld_maps_[i + 2].ParentIndex() == 0) {
if (overworld_maps_[i + 2].large_index() == 0) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen2 + (i * 2) + 18, 0x0080));
}
@@ -900,7 +900,7 @@ absl::Status Overworld::SaveLargeMaps() {
// If the area just above us is a large area.
if (overworld_maps_[i - 8].IsLargeMap()) {
// If the area just above us is the bottom left of a large area.
if (overworld_maps_[i - 8].ParentIndex() == 2) {
if (overworld_maps_[i - 8].large_index() == 2) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen3 + (i * 2) + 02, 0x1800));
}
@@ -925,7 +925,7 @@ absl::Status Overworld::SaveLargeMaps() {
// If the area just below us is a large area.
if (overworld_maps_[i + 16].IsLargeMap()) {
// If the area just below us is the top left of a large area.
if (overworld_maps_[i + 16].ParentIndex() == 0) {
if (overworld_maps_[i + 16].large_index() == 0) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen4 + (i * 2) + 18, 0x2000));
}
@@ -959,7 +959,7 @@ absl::Status Overworld::SaveLargeMaps() {
// Just to make sure where don't try to read outside of the array.
if (i - 1 >= 0 && parentxPos != 0) {
if (overworld_maps_[i - 1].IsLargeMap()) {
if (overworld_maps_[i - 1].ParentIndex() == 3) {
if (overworld_maps_[i - 1].large_index() == 3) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen1 + (i * 2), 0xF060));
}
@@ -967,10 +967,10 @@ absl::Status Overworld::SaveLargeMaps() {
}
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen2 + (i * 2) + 128, 0x0040));
OverworldScreenTileMapChangeByScreen2 + (i * 2), 0x0040));
if (i + 1 < 64 && parentxPos != 7) {
if (overworld_maps_[i + 1].IsLargeMap()) {
if (overworld_maps_[i + 1].ParentIndex() == 1) {
if (overworld_maps_[i + 1].large_index() == 1) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen2 + (i * 2), 0xF040));
}
@@ -978,7 +978,7 @@ absl::Status Overworld::SaveLargeMaps() {
}
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen3 + (i * 2) + 256, 0x1800));
OverworldScreenTileMapChangeByScreen3 + (i * 2), 0x1800));
// If the area above is a large map, we don't need to add an offset to it.
// otherwise leave it the same.
@@ -987,7 +987,7 @@ absl::Status Overworld::SaveLargeMaps() {
// If the area just above us is a large area.
if (overworld_maps_[i - 8].IsLargeMap()) {
// If we are under the bottom right of the large area.
if (overworld_maps_[i - 8].ParentIndex() == 3) {
if (overworld_maps_[i - 8].large_index() == 3) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen3 + (i * 2), 0x17C0));
}
@@ -995,7 +995,7 @@ absl::Status Overworld::SaveLargeMaps() {
}
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen4 + (i * 2) + 384, 0x1000));
OverworldScreenTileMapChangeByScreen4 + (i * 2), 0x1000));
// If the area below is a large map, we don't need to add an offset to it.
// otherwise leave it the same.
@@ -1004,7 +1004,7 @@ absl::Status Overworld::SaveLargeMaps() {
// If the area just below us is a large area.
if (overworld_maps_[i + 8].IsLargeMap()) {
// If we are on top of the top right of the large area.
if (overworld_maps_[i + 8].ParentIndex() == 1) {
if (overworld_maps_[i + 8].large_index() == 1) {
RETURN_IF_ERROR(rom()->WriteShort(
OverworldScreenTileMapChangeByScreen4 + (i * 2), 0x0FC0));
}
@@ -1119,7 +1119,7 @@ absl::Status Overworld::CreateTile32Tilemap() {
}
while (tiles32_unique_.size() % 4 != 0) {
gfx::Tile32 padding_tile(420, 420, 420, 420);
gfx::Tile32 padding_tile(0, 0, 0, 0);
tiles32_unique_.emplace_back(padding_tile.GetPackedValue());
}
@@ -1162,108 +1162,110 @@ absl::Status Overworld::SaveMap32Tiles() {
}
// Top Left.
rom()->WriteByte(
rom()->version_constants().kMap32TileTL + i,
(uint8_t)(tiles32_unique_[unique_tile_index].tile0_ & 0xFF));
rom()->WriteByte(
rom()->version_constants().kMap32TileTL + (i + 1),
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile0_ & 0xFF));
rom()->WriteByte(
rom()->version_constants().kMap32TileTL + (i + 2),
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile0_ & 0xFF));
rom()->WriteByte(
rom()->version_constants().kMap32TileTL + (i + 3),
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile0_ & 0xFF));
const auto top_left = rom()->version_constants().kMap32TileTL;
RETURN_IF_ERROR(rom()->WriteByte(
top_left + i,
(uint8_t)(tiles32_unique_[unique_tile_index].tile0_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
top_left + (i + 1),
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile0_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
top_left + (i + 2),
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile0_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
top_left + (i + 3),
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile0_ & 0xFF)));
rom()->WriteByte(
rom()->version_constants().kMap32TileTL + (i + 4),
RETURN_IF_ERROR(rom()->WriteByte(
top_left + (i + 4),
(uint8_t)(((tiles32_unique_[unique_tile_index].tile0_ >> 4) & 0xF0) +
((tiles32_unique_[unique_tile_index + 1].tile0_ >> 8) &
0x0F)));
rom()->WriteByte(
rom()->version_constants().kMap32TileTL + (i + 5),
0x0F))));
RETURN_IF_ERROR(rom()->WriteByte(
top_left + (i + 5),
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile0_ >> 4) &
0xF0) +
((tiles32_unique_[unique_tile_index + 3].tile0_ >> 8) &
0x0F)));
0x0F))));
// Top Right.
rom()->WriteByte(
rom()->version_constants().kMap32TileTR + i,
(uint8_t)(tiles32_unique_[unique_tile_index].tile1_ & 0xFF));
rom()->WriteByte(
rom()->version_constants().kMap32TileTR + (i + 1),
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile1_ & 0xFF));
rom()->WriteByte(
rom()->version_constants().kMap32TileTR + (i + 2),
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile1_ & 0xFF));
rom()->WriteByte(
rom()->version_constants().kMap32TileTR + (i + 3),
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile1_ & 0xFF));
const auto top_right = rom()->version_constants().kMap32TileTR;
RETURN_IF_ERROR(rom()->WriteByte(
top_right + i,
(uint8_t)(tiles32_unique_[unique_tile_index].tile1_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
top_right + (i + 1),
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile1_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
top_right + (i + 2),
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile1_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
top_right + (i + 3),
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile1_ & 0xFF)));
rom()->WriteByte(
rom()->version_constants().kMap32TileTR + (i + 4),
RETURN_IF_ERROR(rom()->WriteByte(
top_right + (i + 4),
(uint8_t)(((tiles32_unique_[unique_tile_index].tile1_ >> 4) & 0xF0) |
((tiles32_unique_[unique_tile_index + 1].tile1_ >> 8) &
0x0F)));
rom()->WriteByte(
rom()->version_constants().kMap32TileTR + (i + 5),
0x0F))));
RETURN_IF_ERROR(rom()->WriteByte(
top_right + (i + 5),
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile1_ >> 4) &
0xF0) |
((tiles32_unique_[unique_tile_index + 3].tile1_ >> 8) &
0x0F)));
0x0F))));
// Bottom Left.
rom()->WriteByte(
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBL + i,
(uint8_t)(tiles32_unique_[unique_tile_index].tile2_ & 0xFF));
rom()->WriteByte(
(uint8_t)(tiles32_unique_[unique_tile_index].tile2_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBL + (i + 1),
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile2_ & 0xFF));
rom()->WriteByte(
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile2_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBL + (i + 2),
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile2_ & 0xFF));
rom()->WriteByte(
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile2_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBL + (i + 3),
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile2_ & 0xFF));
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile2_ & 0xFF)));
rom()->WriteByte(
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBL + (i + 4),
(uint8_t)(((tiles32_unique_[unique_tile_index].tile2_ >> 4) & 0xF0) |
((tiles32_unique_[unique_tile_index + 1].tile2_ >> 8) &
0x0F)));
rom()->WriteByte(
0x0F))));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBL + (i + 5),
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile2_ >> 4) &
0xF0) |
((tiles32_unique_[unique_tile_index + 3].tile2_ >> 8) &
0x0F)));
0x0F))));
// Bottom Right.
rom()->WriteByte(
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBR + i,
(uint8_t)(tiles32_unique_[unique_tile_index].tile3_ & 0xFF));
rom()->WriteByte(
(uint8_t)(tiles32_unique_[unique_tile_index].tile3_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBR + (i + 1),
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile3_ & 0xFF));
rom()->WriteByte(
(uint8_t)(tiles32_unique_[unique_tile_index + 1].tile3_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBR + (i + 2),
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile3_ & 0xFF));
rom()->WriteByte(
(uint8_t)(tiles32_unique_[unique_tile_index + 2].tile3_ & 0xFF)));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBR + (i + 3),
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile3_ & 0xFF));
(uint8_t)(tiles32_unique_[unique_tile_index + 3].tile3_ & 0xFF)));
rom()->WriteByte(
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBR + (i + 4),
(uint8_t)(((tiles32_unique_[unique_tile_index].tile3_ >> 4) & 0xF0) |
((tiles32_unique_[unique_tile_index + 1].tile3_ >> 8) &
0x0F)));
rom()->WriteByte(
0x0F))));
RETURN_IF_ERROR(rom()->WriteByte(
rom()->version_constants().kMap32TileBR + (i + 5),
(uint8_t)(((tiles32_unique_[unique_tile_index + 2].tile3_ >> 4) &
0xF0) |
((tiles32_unique_[unique_tile_index + 3].tile3_ >> 8) &
0x0F)));
0x0F))));
unique_tile_index += 4;
num_unique_tiles += 2;
@@ -1381,86 +1383,81 @@ bool compareItemsArrays(std::vector<OverworldItem> itemArray1,
} // namespace
absl::Status Overworld::SaveItems() {
std::vector<std::vector<OverworldItem>> roomItems(128);
std::vector<std::vector<OverworldItem>> room_items(128);
for (int i = 0; i < 128; i++) {
roomItems[i] = std::vector<OverworldItem>();
room_items[i] = std::vector<OverworldItem>();
for (const OverworldItem &item : all_items_) {
if (item.room_map_id == i) {
roomItems[i].emplace_back(item);
room_items[i].emplace_back(item);
if (item.id == 0x86) {
RETURN_IF_ERROR(rom()->WriteWord(
0x16DC5 + (i * 2), (item.game_x_ + (item.game_y_ * 64)) * 2));
0x16DC5 + (i * 2), (item.game_x + (item.game_y * 64)) * 2));
}
}
}
}
int dataPos = overworldItemsPointers + 0x100;
int data_pos = overworldItemsPointers + 0x100;
std::vector<int> itemPointers(128);
std::vector<int> itemPointersReuse(128);
int emptyPointer = 0;
int item_pointers[128];
int item_pointers_reuse[128];
int empty_pointer = 0;
for (int i = 0; i < 128; i++) {
itemPointersReuse[i] = -1;
item_pointers_reuse[i] = -1;
for (int ci = 0; ci < i; ci++) {
if (roomItems[i].empty()) {
itemPointersReuse[i] = -2;
if (room_items[i].empty()) {
item_pointers_reuse[i] = -2;
break;
}
// Unclear:
compareItemsArrays(
std::vector<OverworldItem>(roomItems[i].begin(), roomItems[i].end()),
std::vector<OverworldItem>(roomItems[ci].begin(),
roomItems[ci].end()));
if (compareItemsArrays(std::vector<OverworldItem>(roomItems[i].begin(),
roomItems[i].end()),
std::vector<OverworldItem>(roomItems[ci].begin(),
roomItems[ci].end()))) {
itemPointersReuse[i] = ci;
// Copy into separator vectors from i to ci, then ci to end
if (compareItemsArrays(
std::vector<OverworldItem>(room_items[i].begin(),
room_items[i].end()),
std::vector<OverworldItem>(room_items[ci].begin(),
room_items[ci].end()))) {
item_pointers_reuse[i] = ci;
break;
}
}
}
for (int i = 0; i < 128; i++) {
if (itemPointersReuse[i] == -1) {
itemPointers[i] = dataPos;
for (const OverworldItem &item : roomItems[i]) {
short mapPos =
static_cast<short>(((item.game_y_ << 6) + item.game_x_) << 1);
if (item_pointers_reuse[i] == -1) {
item_pointers[i] = data_pos;
for (const OverworldItem &item : room_items[i]) {
short map_pos =
static_cast<short>(((item.game_y << 6) + item.game_x) << 1);
uint32_t data = static_cast<uint8_t>(mapPos & 0xFF) |
static_cast<uint8_t>(mapPos >> 8) |
uint32_t data = static_cast<uint8_t>(map_pos & 0xFF) |
static_cast<uint8_t>(map_pos >> 8) |
static_cast<uint8_t>(item.id);
RETURN_IF_ERROR(rom()->WriteLong(dataPos, data));
// WriteType::PotItemData);
dataPos += 3;
RETURN_IF_ERROR(rom()->WriteLong(data_pos, data));
data_pos += 3;
}
emptyPointer = dataPos;
RETURN_IF_ERROR(rom()->WriteWord(dataPos, 0xFFFF));
dataPos += 2;
} else if (itemPointersReuse[i] == -2) {
itemPointers[i] = emptyPointer;
empty_pointer = data_pos;
RETURN_IF_ERROR(rom()->WriteWord(data_pos, 0xFFFF));
data_pos += 2;
} else if (item_pointers_reuse[i] == -2) {
item_pointers[i] = empty_pointer;
} else {
itemPointers[i] = itemPointers[itemPointersReuse[i]];
item_pointers[i] = item_pointers[item_pointers_reuse[i]];
}
int snesaddr = core::PcToSnes(itemPointers[i]);
int snesaddr = core::PcToSnes(item_pointers[i]);
RETURN_IF_ERROR(
rom()->WriteWord(overworldItemsPointers + (i * 2), snesaddr));
}
if (dataPos > overworldItemsEndData) {
if (data_pos > overworldItemsEndData) {
return absl::AbortedError("Too many items");
}
if (flags()->kLogToConsole) {
std::cout << "End of Items : " << dataPos << std::endl;
std::cout << "End of Items : " << data_pos << std::endl;
}
return absl::OkStatus();