Add ROM::ReadTransaction for bulk reads and cleanup Overworld class

This commit is contained in:
scawful
2024-01-25 14:04:31 -05:00
parent 1ef1c3ff84
commit f45e115176
4 changed files with 226 additions and 154 deletions

View File

@@ -917,31 +917,20 @@ absl::Status Overworld::SaveEntrances() {
absl::Status Overworld::SaveExits() {
for (int i = 0; i < 0x4F; i++) {
RETURN_IF_ERROR(
rom()->WriteShort(OWExitRoomId + (i * 2), all_exits_[i].room_id_))
RETURN_IF_ERROR(rom()->WriteByte(OWExitMapId + i, all_exits_[i].map_id_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitVram + (i * 2), all_exits_[i].map_pos_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitYScroll + (i * 2), all_exits_[i].y_scroll_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitXScroll + (i * 2), all_exits_[i].x_scroll_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitYPlayer + (i * 2), all_exits_[i].y_player_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitXPlayer + (i * 2), all_exits_[i].x_player_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitYCamera + (i * 2), all_exits_[i].y_camera_))
RETURN_IF_ERROR(
rom()->WriteShort(OWExitXCamera + (i * 2), all_exits_[i].x_camera_))
RETURN_IF_ERROR(
rom()->WriteByte(OWExitUnk1 + i, all_exits_[i].scroll_mod_y_))
RETURN_IF_ERROR(
rom()->WriteByte(OWExitUnk2 + i, all_exits_[i].scroll_mod_x_))
RETURN_IF_ERROR(rom()->WriteShort(OWExitDoorType1 + (i * 2),
all_exits_[i].door_type_1_))
RETURN_IF_ERROR(rom()->WriteShort(OWExitDoorType2 + (i * 2),
all_exits_[i].door_type_2_))
RETURN_IF_ERROR(rom()->RunTransaction(
WriteAction{OWExitRoomId + (i * 2), all_exits_[i].room_id_},
WriteAction{OWExitMapId + i, all_exits_[i].map_id_},
WriteAction{OWExitVram + (i * 2), all_exits_[i].map_pos_},
WriteAction{OWExitYScroll + (i * 2), all_exits_[i].y_scroll_},
WriteAction{OWExitXScroll + (i * 2), all_exits_[i].x_scroll_},
WriteAction{OWExitYPlayer + (i * 2), all_exits_[i].y_player_},
WriteAction{OWExitXPlayer + (i * 2), all_exits_[i].x_player_},
WriteAction{OWExitYCamera + (i * 2), all_exits_[i].y_camera_},
WriteAction{OWExitXCamera + (i * 2), all_exits_[i].x_camera_},
WriteAction{OWExitUnk1 + i, all_exits_[i].scroll_mod_y_},
WriteAction{OWExitUnk2 + i, all_exits_[i].scroll_mod_x_},
WriteAction{OWExitDoorType1 + (i * 2), all_exits_[i].door_type_1_},
WriteAction{OWExitDoorType2 + (i * 2), all_exits_[i].door_type_2_}))
}
return absl::OkStatus();
@@ -952,35 +941,39 @@ void Overworld::LoadExits() {
std::vector<OverworldExit> exits;
for (int i = 0; i < NumberOfOverworldExits; i++) {
auto rom_data = rom()->data();
ushort exit_room_id = (ushort)((rom_data[OWExitRoomId + (i * 2) + 1] << 8) +
rom_data[OWExitRoomId + (i * 2)]);
ushort exit_map_id = rom_data[OWExitMapId + i];
ushort exit_vram = (ushort)((rom_data[OWExitVram + (i * 2) + 1] << 8) +
rom_data[OWExitVram + (i * 2)]);
ushort exit_y_scroll =
(ushort)((rom_data[OWExitYScroll + (i * 2) + 1] << 8) +
rom_data[OWExitYScroll + (i * 2)]);
ushort exit_x_scroll =
(ushort)((rom_data[OWExitXScroll + (i * 2) + 1] << 8) +
rom_data[OWExitXScroll + (i * 2)]);
uint16_t exit_room_id;
uint16_t exit_map_id;
uint16_t exit_vram;
uint16_t exit_y_scroll;
uint16_t exit_x_scroll;
uint16_t exit_y_player;
uint16_t exit_x_player;
uint16_t exit_y_camera;
uint16_t exit_x_camera;
uint16_t exit_scroll_mod_y;
uint16_t exit_scroll_mod_x;
uint16_t exit_door_type_1;
uint16_t exit_door_type_2;
rom()->ReadTransaction(
exit_room_id, (OWExitRoomId + (i * 2)),
exit_map_id, OWExitMapId + i,
exit_vram, OWExitVram + (i * 2),
exit_y_scroll, OWExitYScroll + (i * 2),
exit_x_scroll, OWExitXScroll + (i * 2),
exit_y_player, OWExitYPlayer + (i * 2),
exit_x_player, OWExitXPlayer + (i * 2),
exit_y_camera, OWExitYCamera + (i * 2),
exit_x_camera, OWExitXCamera + (i * 2),
exit_scroll_mod_y, OWExitUnk1 + i,
exit_scroll_mod_x, OWExitUnk2 + i,
exit_door_type_1, OWExitDoorType1 + (i * 2),
exit_door_type_2, OWExitDoorType2 + (i * 2));
ushort py = (ushort)((rom_data[OWExitYPlayer + (i * 2) + 1] << 8) +
rom_data[OWExitYPlayer + (i * 2)]);
ushort px = (ushort)((rom_data[OWExitXPlayer + (i * 2) + 1] << 8) +
rom_data[OWExitXPlayer + (i * 2)]);
ushort exit_y_camera =
(ushort)((rom_data[OWExitYCamera + (i * 2) + 1] << 8) +
rom_data[OWExitYCamera + (i * 2)]);
ushort exit_x_camera =
(ushort)((rom_data[OWExitXCamera + (i * 2) + 1] << 8) +
rom_data[OWExitXCamera + (i * 2)]);
ushort exit_scroll_mod_y = rom_data[OWExitUnk1 + i];
ushort exit_scroll_mod_x = rom_data[OWExitUnk2 + i];
ushort exit_door_type_1 =
(ushort)((rom_data[OWExitDoorType1 + (i * 2) + 1] << 8) +
rom_data[OWExitDoorType1 + (i * 2)]);
ushort exit_door_type_2 =
(ushort)((rom_data[OWExitDoorType2 + (i * 2) + 1] << 8) +
rom_data[OWExitDoorType2 + (i * 2)]);
OverworldExit exit(exit_room_id, exit_map_id, exit_vram, exit_y_scroll,
exit_x_scroll, py, px, exit_y_camera, exit_x_camera,
exit_scroll_mod_y, exit_scroll_mod_x, exit_door_type_1,
@@ -1065,6 +1058,46 @@ void Overworld::LoadSpritesFromMap(int spriteStart, int spriteCount,
}
}
absl::Status Overworld::SaveMapProperties() {
for (int i = 0; i < 64; i++) {
RETURN_IF_ERROR(rom()->RunTransaction(
WriteAction{mapGfx + i, overworld_maps_[i].area_graphics()},
WriteAction{overworldSpriteset + i,
overworld_maps_[i].sprite_graphics(0)},
WriteAction{overworldSpriteset + 64 + i,
overworld_maps_[i].sprite_graphics(1)},
WriteAction{overworldSpriteset + 128 + i,
overworld_maps_[i].sprite_graphics(2)},
WriteAction{overworldMapPalette + i, overworld_maps_[i].area_palette()},
WriteAction{overworldSpritePalette + i,
overworld_maps_[i].sprite_palette(0)},
WriteAction{overworldSpritePalette + 64 + i,
overworld_maps_[i].sprite_palette(1)},
WriteAction{overworldSpritePalette + 128 + i,
overworld_maps_[i].sprite_palette(2)}))
}
for (int i = 64; i < 128; i++) {
RETURN_IF_ERROR(rom()->RunTransaction(
WriteAction{mapGfx + i, overworld_maps_[i].area_graphics()},
WriteAction{overworldSpriteset + i,
overworld_maps_[i].sprite_graphics(0)},
WriteAction{overworldSpriteset + 64 + i,
overworld_maps_[i].sprite_graphics(1)},
WriteAction{overworldSpriteset + 128 + i,
overworld_maps_[i].sprite_graphics(2)},
WriteAction{overworldMapPalette + i, overworld_maps_[i].area_palette()},
WriteAction{overworldSpritePalette + 64 + i,
overworld_maps_[i].sprite_palette(0)},
WriteAction{overworldSpritePalette + 128 + i,
overworld_maps_[i].sprite_palette(1)},
WriteAction{overworldSpritePalette + 192 + i,
overworld_maps_[i].sprite_palette(2)}))
}
return absl::OkStatus();
}
absl::Status Overworld::LoadPrototype(ROM &rom,
const std::string &tilemap_filename) {
rom_ = rom;