Move Overworld constants to Overworld

This commit is contained in:
scawful
2023-08-25 19:43:20 -04:00
parent 1305e9de19
commit 037667bb21
7 changed files with 265 additions and 362 deletions

View File

@@ -142,14 +142,8 @@ constexpr int Uncompressed3BPPSize = 0x0600;
constexpr int UncompressedSheetSize = 0x0800;
constexpr int NumberOfSheets = 223;
constexpr int LimitOfMap32 = 8864;
constexpr int NumberOfRooms = 296;
constexpr int kNumOverworldMaps = 160;
constexpr int Map32PerScreen = 256;
constexpr int NumberOfMap16 = 3752; // 4096
constexpr int NumberOfMap32 = Map32PerScreen * kNumOverworldMaps;
constexpr int NumberOfOWSprites = 352;
constexpr int NumberOfColors = 3143;
// ============================================================================
@@ -162,7 +156,6 @@ constexpr int subtype1_tiles = 0x8000; // JP = Same
constexpr int subtype2_tiles = 0x83F0; // JP = Same
constexpr int subtype3_tiles = 0x84F0; // JP = Same
constexpr int gfx_animated_pointer = 0x10275; // JP 0x10624 //long pointer
constexpr int overworldgfxGroups2 = 0x6073; // 0x60B3
constexpr int hud_palettes = 0xDD660;
constexpr int maxGfx = 0xC3FB5;
@@ -171,129 +164,6 @@ constexpr int kTilesheetWidth = 128;
constexpr int kTilesheetHeight = 32;
constexpr int kTilesheetDepth = 8;
// ============================================================================
// Overworld Related Variables
// ============================================================================
constexpr int compressedAllMap32PointersHigh = 0x1794D;
constexpr int compressedAllMap32PointersLow = 0x17B2D;
constexpr int overworldgfxGroups = 0x05D97;
constexpr int map16Tiles = 0x78000;
constexpr int map32TilesTL = 0x18000;
constexpr int map32TilesTR = 0x1B400;
constexpr int map32TilesBL = 0x20000;
constexpr int map32TilesBR = 0x23400;
constexpr int overworldPalGroup1 = 0xDE6C8;
constexpr int overworldPalGroup2 = 0xDE86C;
constexpr int overworldPalGroup3 = 0xDE604;
constexpr int overworldMapPalette = 0x7D1C;
constexpr int overworldSpritePalette = 0x7B41;
constexpr int overworldMapPaletteGroup = 0x75504;
constexpr int overworldSpritePaletteGroup = 0x75580;
constexpr int overworldSpriteset = 0x7A41;
constexpr int overworldSpecialGFXGroup = 0x16821;
constexpr int overworldSpecialPALGroup = 0x16831;
constexpr int overworldSpritesBegining = 0x4C881;
constexpr int overworldSpritesAgahnim = 0x4CA21;
constexpr int overworldSpritesZelda = 0x4C901;
constexpr int overworldItemsPointers = 0xDC2F9;
constexpr int overworldItemsAddress = 0xDC8B9; // 1BC2F9
constexpr int overworldItemsBank = 0xDC8BF;
constexpr int overworldItemsEndData = 0xDC89C; // 0DC89E
constexpr int mapGfx = 0x7C9C;
constexpr int overlayPointers = 0x77664;
constexpr int overlayPointersBank = 0x0E;
constexpr int overworldTilesType = 0x71459;
constexpr int overworldMessages = 0x3F51D;
constexpr int overworldMusicBegining = 0x14303;
constexpr int overworldMusicZelda = 0x14303 + 0x40;
constexpr int overworldMusicMasterSword = 0x14303 + 0x80;
constexpr int overworldMusicAgahim = 0x14303 + 0xC0;
constexpr int overworldMusicDW = 0x14403;
constexpr int overworldEntranceAllowedTilesLeft = 0xDB8C1;
constexpr int overworldEntranceAllowedTilesRight = 0xDB917;
// 0x00 = small maps, 0x20 = large maps
constexpr int overworldMapSize = 0x12844;
// 0x01 = small maps, 0x03 = large maps
constexpr int overworldMapSizeHighByte = 0x12884;
// relative to the WORLD + 0x200 per map
// large map that are not == parent id = same position as their parent!
// eg for X position small maps :
// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
// all Large map would be :
// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
constexpr int overworldMapParentId = 0x125EC;
constexpr int overworldTransitionPositionY = 0x128C4;
constexpr int overworldTransitionPositionX = 0x12944;
constexpr int overworldScreenSize = 0x1788D;
constexpr int OverworldScreenSizeForLoading = 0x4C635;
constexpr int OverworldScreenTileMapChangeByScreen = 0x12634;
constexpr int transition_target_north = 0x13ee2;
constexpr int transition_target_west = 0x13f62;
constexpr int overworldCustomMosaicASM = 0x1301D0;
constexpr int overworldCustomMosaicArray = 0x1301F0;
// ============================================================================
// Overworld Exits/Entrances Variables
// ============================================================================
constexpr int OWExitRoomId = 0x15D8A; // 0x15E07 Credits sequences
// 105C2 Ending maps
// 105E2 Sprite Group Table for Ending
constexpr int OWExitMapId = 0x15E28;
constexpr int OWExitVram = 0x15E77;
constexpr int OWExitYScroll = 0x15F15;
constexpr int OWExitXScroll = 0x15FB3;
constexpr int OWExitYPlayer = 0x16051;
constexpr int OWExitXPlayer = 0x160EF;
constexpr int OWExitYCamera = 0x1618D;
constexpr int OWExitXCamera = 0x1622B;
constexpr int OWExitDoorPosition = 0x15724;
constexpr int OWExitUnk1 = 0x162C9;
constexpr int OWExitUnk2 = 0x16318;
constexpr int OWExitDoorType1 = 0x16367;
constexpr int OWExitDoorType2 = 0x16405;
constexpr int OWEntranceMap = 0xDB96F;
constexpr int OWEntrancePos = 0xDBA71;
constexpr int OWEntranceEntranceId = 0xDBB73;
constexpr int OWHolePos = 0xDB800; //(0x13 entries, 2 bytes each) modified(less
// 0x400) map16 coordinates for each hole
constexpr int OWHoleArea =
0xDB826; //(0x13 entries, 2 bytes each) corresponding
// area numbers for each hole
constexpr int OWHoleEntrance =
0xDB84C; //(0x13 entries, 1 byte each) corresponding entrance numbers
constexpr int OWExitMapIdWhirlpool = 0x16AE5; // JP = ;016849
constexpr int OWExitVramWhirlpool = 0x16B07; // JP = ;01686B
constexpr int OWExitYScrollWhirlpool = 0x16B29; // JP = ;01688D
constexpr int OWExitXScrollWhirlpool = 0x16B4B; // JP = ;016DE7
constexpr int OWExitYPlayerWhirlpool = 0x16B6D; // JP = ;016E09
constexpr int OWExitXPlayerWhirlpool = 0x16B8F; // JP = ;016E2B
constexpr int OWExitYCameraWhirlpool = 0x16BB1; // JP = ;016E4D
constexpr int OWExitXCameraWhirlpool = 0x16BD3; // JP = ;016E6F
constexpr int OWExitUnk1Whirlpool = 0x16BF5; // JP = ;016E91
constexpr int OWExitUnk2Whirlpool = 0x16C17; // JP = ;016EB3
constexpr int OWWhirlpoolPosition = 0x16CF8; // JP = ;016F94
// ============================================================================
// Dungeon Related Variables
// ============================================================================

