From a6fb58dba1f4df99b6cf7b88cbd799b0772c3c7b Mon Sep 17 00:00:00 2001 From: Justin Scofield Date: Sat, 11 Jun 2022 16:01:55 -0400 Subject: [PATCH] Bunch of updates refactoring adding some sneshacking code some gui stuff --- src/Application/Core/Constants.h | 2345 +++++++++++---------- src/Application/Data/Overworld.cc | 4 +- src/Application/Editor/Editor.cc | 40 +- src/Application/Editor/Editor.h | 12 +- src/Application/Editor/OverworldEditor.cc | 72 +- src/Application/Editor/OverworldEditor.h | 30 +- src/Application/Graphics/Bitmap.cc | 200 +- src/Application/Graphics/Bitmap.h | 9 +- src/Application/Graphics/Tile.cc | 61 +- src/Application/Utils/ROM.cc | 8 +- src/Application/Utils/ROM.h | 7 +- 11 files changed, 1544 insertions(+), 1244 deletions(-) diff --git a/src/Application/Core/Constants.h b/src/Application/Core/Constants.h index 102cdcc1..68ab0e92 100644 --- a/src/Application/Core/Constants.h +++ b/src/Application/Core/Constants.h @@ -9,1167 +9,1188 @@ namespace Application { namespace Core { namespace Constants { - // =========================================================================================== - // Graphics - // =========================================================================================== - - constexpr int tile_address = 0x1B52; // JP = Same - constexpr int tile_address_floor = 0x1B5A; // JP = Same - 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 gfx_1_pointer = 0x6790; //2byte pointer bank 00 pc -> 0x4320 CF80 ; 004F80 - constexpr int gfx_2_pointer = 0x6795; //D05F ; 00505F - constexpr int gfx_3_pointer = 0x679A; //D13E ; 00513E - constexpr int hud_palettes = 0xDD660; - constexpr int maxGfx = 0xC3FB5; - - // =========================================================================================== - // 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; - - //TODO: - 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; - - constexpr int overworldMapSize = 0x12844; //0x00 = small maps, 0x20 = large maps - constexpr int overworldMapSizeHighByte = 0x12884; //0x01 = small maps, 0x03 = large maps - - //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 overworldTransitionPositionY = 0x128C4; - constexpr int overworldTransitionPositionX = 0x12944; - - constexpr int overworldScreenSize = 0x1788D; - - //=========================================================================================== - //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 - //=========================================================================================== - //That could be turned into a pointer : - constexpr int dungeons_palettes_groups = 0x75460; //JP 0x67DD0 - constexpr int dungeons_main_bg_palette_pointers = 0xDEC4B; //JP Same - constexpr int dungeons_palettes = 0xDD734; //JP Same (where all dungeons palettes are) - - //That could be turned into a pointer : - constexpr int room_items_pointers = 0xDB69;//JP 0xDB67 - - constexpr int rooms_sprite_pointer = 0x4C298; //JP Same //2byte bank 09D62E - constexpr int room_header_pointer = 0xB5DD; //LONG - constexpr int room_header_pointers_bank = 0xB5E7; //JP Same - - constexpr int gfx_groups_pointer = 0x6237; - constexpr int room_object_layout_pointer = 0x882D; - - constexpr int room_object_pointer = 0x874C; //Long pointer - - constexpr int chests_length_pointer = 0xEBF6; - constexpr int chests_data_pointer1 = 0xEBFB; - //constexpr int chests_data_pointer2 = 0xEC0A; //Disabled for now could be used for expansion - //constexpr int chests_data_pointer3 = 0xEC10; //Disabled for now could be used for expansion - - constexpr int blocks_length = 0x8896; //word value - constexpr int blocks_pointer1 = 0x15AFA; - constexpr int blocks_pointer2 = 0x15B01; - constexpr int blocks_pointer3 = 0x15B08; - constexpr int blocks_pointer4 = 0x15B0F; - - constexpr int torch_data = 0x2736A; //JP 0x2704A - constexpr int torches_length_pointer = 0x88C1; - - constexpr int sprite_blockset_pointer = 0x5B57; - constexpr int sprites_data = 0x4D8B0;//It use the unused pointers to have more space //Save purpose - constexpr int sprites_data_empty_room = 0x4D8AE; - constexpr int sprites_end_data = 0x4EC9E; - - constexpr int pit_pointer = 0x394AB; - constexpr int pit_count = 0x394A6; - - constexpr int doorPointers = 0xF83C0; - - //doors - constexpr int door_gfx_up = 0x4D9E; - // - constexpr int door_gfx_down = 0x4E06; - constexpr int door_gfx_cavexit_down = 0x4E06; - constexpr int door_gfx_left = 0x4E66; - constexpr int door_gfx_right = 0x4EC6; - - constexpr int door_pos_up = 0x197E; - constexpr int door_pos_down = 0x1996; - constexpr int door_pos_left = 0x19AE; - constexpr int door_pos_right = 0x19C6; - - //TEXT EDITOR RELATED CONSTANTS - constexpr int gfx_font = 0x70000; //2bpp format - constexpr int text_data = 0xE0000; - constexpr int text_data2 = 0x75F40; - constexpr int pointers_dictionaries = 0x74703; - constexpr int characters_width = 0x74ADF; - - //=========================================================================================== - //Dungeon Entrances Related Variables - //=========================================================================================== - constexpr int entrance_room = 0x14813; //0x14577 //word value for each room - constexpr int entrance_scrolledge = 0x1491D; //0x14681 //8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR - constexpr int entrance_yscroll = 0x14D45; // 0x14AA9 //2bytes each room - constexpr int entrance_xscroll = 0x14E4F; // 0x14BB3 //2bytes - constexpr int entrance_yposition = 0x14F59; //0x14CBD 2bytes - constexpr int entrance_xposition = 0x15063;// 0x14DC7 2bytes - constexpr int entrance_camerayposition = 0x1516D;// 0x14ED1 2bytes - constexpr int entrance_cameraxposition = 0x15277;// 0x14FDB 2bytes - - constexpr int entrance_gfx_group = 0x5D97; - constexpr int entrance_blockset = 0x15381; //0x150E5 1byte - constexpr int entrance_floor = 0x15406; // 0x1516A 1byte - constexpr int entrance_dungeon = 0x1548B; // 0x151EF 1byte (dungeon id) - constexpr int entrance_door = 0x15510; // 0x15274 1byte - constexpr int entrance_ladderbg = 0x15595; //0x152F9 //1 byte, ---b ---a b = bg2, a = need to check -_- - constexpr int entrance_scrolling = 0x1561A;//0x1537E //1byte --h- --v- - constexpr int entrance_scrollquadrant = 0x1569F; //0x15403 1byte - constexpr int entrance_exit = 0x15724; //0x15488 //2byte word - constexpr int entrance_music = 0x1582E; //0x15592 - - constexpr int startingentrance_room = 0x15B6E; //0x158D2 //word value for each room - constexpr int startingentrance_scrolledge = 0x15B7C; //0x158E0 //8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR - constexpr int startingentrance_yscroll = 0x15BB4; // 0x14AA9 //2bytes each room - constexpr int startingentrance_xscroll = 0x15BC2; // 0x14BB3 //2bytes - constexpr int startingentrance_yposition = 0x15BD0; //0x14CBD 2bytes - constexpr int startingentrance_xposition = 0x15BDE;// 0x14DC7 2bytes - constexpr int startingentrance_camerayposition = 0x15BEC;// 0x14ED1 2bytes - constexpr int startingentrance_cameraxposition = 0x15BFA;// 0x14FDB 2bytes - - constexpr int startingentrance_blockset = 0x15C08; //0x150E5 1byte - constexpr int startingentrance_floor = 0x15C0F; // 0x1516A 1byte - constexpr int startingentrance_dungeon = 0x15C16; // 0x151EF 1byte (dungeon id) - - constexpr int startingentrance_door = 0x15C2B; // 0x15274 1byte - - constexpr int startingentrance_ladderbg = 0x15C1D; //0x152F9 //1 byte, ---b ---a b = bg2, a = need to check -_- - constexpr int startingentrance_scrolling = 0x15C24;//0x1537E //1byte --h- --v- - constexpr int startingentrance_scrollquadrant = 0x15C2B; //0x15403 1byte - constexpr int startingentrance_exit = 0x15C32; //0x15488 //2byte word - constexpr int startingentrance_music = 0x15C4E; //0x15592 - constexpr int startingentrance_entrance = 0x15C40; - - constexpr int items_data_start = 0xDDE9; //save purpose - constexpr int items_data_end = 0xE6B2; //save purpose - constexpr int initial_equipement = 0x271A6; - constexpr int messages_id_dungeon = 0x3F61D; - - constexpr int chests_backupitems = 0x3B528; //item id you get instead if you already have that item - constexpr int chests_yoffset = 0x4836C; - constexpr int chests_xoffset = 0x4836C + (76 * 1); - constexpr int chests_itemsgfx = 0x4836C + (76 * 2); - constexpr int chests_itemswide = 0x4836C + (76 * 3); - constexpr int chests_itemsproperties = 0x4836C + (76 * 4); - constexpr int chests_sramaddress = 0x4836C + (76 * 5); - constexpr int chests_sramvalue = 0x4836C + (76 * 7); - constexpr int chests_msgid = 0x442DD; - - constexpr int dungeons_startrooms = 0x7939; - constexpr int dungeons_endrooms = 0x792D; - constexpr int dungeons_bossrooms = 0x10954;//short value - - //Bed Related Values (Starting location) - - constexpr int bedPositionX = 0x039A37; //short value - constexpr int bedPositionY = 0x039A32; //short value - - constexpr int bedPositionResetXLow = 0x02DE53; //short value(on 2 different bytes) - constexpr int bedPositionResetXHigh = 0x02DE58; //^^^^^^ - - constexpr int bedPositionResetYLow = 0x02DE5D; //short value(on 2 different bytes) - constexpr int bedPositionResetYHigh = 0x02DE62;//^^^^^^ - - constexpr int bedSheetPositionX = 0x0480BD; //short value - constexpr int bedSheetPositionY = 0x0480B8; //short value - - //=========================================================================================== - //Gravestones related variables - //=========================================================================================== - - constexpr int GravesYTilePos = 0x49968; //short (0x0F entries) - constexpr int GravesXTilePos = 0x49986; //short (0x0F entries) - constexpr int GravesTilemapPos = 0x499A4; //short (0x0F entries) - constexpr int GravesGFX = 0x499C2; //short (0x0F entries) - - constexpr int GravesXPos = 0x4994A; //short (0x0F entries) - constexpr int GravesYLine = 0x4993A; //short (0x08 entries) - constexpr int GravesCountOnY = 0x499E0; //Byte 0x09 entries - - constexpr int GraveLinkSpecialHole = 0x46DD9; //short - constexpr int GraveLinkSpecialStairs = 0x46DE0; //short - - //=========================================================================================== - //Palettes Related Variables - This contain all the palettes of the game - //=========================================================================================== - constexpr int overworldPaletteMain = 0xDE6C8; - constexpr int overworldPaletteAuxialiary = 0xDE86C; - constexpr int overworldPaletteAnimated = 0xDE604; - constexpr int globalSpritePalettesLW = 0xDD218; - constexpr int globalSpritePalettesDW = 0xDD290; - constexpr int armorPalettes = 0xDD308; // Green, Blue, Red, Bunny, Electrocuted (15 colors each) - constexpr int spritePalettesAux1 = 0xDD39E; // 7 colors each - constexpr int spritePalettesAux2 = 0xDD446; // 7 colors each - constexpr int spritePalettesAux3 = 0xDD4E0; // 7 colors each - constexpr int swordPalettes = 0xDD630; // 3 colors each - 4 entries - constexpr int shieldPalettes = 0xDD648; // 4 colors each - 3 entries - constexpr int hudPalettes = 0xDD660; - constexpr int dungeonMapPalettes = 0xDD70A; // 21 colors - constexpr int dungeonMainPalettes = 0xDD734; //(15*6) colors each - 20 entries - constexpr int dungeonMapBgPalettes = 0xDE544; // 16*6 - constexpr int hardcodedGrassLW = 0x5FEA9; // Mirrored Value at 0x75645 : 0x75625 - constexpr int hardcodedGrassDW = 0x05FEB3; // 0x7564F - constexpr int hardcodedGrassSpecial = 0x75640; - - //=========================================================================================== - //Dungeon Map Related Variables - //=========================================================================================== - constexpr int dungeonMap_rooms_ptr = 0x57605; //14 pointers of map data - constexpr int dungeonMap_floors = 0x575D9; //14 words values - - constexpr int dungeonMap_gfx_ptr = 0x57BE4; //14 pointers of gfx data - constexpr int dungeonMap_datastart = 0x57039; //data start for floors/gfx MUST skip 575D9 to 57621 (pointers) - - - constexpr int dungeonMap_expCheck = 0x56652; //IF Byte = 0xB9 dungeon maps are not expanded - constexpr int dungeonMap_tile16 = 0x57009; - constexpr int dungeonMap_tile16Exp = 0x109010; - constexpr int dungeonMap_bossrooms = 0x56807; //14 words values 0x000F = no boss - - constexpr int triforceVertices = 0x04FFD2; //group of 3, X, Y ,Z - constexpr int TriforceFaces = 0x04FFE4; //group of 5 - - constexpr int crystalVertices = 0x04FF98; - - //=========================================================================================== - // Names - //=========================================================================================== - static const std::string RoomEffect[] = - { - "Nothing", - "Nothing", - "Moving Floor", - "Moving Water", - "Trinexx Shell", - "Red Flashes", - "Light Torch to See Floor", - "Ganon's Darkness" - }; - - static const std::string RoomTag[] = - { - "Nothing", - - "NW Kill Enemy to Open", - "NE Kill Enemy to Open", - "SW Kill Enemy to Open", - "SE Kill Enemy to Open", - "W Kill Enemy to Open", - "E Kill Enemy to Open", - "N Kill Enemy to Open", - "S Kill Enemy to Open", - "Clear Quadrant to Open", - "Clear Full Tile to Open", - - "NW Push Block to Open", - "NE Push Block to Open", - "SW Push Block to Open", - "SE Push Block to Open", - "W Push Block to Open", - "E Push Block to Open", - "N Push Block to Open", - "S Push Block to Open", - "Push Block to Open", - "Pull Lever to Open", - "Collect Prize to Open", - - "Hold Switch Open Door", - "Toggle Switch to Open Door", - "Turn off Water", - "Turn on Water", - "Water Gate", - "Water Twin", - "Moving Wall Right", - "Moving Wall Left", - "Crash", - "Crash", - "Push Switch Exploding Wall", - "Holes 0", - "Open Chest (Holes 0)", - "Holes 1", - "Holes 2", - "Defeat Boss for Dungeon Prize", - - "SE Kill Enemy to Push Block", - "Trigger Switch Chest", - "Pull Lever Exploding Wall", - "NW Kill Enemy for Chest", - "NE Kill Enemy for Chest", - "SW Kill Enemy for Chest", - "SE Kill Enemy for Chest", - "W Kill Enemy for Chest", - "E Kill Enemy for Chest", - "N Kill Enemy for Chest", - "S Kill Enemy for Chest", - "Clear Quadrant for Chest", - "Clear Full Tile for Chest", - - "Light Torches to Open", - "Holes 3", - "Holes 4", - "Holes 5", - "Holes 6", - "Agahnim Room", - "Holes 7", - "Holes 8", - "Open Chest for Holes 8", - "Push Block for Chest", - "Clear Room for Triforce Door", - "Light Torches for Chest", - "Kill Boss Again" - }; - - static const std::string SecretItemNames[] = - { - "Nothing", - "Green Rupee", - "Rock hoarder", - "Bee", - "Health pack", - "Bomb", - "Heart ", - "Blue Rupee", - - "Key", - "Arrow", - "Bomb", - "Heart", - "Magic", - "Full Magic", - "Cucco", - "Green Soldier", - "Bush Stal", - "Blue Soldier", - - "Landmine", - "Heart", - "Fairy", - "Heart", - "Nothing ", //22 - - "Hole", - "Warp", - "Staircase", - "Bombable", - "Switch" - }; - - - static const std::string Type1RoomObjectNames[] = - { - "Ceiling ↔", - "Wall (top, north) ↔", - "Wall (top, south) ↔", - "Wall (bottom, north) ↔", - "Wall (bottom, south) ↔", - "Wall columns (north) ↔", - "Wall columns (south) ↔", - "Deep wall (north) ↔", - "Deep wall (south) ↔", - "Diagonal wall A ◤ (top) ↔", - "Diagonal wall A ◣ (top) ↔", - "Diagonal wall A ◥ (top) ↔", - "Diagonal wall A ◢ (top) ↔", - "Diagonal wall B ◤ (top) ↔", - "Diagonal wall B ◣ (top) ↔", - "Diagonal wall B ◥ (top) ↔", - "Diagonal wall B ◢ (top) ↔", - "Diagonal wall C ◤ (top) ↔", - "Diagonal wall C ◣ (top) ↔", - "Diagonal wall C ◥ (top) ↔", - "Diagonal wall C ◢ (top) ↔", - "Diagonal wall A ◤ (bottom) ↔", - "Diagonal wall A ◣ (bottom) ↔", - "Diagonal wall A ◥ (bottom) ↔", - "Diagonal wall A ◢ (bottom) ↔", - "Diagonal wall B ◤ (bottom) ↔", - "Diagonal wall B ◣ (bottom) ↔", - "Diagonal wall B ◥ (bottom) ↔", - "Diagonal wall B ◢ (bottom) ↔", - "Diagonal wall C ◤ (bottom) ↔", - "Diagonal wall C ◣ (bottom) ↔", - "Diagonal wall C ◥ (bottom) ↔", - "Diagonal wall C ◢ (bottom) ↔", - "Platform stairs ↔", - "Rail ↔", - "Pit edge ┏━┓ A (north) ↔", - "Pit edge ┏━┓ B (north) ↔", - "Pit edge ┏━┓ C (north) ↔", - "Pit edge ┏━┓ D (north) ↔", - "Pit edge ┏━┓ E (north) ↔", - "Pit edge ┗━┛ (south) ↔", - "Pit edge ━━━ (south) ↔", - "Pit edge ━━━ (north) ↔", - "Pit edge ━━┛ (south) ↔", - "Pit edge ┗━━ (south) ↔", - "Pit edge ━━┓ (north) ↔", - "Pit edge ┏━━ (north) ↔", - "Rail wall (north) ↔", - "Rail wall (south) ↔", - "Nothing", - "Nothing", - "Carpet ↔", - "Carpet trim ↔", - "Weird door", // TODO: WEIRD DOOR OBJECT NEEDS INVESTIGATION - "Drapes (north) ↔", - "Drapes (west, odd) ↔", - "Statues ↔", - "Columns ↔", - "Wall decors (north) ↔", - "Wall decors (south) ↔", - "Chairs in pairs ↔", - "Tall torches ↔", - "Supports (north) ↔", - "Water edge ┏━┓ (concave) ↔", - "Water edge ┗━┛ (concave) ↔", - "Water edge ┏━┓ (convex) ↔", - "Water edge ┗━┛ (convex) ↔", - "Water edge ┏━┛ (concave) ↔", - "Water edge ┗━┓ (concave) ↔", - "Water edge ┗━┓ (convex) ↔", - "Water edge ┏━┛ (convex) ↔", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Supports (south) ↔", - "Bar ↔", - "Shelf A ↔", - "Shelf B ↔", - "Shelf C ↔", - "Somaria path ↔", - "Cannon hole A (north) ↔", - "Cannon hole A (south) ↔", - "Pipe path ↔", - "Nothing", - "Wall torches (north) ↔", - "Wall torches (south) ↔", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Cannon hole B (north) ↔", - "Cannon hole B (south) ↔", - "Thick rail ↔", - "Blocks ↔", - "Long rail ↔", - "Ceiling ↕", - "Wall (top, west) ↕", - "Wall (top, east) ↕", - "Wall (bottom, west) ↕", - "Wall (bottom, east) ↕", - "Wall columns (west) ↕", - "Wall columns (east) ↕", - "Deep wall (west) ↕", - "Deep wall (east) ↕", - "Rail ↕", - "Pit edge (west) ↕", - "Pit edge (east) ↕", - "Rail wall (west) ↕", - "Rail wall (east) ↕", - "Nothing", - "Nothing", - "Carpet ↕", - "Carpet trim ↕", - "Nothing", - "Drapes (west) ↕", - "Drapes (east) ↕", - "Columns ↕", - "Wall decors (west) ↕", - "Wall decors (east) ↕", - "Supports (west) ↕", - "Water edge (west) ↕", - "Water edge (east) ↕", - "Supports (east) ↕", - "Somaria path ↕", - "Pipe path ↕", - "Nothing", - "Wall torches (west) ↕", - "Wall torches (east) ↕", - "Wall decors tight A (west) ↕", - "Wall decors tight A (east) ↕", - "Wall decors tight B (west) ↕", - "Wall decors tight B (east) ↕", - "Cannon hole (west) ↕", - "Cannon hole (east) ↕", - "Tall torches ↕", - "Thick rail ↕", - "Blocks ↕", - "Long rail ↕", - "Jump ledge (west) ↕", - "Jump ledge (east) ↕", - "Rug trim (west) ↕", - "Rug trim (east) ↕", - "Bar ↕", - "Wall flair (west) ↕", - "Wall flair (east) ↕", - "Blue pegs ↕", - "Orange pegs ↕", - "Invisible floor ↕", - "Fake pots ↕", - "Hammer pegs ↕", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Diagonal ceiling A ◤", - "Diagonal ceiling A ◣", - "Diagonal ceiling A ◥", - "Diagonal ceiling A ◢", - "Pit ⇲", - "Diagonal layer 2 mask A ◤", - "Diagonal layer 2 mask A ◣", - "Diagonal layer 2 mask A ◥", - "Diagonal layer 2 mask A ◢", - "Diagonal layer 2 mask B ◤", // TODO: VERIFY - "Diagonal layer 2 mask B ◣", // TODO: VERIFY - "Diagonal layer 2 mask B ◥", // TODO: VERIFY - "Diagonal layer 2 mask B ◢", // TODO: VERIFY - "Nothing", - "Nothing", - "Nothing", - "Jump ledge (north) ↔", - "Jump ledge (south) ↔", - "Rug ↔", - "Rug trim (north) ↔", - "Rug trim (south) ↔", - "Archery game curtains ↔", - "Wall flair (north) ↔", - "Wall flair (south) ↔", - "Blue pegs ↔", - "Orange pegs ↔", - "Invisible floor ↔", - "Fake pressure plates ↔", - "Fake pots ↔", - "Hammer pegs ↔", - "Nothing", - "Nothing", - "Ceiling (large) ⇲", - "Chest platform (tall) ⇲", - "Layer 2 pit mask (large) ⇲", - "Layer 2 pit mask (medium) ⇲", - "Floor 1 ⇲", - "Floor 3 ⇲", - "Layer 2 mask (large) ⇲", - "Floor 4 ⇲", - "Water floor ⇲ ", - "Flood water (medium) ⇲ ", - "Conveyor floor ⇲ ", - "Nothing", - "Nothing", - "Moving wall (west) ⇲", - "Moving wall (east) ⇲", - "Nothing", - "Nothing", - "Icy floor A ⇲", - "Icy floor B ⇲", - "Moving wall flag", // TODO: WTF IS THIS? - "Moving wall flag", // TODO: WTF IS THIS? - "Moving wall flag", // TODO: WTF IS THIS? - "Moving wall flag", // TODO: WTF IS THIS? - "Layer 2 mask (medium) ⇲", - "Flood water (large) ⇲", - "Layer 2 swim mask ⇲", - "Flood water B (large) ⇲", - "Floor 2 ⇲", - "Chest platform (short) ⇲", - "Table / rock ⇲", - "Spike blocks ⇲", - "Spiked floor ⇲", - "Floor 7 ⇲", - "Tiled floor ⇲", - "Rupee floor ⇲", - "Conveyor upwards ⇲", - "Conveyor downwards ⇲", - "Conveyor leftwards ⇲", - "Conveyor rightwards ⇲", - "Heavy current water ⇲", - "Floor 10 ⇲", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - "Nothing", - }; - - static const std::string Type2RoomObjectNames[] = - { - "Corner (top, concave) ▛", - "Corner (top, concave) ▙", - "Corner (top, concave) ▜", - "Corner (top, concave) ▟", - "Corner (top, convex) ▟", - "Corner (top, convex) ▜", - "Corner (top, convex) ▙", - "Corner (top, convex) ▛", - "Corner (bottom, concave) ▛", - "Corner (bottom, concave) ▙", - "Corner (bottom, concave) ▜", - "Corner (bottom, concave) ▟", - "Corner (bottom, convex) ▟", - "Corner (bottom, convex) ▜", - "Corner (bottom, convex) ▙", - "Corner (bottom, convex) ▛", - "Kinked corner north (bottom) ▜", - "Kinked corner south (bottom) ▟", - "Kinked corner north (bottom) ▛", - "Kinked corner south (bottom) ▙", - "Kinked corner west (bottom) ▙", - "Kinked corner west (bottom) ▛", - "Kinked corner east (bottom) ▟", - "Kinked corner east (bottom) ▜", - "Deep corner (concave) ▛", - "Deep corner (concave) ▙", - "Deep corner (concave) ▜", - "Deep corner (concave) ▟", - "Large brazier", - "Statue", - "Star tile (disabled)", - "Star tile (enabled)", - "Small torch (lit)", - "Barrel", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Table", - "Fairy statue", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Chair", - "Bed", - "Fireplace", - "Mario portrait", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Interroom stairs (up)", - "Interroom stairs (down)", - "Interroom stairs B (down)", - "Intraroom stairs north B", // TODO: VERIFY LAYER HANDLING - "Intraroom stairs north (separate layers)", - "Intraroom stairs north (merged layers)", - "Intraroom stairs north (swim layer)", - "Block", - "Water ladder (north)", - "Water ladder (south)", // TODO: NEEDS IN GAME VERIFICATION - "Dam floodgate", - "Interroom spiral stairs up (top)", - "Interroom spiral stairs down (top)", - "Interroom spiral stairs up (bottom)", - "Interroom spiral stairs down (bottom)", - "Sanctuary wall (north)", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Pew", - "Magic bat altar", - }; - - - - static const std::string Type3RoomObjectNames[] = - { - "Waterfall face (empty)", - "Waterfall face (short)", - "Waterfall face (long)", - "Somaria path endpoint", - "Somaria path intersection ╋", - "Somaria path corner ┏", - "Somaria path corner ┗", - "Somaria path corner ┓", - "Somaria path corner ┛", - "Somaria path intersection ┳", - "Somaria path intersection ┻", - "Somaria path intersection ┣", - "Somaria path intersection ┫", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Somaria path 2-way endpoint", - "Somaria path crossover", - "Babasu hole (north)", - "Babasu hole (south)", - "9 blue rupees", - "Telepathy tile", - "Warp door", // TODO: NEEDS IN GAME VERIFICATION THAT THIS IS USELESS - "Kholdstare's shell", - "Hammer peg", - "Prison cell", - "Big key lock", - "Chest", - "Chest (open)", - "Intraroom stairs south", // TODO: VERIFY LAYER HANDLING - "Intraroom stairs south (separate layers)", - "Intraroom stairs south (merged layers)", - "Interroom straight stairs up (north, top)", - "Interroom straight stairs down (north, top)", - "Interroom straight stairs up (south, top)", - "Interroom straight stairs down (south, top)", - "Deep corner (convex) ▟", - "Deep corner (convex) ▜", - "Deep corner (convex) ▙", - "Deep corner (convex) ▛", - "Interroom straight stairs up (north, bottom)", - "Interroom straight stairs down (north, bottom)", - "Interroom straight stairs up (south, bottom)", - "Interroom straight stairs down (south, bottom)", - "Lamp cones", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Liftable large block", - "Agahnim's altar", - "Agahnim's boss room", - "Pot", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Big chest", - "Big chest (open)", - "Intraroom stairs south (swim layer)", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Pipe end (south)", - "Pipe end (north)", - "Pipe end (east)", - "Pipe end (west)", - "Pipe corner ▛", - "Pipe corner ▙", - "Pipe corner ▜", - "Pipe corner ▟", - "Pipe-rock intersection ⯊", - "Pipe-rock intersection ⯋", - "Pipe-rock intersection ◖", - "Pipe-rock intersection ◗", - "Pipe crossover", - "Bombable floor", - "Fake bombable floor", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Warp tile", - "Tool rack", - "Furnace", - "Tub (wide)", - "Anvil", - "Warp tile (disabled)", - "Pressure plate", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Blue peg", - "Orange peg", - "Fortune teller room", - "Unknown", // TODO: NEEDS IN GAME CHECKING - "Bar corner ▛", - "Bar corner ▙", - "Bar corner ▜", - "Bar corner ▟", - "Decorative bowl", - "Tub (tall)", - "Bookcase", - "Range", - "Suitcase", - "Bar bottles", - "Arrow game hole (west)", - "Arrow game hole (east)", - "Vitreous goo graphics", - "Fake pressure plate", - "Medusa head", - "4-way shooter block", - "Pit", - "Wall crack (north)", - "Wall crack (south)", - "Wall crack (west)", - "Wall crack (east)", - "Large decor", - "Water grate (north)", - "Water grate (south)", - "Water grate (west)", - "Water grate (east)", - "Window sunlight", - "Floor sunlight", - "Trinexx's shell", - "Layer 2 mask (full)", - "Boss entrance", - "Minigame chest", - "Ganon door", - "Triforce wall ornament", - "Triforce floor tiles", - "Freezor hole", - "Pile of bones", - "Vitreous goo damage", - "Arrow tile ↑", - "Arrow tile ↓", - "Arrow tile →", - "Nothing", - }; - - static const std::string TileTypeNames[] = - { - "$00 Nothing (standard floor)", - "$01 Collision", - "$02 Collision", - "$03 Collision", - "$04 Collision", - "$05 Nothing (unused?)", - "$06 Nothing (unused?)", - "$07 Nothing (unused?)", - "$08 Deep water", - "$09 Shallow water", - "$0A Unknown? Possibly unused", - "$0B Collision (different in Overworld and unknown)", - "$0C Overlay mask", - "$0D Spike floor", - "$0E GT ice", - "$0F Ice palace ice", - "$10 Slope ◤", - "$11 Slope ◥", - "$12 Slope ◣", - "$13 Slope ◢", - "$14 Nothing (unused?)", - "$15 Nothing (unused?)", - "$16 Nothing (unused?)", - "$17 Nothing (unused?)", - "$18 Slope ◤", - "$19 Slope ◥", - "$1A Slope ◣", - "$1B Slope ◢", - "$1C Layer 2 overlay", - "$1D North single-layer auto stairs", - "$1E North layer-swap auto stairs", - "$1F North layer-swap auto stairs", - "$20 Pit", - "$21 Nothing (unused?)", - "$22 Manual stairs", - "$23 Pot switch", - "$24 Pressure switch", - "$25 Nothing (unused but referenced by somaria blocks)", - "$26 Collision (near stairs?)", - "$27 Brazier/Fence/Statue/Block/General hookable things", - "$28 North ledge", - "$29 South ledge", - "$2A East ledge", - "$2B West ledge", - "$2C ◤ ledge", - "$2D ◣ ledge", - "$2E ◥ ledge", - "$2F ◢ ledge", - "$30 Straight inter-room stairs south/up 0", - "$31 Straight inter-room stairs south/up 1", - "$32 Straight inter-room stairs south/up 2", - "$33 Straight inter-room stairs south/up 3", - "$34 Straight inter-room stairs north/down 0", - "$35 Straight inter-room stairs north/down 1", - "$36 Straight inter-room stairs north/down 2", - "$37 Straight inter-room stairs north/down 3", - "$38 Straight inter-room stairs north/down edge", - "$39 Straight inter-room stairs south/up edge", - "$3A Star tile (inactive on load)", - "$3B Star tile (active on load)", - "$3C Nothing (unused?)", - "$3D South single-layer auto stairs", - "$3E South layer-swap auto stairs", - "$3F South layer-swap auto stairs", - "$40 Thick grass", - "$41 Nothing (unused?)", - "$42 Gravestone / Tower of hera ledge shadows??", - "$43 Skull Woods entrance/Hera columns???", - "$44 Spike", - "$45 Nothing (unused?)", - "$46 Desert Tablet", - "$47 Nothing (unused?)", - "$48 Diggable ground", - "$49 Nothing (unused?)", - "$4A Diggable ground", - "$4B Warp tile", - "$4C Nothing (unused?) | Something unknown in overworld", - "$4D Nothing (unused?) | Something unknown in overworld", - "$4E Square corners in EP overworld", - "$4F Square corners in EP overworld", - "$50 Green bush", - "$51 Dark bush", - "$52 Gray rock", - "$53 Black rock", - "$54 Hint tile/Sign", - "$55 Big gray rock", - "$56 Big black rock", - "$57 Bonk rocks", - "$58 Chest 0", - "$59 Chest 1", - "$5A Chest 2", - "$5B Chest 3", - "$5C Chest 4", - "$5D Chest 5", - "$5E Spiral stairs", - "$5F Spiral stairs", - "$60 Rupee tile", - "$61 Nothing (unused?)", - "$62 Bombable floor", - "$63 Minigame chest", - "$64 Nothing (unused?)", - "$65 Nothing (unused?)", - "$66 Crystal peg down", - "$67 Crystal peg up", - "$68 Upwards conveyor", - "$69 Downwards conveyor", - "$6A Leftwards conveyor", - "$6B Rightwards conveyor", - "$6C North vines", - "$6D South vines", - "$6E West vines", - "$6F East vines", - "$70 Pot/Hammer peg/Push block 00", - "$71 Pot/Hammer peg/Push block 01", - "$72 Pot/Hammer peg/Push block 02", - "$73 Pot/Hammer peg/Push block 03", - "$74 Pot/Hammer peg/Push block 04", - "$75 Pot/Hammer peg/Push block 05", - "$76 Pot/Hammer peg/Push block 06", - "$77 Pot/Hammer peg/Push block 07", - "$78 Pot/Hammer peg/Push block 08", - "$79 Pot/Hammer peg/Push block 09", - "$7A Pot/Hammer peg/Push block 0A", - "$7B Pot/Hammer peg/Push block 0B", - "$7C Pot/Hammer peg/Push block 0C", - "$7D Pot/Hammer peg/Push block 0D", - "$7E Pot/Hammer peg/Push block 0E", - "$7F Pot/Hammer peg/Push block 0F", - "$80 North/South door", - "$81 East/West door", - "$82 North/South shutter door", - "$83 East/West shutter door", - "$84 North/South layer 2 door", - "$85 East/West layer 2 door", - "$86 North/South layer 2 shutter door", - "$87 East/West layer 2 shutter door", - "$88 Some type of door (?)", - "$89 East/West transport door", - "$8A Some type of door (?)", - "$8B Some type of door (?)", - "$8C Some type of door (?)", - "$8D Some type of door (?)", - "$8E Entrance door", - "$8F Entrance door", - "$90 Layer toggle shutter door (?)", - "$91 Layer toggle shutter door (?)", - "$92 Layer toggle shutter door (?)", - "$93 Layer toggle shutter door (?)", - "$94 Layer toggle shutter door (?)", - "$95 Layer toggle shutter door (?)", - "$96 Layer toggle shutter door (?)", - "$97 Layer toggle shutter door (?)", - "$98 Layer+Dungeon toggle shutter door (?)", - "$99 Layer+Dungeon toggle shutter door (?)", - "$9A Layer+Dungeon toggle shutter door (?)", - "$9B Layer+Dungeon toggle shutter door (?)", - "$9C Layer+Dungeon toggle shutter door (?)", - "$9D Layer+Dungeon toggle shutter door (?)", - "$9E Layer+Dungeon toggle shutter door (?)", - "$9F Layer+Dungeon toggle shutter door (?)", - "$A0 North/South Dungeon swap door", - "$A1 Dungeon toggle door (?)", - "$A2 Dungeon toggle door (?)", - "$A3 Dungeon toggle door (?)", - "$A4 Dungeon toggle door (?)", - "$A5 Dungeon toggle door (?)", - "$A6 Nothing (unused?)", - "$A7 Nothing (unused?)", - "$A8 Layer+Dungeon toggle shutter door (?)", - "$A9 Layer+Dungeon toggle shutter door (?)", - "$AA Layer+Dungeon toggle shutter door (?)", - "$AB Layer+Dungeon toggle shutter door (?)", - "$AC Layer+Dungeon toggle shutter door (?)", - "$AD Layer+Dungeon toggle shutter door (?)", - "$AE Layer+Dungeon toggle shutter door (?)", - "$AF Layer+Dungeon toggle shutter door (?)", - "$B0 Somaria ─", - "$B1 Somaria │", - "$B2 Somaria ┌", - "$B3 Somaria └", - "$B4 Somaria ┐", - "$B5 Somaria ┘", - "$B6 Somaria ⍰ 1 way", - "$B7 Somaria ┬", - "$B8 Somaria ┴", - "$B9 Somaria ├", - "$BA Somaria ┤", - "$BB Somaria ┼", - "$BC Somaria ⍰ 2 way", - "$BD Somaria ┼ crossover", - "$BE Pipe entrance", - "$BF Nothing (unused?)", - "$C0 Torch 00", - "$C1 Torch 01", - "$C2 Torch 02", - "$C3 Torch 03", - "$C4 Torch 04", - "$C5 Torch 05", - "$C6 Torch 06", - "$C7 Torch 07", - "$C8 Torch 08", - "$C9 Torch 09", - "$CA Torch 0A", - "$CB Torch 0B", - "$CC Torch 0C", - "$CD Torch 0D", - "$CE Torch 0E", - "$CF Torch 0F", - "$D0 Nothing (unused?)", - "$D1 Nothing (unused?)", - "$D2 Nothing (unused?)", - "$D3 Nothing (unused?)", - "$D4 Nothing (unused?)", - "$D5 Nothing (unused?)", - "$D6 Nothing (unused?)", - "$D7 Nothing (unused?)", - "$D8 Nothing (unused?)", - "$D9 Nothing (unused?)", - "$DA Nothing (unused?)", - "$DB Nothing (unused?)", - "$DC Nothing (unused?)", - "$DD Nothing (unused?)", - "$DE Nothing (unused?)", - "$DF Nothing (unused?)", - "$E0 Nothing (unused?)", - "$E1 Nothing (unused?)", - "$E2 Nothing (unused?)", - "$E3 Nothing (unused?)", - "$E4 Nothing (unused?)", - "$E5 Nothing (unused?)", - "$E6 Nothing (unused?)", - "$E7 Nothing (unused?)", - "$E8 Nothing (unused?)", - "$E9 Nothing (unused?)", - "$EA Nothing (unused?)", - "$EB Nothing (unused?)", - "$EC Nothing (unused?)", - "$ED Nothing (unused?)", - "$EE Nothing (unused?)", - "$EF Nothing (unused?)", - "$F0 Door 0 bottom", - "$F1 Door 1 bottom", - "$F2 Door 2 bottom", - "$F3 Door 3 bottom", - "$F4 Door X bottom? (unused?)", - "$F5 Door X bottom? (unused?)", - "$F6 Door X bottom? (unused?)", - "$F7 Door X bottom? (unused?)", - "$F8 Door 0 top", - "$F9 Door 1 top", - "$FA Door 2 top", - "$FB Door 3 top", - "$FC Door X top? (unused?)", - "$FD Door X top? (unused?)", - "$FE Door X top? (unused?)", - "$FF Door X top? (unused?)" - }; - - -} -} -} -} +using ushort = unsigned short; + +//=========================================================================================== +// Magic numbers +//=========================================================================================== +/// +/// Bit set for object priority +/// +constexpr ushort TilePriorityBit = 0x2000; + +/// +/// Bit set for object hflip +/// +constexpr ushort TileHFlipBit = 0x4000; + +/// +/// Bit set for object vflip +/// +constexpr ushort TileVFlipBit = 0x8000; + +/// +/// Bits used for tile name +/// +constexpr ushort TileNameMask = 0x03FF; + +constexpr int Uncompressed3BPPSize = 0x0600; +constexpr int UncompressedSheetSize = 0x0800; + +constexpr int NumberOfSheets = 223; +constexpr int LimitOfMap32 = 8864; +constexpr int NumberOfRooms = 296; + +constexpr int NumberOfOWMaps = 160; +constexpr int Map32PerScreen = 256; +constexpr int NumberOfMap16 = 3752; // 4096 +constexpr int NumberOfMap32 = Map32PerScreen * NumberOfOWMaps; +constexpr int NumberOfOWSprites = 352; +constexpr int NumberOfColors = 3143; + +// =========================================================================================== +// Graphics +// =========================================================================================== + +constexpr int tile_address = 0x1B52; // JP = Same +constexpr int tile_address_floor = 0x1B5A; // JP = Same +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 gfx_1_pointer = + 0x6790; // 2byte pointer bank 00 pc -> 0x4320 CF80 ; 004F80 +constexpr int gfx_2_pointer = 0x6795; // D05F ; 00505F +constexpr int gfx_3_pointer = 0x679A; // D13E ; 00513E +constexpr int hud_palettes = 0xDD660; +constexpr int maxGfx = 0xC3FB5; + +// =========================================================================================== +// 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; + +// TODO: +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; + +constexpr int overworldMapSize = 0x12844; // 0x00 = small maps, 0x20 = large + // maps +constexpr int overworldMapSizeHighByte = + 0x12884; // 0x01 = small maps, 0x03 = large maps + +// 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 overworldTransitionPositionY = 0x128C4; +constexpr int overworldTransitionPositionX = 0x12944; + +constexpr int overworldScreenSize = 0x1788D; + +//=========================================================================================== +// 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 +//=========================================================================================== +// That could be turned into a pointer : +constexpr int dungeons_palettes_groups = 0x75460; // JP 0x67DD0 +constexpr int dungeons_main_bg_palette_pointers = 0xDEC4B; // JP Same +constexpr int dungeons_palettes = + 0xDD734; // JP Same (where all dungeons palettes are) + +// That could be turned into a pointer : +constexpr int room_items_pointers = 0xDB69; // JP 0xDB67 + +constexpr int rooms_sprite_pointer = 0x4C298; // JP Same //2byte bank 09D62E +constexpr int room_header_pointer = 0xB5DD; // LONG +constexpr int room_header_pointers_bank = 0xB5E7; // JP Same + +constexpr int gfx_groups_pointer = 0x6237; +constexpr int room_object_layout_pointer = 0x882D; + +constexpr int room_object_pointer = 0x874C; // Long pointer + +constexpr int chests_length_pointer = 0xEBF6; +constexpr int chests_data_pointer1 = 0xEBFB; +// constexpr int chests_data_pointer2 = 0xEC0A; //Disabled for now could be used +// for expansion constexpr int chests_data_pointer3 = 0xEC10; //Disabled for now +// could be used for expansion + +constexpr int blocks_length = 0x8896; // word value +constexpr int blocks_pointer1 = 0x15AFA; +constexpr int blocks_pointer2 = 0x15B01; +constexpr int blocks_pointer3 = 0x15B08; +constexpr int blocks_pointer4 = 0x15B0F; + +constexpr int torch_data = 0x2736A; // JP 0x2704A +constexpr int torches_length_pointer = 0x88C1; + +constexpr int sprite_blockset_pointer = 0x5B57; +constexpr int sprites_data = + 0x4D8B0; // It use the unused pointers to have more space //Save purpose +constexpr int sprites_data_empty_room = 0x4D8AE; +constexpr int sprites_end_data = 0x4EC9E; + +constexpr int pit_pointer = 0x394AB; +constexpr int pit_count = 0x394A6; + +constexpr int doorPointers = 0xF83C0; + +// doors +constexpr int door_gfx_up = 0x4D9E; +// +constexpr int door_gfx_down = 0x4E06; +constexpr int door_gfx_cavexit_down = 0x4E06; +constexpr int door_gfx_left = 0x4E66; +constexpr int door_gfx_right = 0x4EC6; + +constexpr int door_pos_up = 0x197E; +constexpr int door_pos_down = 0x1996; +constexpr int door_pos_left = 0x19AE; +constexpr int door_pos_right = 0x19C6; + +// TEXT EDITOR RELATED CONSTANTS +constexpr int gfx_font = 0x70000; // 2bpp format +constexpr int text_data = 0xE0000; +constexpr int text_data2 = 0x75F40; +constexpr int pointers_dictionaries = 0x74703; +constexpr int characters_width = 0x74ADF; + +//=========================================================================================== +// Dungeon Entrances Related Variables +//=========================================================================================== +constexpr int entrance_room = 0x14813; // 0x14577 //word value for each room +constexpr int entrance_scrolledge = + 0x1491D; // 0x14681 //8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR +constexpr int entrance_yscroll = 0x14D45; // 0x14AA9 //2bytes each room +constexpr int entrance_xscroll = 0x14E4F; // 0x14BB3 //2bytes +constexpr int entrance_yposition = 0x14F59; // 0x14CBD 2bytes +constexpr int entrance_xposition = 0x15063; // 0x14DC7 2bytes +constexpr int entrance_camerayposition = 0x1516D; // 0x14ED1 2bytes +constexpr int entrance_cameraxposition = 0x15277; // 0x14FDB 2bytes + +constexpr int entrance_gfx_group = 0x5D97; +constexpr int entrance_blockset = 0x15381; // 0x150E5 1byte +constexpr int entrance_floor = 0x15406; // 0x1516A 1byte +constexpr int entrance_dungeon = 0x1548B; // 0x151EF 1byte (dungeon id) +constexpr int entrance_door = 0x15510; // 0x15274 1byte +constexpr int entrance_ladderbg = + 0x15595; // 0x152F9 //1 byte, ---b ---a b = bg2, a = need to check -_- +constexpr int entrance_scrolling = 0x1561A; // 0x1537E //1byte --h- --v- +constexpr int entrance_scrollquadrant = 0x1569F; // 0x15403 1byte +constexpr int entrance_exit = 0x15724; // 0x15488 //2byte word +constexpr int entrance_music = 0x1582E; // 0x15592 + +constexpr int startingentrance_room = + 0x15B6E; // 0x158D2 //word value for each room +constexpr int startingentrance_scrolledge = + 0x15B7C; // 0x158E0 //8 bytes per room, HU, FU, HD, FD, HL, FL, HR, FR +constexpr int startingentrance_yscroll = 0x15BB4; // 0x14AA9 //2bytes each room +constexpr int startingentrance_xscroll = 0x15BC2; // 0x14BB3 //2bytes +constexpr int startingentrance_yposition = 0x15BD0; // 0x14CBD 2bytes +constexpr int startingentrance_xposition = 0x15BDE; // 0x14DC7 2bytes +constexpr int startingentrance_camerayposition = 0x15BEC; // 0x14ED1 2bytes +constexpr int startingentrance_cameraxposition = 0x15BFA; // 0x14FDB 2bytes + +constexpr int startingentrance_blockset = 0x15C08; // 0x150E5 1byte +constexpr int startingentrance_floor = 0x15C0F; // 0x1516A 1byte +constexpr int startingentrance_dungeon = 0x15C16; // 0x151EF 1byte (dungeon id) + +constexpr int startingentrance_door = 0x15C2B; // 0x15274 1byte + +constexpr int startingentrance_ladderbg = + 0x15C1D; // 0x152F9 //1 byte, ---b ---a b = bg2, a = need to check -_- +constexpr int startingentrance_scrolling = 0x15C24; // 0x1537E //1byte --h- --v- +constexpr int startingentrance_scrollquadrant = 0x15C2B; // 0x15403 1byte +constexpr int startingentrance_exit = 0x15C32; // 0x15488 //2byte word +constexpr int startingentrance_music = 0x15C4E; // 0x15592 +constexpr int startingentrance_entrance = 0x15C40; + +constexpr int items_data_start = 0xDDE9; // save purpose +constexpr int items_data_end = 0xE6B2; // save purpose +constexpr int initial_equipement = 0x271A6; +constexpr int messages_id_dungeon = 0x3F61D; + +constexpr int chests_backupitems = + 0x3B528; // item id you get instead if you already have that item +constexpr int chests_yoffset = 0x4836C; +constexpr int chests_xoffset = 0x4836C + (76 * 1); +constexpr int chests_itemsgfx = 0x4836C + (76 * 2); +constexpr int chests_itemswide = 0x4836C + (76 * 3); +constexpr int chests_itemsproperties = 0x4836C + (76 * 4); +constexpr int chests_sramaddress = 0x4836C + (76 * 5); +constexpr int chests_sramvalue = 0x4836C + (76 * 7); +constexpr int chests_msgid = 0x442DD; + +constexpr int dungeons_startrooms = 0x7939; +constexpr int dungeons_endrooms = 0x792D; +constexpr int dungeons_bossrooms = 0x10954; // short value + +// Bed Related Values (Starting location) + +constexpr int bedPositionX = 0x039A37; // short value +constexpr int bedPositionY = 0x039A32; // short value + +constexpr int bedPositionResetXLow = + 0x02DE53; // short value(on 2 different bytes) +constexpr int bedPositionResetXHigh = 0x02DE58; //^^^^^^ + +constexpr int bedPositionResetYLow = + 0x02DE5D; // short value(on 2 different bytes) +constexpr int bedPositionResetYHigh = 0x02DE62; //^^^^^^ + +constexpr int bedSheetPositionX = 0x0480BD; // short value +constexpr int bedSheetPositionY = 0x0480B8; // short value + +//=========================================================================================== +// Gravestones related variables +//=========================================================================================== + +constexpr int GravesYTilePos = 0x49968; // short (0x0F entries) +constexpr int GravesXTilePos = 0x49986; // short (0x0F entries) +constexpr int GravesTilemapPos = 0x499A4; // short (0x0F entries) +constexpr int GravesGFX = 0x499C2; // short (0x0F entries) + +constexpr int GravesXPos = 0x4994A; // short (0x0F entries) +constexpr int GravesYLine = 0x4993A; // short (0x08 entries) +constexpr int GravesCountOnY = 0x499E0; // Byte 0x09 entries + +constexpr int GraveLinkSpecialHole = 0x46DD9; // short +constexpr int GraveLinkSpecialStairs = 0x46DE0; // short + +//=========================================================================================== +// Palettes Related Variables - This contain all the palettes of the game +//=========================================================================================== +constexpr int overworldPaletteMain = 0xDE6C8; +constexpr int overworldPaletteAuxialiary = 0xDE86C; +constexpr int overworldPaletteAnimated = 0xDE604; +constexpr int globalSpritePalettesLW = 0xDD218; +constexpr int globalSpritePalettesDW = 0xDD290; +constexpr int armorPalettes = + 0xDD308; // Green, Blue, Red, Bunny, Electrocuted (15 colors each) +constexpr int spritePalettesAux1 = 0xDD39E; // 7 colors each +constexpr int spritePalettesAux2 = 0xDD446; // 7 colors each +constexpr int spritePalettesAux3 = 0xDD4E0; // 7 colors each +constexpr int swordPalettes = 0xDD630; // 3 colors each - 4 entries +constexpr int shieldPalettes = 0xDD648; // 4 colors each - 3 entries +constexpr int hudPalettes = 0xDD660; +constexpr int dungeonMapPalettes = 0xDD70A; // 21 colors +constexpr int dungeonMainPalettes = 0xDD734; //(15*6) colors each - 20 entries +constexpr int dungeonMapBgPalettes = 0xDE544; // 16*6 +constexpr int hardcodedGrassLW = 0x5FEA9; // Mirrored Value at 0x75645 : 0x75625 +constexpr int hardcodedGrassDW = 0x05FEB3; // 0x7564F +constexpr int hardcodedGrassSpecial = 0x75640; + +//=========================================================================================== +// Dungeon Map Related Variables +//=========================================================================================== +constexpr int dungeonMap_rooms_ptr = 0x57605; // 14 pointers of map data +constexpr int dungeonMap_floors = 0x575D9; // 14 words values + +constexpr int dungeonMap_gfx_ptr = 0x57BE4; // 14 pointers of gfx data +constexpr int dungeonMap_datastart = + 0x57039; // data start for floors/gfx MUST skip 575D9 to 57621 (pointers) + +constexpr int dungeonMap_expCheck = + 0x56652; // IF Byte = 0xB9 dungeon maps are not expanded +constexpr int dungeonMap_tile16 = 0x57009; +constexpr int dungeonMap_tile16Exp = 0x109010; +constexpr int dungeonMap_bossrooms = 0x56807; // 14 words values 0x000F = no + // boss + +constexpr int triforceVertices = 0x04FFD2; // group of 3, X, Y ,Z +constexpr int TriforceFaces = 0x04FFE4; // group of 5 + +constexpr int crystalVertices = 0x04FF98; + +//=========================================================================================== +// Names +//=========================================================================================== +static const std::string RoomEffect[] = {"Nothing", + "Nothing", + "Moving Floor", + "Moving Water", + "Trinexx Shell", + "Red Flashes", + "Light Torch to See Floor", + "Ganon's Darkness"}; + +static const std::string RoomTag[] = {"Nothing", + + "NW Kill Enemy to Open", + "NE Kill Enemy to Open", + "SW Kill Enemy to Open", + "SE Kill Enemy to Open", + "W Kill Enemy to Open", + "E Kill Enemy to Open", + "N Kill Enemy to Open", + "S Kill Enemy to Open", + "Clear Quadrant to Open", + "Clear Full Tile to Open", + + "NW Push Block to Open", + "NE Push Block to Open", + "SW Push Block to Open", + "SE Push Block to Open", + "W Push Block to Open", + "E Push Block to Open", + "N Push Block to Open", + "S Push Block to Open", + "Push Block to Open", + "Pull Lever to Open", + "Collect Prize to Open", + + "Hold Switch Open Door", + "Toggle Switch to Open Door", + "Turn off Water", + "Turn on Water", + "Water Gate", + "Water Twin", + "Moving Wall Right", + "Moving Wall Left", + "Crash", + "Crash", + "Push Switch Exploding Wall", + "Holes 0", + "Open Chest (Holes 0)", + "Holes 1", + "Holes 2", + "Defeat Boss for Dungeon Prize", + + "SE Kill Enemy to Push Block", + "Trigger Switch Chest", + "Pull Lever Exploding Wall", + "NW Kill Enemy for Chest", + "NE Kill Enemy for Chest", + "SW Kill Enemy for Chest", + "SE Kill Enemy for Chest", + "W Kill Enemy for Chest", + "E Kill Enemy for Chest", + "N Kill Enemy for Chest", + "S Kill Enemy for Chest", + "Clear Quadrant for Chest", + "Clear Full Tile for Chest", + + "Light Torches to Open", + "Holes 3", + "Holes 4", + "Holes 5", + "Holes 6", + "Agahnim Room", + "Holes 7", + "Holes 8", + "Open Chest for Holes 8", + "Push Block for Chest", + "Clear Room for Triforce Door", + "Light Torches for Chest", + "Kill Boss Again"}; + +static const std::string SecretItemNames[] = { + "Nothing", "Green Rupee", "Rock hoarder", "Bee", "Health pack", + "Bomb", "Heart ", "Blue Rupee", + + "Key", "Arrow", "Bomb", "Heart", "Magic", + "Full Magic", "Cucco", "Green Soldier", "Bush Stal", "Blue Soldier", + + "Landmine", "Heart", "Fairy", "Heart", + "Nothing ", // 22 + + "Hole", "Warp", "Staircase", "Bombable", "Switch"}; + +static const std::string Type1RoomObjectNames[] = { + "Ceiling ↔", + "Wall (top, north) ↔", + "Wall (top, south) ↔", + "Wall (bottom, north) ↔", + "Wall (bottom, south) ↔", + "Wall columns (north) ↔", + "Wall columns (south) ↔", + "Deep wall (north) ↔", + "Deep wall (south) ↔", + "Diagonal wall A ◤ (top) ↔", + "Diagonal wall A ◣ (top) ↔", + "Diagonal wall A ◥ (top) ↔", + "Diagonal wall A ◢ (top) ↔", + "Diagonal wall B ◤ (top) ↔", + "Diagonal wall B ◣ (top) ↔", + "Diagonal wall B ◥ (top) ↔", + "Diagonal wall B ◢ (top) ↔", + "Diagonal wall C ◤ (top) ↔", + "Diagonal wall C ◣ (top) ↔", + "Diagonal wall C ◥ (top) ↔", + "Diagonal wall C ◢ (top) ↔", + "Diagonal wall A ◤ (bottom) ↔", + "Diagonal wall A ◣ (bottom) ↔", + "Diagonal wall A ◥ (bottom) ↔", + "Diagonal wall A ◢ (bottom) ↔", + "Diagonal wall B ◤ (bottom) ↔", + "Diagonal wall B ◣ (bottom) ↔", + "Diagonal wall B ◥ (bottom) ↔", + "Diagonal wall B ◢ (bottom) ↔", + "Diagonal wall C ◤ (bottom) ↔", + "Diagonal wall C ◣ (bottom) ↔", + "Diagonal wall C ◥ (bottom) ↔", + "Diagonal wall C ◢ (bottom) ↔", + "Platform stairs ↔", + "Rail ↔", + "Pit edge ┏━┓ A (north) ↔", + "Pit edge ┏━┓ B (north) ↔", + "Pit edge ┏━┓ C (north) ↔", + "Pit edge ┏━┓ D (north) ↔", + "Pit edge ┏━┓ E (north) ↔", + "Pit edge ┗━┛ (south) ↔", + "Pit edge ━━━ (south) ↔", + "Pit edge ━━━ (north) ↔", + "Pit edge ━━┛ (south) ↔", + "Pit edge ┗━━ (south) ↔", + "Pit edge ━━┓ (north) ↔", + "Pit edge ┏━━ (north) ↔", + "Rail wall (north) ↔", + "Rail wall (south) ↔", + "Nothing", + "Nothing", + "Carpet ↔", + "Carpet trim ↔", + "Weird door", // TODO: WEIRD DOOR OBJECT NEEDS INVESTIGATION + "Drapes (north) ↔", + "Drapes (west, odd) ↔", + "Statues ↔", + "Columns ↔", + "Wall decors (north) ↔", + "Wall decors (south) ↔", + "Chairs in pairs ↔", + "Tall torches ↔", + "Supports (north) ↔", + "Water edge ┏━┓ (concave) ↔", + "Water edge ┗━┛ (concave) ↔", + "Water edge ┏━┓ (convex) ↔", + "Water edge ┗━┛ (convex) ↔", + "Water edge ┏━┛ (concave) ↔", + "Water edge ┗━┓ (concave) ↔", + "Water edge ┗━┓ (convex) ↔", + "Water edge ┏━┛ (convex) ↔", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Supports (south) ↔", + "Bar ↔", + "Shelf A ↔", + "Shelf B ↔", + "Shelf C ↔", + "Somaria path ↔", + "Cannon hole A (north) ↔", + "Cannon hole A (south) ↔", + "Pipe path ↔", + "Nothing", + "Wall torches (north) ↔", + "Wall torches (south) ↔", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Cannon hole B (north) ↔", + "Cannon hole B (south) ↔", + "Thick rail ↔", + "Blocks ↔", + "Long rail ↔", + "Ceiling ↕", + "Wall (top, west) ↕", + "Wall (top, east) ↕", + "Wall (bottom, west) ↕", + "Wall (bottom, east) ↕", + "Wall columns (west) ↕", + "Wall columns (east) ↕", + "Deep wall (west) ↕", + "Deep wall (east) ↕", + "Rail ↕", + "Pit edge (west) ↕", + "Pit edge (east) ↕", + "Rail wall (west) ↕", + "Rail wall (east) ↕", + "Nothing", + "Nothing", + "Carpet ↕", + "Carpet trim ↕", + "Nothing", + "Drapes (west) ↕", + "Drapes (east) ↕", + "Columns ↕", + "Wall decors (west) ↕", + "Wall decors (east) ↕", + "Supports (west) ↕", + "Water edge (west) ↕", + "Water edge (east) ↕", + "Supports (east) ↕", + "Somaria path ↕", + "Pipe path ↕", + "Nothing", + "Wall torches (west) ↕", + "Wall torches (east) ↕", + "Wall decors tight A (west) ↕", + "Wall decors tight A (east) ↕", + "Wall decors tight B (west) ↕", + "Wall decors tight B (east) ↕", + "Cannon hole (west) ↕", + "Cannon hole (east) ↕", + "Tall torches ↕", + "Thick rail ↕", + "Blocks ↕", + "Long rail ↕", + "Jump ledge (west) ↕", + "Jump ledge (east) ↕", + "Rug trim (west) ↕", + "Rug trim (east) ↕", + "Bar ↕", + "Wall flair (west) ↕", + "Wall flair (east) ↕", + "Blue pegs ↕", + "Orange pegs ↕", + "Invisible floor ↕", + "Fake pots ↕", + "Hammer pegs ↕", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Diagonal ceiling A ◤", + "Diagonal ceiling A ◣", + "Diagonal ceiling A ◥", + "Diagonal ceiling A ◢", + "Pit ⇲", + "Diagonal layer 2 mask A ◤", + "Diagonal layer 2 mask A ◣", + "Diagonal layer 2 mask A ◥", + "Diagonal layer 2 mask A ◢", + "Diagonal layer 2 mask B ◤", // TODO: VERIFY + "Diagonal layer 2 mask B ◣", // TODO: VERIFY + "Diagonal layer 2 mask B ◥", // TODO: VERIFY + "Diagonal layer 2 mask B ◢", // TODO: VERIFY + "Nothing", + "Nothing", + "Nothing", + "Jump ledge (north) ↔", + "Jump ledge (south) ↔", + "Rug ↔", + "Rug trim (north) ↔", + "Rug trim (south) ↔", + "Archery game curtains ↔", + "Wall flair (north) ↔", + "Wall flair (south) ↔", + "Blue pegs ↔", + "Orange pegs ↔", + "Invisible floor ↔", + "Fake pressure plates ↔", + "Fake pots ↔", + "Hammer pegs ↔", + "Nothing", + "Nothing", + "Ceiling (large) ⇲", + "Chest platform (tall) ⇲", + "Layer 2 pit mask (large) ⇲", + "Layer 2 pit mask (medium) ⇲", + "Floor 1 ⇲", + "Floor 3 ⇲", + "Layer 2 mask (large) ⇲", + "Floor 4 ⇲", + "Water floor ⇲ ", + "Flood water (medium) ⇲ ", + "Conveyor floor ⇲ ", + "Nothing", + "Nothing", + "Moving wall (west) ⇲", + "Moving wall (east) ⇲", + "Nothing", + "Nothing", + "Icy floor A ⇲", + "Icy floor B ⇲", + "Moving wall flag", // TODO: WTF IS THIS? + "Moving wall flag", // TODO: WTF IS THIS? + "Moving wall flag", // TODO: WTF IS THIS? + "Moving wall flag", // TODO: WTF IS THIS? + "Layer 2 mask (medium) ⇲", + "Flood water (large) ⇲", + "Layer 2 swim mask ⇲", + "Flood water B (large) ⇲", + "Floor 2 ⇲", + "Chest platform (short) ⇲", + "Table / rock ⇲", + "Spike blocks ⇲", + "Spiked floor ⇲", + "Floor 7 ⇲", + "Tiled floor ⇲", + "Rupee floor ⇲", + "Conveyor upwards ⇲", + "Conveyor downwards ⇲", + "Conveyor leftwards ⇲", + "Conveyor rightwards ⇲", + "Heavy current water ⇲", + "Floor 10 ⇲", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", + "Nothing", +}; + +static const std::string Type2RoomObjectNames[] = { + "Corner (top, concave) ▛", + "Corner (top, concave) ▙", + "Corner (top, concave) ▜", + "Corner (top, concave) ▟", + "Corner (top, convex) ▟", + "Corner (top, convex) ▜", + "Corner (top, convex) ▙", + "Corner (top, convex) ▛", + "Corner (bottom, concave) ▛", + "Corner (bottom, concave) ▙", + "Corner (bottom, concave) ▜", + "Corner (bottom, concave) ▟", + "Corner (bottom, convex) ▟", + "Corner (bottom, convex) ▜", + "Corner (bottom, convex) ▙", + "Corner (bottom, convex) ▛", + "Kinked corner north (bottom) ▜", + "Kinked corner south (bottom) ▟", + "Kinked corner north (bottom) ▛", + "Kinked corner south (bottom) ▙", + "Kinked corner west (bottom) ▙", + "Kinked corner west (bottom) ▛", + "Kinked corner east (bottom) ▟", + "Kinked corner east (bottom) ▜", + "Deep corner (concave) ▛", + "Deep corner (concave) ▙", + "Deep corner (concave) ▜", + "Deep corner (concave) ▟", + "Large brazier", + "Statue", + "Star tile (disabled)", + "Star tile (enabled)", + "Small torch (lit)", + "Barrel", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Table", + "Fairy statue", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Chair", + "Bed", + "Fireplace", + "Mario portrait", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Interroom stairs (up)", + "Interroom stairs (down)", + "Interroom stairs B (down)", + "Intraroom stairs north B", // TODO: VERIFY LAYER HANDLING + "Intraroom stairs north (separate layers)", + "Intraroom stairs north (merged layers)", + "Intraroom stairs north (swim layer)", + "Block", + "Water ladder (north)", + "Water ladder (south)", // TODO: NEEDS IN GAME VERIFICATION + "Dam floodgate", + "Interroom spiral stairs up (top)", + "Interroom spiral stairs down (top)", + "Interroom spiral stairs up (bottom)", + "Interroom spiral stairs down (bottom)", + "Sanctuary wall (north)", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Pew", + "Magic bat altar", +}; + +static const std::string Type3RoomObjectNames[] = { + "Waterfall face (empty)", + "Waterfall face (short)", + "Waterfall face (long)", + "Somaria path endpoint", + "Somaria path intersection ╋", + "Somaria path corner ┏", + "Somaria path corner ┗", + "Somaria path corner ┓", + "Somaria path corner ┛", + "Somaria path intersection ┳", + "Somaria path intersection ┻", + "Somaria path intersection ┣", + "Somaria path intersection ┫", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Somaria path 2-way endpoint", + "Somaria path crossover", + "Babasu hole (north)", + "Babasu hole (south)", + "9 blue rupees", + "Telepathy tile", + "Warp door", // TODO: NEEDS IN GAME VERIFICATION THAT THIS IS USELESS + "Kholdstare's shell", + "Hammer peg", + "Prison cell", + "Big key lock", + "Chest", + "Chest (open)", + "Intraroom stairs south", // TODO: VERIFY LAYER HANDLING + "Intraroom stairs south (separate layers)", + "Intraroom stairs south (merged layers)", + "Interroom straight stairs up (north, top)", + "Interroom straight stairs down (north, top)", + "Interroom straight stairs up (south, top)", + "Interroom straight stairs down (south, top)", + "Deep corner (convex) ▟", + "Deep corner (convex) ▜", + "Deep corner (convex) ▙", + "Deep corner (convex) ▛", + "Interroom straight stairs up (north, bottom)", + "Interroom straight stairs down (north, bottom)", + "Interroom straight stairs up (south, bottom)", + "Interroom straight stairs down (south, bottom)", + "Lamp cones", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Liftable large block", + "Agahnim's altar", + "Agahnim's boss room", + "Pot", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Big chest", + "Big chest (open)", + "Intraroom stairs south (swim layer)", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Pipe end (south)", + "Pipe end (north)", + "Pipe end (east)", + "Pipe end (west)", + "Pipe corner ▛", + "Pipe corner ▙", + "Pipe corner ▜", + "Pipe corner ▟", + "Pipe-rock intersection ⯊", + "Pipe-rock intersection ⯋", + "Pipe-rock intersection ◖", + "Pipe-rock intersection ◗", + "Pipe crossover", + "Bombable floor", + "Fake bombable floor", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Warp tile", + "Tool rack", + "Furnace", + "Tub (wide)", + "Anvil", + "Warp tile (disabled)", + "Pressure plate", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Blue peg", + "Orange peg", + "Fortune teller room", + "Unknown", // TODO: NEEDS IN GAME CHECKING + "Bar corner ▛", + "Bar corner ▙", + "Bar corner ▜", + "Bar corner ▟", + "Decorative bowl", + "Tub (tall)", + "Bookcase", + "Range", + "Suitcase", + "Bar bottles", + "Arrow game hole (west)", + "Arrow game hole (east)", + "Vitreous goo graphics", + "Fake pressure plate", + "Medusa head", + "4-way shooter block", + "Pit", + "Wall crack (north)", + "Wall crack (south)", + "Wall crack (west)", + "Wall crack (east)", + "Large decor", + "Water grate (north)", + "Water grate (south)", + "Water grate (west)", + "Water grate (east)", + "Window sunlight", + "Floor sunlight", + "Trinexx's shell", + "Layer 2 mask (full)", + "Boss entrance", + "Minigame chest", + "Ganon door", + "Triforce wall ornament", + "Triforce floor tiles", + "Freezor hole", + "Pile of bones", + "Vitreous goo damage", + "Arrow tile ↑", + "Arrow tile ↓", + "Arrow tile →", + "Nothing", +}; + +static const std::string TileTypeNames[] = { + "$00 Nothing (standard floor)", + "$01 Collision", + "$02 Collision", + "$03 Collision", + "$04 Collision", + "$05 Nothing (unused?)", + "$06 Nothing (unused?)", + "$07 Nothing (unused?)", + "$08 Deep water", + "$09 Shallow water", + "$0A Unknown? Possibly unused", + "$0B Collision (different in Overworld and unknown)", + "$0C Overlay mask", + "$0D Spike floor", + "$0E GT ice", + "$0F Ice palace ice", + "$10 Slope ◤", + "$11 Slope ◥", + "$12 Slope ◣", + "$13 Slope ◢", + "$14 Nothing (unused?)", + "$15 Nothing (unused?)", + "$16 Nothing (unused?)", + "$17 Nothing (unused?)", + "$18 Slope ◤", + "$19 Slope ◥", + "$1A Slope ◣", + "$1B Slope ◢", + "$1C Layer 2 overlay", + "$1D North single-layer auto stairs", + "$1E North layer-swap auto stairs", + "$1F North layer-swap auto stairs", + "$20 Pit", + "$21 Nothing (unused?)", + "$22 Manual stairs", + "$23 Pot switch", + "$24 Pressure switch", + "$25 Nothing (unused but referenced by somaria blocks)", + "$26 Collision (near stairs?)", + "$27 Brazier/Fence/Statue/Block/General hookable things", + "$28 North ledge", + "$29 South ledge", + "$2A East ledge", + "$2B West ledge", + "$2C ◤ ledge", + "$2D ◣ ledge", + "$2E ◥ ledge", + "$2F ◢ ledge", + "$30 Straight inter-room stairs south/up 0", + "$31 Straight inter-room stairs south/up 1", + "$32 Straight inter-room stairs south/up 2", + "$33 Straight inter-room stairs south/up 3", + "$34 Straight inter-room stairs north/down 0", + "$35 Straight inter-room stairs north/down 1", + "$36 Straight inter-room stairs north/down 2", + "$37 Straight inter-room stairs north/down 3", + "$38 Straight inter-room stairs north/down edge", + "$39 Straight inter-room stairs south/up edge", + "$3A Star tile (inactive on load)", + "$3B Star tile (active on load)", + "$3C Nothing (unused?)", + "$3D South single-layer auto stairs", + "$3E South layer-swap auto stairs", + "$3F South layer-swap auto stairs", + "$40 Thick grass", + "$41 Nothing (unused?)", + "$42 Gravestone / Tower of hera ledge shadows??", + "$43 Skull Woods entrance/Hera columns???", + "$44 Spike", + "$45 Nothing (unused?)", + "$46 Desert Tablet", + "$47 Nothing (unused?)", + "$48 Diggable ground", + "$49 Nothing (unused?)", + "$4A Diggable ground", + "$4B Warp tile", + "$4C Nothing (unused?) | Something unknown in overworld", + "$4D Nothing (unused?) | Something unknown in overworld", + "$4E Square corners in EP overworld", + "$4F Square corners in EP overworld", + "$50 Green bush", + "$51 Dark bush", + "$52 Gray rock", + "$53 Black rock", + "$54 Hint tile/Sign", + "$55 Big gray rock", + "$56 Big black rock", + "$57 Bonk rocks", + "$58 Chest 0", + "$59 Chest 1", + "$5A Chest 2", + "$5B Chest 3", + "$5C Chest 4", + "$5D Chest 5", + "$5E Spiral stairs", + "$5F Spiral stairs", + "$60 Rupee tile", + "$61 Nothing (unused?)", + "$62 Bombable floor", + "$63 Minigame chest", + "$64 Nothing (unused?)", + "$65 Nothing (unused?)", + "$66 Crystal peg down", + "$67 Crystal peg up", + "$68 Upwards conveyor", + "$69 Downwards conveyor", + "$6A Leftwards conveyor", + "$6B Rightwards conveyor", + "$6C North vines", + "$6D South vines", + "$6E West vines", + "$6F East vines", + "$70 Pot/Hammer peg/Push block 00", + "$71 Pot/Hammer peg/Push block 01", + "$72 Pot/Hammer peg/Push block 02", + "$73 Pot/Hammer peg/Push block 03", + "$74 Pot/Hammer peg/Push block 04", + "$75 Pot/Hammer peg/Push block 05", + "$76 Pot/Hammer peg/Push block 06", + "$77 Pot/Hammer peg/Push block 07", + "$78 Pot/Hammer peg/Push block 08", + "$79 Pot/Hammer peg/Push block 09", + "$7A Pot/Hammer peg/Push block 0A", + "$7B Pot/Hammer peg/Push block 0B", + "$7C Pot/Hammer peg/Push block 0C", + "$7D Pot/Hammer peg/Push block 0D", + "$7E Pot/Hammer peg/Push block 0E", + "$7F Pot/Hammer peg/Push block 0F", + "$80 North/South door", + "$81 East/West door", + "$82 North/South shutter door", + "$83 East/West shutter door", + "$84 North/South layer 2 door", + "$85 East/West layer 2 door", + "$86 North/South layer 2 shutter door", + "$87 East/West layer 2 shutter door", + "$88 Some type of door (?)", + "$89 East/West transport door", + "$8A Some type of door (?)", + "$8B Some type of door (?)", + "$8C Some type of door (?)", + "$8D Some type of door (?)", + "$8E Entrance door", + "$8F Entrance door", + "$90 Layer toggle shutter door (?)", + "$91 Layer toggle shutter door (?)", + "$92 Layer toggle shutter door (?)", + "$93 Layer toggle shutter door (?)", + "$94 Layer toggle shutter door (?)", + "$95 Layer toggle shutter door (?)", + "$96 Layer toggle shutter door (?)", + "$97 Layer toggle shutter door (?)", + "$98 Layer+Dungeon toggle shutter door (?)", + "$99 Layer+Dungeon toggle shutter door (?)", + "$9A Layer+Dungeon toggle shutter door (?)", + "$9B Layer+Dungeon toggle shutter door (?)", + "$9C Layer+Dungeon toggle shutter door (?)", + "$9D Layer+Dungeon toggle shutter door (?)", + "$9E Layer+Dungeon toggle shutter door (?)", + "$9F Layer+Dungeon toggle shutter door (?)", + "$A0 North/South Dungeon swap door", + "$A1 Dungeon toggle door (?)", + "$A2 Dungeon toggle door (?)", + "$A3 Dungeon toggle door (?)", + "$A4 Dungeon toggle door (?)", + "$A5 Dungeon toggle door (?)", + "$A6 Nothing (unused?)", + "$A7 Nothing (unused?)", + "$A8 Layer+Dungeon toggle shutter door (?)", + "$A9 Layer+Dungeon toggle shutter door (?)", + "$AA Layer+Dungeon toggle shutter door (?)", + "$AB Layer+Dungeon toggle shutter door (?)", + "$AC Layer+Dungeon toggle shutter door (?)", + "$AD Layer+Dungeon toggle shutter door (?)", + "$AE Layer+Dungeon toggle shutter door (?)", + "$AF Layer+Dungeon toggle shutter door (?)", + "$B0 Somaria ─", + "$B1 Somaria │", + "$B2 Somaria ┌", + "$B3 Somaria └", + "$B4 Somaria ┐", + "$B5 Somaria ┘", + "$B6 Somaria ⍰ 1 way", + "$B7 Somaria ┬", + "$B8 Somaria ┴", + "$B9 Somaria ├", + "$BA Somaria ┤", + "$BB Somaria ┼", + "$BC Somaria ⍰ 2 way", + "$BD Somaria ┼ crossover", + "$BE Pipe entrance", + "$BF Nothing (unused?)", + "$C0 Torch 00", + "$C1 Torch 01", + "$C2 Torch 02", + "$C3 Torch 03", + "$C4 Torch 04", + "$C5 Torch 05", + "$C6 Torch 06", + "$C7 Torch 07", + "$C8 Torch 08", + "$C9 Torch 09", + "$CA Torch 0A", + "$CB Torch 0B", + "$CC Torch 0C", + "$CD Torch 0D", + "$CE Torch 0E", + "$CF Torch 0F", + "$D0 Nothing (unused?)", + "$D1 Nothing (unused?)", + "$D2 Nothing (unused?)", + "$D3 Nothing (unused?)", + "$D4 Nothing (unused?)", + "$D5 Nothing (unused?)", + "$D6 Nothing (unused?)", + "$D7 Nothing (unused?)", + "$D8 Nothing (unused?)", + "$D9 Nothing (unused?)", + "$DA Nothing (unused?)", + "$DB Nothing (unused?)", + "$DC Nothing (unused?)", + "$DD Nothing (unused?)", + "$DE Nothing (unused?)", + "$DF Nothing (unused?)", + "$E0 Nothing (unused?)", + "$E1 Nothing (unused?)", + "$E2 Nothing (unused?)", + "$E3 Nothing (unused?)", + "$E4 Nothing (unused?)", + "$E5 Nothing (unused?)", + "$E6 Nothing (unused?)", + "$E7 Nothing (unused?)", + "$E8 Nothing (unused?)", + "$E9 Nothing (unused?)", + "$EA Nothing (unused?)", + "$EB Nothing (unused?)", + "$EC Nothing (unused?)", + "$ED Nothing (unused?)", + "$EE Nothing (unused?)", + "$EF Nothing (unused?)", + "$F0 Door 0 bottom", + "$F1 Door 1 bottom", + "$F2 Door 2 bottom", + "$F3 Door 3 bottom", + "$F4 Door X bottom? (unused?)", + "$F5 Door X bottom? (unused?)", + "$F6 Door X bottom? (unused?)", + "$F7 Door X bottom? (unused?)", + "$F8 Door 0 top", + "$F9 Door 1 top", + "$FA Door 2 top", + "$FB Door 3 top", + "$FC Door X top? (unused?)", + "$FD Door X top? (unused?)", + "$FE Door X top? (unused?)", + "$FF Door X top? (unused?)"}; + +} // namespace Constants +} // namespace Core +} // namespace Application +} // namespace yaze #endif \ No newline at end of file diff --git a/src/Application/Data/Overworld.cc b/src/Application/Data/Overworld.cc index 2d02ed1e..1a93a9ca 100644 --- a/src/Application/Data/Overworld.cc +++ b/src/Application/Data/Overworld.cc @@ -19,8 +19,8 @@ Overworld::~Overworld() { free(allmapsTilesDW); free(allmapsTilesSP); - delete overworldMapPointer; - delete owactualMapPointer; + delete[] overworldMapPointer; + delete[] owactualMapPointer; } static TileInfo GetTilesInfo(ushort tile) { diff --git a/src/Application/Editor/Editor.cc b/src/Application/Editor/Editor.cc index 150f7361..e4dda25c 100644 --- a/src/Application/Editor/Editor.cc +++ b/src/Application/Editor/Editor.cc @@ -22,20 +22,10 @@ void Editor::UpdateScreen() { DrawYazeMenu(); - if (isLoaded) { - if (!doneLoaded) { - overworld.Load(rom); - overworld_texture = &overworld.owactualMapTexture; - doneLoaded = true; - } - // ImGui::Image((void*)(intptr_t)overworld_texture, - // ImVec2(overworld.overworldMapBitmap->GetWidth(), - // overworld.overworldMapBitmap->GetHeight())); - } - if (ImGui::BeginTabBar("##TabBar")) { DrawOverworldEditor(); DrawDungeonEditor(); + DrawSpriteEditor(); DrawScreenEditor(); DrawROMInfo(); ImGui::EndTabBar(); @@ -50,6 +40,7 @@ void Editor::DrawYazeMenu() { DrawFileMenu(); DrawEditMenu(); DrawViewMenu(); + DrawHelpMenu(); ImGui::EndMenuBar(); } @@ -60,7 +51,8 @@ void Editor::DrawYazeMenu() { std::string filePathName = ImGuiFileDialog::Instance()->GetFilePathName(); std::string filePath = ImGuiFileDialog::Instance()->GetCurrentPath(); rom.LoadFromFile(filePathName); - isLoaded = true; + owEditor.SetRom(rom); + rom_data_ = (void *)rom.GetRawData(); } // close @@ -137,10 +129,16 @@ void Editor::DrawEditMenu() const { void Editor::DrawViewMenu() const { static bool show_imgui_metrics = false; static bool show_imgui_style_editor = false; + static bool show_memory_editor = false; if (show_imgui_metrics) { ImGui::ShowMetricsWindow(&show_imgui_metrics); } + if (show_memory_editor) { + static MemoryEditor mem_edit; + mem_edit.DrawWindow("Memory Editor", rom_data_, rom.getSize()); + } + if (show_imgui_style_editor) { ImGui::Begin("Style Editor (ImGui)", &show_imgui_style_editor); ImGui::ShowStyleEditor(); @@ -154,6 +152,8 @@ void Editor::DrawViewMenu() const { ImGui::EndMenu(); } + ImGui::MenuItem("HEX Editor", nullptr, &show_memory_editor); + ImGui::Separator(); if (ImGui::BeginMenu("GUI Tools")) { ImGui::MenuItem("Metrics (ImGui)", nullptr, &show_imgui_metrics); @@ -165,6 +165,14 @@ void Editor::DrawViewMenu() const { } } +void Editor::DrawHelpMenu() const { + if (ImGui::BeginMenu("Help")) { + if (ImGui::MenuItem("About")) { + } + ImGui::EndMenu(); + } +} + // first step would be to decompress all graphics data from the game // (in alttp that's easy they're all located in the same location all the // same sheet size 128x32) have a code that convert PC address to SNES and @@ -235,6 +243,12 @@ void Editor::DrawDungeonEditor() { } } +void Editor::DrawSpriteEditor() { + if (ImGui::BeginTabItem("Sprites")) { + ImGui::EndTabItem(); + } +} + void Editor::DrawScreenEditor() { if (ImGui::BeginTabItem("Screens")) { ImGui::EndTabItem(); @@ -243,7 +257,7 @@ void Editor::DrawScreenEditor() { void Editor::DrawROMInfo() { if (ImGui::BeginTabItem("ROM Info")) { - if (isLoaded) { + if (rom.isLoaded()) { ImGui::Text("Title: %s", rom.getTitle()); ImGui::Text("Version: %d", rom.getVersion()); ImGui::Text("ROM Size: %ld", rom.getSize()); diff --git a/src/Application/Editor/Editor.h b/src/Application/Editor/Editor.h index ba1d0297..9067f5cd 100644 --- a/src/Application/Editor/Editor.h +++ b/src/Application/Editor/Editor.h @@ -4,7 +4,6 @@ #include #include "Core/Icons.h" -#include "Data/Overworld.h" #include "OverworldEditor.h" #include "ImGuiFileDialog/ImGuiFileDialog.h" #include "Utils/ROM.h" @@ -13,6 +12,7 @@ #include "imgui/imgui.h" #include "imgui/imgui_internal.h" #include "imgui/misc/cpp/imgui_stdlib.h" +#include "imgui/imgui_memory_editor.h" namespace yaze { namespace Application { @@ -27,20 +27,20 @@ class Editor { void DrawFileMenu() const; void DrawEditMenu() const; void DrawViewMenu() const; + void DrawHelpMenu() const; void DrawOverworldEditor(); void DrawDungeonEditor(); + void DrawSpriteEditor(); void DrawScreenEditor(); void DrawROMInfo(); - bool isLoaded = false; - bool doneLoaded = false; - GLuint *overworld_texture; - Data::Overworld overworld; - ::yaze::Application::Editor::OverworldEditor owEditor; + OverworldEditor owEditor; Utils::ROM rom; + void* rom_data_; + bool isLoaded = true; ImGuiTableFlags toolset_table_flags = ImGuiTableFlags_SizingFixedFit; }; diff --git a/src/Application/Editor/OverworldEditor.cc b/src/Application/Editor/OverworldEditor.cc index 7dbbf61c..a288e111 100644 --- a/src/Application/Editor/OverworldEditor.cc +++ b/src/Application/Editor/OverworldEditor.cc @@ -1,5 +1,7 @@ #include "OverworldEditor.h" #include "Core/Icons.h" +#include "Graphics/Bitmap.h" +#include "Graphics/Tile.h" #include "imgui.h" #include @@ -7,6 +9,28 @@ namespace yaze { namespace Application { namespace Editor { void OverworldEditor::Update() { + + if (rom_.isLoaded()) { + if (!doneLoaded) { + overworld.Load(rom_); + Graphics::CreateAllGfxData(rom_.GetRawData(), allGfx16Ptr); + + // allgfxBitmap.LoadBitmapFromROM(allGfx16Ptr, allgfx_texture, + // &allgfx_width, + // &allgfx_height); + doneLoaded = true; + } + // Graphics::tile8 all_tiles; + // all_tiles.id = 1; + // all_tiles.data = + // Graphics::export_tile_to_png(tile8 rawtile, const r_palette pal, const + // char *filename) + } + + if (show_changelist_) { + DrawChangelist(); + } + DrawToolset(); ImGui::Separator(); if (ImGui::BeginTable("#owEditTable", 2, ow_edit_flags, ImVec2(0, 0))) { @@ -21,7 +45,7 @@ void OverworldEditor::Update() { } void OverworldEditor::DrawToolset() { - if (ImGui::BeginTable("Toolset", 12, toolset_table_flags, ImVec2(0, 0))) { + if (ImGui::BeginTable("Toolset", 14, toolset_table_flags, ImVec2(0, 0))) { ImGui::TableSetupColumn("#undoTool"); ImGui::TableSetupColumn("#redoTool"); @@ -31,10 +55,12 @@ void OverworldEditor::DrawToolset() { ImGui::TableSetupColumn("#zoomInTool"); ImGui::TableSetupColumn("#separator"); ImGui::TableSetupColumn("#history"); - ImGui::TableSetupColumn("#entranceExitTool"); + ImGui::TableSetupColumn("#entranceTool"); + ImGui::TableSetupColumn("#exitTool"); ImGui::TableSetupColumn("#itemTool"); ImGui::TableSetupColumn("#spriteTool"); ImGui::TableSetupColumn("#transportTool"); + ImGui::TableSetupColumn("#musicTool"); ImGui::TableNextColumn(); ImGui::Button(ICON_MD_UNDO); @@ -43,7 +69,12 @@ void OverworldEditor::DrawToolset() { ImGui::Button(ICON_MD_REDO); ImGui::TableNextColumn(); - ImGui::Button(ICON_MD_MANAGE_HISTORY); + if (ImGui::Button(ICON_MD_MANAGE_HISTORY)) { + if (!show_changelist_) + show_changelist_ = true; + else + show_changelist_ = false; + } ImGui::TableNextColumn(); ImGui::Text(ICON_MD_MORE_VERT); @@ -61,7 +92,10 @@ void OverworldEditor::DrawToolset() { ImGui::Button(ICON_MD_DRAW); ImGui::TableNextColumn(); - ImGui::Button(ICON_MD_SENSOR_DOOR); + ImGui::Button(ICON_MD_DOOR_FRONT); + + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_DOOR_BACK); ImGui::TableNextColumn(); ImGui::Button(ICON_MD_GRASS); @@ -72,6 +106,9 @@ void OverworldEditor::DrawToolset() { ImGui::TableNextColumn(); ImGui::Button(ICON_MD_ADD_LOCATION); + ImGui::TableNextColumn(); + ImGui::Button(ICON_MD_MUSIC_NOTE); + ImGui::EndTable(); } } @@ -121,8 +158,8 @@ void OverworldEditor::DrawOverworldMapSettings() { ImGui::Text("Msg ID"); ImGui::SameLine(); ImGui::SetNextItemWidth(50.f); - ImGui::InputText("##msgid", spr_palette_, kMessageIdSize); - + ImGui::InputText("##msgid", spr_palette_, kMessageIdSize); + ImGui::TableNextColumn(); ImGui::Checkbox("Show grid", &opt_enable_grid); ImGui::EndTable(); @@ -222,18 +259,35 @@ void OverworldEditor::DrawOverworldCanvas() { } void OverworldEditor::DrawTileSelector() { if (ImGui::BeginTabBar("##TabBar")) { + if (ImGui::BeginTabItem("Tile8")) { + if (rom_.isLoaded()) { + ImGui::Image((void *)(intptr_t)overworld_texture, + ImVec2(overworld.overworldMapBitmap->GetWidth(), + overworld.overworldMapBitmap->GetHeight())); + } + + ImGui::EndTabItem(); + } if (ImGui::BeginTabItem("Tile16")) { ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Tile8")) { - ImGui::EndTabItem(); - } ImGui::EndTabBar(); } } +void OverworldEditor::DrawChangelist() { + if (!ImGui::Begin("Changelist")) { + + ImGui::End(); + } + + + ImGui::Text("Test"); + ImGui::End(); +} + } // namespace Editor } // namespace Application } // namespace yaze \ No newline at end of file diff --git a/src/Application/Editor/OverworldEditor.h b/src/Application/Editor/OverworldEditor.h index 333f2494..e77d0482 100644 --- a/src/Application/Editor/OverworldEditor.h +++ b/src/Application/Editor/OverworldEditor.h @@ -2,25 +2,50 @@ #define YAZE_APPLICATION_EDITOR_OVERWORLDEDITOR_H #include "Core/Icons.h" +#include "Data/Overworld.h" +#include "Utils/Compression.h" #include "imgui/imgui.h" #include "imgui/misc/cpp/imgui_stdlib.h" namespace yaze { namespace Application { namespace Editor { + +using byte = unsigned char; + class OverworldEditor { public: void Update(); + void SetRom(Utils::ROM & rom) { rom_ = rom; } + private: void DrawToolset(); void DrawOverworldMapSettings(); void DrawOverworldCanvas(); void DrawTileSelector(); + void DrawChangelist(); + + bool show_changelist_ = false; + + Utils::ROM rom_; + Data::Overworld overworld; + Utils::ALTTPCompression alttp_compressor_; + Graphics::Bitmap allgfxBitmap; + int allgfx_width = 0; + int allgfx_height = 0; + GLuint *allgfx_texture = nullptr; + + byte* allGfx16Ptr = new byte[(128 * 7136) / 2]; + + GLuint *overworld_texture; + ImGuiTableFlags toolset_table_flags = ImGuiTableFlags_SizingFixedFit; ImGuiTableFlags ow_map_settings_flags = ImGuiTableFlags_Borders; - ImGuiTableFlags ow_edit_flags = ImGuiTableFlags_Reorderable | ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingStretchSame; + ImGuiTableFlags ow_edit_flags = ImGuiTableFlags_Reorderable | + ImGuiTableFlags_Resizable | + ImGuiTableFlags_SizingStretchSame; float canvas_table_ratio = 30.f; @@ -32,6 +57,9 @@ private: int current_world_ = 0; + bool isLoaded = false; + bool doneLoaded = false; + constexpr static int kByteSize = 3; constexpr static int kMessageIdSize = 5; constexpr static float kInputFieldSize = 30.f; diff --git a/src/Application/Graphics/Bitmap.cc b/src/Application/Graphics/Bitmap.cc index 3ed3b652..a67c69af 100644 --- a/src/Application/Graphics/Bitmap.cc +++ b/src/Application/Graphics/Bitmap.cc @@ -1,16 +1,181 @@ #include "Bitmap.h" +#include "Utils/ROM.h" +#include "Utils/Compression.h" namespace yaze { namespace Application { namespace Graphics { -Bitmap::Bitmap(int width, int height, byte* data) +int GetPCGfxAddress(byte *romData, byte id) { + char** info1, **info2,** info3, **info4; + int gfxPointer1 = + Utils::lorom_snes_to_pc((romData[Constants::gfx_1_pointer + 1] << 8) + + (romData[Constants::gfx_1_pointer]), info1); + int gfxPointer2 = + Utils::lorom_snes_to_pc((romData[Constants::gfx_2_pointer + 1] << 8) + + (romData[Constants::gfx_2_pointer]), info2); + int gfxPointer3 = + Utils::lorom_snes_to_pc((romData[Constants::gfx_3_pointer + 1] << 8) + + (romData[Constants::gfx_3_pointer]), info3); + + byte gfxGamePointer1 = romData[gfxPointer1 + id]; + byte gfxGamePointer2 = romData[gfxPointer2 + id]; + byte gfxGamePointer3 = romData[gfxPointer3 + id]; + + return Utils::lorom_snes_to_pc(Utils::AddressFromBytes(gfxGamePointer1, gfxGamePointer2, + gfxGamePointer3), info4); +} + +byte *CreateAllGfxDataRaw(byte *romData) { + // 0-112 -> compressed 3bpp bgr -> (decompressed each) 0x600 bytes + // 113-114 -> compressed 2bpp -> (decompressed each) 0x800 bytes + // 115-126 -> uncompressed 3bpp sprites -> (each) 0x600 bytes + // 127-217 -> compressed 3bpp sprites -> (decompressed each) 0x600 bytes + // 218-222 -> compressed 2bpp -> (decompressed each) 0x800 bytes + + Utils::ALTTPCompression alttp_compressor_; + + byte *buffer = new byte[346624]; + int bufferPos = 0; + byte *data = new byte[2048]; + unsigned int uncompressedSize = 0; + unsigned int compressedSize = 0; + + for (int i = 0; i < Constants::NumberOfSheets; i++) { + isbpp3[i] = ((i >= 0 && i <= 112) || // Compressed 3bpp bg + (i >= 115 && i <= 126) || // Uncompressed 3bpp sprites + (i >= 127 && i <= 217) // Compressed 3bpp sprites + ); + + // uncompressed sheets + if (i >= 115 && i <= 126) { + data = new byte[Constants::Uncompressed3BPPSize]; + int startAddress = GetPCGfxAddress(romData, (byte)i); + for (int j = 0; j < Constants::Uncompressed3BPPSize; j++) { + data[j] = romData[j + startAddress]; + } + } else { + data = alttp_compressor_.DecompressGfx( + romData, GetPCGfxAddress(romData, (byte)i), + Constants::UncompressedSheetSize, &uncompressedSize, &compressedSize); + } + + for (int j = 0; j < sizeof(data); j++) { + buffer[j + bufferPos] = data[j]; + } + + bufferPos += sizeof(data); + } + + return buffer; +} + +void CreateAllGfxData(byte *romData, byte* allgfx16Ptr) { + byte* data = CreateAllGfxDataRaw(romData); + byte* newData = + new byte[0x6F800]; // NEED TO GET THE APPROPRIATE SIZE FOR THAT + byte* mask = new byte[]{0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; + int sheetPosition = 0; + + // 8x8 tile + for (int s = 0; s < Constants::NumberOfSheets; s++) // Per Sheet + { + for (int j = 0; j < 4; j++) // Per Tile Line Y + { + for (int i = 0; i < 16; i++) // Per Tile Line X + { + for (int y = 0; y < 8; y++) // Per Pixel Line + { + if (isbpp3[s]) { + byte lineBits0 = + data[(y * 2) + (i * 24) + (j * 384) + sheetPosition]; + byte lineBits1 = + data[(y * 2) + (i * 24) + (j * 384) + 1 + sheetPosition]; + byte lineBits2 = + data[(y) + (i * 24) + (j * 384) + 16 + sheetPosition]; + + for (int x = 0; x < 4; x++) // Per Pixel X + { + byte pixdata = 0; + byte pixdata2 = 0; + + if ((lineBits0 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 1; + } + if ((lineBits1 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 2; + } + if ((lineBits2 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 4; + } + + if ((lineBits0 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 1; + } + if ((lineBits1 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 2; + } + if ((lineBits2 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 4; + } + + newData[(y * 64) + (x) + (i * 4) + (j * 512) + (s * 2048)] = + (byte)((pixdata << 4) | pixdata2); + } + } else { + byte lineBits0 = + data[(y * 2) + (i * 16) + (j * 256) + sheetPosition]; + byte lineBits1 = + data[(y * 2) + (i * 16) + (j * 256) + 1 + sheetPosition]; + + for (int x = 0; x < 4; x++) // Per Pixel X + { + byte pixdata = 0; + byte pixdata2 = 0; + + if ((lineBits0 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 1; + } + if ((lineBits1 & mask[(x * 2)]) == mask[(x * 2)]) { + pixdata += 2; + } + + if ((lineBits0 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 1; + } + if ((lineBits1 & mask[(x * 2) + 1]) == mask[(x * 2) + 1]) { + pixdata2 += 2; + } + + newData[(y * 64) + (x) + (i * 4) + (j * 512) + (s * 2048)] = + (byte)((pixdata << 4) | pixdata2); + } + } + } + } + } + + if (isbpp3[s]) { + sheetPosition += Constants::Uncompressed3BPPSize; + } else { + sheetPosition += Constants::UncompressedSheetSize; + } + } + + byte *allgfx16Data = (byte *) allgfx16Ptr; + + for (int i = 0; i < 0x6F800; i++) { + allgfx16Data[i] = newData[i]; + } +} + +Bitmap::Bitmap(int width, int height, byte *data) : width_(width), height_(height), pixel_data_(data) {} -void Bitmap::Create(GLuint* out_texture) { - // // Read the pixel data from the ROM +void Bitmap::Create(GLuint *out_texture) { + // // Read the pixel data from the ROM // SDL_RWops * src = SDL_RWFromMem(pixel_data_, 0); - // // Create the surface from that RW stream + // // Create the surface from that RW stream // SDL_Surface* surface = SDL_LoadBMP_RW(src, SDL_FALSE); // GLenum mode = 0; // Uint8 bpp = surface->format->BytesPerPixel; @@ -45,21 +210,18 @@ void Bitmap::Create(GLuint* out_texture) { *out_texture = image_texture; } -int Bitmap::GetWidth() { - return width_; -} -int Bitmap::GetHeight() { - return height_; -} +int Bitmap::GetWidth() { return width_; } +int Bitmap::GetHeight() { return height_; } // Simple helper function to load an image into a OpenGL texture with common // settings -bool Bitmap::LoadBitmapFromROM(unsigned char* texture_data, GLuint* out_texture, - int* out_width, int* out_height) { +bool Bitmap::LoadBitmapFromROM(unsigned char *texture_data, GLuint *out_texture, + int *out_width, int *out_height) { // Load from file int image_width = 0; int image_height = 0; - if (texture_data == NULL) return false; + if (texture_data == NULL) + return false; // Create a OpenGL texture identifier GLuint image_texture; @@ -70,9 +232,9 @@ bool Bitmap::LoadBitmapFromROM(unsigned char* texture_data, GLuint* out_texture, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_EDGE); // This is required on WebGL for non - // power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Same + GL_CLAMP_TO_EDGE); // This is required on WebGL for non + // power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Same // Upload pixels into texture #if defined(GL_UNPACK_ROW_LENGTH) && !defined(__EMSCRIPTEN__) @@ -88,6 +250,6 @@ bool Bitmap::LoadBitmapFromROM(unsigned char* texture_data, GLuint* out_texture, return true; } -} // namespace Graphics -} // namespace Application -} // namespace yaze +} // namespace Graphics +} // namespace Application +} // namespace yaze diff --git a/src/Application/Graphics/Bitmap.h b/src/Application/Graphics/Bitmap.h index 21b61fd0..0498b144 100644 --- a/src/Application/Graphics/Bitmap.h +++ b/src/Application/Graphics/Bitmap.h @@ -14,6 +14,7 @@ namespace Application { namespace Graphics { using byte = unsigned char; +using namespace Core; class Bitmap { public: @@ -31,8 +32,14 @@ private: int width_; int height_; byte *pixel_data_; - SDL_PixelFormat pixel_format_; }; + +static bool isbpp3[Constants::NumberOfSheets]; + +int GetPCGfxAddress(byte* romData, byte id); +byte* CreateAllGfxDataRaw(byte* romData); +void CreateAllGfxData(byte* romData, byte* allgfx16Ptr); + } // namespace Graphics } // namespace Application } // namespace yaze diff --git a/src/Application/Graphics/Tile.cc b/src/Application/Graphics/Tile.cc index 129dd01a..c3ddf726 100644 --- a/src/Application/Graphics/Tile.cc +++ b/src/Application/Graphics/Tile.cc @@ -28,8 +28,8 @@ ushort TileInfo::toShort() { return value; } -char* hexString(const char* str, const unsigned int size) { - char* toret = (char*)malloc(size * 3 + 1); +char *hexString(const char *str, const unsigned int size) { + char *toret = (char *)malloc(size * 3 + 1); unsigned int i; for (i = 0; i < size; i++) { @@ -40,8 +40,8 @@ char* hexString(const char* str, const unsigned int size) { } void export_tile_to_png(tile8 rawtile, const r_palette pal, - const char* filename) { - FILE* fp = fopen(filename, "wb"); + const char *filename) { + FILE *fp = fopen(filename, "wb"); png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); png_infop info_ptr = png_create_info_struct(png_ptr); @@ -49,8 +49,8 @@ void export_tile_to_png(tile8 rawtile, const r_palette pal, png_set_strip_alpha(png_ptr); png_read_update_info(png_ptr, info_ptr); - png_color* png_palette = - (png_color*)png_malloc(png_ptr, pal.size * sizeof(png_color)); + png_color *png_palette = + (png_color *)png_malloc(png_ptr, pal.size * sizeof(png_color)); for (unsigned int i = 0; i < pal.size; i++) { png_palette[i].blue = pal.colors[i].blue; @@ -65,9 +65,9 @@ void export_tile_to_png(tile8 rawtile, const r_palette pal, png_write_info(png_ptr, info_ptr); png_set_packing(png_ptr); - png_byte* row_pointers[8]; + png_byte *row_pointers[8]; for (unsigned int i = 0; i < 8; i++) { - row_pointers[i] = (png_byte*)png_malloc(png_ptr, sizeof(png_byte)); + row_pointers[i] = (png_byte *)png_malloc(png_ptr, sizeof(png_byte)); memcpy(row_pointers[i], rawtile.data + i * 8, 8); } @@ -80,37 +80,37 @@ void export_tile_to_png(tile8 rawtile, const r_palette pal, png_free(png_ptr, row_pointers); } -tile8 unpack_bpp1_tile(const char* data, const unsigned int offset) { +tile8 unpack_bpp1_tile(const char *data, const unsigned int offset) { return (unpack_bpp_tile(data, offset, 1)); } -tile8 unpack_bpp2_tile(const char* data, const unsigned int offset) { +tile8 unpack_bpp2_tile(const char *data, const unsigned int offset) { return (unpack_bpp_tile(data, offset, 2)); } -tile8 unpack_bpp3_tile(const char* data, const unsigned int offset) { +tile8 unpack_bpp3_tile(const char *data, const unsigned int offset) { return (unpack_bpp_tile(data, offset, 3)); } -tile8 unpack_bpp4_tile(const char* data, const unsigned int offset) { +tile8 unpack_bpp4_tile(const char *data, const unsigned int offset) { return (unpack_bpp_tile(data, offset, 4)); } -tile8 unpack_bpp8_tile(const char* data, const unsigned int offset) { +tile8 unpack_bpp8_tile(const char *data, const unsigned int offset) { return (unpack_bpp_tile(data, offset, 8)); } -tile8 unpack_mode7_tile(const char* data, const unsigned int offset) { +tile8 unpack_mode7_tile(const char *data, const unsigned int offset) { tile8 tile; memcpy(tile.data, data + offset, 64); return tile; } -tile8 unpack_bpp_tile(const char* data, const unsigned int offset, +tile8 unpack_bpp_tile(const char *data, const unsigned int offset, const unsigned bpp) { tile8 tile; assert(bpp >= 1 && bpp <= 8); - unsigned int bpp_pos[8]; // More for conveniance and readibility + unsigned int bpp_pos[8]; // More for conveniance and readibility for (int col = 0; col < 8; col++) { for (int row = 0; row < 8; row++) { if (bpp == 1) { @@ -155,33 +155,33 @@ tile8 unpack_bpp_tile(const char* data, const unsigned int offset, return tile; } -byte* pack_bpp1_tile(const tile8 tile) { +byte *pack_bpp1_tile(const tile8 tile) { unsigned int p = 1; return pack_bpp_tile(tile, 1, &p); } -byte* pack_bpp2_tile(const tile8 tile) { +byte *pack_bpp2_tile(const tile8 tile) { unsigned int p = 1; return pack_bpp_tile(tile, 2, &p); } -byte* pack_bpp3_tile(const tile8 tile) { +byte *pack_bpp3_tile(const tile8 tile) { unsigned int p = 1; return pack_bpp_tile(tile, 3, &p); } -byte* pack_bpp4_tile(const tile8 tile) { +byte *pack_bpp4_tile(const tile8 tile) { unsigned int p = 1; return pack_bpp_tile(tile, 4, &p); } -byte* pack_bpp8_tile(const tile8 tile) { +byte *pack_bpp8_tile(const tile8 tile) { unsigned int p = 1; return pack_bpp_tile(tile, 8, &p); } -byte* pack_bpp_tile(tile8 tile, const unsigned int bpp, unsigned int* size) { - byte* output = (byte*)malloc(bpp * 8); +byte *pack_bpp_tile(tile8 tile, const unsigned int bpp, unsigned int *size) { + byte *output = (byte *)malloc(bpp * 8); memset(output, 0, bpp * 8); unsigned maxcolor = 2 << bpp; *size = 0; @@ -189,14 +189,17 @@ byte* pack_bpp_tile(tile8 tile, const unsigned int bpp, unsigned int* size) { for (unsigned int col = 0; col < 8; col++) { for (unsigned int row = 0; row < 8; row++) { byte color = tile.data[col * 8 + row]; - if (color > maxcolor) return NULL; + if (color > maxcolor) + return NULL; - if (bpp == 1) output[col] += (byte)((color & 1) << (7 - row)); + if (bpp == 1) + output[col] += (byte)((color & 1) << (7 - row)); if (bpp >= 2) { output[col * 2] += (byte)((color & 1) << (7 - row)); output[col * 2 + 1] += (byte)(((color & 2) == 2) << (7 - row)); } - if (bpp == 3) output[16 + col] += (byte)(((color & 4) == 4) << (7 - row)); + if (bpp == 3) + output[16 + col] += (byte)(((color & 4) == 4) << (7 - row)); if (bpp >= 4) { output[16 + col * 2] += (byte)(((color & 4) == 4) << (7 - row)); output[16 + col * 2 + 1] += (byte)(((color & 8) == 8) << (7 - row)); @@ -213,6 +216,6 @@ byte* pack_bpp_tile(tile8 tile, const unsigned int bpp, unsigned int* size) { return output; } -} // namespace Graphics -} // namespace Application -} // namespace yaze +} // namespace Graphics +} // namespace Application +} // namespace yaze diff --git a/src/Application/Utils/ROM.cc b/src/Application/Utils/ROM.cc index 78247f33..cb9954dc 100644 --- a/src/Application/Utils/ROM.cc +++ b/src/Application/Utils/ROM.cc @@ -250,6 +250,7 @@ void ROM::LoadFromFile(const std::string& path) { fclose(file); memcpy(title, current_rom_, 21); + type = LoROM; fastrom = (current_rom_[21] & 0b00110000) == 0b00110000; if (current_rom_[21] & 1) @@ -265,6 +266,11 @@ void ROM::LoadFromFile(const std::string& path) { make_sense = false; if ((checksum ^ checksum_comp) == 0xFFFF) make_sense = true; + + loaded = true; + + + } int ROM::SnesToPc(int addr) { @@ -293,7 +299,7 @@ int ROM::PcToSnes(int addr) { return ((addr * 2) & 0xFF0000) + (addr & 0x7FFF) + 0x8000; } -int ROM::AddressFromBytes(byte addr1, byte addr2, byte addr3) { +int AddressFromBytes(byte addr1, byte addr2, byte addr3) { return (addr1 << 16) | (addr2 << 8) | addr3; } diff --git a/src/Application/Utils/ROM.h b/src/Application/Utils/ROM.h index d568f47d..b41d04ea 100644 --- a/src/Application/Utils/ROM.h +++ b/src/Application/Utils/ROM.h @@ -48,11 +48,12 @@ int hirom_pc_to_snes(const unsigned int pc_addr); int hirom_sram_pc_to_snes(const unsigned int pc_addr); } +int AddressFromBytes(byte addr1, byte addr2, byte addr3); + class ROM { public: int SnesToPc(int addr); int PcToSnes(int addr); - int AddressFromBytes(byte addr1, byte addr2, byte addr3); short AddressFromBytes(byte addr1, byte addr2); ushort ReadShort(int addr); void Write(int addr, byte value); @@ -69,10 +70,14 @@ class ROM { unsigned int getSize() const { return size; } char getVersion() const { return version; } + bool isLoaded() const { return loaded; } + private: std::vector original_rom_; std::vector working_rom_; + bool loaded = false; + byte* current_rom_; enum rom_type type;