diff --git a/src/app/core/common.cc b/src/app/core/common.cc index fe4eba1f..f43dda40 100644 --- a/src/app/core/common.cc +++ b/src/app/core/common.cc @@ -326,10 +326,10 @@ void ApplyBpsPatch(const std::vector &source, absl::StatusOr CheckVersion(const char *version) { std::string version_string = version; - if (version_string != core::kYazeVersion) { + if (version_string != kYazeVersion) { std::string message = absl::StrFormat("Yaze version mismatch: expected %s, got %s", - core::kYazeVersion, version_string.c_str()); + kYazeVersion, version_string.c_str()); return absl::InvalidArgumentError(message); } return version_string; diff --git a/src/app/core/constants.h b/src/app/core/constants.h index f9ebb67f..467fa7bc 100644 --- a/src/app/core/constants.h +++ b/src/app/core/constants.h @@ -126,680 +126,8 @@ namespace yaze { namespace app { namespace core { -constexpr uint32_t kRedPen = 0xFF0000FF; constexpr std::string_view kYazeVersion = "0.2.0"; -// ============================================================================ -// Magic numbers -// ============================================================================ - -constexpr int UncompressedSheetSize = 0x0800; - -constexpr int NumberOfRooms = 296; -constexpr int NumberOfColors = 3143; - -// ============================================================================ -// Game 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 hud_palettes = 0xDD660; -constexpr int maxGfx = 0xC3FB5; - -constexpr int kTilesheetWidth = 128; -constexpr int kTilesheetHeight = 32; -constexpr int kTilesheetDepth = 8; - -// ============================================================================ -// 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 - -// ============================================================================ -// 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 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?)"}; - -static const std::string kSpriteDefaultNames[]{ - "00 Raven", - "01 Vulture", - "02 Flying Stalfos Head", - "03 No Pointer (Empty", - "04 Pull Switch (good", - "05 Pull Switch (unused", - "06 Pull Switch (bad", - "07 Pull Switch (unused", - "08 Octorock (one way", - "09 Moldorm (Boss", - "0A Octorock (four way", - "0B Chicken", - "0C Octorock (?", - "0D Buzzblock", - "0E Snapdragon", - "0F Octoballoon", - "10 Octoballon Hatchlings", - "11 Hinox", - "12 Moblin", - "13 Mini Helmasaure", - "14 Gargoyle's Domain Gate", - "15 Antifairy", - "16 Sahasrahla / Aginah", - "17 Bush Hoarder", - "18 Mini Moldorm", - "19 Poe", - "1A Dwarves", - "1B Arrow in wall", - "1C Statue", - "1D Weathervane", - "1E Crystal Switch", - "1F Bug-Catching Kid", - "20 Sluggula", - "21 Push Switch", - "22 Ropa", - "23 Red Bari", - "24 Blue Bari", - "25 Talking Tree", - "26 Hardhat Beetle", - "27 Deadrock", - "28 Storytellers", - "29 Blind Hideout attendant", - "2A Sweeping Lady", - "2B Storytellers", - "2C Lumberjacks", - "2D Telepathic Stones", - "2E Multipurpose Sprite", - "2F Race Npc", - "30 Person?", - "31 Fortune Teller", - "32 Angry Brothers", - "33 Pull for items", - "34 Scared Girl", - "35 Innkeeper", - "36 Witch", - "37 Waterfall", - "38 Arrow Target", - "39 Average Middle", - "3A Half Magic Bat", - "3B Dash Item", - "3C Village Kid", - "3D Signs? Chicken lady also showed up / Scared ladies outside houses.", - "3E Rock Hoarder", - "3F Tutorial Soldier", - "40 Lightning Lock", - "41 Blue Sword Soldier / Used by guards to detect player", - "42 Green Sword Soldier", - "43 Red Spear Soldier", - "44 Assault Sword Soldier", - "45 Green Spear Soldier", - "46 Blue Archer", - "47 Green Archer", - "48 Red Javelin Soldier", - "49 Red Javelin Soldier 2", - "4A Red Bomb Soldiers", - "4B Green Soldier Recruits", - "4C Geldman", - "4D Rabbit", - "4E Popo", - "4F Popo 2", - "50 Cannon Balls", - "51 Armos", - "52 Giant Zora", - "53 Armos Knights (Boss", - "54 Lanmolas (Boss", - "55 Fireball Zora", - "56 Walking Zora", - "57 Desert Palace Barriers", - "58 Crab", - "59 Bird", - "5A Squirrel", - "5B Spark (Left to Right", - "5C Spark (Right to Left", - "5D Roller (vertical moving", - "5E Roller (vertical moving", - "5F Roller", - "60 Roller (horizontal moving", - "61 Beamos", - "62 Master Sword", - "63 Devalant (Non", - "64 Devalant (Shooter", - "65 Shooting Gallery Proprietor", - "66 Moving Cannon Ball Shooters (Right", - "67 Moving Cannon Ball Shooters (Left", - "68 Moving Cannon Ball Shooters (Down", - "69 Moving Cannon Ball Shooters (Up", - "6A Ball N' Chain Trooper", - "6B Cannon Soldier", - "6C Mirror Portal", - "6D Rat", - "6E Rope", - "6F Keese", - "70 Helmasaur King Fireball", - "71 Leever", - "72 Activator for the ponds (where you throw in items", - "73 Uncle / Priest", - "74 Running Man", - "75 Bottle Salesman", - "76 Princess Zelda", - "77 Antifairy (Alternate", - "78 Village Elder", - "79 Bee", - "7A Agahnim", - "7B Agahnim Energy Ball", - "7C Hyu", - "7D Big Spike Trap", - "7E Guruguru Bar (Clockwise", - "7F Guruguru Bar (Counter Clockwise", - "80 Winder", - "81 Water Tektite", - "82 Antifairy Circle", - "83 Green Eyegore", - "84 Red Eyegore", - "85 Yellow Stalfos", - "86 Kodongos", - "87 Flames", - "88 Mothula (Boss", - "89 Mothula's Beam", - "8A Spike Trap", - "8B Gibdo", - "8C Arrghus (Boss", - "8D Arrghus spawn", - "8E Terrorpin", - "8F Slime", - "90 Wallmaster", - "91 Stalfos Knight", - "92 Helmasaur King", - "93 Bumper", - "94 Swimmers", - "95 Eye Laser (Right", - "96 Eye Laser (Left", - "97 Eye Laser (Down", - "98 Eye Laser (Up", - "99 Pengator", - "9A Kyameron", - "9B Wizzrobe", - "9C Tadpoles", - "9D Tadpoles", - "9E Ostrich (Haunted Grove", - "9F Flute", - "A0 Birds (Haunted Grove", - "A1 Freezor", - "A2 Kholdstare (Boss", - "A3 Kholdstare's Shell", - "A4 Falling Ice", - "A5 Zazak Fireball", - "A6 Red Zazak", - "A7 Stalfos", - "A8 Bomber Flying Creatures from Darkworld", - "A9 Bomber Flying Creatures from Darkworld", - "AA Pikit", - "AB Maiden", - "AC Apple", - "AD Lost Old Man", - "AE Down Pipe", - "AF Up Pipe", - "B0 Right Pip", - "B1 Left Pipe", - "B2 Good bee again?", - "B3 Hylian Inscription", - "B4 Thief?s chest (not the one that follows you", - "B5 Bomb Salesman", - "B6 Kiki", - "B7 Maiden following you in Blind Dungeon", - "B8 Monologue Testing Sprite", - "B9 Feuding Friends on Death Mountain", - "BA Whirlpool", - "BB Salesman / chestgame guy / 300 rupee giver guy / Chest game thief", - "BC Drunk in the inn", - "BD Vitreous (Large Eyeball", - "BE Vitreous (Small Eyeball", - "BF Vitreous' Lightning", - "C0 Monster in Lake of Ill Omen / Quake Medallion", - "C1 Agahnim teleporting Zelda to dark world", - "C2 Boulders", - "C3 Gibo", - "C4 Thief", - "C5 Medusa", - "C6 Four Way Fireball Spitters (spit when you use your sword", - "C7 Hokku", - "C8 Big Fairy who heals you", - "C9 Tektite", - "CA Chain Chomp", - "CB Trinexx", - "CC Another part of trinexx", - "CD Yet another part of trinexx", - "CE Blind The Thief (Boss)", - "CF Swamola", - "D0 Lynel", - "D1 Bunny Beam", - "D2 Flopping fish", - "D3 Stal", - "D4 Landmine", - "D5 Digging Game Proprietor", - "D6 Ganon", - "D7 Copy of Ganon", - "D8 Heart", - "D9 Green Rupee", - "DA Blue Rupee", - "DB Red Rupee", - "DC Bomb Refill (1)", - "DD Bomb Refill (4)", - "DE Bomb Refill (8)", - "DF Small Magic Refill", - "E0 Full Magic Refill", - "E1 Arrow Refill (5)", - "E2 Arrow Refill (10)", - "E3 Fairy", - "E4 Key", - "E5 Big Key", - "E6 Shield", - "E7 Mushroom", - "E8 Fake Master Sword", - "E9 Magic Shop dude / His items", - "EA Heart Container", - "EB Heart Piece", - "EC Bushes", - "ED Cane Of Somaria Platform", - "EE Mantle", - "EF Cane of Somaria Platform (Unused)", - "F0 Cane of Somaria Platform (Unused)", - "F1 Cane of Somaria Platform (Unused)", - "F2 Medallion Tablet", - "F3", - "F4 Falling Rocks", - "F5", - "F6", - "F7", - "F8", - "F9", - "FA", - "FB", - "FC", - "FD", - "FE", - "FF", -}; - -static const std::string overlordnames[] = { - "Overlord_SpritePositionTarget", - "Overlord_AllDirectionMetalBallFactory", - "Overlord_CascadeMetalBallFactory", - "Overlord_StalfosFactory", - "Overlord_StalfosTrap", - "Overlord_SnakeTrap", - "Overlord_MovingFloor", - "Overlord_ZolFactory", - "Overlord_WallMasterFactory", - "Overlord_CrumbleTilePath 1", - "Overlord_CrumbleTilePath 2", - "Overlord_CrumbleTilePath 3", - "Overlord_CrumbleTilePath 4", - "Overlord_CrumbleTilePath 5", - "Overlord_CrumbleTilePath 6", - "Overlord_PirogusuFactory 1", - "Overlord_PirogusuFactory 2", - "Overlord_PirogusuFactory 3", - "Overlord_PirogusuFactory 4", - "Overlord_FlyingTileFactory", - "Overlord_WizzrobeFactory", - "Overlord_ZoroFactory", - "Overlord_StalfosTrapTriggerWindow", - "Overlord_RedStalfosTrap", - "Overlord_ArmosCoordinator", - "Overlord_BombTrap", -}; - } // namespace core } // namespace app } // namespace yaze diff --git a/src/app/editor/graphics/graphics_editor.cc b/src/app/editor/graphics/graphics_editor.cc index 37f77d86..10c6434c 100644 --- a/src/app/editor/graphics/graphics_editor.cc +++ b/src/app/editor/graphics/graphics_editor.cc @@ -397,7 +397,7 @@ absl::Status GraphicsEditor::UpdateLinkGfxView() { int i = 0; for (auto link_sheet : *rom()->mutable_link_graphics()) { int x_offset = 0; - int y_offset = core::kTilesheetHeight * i * 4; + int y_offset = gfx::kTilesheetHeight * i * 4; link_canvas_.DrawContextMenu(&link_sheet); link_canvas_.DrawBitmap(link_sheet, x_offset, y_offset, 4); i++; @@ -767,7 +767,7 @@ absl::Status GraphicsEditor::DecompressImportData(int size) { temp_rom_.data(), current_offset_, size)) auto converted_sheet = gfx::SnesTo8bppSheet(import_data_, 3); - bin_bitmap_.Create(core::kTilesheetWidth, 0x2000, core::kTilesheetDepth, + bin_bitmap_.Create(gfx::kTilesheetWidth, 0x2000, gfx::kTilesheetDepth, converted_sheet); if (rom()->is_loaded()) { @@ -795,8 +795,8 @@ absl::Status GraphicsEditor::DecompressSuperDonkey() { auto decompressed_data, gfx::lc_lz2::DecompressV2(temp_rom_.data(), offset_value, 0x1000)) auto converted_sheet = gfx::SnesTo8bppSheet(decompressed_data, 3); - gfx_sheets_[i] = gfx::Bitmap(core::kTilesheetWidth, core::kTilesheetHeight, - core::kTilesheetDepth, converted_sheet); + gfx_sheets_[i] = gfx::Bitmap(gfx::kTilesheetWidth, gfx::kTilesheetHeight, + gfx::kTilesheetDepth, converted_sheet); if (col_file_) { status_ = gfx_sheets_[i].ApplyPalette( col_file_palette_group_[current_palette_index_]); @@ -820,8 +820,8 @@ absl::Status GraphicsEditor::DecompressSuperDonkey() { auto decompressed_data, gfx::lc_lz2::DecompressV2(temp_rom_.data(), offset_value, 0x1000)) auto converted_sheet = gfx::SnesTo8bppSheet(decompressed_data, 3); - gfx_sheets_[i] = gfx::Bitmap(core::kTilesheetWidth, core::kTilesheetHeight, - core::kTilesheetDepth, converted_sheet); + gfx_sheets_[i] = gfx::Bitmap(gfx::kTilesheetWidth, gfx::kTilesheetHeight, + gfx::kTilesheetDepth, converted_sheet); if (col_file_) { status_ = gfx_sheets_[i].ApplyPalette( col_file_palette_group_[current_palette_index_]); diff --git a/src/app/editor/graphics/graphics_editor.h b/src/app/editor/graphics/graphics_editor.h index db0a9a90..85315583 100644 --- a/src/app/editor/graphics/graphics_editor.h +++ b/src/app/editor/graphics/graphics_editor.h @@ -192,7 +192,7 @@ class GraphicsEditor : public SharedRom, public Editor { gui::CanvasGridSize::k8x8}; gui::Canvas link_canvas_{ "LinkCanvas", - ImVec2(core::kTilesheetWidth * 4, core::kTilesheetHeight * 0x10 * 4), + ImVec2(gfx::kTilesheetWidth * 4, gfx::kTilesheetHeight * 0x10 * 4), gui::CanvasGridSize::k16x16}; absl::Status status_; }; diff --git a/src/app/editor/graphics/palette_editor.cc b/src/app/editor/graphics/palette_editor.cc index 8f3a315f..0d42a452 100644 --- a/src/app/editor/graphics/palette_editor.cc +++ b/src/app/editor/graphics/palette_editor.cc @@ -1,13 +1,12 @@ #include "palette_editor.h" -#include "imgui/imgui.h" - #include "absl/status/status.h" #include "app/gfx/snes_palette.h" #include "app/gui/canvas.h" #include "app/gui/color.h" #include "app/gui/icons.h" #include "app/gui/style.h" +#include "imgui/imgui.h" namespace yaze { namespace app { diff --git a/src/app/editor/graphics/screen_editor.cc b/src/app/editor/graphics/screen_editor.cc index 3e19c0ba..fa0767b7 100644 --- a/src/app/editor/graphics/screen_editor.cc +++ b/src/app/editor/graphics/screen_editor.cc @@ -1,7 +1,5 @@ #include "screen_editor.h" -#include "imgui/imgui.h" - #include #include #include @@ -13,14 +11,15 @@ #include "absl/strings/string_view.h" #include "app/core/common.h" #include "app/core/constants.h" +#include "app/core/platform/renderer.h" #include "app/gfx/bitmap.h" #include "app/gfx/snes_tile.h" #include "app/gfx/tilesheet.h" #include "app/gui/canvas.h" -#include "app/core/platform/renderer.h" #include "app/gui/icons.h" #include "app/gui/input.h" #include "app/zelda3/dungeon/room.h" +#include "imgui/imgui.h" namespace yaze { namespace app { @@ -28,6 +27,8 @@ namespace editor { using core::Renderer; +constexpr uint32_t kRedPen = 0xFF0000FF; + absl::Status ScreenEditor::Update() { TAB_BAR("##TabBar") TAB_ITEM("Dungeon Maps") @@ -290,7 +291,7 @@ void ScreenEditor::DrawDungeonMapsTabs() { if (current_dungeon.floor_rooms[floor_number][j] == boss_room) { screen_canvas_.DrawOutlineWithColor((posX * 2), (posY * 2), 64, - 64, core::kRedPen); + 64, kRedPen); } std::string label = diff --git a/src/app/editor/graphics/tile16_editor.h b/src/app/editor/graphics/tile16_editor.h index 47da684a..a49833fc 100644 --- a/src/app/editor/graphics/tile16_editor.h +++ b/src/app/editor/graphics/tile16_editor.h @@ -84,7 +84,7 @@ class Tile16Editor : public context::GfxContext, public SharedRom { // Tile8 canvas to get the tile to drawing in the tile16_edit_canvas_ gui::Canvas tile8_source_canvas_{ "Tile8SourceCanvas", - ImVec2(core::kTilesheetWidth * 4, core::kTilesheetHeight * 0x10 * 4), + ImVec2(gfx::kTilesheetWidth * 4, gfx::kTilesheetHeight * 0x10 * 4), gui::CanvasGridSize::k32x32}; gfx::Bitmap current_gfx_bmp_; diff --git a/src/app/editor/overworld/entity.cc b/src/app/editor/overworld/entity.cc index 3d5227fd..9873d81b 100644 --- a/src/app/editor/overworld/entity.cc +++ b/src/app/editor/overworld/entity.cc @@ -384,7 +384,7 @@ void DrawSpriteTable(std::function onSpriteSelect) { // Initialize items if empty if (items.empty()) { for (int i = 0; i < 256; ++i) { - items.push_back(SpriteItem{i, core::kSpriteDefaultNames[i].data()}); + items.push_back(SpriteItem{i, kSpriteDefaultNames[i].data()}); } } diff --git a/src/app/editor/overworld/overworld_editor.cc b/src/app/editor/overworld/overworld_editor.cc index c4c20e71..aeaea871 100644 --- a/src/app/editor/overworld/overworld_editor.cc +++ b/src/app/editor/overworld/overworld_editor.cc @@ -58,7 +58,6 @@ using ImGui::TableSetupColumn; using ImGui::Text; constexpr int kTile16Size = 0x10; -constexpr int kOverworldMapSize = 0x200; void OverworldEditor::InitializeZeml() { // Load zeml string from layouts/overworld.zeml diff --git a/src/app/editor/overworld/overworld_editor.h b/src/app/editor/overworld/overworld_editor.h index 5ffb350c..b9f1c36c 100644 --- a/src/app/editor/overworld/overworld_editor.h +++ b/src/app/editor/overworld/overworld_editor.h @@ -29,19 +29,18 @@ namespace yaze { namespace app { namespace editor { -static constexpr uint k4BPP = 4; -static constexpr uint kByteSize = 3; -static constexpr uint kMessageIdSize = 5; -static constexpr uint kNumSheetsToLoad = 223; -static constexpr uint kTile8DisplayHeight = 64; -static constexpr float kInputFieldSize = 30.f; - -static constexpr absl::string_view kToolsetColumnNames[] = { - "#undoTool", "#redoTool", "#separator2", "#zoomOutTool", - "#zoomInTool", "#separator", "#drawTool", "#history", - "#entranceTool", "#exitTool", "#itemTool", "#spriteTool", - "#transportTool", "#musicTool", "#separator3", "#tilemapTool", - "propertiesTool", "#separator4", "#experimentalTool"}; +constexpr uint k4BPP = 4; +constexpr uint kByteSize = 3; +constexpr uint kMessageIdSize = 5; +constexpr uint kNumSheetsToLoad = 223; +constexpr uint kTile8DisplayHeight = 64; +constexpr uint kOverworldMapSize = 0x200; +constexpr float kInputFieldSize = 30.f; +constexpr ImVec2 kOverworldCanvasSize(kOverworldMapSize * 8, + kOverworldMapSize * 8); +constexpr ImVec2 kCurrentGfxCanvasSize(0x100 + 1, 0x10 * 0x40 + 1); +constexpr ImVec2 kBlocksetCanvasSize(0x100 + 1, 0x2000 + 1); +constexpr ImVec2 kGraphicsBinCanvasSize(0x100 + 1, kNumSheetsToLoad * 0x40 + 1); constexpr ImGuiTableFlags kOWMapFlags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable; @@ -51,6 +50,13 @@ constexpr ImGuiTableFlags kOWEditFlags = ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; +static constexpr absl::string_view kToolsetColumnNames[] = { + "#undoTool", "#redoTool", "#separator2", "#zoomOutTool", + "#zoomInTool", "#separator", "#drawTool", "#history", + "#entranceTool", "#exitTool", "#itemTool", "#spriteTool", + "#transportTool", "#musicTool", "#separator3", "#tilemapTool", + "propertiesTool", "#separator4", "#experimentalTool"}; + constexpr absl::string_view kWorldList = "Light World\0Dark World\0Extra World\0"; @@ -217,13 +223,6 @@ class OverworldEditor : public Editor, bool middle_mouse_dragging_ = false; bool is_dragging_entity_ = false; - zelda3::OverworldEntity* dragged_entity_; - zelda3::OverworldEntity* current_entity_; - zelda3::overworld::OverworldEntrance current_entrance_; - zelda3::overworld::OverworldExit current_exit_; - zelda3::overworld::OverworldItem current_item_; - zelda3::Sprite current_sprite_; - std::vector selected_tile_data_; std::vector> tile16_individual_data_; std::vector tile16_individual_; @@ -234,21 +233,9 @@ class OverworldEditor : public Editor, Tile16Editor tile16_editor_; GfxGroupEditor gfx_group_editor_; PaletteEditor palette_editor_; - zelda3::overworld::Overworld overworld_; - - gui::Canvas ow_map_canvas_{"owMapCanvas", ImVec2(0x200 * 8, 0x200 * 8), - gui::CanvasGridSize::k64x64}; - gui::Canvas current_gfx_canvas_{"customGfxCanvas", - ImVec2(0x100 + 1, 0x10 * 0x40 + 1), - gui::CanvasGridSize::k32x32}; - gui::Canvas blockset_canvas_{"blocksetCanvas", ImVec2(0x100 + 1, 0x2000 + 1), - gui::CanvasGridSize::k32x32}; - gui::Canvas graphics_bin_canvas_{ - "graphicsBinCanvas", ImVec2(0x100 + 1, kNumSheetsToLoad * 0x40 + 1), - gui::CanvasGridSize::k16x16}; - gui::Canvas properties_canvas_; gfx::SnesPalette palette_; + gfx::Bitmap selected_tile_bmp_; gfx::Bitmap tile16_blockset_bmp_; gfx::Bitmap current_gfx_bmp_; @@ -258,8 +245,28 @@ class OverworldEditor : public Editor, gfx::BitmapTable current_graphics_set_; gfx::BitmapTable sprite_previews_; + zelda3::overworld::Overworld overworld_; zelda3::OWBlockset refresh_blockset_; + zelda3::Sprite current_sprite_; + + zelda3::overworld::OverworldEntrance current_entrance_; + zelda3::overworld::OverworldExit current_exit_; + zelda3::overworld::OverworldItem current_item_; + + zelda3::OverworldEntity* current_entity_; + zelda3::OverworldEntity* dragged_entity_; + + gui::Canvas ow_map_canvas_{"OwMap", kOverworldCanvasSize, + gui::CanvasGridSize::k64x64}; + gui::Canvas current_gfx_canvas_{"CurrentGfx", kCurrentGfxCanvasSize, + gui::CanvasGridSize::k32x32}; + gui::Canvas blockset_canvas_{"OwBlockset", kBlocksetCanvasSize, + gui::CanvasGridSize::k32x32}; + gui::Canvas graphics_bin_canvas_{"GraphicsBin", kGraphicsBinCanvasSize, + gui::CanvasGridSize::k16x16}; + gui::Canvas properties_canvas_{"Properties", ImVec2(0x100, 0x100), + gui::CanvasGridSize::k8x8}; gui::zeml::Node layout_node_; absl::Status status_; }; diff --git a/src/app/editor/sprite/sprite_editor.cc b/src/app/editor/sprite/sprite_editor.cc index fb7ce453..06d3388e 100644 --- a/src/app/editor/sprite/sprite_editor.cc +++ b/src/app/editor/sprite/sprite_editor.cc @@ -71,13 +71,13 @@ void SpriteEditor::DrawVanillaSpriteEditor() { for (int n = 0; n < active_sprites_.Size;) { bool open = true; - if (active_sprites_[n] > sizeof(core::kSpriteDefaultNames) / 4) { + if (active_sprites_[n] > sizeof(kSpriteDefaultNames) / 4) { active_sprites_.erase(active_sprites_.Data + n); continue; } if (ImGui::BeginTabItem( - core::kSpriteDefaultNames[active_sprites_[n]].data(), &open, + kSpriteDefaultNames[active_sprites_[n]].data(), &open, ImGuiTabItemFlags_None)) { DrawSpriteCanvas(); ImGui::EndTabItem(); @@ -188,10 +188,10 @@ void SpriteEditor::DrawSpritesList() { ImVec2(ImGui::GetContentRegionAvail().x, 0), true, ImGuiWindowFlags_NoDecoration)) { int i = 0; - for (const auto each_sprite_name : core::kSpriteDefaultNames) { + for (const auto each_sprite_name : kSpriteDefaultNames) { rom()->resource_label()->SelectableLabelWithNameEdit( current_sprite_id_ == i, "Sprite Names", core::UppercaseHexByte(i), - core::kSpriteDefaultNames[i].data()); + kSpriteDefaultNames[i].data()); if (ImGui::IsItemClicked()) { current_sprite_id_ = i; if (!active_sprites_.contains(i)) { diff --git a/src/app/gfx/bitmap.h b/src/app/gfx/bitmap.h index e345bb44..ce853cac 100644 --- a/src/app/gfx/bitmap.h +++ b/src/app/gfx/bitmap.h @@ -98,8 +98,10 @@ class Bitmap { /** * @brief Creates a bitmap object with the provided graphical data. */ - void Create(int width, int height, int depth, const std::vector &data); - void Create(int width, int height, int depth, int format, const std::vector &data); + void Create(int width, int height, int depth, + const std::vector &data); + void Create(int width, int height, int depth, int format, + const std::vector &data); void Reformat(int format); diff --git a/src/app/gfx/snes_color.h b/src/app/gfx/snes_color.h index 7e448803..66538446 100644 --- a/src/app/gfx/snes_color.h +++ b/src/app/gfx/snes_color.h @@ -11,6 +11,8 @@ namespace yaze { namespace app { namespace gfx { +constexpr int NumberOfColors = 3143; + snes_color ConvertSNEStoRGB(uint16_t snes_color); uint16_t ConvertRGBtoSNES(const snes_color& color); uint16_t ConvertRGBtoSNES(const ImVec4& color); diff --git a/src/app/gfx/snes_tile.h b/src/app/gfx/snes_tile.h index 0c8e4bd4..8f5263da 100644 --- a/src/app/gfx/snes_tile.h +++ b/src/app/gfx/snes_tile.h @@ -11,11 +11,17 @@ namespace yaze { namespace app { namespace gfx { +constexpr int kTilesheetWidth = 128; +constexpr int kTilesheetHeight = 32; +constexpr int kTilesheetDepth = 8; + constexpr uint8_t kGraphicsBitmap[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; -std::vector SnesTo8bppSheet(const std::vector& sheet, int bpp); -std::vector Bpp8SnesToIndexed(std::vector data, uint64_t bpp = 0); +std::vector SnesTo8bppSheet(const std::vector& sheet, + int bpp); +std::vector Bpp8SnesToIndexed(std::vector data, + uint64_t bpp = 0); struct tile8 { uint32_t id; @@ -151,7 +157,7 @@ class Tile16 { /** * @brief Object Attribute Memory tile abstraction container -*/ + */ class OamTile { public: int x_; diff --git a/src/app/rom.cc b/src/app/rom.cc index 7ea94ed5..5e1a90b4 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -72,8 +72,8 @@ absl::Status Rom::LoadLinkGraphics() { ReadByteVector(/*offset=*/link_gfx_offset + (i * link_gfx_length), /*length=*/link_gfx_length)) auto link_sheet_8bpp = gfx::SnesTo8bppSheet(link_sheet_data, /*bpp=*/4); - link_graphics_[i].Create(core::kTilesheetWidth, core::kTilesheetHeight, - core::kTilesheetDepth, link_sheet_8bpp); + link_graphics_[i].Create(gfx::kTilesheetWidth, gfx::kTilesheetHeight, + gfx::kTilesheetDepth, link_sheet_8bpp); RETURN_IF_ERROR(link_graphics_[i].ApplyPalette(palette_groups_.armors[0]);) Renderer::GetInstance().RenderBitmap(&link_graphics_[i]); } @@ -109,8 +109,8 @@ absl::Status Rom::LoadAllGraphicsData() { if (bpp3) { auto converted_sheet = gfx::SnesTo8bppSheet(sheet, 3); - graphics_sheets_[i].Create(core::kTilesheetWidth, core::kTilesheetHeight, - core::kTilesheetDepth, converted_sheet); + graphics_sheets_[i].Create(gfx::kTilesheetWidth, gfx::kTilesheetHeight, + gfx::kTilesheetDepth, converted_sheet); if (graphics_sheets_[i].is_active()) { if (i > 115) { // Apply sprites palette diff --git a/src/app/rom.h b/src/app/rom.h index f5a79c43..42a87d81 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -128,6 +128,10 @@ constexpr uint32_t kNumMainBlocksets = 37; constexpr uint32_t kNumRoomBlocksets = 82; constexpr uint32_t kNumSpritesets = 144; constexpr uint32_t kNumPalettesets = 72; +constexpr uint32_t kUncompressedSheetSize = 0x0800; + +// TODO: Verify what this was used for in ZS +constexpr uint32_t kMaxGraphics = 0xC3FB5; /** * @brief The Rom class is used to load, save, and modify Rom data. diff --git a/src/app/zelda3/common.h b/src/app/zelda3/common.h index 4318f049..ac44bf62 100644 --- a/src/app/zelda3/common.h +++ b/src/app/zelda3/common.h @@ -54,6 +54,265 @@ class OverworldEntity { virtual void UpdateMapProperties(short map_id) = 0; }; + +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 zelda3 } // namespace app } // namespace yaze diff --git a/src/app/zelda3/dungeon/object_renderer.cc b/src/app/zelda3/dungeon/object_renderer.cc index adc9fbee..fd88b6af 100644 --- a/src/app/zelda3/dungeon/object_renderer.cc +++ b/src/app/zelda3/dungeon/object_renderer.cc @@ -5,7 +5,7 @@ namespace app { namespace zelda3 { namespace dungeon { -void DungeonObjectRenderer::LoadObject(uint16_t objectId, +void DungeonObjectRenderer::LoadObject(uint32_t routine_ptr, std::array& sheet_ids) { vram_.sheets = sheet_ids; @@ -13,48 +13,14 @@ void DungeonObjectRenderer::LoadObject(uint16_t objectId, // Prepare the CPU and memory environment memory_.Initialize(rom_data_); - // Fetch the subtype pointers for the given object ID - auto subtypeInfo = FetchSubtypeInfo(objectId); - // Configure the object based on the fetched information - ConfigureObject(subtypeInfo); + ConfigureObject(); // Run the CPU emulation for the object's draw routines - RenderObject(subtypeInfo); + RenderObject(routine_ptr); } -SubtypeInfo DungeonObjectRenderer::FetchSubtypeInfo(uint16_t object_id) { - SubtypeInfo info; - - // Determine the subtype based on objectId - uint8_t subtype = 1; - - // Based on the subtype, fetch the correct pointers - switch (subtype) { - case 1: // Subtype 1 - info.subtype_ptr = core::subtype1_tiles + (object_id & 0xFF) * 2; - info.routine_ptr = core::subtype1_tiles + 0x200 + (object_id & 0xFF) * 2; - std::cout << "Subtype 1 " << std::hex << info.subtype_ptr << std::endl; - std::cout << "Subtype 1 " << std::hex << info.routine_ptr << std::endl; - break; - case 2: // Subtype 2 - info.subtype_ptr = core::subtype2_tiles + (object_id & 0x7F) * 2; - info.routine_ptr = core::subtype2_tiles + 0x80 + (object_id & 0x7F) * 2; - break; - case 3: // Subtype 3 - info.subtype_ptr = core::subtype3_tiles + (object_id & 0xFF) * 2; - info.routine_ptr = core::subtype3_tiles + 0x100 + (object_id & 0xFF) * 2; - break; - default: - // Handle unknown subtype - throw std::runtime_error("Unknown subtype for object ID: " + - std::to_string(object_id)); - } - - return info; -} - -void DungeonObjectRenderer::ConfigureObject(const SubtypeInfo& info) { +void DungeonObjectRenderer::ConfigureObject() { cpu.A = 0x03D8; cpu.X = 0x03D8; cpu.DB = 0x7E; @@ -94,12 +60,12 @@ void DungeonObjectRenderer::ConfigureObject(const SubtypeInfo& info) { #_0198A9: INY #4 #_0198AD: RTS */ -void DungeonObjectRenderer::RenderObject(const SubtypeInfo& info) { +void DungeonObjectRenderer::RenderObject(uint32_t routine_ptr) { cpu.PB = 0x01; // Push an initial value to the stack we can read later to confirm we are // done - cpu.PushLong(0x01 << 16 | info.routine_ptr); + cpu.PushLong(0x01 << 16 | routine_ptr); int i = 0; while (true) { diff --git a/src/app/zelda3/dungeon/object_renderer.h b/src/app/zelda3/dungeon/object_renderer.h index aa25fa75..efaf604f 100644 --- a/src/app/zelda3/dungeon/object_renderer.h +++ b/src/app/zelda3/dungeon/object_renderer.h @@ -23,36 +23,34 @@ struct PseudoVram { std::vector palettes; }; -struct SubtypeInfo { - uint32_t subtype_ptr; - uint32_t routine_ptr; -}; - class DungeonObjectRenderer : public SharedRom { public: DungeonObjectRenderer() = default; - void LoadObject(uint16_t objectId, std::array& sheet_ids); + void LoadObject(uint32_t routine_ptr, std::array& sheet_ids); + void ConfigureObject(); + void RenderObject(uint32_t routine_ptr); + void UpdateObjectBitmap(); + gfx::Bitmap* bitmap() { return &bitmap_; } auto memory() { return memory_; } auto mutable_memory() { return &memory_; } private: - SubtypeInfo FetchSubtypeInfo(uint16_t object_id); - void ConfigureObject(const SubtypeInfo& info); - void RenderObject(const SubtypeInfo& info); - void UpdateObjectBitmap(); + uint16_t pc_with_rts_; std::vector tilemap_; - uint16_t pc_with_rts_; std::vector rom_data_; - emu::memory::MemoryImpl memory_; - emu::ClockImpl clock_; - emu::memory::CpuCallbacks cpu_callbacks_; - emu::Cpu cpu{memory_, clock_, cpu_callbacks_}; - emu::video::Ppu ppu{memory_, clock_}; - gfx::Bitmap bitmap_; + PseudoVram vram_; + + emu::ClockImpl clock_; + emu::memory::MemoryImpl memory_; + emu::memory::CpuCallbacks cpu_callbacks_; + emu::video::Ppu ppu{memory_, clock_}; + emu::Cpu cpu{memory_, clock_, cpu_callbacks_}; + + gfx::Bitmap bitmap_; }; } // namespace dungeon diff --git a/src/app/zelda3/dungeon/room.h b/src/app/zelda3/dungeon/room.h index db970b3f..f58b7075 100644 --- a/src/app/zelda3/dungeon/room.h +++ b/src/app/zelda3/dungeon/room.h @@ -80,6 +80,8 @@ constexpr int door_pos_right = 0x19C6; constexpr int dungeon_spr_ptrs = 0x090000; +constexpr int NumberOfRooms = 296; + constexpr ushort stairsObjects[] = {0x139, 0x138, 0x13B, 0x12E, 0x12D}; class DungeonDestination { diff --git a/src/app/zelda3/dungeon/room_object.cc b/src/app/zelda3/dungeon/room_object.cc index ed68a02f..7ac9e02e 100644 --- a/src/app/zelda3/dungeon/room_object.cc +++ b/src/app/zelda3/dungeon/room_object.cc @@ -5,6 +5,32 @@ namespace app { namespace zelda3 { namespace dungeon { +SubtypeInfo FetchSubtypeInfo(uint16_t object_id) { + SubtypeInfo info; + + // TODO: Determine the subtype based on object_id + uint8_t subtype = 1; + + switch (subtype) { + case 1: // Subtype 1 + info.subtype_ptr = kRoomObjectSubtype1 + (object_id & 0xFF) * 2; + info.routine_ptr = kRoomObjectSubtype1 + 0x200 + (object_id & 0xFF) * 2; + break; + case 2: // Subtype 2 + info.subtype_ptr = kRoomObjectSubtype2 + (object_id & 0x7F) * 2; + info.routine_ptr = kRoomObjectSubtype2 + 0x80 + (object_id & 0x7F) * 2; + break; + case 3: // Subtype 3 + info.subtype_ptr = kRoomObjectSubtype3 + (object_id & 0xFF) * 2; + info.routine_ptr = kRoomObjectSubtype3 + 0x100 + (object_id & 0xFF) * 2; + break; + default: + throw std::runtime_error("Invalid object subtype"); + } + + return info; +} + void RoomObject::DrawTile(Tile t, int xx, int yy, std::vector& current_gfx16, std::vector& tiles_bg1_buffer, @@ -56,7 +82,7 @@ void RoomObject::DrawTile(Tile t, int xx, int yy, 0x1000 && ((xx / 8) + nx_ + offset_x_) + ((ny_ + offset_y_ + (yy / 8)) * 0x40) >= 0) { - ushort td = 0; // gfx::GetTilesInfo(); // TODO t.GetTileInfo() + ushort td = 0; // gfx::GetTilesInfo(); // collisionPoint.Add( // new Point(xx + ((nx + offsetX) * 8), yy + ((ny + +offsetY) * 8))); diff --git a/src/app/zelda3/dungeon/room_object.h b/src/app/zelda3/dungeon/room_object.h index b32a2cce..526399b1 100644 --- a/src/app/zelda3/dungeon/room_object.h +++ b/src/app/zelda3/dungeon/room_object.h @@ -21,6 +21,13 @@ namespace app { namespace zelda3 { namespace dungeon { +struct SubtypeInfo { + uint32_t subtype_ptr; + uint32_t routine_ptr; +}; + +SubtypeInfo FetchSubtypeInfo(uint16_t object_id); + struct Tile {}; enum class SpecialObjectType { Chest, BigChest, InterroomStairs }; @@ -34,7 +41,7 @@ enum Background2 { Addition, Normal, Transparent, - DarkRoom // TODO: Determine if DarkRoom will stay there or not + DarkRoom }; enum Sorting { @@ -58,6 +65,12 @@ enum ObjectOption { Stairs = 32 }; +constexpr int kRoomObjectSubtype1 = 0x8000; // JP = Same +constexpr int kRoomObjectSubtype2 = 0x83F0; // JP = Same +constexpr int kRoomObjectSubtype3 = 0x84F0; // JP = Same +constexpr int kRoomObjectTileAddress = 0x1B52; // JP = Same +constexpr int kRoomObjectTileAddressFloor = 0x1B5A; // JP = Same + class RoomObject : public SharedRom { public: enum LayerType { BG1 = 0, BG2 = 1, BG3 = 2 }; @@ -166,11 +179,10 @@ class Subtype1 : public RoomObject { int tileCount) : RoomObject(id, x, y, size, layer), tile_count_(tileCount) { auto rom_data = rom()->data(); - int pos = - core::tile_address + - static_cast( - (rom_data[core::subtype1_tiles + ((id & 0xFF) * 2) + 1] << 8) + - rom_data[core::subtype1_tiles + ((id & 0xFF) * 2)]); + int pos = kRoomObjectTileAddress + + static_cast( + (rom_data[kRoomObjectSubtype1 + ((id & 0xFF) * 2) + 1] << 8) + + rom_data[kRoomObjectSubtype1 + ((id & 0xFF) * 2)]); AddTiles(tile_count_, pos); sort = (Sorting)(Sorting::Horizontal | Sorting::Wall); } @@ -194,11 +206,10 @@ class Subtype2 : public RoomObject { Subtype2(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer) : RoomObject(id, x, y, size, layer) { auto rom_data = rom()->data(); - int pos = - core::tile_address + - static_cast( - (rom_data[core::subtype2_tiles + ((id & 0x7F) * 2) + 1] << 8) + - rom_data[core::subtype2_tiles + ((id & 0x7F) * 2)]); + int pos = kRoomObjectTileAddress + + static_cast( + (rom_data[kRoomObjectSubtype2 + ((id & 0x7F) * 2) + 1] << 8) + + rom_data[kRoomObjectSubtype2 + ((id & 0x7F) * 2)]); AddTiles(8, pos); sort = (Sorting)(Sorting::Horizontal | Sorting::Wall); } @@ -220,11 +231,10 @@ class Subtype3 : public RoomObject { Subtype3(int16_t id, uint8_t x, uint8_t y, uint8_t size, uint8_t layer) : RoomObject(id, x, y, size, layer) { auto rom_data = rom()->data(); - int pos = - core::tile_address + - static_cast( - (rom_data[core::subtype3_tiles + ((id & 0xFF) * 2) + 1] << 8) + - rom_data[core::subtype3_tiles + ((id & 0xFF) * 2)]); + int pos = kRoomObjectTileAddress + + static_cast( + (rom_data[kRoomObjectSubtype3 + ((id & 0xFF) * 2) + 1] << 8) + + rom_data[kRoomObjectSubtype3 + ((id & 0xFF) * 2)]); AddTiles(8, pos); sort = (Sorting)(Sorting::Horizontal | Sorting::Wall); } diff --git a/src/app/zelda3/dungeon/room_tag.h b/src/app/zelda3/dungeon/room_tag.h new file mode 100644 index 00000000..a6f5a331 --- /dev/null +++ b/src/app/zelda3/dungeon/room_tag.h @@ -0,0 +1,94 @@ +#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_TAG_H +#define YAZE_APP_ZELDA3_DUNGEON_ROOM_TAG_H + +#include + +namespace yaze { +namespace app { +namespace zelda3 { +namespace dungeon { + +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"}; + +} // namespace dungeon +} // namespace zelda3 +} // namespace app +} // namespace yaze + +#endif // YAZE_APP_ZELDA3_DUNGEON_ROOM_TAG_H \ No newline at end of file diff --git a/src/app/zelda3/overworld/overworld.h b/src/app/zelda3/overworld/overworld.h index 8b5944e6..18104af6 100644 --- a/src/app/zelda3/overworld/overworld.h +++ b/src/app/zelda3/overworld/overworld.h @@ -28,6 +28,18 @@ namespace zelda3 { */ namespace overworld { +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 + // List of secret item names const std::vector kSecretItemNames = { "Nothing", // 0 @@ -588,7 +600,8 @@ class Overworld : public SharedRom, public core::ExperimentFlags { void AssembleMap16Tiles(); void AssignWorldTiles(int x, int y, int sx, int sy, int tpos, OWBlockset &world); - void OrganizeMapTiles(std::vector &bytes, std::vector &bytes2, int i, int sx, int sy, + void OrganizeMapTiles(std::vector &bytes, + std::vector &bytes2, int i, int sx, int sy, int &ttpos); absl::Status DecompressAllMapTiles(); diff --git a/src/app/zelda3/sprite/overlord.h b/src/app/zelda3/sprite/overlord.h new file mode 100644 index 00000000..00938907 --- /dev/null +++ b/src/app/zelda3/sprite/overlord.h @@ -0,0 +1,43 @@ +#ifndef YAZE_APP_ZELDA3_SPRITE_OVERLORD_H +#define YAZE_APP_ZELDA3_SPRITE_OVERLORD_H + +#include + +namespace yaze { +namespace app { +namespace zelda3 { + +static const std::string overlordnames[] = { + "Overlord_SpritePositionTarget", + "Overlord_AllDirectionMetalBallFactory", + "Overlord_CascadeMetalBallFactory", + "Overlord_StalfosFactory", + "Overlord_StalfosTrap", + "Overlord_SnakeTrap", + "Overlord_MovingFloor", + "Overlord_ZolFactory", + "Overlord_WallMasterFactory", + "Overlord_CrumbleTilePath 1", + "Overlord_CrumbleTilePath 2", + "Overlord_CrumbleTilePath 3", + "Overlord_CrumbleTilePath 4", + "Overlord_CrumbleTilePath 5", + "Overlord_CrumbleTilePath 6", + "Overlord_PirogusuFactory 1", + "Overlord_PirogusuFactory 2", + "Overlord_PirogusuFactory 3", + "Overlord_PirogusuFactory 4", + "Overlord_FlyingTileFactory", + "Overlord_WizzrobeFactory", + "Overlord_ZoroFactory", + "Overlord_StalfosTrapTriggerWindow", + "Overlord_RedStalfosTrap", + "Overlord_ArmosCoordinator", + "Overlord_BombTrap", +}; + +} +} // namespace app +} // namespace yaze + +#endif // YAZE_APP_ZELDA3_SPRITE_OVERLORD_H \ No newline at end of file diff --git a/src/app/zelda3/sprite/sprite.cc b/src/app/zelda3/sprite/sprite.cc index 563313f8..1929a2b0 100644 --- a/src/app/zelda3/sprite/sprite.cc +++ b/src/app/zelda3/sprite/sprite.cc @@ -9,7 +9,7 @@ namespace zelda3 { void Sprite::UpdateMapProperties(short map_id) { map_x_ = x_; map_y_ = y_; - name_ = core::kSpriteDefaultNames[id_]; + name_ = kSpriteDefaultNames[id_]; } void Sprite::UpdateCoordinates(int map_x, int map_y) { diff --git a/src/app/zelda3/sprite/sprite.h b/src/app/zelda3/sprite/sprite.h index 878c290e..10cfe2d3 100644 --- a/src/app/zelda3/sprite/sprite.h +++ b/src/app/zelda3/sprite/sprite.h @@ -19,6 +19,265 @@ namespace yaze { namespace app { namespace zelda3 { +static const std::string kSpriteDefaultNames[]{ + "00 Raven", + "01 Vulture", + "02 Flying Stalfos Head", + "03 No Pointer (Empty", + "04 Pull Switch (good", + "05 Pull Switch (unused", + "06 Pull Switch (bad", + "07 Pull Switch (unused", + "08 Octorock (one way", + "09 Moldorm (Boss", + "0A Octorock (four way", + "0B Chicken", + "0C Octorock (?", + "0D Buzzblock", + "0E Snapdragon", + "0F Octoballoon", + "10 Octoballon Hatchlings", + "11 Hinox", + "12 Moblin", + "13 Mini Helmasaure", + "14 Gargoyle's Domain Gate", + "15 Antifairy", + "16 Sahasrahla / Aginah", + "17 Bush Hoarder", + "18 Mini Moldorm", + "19 Poe", + "1A Dwarves", + "1B Arrow in wall", + "1C Statue", + "1D Weathervane", + "1E Crystal Switch", + "1F Bug-Catching Kid", + "20 Sluggula", + "21 Push Switch", + "22 Ropa", + "23 Red Bari", + "24 Blue Bari", + "25 Talking Tree", + "26 Hardhat Beetle", + "27 Deadrock", + "28 Storytellers", + "29 Blind Hideout attendant", + "2A Sweeping Lady", + "2B Storytellers", + "2C Lumberjacks", + "2D Telepathic Stones", + "2E Multipurpose Sprite", + "2F Race Npc", + "30 Person?", + "31 Fortune Teller", + "32 Angry Brothers", + "33 Pull for items", + "34 Scared Girl", + "35 Innkeeper", + "36 Witch", + "37 Waterfall", + "38 Arrow Target", + "39 Average Middle", + "3A Half Magic Bat", + "3B Dash Item", + "3C Village Kid", + "3D Signs? Chicken lady also showed up / Scared ladies outside houses.", + "3E Rock Hoarder", + "3F Tutorial Soldier", + "40 Lightning Lock", + "41 Blue Sword Soldier / Used by guards to detect player", + "42 Green Sword Soldier", + "43 Red Spear Soldier", + "44 Assault Sword Soldier", + "45 Green Spear Soldier", + "46 Blue Archer", + "47 Green Archer", + "48 Red Javelin Soldier", + "49 Red Javelin Soldier 2", + "4A Red Bomb Soldiers", + "4B Green Soldier Recruits", + "4C Geldman", + "4D Rabbit", + "4E Popo", + "4F Popo 2", + "50 Cannon Balls", + "51 Armos", + "52 Giant Zora", + "53 Armos Knights (Boss", + "54 Lanmolas (Boss", + "55 Fireball Zora", + "56 Walking Zora", + "57 Desert Palace Barriers", + "58 Crab", + "59 Bird", + "5A Squirrel", + "5B Spark (Left to Right", + "5C Spark (Right to Left", + "5D Roller (vertical moving", + "5E Roller (vertical moving", + "5F Roller", + "60 Roller (horizontal moving", + "61 Beamos", + "62 Master Sword", + "63 Devalant (Non", + "64 Devalant (Shooter", + "65 Shooting Gallery Proprietor", + "66 Moving Cannon Ball Shooters (Right", + "67 Moving Cannon Ball Shooters (Left", + "68 Moving Cannon Ball Shooters (Down", + "69 Moving Cannon Ball Shooters (Up", + "6A Ball N' Chain Trooper", + "6B Cannon Soldier", + "6C Mirror Portal", + "6D Rat", + "6E Rope", + "6F Keese", + "70 Helmasaur King Fireball", + "71 Leever", + "72 Activator for the ponds (where you throw in items", + "73 Uncle / Priest", + "74 Running Man", + "75 Bottle Salesman", + "76 Princess Zelda", + "77 Antifairy (Alternate", + "78 Village Elder", + "79 Bee", + "7A Agahnim", + "7B Agahnim Energy Ball", + "7C Hyu", + "7D Big Spike Trap", + "7E Guruguru Bar (Clockwise", + "7F Guruguru Bar (Counter Clockwise", + "80 Winder", + "81 Water Tektite", + "82 Antifairy Circle", + "83 Green Eyegore", + "84 Red Eyegore", + "85 Yellow Stalfos", + "86 Kodongos", + "87 Flames", + "88 Mothula (Boss", + "89 Mothula's Beam", + "8A Spike Trap", + "8B Gibdo", + "8C Arrghus (Boss", + "8D Arrghus spawn", + "8E Terrorpin", + "8F Slime", + "90 Wallmaster", + "91 Stalfos Knight", + "92 Helmasaur King", + "93 Bumper", + "94 Swimmers", + "95 Eye Laser (Right", + "96 Eye Laser (Left", + "97 Eye Laser (Down", + "98 Eye Laser (Up", + "99 Pengator", + "9A Kyameron", + "9B Wizzrobe", + "9C Tadpoles", + "9D Tadpoles", + "9E Ostrich (Haunted Grove", + "9F Flute", + "A0 Birds (Haunted Grove", + "A1 Freezor", + "A2 Kholdstare (Boss", + "A3 Kholdstare's Shell", + "A4 Falling Ice", + "A5 Zazak Fireball", + "A6 Red Zazak", + "A7 Stalfos", + "A8 Bomber Flying Creatures from Darkworld", + "A9 Bomber Flying Creatures from Darkworld", + "AA Pikit", + "AB Maiden", + "AC Apple", + "AD Lost Old Man", + "AE Down Pipe", + "AF Up Pipe", + "B0 Right Pip", + "B1 Left Pipe", + "B2 Good bee again?", + "B3 Hylian Inscription", + "B4 Thief?s chest (not the one that follows you", + "B5 Bomb Salesman", + "B6 Kiki", + "B7 Maiden following you in Blind Dungeon", + "B8 Monologue Testing Sprite", + "B9 Feuding Friends on Death Mountain", + "BA Whirlpool", + "BB Salesman / chestgame guy / 300 rupee giver guy / Chest game thief", + "BC Drunk in the inn", + "BD Vitreous (Large Eyeball", + "BE Vitreous (Small Eyeball", + "BF Vitreous' Lightning", + "C0 Monster in Lake of Ill Omen / Quake Medallion", + "C1 Agahnim teleporting Zelda to dark world", + "C2 Boulders", + "C3 Gibo", + "C4 Thief", + "C5 Medusa", + "C6 Four Way Fireball Spitters (spit when you use your sword", + "C7 Hokku", + "C8 Big Fairy who heals you", + "C9 Tektite", + "CA Chain Chomp", + "CB Trinexx", + "CC Another part of trinexx", + "CD Yet another part of trinexx", + "CE Blind The Thief (Boss)", + "CF Swamola", + "D0 Lynel", + "D1 Bunny Beam", + "D2 Flopping fish", + "D3 Stal", + "D4 Landmine", + "D5 Digging Game Proprietor", + "D6 Ganon", + "D7 Copy of Ganon", + "D8 Heart", + "D9 Green Rupee", + "DA Blue Rupee", + "DB Red Rupee", + "DC Bomb Refill (1)", + "DD Bomb Refill (4)", + "DE Bomb Refill (8)", + "DF Small Magic Refill", + "E0 Full Magic Refill", + "E1 Arrow Refill (5)", + "E2 Arrow Refill (10)", + "E3 Fairy", + "E4 Key", + "E5 Big Key", + "E6 Shield", + "E7 Mushroom", + "E8 Fake Master Sword", + "E9 Magic Shop dude / His items", + "EA Heart Container", + "EB Heart Piece", + "EC Bushes", + "ED Cane Of Somaria Platform", + "EE Mantle", + "EF Cane of Somaria Platform (Unused)", + "F0 Cane of Somaria Platform (Unused)", + "F1 Cane of Somaria Platform (Unused)", + "F2 Medallion Tablet", + "F3", + "F4 Falling Rocks", + "F5", + "F6", + "F7", + "F8", + "F9", + "FA", + "FB", + "FC", + "FD", + "FE", + "FF", +}; + /** * @class Sprite * @brief A class for managing sprites in the overworld and underworld. @@ -41,7 +300,7 @@ class Sprite : public OverworldEntity { y_ = map_y_; current_gfx_ = src; overworld_ = true; - name_ = core::kSpriteDefaultNames[id]; + name_ = kSpriteDefaultNames[id]; preview_gfx_.resize(64 * 64, 0xFF); } @@ -57,7 +316,7 @@ class Sprite : public OverworldEntity { y_ = map_y_; nx_ = x; ny_ = y; - name_ = core::kSpriteDefaultNames[id]; + name_ = kSpriteDefaultNames[id]; map_x_ = map_x; map_y_ = map_y; preview_gfx_.resize(64 * 64, 0xFF);