View File

@@ -347,7 +347,7 @@ absl::Status OverworldEditor::LoadGraphics() {
}
// Render the overworld maps loaded from the ROM.
for (int i = 0; i < core::kNumOverworldMaps; ++i) {
for (int i = 0; i < zelda3::kNumOverworldMaps; ++i) {
overworld_.SetCurrentMap(i);
auto palette = overworld_.AreaPalette();
core::BuildAndRenderBitmapPipeline(0x200, 0x200, 0x200,

View File

@@ -32,33 +32,9 @@ void ScreenEditor::Update() {
DrawNamingScreenEditor();
DrawOverworldMapEditor();
DrawDungeonMapsEditor();
DrawMosaicEditor();
END_TAB_BAR()
}
void ScreenEditor::DrawWorldGrid(int world, int h, int w) {
const float time = (float)ImGui::GetTime();
int i = 0;
if (world == 1) {
i = 64;
} else if (world == 2) {
i = 128;
}
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++) {
if (x > 0) ImGui::SameLine();
ImGui::PushID(y * 4 + x);
std::string label = absl::StrCat(" #", absl::StrFormat("%x", i));
if (ImGui::Selectable(label.c_str(), mosaic_tiles_[i] != 0, 0,
ImVec2(35, 25))) {
mosaic_tiles_[i] ^= 1;
}
ImGui::PopID();
i++;
}
}
void ScreenEditor::DrawInventoryMenuEditor() {
TAB_ITEM("Inventory Menu")
@@ -117,30 +93,6 @@ void ScreenEditor::DrawDungeonMapsEditor() {
END_TAB_ITEM()
}
void ScreenEditor::DrawMosaicEditor() {
TAB_ITEM("Mosaic Transitions")
if (ImGui::BeginTable("Worlds", 3, ImGuiTableFlags_Borders)) {
ImGui::TableSetupColumn("Light World");
ImGui::TableSetupColumn("Dark World");
ImGui::TableSetupColumn("Special World");
ImGui::TableHeadersRow();
ImGui::TableNextColumn();
DrawWorldGrid(0);
ImGui::TableNextColumn();
DrawWorldGrid(1);
ImGui::TableNextColumn();
DrawWorldGrid(2, 4);
ImGui::EndTable();
}
END_TAB_ITEM()
}
void ScreenEditor::DrawToolset() {
static bool show_bg1 = true;
static bool show_bg2 = true;

View File

@@ -19,15 +19,12 @@ namespace yaze {
namespace app {
namespace editor {
using MosaicArray = std::array<int, core::kNumOverworldMaps>;
class ScreenEditor : public SharedROM {
public:
ScreenEditor();
void Update();
private:
void DrawMosaicEditor();
void DrawTitleScreenEditor();
void DrawNamingScreenEditor();
void DrawOverworldMapEditor();
@@ -36,9 +33,6 @@ class ScreenEditor : public SharedROM {
void DrawToolset();
void DrawInventoryToolset();
void DrawWorldGrid(int world, int h = 8, int w = 8);
char mosaic_tiles_[core::kNumOverworldMaps];
Bytes all_gfx_;
zelda3::Inventory inventory_;

View File

@@ -44,7 +44,7 @@ absl::Status Overworld::Load(ROM &rom) {
AssembleMap16Tiles();
RETURN_IF_ERROR(DecompressAllMapTiles())
for (int map_index = 0; map_index < core::kNumOverworldMaps; ++map_index)
for (int map_index = 0; map_index < kNumOverworldMaps; ++map_index)
overworld_maps_.emplace_back(map_index, rom_, tiles16);
FetchLargeMaps();
@@ -52,7 +52,7 @@ absl::Status Overworld::Load(ROM &rom) {
auto size = tiles16.size();
std::vector<std::future<absl::Status>> futures;
for (int i = 0; i < core::kNumOverworldMaps; ++i) {
for (int i = 0; i < kNumOverworldMaps; ++i) {
futures.push_back(std::async(std::launch::async, [this, i, size]() {
if (i < 64) {
return overworld_maps_[i].BuildMap(size, game_state_, 0, map_parent_,
@@ -91,157 +91,145 @@ absl::Status Overworld::SaveOverworldMaps() {
int parentxPos = overworld_maps_[i].Parent() % 8;
// Always write the map parent since it should not matter
rom_.Write(core::overworldMapParentId + i, overworld_maps_[i].Parent());
rom_.Write(overworldMapParentId + i, overworld_maps_[i].Parent());
// If it's large then save parent pos *
// 0x200 otherwise pos * 0x200
if (overworld_maps_[i].IsLargeMap()) {
// Check 1
rom_.Write(core::overworldMapSize + i, 0x20);
rom_.Write(core::overworldMapSize + i + 1, 0x20);
rom_.Write(core::overworldMapSize + i + 8, 0x20);
rom_.Write(core::overworldMapSize + i + 9, 0x20);
rom_.Write(overworldMapSize + i, 0x20);
rom_.Write(overworldMapSize + i + 1, 0x20);
rom_.Write(overworldMapSize + i + 8, 0x20);
rom_.Write(overworldMapSize + i + 9, 0x20);
// Check 2
rom_.Write(core::overworldMapSizeHighByte + i, 0x03);
rom_.Write(core::overworldMapSizeHighByte + i + 1, 0x03);
rom_.Write(core::overworldMapSizeHighByte + i + 8, 0x03);
rom_.Write(core::overworldMapSizeHighByte + i + 9, 0x03);
rom_.Write(overworldMapSizeHighByte + i, 0x03);
rom_.Write(overworldMapSizeHighByte + i + 1, 0x03);
rom_.Write(overworldMapSizeHighByte + i + 8, 0x03);
rom_.Write(overworldMapSizeHighByte + i + 9, 0x03);
// Check 3
rom_.Write(core::overworldScreenSize + i, 0x00);
rom_.Write(core::overworldScreenSize + i + 64, 0x00);
rom_.Write(overworldScreenSize + i, 0x00);
rom_.Write(overworldScreenSize + i + 64, 0x00);
rom_.Write(core::overworldScreenSize + i + 1, 0x00);
rom_.Write(core::overworldScreenSize + i + 1 + 64, 0x00);
rom_.Write(overworldScreenSize + i + 1, 0x00);
rom_.Write(overworldScreenSize + i + 1 + 64, 0x00);
rom_.Write(core::overworldScreenSize + i + 8, 0x00);
rom_.Write(core::overworldScreenSize + i + 8 + 64, 0x00);
rom_.Write(overworldScreenSize + i + 8, 0x00);
rom_.Write(overworldScreenSize + i + 8 + 64, 0x00);
rom_.Write(core::overworldScreenSize + i + 9, 0x00);
rom_.Write(core::overworldScreenSize + i + 9 + 64, 0x00);
rom_.Write(overworldScreenSize + i + 9, 0x00);
rom_.Write(overworldScreenSize + i + 9 + 64, 0x00);
// Check 4
rom_.Write(core::OverworldScreenSizeForLoading + i, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 64, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 128, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 64, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 128, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 1, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 1 + 64, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 1 + 128, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 1, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 1 + 64, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 1 + 128, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 8, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 8 + 64, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 8 + 128, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 8, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 8 + 64, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 8 + 128, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 9, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 9 + 64, 0x04);
rom_.Write(core::OverworldScreenSizeForLoading + i + 9 + 128, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 9, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 9 + 64, 0x04);
rom_.Write(OverworldScreenSizeForLoading + i + 9 + 128, 0x04);
// Check 5 and 6
rom_.WriteShort(
core::transition_target_north + (i * 2) + 2,
transition_target_north + (i * 2) + 2,
(short)((parentyPos * 0x200) -
0xE0)); // (short) is placed to reduce the int to 2 bytes.
rom_.WriteShort(core::transition_target_west + (i * 2) + 2,
rom_.WriteShort(transition_target_west + (i * 2) + 2,
(short)((parentxPos * 0x200) - 0x100));
rom_.WriteShort(
core::transition_target_north + (i * 2) + 16,
transition_target_north + (i * 2) + 16,
(short)((parentyPos * 0x200) -
0xE0)); // (short) is placed to reduce the int to 2 bytes.
rom_.WriteShort(core::transition_target_west + (i * 2) + 16,
rom_.WriteShort(transition_target_west + (i * 2) + 16,
(short)((parentxPos * 0x200) - 0x100));
rom_.WriteShort(
core::transition_target_north + (i * 2) + 18,
transition_target_north + (i * 2) + 18,
(short)((parentyPos * 0x200) -
0xE0)); // (short) is placed to reduce the int to 2 bytes.
rom_.WriteShort(core::transition_target_west + (i * 2) + 18,
rom_.WriteShort(transition_target_west + (i * 2) + 18,
(short)((parentxPos * 0x200) - 0x100));
// Check 7 and 8
rom_.WriteShort(core::overworldTransitionPositionX + (i * 2),
rom_.WriteShort(overworldTransitionPositionX + (i * 2),
(parentxPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionY + (i * 2),
rom_.WriteShort(overworldTransitionPositionY + (i * 2),
(parentyPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionX + (i * 2) + 2,
rom_.WriteShort(overworldTransitionPositionX + (i * 2) + 2,
(parentxPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionY + (i * 2) + 2,
rom_.WriteShort(overworldTransitionPositionY + (i * 2) + 2,
(parentyPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionX + (i * 2) + 16,
rom_.WriteShort(overworldTransitionPositionX + (i * 2) + 16,
(parentxPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionY + (i * 2) + 16,
rom_.WriteShort(overworldTransitionPositionY + (i * 2) + 16,
(parentyPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionX + (i * 2) + 18,
rom_.WriteShort(overworldTransitionPositionX + (i * 2) + 18,
(parentxPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionY + (i * 2) + 18,
rom_.WriteShort(overworldTransitionPositionY + (i * 2) + 18,
(parentyPos * 0x200));
// Check 9
rom_.WriteShort(core::OverworldScreenTileMapChangeByScreen + (i * 2),
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2),
0x0060); // Always 0x0060
rom_.WriteShort(core::OverworldScreenTileMapChangeByScreen + (i * 2) + 2,
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 2,
0x0060); // Always 0x0060
// If parentX == 0 then lower submaps == 0x0060 too
if (parentxPos == 0) {
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 16, 0x0060);
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 18, 0x0060);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 16,
0x0060);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 18,
0x0060);
} else {
// Otherwise lower submaps == 0x1060
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 16, 0x1060);
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 18, 0x1060);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 16,
0x1060);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 18,
0x1060);
}
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 128,
0x0080); // Always 0x0080
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 2 + 128,
0x0080); // Always 0x0080
// Lower are always 8010
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 16 + 128,
0x1080); // Always 0x1080
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 18 + 128,
0x1080); // Always 0x1080
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 128,
0x0080); // Always 0x0080
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 2 + 128,
0x0080); // Always 0x0080
// Lower are always 8010
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 16 + 128,
0x1080); // Always 0x1080
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 18 + 128,
0x1080); // Always 0x1080
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 256,
0x1800); // Always 0x1800
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 16 + 256,
0x1800); // Always 0x1800
// Right side is always 1840
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 2 + 256,
0x1840); // Always 0x1840
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 18 + 256,
0x1840); // Always 0x1840
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 256,
0x1800); // Always 0x1800
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 16 + 256,
0x1800); // Always 0x1800
// Right side is always 1840
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 2 + 256,
0x1840); // Always 0x1840
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 18 + 256,
0x1840); // Always 0x1840
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 384,
0x2000); // Always 0x2000
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 16 + 384,
0x2000); // Always 0x2000
// Right side is always 0x2040
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 2 + 384,
0x2040); // Always 0x2000
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 18 + 384,
0x2040); // Always 0x2000
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 384,
0x2000); // Always 0x2000
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 16 + 384,
0x2000); // Always 0x2000
// Right side is always 0x2040
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 2 + 384,
0x2040); // Always 0x2000
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 18 + 384,
0x2040); // Always 0x2000
// checkedMap.Add((uchar)i);
// checkedMap.Add((uchar)(i + 1));
@@ -249,34 +237,31 @@ absl::Status Overworld::SaveOverworldMaps() {
// checkedMap.Add((uchar)(i + 9));
} else {
rom_.Write(core::overworldMapSize + i, 0x00);
rom_.Write(core::overworldMapSizeHighByte + i, 0x01);
rom_.Write(overworldMapSize + i, 0x00);
rom_.Write(overworldMapSizeHighByte + i, 0x01);
rom_.Write(core::overworldScreenSize + i, 0x01);
rom_.Write(core::overworldScreenSize + i + 64, 0x01);
rom_.Write(overworldScreenSize + i, 0x01);
rom_.Write(overworldScreenSize + i + 64, 0x01);
rom_.Write(core::OverworldScreenSizeForLoading + i, 0x02);
rom_.Write(core::OverworldScreenSizeForLoading + i + 64, 0x02);
rom_.Write(core::OverworldScreenSizeForLoading + i + 128, 0x02);
rom_.Write(OverworldScreenSizeForLoading + i, 0x02);
rom_.Write(OverworldScreenSizeForLoading + i + 64, 0x02);
rom_.Write(OverworldScreenSizeForLoading + i + 128, 0x02);
rom_.WriteShort(core::OverworldScreenTileMapChangeByScreen + (i * 2),
0x0060);
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 128, 0x0040);
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 256, 0x1800);
rom_.WriteShort(
core::OverworldScreenTileMapChangeByScreen + (i * 2) + 384, 0x1000);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2), 0x0060);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 128,
0x0040);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 256,
0x1800);
rom_.WriteShort(OverworldScreenTileMapChangeByScreen + (i * 2) + 384,
0x1000);
rom_.WriteShort(core::transition_target_north + (i * 2),
rom_.WriteShort(transition_target_north + (i * 2),
(short)((yPos * 0x200) - 0xE0));
rom_.WriteShort(core::transition_target_west + (i * 2),
rom_.WriteShort(transition_target_west + (i * 2),
(short)((xPos * 0x200) - 0x100));
rom_.WriteShort(core::overworldTransitionPositionX + (i * 2),
(xPos * 0x200));
rom_.WriteShort(core::overworldTransitionPositionY + (i * 2),
(yPos * 0x200));
rom_.WriteShort(overworldTransitionPositionX + (i * 2), (xPos * 0x200));
rom_.WriteShort(overworldTransitionPositionY + (i * 2), (yPos * 0x200));
// checkedMap.Add((uchar)i);
}
@@ -287,9 +272,9 @@ absl::Status Overworld::SaveOverworldMaps() {
// ----------------------------------------------------------------------------
void Overworld::SaveMap16Tiles() {
int tpos = core::map16Tiles;
int tpos = kMap16Tiles;
// 3760
for (int i = 0; i < core::NumberOfMap16; i += 1) {
for (int i = 0; i < NumberOfMap16; i += 1) {
rom_.WriteShort(tpos, TileInfoToShort(tiles16[i].tile0_));
tpos += 2;
rom_.WriteShort(tpos, TileInfoToShort(tiles16[i].tile1_));
@@ -373,7 +358,7 @@ void Overworld::AssembleMap32Tiles() {
// ----------------------------------------------------------------------------
void Overworld::AssembleMap16Tiles() {
int tpos = core::map16Tiles;
int tpos = kMap16Tiles;
for (int i = 0; i < 4096; i += 1) {
auto t0 = gfx::GetTilesInfo(rom_.toint16(tpos));
tpos += 2;
@@ -541,9 +526,9 @@ void Overworld::FetchLargeMaps() {
void Overworld::LoadEntrances() {
for (int i = 0; i < 129; i++) {
short mapId = rom_.toint16(core::OWEntranceMap + (i * 2));
ushort mapPos = rom_.toint16(core::OWEntrancePos + (i * 2));
uchar entranceId = (rom_[core::OWEntranceEntranceId + i]);
short mapId = rom_.toint16(OWEntranceMap + (i * 2));
ushort mapPos = rom_.toint16(OWEntrancePos + (i * 2));
uchar entranceId = (rom_[OWEntranceEntranceId + i]);
int p = mapPos >> 1;
int x = (p % 64);
int y = (p >> 6);
@@ -558,11 +543,11 @@ void Overworld::LoadEntrances() {
}
for (int i = 0; i < 0x13; i++) {
auto mapId = (short)((rom_[core::OWHoleArea + (i * 2) + 1] << 8) +
(rom_[core::OWHoleArea + (i * 2)]));
auto mapPos = (short)((rom_[core::OWHolePos + (i * 2) + 1] << 8) +
(rom_[core::OWHolePos + (i * 2)]));
uchar entranceId = (rom_[core::OWHoleEntrance + i]);
auto mapId = (short)((rom_[OWHoleArea + (i * 2) + 1] << 8) +
(rom_[OWHoleArea + (i * 2)]));
auto mapPos = (short)((rom_[OWHolePos + (i * 2) + 1] << 8) +
(rom_[OWHolePos + (i * 2)]));
uchar entranceId = (rom_[OWHoleEntrance + i]);
int p = (mapPos + 0x400) >> 1;
int x = (p % 64);
int y = (p >> 6);
@@ -592,9 +577,9 @@ void Overworld::LoadSprites() {
all_sprites_[2].emplace_back();
}
LoadSpritesFromMap(core::overworldSpritesBegining, 64, 0);
LoadSpritesFromMap(core::overworldSpritesZelda, 144, 1);
LoadSpritesFromMap(core::overworldSpritesAgahnim, 144, 2);
LoadSpritesFromMap(overworldSpritesBegining, 64, 0);
LoadSpritesFromMap(overworldSpritesZelda, 144, 1);
LoadSpritesFromMap(overworldSpritesAgahnim, 144, 2);
}
// ----------------------------------------------------------------------------
@@ -642,7 +627,7 @@ absl::Status Overworld::LoadPrototype(ROM &rom, std::vector<uint8_t> &tilemap,
AssembleMap16Tiles();
RETURN_IF_ERROR(DecompressAllMapTiles())
for (int map_index = 0; map_index < core::kNumOverworldMaps; ++map_index)
for (int map_index = 0; map_index < kNumOverworldMaps; ++map_index)
overworld_maps_.emplace_back(map_index, rom_, tiles16);
FetchLargeMaps();
@@ -650,7 +635,7 @@ absl::Status Overworld::LoadPrototype(ROM &rom, std::vector<uint8_t> &tilemap,
auto size = tiles16.size();
std::vector<std::future<absl::Status>> futures;
for (int i = 0; i < core::kNumOverworldMaps; ++i) {
for (int i = 0; i < kNumOverworldMaps; ++i) {
futures.push_back(std::async(std::launch::async, [this, i, size]() {
if (i < 64) {
return overworld_maps_[i].BuildMap(size, game_state_, 0, map_parent_,

View File

@@ -19,6 +19,45 @@ namespace yaze {
namespace app {
namespace zelda3 {
constexpr int OWExitRoomId = 0x15D8A; // 0x15E07 Credits sequences
// 105C2 Ending maps
// 105E2 Sprite Group Table for Ending
constexpr int OWExitMapId = 0x15E28;
constexpr int OWExitVram = 0x15E77;
constexpr int OWExitYScroll = 0x15F15;
constexpr int OWExitXScroll = 0x15FB3;
constexpr int OWExitYPlayer = 0x16051;
constexpr int OWExitXPlayer = 0x160EF;
constexpr int OWExitYCamera = 0x1618D;
constexpr int OWExitXCamera = 0x1622B;
constexpr int OWExitDoorPosition = 0x15724;
constexpr int OWExitUnk1 = 0x162C9;
constexpr int OWExitUnk2 = 0x16318;
constexpr int OWExitDoorType1 = 0x16367;
constexpr int OWExitDoorType2 = 0x16405;
constexpr int OWEntranceMap = 0xDB96F;
constexpr int OWEntrancePos = 0xDBA71;
constexpr int OWEntranceEntranceId = 0xDBB73;
constexpr int OWHolePos = 0xDB800; //(0x13 entries, 2 bytes each) modified(less
// 0x400) map16 coordinates for each hole
constexpr int OWHoleArea =
0xDB826; //(0x13 entries, 2 bytes each) corresponding
// area numbers for each hole
constexpr int OWHoleEntrance =
0xDB84C; //(0x13 entries, 1 byte each) corresponding entrance numbers
constexpr int OWExitMapIdWhirlpool = 0x16AE5; // JP = ;016849
constexpr int OWExitVramWhirlpool = 0x16B07; // JP = ;01686B
constexpr int OWExitYScrollWhirlpool = 0x16B29; // JP = ;01688D
constexpr int OWExitXScrollWhirlpool = 0x16B4B; // JP = ;016DE7
constexpr int OWExitYPlayerWhirlpool = 0x16B6D; // JP = ;016E09
constexpr int OWExitXPlayerWhirlpool = 0x16B8F; // JP = ;016E2B
constexpr int OWExitYCameraWhirlpool = 0x16BB1; // JP = ;016E4D
constexpr int OWExitXCameraWhirlpool = 0x16BD3; // JP = ;016E6F
constexpr int OWExitUnk1Whirlpool = 0x16BF5; // JP = ;016E91
constexpr int OWExitUnk2Whirlpool = 0x16C17; // JP = ;016EB3
constexpr int OWWhirlpoolPosition = 0x16CF8; // JP = ;016F94
class OverworldEntrance {
public:
int x_;
@@ -68,6 +107,70 @@ class OverworldEntrance {
}
};
constexpr int compressedAllMap32PointersHigh = 0x1794D;
constexpr int compressedAllMap32PointersLow = 0x17B2D;
constexpr int overworldgfxGroups = 0x05D97;
constexpr int overworldPalGroup1 = 0xDE6C8;
constexpr int overworldPalGroup2 = 0xDE86C;
constexpr int overworldPalGroup3 = 0xDE604;
constexpr int overworldMapPalette = 0x7D1C;
constexpr int overworldSpritePalette = 0x7B41;
constexpr int overworldMapPaletteGroup = 0x75504;
constexpr int overworldSpritePaletteGroup = 0x75580;
constexpr int overworldSpriteset = 0x7A41;
constexpr int overworldSpecialGFXGroup = 0x16821;
constexpr int overworldSpecialPALGroup = 0x16831;
constexpr int overworldSpritesBegining = 0x4C881;
constexpr int overworldSpritesAgahnim = 0x4CA21;
constexpr int overworldSpritesZelda = 0x4C901;
constexpr int overworldItemsPointers = 0xDC2F9;
constexpr int overworldItemsAddress = 0xDC8B9; // 1BC2F9
constexpr int overworldItemsBank = 0xDC8BF;
constexpr int overworldItemsEndData = 0xDC89C; // 0DC89E
constexpr int mapGfx = 0x7C9C;
constexpr int overlayPointers = 0x77664;
constexpr int overlayPointersBank = 0x0E;
constexpr int overworldTilesType = 0x71459;
constexpr int overworldMessages = 0x3F51D;
constexpr int overworldMusicBegining = 0x14303;
constexpr int overworldMusicZelda = 0x14303 + 0x40;
constexpr int overworldMusicMasterSword = 0x14303 + 0x80;
constexpr int overworldMusicAgahim = 0x14303 + 0xC0;
constexpr int overworldMusicDW = 0x14403;
constexpr int overworldEntranceAllowedTilesLeft = 0xDB8C1;
constexpr int overworldEntranceAllowedTilesRight = 0xDB917;
// 0x00 = small maps, 0x20 = large maps
constexpr int overworldMapSize = 0x12844;
// 0x01 = small maps, 0x03 = large maps
constexpr int overworldMapSizeHighByte = 0x12884;
// relative to the WORLD + 0x200 per map
// large map that are not == parent id = same position as their parent!
// eg for X position small maps :
// 0000, 0200, 0400, 0600, 0800, 0A00, 0C00, 0E00
// all Large map would be :
// 0000, 0000, 0400, 0400, 0800, 0800, 0C00, 0C00
constexpr int overworldMapParentId = 0x125EC;
constexpr int overworldTransitionPositionY = 0x128C4;
constexpr int overworldTransitionPositionX = 0x12944;
constexpr int overworldScreenSize = 0x1788D;
constexpr int OverworldScreenSizeForLoading = 0x4C635;
constexpr int OverworldScreenTileMapChangeByScreen = 0x12634;
constexpr int transition_target_north = 0x13ee2;
constexpr int transition_target_west = 0x13f62;
constexpr int overworldCustomMosaicASM = 0x1301D0;
constexpr int overworldCustomMosaicArray = 0x1301F0;
constexpr int kMap16Tiles = 0x78000;
constexpr int kNumOverworldMaps = 160;
constexpr int Map32PerScreen = 256;
constexpr int NumberOfMap16 = 3752; // 4096
constexpr int LimitOfMap32 = 8864;
constexpr int NumberOfOWSprites = 352;
constexpr int NumberOfMap32 = Map32PerScreen * kNumOverworldMaps;
class Overworld {
public:
absl::Status Load(ROM &rom);

View File

@@ -12,6 +12,7 @@
#include "app/gfx/bitmap.h"
#include "app/gfx/snes_tile.h"
#include "app/rom.h"
#include "app/zelda3/overworld.h"
namespace yaze {
namespace app {
@@ -164,15 +165,14 @@ absl::Status OverworldMap::BuildMap(int count, int game_state, int world,
parent_ = map_parent[index_];
if (parent_ != index_ && !initialized_) {
if (index_ >= 0x80 && index_ <= 0x8A && index_ != 0x88) {
area_graphics_ =
rom_[core::overworldSpecialGFXGroup + (parent_ - 0x80)];
area_palette_ = rom_[core::overworldSpecialPALGroup + 1];
area_graphics_ = rom_[overworldSpecialGFXGroup + (parent_ - 0x80)];
area_palette_ = rom_[overworldSpecialPALGroup + 1];
} else if (index_ == 0x88) {
area_graphics_ = 0x51;
area_palette_ = 0x00;
} else {
area_graphics_ = rom_[core::mapGfx + parent_];
area_palette_ = rom_[core::overworldMapPalette + parent_];
area_graphics_ = rom_[mapGfx + parent_];
area_palette_ = rom_[overworldMapPalette + parent_];
}
initialized_ = true;
@@ -190,37 +190,37 @@ absl::Status OverworldMap::BuildMap(int count, int game_state, int world,
void OverworldMap::LoadAreaInfo() {
if (index_ != 0x80 && index_ <= 150 &&
rom_[core::overworldMapSize + (index_ & 0x3F)] != 0) {
rom_[overworldMapSize + (index_ & 0x3F)] != 0) {
large_map_ = true;
}
if (index_ < 64) {
area_graphics_ = rom_[core::mapGfx + parent_];
area_palette_ = rom_[core::overworldMapPalette + parent_];
area_graphics_ = rom_[mapGfx + parent_];
area_palette_ = rom_[overworldMapPalette + parent_];
area_music_[0] = rom_[core::overworldMusicBegining + parent_];
area_music_[1] = rom_[core::overworldMusicZelda + parent_];
area_music_[2] = rom_[core::overworldMusicMasterSword + parent_];
area_music_[3] = rom_[core::overworldMusicAgahim + parent_];
area_music_[0] = rom_[overworldMusicBegining + parent_];
area_music_[1] = rom_[overworldMusicZelda + parent_];
area_music_[2] = rom_[overworldMusicMasterSword + parent_];
area_music_[3] = rom_[overworldMusicAgahim + parent_];
sprite_graphics_[0] = rom_[core::overworldSpriteset + parent_];
sprite_graphics_[1] = rom_[core::overworldSpriteset + parent_ + 0x40];
sprite_graphics_[2] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[0] = rom_[overworldSpriteset + parent_];
sprite_graphics_[1] = rom_[overworldSpriteset + parent_ + 0x40];
sprite_graphics_[2] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_palette_[0] = rom_[core::overworldSpritePalette + parent_];
sprite_palette_[1] = rom_[core::overworldSpritePalette + parent_ + 0x40];
sprite_palette_[2] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[0] = rom_[overworldSpritePalette + parent_];
sprite_palette_[1] = rom_[overworldSpritePalette + parent_ + 0x40];
sprite_palette_[2] = rom_[overworldSpritePalette + parent_ + 0x80];
} else if (index_ < 0x80) {
area_graphics_ = rom_[core::mapGfx + parent_];
area_palette_ = rom_[core::overworldMapPalette + parent_];
area_music_[0] = rom_[core::overworldMusicDW + (parent_ - 64)];
area_graphics_ = rom_[mapGfx + parent_];
area_palette_ = rom_[overworldMapPalette + parent_];
area_music_[0] = rom_[overworldMusicDW + (parent_ - 64)];
sprite_graphics_[0] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[1] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[2] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[0] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_graphics_[1] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_graphics_[2] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_palette_[0] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[1] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[2] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[0] = rom_[overworldSpritePalette + parent_ + 0x80];
sprite_palette_[1] = rom_[overworldSpritePalette + parent_ + 0x80];
sprite_palette_[2] = rom_[overworldSpritePalette + parent_ + 0x80];
} else {
if (index_ == 0x94) {
parent_ = 0x80;
@@ -242,28 +242,28 @@ void OverworldMap::LoadAreaInfo() {
parent_ = 0x88;
}
area_palette_ = rom_[core::overworldSpecialPALGroup + parent_ - 0x80];
area_palette_ = rom_[overworldSpecialPALGroup + parent_ - 0x80];
if (index_ >= 0x80 && index_ <= 0x8A && index_ != 0x88) {
area_graphics_ = rom_[core::overworldSpecialGFXGroup + (parent_ - 0x80)];
area_palette_ = rom_[core::overworldSpecialPALGroup + 1];
area_graphics_ = rom_[overworldSpecialGFXGroup + (parent_ - 0x80)];
area_palette_ = rom_[overworldSpecialPALGroup + 1];
} else if (index_ == 0x88) {
area_graphics_ = 0x51;
area_palette_ = 0x00;
} else {
// pyramid bg use 0x5B map
area_graphics_ = rom_[core::mapGfx + parent_];
area_palette_ = rom_[core::overworldMapPalette + parent_];
area_graphics_ = rom_[mapGfx + parent_];
area_palette_ = rom_[overworldMapPalette + parent_];
}
message_id_ = rom_[core::overworldMessages + parent_];
message_id_ = rom_[overworldMessages + parent_];
sprite_graphics_[0] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[1] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[2] = rom_[core::overworldSpriteset + parent_ + 0x80];
sprite_graphics_[0] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_graphics_[1] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_graphics_[2] = rom_[overworldSpriteset + parent_ + 0x80];
sprite_palette_[0] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[1] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[2] = rom_[core::overworldSpritePalette + parent_ + 0x80];
sprite_palette_[0] = rom_[overworldSpritePalette + parent_ + 0x80];
sprite_palette_[1] = rom_[overworldSpritePalette + parent_ + 0x80];
sprite_palette_[2] = rom_[overworldSpritePalette + parent_ + 0x80];
}
}
@@ -344,10 +344,9 @@ gfx::SNESPalette OverworldMap::GetPalette(const std::string& group, int index,
}
void OverworldMap::LoadPalette() {
int previousPalId =
index_ > 0 ? rom_[core::overworldMapPalette + parent_ - 1] : 0;
int previousPalId = index_ > 0 ? rom_[overworldMapPalette + parent_ - 1] : 0;
int previousSprPalId =
index_ > 0 ? rom_[core::overworldSpritePalette + parent_ - 1] : 0;
index_ > 0 ? rom_[overworldSpritePalette + parent_ - 1] : 0;
area_palette_ = std::min(area_palette_, 0xA3);
@@ -358,9 +357,9 @@ void OverworldMap::LoadPalette() {
(area_palette_ * 4) + 1];
uchar pal3 = rom_[rom_.GetVersionConstants().overworldMapPaletteGroup +
(area_palette_ * 4) + 2];
uchar pal4 = rom_[core::overworldSpritePaletteGroup +
(sprite_palette_[game_state_] * 2)];
uchar pal5 = rom_[core::overworldSpritePaletteGroup +
uchar pal4 =
rom_[overworldSpritePaletteGroup + (sprite_palette_[game_state_] * 2)];
uchar pal5 = rom_[overworldSpritePaletteGroup +
(sprite_palette_[game_state_] * 2) + 1];
gfx::SNESColor bgr = rom_.GetPaletteGroup("grass")[0].GetColor(0);
@@ -379,7 +378,7 @@ void OverworldMap::LoadPalette() {
} else if (parent_ >= 0x40 && parent_ < 0x80) {
pal0 = parent_ == 0x43 || parent_ == 0x45 || parent_ == 0x47 ? 3 : 1;
bgr = rom_.GetPaletteGroup("grass")[0].GetColor(1);
} else if (parent_ >= 128 && parent_ < core::kNumOverworldMaps) {
} else if (parent_ >= 128 && parent_ < kNumOverworldMaps) {
pal0 = 0;
bgr = rom_.GetPaletteGroup("grass")[0].GetColor(2);
}