remove magic numbers, enforce const correctness
This commit is contained in:
@@ -326,10 +326,10 @@ void ApplyBpsPatch(const std::vector<uint8_t> &source,
|
||||
|
||||
absl::StatusOr<std::string> 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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_]);
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
#include "screen_editor.h"
|
||||
|
||||
#include "imgui/imgui.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
@@ -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 =
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -384,7 +384,7 @@ void DrawSpriteTable(std::function<void(int)> 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()});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<uint8_t> selected_tile_data_;
|
||||
std::vector<std::vector<uint8_t>> tile16_individual_data_;
|
||||
std::vector<gfx::Bitmap> 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_;
|
||||
};
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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<uint8_t> &data);
|
||||
void Create(int width, int height, int depth, int format, const std::vector<uint8_t> &data);
|
||||
void Create(int width, int height, int depth,
|
||||
const std::vector<uint8_t> &data);
|
||||
void Create(int width, int height, int depth, int format,
|
||||
const std::vector<uint8_t> &data);
|
||||
|
||||
void Reformat(int format);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<uint8_t> SnesTo8bppSheet(const std::vector<uint8_t>& sheet, int bpp);
|
||||
std::vector<uint8_t> Bpp8SnesToIndexed(std::vector<uint8_t> data, uint64_t bpp = 0);
|
||||
std::vector<uint8_t> SnesTo8bppSheet(const std::vector<uint8_t>& sheet,
|
||||
int bpp);
|
||||
std::vector<uint8_t> Bpp8SnesToIndexed(std::vector<uint8_t> 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_;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<uint8_t, 16>& 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) {
|
||||
|
||||
@@ -23,36 +23,34 @@ struct PseudoVram {
|
||||
std::vector<gfx::SnesPalette> 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<uint8_t, 16>& sheet_ids);
|
||||
void LoadObject(uint32_t routine_ptr, std::array<uint8_t, 16>& 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<uint8_t> tilemap_;
|
||||
uint16_t pc_with_rts_;
|
||||
std::vector<uint8_t> 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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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<uint8_t>& current_gfx16,
|
||||
std::vector<uint8_t>& 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)));
|
||||
|
||||
@@ -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<int16_t>(
|
||||
(rom_data[core::subtype1_tiles + ((id & 0xFF) * 2) + 1] << 8) +
|
||||
rom_data[core::subtype1_tiles + ((id & 0xFF) * 2)]);
|
||||
int pos = kRoomObjectTileAddress +
|
||||
static_cast<int16_t>(
|
||||
(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<int16_t>(
|
||||
(rom_data[core::subtype2_tiles + ((id & 0x7F) * 2) + 1] << 8) +
|
||||
rom_data[core::subtype2_tiles + ((id & 0x7F) * 2)]);
|
||||
int pos = kRoomObjectTileAddress +
|
||||
static_cast<int16_t>(
|
||||
(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<int16_t>(
|
||||
(rom_data[core::subtype3_tiles + ((id & 0xFF) * 2) + 1] << 8) +
|
||||
rom_data[core::subtype3_tiles + ((id & 0xFF) * 2)]);
|
||||
int pos = kRoomObjectTileAddress +
|
||||
static_cast<int16_t>(
|
||||
(rom_data[kRoomObjectSubtype3 + ((id & 0xFF) * 2) + 1] << 8) +
|
||||
rom_data[kRoomObjectSubtype3 + ((id & 0xFF) * 2)]);
|
||||
AddTiles(8, pos);
|
||||
sort = (Sorting)(Sorting::Horizontal | Sorting::Wall);
|
||||
}
|
||||
|
||||
94
src/app/zelda3/dungeon/room_tag.h
Normal file
94
src/app/zelda3/dungeon/room_tag.h
Normal file
@@ -0,0 +1,94 @@
|
||||
#ifndef YAZE_APP_ZELDA3_DUNGEON_ROOM_TAG_H
|
||||
#define YAZE_APP_ZELDA3_DUNGEON_ROOM_TAG_H
|
||||
|
||||
#include <string>
|
||||
|
||||
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
|
||||
@@ -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<std::string> 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<uint8_t> &bytes, std::vector<uint8_t> &bytes2, int i, int sx, int sy,
|
||||
void OrganizeMapTiles(std::vector<uint8_t> &bytes,
|
||||
std::vector<uint8_t> &bytes2, int i, int sx, int sy,
|
||||
int &ttpos);
|
||||
absl::Status DecompressAllMapTiles();
|
||||
|
||||
|
||||
43
src/app/zelda3/sprite/overlord.h
Normal file
43
src/app/zelda3/sprite/overlord.h
Normal file
@@ -0,0 +1,43 @@
|
||||
#ifndef YAZE_APP_ZELDA3_SPRITE_OVERLORD_H
|
||||
#define YAZE_APP_ZELDA3_SPRITE_OVERLORD_H
|
||||
|
||||
#include <string>
|
||||
|
||||
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
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user