Add ROM::ReadTransaction for bulk reads and cleanup Overworld class
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user