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;