From 02add69d54728af139a3ade19052993443aee6ea Mon Sep 17 00:00:00 2001 From: Snesrev Date: Thu, 11 Aug 2022 02:35:48 +0200 Subject: [PATCH] Initial version Force pushed to reorder all functions Lots of names taken from spannerism's diassembly --- .gitignore | 12 + LICENSE.txt | 21 + README.md | 79 + Zelda3.sln | 31 + ancilla.cpp | 7358 +++++ ancilla.h | 274 + attract.cpp | 1092 + attract.h | 50 + dsp_regs.h | 108 + dungeon.cpp | 8786 ++++++ dungeon.h | 459 + ending.cpp | 2608 ++ ending.h | 91 + hud.cpp | 1486 + hud.h | 72 + load_gfx.cpp | 2163 ++ load_gfx.h | 162 + main.cpp | 342 + messaging.cpp | 3071 ++ messaging.h | 139 + misc.cpp | 962 + misc.h | 76 + nmi.cpp | 498 + nmi.h | 39 + other/name_remap.txt | 3157 ++ other/names.txt | 8492 +++++ other/replace_in_files.py | 28 + other_modules.cpp | 92 + other_modules.h | 4 + overlord.cpp | 653 + overlord.h | 37 + overworld.cpp | 4082 +++ overworld.h | 179 + player.cpp | 6489 ++++ player.h | 242 + player_oam.cpp | 1278 + player_oam.h | 19 + poly.cpp | 323 + poly.h | 19 + saves/ref/Chapter 1 - Zelda's Rescue.sav | Bin 0 -> 278310 bytes saves/ref/Chapter 10 - After Ice Palace.sav | Bin 0 -> 555890 bytes saves/ref/Chapter 11 - After Misery Mire.sav | Bin 0 -> 553094 bytes saves/ref/Chapter 12 - After Turtle Rock.sav | Bin 0 -> 555998 bytes .../ref/Chapter 13 - After Ganon's Tower.sav | Bin 0 -> 556355 bytes .../ref/Chapter 2 - After Eastern Palace.sav | Bin 0 -> 557833 bytes saves/ref/Chapter 3 - After Desert Palace.sav | Bin 0 -> 556124 bytes saves/ref/Chapter 4 - After Tower of Hera.sav | Bin 0 -> 556751 bytes .../Chapter 5 - After Hyrule Castle Tower.sav | Bin 0 -> 555150 bytes saves/ref/Chapter 6 - After Dark Palace.sav | Bin 0 -> 555689 bytes saves/ref/Chapter 7 - After Swamp Palace.sav | Bin 0 -> 561074 bytes saves/ref/Chapter 8 - After Skull Woods.sav | Bin 0 -> 554566 bytes .../Chapter 9 - After Gargoyle's Domain.sav | Bin 0 -> 553263 bytes select_file.cpp | 970 + select_file.h | 44 + snes/apu.cpp | 186 + snes/apu.h | 64 + snes/cart.cpp | 112 + snes/cart.h | 35 + snes/cpu.cpp | 2443 ++ snes/cpu.h | 58 + snes/dma.cpp | 328 + snes/dma.h | 57 + snes/dsp.cpp | 578 + snes/dsp.h | 101 + snes/input.cpp | 40 + snes/input.h | 31 + snes/ppu.cpp | 1047 + snes/ppu.h | 145 + snes/saveload.h | 5 + snes/snes.cpp | 586 + snes/snes.h | 106 + snes/snes_other.cpp | 220 + snes/spc.cpp | 1528 + snes/spc.h | 45 + snes_regs.h | 211 + spc_player.cpp | 1310 + spc_player.h | 277 + sprite.cpp | 4403 +++ sprite.h | 325 + sprite_main.cpp | 26166 ++++++++++++++++ sprite_main.h | 953 + tables/.gitignore | 10 + tables/compile_music.py | 451 + tables/compile_resources.py | 816 + tables/decode_music.py | 471 + tables/extract_music.py | 467 + tables/extract_resources.py | 667 + tables/tables.py | 882 + tables/text_compression.py | 255 + tables/util.py | 240 + tagalong.cpp | 745 + tagalong.h | 32 + tile_detect.cpp | 527 + tile_detect.h | 18 + tracing.cpp | 208 + tracing.h | 17 + types.h | 76 + variables.h | 1237 + variables_attract.h | 40 + variables_blastwall.h | 10 + variables_breaktowerseal.h | 15 + variables_happiness_pond.h | 15 + variables_skullwoodsfire.h | 9 + variables_weathervane.h | 14 + zelda3.vcxproj | 238 + zelda3.vcxproj.filters | 232 + zelda_cpu_infra.cpp | 891 + zelda_cpu_infra.h | 7 + zelda_rtl.cpp | 282 + zelda_rtl.h | 197 + 110 files changed, 106516 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 Zelda3.sln create mode 100644 ancilla.cpp create mode 100644 ancilla.h create mode 100644 attract.cpp create mode 100644 attract.h create mode 100644 dsp_regs.h create mode 100644 dungeon.cpp create mode 100644 dungeon.h create mode 100644 ending.cpp create mode 100644 ending.h create mode 100644 hud.cpp create mode 100644 hud.h create mode 100644 load_gfx.cpp create mode 100644 load_gfx.h create mode 100644 main.cpp create mode 100644 messaging.cpp create mode 100644 messaging.h create mode 100644 misc.cpp create mode 100644 misc.h create mode 100644 nmi.cpp create mode 100644 nmi.h create mode 100644 other/name_remap.txt create mode 100644 other/names.txt create mode 100644 other/replace_in_files.py create mode 100644 other_modules.cpp create mode 100644 other_modules.h create mode 100644 overlord.cpp create mode 100644 overlord.h create mode 100644 overworld.cpp create mode 100644 overworld.h create mode 100644 player.cpp create mode 100644 player.h create mode 100644 player_oam.cpp create mode 100644 player_oam.h create mode 100644 poly.cpp create mode 100644 poly.h create mode 100644 saves/ref/Chapter 1 - Zelda's Rescue.sav create mode 100644 saves/ref/Chapter 10 - After Ice Palace.sav create mode 100644 saves/ref/Chapter 11 - After Misery Mire.sav create mode 100644 saves/ref/Chapter 12 - After Turtle Rock.sav create mode 100644 saves/ref/Chapter 13 - After Ganon's Tower.sav create mode 100644 saves/ref/Chapter 2 - After Eastern Palace.sav create mode 100644 saves/ref/Chapter 3 - After Desert Palace.sav create mode 100644 saves/ref/Chapter 4 - After Tower of Hera.sav create mode 100644 saves/ref/Chapter 5 - After Hyrule Castle Tower.sav create mode 100644 saves/ref/Chapter 6 - After Dark Palace.sav create mode 100644 saves/ref/Chapter 7 - After Swamp Palace.sav create mode 100644 saves/ref/Chapter 8 - After Skull Woods.sav create mode 100644 saves/ref/Chapter 9 - After Gargoyle's Domain.sav create mode 100644 select_file.cpp create mode 100644 select_file.h create mode 100644 snes/apu.cpp create mode 100644 snes/apu.h create mode 100644 snes/cart.cpp create mode 100644 snes/cart.h create mode 100644 snes/cpu.cpp create mode 100644 snes/cpu.h create mode 100644 snes/dma.cpp create mode 100644 snes/dma.h create mode 100644 snes/dsp.cpp create mode 100644 snes/dsp.h create mode 100644 snes/input.cpp create mode 100644 snes/input.h create mode 100644 snes/ppu.cpp create mode 100644 snes/ppu.h create mode 100644 snes/saveload.h create mode 100644 snes/snes.cpp create mode 100644 snes/snes.h create mode 100644 snes/snes_other.cpp create mode 100644 snes/spc.cpp create mode 100644 snes/spc.h create mode 100644 snes_regs.h create mode 100644 spc_player.cpp create mode 100644 spc_player.h create mode 100644 sprite.cpp create mode 100644 sprite.h create mode 100644 sprite_main.cpp create mode 100644 sprite_main.h create mode 100644 tables/.gitignore create mode 100644 tables/compile_music.py create mode 100644 tables/compile_resources.py create mode 100644 tables/decode_music.py create mode 100644 tables/extract_music.py create mode 100644 tables/extract_resources.py create mode 100644 tables/tables.py create mode 100644 tables/text_compression.py create mode 100644 tables/util.py create mode 100644 tagalong.cpp create mode 100644 tagalong.h create mode 100644 tile_detect.cpp create mode 100644 tile_detect.h create mode 100644 tracing.cpp create mode 100644 tracing.h create mode 100644 types.h create mode 100644 variables.h create mode 100644 variables_attract.h create mode 100644 variables_blastwall.h create mode 100644 variables_breaktowerseal.h create mode 100644 variables_happiness_pond.h create mode 100644 variables_skullwoodsfire.h create mode 100644 variables_weathervane.h create mode 100644 zelda3.vcxproj create mode 100644 zelda3.vcxproj.filters create mode 100644 zelda_cpu_infra.cpp create mode 100644 zelda_cpu_infra.h create mode 100644 zelda_rtl.cpp create mode 100644 zelda_rtl.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..53edfba0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/.vs/ +.DS_Store +*.dSYM +/Debug +/Release +/x64 +/tables/overworld/*.yaml +/tables/dungeon/*.yaml +/tables/img/ +/tables/old/ +/saves/*.sav +__pycache__ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..78e8e9a0 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 elzo_d + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..eb0f3117 --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# Zelda3 +A reimplementation of Zelda 3. + +## About + +This is a reverse engineered clone of Zelda 3 - A Link to the Past. + +It's around 70-80kLOC of C/C++ code, and reimplements all parts of the original game. The game is playable from start to end. + +You need a copy of the ROM to extract game resources (levels, images). Then once that's done, the ROM is no longer needed. + +It uses the PPU and DSP implementation from LakeSnes. Additionally, it can be configured to also run the original machine code side by side. Then the RAM state is compared after each frame, to verify that the C++ implementation is correct. + +I got much assistance from spannierism's Zelda 3 JP disassembly and the other ones that documented loads of function names and variables. + +## Compiling + +Put the ROM in tables/zelda3.sfc + +`cd tables` + +Install python dependencies: `pip install pillow` and `pip install pyyaml` + +Run `python extract_resources.py` to extract resources from the ROM into a more human readable format. + +Run `python compile_resources.py` to produce .h files that gets included by the C++ code. + +### Windows +Build the .sln file with Visual Studio + +### Linux +`apt install libsdl2-dev` + +Make sure you are in the root directory. + +`clang++ -I/usr/include/SDL2 -lSDL2 -O2 -ozelda3 *.cpp snes/*.cpp` + + +## Usage and controls + +The game supports snapshots. The joypad input history is also saved in the snapshot. It's thus possible to replay a playthrough in turbo mode to verify that the game behaves correctly. + +The game is run with `./zelda3` and takes an optional path to the ROM-file, which will verify for each frame that the C++ code matches the original behavior. + +| Button | Key | +| ------ | ----------- | +| Up | Up arrow | +| Down | Down arrow | +| Left | Left arrow | +| Right | Right arrow | +| Start | Enter | +| Select | Right shift | +| A | X | +| B | Z | +| X | S | +| Y | A | +| L | D | +| R | C | + + +Additionally, the following commands are available: + +| Key | Action | +| --- | --------------------- | +| W | Fill health/magic | +| E | Hard reset | +| P | Pause | +| T | Toggle replay turbo | +| K | Clear all input history from current snapshot | +| F1-F10 | Load snapshot | +| Shift+F1-F10 | Save snapshot | +| Ctrl+F1-F10 | Replay the snapshot | + +Additionally, there are a bunch of included playthrough snapshots that play all dungeons of the game. You access them with the digit keys. If you want to replay the stage in turbo mode, press Ctrl+Digit (eg Ctrl-5). + + +## License + +This project is licensed under the MIT license. See 'LICENSE.txt' for details. diff --git a/Zelda3.sln b/Zelda3.sln new file mode 100644 index 00000000..e05fd102 --- /dev/null +++ b/Zelda3.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30717.126 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zelda3", "zelda3.vcxproj", "{CB07E01D-A194-481A-BEA1-DC13756AD150}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Debug|x64.ActiveCfg = Debug|x64 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Debug|x64.Build.0 = Debug|x64 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Debug|x86.ActiveCfg = Debug|Win32 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Debug|x86.Build.0 = Debug|Win32 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Release|x64.ActiveCfg = Release|x64 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Release|x64.Build.0 = Release|x64 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Release|x86.ActiveCfg = Release|Win32 + {CB07E01D-A194-481A-BEA1-DC13756AD150}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E47623E3-1B23-4ED7-8FC1-3E1F0AD82DD0} + EndGlobalSection +EndGlobal diff --git a/ancilla.cpp b/ancilla.cpp new file mode 100644 index 00000000..d1396063 --- /dev/null +++ b/ancilla.cpp @@ -0,0 +1,7358 @@ +#include "ancilla.h" +#include "variables.h" +#include "variables_weathervane.h" +#include "variables_happiness_pond.h" +#include "variables_blastwall.h" +#include "variables_skullwoodsfire.h" +#include "variables_breaktowerseal.h" +#include "sprite.h" +#include "hud.h" +#include "load_gfx.h" +#include "tagalong.h" +#include "overworld.h" +#include "tile_detect.h" +#include "player.h" +#include "misc.h" +#include "dungeon.h" +#include "tables/generated_ancilla.h" +#include "sprite_main.h" + +static const uint8 kAncilla_Pflags[68] = { + 0, 8, 0xc, 0x10, 0x10, 4, 0x10, 0x18, 8, 8, 8, 0, 0x14, 0, 0x10, 0x28, + 0x18, 0x10, 0x10, 0x10, 0x10, 0xc, 8, 8, 0x50, 0, 0x10, 8, 0x40, 0, 0xc, 0x24, + 0x10, 0xc, 8, 0x10, 0x10, 4, 0xc, 0x1c, 0, 0x10, 0x14, 0x14, 0x10, 8, 0x20, 0x10, + 0x10, 0x10, 4, 0, 0x80, 0x10, 4, 0x30, 0x14, 0x10, 0, 0x10, 0, 0, 8, 0, + 0x10, 8, 0x78, 0x80, +}; +static const int8 kFireRod_Xvel2[12] = {0, 0, -40, 40, 0, 0, -48, 48, 0, 0, -64, 64}; +static const int8 kFireRod_Yvel2[12] = {-40, 40, 0, 0, -48, 48, 0, 0, -64, 64, 0, 0}; +static const uint8 kTagalongLayerBits[4] = {0x20, 0x10, 0x30, 0x20}; +static const uint8 kBombos_Sfx[8] = {0x80, 0x80, 0x80, 0, 0, 0x40, 0x40, 0x40}; +const uint8 kBomb_Tab0[11] = {0xA0, 6, 4, 4, 4, 4, 4, 6, 6, 6, 6}; + +#define swordbeam_temp_x (*(uint16*)(g_ram+0x1580E)) +#define swordbeam_temp_y (*(uint16*)(g_ram+0x15810)) +#define swordbeam_arr ((uint8*)(g_ram+0x15800)) +#define swordbeam_var1 (*(uint8*)(g_ram+0x15804)) +#define swordbeam_var2 (*(uint8*)(g_ram+0x15808)) +static const int8 kAncilla_TileColl_Attrs[256] = { + 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 0, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; +static const uint8 kAncilla_TileColl0_Attrs[256] = { + 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 0, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; +static const uint8 kBomb_Draw_Tab0[12] = {0, 1, 2, 3, 2, 3, 4, 5, 6, 7, 8, 9}; +static const uint8 kBomb_Draw_Tab2[11] = {1, 4, 4, 4, 4, 4, 5, 4, 6, 6, 6}; + +static const uint8 kMagicPowder_Tab0[40] = { + 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 0, 1, 2, + 3, 4, 5, 6, 16, 17, 18, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 0, 1, 2, 3, 4, 5, 6, +}; +#define ether_arr1 ((uint8*)(g_ram+0x15800)) +#define ether_var2 (*(uint8*)(g_ram+0x15808)) +#define ether_y2 (*(uint16*)(g_ram+0x1580A)) +#define ether_y_adjusted (*(uint16*)(g_ram+0x1580C)) +#define ether_x2 (*(uint16*)(g_ram+0x1580E)) +#define ether_y3 (*(uint16*)(g_ram+0x15810)) +#define ether_var1 (*(uint8*)(g_ram+0x15812)) +#define ether_y (*(uint16*)(g_ram+0x15813)) +#define ether_x (*(uint16*)(g_ram+0x15815)) +static const uint8 kEther_BlitzOrb_Char[8] = {0x48, 0x48, 0x4a, 0x4a, 0x4c, 0x4c, 0x4e, 0x4e}; +static const uint8 kEther_BlitzOrb_Flags[8] = {0x3c, 0x7c, 0x3c, 0x7c, 0x3c, 0x7c, 0x3c, 0x7c}; +static const uint8 kEther_BlitzSegment_Char[4] = {0x40, 0x42, 0x44, 0x46}; +#define bombos_arr1 ((uint8*)(g_ram+0x15800)) +#define bombos_arr2 ((uint8*)(g_ram+0x15810)) +static const uint8 kBombosBlasts_Tab[72] = { + 0xb6, 0x5d, 0xa1, 0x30, 0x69, 0xb5, 0xa3, 0x24, 0x96, 0xac, 0x73, 0x5f, 0x92, 0x48, 0x52, 0x81, + 0x39, 0x95, 0x7f, 0x20, 0x88, 0x5d, 0x34, 0x98, 0xbc, 0xd2, 0x51, 0x77, 0xa2, 0x47, 0x94, 0xb2, + 0x34, 0xda, 0x30, 0x62, 0x9f, 0x76, 0x51, 0x46, 0x98, 0x5c, 0x9b, 0x61, 0x58, 0x95, 0x4c, 0xba, + 0x7e, 0xcb, 0x12, 0xd0, 0x70, 0xa6, 0x46, 0xbf, 0x40, 0x50, 0x7e, 0x8c, 0x2d, 0x61, 0xac, 0x88, + 0x20, 0x6a, 0x72, 0x5f, 0xd2, 0x28, 0x52, 0x80, +}; +static const uint8 kQuake_Tab1[5] = {0x17, 0x16, 0x17, 0x16, 0x10}; +static const uint8 kQuakeDrawGroundBolts_Char[15] = { 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x63 }; +struct QuakeItem { + int8 x, y; + uint8 f; +}; +static const QuakeItem kQuakeItems[] = { + {0, -16, 0x00}, + {0, -16, 0x01}, + {0, -16, 0x02}, + {0, -16, 0x03}, + {0, -16, 0x43}, + {0, -16, 0x42}, + {0, -16, 0x41}, + {0, -16, 0x40}, + {0, -16, 0x40}, {14, -8, 0x84}, + {29, -8, 0x44}, {13, -7, 0x84}, + {31, -7, 0x44}, {47, -4, 0x84}, + {49, -11, 0x06}, {63, -5, 0x44}, {47, -4, 0x84}, + {36, -17, 0x08}, {49, -11, 0x06}, {63, -5, 0x44}, {78, 4, 0x08}, + {22, -31, 0x08}, {36, -17, 0x08}, {78, 4, 0x08}, {93, 20, 0x08}, + {7, -46, 0x08}, {23, -45, 0x48}, {22, -31, 0x08}, {93, 20, 0x08}, {93, 36, 0x48}, + {-7, -61, 0x08}, {37, -59, 0x48}, {7, -46, 0x08}, {23, -45, 0x48}, {93, 36, 0x48}, {93, 52, 0x08}, + {-22, -75, 0x08}, {47, -74, 0x01}, {-8, -61, 0x08}, {36, -60, 0x48}, {93, 52, 0x08}, {108, 67, 0x08}, + {-37, -90, 0x08}, {-22, -75, 0x08}, {47, -74, 0x01}, {59, -62, 0x81}, {108, 67, 0x08}, {121, 80, 0x08}, + {-44, -104, 0xc9}, {-37, -90, 0x08}, {73, -74, 0x48}, {59, -62, 0x81}, {121, 80, 0x08}, + {-44, -120, 0x09}, {-44, -104, 0xc9}, {87, -89, 0x48}, {73, -74, 0x48}, + {-44, -120, 0x09}, {102, -104, 0x48}, {87, -89, 0x48}, + {102, -104, 0x48}, {87, -89, 0x48}, + {112, -116, 0x48}, {102, -104, 0x48}, + {112, -116, 0x48}, + {-13, -16, 0x00}, + {-13, -16, 0x01}, + {-13, -16, 0x02}, + {-13, -16, 0x03}, + {-11, -16, 0x43}, + {-11, -16, 0x42}, + {-11, -16, 0x41}, + {-11, -16, 0x40}, {-24, -10, 0x04}, + {-38, -18, 0x08}, {-24, -10, 0x04}, {-40, -7, 0xc4}, + {-45, -33, 0xc9}, {-38, -18, 0x08}, {-57, -7, 0x04}, {-40, -7, 0xc4}, + {-48, -45, 0x07}, {-45, -33, 0xc9}, {-57, -7, 0x04}, {-71, 2, 0x48}, + {-48, -45, 0x06}, {-71, 2, 0x48}, {-70, 18, 0x08}, + {-48, -45, 0x05}, {-70, 18, 0x08}, {-56, 33, 0x08}, + {-48, -45, 0x07}, {-54, 34, 0x08}, {-54, 49, 0x88}, + {-48, -45, 0x06}, {-54, 49, 0x88}, {-69, 64, 0x88}, + {-48, -45, 0x07}, {-69, 64, 0x88}, {-85, 73, 0xc4}, + {-48, -45, 0x05}, {-101, 73, 0x04}, {-85, 73, 0xc4}, + {-60, -53, 0x08}, {-48, -45, 0x06}, {-101, 73, 0x04}, {-116, 77, 0xc4}, + {-75, -67, 0x08}, {-60, -53, 0x08}, {-128, 76, 0x04}, {-116, 77, 0xc4}, + {-90, -82, 0x08}, {-75, -67, 0x08}, {-128, 76, 0x04}, + {-105, -97, 0x08}, {-90, -82, 0x08}, + {-120, -111, 0x08}, {-105, -97, 0x08}, + {-120, -111, 0x08}, + {0, -5, 0x0a}, + {0, -5, 0x0b}, + {2, -3, 0x0c}, + {1, -3, 0x0d}, + {0, -3, 0x8d}, + {1, -3, 0x8c}, + {1, -3, 0x8b}, + {1, -3, 0x8a}, {-6, 12, 0x89}, + {-6, 12, 0x89}, {-10, 28, 0xc9}, + {-10, 28, 0x49}, {-8, 44, 0x89}, + {-8, 44, 0x89}, {-10, 56, 0x02}, + {-10, 56, 0x02}, {-23, 70, 0x48}, {5, 70, 0x08}, + {-23, 70, 0x48}, {5, 70, 0x08}, {-38, 85, 0x48}, {19, 85, 0x08}, + {-38, 85, 0x48}, {19, 85, 0x08}, {-52, 99, 0x48}, {33, 101, 0x08}, + {-52, 99, 0x48}, {33, 101, 0x08}, {-66, 113, 0x48}, {47, 115, 0x08}, + {-66, 113, 0x48}, {47, 115, 0x08}, +}; +static const uint8 kQuakeItemPos[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 21, 25, 30, + 36, 42, 48, 53, 57, 60, 62, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 77, 81, 85, 88, 91, 94, 97, 100, 103, 107, 111, 114, 116, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 130, 132, 134, 137, 141, 145, 149, 151 +}; +static const QuakeItem kQuakeItems2[] = { + {-96, 112, 0x20}, + {-96, 112, 0x21}, + {-96, 112, 0x66}, + {-96, 112, 0x22}, + {-96, 112, 0x23}, + {-96, 112, 0x63}, + {-96, 112, 0x62}, + {-96, 112, 0x26}, + {-96, 112, 0x27}, {-86, 124, 0x28}, + {-86, 124, 0x28}, {-72, -117, 0x28}, + {-72, -117, 0x28}, {-59, -102, 0xa1}, + {-59, -102, 0xa1}, {-44, -116, 0x68}, + {-44, -116, 0x68}, {-29, 126, 0x68}, + {-29, 126, 0x68}, + {-19, 125, 0xc5}, + {-112, 96, 0x2a}, + {-112, 96, 0x2b}, + {-112, 96, 0x2c}, + {-112, 96, 0x2d}, + {-119, 82, 0x29}, {-112, 96, 0x2a}, + {-123, 66, 0xe9}, {-119, 82, 0x29}, + {-121, 50, 0x29}, {-123, 66, 0xe9}, + {126, 34, 0x28}, {-115, 34, 0x68}, {-121, 50, 0x29}, + {-106, 18, 0xa9}, {111, 19, 0x28}, {126, 34, 0x28}, {-115, 34, 0x68}, + {-100, 2, 0x68}, {102, 4, 0xe9}, {-106, 18, 0xa9}, {111, 19, 0x28}, + {-91, -14, 0xa9}, {95, -11, 0x28}, {-100, 2, 0x68}, {102, 4, 0xe9}, + {96, 112, 0x60}, + {96, 112, 0x61}, + {96, 112, 0x26}, + {96, 112, 0x62}, + {96, 112, 0x63}, + {96, 112, 0x23}, + {96, 112, 0x22}, + {96, 112, 0x66}, + {85, 111, 0xe8}, {96, 112, 0x67}, + {70, 104, 0x24}, {85, 111, 0xe8}, + {70, 104, 0x24}, {54, 108, 0xe4}, + {40, 100, 0x28}, {38, 107, 0x24}, {54, 108, 0xe4}, + {25, 85, 0x28}, {40, 100, 0x28}, {38, 107, 0x24}, {22, 110, 0xe4}, + {11, 70, 0x28}, {25, 85, 0x28}, {7, 108, 0x24}, {22, 110, 0xe4}, + {11, 70, 0x28}, {7, 108, 0x24}, + {112, 112, 0x2a}, + {112, 112, 0x2b}, + {112, 112, 0x2c}, + {112, 112, 0x2d}, + {112, 112, 0x2a}, {108, 125, 0x29}, + {108, 125, 0x29}, {114, -116, 0x28}, + {114, -116, 0x28}, {124, -100, 0x29}, + {124, -100, 0x29}, {123, -84, 0xe9}, + {123, -84, 0xe9}, {117, -74, 0xe4}, {-124, -69, 0x28}, + {117, -74, 0xe4}, {-124, -69, 0x28}, {103, -67, 0x68}, {-110, -54, 0x28}, + {103, -67, 0x68}, {-110, -54, 0x28}, {95, -52, 0x69}, {-102, -39, 0x29}, + {95, -52, 0x69}, {-102, -39, 0x29}, {96, -36, 0xe9}, {-102, -24, 0xe9}, + {96, -36, 0xe9}, {-102, -24, 0xe9}, + {-123, -14, 0x29}, {-115, -14, 0x2e}, {49, -12, 0x28}, +}; +static const uint8 kQuakeItemPos2[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 19, 20, 21, 22, 23, 24, 26, 28, 30, 33, 37, 41, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 57, 59, 62, 66, 70, 72, 73, 74, 75, 76, 78, 80, 82, 84, 87, 91, 95, 99, 101, 104 +}; +static const uint8 kReceiveItem_Tab4[3] = {9, 5, 5}; +static const uint8 kReceiveItem_Tab5[3] = {0x24, 0x25, 0x26}; +static const uint8 kReceiveItem_Tab0[3] = {5, 1, 4}; +static const int16 kReceiveItemMsgs[76] = { + -1, 0x70, 0x77, 0x52, -1, 0x78, 0x78, 0x62, 0x61, 0x66, 0x69, 0x53, 0x52, 0x56, -1, 0x64, + 0x63, 0x65, 0x51, 0x54, 0x67, 0x68, 0x6b, 0x77, 0x79, 0x55, 0x6e, 0x58, 0x6d, 0x5d, 0x57, 0x5e, + -1, 0x74, 0x75, 0x76, -1, 0x5f, 0x158, -1, 0x6a, 0x5c, 0x8f, 0x71, 0x72, 0x73, 0x71, 0x72, + 0x73, 0x6a, 0x6c, 0x60, -1, -1, -1, 0x59, 0x84, 0x5a, -1, -1, -1, -1, -1, 0x159, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 0xdb, 0x67, 0x7c, +}; +static const int16 kReceiveItemMsgs2[2] = {0x5b, 0x83}; +static const int16 kReceiveItemMsgs3[4] = {-1, 0x155, 0x156, 0x157}; +static const uint8 kTravelBird_DmaStuffs[4] = {0, 0x20, 0x40, 0xe0}; +static const int8 kTravelBird_Draw_X[3] = {0, -9, -9}; +static const int8 kTravelBird_Draw_Y[3] = {0, 12, 20}; +static const uint8 kTravelBird_Draw_Char[3] = {0xe, 0, 2}; +static const uint8 kTravelBird_Draw_Flags[3] = {0x22, 0x2e, 0x2e}; +static const int8 kSomarianBlock_Coll_X[12] = {0, 0, -8, 8, 0, 0, 0, 0, 8, -8, -8, 8}; +static const int8 kSomarianBlock_Coll_Y[12] = {-8, 8, 0, 0, 0, 0, 0, 0, -8, 8, -8, 8}; +static HandlerFuncK *const kAncilla_Funcs[67] = { + &Ancilla01_SomariaBullet, + &Ancilla02_FireRodShot, + &Ancilla_Empty, + &Ancilla04_BeamHit, + &Ancilla05_Boomerang, + &Ancilla06_WallHit, + &Ancilla07_Bomb, + &Ancilla08_DoorDebris, + &Ancilla09_Arrow, + &Ancilla0A_ArrowInTheWall, + &Ancilla0B_IceRodShot, + &Ancilla_SwordBeam, + &Ancilla0D_SpinAttackFullChargeSpark, + &Ancilla33_BlastWallExplosion, + &Ancilla33_BlastWallExplosion, + &Ancilla33_BlastWallExplosion, + &Ancilla11_IceRodWallHit, + &Ancilla33_BlastWallExplosion, + &Ancilla13_IceRodSparkle, + &Ancilla_Unused_14, + &Ancilla15_JumpSplash, + &Ancilla16_HitStars, + &Ancilla17_ShovelDirt, + &Ancilla18_EtherSpell, + &Ancilla19_BombosSpell, + &Ancilla1A_PowderDust, + &Ancilla_SwordWallHit, + &Ancilla1C_QuakeSpell, + &Ancilla1D_ScreenShake, + &Ancilla1E_DashDust, + &Ancilla1F_Hookshot, + &Ancilla20_Blanket, + &Ancilla21_Snore, + &Ancilla22_ItemReceipt, + &Ancilla23_LinkPoof, + &Ancilla24_Gravestone, + &Ancilla_Unused_25, + &Ancilla26_SwordSwingSparkle, + &Ancilla27_Duck, + &Ancilla28_WishPondItem, + &Ancilla29_MilestoneItemReceipt, + &Ancilla2A_SpinAttackSparkleA, + &Ancilla2B_SpinAttackSparkleB, + &Ancilla2C_SomariaBlock, + &Ancilla2D_SomariaBlockFizz, + &Ancilla2E_SomariaBlockFission, + &Ancilla2F_LampFlame, + &Ancilla30_ByrnaWindupSpark, + &Ancilla31_ByrnaSpark, + &Ancilla32_BlastWallFireball, + &Ancilla33_BlastWallExplosion, + &Ancilla34_SkullWoodsFire, + &Ancilla35_MasterSwordReceipt, + &Ancilla36_Flute, + &Ancilla37_WeathervaneExplosion, + &Ancilla38_CutsceneDuck, + &Ancilla39_SomariaPlatformPoof, + &Ancilla3A_BigBombExplosion, + &Ancilla3B_SwordUpSparkle, + &Ancilla3C_SpinAttackChargeSparkle, + &Ancilla3D_ItemSplash, + &Ancilla_RisingCrystal, + &Ancilla3F_BushPoof, + &Ancilla40_DwarfPoof, + &Ancilla41_WaterfallSplash, + &Ancilla42_HappinessPondRupees, + &Ancilla43_GanonsTowerCutscene, +}; +uint16 Ancilla_GetX(int k) { + return ancilla_x_lo[k] | ancilla_x_hi[k] << 8; +} + +uint16 Ancilla_GetY(int k) { + return ancilla_y_lo[k] | ancilla_y_hi[k] << 8; +} + +void Ancilla_SetX(int k, uint16 x) { + ancilla_x_lo[k] = x; + ancilla_x_hi[k] = x >> 8; +} + +void Ancilla_SetY(int k, uint16 y) { + ancilla_y_lo[k] = y; + ancilla_y_hi[k] = y >> 8; +} + +int Ancilla_AllocHigh() { + for (int k = 9; k >= 0; k--) { + if (ancilla_type[k] == 0) + return k; + } + return -1; +} + +void Ancilla_Empty(int k) { +} + +void Ancilla_Unused_14(int k) { + assert(0); +} + +void Ancilla_Unused_25(int k) { + assert(0); +} + +void SpinSpark_Draw(int k, int offs) { + static const uint8 kInitialSpinSpark_Char[32] = { + 0x92, 0xff, 0xff, 0xff, 0x8c, 0x8c, 0x8c, 0x8c, 0xd6, 0xd6, 0xd6, 0xd6, 0x93, 0x93, 0x93, 0x93, + 0xd6, 0xd6, 0xd6, 0xd6, 0xd7, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, // wtf oob + }; + static const uint8 kInitialSpinSpark_Flags[29] = { + 0x22, 0xff, 0xff, 0xff, 0x22, 0x62, 0xa2, 0xe2, 0x24, 0x64, 0xa4, 0xe4, 0x22, 0x62, 0xa2, 0xe2, + 0x22, 0x62, 0xa2, 0xe2, 0x22, 0xff, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, + 0xfc, + }; + static const int8 kInitialSpinSpark_Y[29] = { + -4, 0, 0, 0, -8, -8, 0, 0, -8, -8, 0, 0, -8, -8, 0, 0, + -8, -8, 0, 0, -4, 0, 0, 0, -4, 0, 0, 0, + -4, + }; + static const int16 kInitialSpinSpark_X[29] = { + -4, 0, 0, 0, -8, 0, -8, 0, -8, 0, -8, 0, -8, 0, -8, 0, + -8, 0, -8, 0, -4, 0, 0, 0, -4, 0, 0, 0, + 0x11a5 + }; + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + int t = (ancilla_item_to_link[k] + offs) * 4; + assert(t < 32); + for(int i = 0; i < 4; i++, t++) { + if (kInitialSpinSpark_Char[t] != 0xff) { + Ancilla_SetOam_XY(oam, + info.x + kInitialSpinSpark_X[t], info.y + kInitialSpinSpark_Y[t]); + oam->charnum = kInitialSpinSpark_Char[t]; + oam->flags = kInitialSpinSpark_Flags[t] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } +} + +bool SomarianBlock_CheckEmpty(OamEnt *oam) { + for (int i = 0; i != 4; i++) { + if (oam[i].y == 0xf0) + continue; + for (i = 0; i < 4; i++) + if (!(bytewise_extended_oam[oam + i - oam_buf] & 1)) + return false; + break; + } + return true; +} + +void AddDashingDustEx(uint8 a, uint8 y, uint8 flag) { + static const int8 kAddDashingDust_X[4] = {4, 4, 6, 0}; + static const int8 kAddDashingDust_Y[4] = {20, 4, 16, 16}; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_step[k] = flag; + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 3; + int j = link_direction_facing >> 1; + ancilla_dir[k] = j; + if (!flag) { + Ancilla_SetXY(k, link_x_coord, link_y_coord + 20); + } else { + Ancilla_SetXY(k, link_x_coord + kAddDashingDust_X[j], link_y_coord + kAddDashingDust_Y[j]); + } + } +} + +void AddBirdCommon(int k) { + ancilla_y_vel[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 1; + ancilla_x_vel[k] = 56; + ancilla_arr3[k] = 3; + ancilla_K[k] = 0; + ancilla_G[k] = 0; + Ancilla_SetXY(k, BG2HOFS_copy2 - 16, link_y_coord - 8); +} + +ProjectSpeedRet Bomb_ProjectSpeedTowardsPlayer(int k, uint16 x, uint16 y, uint8 vel) { // 84eb63 + uint16 old_x = Sprite_GetX(0), old_y = Sprite_GetY(0), old_z = sprite_z[0]; + Sprite_SetX(0, x); + Sprite_SetY(0, y); + sprite_z[0] = 0; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(0, vel); + sprite_z[0] = old_z; + Sprite_SetX(0, old_x); + Sprite_SetY(0, old_y); + return pt; +} + +void Boomerang_CheatWhenNoOnesLooking(int k, ProjectSpeedRet *pt) { // 86809f + uint16 x = link_x_coord - Ancilla_GetX(k) + 0xf0; + uint16 y = link_y_coord - Ancilla_GetY(k) + 0xf0; + if (x >= 0x1e0) { + pt->x = sign16(x - 0x1e0) ? 0x90 : 0x70; + } else if (y >= 0x1e0) { + pt->y = sign16(y - 0x1e0) ? 0x90 : 0x70; + } +} + +void Medallion_CheckSpriteDamage(int k) { // 86ec5c + tmp_counter = ancilla_type[k]; + for (int j = 15; j >= 0; j--) { + if (sprite_state[j] >= 9 && !(sprite_ignore_projectile[j] | sprite_pause[j])) { + Ancilla_CheckDamageToSprite_aggressive(j, tmp_counter); + } + } +} + +void Ancilla_CheckDamageToSprite(int k, uint8 type) { // 86ecb7 + if (!sign8(sprite_hit_timer[k])) + Ancilla_CheckDamageToSprite_aggressive(k, type); +} + +void Ancilla_CheckDamageToSprite_aggressive(int k, uint8 type) { // 86ecbd + static const uint8 kAncilla_Damage[57] = { + 6, 1, 11, 0, 0, 0, 0, 8, 0, 6, 0, 12, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 14, 13, 0, 0, 15, 0, 0, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, + 0, 1, 1, 1, 1, 1, 1, 1, 1, + }; + uint8 dmg = kAncilla_Damage[type]; + if (dmg == 6 && link_item_bow >= 3) { + if (sprite_type[k] == 0xd7) + sprite_delay_aux4[k] = 32; + dmg = 9; + } + Ancilla_CheckDamageToSprite_preset(k, dmg); +} + +void CallForDuckIndoors() { // 87a45f + Ancilla_Sfx2_Near(0x13); + AncillaAdd_Duck_take_off(0x27, 4); +} + +void Ancilla_Sfx1_Pan(int k, uint8 v) { // 888020 + byte_7E0CF8 = v; + sound_effect_ambient = v | Ancilla_CalculateSfxPan(k); +} + +void Ancilla_Sfx2_Pan(int k, uint8 v) { // 888027 + byte_7E0CF8 = v; + sound_effect_1 = v | Ancilla_CalculateSfxPan(k); +} + +void Ancilla_Sfx3_Pan(int k, uint8 v) { // 88802e + byte_7E0CF8 = v; + sound_effect_2 = v | Ancilla_CalculateSfxPan(k); +} + +void AncillaAdd_FireRodShot(uint8 type, uint8 y) { // 8880b3 + static const int8 kFireRod_X[4] = {0, 0, -8, 16}; + static const int8 kFireRod_Y[4] = {-8, 16, 3, 3}; + static const int8 kFireRod_Xvel[4] = {0, 0, -64, 64}; + static const int8 kFireRod_Yvel[4] = {-64, 64, 0, 0}; + + y = 1; + int j= Ancilla_AllocInit(type, 1); + if (j < 0) { + if (type != 1) + Refund_Magic(0); + return; + } + + if (type != 1) + Ancilla_Sfx2_Near(0xe); + + ancilla_type[j] = type; + ancilla_numspr[j] = kAncilla_Pflags[type]; + ancilla_timer[j] = 3; + ancilla_step[j] = 0; + ancilla_item_to_link[j] = 0; + ancilla_objprio[j] = 0; + ancilla_U[j] = 0; + int i = link_direction_facing >> 1; + ancilla_dir[j] = i; + + if (Ancilla_CheckInitialTile_A(j) < 0) { + Ancilla_SetXY(j, link_x_coord + kFireRod_X[i], link_y_coord + kFireRod_Y[i]); + if (type != 1) { + ancilla_x_vel[j] = kFireRod_Xvel[i]; + ancilla_y_vel[j] = kFireRod_Yvel[i]; + } else { + i += (link_sword_type - 2) * 4; + ancilla_x_vel[j] = kFireRod_Xvel2[i]; + ancilla_y_vel[j] = kFireRod_Yvel2[i]; + } + ancilla_floor[j] = link_is_on_lower_level; + ancilla_floor2[j] = link_is_on_lower_level_mirror; + } else { + if (type == 1) { + ancilla_type[j] = 4; + ancilla_timer[j] = 7; + ancilla_numspr[j] = 16; + } else { + ancilla_step[j] = 1; + ancilla_timer[j] = 31; + ancilla_numspr[j] = 8; + j = link_direction_facing >> 1; // wtf + Ancilla_Sfx2_Pan(j, 0x2a); + } + } +} + +void SomariaBlock_SpawnBullets(int k) { // 8881a7 + static const int8 kSpawnCentrifugalQuad_X[4] = {-8, -8, -9, -4}; + static const int8 kSpawnCentrifugalQuad_Y[4] = {-15, -4, -8, -8}; + + uint8 z = (ancilla_z[k] == 0xff) ? 0 : ancilla_z[k]; + uint16 x = Ancilla_GetX(k); + uint16 y = Ancilla_GetY(k) - z; + + for (int i = 3; i >= 0; i--) { + int j = Ancilla_AllocInit(1, 4); + if (j >= 0) { + ancilla_type[j] = 0x1; + ancilla_numspr[j] = kAncilla_Pflags[0x1]; + ancilla_step[j] = 4; + ancilla_item_to_link[j] = 0; + ancilla_objprio[j] = 0; + ancilla_dir[j] = i; + Ancilla_SetXY(j, x + kSpawnCentrifugalQuad_X[i], y + kSpawnCentrifugalQuad_Y[i]); + Ancilla_TerminateIfOffscreen(j); + ancilla_x_vel[j] = kFireRod_Xvel2[i]; + ancilla_y_vel[j] = kFireRod_Yvel2[i]; + ancilla_floor[j] = ancilla_floor[k]; + ancilla_floor2[j] = link_is_on_lower_level_mirror; + } + } + tmp_counter = 0xff; +} + +void Ancilla_Main() { // 888242 + Ancilla_WeaponTink(); + Ancilla_ExecuteAll(); +} + +ProjectSpeedRet Ancilla_ProjectReflexiveSpeedOntoSprite(int k, uint16 x, uint16 y, uint8 vel) { // 88824d + uint16 old_x = link_x_coord, old_y = link_y_coord; + link_x_coord = x; + link_y_coord = y; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, vel); + link_x_coord = old_x; + link_y_coord = old_y; + return pt; +} + +void Bomb_CheckSpriteDamage(int k) { // 888287 + for (int j = 15; j >= 0; j--) { + if ((j ^ frame_counter) & 3 | sprite_hit_timer[j] | sprite_ignore_projectile[j]) + continue; + if (sprite_floor[j] != ancilla_floor[k] || sprite_state[j] < 9) + continue; + SpriteHitBox hb; + int ax = Ancilla_GetX(k) - 24; + int ay = Ancilla_GetY(k) - 24 - ancilla_z[k]; + hb.r0_xlo = ax; + hb.r8_xhi = ax >> 8; + hb.r1_ylo = ay; + hb.r9_yhi = ay >> 8; + hb.r2 = 48; + hb.r3 = 48; + Sprite_SetupHitBox(j, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + continue; + if (sprite_type[j] == 0x92 && sprite_C[j] >= 3) + continue; + Ancilla_CheckDamageToSprite(j, ancilla_type[k]); + ProjectSpeedRet pt = Ancilla_ProjectReflexiveSpeedOntoSprite(j, Ancilla_GetX(k), Ancilla_GetY(k), 64); + sprite_x_recoil[j] = -pt.x; + sprite_y_recoil[j] = -pt.y; + } +} + +void Ancilla_ExecuteAll() { // 88832b + for (int i = 9; i >= 0; i--) { + cur_object_index = i; + if (ancilla_type[i]) + Ancilla_ExecuteOne(ancilla_type[i], i); + } +} + +void Ancilla_ExecuteOne(uint8 type, int k) { // 88833c + if (k < 6) { + ancilla_oam_idx[k] = Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, ancilla_numspr[k]); + } + + if (submodule_index == 0 && ancilla_timer[k] != 0) + ancilla_timer[k]--; + + kAncilla_Funcs[type - 1](k); +} + +void Ancilla13_IceRodSparkle(int k) { // 888435 + static const uint8 kIceShotSparkle_X[16] = {2, 7, 6, 1, 1, 7, 7, 1, 0, 7, 8, 1, 4, 9, 4, 0xff}; + static const uint8 kIceShotSparkle_Y[16] = {2, 3, 8, 7, 1, 1, 7, 7, 1, 0, 7, 8, 0xff, 4, 9, 4}; + static const uint8 kIceShotSparkle_Char[16] = {0x83, 0x83, 0x83, 0x83, 0xb6, 0x80, 0xb6, 0x80, 0xb7, 0xb6, 0xb7, 0xb6, 0xb7, 0xb6, 0xb7, 0xb6}; + + if (!ancilla_timer[k]) + ancilla_type[k] = 0; + if (!submodule_index) { + Ancilla_MoveX(k); + Ancilla_MoveY(k); + } + AncillaOamInfo info; + if (Ancilla_ReturnIfOutsideBounds(k, &info)) + return; + + int j; + for (j = 4; j >= 0 && ancilla_type[j] != 0xb; j--) {} + if (j >= 0 && ancilla_objprio[j]) + info.flags = 0x30; + + if (sort_sprites_setting) { + if (ancilla_floor[k]) + Oam_AllocateFromRegionE(0x10); + else + Oam_AllocateFromRegionD(0x10); + } else { + Oam_AllocateFromRegionA(0x10); + } + + OamEnt *oam = GetOamCurPtr(); + j = ancilla_timer[k] & 0x1c; + for (int i = 3; i >= 0; i--, oam++) { + oam->x = info.x + kIceShotSparkle_X[i + j]; + oam->y = info.y + kIceShotSparkle_Y[i + j]; + oam->charnum = kIceShotSparkle_Char[i + j]; + oam->flags = info.flags | 4; + bytewise_extended_oam[oam - oam_buf] = 0; + } +} + +void AncillaAdd_IceRodSparkle(int k) { // 8884c8 + static const int8 kIceShotSparkle_Xvel[4] = {0, 0, -4, 4}; + static const int8 kIceShotSparkle_Yvel[4] = {-4, 4, 0, 0}; + + if (submodule_index || !sign8(--ancilla_arr4[k])) + return; + + ancilla_arr4[k] = 5; + int j = Ancilla_AllocHigh(); + if (j >= 0) { + ancilla_type[j] = 0x13; + ancilla_timer[j] = 15; + + int i = ancilla_dir[k]; + ancilla_x_vel[j] = kIceShotSparkle_Xvel[i]; + ancilla_y_vel[j] = kIceShotSparkle_Yvel[i]; + + ancilla_x_lo[j] = ancilla_x_lo[k]; + ancilla_y_lo[j] = ancilla_y_lo[k]; + ancilla_floor[j] = ancilla_floor[k]; + ancilla_numspr[j] = 0; + } + +} + +void Ancilla01_SomariaBullet(int k) { // 88851b + static const uint8 kSomarianBlast_Mask[6] = {7, 3, 1, 0, 0, 0}; + + if (!submodule_index) { + if (!(frame_counter & kSomarianBlast_Mask[ancilla_step[k]])) { + Ancilla_MoveX(k); + Ancilla_MoveY(k); + } + if (ancilla_timer[k] == 0) { + ancilla_timer[k] = 3; + uint8 a = ancilla_step[k] + 1; + if (a >= 6) + a = 4; + ancilla_step[k] = a; + } + if (Ancilla_CheckSpriteCollision(k) >= 0 || Ancilla_CheckTileCollision_staggered(k)) { + ancilla_type[k] = 4; + ancilla_timer[k] = 7; + ancilla_numspr[k] = 16; + } + } + SomarianBlast_Draw(k); +} + +bool Ancilla_ReturnIfOutsideBounds(int k, AncillaOamInfo *info) { // 88862a + static const uint8 kAncilla_FloorFlags[2] = {0x20, 0x10}; + info->flags = kAncilla_FloorFlags[ancilla_floor[k]]; + if ((info->x = ancilla_x_lo[k] - BG2HOFS_copy2) >= 0xf4 || + (info->y = ancilla_y_lo[k] - BG2VOFS_copy2) >= 0xf0) { + ancilla_type[k] = 0; + return true; + } + return false; +} + +void SomarianBlast_Draw(int k) { // 888650 + static const uint8 kSomarianBlast_Flags[2] = {2, 6}; + AncillaOamInfo info; + if (Ancilla_ReturnIfOutsideBounds(k, &info)) + return; + info.flags |= kSomarianBlast_Flags[ancilla_item_to_link[k]]; + if (ancilla_objprio[k]) + info.flags |= 0x30; + static const int8 kSomarianBlast_Draw_X0[24] = { + 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + static const int8 kSomarianBlast_Draw_X1[24] = { + 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 4, 4, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 8, 8, + }; + static const uint8 kSomarianBlast_Draw_Y0[24] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 0, 0, 0, 4, 4, + }; + static const uint8 kSomarianBlast_Draw_Y1[24] = { + 0, 0, 0, 0, 8, 8, 0x80, 0, 0, 0, 8, 8, 0x80, 8, 8, 8, + 4, 4, 0x80, 8, 8, 8, 4, 4, + }; + static const uint8 kSomarianBlast_Draw_Flags0[24] = { + 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x40, 0x40, 0x40, 0x40, 0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xc0, 0, 0, 0, 0, 0, 0x80, + }; + static const uint8 kSomarianBlast_Draw_Flags1[24] = { + 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0, 0, 0, 0, 0, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, + 0x40, 0xc0, 0x80, 0x80, 0x80, 0x80, 0, 0x80, + }; + static const uint8 kSomarianBlast_Draw_Char0[24] = { + 0x50, 0x50, 0x44, 0x44, 0x52, 0x52, 0x50, 0x50, 0x44, 0x44, 0x51, 0x51, 0x43, 0x43, 0x42, 0x42, + 0x41, 0x41, 0x43, 0x43, 0x42, 0x42, 0x40, 0x40, + }; + static const uint8 kSomarianBlast_Draw_Char1[24] = { + 0x50, 0x50, 0x44, 0x44, 0x51, 0x51, 0x50, 0x50, 0x44, 0x44, 0x52, 0x52, 0x43, 0x43, 0x42, 0x42, + 0x40, 0x40, 0x43, 0x43, 0x42, 0x42, 0x41, 0x41, + }; + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_dir[k] * 6 + ancilla_step[k]; + + oam[0].x = info.x + kSomarianBlast_Draw_X0[j]; + oam[1].x = info.x + kSomarianBlast_Draw_X1[j]; + if (!sign8(kSomarianBlast_Draw_Y0[j])) + oam[0].y = info.y + kSomarianBlast_Draw_Y0[j]; + if (!sign8(kSomarianBlast_Draw_Y1[j])) + oam[1].y = info.y + kSomarianBlast_Draw_Y1[j]; + oam[0].charnum = 0x82 + kSomarianBlast_Draw_Char0[j]; + oam[1].charnum = 0x82 + kSomarianBlast_Draw_Char1[j]; + oam[0].flags = info.flags | kSomarianBlast_Draw_Flags0[j]; + oam[1].flags = info.flags | kSomarianBlast_Draw_Flags1[j]; + bytewise_extended_oam[oam - oam_buf] = 0; + bytewise_extended_oam[oam - oam_buf + 1] = 0; + + +} + +void Ancilla02_FireRodShot(int k) { // 8886d2 + if (ancilla_step[k] == 0) { + if (!submodule_index) { + ancilla_L[k] = 0; + Ancilla_MoveX(k); + Ancilla_MoveY(k); + uint8 coll = Ancilla_CheckSpriteCollision(k) >= 0; + if (!coll) { + ancilla_dir[k] |= 8; + coll = Ancilla_CheckTileCollision(k); + ancilla_L[k] = ancilla_tile_attr[k]; + if (!coll) { + ancilla_dir[k] |= 12; + uint8 bak = ancilla_U[k]; + coll = Ancilla_CheckTileCollision(k); + ancilla_U[k] = bak; + } + } + if (coll) { + ancilla_step[k]++; + ancilla_timer[k] = 31; + ancilla_numspr[k] = 8; + Ancilla_Sfx2_Pan(k, 0x2a); + } + ancilla_item_to_link[k]++; + ancilla_dir[k] &= ~0xC; + if (((byte_7E0333 = ancilla_L[k]) & 0xf0) == 0xc0 || ((byte_7E0333 = ancilla_tile_attr[k]) & 0xf0) == 0xc0) + Dungeon_LightTorch(); + } + FireShot_Draw(k); + } else { + AncillaOamInfo info; + Ancilla_CheckBasicSpriteCollision(k); + if (Ancilla_ReturnIfOutsideBounds(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + if (!ancilla_timer[k]) { + uint8 old_type = ancilla_type[k]; + ancilla_type[k] = 0; + if (old_type != 0x2f && BYTE(overworld_screen_index) == 64 && ancilla_tile_attr[k] == 0x43) + FireRodShot_BecomeSkullWoodsFire(k); + return; + } + int j = ancilla_timer[k] >> 3; + if (j != 0) { + static const uint8 kFireShot_Draw_Char[3] = {0xa2, 0xa0, 0x8e}; + oam->x = info.x; + oam->y = info.y; + oam->charnum = kFireShot_Draw_Char[j - 1]; + oam->flags = info.flags | 2; + bytewise_extended_oam[oam - oam_buf] = 2; + } else { + bytewise_extended_oam[oam - oam_buf] = 0; + bytewise_extended_oam[oam - oam_buf + 1] = 0; + oam[0].x = info.x; + oam[1].x = info.x + 8; + oam[0].y = info.y - 3; + oam[1].y = info.y - 3; + oam[0].charnum = 0xa4; + oam[1].charnum = 0xa5; + oam[0].flags = info.flags | 2; + oam[1].flags = info.flags | 2; + } + } +} + +void FireShot_Draw(int k) { // 88877c + static const uint8 kFireShot_Draw_X2[16] = {7, 0, 8, 0, 8, 4, 0, 0, 2, 8, 0, 0, 1, 4, 9, 0}; + static const uint8 kFireShot_Draw_Y2[16] = {1, 4, 9, 0, 7, 0, 8, 0, 8, 4, 0, 0, 2, 8, 0, 0}; + static const uint8 kFireShot_Draw_Char2[3] = {0x8d, 0x9d, 0x9c}; + AncillaOamInfo info; + if (Ancilla_ReturnIfOutsideBounds(k, &info)) + return; + if (ancilla_objprio[k]) + info.flags |= 0x30; + + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_item_to_link[k] & 0xc; + for (int i = 2; i >= 0; i--) { + oam->x = info.x + kFireShot_Draw_X2[j + i]; + oam->y = info.y + kFireShot_Draw_Y2[j + i]; + oam->charnum = kFireShot_Draw_Char2[i]; + oam->flags = info.flags | 2; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } +} + +uint8 Ancilla_CheckTileCollision_staggered(int k) { // 88897b + if ((frame_counter ^ k) & 1) + return Ancilla_CheckTileCollision(k); + return 0; +} + +uint8 Ancilla_CheckTileCollision(int k) { // 888981 + if (!player_is_indoors && ancilla_objprio[k]) { + ancilla_tile_attr[k] = 0; + return 0; + } + if (!dung_hdr_collision) + return Ancilla_CheckTileCollisionOneFloor(k); + uint16 x = 0, y = 0; + if (dung_hdr_collision < 3) { + x = BG1HOFS_copy2 - BG2HOFS_copy2; + y = BG1VOFS_copy2 - BG2VOFS_copy2; + } + uint16 oldx = Ancilla_GetX(k), oldy = Ancilla_GetY(k); + Ancilla_SetX(k, oldx + x); + Ancilla_SetY(k, oldy + y); + ancilla_floor[k] = 1; + uint8 b = Ancilla_CheckTileCollisionOneFloor(k); + ancilla_floor[k] = 0; + Ancilla_SetX(k, oldx); + Ancilla_SetY(k, oldy); + return (b << 1) | (uint8)Ancilla_CheckTileCollisionOneFloor(k); +} + +bool Ancilla_CheckTileCollisionOneFloor(int k) { // 888a03 + static const int8 kAncilla_CheckTileColl0_X[20] = { + 8, 8, 0, 16, 4, 4, 0, 16, 4, 4, 4, 12, 12, 12, 4, 12, 0, 0, 0, 0, + }; + static const int8 kAncilla_CheckTileColl0_Y[20] = { + 0, 16, 5, 5, 0, 16, 4, 4, 4, 12, 5, 5, 4, 12, 12, 12, 0, 0, 0, 0, + }; + uint16 x = Ancilla_GetX(k) + kAncilla_CheckTileColl0_X[ancilla_dir[k]]; + uint16 y = Ancilla_GetY(k) + kAncilla_CheckTileColl0_Y[ancilla_dir[k]]; + return Ancilla_CheckTileCollision_targeted(k, x, y); +} + +bool Ancilla_CheckTileCollision_targeted(int k, uint16 x, uint16 y) { // 888a26 + if ((uint16)(y - BG2VOFS_copy2) >= 224 || (uint16)(x - BG2HOFS_copy2) >= 256) + return 0; + uint8 tile_attr; + if (!player_is_indoors) { + x >>= 3; + tile_attr = Overworld_GetTileAttributeAtLocation(x, y); + } else { + tile_attr = GetTileAttribute(ancilla_floor[k], &x, y); + } + + ancilla_tile_attr[k] = tile_attr; + if (tile_attr == 3 && ancilla_floor2[k]) + return 0; + + uint8 t = kAncilla_TileColl0_Attrs[tile_attr]; + + if (ancilla_type[k] == 2 && (tile_attr & 0xf0) == 0xc0) + t = 0; + + if (!ancilla_objprio[k]) { + if (t == 0) + return false; + if (t == 1) + goto return_true_set_alert; + if (t == 2) + return Entity_CheckSlopedTileCollision(x, y); + if (t == 3) { + if (ancilla_floor2[k]) + goto return_true_set_alert; + return 0; + } + } + if (sign8(--ancilla_U[k])) { + ancilla_U[k] = 0; + if (t == 4) { + ancilla_U[k] = 6; + ancilla_objprio[k] ^= 1; + } + } + return 0; + +return_true_set_alert: + sprite_alert_flag = 3; + return 1; +} + +bool Ancilla_CheckTileCollision_Class2(int k) { // 888bcf + if (!dung_hdr_collision) + return Ancilla_CheckTileCollision_Class2_Inner(k); + uint16 x = 0, y = 0; + if (dung_hdr_collision < 3) { + x = BG1HOFS_copy2 - BG2HOFS_copy2; + y = BG1VOFS_copy2 - BG2VOFS_copy2; + } + uint16 oldx = Ancilla_GetX(k), oldy = Ancilla_GetY(k); + Ancilla_SetX(k, oldx + x); + Ancilla_SetY(k, oldy + y); + ancilla_floor[k] = 1; + bool b = Ancilla_CheckTileCollision_Class2_Inner(k); + ancilla_floor[k] = 0; + Ancilla_SetX(k, oldx); + Ancilla_SetY(k, oldy); + return (b | Ancilla_CheckTileCollision_Class2_Inner(k)) != 0; +} + +bool Ancilla_CheckTileCollision_Class2_Inner(int k) { // 888c43 + static const int8 kAncilla_CheckTileColl_Y[4] = {-8, 8, 0, 0}; + static const int8 kAncilla_CheckTileColl_X[4] = {0, 0, -8, 8}; + + uint16 x = Ancilla_GetX(k) + kAncilla_CheckTileColl_X[ancilla_dir[k]]; + uint16 y = Ancilla_GetY(k) + kAncilla_CheckTileColl_Y[ancilla_dir[k]]; + + if ((uint16)(y - BG2VOFS_copy2) >= 224 || (uint16)(x - BG2HOFS_copy2) >= 256) + return false; + uint8 tile_attr; + if (!player_is_indoors) { + x >>= 3; + tile_attr = Overworld_GetTileAttributeAtLocation(x, y); + } else { + tile_attr = GetTileAttribute(ancilla_floor[k], &x, y); + } + + ancilla_tile_attr[k] = tile_attr; + if (tile_attr == 3 && ancilla_floor2[k]) + return false; + + uint8 t = kAncilla_TileColl_Attrs[tile_attr]; + if (t == 0) + return false; + if (t == 2) + return Entity_CheckSlopedTileCollision(x, y); + if (t == 4) { + if (ancilla_floor2[k]) + return true; + ancilla_objprio[k] = 1; + return false; + } + if (t == 3) + return ancilla_floor2[k] != 0; + return true; +} + +void Ancilla04_BeamHit(int k) { // 888d19 + static const int8 kBeamHit_X[16] = {-12, 20, -12, 20, -8, 16, -8, 16, -4, 12, -4, 12, 0, 8, 0, 8}; + static const int8 kBeamHit_Y[16] = {-12, -12, 20, 20, -8, -8, 16, 16, -4, -4, 12, 12, 0, 0, 8, 8}; + static const uint8 kBeamHit_Char[16] = {0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54}; + static const uint8 kBeamHit_Flags[16] = {0x40, 0, 0xc0, 0x80, 0x40, 0, 0xc0, 0x80, 0x40, 0, 0xc0, 0x80, 0, 0x40, 0x80, 0xc0}; + AncillaOamInfo info; + if (Ancilla_ReturnIfOutsideBounds(k, &info)) + return; + if (!ancilla_timer[k]) { + ancilla_type[k] = 0; + return; + } + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_timer[k] >> 1; + uint16 ancilla_x = Ancilla_GetX(k); + uint16 ancilla_y = Ancilla_GetY(k); + uint8 r7 = ancilla_x - BG2HOFS_copy2; + uint8 r6 = ancilla_y - BG2VOFS_copy2; + for (int i = 3; i >= 0; i--, oam++) { + int m = j * 4 + i; + oam->x = info.x + kBeamHit_X[m]; + oam->y = info.y + kBeamHit_Y[m]; + oam->charnum = kBeamHit_Char[m] + 0x82; + oam->flags = kBeamHit_Flags[m] | 2 | info.flags; + uint16 x_adj = (uint16)(ancilla_x + (int8)(oam->x - r7) - BG2HOFS_copy2); + bytewise_extended_oam[oam - oam_buf] = (x_adj >= 0x100) ? 1 : 0; + uint16 y_adj = (uint16)(ancilla_y + (int8)(oam->y - r6) - BG2VOFS_copy2 + 0x10); + if (y_adj >= 0x100) + oam->y = 0xf0; + } +} + +int Ancilla_CheckSpriteCollision(int k) { // 888d68 + for (int j = 15; j >= 0; j--) { + if (ancilla_type[k] == 9 || ancilla_type[k] == 0x1f || ((j ^ frame_counter) & 3 | sprite_pause[j]) == 0) { + if ((sprite_state[j] >= 9 && (sprite_defl_bits[j] & 2 || !ancilla_objprio[k])) && ancilla_floor[k] == sprite_floor[j]) { + if (Ancilla_CheckSpriteCollision_Single(k, j)) + return j; + } + } + } + return -1; +} + +bool Ancilla_CheckSpriteCollision_Single(int k, int j) { // 888dae + int i; + SpriteHitBox hb; + Ancilla_SetupHitBox(k, &hb); + + Sprite_SetupHitBox(j, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + return false; + + bool return_value = true; + if (sprite_flags[j] & 8 && ancilla_type[k] == 9) { + if (sprite_type[j] != 0x1b) { + Sprite_CreateDeflectedArrow(k); + return false; + } + if (link_item_bow < 3) { + Sprite_CreateDeflectedArrow(k); + } else { + return_value = false; + } + } + + if (sprite_defl_bits[j] & 0x10) { + static const uint8 kAncilla_CheckSpriteColl_Dir[4] = {2, 3, 0, 1}; + ancilla_dir[k] &= 3; + if (ancilla_dir[k] == kAncilla_CheckSpriteColl_Dir[ancilla_dir[k]]) + goto return_true_set_alert; + } + + if (ancilla_type[k] == 5 || ancilla_type[k] == 0x1f) { + if (ancilla_type[k] == 0x1f && sprite_type[j] == 0x8d) + goto skip; + if (sprite_hit_timer[j]) + goto return_true_set_alert; + if (sprite_defl_bits[j] & 2) { +skip: + sprite_B[j] = k + 1; + sprite_unk2[j] = ancilla_type[k]; + goto return_true_set_alert; + } + } + + if (!sprite_ignore_projectile[j]) { + static const int8 kAncilla_CheckSpriteColl_RecoilX[4] = {0, 0, -64, 64}; + static const int8 kAncilla_CheckSpriteColl_RecoilY[4] = {-64, 64, 0, 0}; + if (sprite_type[j] == 0x92 && sprite_C[j] < 3) + goto return_true_set_alert; + i = ancilla_dir[k] & 3; + sprite_x_recoil[j] = kAncilla_CheckSpriteColl_RecoilX[i]; + sprite_y_recoil[j] = kAncilla_CheckSpriteColl_RecoilY[i]; + byte_7E0FB6 = k; + Ancilla_CheckDamageToSprite(j, ancilla_type[k]); +return_true_set_alert: + sprite_unk2[j] = ancilla_type[k]; + sprite_alert_flag = 3; + return return_value; + } + return false; +} + +void Ancilla_SetupHitBox(int k, SpriteHitBox *hb) { // 888ead + static const int8 kAncilla_HitBox_X[12] = {4, 4, 4, 4, 3, 3, 2, 11, -16, -16, -1, -8}; + static const int8 kAncilla_HitBox_Y[12] = {4, 4, 4, 4, 2, 11, 3, 3, -1, -8, -16, -16}; + static const uint8 kAncilla_HitBox_W[12] = {8, 8, 8, 8, 1, 1, 1, 1, 32, 32, 8, 8}; + static const uint8 kAncilla_HitBox_H[12] = {8, 8, 8, 8, 1, 1, 1, 1, 8, 8, 32, 32}; + int j = ancilla_dir[k]; + if (ancilla_type[k] == 0xc) + j |= 8; + int x = Ancilla_GetX(k) + kAncilla_HitBox_X[j]; + hb->r0_xlo = x; + hb->r8_xhi = x >> 8; + int y = Ancilla_GetY(k) + kAncilla_HitBox_Y[j]; + hb->r1_ylo = y; + hb->r9_yhi = y >> 8; + hb->r2 = kAncilla_HitBox_W[j]; + hb->r3 = kAncilla_HitBox_H[j]; +} + +ProjectSpeedRet Ancilla_ProjectSpeedTowardsPlayer(int k, uint8 vel) { // 888eed + if (vel == 0) { + ProjectSpeedRet rv = { 0, 0, 0, 0 }; + return rv; + } + PairU8 below = Ancilla_IsBelowLink(k); + uint8 r12 = sign8(below.b) ? -below.b : below.b; + + PairU8 right = Ancilla_IsRightOfLink(k); + uint8 r13 = sign8(right.b) ? -right.b : right.b; + uint8 t; + bool swapped = false; + if (r13 < r12) { + swapped = true; + t = r12, r12 = r13, r13 = t; + } + uint8 xvel = vel, yvel = 0; + t = 0; + do { + t += r12; + if (t >= r13) + t -= r13, yvel++; + } while (--vel); + if (swapped) + t = xvel, xvel = yvel, yvel = t; + ProjectSpeedRet rv = { + (uint8)(right.a ? -xvel : xvel), + (uint8)(below.a ? -yvel : yvel), + right.b, + below.b + }; + return rv; +} + +PairU8 Ancilla_IsRightOfLink(int k) { // 888f5c + uint16 x = link_x_coord - Ancilla_GetX(k); + PairU8 rv = { (uint8)(sign16(x) ? 1 : 0), (uint8)x }; + return rv; +} + +PairU8 Ancilla_IsBelowLink(int k) { // 888f6f + int y = link_y_coord - Ancilla_GetY(k); + PairU8 rv = { (uint8)(sign16(y) ? 1 : 0), (uint8)y }; + return rv; +} + +void Ancilla_WeaponTink() { // 888f89 + if (!repulsespark_timer) + return; + sprite_alert_flag = 2; + if (sign8(--repulsespark_anim_delay)) { + repulsespark_timer--; + repulsespark_anim_delay = 1; + } + + if (sort_sprites_setting) { + if (repulsespark_floor_status) + Oam_AllocateFromRegionF(0x10); + else + Oam_AllocateFromRegionD(0x10); + } else { + Oam_AllocateFromRegionA(0x10); + } + + uint8 x = repulsespark_x_lo - BG2HOFS_copy2; + uint8 y = repulsespark_y_lo - BG2VOFS_copy2; + + if (x >= 0xf8 || y >= 0xf0) { + repulsespark_timer = 0; + return; + } + + OamEnt *oam = GetOamCurPtr(); + + static const uint8 kRepulseSpark_Flags[4] = {0x22, 0x12, 0x22, 0x22}; + uint8 flags = kRepulseSpark_Flags[repulsespark_floor_status]; + if (repulsespark_timer >= 3) { + oam->x = x; + oam->y = y; + oam->charnum = (repulsespark_timer < 9) ? 0x92 : 0x80; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = 0; + return; + } + + oam[0].x = x - 4; + oam[2].x = x - 4; + oam[1].x = x + 4; + oam[3].x = x + 4; + + oam[0].y = y - 4; + oam[1].y = y - 4; + oam[2].y = y + 4; + oam[3].y = y + 4; + + oam[0].flags = flags; + oam[1].flags = flags | 0x40; + oam[2].flags = flags | 0x80; + oam[3].flags = flags | 0xc0; + + static const uint8 kRepulseSpark_Char[3] = {0x93, 0x82, 0x81}; + uint8 c = kRepulseSpark_Char[repulsespark_timer]; + oam[0].charnum = c; + oam[1].charnum = c; + oam[2].charnum = c; + oam[3].charnum = c; + + uint8 *ext = &bytewise_extended_oam[oam - oam_buf]; + ext[0] = ext[1] = ext[2] = ext[3] = 0; +} + +void Ancilla_MoveX(int k) { // 889080 + uint32 t = ancilla_x_subpixel[k] + (ancilla_x_lo[k] << 8) + (ancilla_x_hi[k] << 16) + ((int8)ancilla_x_vel[k] << 4); + ancilla_x_subpixel[k] = t, ancilla_x_lo[k] = t >> 8, ancilla_x_hi[k] = t >> 16; +} + +void Ancilla_MoveY(int k) { // 88908b + uint32 t = ancilla_y_subpixel[k] + (ancilla_y_lo[k] << 8) + (ancilla_y_hi[k] << 16) + ((int8)ancilla_y_vel[k] << 4); + ancilla_y_subpixel[k] = t, ancilla_y_lo[k] = t >> 8, ancilla_y_hi[k] = t >> 16; +} + +void Ancilla_MoveZ(int k) { // 8890b7 + uint32 t = ancilla_z_subpixel[k] + (ancilla_z[k] << 8) + ((int8)ancilla_z_vel[k] << 4); + ancilla_z_subpixel[k] = t, ancilla_z[k] = t >> 8; +} + +void Ancilla05_Boomerang(int k) { // 8890fc + int hit_spr; + static const int8 kBoomerang_X0[8] = {0, 0, -8, 8, 8, 8, -8, -8}; + static const int8 kBoomerang_Y0[8] = {-16, 6, 0, 0, -8, 8, -8, 8}; + + for (int j = 4; j >= 0; j--) { + if (ancilla_type[j] == 0x22) + goto exit_and_draw; + } + if (submodule_index) + goto exit_and_draw; + + if (!(frame_counter & 7)) + Ancilla_Sfx2_Pan(k, 0x9); + + if (!ancilla_aux_timer[k]) { + if (button_b_frames < 9 && !player_handler_timer) { + if (!link_is_bunny_mirror && !link_auxiliary_state) + goto exit_and_draw; + Boomerang_Terminate(k); + return; + } + int j = boomerang_arr1[k] >> 1; + Ancilla_SetXY(k, link_x_coord + kBoomerang_X0[j], link_y_coord + 8 + kBoomerang_Y0[j]); + ancilla_aux_timer[k]++; + } + // endif_2 + if (ancilla_G[k] && !(frame_counter & 1)) + AncillaAdd_SwordChargeSparkle(k); + + if (ancilla_item_to_link[k]) { + if (ancilla_K[k]) + ancilla_K[k]++; + WORD(ancilla_A[k]) = link_y_coord; + link_y_coord += 8; + ProjectSpeedRet pt = Ancilla_ProjectSpeedTowardsPlayer(k, ancilla_H[k]); + Boomerang_CheatWhenNoOnesLooking(k, &pt); + ancilla_x_vel[k] = pt.x; + ancilla_y_vel[k] = pt.y; + link_y_coord = WORD(ancilla_A[k]); + } + + if (ancilla_y_vel[k]) + ancilla_y_vel[k] += ancilla_K[k]; + Ancilla_MoveY(k); + + if (ancilla_x_vel[k]) + ancilla_x_vel[k] += ancilla_K[k]; + Ancilla_MoveX(k); + hit_spr = Ancilla_CheckSpriteCollision(k); + + if (!ancilla_item_to_link[k]) { + if (hit_spr >= 0) { + ancilla_item_to_link[k] ^= 1; + } else if (Ancilla_CheckTileCollision(k)) { + AncillaAdd_BoomerangWallClink(k); + Ancilla_Sfx2_Pan(k, (ancilla_tile_attr[k] == 0xf0) ? 6 : 5); + ancilla_item_to_link[k] ^= 1; + } else if (Boomerang_ScreenEdge(k) || --ancilla_step[k] == 0) { + ancilla_item_to_link[k] ^= 1; + } else { + if (ancilla_step[k] < 5) + ancilla_K[k]--; + } + } else { + uint8 bak0 = ancilla_objprio[k]; + uint8 bak1 = ancilla_floor[k]; + ancilla_floor[k] = 0; + Ancilla_CheckTileCollision(k); + ancilla_floor[k] = bak1; + ancilla_objprio[k] = bak0; + Boomerang_StopOffScreen(k); + } + +exit_and_draw: + Boomerang_Draw(k); +} + +bool Boomerang_ScreenEdge(int k) { // 88924b + uint16 x = Ancilla_GetX(k), y = Ancilla_GetY(k); + if (hookshot_effect_index & 3) { + uint16 t = x + (hookshot_effect_index & 1 ? 16 : 0) - BG2HOFS_copy2; + if (t >= 0x100) + return true; + } + if (hookshot_effect_index & 12) { + uint16 t = y + (hookshot_effect_index & 4 ? 16 : 0) - BG2VOFS_copy2; + if (t >= 0xe2) + return true; + } + return false; +} + +void Boomerang_StopOffScreen(int k) { // 8892ab + uint16 x = Ancilla_GetX(k) + 8, y = Ancilla_GetY(k) + 8; + if (x >= link_x_coord && x < (uint16)(link_x_coord + 16) && + y >= link_y_coord && y < (uint16)(link_y_coord + 24)) + Boomerang_Terminate(k); +} + +void Boomerang_Terminate(int k) { // 8892f5 + ancilla_type[k] = 0; + flag_for_boomerang_in_place = 0; + if (link_item_in_hand & 0x80) { + link_item_in_hand = 0; + button_mask_b_y &= ~0x40; + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction &= ~1; + } +} + +void Boomerang_Draw(int k) { // 889338 + static const uint8 kBoomerang_Flags[8] = {0xa4, 0xe4, 0x64, 0x24, 0xa2, 0xe2, 0x62, 0x22}; + static const int8 kBoomerang_Draw_XY[8] = {2, -2, 2, 2, -2, 2, -2, -2}; + static const uint16 kBoomerang_Draw_OamIdx[2] = {0x180, 0xd0}; + static const uint8 kBoomerang_Draw_Tab0[2] = {3, 2}; + Point16U info; + Ancilla_PrepOamCoord(k, &info); + + if (ancilla_item_to_link[k]) { + ancilla_floor[k] = link_is_on_lower_level; + oam_priority_value = kTagalongLayerBits[link_is_on_lower_level] << 8; + } + + if (ancilla_objprio[k]) + oam_priority_value = 0x3000; + + if (!submodule_index && ancilla_aux_timer[k] && sign8(--ancilla_arr3[k])) { + ancilla_arr3[k] = kBoomerang_Draw_Tab0[ancilla_G[k]]; + ancilla_arr1[k] = (ancilla_arr1[k] + (ancilla_S[k] ? -1 : 1)) & 3; + } + + int j = ancilla_arr1[k]; + uint16 x = info.x + kBoomerang_Draw_XY[j * 2 + 1]; + uint16 y = info.y + kBoomerang_Draw_XY[j * 2 + 0]; + if (!ancilla_aux_timer[k]) { + int i = kBoomerang_Draw_OamIdx[sort_sprites_setting]; + oam_ext_cur_ptr = (i >> 2) + 0xa20; + oam_cur_ptr = i + 0x800; + } + OamEnt *oam = GetOamCurPtr(); + uint8 ext = Ancilla_SetOam_XY_safe(oam, x, y); + oam->charnum = 0x26; + oam->flags = kBoomerang_Flags[ancilla_G[k] * 4 + j] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 2 | ext; + +} + +void Ancilla06_WallHit(int k) { // 8893e8 + if (sign8(--ancilla_arr3[k])) { + uint8 t = ancilla_item_to_link[k] + 1; + if (t == 5) { + ancilla_type[k] = 0; + return; + } + ancilla_item_to_link[k] = t; + ancilla_arr3[k] = 1; + } + WallHit_Draw(k); +} + +void Ancilla_SwordWallHit(int k) { // 8893ff + sprite_alert_flag = 3; + if (sign8(--ancilla_aux_timer[k])) { + uint8 t = ancilla_item_to_link[k] + 1; + if (t == 8) { + ancilla_type[k] = 0; + return; + } + ancilla_item_to_link[k] = t; + ancilla_aux_timer[k] = 1; + } + WallHit_Draw(k); +} + +void WallHit_Draw(int k) { // 8894df + static const int8 kWallHit_X[32] = { + -4, 0, 0, 0, -4, 0, 0, 0, -8, 0, -8, 0, -8, 0, -8, 0, + -8, 0, -8, 0, -4, 0, 0, 0, -4, 0, 0, 0, -8, 0, 0, 0, + }; + static const int8 kWallHit_Y[32] = { + -4, 0, 0, 0, -4, 0, 0, 0, -8, -8, 0, 0, -8, -8, 0, 0, + -8, -8, 0, 0, -4, 0, 0, 0, -4, 0, 0, 0, -8, 0, 0, 0, + }; + static const uint8 kWallHit_Char[32] = { + 0x80, 0, 0, 0, 0x92, 0, 0, 0, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, + 0x93, 0x93, 0x93, 0x93, 0x92, 0, 0, 0, 0xb9, 0, 0, 0, 0x90, 0x90, 0, 0, + }; + static const uint8 kWallHit_Flags[32] = { + 0x32, 0, 0, 0, 0x32, 0, 0, 0, 0x32, 0x72, 0xb2, 0xf2, 0x32, 0x72, 0xb2, 0xf2, + 0x32, 0x72, 0xb2, 0xf2, 0x32, 0, 0, 0, 0x72, 0, 0, 0, 0x32, 0xf2, 0, 0, + }; + Point16U info; + Ancilla_PrepOamCoord(k, &info); + + int t = ancilla_item_to_link[k] * 4; + + OamEnt *oam = GetOamCurPtr(); + for (int n = 3; n >= 0; n--, t++) { + if (kWallHit_Char[t] != 0) { + Ancilla_SetOam_XY(oam, info.x + kWallHit_X[t], info.y + kWallHit_Y[t]); + oam->charnum = kWallHit_Char[t]; + oam->flags = kWallHit_Flags[t] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + oam = Ancilla_AllocateOamFromCustomRegion(oam); + } + +} + +void Ancilla07_Bomb(int k) { // 88955a + if (submodule_index) { + if (submodule_index == 8 || submodule_index == 16) { + Ancilla_HandleLiftLogic(k); + } else if (k + 1 == flag_is_ancilla_to_pick_up && ancilla_K[k] != 0) { + if (ancilla_K[k] != 3) { + Ancilla_LatchLinkCoordinates(k, 3); + Ancilla_LatchAltitudeAboveLink(k); + ancilla_K[k] = 3; + } + Ancilla_LatchCarriedPosition(k); + } + Bomb_Draw(k); + return; + } + Ancilla_HandleLiftLogic(k); + + uint16 old_y = Ancilla_LatchYCoordToZ(k); + uint8 s1a = ancilla_dir[k]; + uint8 s1b = ancilla_objprio[k]; + ancilla_objprio[k] = 0; + bool flag = Ancilla_CheckTileCollision_Class2(k); + + if (player_is_indoors && ancilla_L[k] && ancilla_tile_attr[k] == 0x1c) + ancilla_T[k] = 1; + +label1: + if (flag && (!(link_state_bits & 0x80) || link_picking_throw_state)) { + if (!s1b && !ancilla_arr4[k]) { + ancilla_arr4[k] = 1; + int qq = (ancilla_dir[k] == 1) ? 16 : 4; + if (ancilla_y_vel[k]) + ancilla_y_vel[k] = sign8(ancilla_y_vel[k]) ? qq : -qq; + if (ancilla_x_vel[k]) + ancilla_x_vel[k] = sign8(ancilla_x_vel[k]) ? 4 : -4; + if (ancilla_dir[k] == 1 && ancilla_z[k]) { + ancilla_y_vel[k] = -4; + ancilla_L[k] = 2; + } + } + } else if (!((k + 1 == flag_is_ancilla_to_pick_up) && (link_state_bits & 0x80)) && (ancilla_z[k] == 0 || ancilla_z[k] == 0xff)) { + ancilla_dir[k] = 16; + uint8 bak0 = ancilla_objprio[k]; + Ancilla_CheckTileCollision(k); + ancilla_objprio[k] = bak0; + uint8 a = ancilla_tile_attr[k]; + if (a == 0x26) { + flag = true; + goto label1; + } else if (a == 0xc || a == 0x1c) { + if (dung_hdr_collision != 3) { + if (ancilla_floor[k] == 0 && ancilla_z[k] != 0 && ancilla_z[k] != 0xff) + ancilla_floor[k] = 1; + } else { + old_y = Ancilla_GetY(k) + dung_floor_y_vel; + Ancilla_SetX(k, Ancilla_GetX(k) + dung_floor_x_vel); + } + } else if (a == 0x20 || (a & 0xf0) == 0xb0 && a != 0xb6 && a != 0xbc) { + if (!(link_state_bits & 0x80)) { + if (k + 1 == flag_is_ancilla_to_pick_up) + flag_is_ancilla_to_pick_up = 0; + if (!ancilla_timer[k]) { + ancilla_type[k] = 0; + return; + } + } + } else if (a == 8) { + if (k + 1 == flag_is_ancilla_to_pick_up) + flag_is_ancilla_to_pick_up = 0; + if (ancilla_timer[k] == 0) { + Ancilla_SetY(k, Ancilla_GetY(k) - 24); + Ancilla_TransmuteToSplash(k); + return; + } + } else if (a == 0x68 || a == 0x69 || a == 0x6a || a == 0x6b) { + Ancilla_ApplyConveyor(k); + old_y = Ancilla_GetY(k); + } else { + ancilla_timer[k] = ancilla_L[k] ? 0 : 2; + } + } + // endif_3 + + Ancilla_SetY(k, old_y); + ancilla_dir[k] = s1a; + ancilla_objprio[k] |= s1b; + Bomb_CheckSpriteAndPlayerDamage(k); + if (!--ancilla_arr3[k]) { + if (++ancilla_item_to_link[k] == 1) { + Ancilla_Sfx2_Pan(k, 0xc); + if (k + 1 == flag_is_ancilla_to_pick_up) { + flag_is_ancilla_to_pick_up = 0; + if (link_state_bits & 0x80) { + link_state_bits = 0; + link_cant_change_direction = 0; + } + } + } + + if (ancilla_item_to_link[k] == 11) { + ancilla_type[k] = ancilla_step[k] ? 8 : 0; + return; + } + ancilla_arr3[k] = kBomb_Tab0[ancilla_item_to_link[k]]; + } + + if (ancilla_item_to_link[k] == 7 && ancilla_arr3[k] == 2) { + uint16 x = Ancilla_GetX(k), y = Ancilla_GetY(k); + door_debris_x[k] = 0; + Bomb_CheckForDestructibles(x, y, k); + if (door_debris_x[k]) + ancilla_step[k] = 1; + } + Bomb_Draw(k); +} + +void Ancilla_ApplyConveyor(int k) { // 8897be + static const int8 kAncilla_Belt_Xvel[4] = {0, 0, -8, 8}; + static const int8 kAncilla_Belt_Yvel[4] = {-8, 8, 0, 0}; + int j = ancilla_tile_attr[k] - 0x68; + ancilla_y_vel[k] = kAncilla_Belt_Yvel[j]; + ancilla_x_vel[k] = kAncilla_Belt_Xvel[j]; + Ancilla_MoveY(k); + Ancilla_MoveX(k); +} + +void Bomb_CheckSpriteAndPlayerDamage(int k) { // 889815 + static const uint8 kBomb_Dmg_Speed[16] = {32, 32, 32, 32, 32, 32, 28, 28, 28, 28, 28, 28, 24, 24, 24, 24}; + static const uint8 kBomb_Dmg_Zvel[16] = {16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8}; + static const uint8 kBomb_Dmg_Delay[16] = {32, 32, 32, 32, 32, 32, 24, 24, 24, 24, 24, 24, 16, 16, 16, 16}; + static const uint8 kBomb_Dmg_ToLink[3] = {8, 4, 2}; + + if (ancilla_item_to_link[k] == 0 || ancilla_item_to_link[k] >= 9) + return; + Bomb_CheckSpriteDamage(k); + if (link_disable_sprite_damage) { + if (k + 1 == flag_is_ancilla_to_pick_up && link_state_bits & 0x80) { + link_state_bits &= ~0x80; + link_cant_change_direction = 0; + } + return; + } + + if (link_auxiliary_state || link_incapacitated_timer || ancilla_floor[k] != link_is_on_lower_level) + return; + + SpriteHitBox hb; + hb.r0_xlo = link_x_coord; + hb.r8_xhi = link_x_coord >> 8; + hb.r1_ylo = link_y_coord; + hb.r9_yhi = link_y_coord >> 8; + hb.r2 = 0x10; + hb.r3 = 0x18; + + int ax = Ancilla_GetX(k) - 16, ay = Ancilla_GetY(k) - 16; + hb.r6_spr_xsize = 32; + hb.r7_spr_ysize = 32; + hb.r4_spr_xlo = ax; + hb.r10_spr_xhi = ax >> 8; + hb.r5_spr_ylo = ay; + hb.r11_spr_yhi = ay >> 8; + + if (!CheckIfHitBoxesOverlap(&hb)) + return; + + int x = Ancilla_GetX(k) - 8, y = Ancilla_GetY(k) - 12; + + int j = Bomb_GetDisplacementFromLink(k); + ProjectSpeedRet pt = Bomb_ProjectSpeedTowardsPlayer(k, x, y, kBomb_Dmg_Speed[j]); + if (countdown_for_blink || flag_block_link_menu == 2) + return; + link_actual_vel_x = pt.x; + link_actual_vel_y = pt.y; + + link_actual_vel_z_copy = link_actual_vel_z = kBomb_Dmg_Zvel[j]; + link_incapacitated_timer = kBomb_Dmg_Delay[j]; + link_auxiliary_state = 1; + countdown_for_blink = 58; + if (!(dung_savegame_state_bits & 0x8000)) + link_give_damage = kBomb_Dmg_ToLink[link_armor]; + +} + +void Ancilla_HandleLiftLogic(int k) { // 889976 + static const uint8 kAncilla_Liftable_Delay[3] = {16, 8, 9}; + + if (ancilla_R[k]) { +label_6: + if (ancilla_item_to_link[k]) + return; + if (ancilla_K[k] == 3) { + ancilla_z_vel[k] -= 2; + Ancilla_MoveZ(k); + if (ancilla_z[k] && ancilla_z[k] < 252) + return; + ancilla_z[k] = 0; + if (++ancilla_R[k] != 3) { + ancilla_z_vel[k] = 24; + return; + } + ancilla_K[k] = 0; + } + ancilla_R[k] = 0; + link_speed_setting = 0; + return; + } + if (!ancilla_L[k]) { + if (!flag_is_ancilla_to_pick_up) { +clear_pickup_item: + flag_is_ancilla_to_pick_up = 0; + CheckPlayerCollOut coll; + if (ancilla_item_to_link[k] || link_state_bits || !Ancilla_CheckLinkCollision(k, 0, &coll) || ancilla_floor[k] != link_is_on_lower_level) + return; + if (coll.r8 >= 16 || coll.r10 >= 12) { + int j = (coll.r8 >= coll.r10) ? (sign8(coll.r4) ? 1 : 0) : (sign8(coll.r6) ? 3 : 2); + if (j * 2 != link_direction_facing) + return; + } + flag_is_ancilla_to_pick_up = k + 1; + ancilla_K[k] = 0; + ancilla_aux_timer[k] = kAncilla_Liftable_Delay[0]; + ancilla_L[k] = 0; + ancilla_z[k] = 0; + return; + } + + if (flag_is_ancilla_to_pick_up != k + 1) + return; + if (!link_disable_sprite_damage && link_incapacitated_timer || byte_7E03FD || link_auxiliary_state == 1) { + ancilla_R[k] = 1; + ancilla_z_vel[k] = 0; + flag_is_ancilla_to_pick_up = 0; + ancilla_arr4[k] = 0; + goto label_6; + } + if (!(link_state_bits & 0x80)) + goto clear_pickup_item; + int j = ancilla_K[k]; + if (link_picking_throw_state != 2 && flag_is_ancilla_to_pick_up != 0 && j != 3) { + if (j == 0 && ancilla_aux_timer[k] == 16) + Ancilla_Sfx2_Pan(k, 0x1d); + if (sign8(--ancilla_aux_timer[k])) { + ancilla_K[k] = ++j; + ancilla_aux_timer[k] = j == 3 ? -2 : kAncilla_Liftable_Delay[j]; + if (j == 3) { + Ancilla_LatchAltitudeAboveLink(k); + return; + } + } + Ancilla_LatchLinkCoordinates(k, j); + return; + } + if (j != 3) + return; + + if (link_picking_throw_state != 2 && (submodule_index != 0 || !((filtered_joypad_L | filtered_joypad_H) & 0x80))) { + if (ancilla_item_to_link[k]) + return; + if (player_near_pit_state >= 2) { + link_speed_setting = 0; + if (k + 1 == flag_is_ancilla_to_pick_up) { + flag_is_ancilla_to_pick_up = 0; + ancilla_type[k] = 0; + } + return; + } + if (!(link_is_in_deep_water | link_is_bunny_mirror)) { + Ancilla_LatchCarriedPosition(k); + return; + } + link_state_bits = 0; + } + static const int8 kAncilla_Liftable_Yvel[4] = {-32, 32, 0, 0}; + static const int8 kAncilla_Liftable_Xvel[4] = {0, 0, -32, 32}; + j = link_direction_facing >> 1; + ancilla_dir[k] = j; + ancilla_z_vel[k] = 24; + ancilla_y_vel[k] = kAncilla_Liftable_Yvel[j]; + ancilla_x_vel[k] = kAncilla_Liftable_Xvel[j]; + link_picking_throw_state = 2; + ancilla_L[k] = 1; + flag_is_ancilla_to_pick_up = 0; + ancilla_arr4[k] = 0; + ancilla_K[k] = 0; + ancilla_objprio[k] = 0; + Ancilla_Sfx3_Pan(k, 0x13); + } + // endif_1 + if (!ancilla_item_to_link[k]) { + ancilla_z_vel[k] -= 2; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + uint8 old_z = ancilla_z[k]; + Ancilla_MoveZ(k); + if (ancilla_arr4[k] && ancilla_dir[k] == 1 && !sign8(ancilla_z[k])) + Ancilla_SetY(k, Ancilla_GetY(k) + (int8)(ancilla_z[k] - old_z)); + if (!sign8(ancilla_z[k]) || ancilla_z[k] == 0xff) + return; + ancilla_z[k] = 0; + Ancilla_Sfx2_Pan(k, 0x21); + if (++ancilla_L[k] != 3) { + ancilla_y_vel[k] = (int8)ancilla_y_vel[k] / 2; + ancilla_x_vel[k] = (int8)ancilla_x_vel[k] / 2; + ancilla_z_vel[k] = 16; + ancilla_arr4[k] = 0; + } else { + ancilla_z[k] = 0; + ancilla_L[k] = 0; + ancilla_arr4[k] = 0; + link_speed_setting = 0; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_z_vel[k] = 0; + if (ancilla_T[k]) { + ancilla_floor[k] = ancilla_T[k]; + ancilla_T[k] = 0; + } + } + } +} + +void Ancilla_LatchAltitudeAboveLink(int k) { // 889a4f + ancilla_z[k] = 17; + Ancilla_SetY(k, Ancilla_GetY(k) + 17); + ancilla_objprio[k] = 0; +} + +void Ancilla_LatchLinkCoordinates(int k, int j) { // 889a6a + static const int8 kAncilla_Func3_X[12] = {8, 8, -4, 20, 8, 8, 8, 8, 8, 8, 8, 8}; + static const int8 kAncilla_Func3_Y[12] = {16, 8, 4, 4, 8, 2, -1, -1, 2, 2, -1, -1}; + j = j * 4 + (link_direction_facing >> 1); + Ancilla_SetXY(k, + link_x_coord + kAncilla_Func3_X[j], + link_y_coord + kAncilla_Func3_Y[j]); +} + +void Ancilla_LatchCarriedPosition(int k) { // 889bef + static const int8 kAncilla_Func2_Y[6] = {-2, -1, 0, -2, -1, 0}; + link_speed_setting = 12; + ancilla_floor[k] = link_is_on_lower_level; + ancilla_floor2[k] = link_is_on_lower_level_mirror; + uint16 z = link_z_coord; + if (z == 0xffff) + z = 0; + Ancilla_SetXY(k, + link_x_coord + 8, + link_y_coord - z + 18 + kAncilla_Func2_Y[link_animation_steps]); +} + +uint16 Ancilla_LatchYCoordToZ(int k) { // 889c7f + uint16 y = Ancilla_GetY(k); + int8 z = ancilla_z[k]; + if (ancilla_dir[k] == 1 && z != -1) + Ancilla_SetY(k, y - z); + return y; +} + +int Bomb_GetDisplacementFromLink(int k) { // 889cce + int x = Ancilla_GetX(k), y = Ancilla_GetY(k); + return ((abs16(link_x_coord + 8 - x) + abs16(link_y_coord + 12 - y)) & 0xfc) >> 2; +} + +void Bomb_Draw(int k) { // 889e9e + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + + int z = (int8)ancilla_z[k]; + if (z != 0 && z != -1 && ancilla_K[k] != 3 && ancilla_objprio[k]) + oam_priority_value = 0x3000; + pt.y -= z; + int j = kBomb_Draw_Tab0[ancilla_item_to_link[k]] * 6; + + uint8 r11 = 2; + if (ancilla_item_to_link[k] == 0) { + r11 = (ancilla_arr3[k] < 0x20) ? ancilla_arr3[k] & 0xe : 4; + } + + if (ancilla_item_to_link[k] == 0) { + if (ancilla_L[k] == 0 && (sprite_type[0] == 0x92 || k + 1 == flag_is_ancilla_to_pick_up ) && (!(link_state_bits & 0x80) || ancilla_K[k] != 3 && link_direction_facing == 0)) { + Ancilla_AllocateOamFromRegion_B_or_E(12); + } else if (sort_sprites_setting && ancilla_floor[k] && (ancilla_L[k] || k + 1 == flag_is_ancilla_to_pick_up && (link_state_bits & 0x80))) { + oam_cur_ptr = 0x800 + 0x34 * 4; + oam_ext_cur_ptr = 0xa20 + 0x34; + } + } + + OamEnt *oam = GetOamCurPtr(), *oam_org = oam; + uint8 numframes = kBomb_Draw_Tab2[ancilla_item_to_link[k]]; + + oam += (ancilla_item_to_link[k] == 0 && (ancilla_tile_attr[k] == 9 || ancilla_tile_attr[k] == 0x40)) ? 2 : 0; + + AncillaDraw_Explosion(oam, j, 0, numframes, r11, pt.x, pt.y); + oam += numframes; + + uint8 r10; + if (!Bomb_CheckUndersideSpriteStatus(k, &pt, &r10)) { + if (oam != oam_org + 1) + oam = oam_org; + AncillaDraw_Shadow(oam, r10, pt.x, pt.y, HIBYTE(oam_priority_value)); + } +} + +void Ancilla08_DoorDebris(int k) { // 889fb6 + DoorDebris_Draw(k); + if (sign8(--ancilla_arr26[k])) { + ancilla_arr26[k] = 7; + if (++ancilla_arr25[k] == 4) + ancilla_type[k] = 0; + } +} + +void DoorDebris_Draw(int k) { // 88a091 + static const uint16 kDoorDebris_XY[64] = { + 4, 7, 3, 17, 8, 8, 7, 17, 11, 7, 10, 16, 16, 7, 17, 17, + 20, 7, 21, 17, 16, 8, 17, 17, 13, 7, 14, 16, 8, 7, 7, 17, + 7, 4, 17, 3, 8, 8, 17, 7, 7, 11, 16, 10, 7, 16, 17, 17, + 7, 20, 17, 21, 8, 16, 17, 17, 7, 13, 16, 14, 7, 8, 17, 7, + }; + static const uint16 kDoorDebris_CharFlags[32] = { + 0x205e, 0xe05e, 0xa05e, 0x605e, 0x204f, 0x204f, 0x204f, 0x204f, 0x605e, 0x605e, 0x205e, 0xe05e, 0x604f, 0x604f, 0x604f, 0x604f, + 0x205e, 0xe05e, 0xa05e, 0x605e, 0x204f, 0xe04f, 0x204f, 0x204f, 0x605e, 0x605e, 0x205e, 0xe05e, 0x604f, 0x604f, 0x604f, 0x604f, + }; + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + int y = door_debris_y[k] - BG2VOFS_copy2; + int x = door_debris_x[k] - BG2HOFS_copy2; + int j = ancilla_arr25[k] + door_debris_direction[k] * 4; + + for (int i = 0; i != 2; i++) { + int t = j * 2 + i; + //kDoorDebris_XY + Ancilla_SetOam_XY(oam, x + kDoorDebris_XY[t * 2 + 1], y + kDoorDebris_XY[t * 2 + 0]); + + uint16 d = kDoorDebris_CharFlags[t]; + oam->charnum = d; + oam->flags = (d >> 8) & 0xc0 | HIBYTE(oam_priority_value); + + bytewise_extended_oam[oam - oam_buf] = 0; + oam = Ancilla_AllocateOamFromCustomRegion(oam + 1); + } +} + +void Ancilla09_Arrow(int k) { // 88a131 + static const int8 kArrow_Y[4] = {-4, 2, 0, 0}; + static const int8 kArrow_X[4] = {0, 0, -4, 4}; + int j; + + if (submodule_index != 0) { + Arrow_Draw(k); + return; + } + + if (!sign8(--ancilla_item_to_link[k])) { + if (ancilla_item_to_link[k] >= 4) + return; + } else { + ancilla_item_to_link[k] = 0xff; + } + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (link_item_bow & 4 && !(frame_counter & 1)) + AncillaAdd_SilverArrowSparkle(k); + ancilla_S[k] = 255; + if ((j = Ancilla_CheckSpriteCollision(k)) >= 0) { + ancilla_x_vel[k] = ancilla_x_lo[k] - sprite_x_lo[j]; + ancilla_y_vel[k] = ancilla_y_lo[k] - sprite_y_lo[j] + sprite_z[j]; + ancilla_S[k] = j; + if (sprite_type[j] == 0x65) { + if (sprite_A[j] == 1) { + sound_effect_2 = 0x2d; + sprite_delay_aux2[j] = 0x80; + sprite_delay_aux4[0] = 128; + if (byte_7E0B88 < 9) + byte_7E0B88++; + sprite_B[j] = byte_7E0B88; + sprite_G[j] += 1; + } else { + sprite_delay_aux3[j] = 4; + byte_7E0B88 = 0; + } + } else { + byte_7E0B88 = 0; + } + } else if ((j = Ancilla_CheckTileCollision(k)) != 0) { + ancilla_H[k] = j >> 1; + j = ancilla_dir[k] & 3; + Ancilla_SetX(k, Ancilla_GetX(k) + kArrow_X[j]); + Ancilla_SetY(k, Ancilla_GetY(k) + kArrow_Y[j]); + byte_7E0B88 = 0; + } else { + Arrow_Draw(k); + return; + } + if (sprite_type[j] != 0x1b) + Ancilla_Sfx2_Pan(k, 8); + ancilla_item_to_link[k] = 0; + ancilla_type[k] = 10; + ancilla_aux_timer[k] = 1; + if (ancilla_H[k]) { + ancilla_x_lo[k] += BG1HOFS_copy2 - BG2HOFS_copy2; + ancilla_y_lo[k] += BG1VOFS_copy2 - BG2VOFS_copy2; + } + Arrow_Draw(k); +} + +void Arrow_Draw(int k) { // 88a36e + static const uint8 kArrow_Draw_Char[48] = { + 0x2b, 0x2a, 0x2a, 0x2b, 0x3d, 0x3a, 0x3a, 0x3d, 0x2b, 0xff, 0x2b, 0xff, 0x3d, 0xff, 0x3d, 0xff, + 0x3c, 0x2c, 0x3c, 0x2a, 0x3c, 0x2c, 0x3c, 0x2a, 0x2c, 0x3c, 0x2a, 0x3c, 0x2c, 0x3c, 0x2a, 0x3c, + 0x3b, 0x2d, 0x3b, 0x3a, 0x3b, 0x2d, 0x3b, 0x3a, 0x2d, 0x3b, 0x3a, 0x3b, 0x2d, 0x3b, 0x3a, 0x3b, + }; + static const uint8 kArrow_Draw_Flags[48] = { + 0xa4, 0xa4, 0x24, 0x24, 0x64, 0x64, 0x24, 0x24, 0xa4, 0xff, 0x24, 0xff, 0x64, 0xff, 0x24, 0xff, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xe4, 0xa4, 0xa4, 0x24, 0x24, 0x24, 0x24, 0x64, 0x24, 0x24, 0x24, + 0x64, 0x64, 0x64, 0xe4, 0x64, 0xe4, 0x64, 0xe4, 0x24, 0x24, 0x24, 0xa4, 0xa4, 0x24, 0x24, 0xa4, + }; + static const int8 kArrow_Draw_Y[48] = { + 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, + -1, -1, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 0, 0, + }; + static const int8 kArrow_Draw_X[48] = { + 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, -1, -2, 0, 0, 1, 1, 0, 0, -2, -1, 0, 0, + 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, + }; + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + if (ancilla_objprio[k]) + HIBYTE(oam_priority_value) = 0x30; + uint16 x = pt.x, y = pt.y; + if (ancilla_H[k] != 0) { + x += BG2VOFS_copy2 - BG1VOFS_copy2; + y += BG2HOFS_copy2 - BG1HOFS_copy2; + } + uint8 r7 = ancilla_item_to_link[k]; + int j = ancilla_dir[k] & ~4; + if (ancilla_type[k] == 0xa) { + j = j * 4 + 8 + ((r7 & 8) ? 1 : (r7 & 3)); + } else if (!sign8(r7)) { + j |= 4; + } + + j *= 2; + + OamEnt *oam = GetOamCurPtr(), *oam_org = oam; + uint8 flags = (link_item_bow & 4) ? 2 : 4; + for (int i = 0; i != 2; i++, j++) { + if (kArrow_Draw_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, x + kArrow_Draw_X[j], y + kArrow_Draw_Y[j]); + oam->charnum = kArrow_Draw_Char[j]; + oam->flags = kArrow_Draw_Flags[j] & ~0x3E | flags | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } + + if (oam_org[0].y == 0xf0 && oam_org[1].y == 0xf0) + ancilla_type[k] = 0; +} + +void Ancilla0A_ArrowInTheWall(int k) { // 88a45b + int j = ancilla_S[k]; + if (!sign8(j)) { + if (sprite_state[j] < 9 || sign8(sprite_z[j]) || sprite_ignore_projectile[j] || sprite_defl_bits[j] & 2) { + ancilla_type[k] = 0; + return; + } + Ancilla_SetX(k, Sprite_GetX(j) + (int8)ancilla_x_vel[k]); + Ancilla_SetY(k, Sprite_GetY(j) + (int8)ancilla_y_vel[k] - sprite_z[j]); + } + if (submodule_index == 0 && --ancilla_aux_timer[k] == 0) { + ancilla_aux_timer[k] = 2; + if (++ancilla_item_to_link[k] == 9) { + ancilla_type[k] = 0; + return; + } else if (ancilla_item_to_link[k] & 8) { + ancilla_aux_timer[k] = 0x80; + } + } + Arrow_Draw(k); +} + +void Ancilla0B_IceRodShot(int k) { // 88a4dd + if (submodule_index == 0) { + if (sign8(--ancilla_aux_timer[k])) { + if (++ancilla_item_to_link[k] & ~1) { + ancilla_step[k] = 1; + ancilla_item_to_link[k] = ancilla_item_to_link[k] & 7 | 4; + } + ancilla_aux_timer[k] = 3; + } + if (ancilla_step[k]) { + AncillaOamInfo info; + if (Ancilla_ReturnIfOutsideBounds(k, &info)) + return; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (Ancilla_CheckSpriteCollision(k) >= 0 || Ancilla_CheckTileCollision(k)) { + ancilla_type[k] = 0x11; + ancilla_numspr[k] = kAncilla_Pflags[0x11]; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 4; + } + } + } + AncillaAdd_IceRodSparkle(k); +} + +void Ancilla11_IceRodWallHit(int k) { // 88a536 + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 7; + if (++ancilla_item_to_link[k] == 2) { + ancilla_type[k] = 0; + return; + } + } + IceShotSpread_Draw(k); +} + +void IceShotSpread_Draw(int k) { // 88a571 + static const uint8 kIceShotSpread_CharFlags[16] = {0xcf, 0x24, 0xcf, 0x24, 0xcf, 0x24, 0xcf, 0x24, 0xdf, 0x24, 0xdf, 0x24, 0xdf, 0x24, 0xdf, 0x24}; + static const uint8 kIceShotSpread_XY[16] = {0, 0, 0, 8, 8, 0, 8, 8, 0xf8, 0xf8, 0xf8, 0x10, 0x10, 0xf8, 0x10, 0x10}; + + Point16U info; + Ancilla_PrepOamCoord(k, &info); + + Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, ancilla_numspr[k]); + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_item_to_link[k] * 4; + for (int i = 0; i != 4; i++, j++) { + uint16 y = info.y + (int8)kIceShotSpread_XY[j * 2 + 0]; + uint16 x = info.x + (int8)kIceShotSpread_XY[j * 2 + 1]; + uint8 yv = 0xf0; + if (x < 256 && y < 256) { + oam->x = x; + if (y < 224) + yv = y; + } + oam->y = yv; + oam->charnum = kIceShotSpread_CharFlags[j * 2 + 0]; + oam->flags = kIceShotSpread_CharFlags[j * 2 + 1] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam = Ancilla_AllocateOamFromCustomRegion(oam + 1); + } + oam = GetOamCurPtr(); + if (oam[0].y == 0xf0 && oam[1].y == 0xf0) + ancilla_type[k] = 0; +} + +void Ancilla33_BlastWallExplosion(int k) { // 88a60e + if (submodule_index == 0) { + if (blastwall_var5[k]) { + if (--blastwall_var6[k] == 0) { + if (++blastwall_var5[k] != 0 && blastwall_var5[k] < 9) { + AncillaAdd_BlastWallFireball(0x32, 10, k * 4); + } + if (blastwall_var5[k] == 11) { + blastwall_var5[k] = 0; + blastwall_var6[k] = 0; + } else { + blastwall_var6[k] = 3; + } + } + } else if ((k ^= 1), blastwall_var5[k] == 6 && blastwall_var6[k] == 2 && (uint8)(ancilla_item_to_link[0] + 1) < 7) { + ancilla_item_to_link[0]++; + blastwall_var5[k] = 1; + blastwall_var6[k] = 3; + for (int i = 3; i >= 0; i--) { + int8 arr[2] = { 0, 0 }; + int j = blastwall_var7 < 4 ? 1 : 0; + arr[j] = (i & 2) ? -13 : 13; + j = k * 4 + i; + blastwall_var10[j] += arr[0]; + blastwall_var11[j] += arr[1]; + uint16 x = blastwall_var11[j] - BG2HOFS_copy2; + if (x < 256) + sound_effect_1 = kBombos_Sfx[x >> 5] | 0xc; + } + } + } + + if (blastwall_var5[ancilla_K[0]]) { + int i = (ancilla_K[0] == 1) ? 7 : 3; + do { + AncillaDraw_BlastWallBlast(ancilla_K[0], blastwall_var11[i], blastwall_var10[i]); + } while ((--i & 3) != 3); + } + if (ancilla_item_to_link[0] == 6) { + if (blastwall_var5[0] == 0 && blastwall_var5[1] == 0) { + ancilla_type[0] = 0; + ancilla_type[1] = 0; + flag_custom_spell_anim_active = 0; + } + } +} + +void AncillaDraw_BlastWallBlast(int k, int x, int y) { // 88a756 + oam_priority_value = 0x3000; + if (sort_sprites_setting) + Oam_AllocateFromRegionD(0x18); + else + Oam_AllocateFromRegionA(0x18); + OamEnt *oam = GetOamCurPtr(); + int i = blastwall_var5[k]; + AncillaDraw_Explosion(oam, kBomb_Draw_Tab0[i] * 6, 0, kBomb_Draw_Tab2[i], 0x32, + x - BG2HOFS_copy2, y - BG2VOFS_copy2); +} + +OamEnt *AncillaDraw_Explosion(OamEnt *oam, int frame, int idx, int idx_end, uint8 r11, int x, int y) { // 88a7ab + static const int8 kBomb_DrawExplosion_XY[108] = { + -8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, -8, 0, + 0, -8, 0, 0, 0, 0, 0, 0, -16, -16, -16, 0, 0, -16, 0, 0, + 0, 0, 0, 0, -16, -16, -16, 0, 0, -16, 0, 0, 0, 0, 0, 0, + -8, -8, -21, -22, -21, 8, 9, -22, 9, 8, 0, 0, -6, -15, 0, -1, + -16, -2, -8, -7, 0, 0, 0, 0, -9, -4, -21, -5, -12, -18, -11, 7, + 0, -15, 4, -2, -9, -4, -22, -5, -13, -20, -11, 8, 1, -16, 5, -2, + -20, 4, -12, -19, -9, 16, -5, -2, 2, -9, 10, 6, + }; + static const uint8 kBomb_DrawExplosion_CharFlags[108] = { + 0x6e, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0x22, 0x8c, 0x62, + 0x8c, 0xa2, 0x8c, 0xe2, 0xff, 0xff, 0xff, 0xff, 0x84, 0x22, 0x84, 0x62, 0x84, 0xa2, 0x84, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0x88, 0x22, 0x88, 0x62, 0x88, 0xa2, 0x88, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0x86, 0x22, 0x88, 0x22, 0x88, 0x62, 0x88, 0xa2, 0x88, 0xe2, 0xff, 0xff, 0x86, 0x22, 0x86, 0x62, + 0x86, 0xe2, 0x86, 0xe2, 0xff, 0xff, 0xff, 0xff, 0x86, 0xe2, 0x86, 0x22, 0x86, 0x22, 0x86, 0x62, + 0x86, 0xa2, 0x86, 0xa2, 0x8a, 0xa2, 0x8a, 0x62, 0x8a, 0x22, 0x8a, 0x62, 0x8a, 0x62, 0x8a, 0xe2, + 0x9b, 0x22, 0x9b, 0xa2, 0x9b, 0x62, 0x9b, 0xe2, 0x9b, 0xa2, 0x9b, 0x22, + }; + static const uint8 kBomb_DrawExplosion_Ext[54] = { + 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, + 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, + 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 0, 0, 0, + }; + int base_frame = frame; + do { + if (kBomb_DrawExplosion_CharFlags[frame * 2] != 0xff) { + int i = idx + base_frame; + uint16 xt = x + kBomb_DrawExplosion_XY[i * 2 + 1]; + uint8 ext = Ancilla_SetOam_XY_safe(oam, xt, y + kBomb_DrawExplosion_XY[i * 2 + 0]); + oam->charnum = kBomb_DrawExplosion_CharFlags[frame * 2]; + oam->flags = kBomb_DrawExplosion_CharFlags[frame * 2 + 1] & ~0x3E | HIBYTE(oam_priority_value) | r11; + bytewise_extended_oam[oam - oam_buf] = ext | kBomb_DrawExplosion_Ext[frame]; + oam++; + } + } while (frame++, ++idx != idx_end); + return oam; +} + +void Ancilla15_JumpSplash(int k) { // 88a80f + static const uint8 kAncilla_JumpSplash_Char[2] = {0xac, 0xae}; + + if (!submodule_index) { + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 0; + ancilla_item_to_link[k] = 1; + } + if (ancilla_item_to_link[k]) { + ancilla_x_vel[k] = ancilla_y_vel[k] = ancilla_y_vel[k] - 4; + if (ancilla_y_vel[k] < 232) { + ancilla_type[k] = 0; + if ((link_is_bunny_mirror || link_player_handler_state == kPlayerState_Swimming) && link_is_in_deep_water) + CheckAbilityToSwim(); + return; + } + Ancilla_MoveX(k); + Ancilla_MoveY(k); + } + } + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + int ax = Ancilla_GetX(k); + int x8 = link_x_coord * 2 - ax - BG2HOFS_copy2; + int x6 = ax + 12 - BG2HOFS_copy2; + int j = ancilla_item_to_link[k]; + uint8 flags = 0; + for (int i = 0; i < 2; i++) { + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kAncilla_JumpSplash_Char[j]; + oam->flags = 0x24 | flags; + bytewise_extended_oam[oam - oam_buf] = 2; + oam = Ancilla_AllocateOamFromCustomRegion(oam + 1); + pt.x = x8; + flags = 0x40; + } + Ancilla_SetOam_XY(oam, x6, pt.y); + oam->charnum = 0xc0; + oam->flags = 0x24; + bytewise_extended_oam[oam - oam_buf] = (j == 1) ? 1 : 2; +} + +void Ancilla16_HitStars(int k) { // 88a8e5 + static const uint8 kAncilla_HitStars_Char[2] = {0x90, 0x91}; + + if (!sign8(--ancilla_arr3[k])) + return; + + ancilla_arr3[k] = 0; + if (!submodule_index) { + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 0; + ancilla_item_to_link[k] = 1; + } + if (ancilla_item_to_link[k]) { + ancilla_x_vel[k] = (ancilla_y_vel[k] -= 4); + if (ancilla_y_vel[k] < 232) { + ancilla_type[k] = 0; + return; + } + Ancilla_MoveY(k); + Ancilla_MoveX(k); + } + } + Point16U info; + Ancilla_PrepOamCoord(k, &info); + + uint16 ax = Ancilla_GetX(k); + uint16 tt = ancilla_B[k] << 8 | ancilla_A[k]; + + uint16 r8 = 2 * tt - ax - 8 - BG2HOFS_copy2; + + if (ancilla_step[k] == 2) + Ancilla_AllocateOamFromRegion_B_or_E(8); + + OamEnt *oam = GetOamCurPtr(); + uint16 x = info.x, y = info.y; + uint8 flags = 0; + for (int i = 1; i >= 0; i--) { + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kAncilla_HitStars_Char[ancilla_item_to_link[k]]; + oam->flags = HIBYTE(oam_priority_value) | 4 | flags; + bytewise_extended_oam[oam - oam_buf] = 0; + flags = 0x40; + BYTE(x) = r8; + oam = HitStars_UpdateOamBufferPosition(oam + 1); + } +} + +void Ancilla17_ShovelDirt(int k) { // 88a9a9 + static const int8 kShovelDirt_XY[8] = {18, -13, -9, 4, 18, 13, -9, -11}; + static const int8 kShovelDirt_Char[2] = {0x40, 0x50}; + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + if (!ancilla_timer[k]) { + ancilla_timer[k] = 8; + if (++ancilla_item_to_link[k] == 2) { + ancilla_type[k] = 0; + return; + } + } + int b = ancilla_item_to_link[k]; + int j = b + ((link_direction_facing == 4) ? 0 : 2); + pt.x += kShovelDirt_XY[j * 2 + 1]; + pt.y += kShovelDirt_XY[j * 2 + 0]; + for (int i = 0; i < 2; i++) { + Ancilla_SetOam_XY(oam, pt.x + i * 8, pt.y); + oam->charnum = kShovelDirt_Char[b] + i; + oam->flags = 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam = Ancilla_AllocateOamFromCustomRegion(oam + 1); + } +} + +void Ancilla32_BlastWallFireball(int k) { // 88aa35 + static const uint8 kBlastWallFireball_Char[3] = {0x9d, 0x9c, 0x8d}; + + if (!submodule_index) { + ancilla_item_to_link[k] += 2; + ancilla_y_vel[k] += ancilla_item_to_link[k]; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (sign8(--blastwall_var12[k])) { + ancilla_type[k] = 0; + return; + } + } + + if (sort_sprites_setting) + Oam_AllocateFromRegionD(4); + else + Oam_AllocateFromRegionA(4); + + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kBlastWallFireball_Char[blastwall_var12[k] & 8 ? 0 : blastwall_var12[k] & 4 ? 1 : 2]; + oam->flags = 0x22; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Ancilla18_EtherSpell(int k) { // 88aaa0 + if (submodule_index) + return; + + if (ancilla_step[k] != 0) { + uint8 flag; + + if (step_counter_for_spin_attack == 0) { + flag = (++ancilla_arr4[k] & 4) == 0; + } else { + flag = step_counter_for_spin_attack == 11; + } + if (flag) { + Palette_ElectroThemedGear(); + Filter_Majorly_Whiten_Bg(); + } else { + LoadActualGearPalettes(); + Palette_Restore_BG_From_Flash(); + } + } + + if (ancilla_step[k] == 2) { + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 2; + if (++ancilla_item_to_link[k] == 2) { + ancilla_item_to_link[k]--; + ancilla_x_vel[k] = 16; + ancilla_step[k] = 3; + } + } + ancilla_x_vel[k] += 1; + EtherSpell_HandleRadialSpin(k); + return; + } else { + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 2; + ancilla_item_to_link[k] ^= 1; + } + if (ancilla_step[k] == 0) { + EtherSpell_HandleLightningStroke(k); + } else if (ancilla_step[k] == 1) { + EtherSpell_HandleOrbPulse(k); + } else if (ancilla_step[k] == 3) { + EtherSpell_HandleRadialSpin(k); + } else if (ancilla_step[k] == 4) { + if (!--ether_var1) + ancilla_step[k] = 5; + EtherSpell_HandleRadialSpin(k); + } else { + uint8 vel = ancilla_x_vel[k] + 0x10; + if (sign8(vel)) vel = 0x7f; + ancilla_x_vel[k] = vel; + EtherSpell_HandleRadialSpin(k); + } + } +} + +void EtherSpell_HandleLightningStroke(int k) { // 88ab63 + Ancilla_MoveY(k); + uint16 y = Ancilla_GetY(k); + + if (BYTE(ether_y_adjusted) != (y & 0xf0)) { + BYTE(ether_y_adjusted) = y & 0xf0; + ancilla_arr25[k]++; + } + if (y < 0xe000 && ether_y2 < 0xe000 && ether_y2 <= y) { + ancilla_step[k] = 1; + } + AncillaDraw_EtherBlitz(k); +} + +void EtherSpell_HandleOrbPulse(int k) { // 88aba7 + if (!sign8(ancilla_arr25[k])) { + if (!sign8(--ancilla_arr3[k])) { + AncillaDraw_EtherBlitz(k); + return; + } + ancilla_arr3[k] = 3; + if (!sign8(--ancilla_arr25[k])) { + AncillaDraw_EtherBlitz(k); + return; + } + ancilla_arr3[k] = 9; + } + if (sign8(--ancilla_arr3[k])) { + ancilla_step[k] = 2; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 16; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 2; + if (step_counter_for_spin_attack) + Medallion_CheckSpriteDamage(k); + } + AncillaDraw_EtherOrb(k, GetOamCurPtr()); +} + +void EtherSpell_HandleRadialSpin(int k) { // 88abef + if (ancilla_step[k] == 4) { + if ((frame_counter & 7) == 0) + sound_effect_2 = 0x2a; + else if ((frame_counter & 7) == 4) + sound_effect_2 = 0xaa; + else if ((frame_counter & 7) == 7) + sound_effect_2 = 0x6a; + } else { + ancilla_x_lo[k] = ether_var2; + ancilla_x_hi[k] = 0; + Ancilla_MoveX(k); + ether_var2 = ancilla_x_lo[k]; + if (ether_var2 == 0x40) + ancilla_step[k] = 4; + } + + uint8 sb = ancilla_step[k]; + uint8 sa = ancilla_item_to_link[k]; + OamEnt *oam = GetOamCurPtr(); + for (int i = 7; i >= 0; i--) { + if (sb != 2 && sb != 5) { + ether_arr1[i] = (ether_arr1[i] + 1) & 0x3f; + } + AncillaRadialProjection arp = Ancilla_GetRadialProjection(ether_arr1[i], ether_var2); + if (sb != 2) + oam = AncillaDraw_EtherBlitzBall(oam, &arp, sa); + else + oam = AncillaDraw_EtherBlitzSegment(oam, &arp, sa, i); + } + if (ether_var2 < 0xf0) { + OamEnt *oam = GetOamCurPtr(); + for (int i = 0; i != 8; i++) { + if (oam[i].y != 0xf0) + return; + } + } + ancilla_type[k] = 0; + load_chr_halfslot_even_odd = 1; + byte_7E0324 = 0; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + link_cant_change_direction = 0; + flag_unk1 = 0; + + if (BYTE(overworld_screen_index) == 0x70 && !(save_ow_event_info[0x70] & 0x20) && Ancilla_CheckForEntranceTrigger(2)) { + trigger_special_entrance = 3; + subsubmodule_index = 0; + BYTE(R16) = 0; + } + + if (link_player_handler_state != kPlayerState_ReceivingEther) { + link_player_handler_state = kPlayerState_Ground; + link_delay_timer_spin_attack = 0; + button_mask_b_y = button_b_frames ? (joypad1H_last & 0x80) : 0; + } + link_speed_setting = 0; + byte_7E0325 = 0; + LoadActualGearPalettes(); + Palette_Restore_BG_And_HUD(); +} + +OamEnt *AncillaDraw_EtherBlitzBall(OamEnt *oam, const AncillaRadialProjection *arp, int s) { // 88aced + static const uint8 kEther_BlitzBall_Char[2] = {0x68, 0x6a}; + int x = (arp->r6 ? -arp->r4 : arp->r4) + ether_x2 - 8 - BG2HOFS_copy2; + int y = (arp->r2 ? -arp->r0 : arp->r0) + ether_y3 - 8 - BG2VOFS_copy2; + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kEther_BlitzBall_Char[s]; + oam->flags = 0x3c; + bytewise_extended_oam[oam - oam_buf] = 2; + return Ancilla_AllocateOamFromCustomRegion(oam + 1); +} + +OamEnt *AncillaDraw_EtherBlitzSegment(OamEnt *oam, const AncillaRadialProjection *arp, int s, int k) { // 88adc9 + static const int8 kEther_SpllittingBlitzSegment_X[16] = {-8, -16, -24, -16, -8, 0, 8, -16, -8, -16, -24, -16, -8, 0, 8, 0}; + static const int8 kEther_SpllittingBlitzSegment_Y[16] = {8, 0, -8, -16, -24, -16, -8, -16, 8, 0, -8, -16, -24, -16, -8, 0}; + static const uint8 kEther_SpllittingBlitzSegment_Char[32] = { + 0x40, 0x42, 0x66, 0x64, 0x62, 0x60, 0x64, 0x66, 0x42, 0x40, 0x66, 0x64, 0x60, 0x62, 0x64, 0x66, + 0x68, 0x42, 0x68, 0x64, 0x68, 0x60, 0x68, 0x64, 0x68, 0x40, 0x68, 0x66, 0x68, 0x62, 0x68, 0x64, + }; + static const uint8 kEther_SpllittingBlitzSegment_Flags[32] = { + 0x3c, 0x3c, 0xfc, 0xfc, 0x3c, 0x3c, 0xbc, 0xbc, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x7c, 0x7c, + 0x3c, 0x7c, 0x3c, 0x3c, 0x3c, 0xbc, 0x3c, 0x7c, 0x3c, 0x7c, 0x3c, 0xfc, 0x3c, 0xbc, 0x3c, 0xbc, + }; + int x = (arp->r6 ? -arp->r4 : arp->r4); + int y = (arp->r2 ? -arp->r0 : arp->r0); + Ancilla_SetOam_XY(oam, x + ether_x2 - 8 - BG2HOFS_copy2, y + ether_y3 - 8 - BG2VOFS_copy2); + int t = s * 8 + k; + oam->charnum = kEther_SpllittingBlitzSegment_Char[t * 2]; + oam->flags = kEther_SpllittingBlitzSegment_Flags[t * 2]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + Ancilla_SetOam_XY(oam, + x + ether_x2 + kEther_SpllittingBlitzSegment_X[t] - BG2HOFS_copy2, + y + ether_y3 + kEther_SpllittingBlitzSegment_Y[t] - BG2VOFS_copy2); + oam->charnum = kEther_SpllittingBlitzSegment_Char[t * 2 + 1]; + oam->flags = kEther_SpllittingBlitzSegment_Flags[t * 2 + 1]; + bytewise_extended_oam[oam - oam_buf] = 2; + return Ancilla_AllocateOamFromCustomRegion(oam + 1); +} + +void AncillaDraw_EtherBlitz(int k) { // 88ae87 + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + int t = ancilla_item_to_link[k]; + int i = ancilla_arr25[k]; + int m = 0; + do { + Ancilla_SetOam_XY(oam, info.x, info.y); + oam->charnum = kEther_BlitzSegment_Char[t * 2 + m]; + oam->flags = kEther_BlitzOrb_Flags[0] | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 2; + info.y -= 16; + oam++; + m ^= 1; + } while (--i >= 0); + if (ancilla_step[k] == 1) + AncillaDraw_EtherOrb(k, oam); +} + +void AncillaDraw_EtherOrb(int k, OamEnt *oam) { // 88aedd + uint16 y = ether_y - 1 - BG2VOFS_copy2; + uint16 x = ether_x - 8 - BG2HOFS_copy2; + int t = ancilla_item_to_link[k] * 4; + + for (int i = 0; i < 4; i++) { + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kEther_BlitzOrb_Char[t + i]; + oam->flags = kEther_BlitzOrb_Flags[t + i]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + oam = Ancilla_AllocateOamFromCustomRegion(oam); + x += 16; + if (i == 1) + x -= 32, y += 16; + } +} + +void AncillaAdd_BombosSpell(uint8 a, uint8 y) { // 88af66 + int k = AncillaAdd_AddAncilla_Bank08(a, y); + if (k < 0) + return; + for (int i = 0; i < 10; i++) { + bombos_arr2[i] = 0; + bombos_arr1[i] = 3; + } + for (int i = 0; i < 8; i++) { + bombos_arr3[i] = 0; + bombos_arr4[i] = 3; + } + bombos_var4 = 0; + bombos_var2 = 0; + bombos_var3 = 0x80; + bombos_arr7[0] = 0x10; + load_chr_halfslot_even_odd = 11; + flag_custom_spell_anim_active = 1; + ancilla_step[k] = 0; + ancilla_item_to_link[k] = 0; + Ancilla_Sfx2_Near(0x2a); + + uint8 t = kGeneratedBombosArr[frame_counter]; + t = (t < 0xe0) ? t : t & 0x7f; + bombos_x_coord[0] = link_x_coord & ~0xff | t; + bombos_y_coord[0] = link_y_coord & ~0xff | t; + + static const int16 kBombos_YDelta[4] = {16, 24, -128, -16}; + static const int16 kBombos_XDelta[4] = {-16, -128, 0, 128}; + + for (int i = 0; i < 1 ; i++) { + bombos_x_coord2[i] = link_x_coord + kBombos_XDelta[i]; + bombos_y_coord2[i] = link_y_coord + kBombos_YDelta[i]; + bombos_var1 = 16; + AncillaRadialProjection arp = Ancilla_GetRadialProjection(bombos_arr7[i], 16); + int x = (arp.r6 ? -arp.r4 : arp.r4) + bombos_x_coord2[i]; + int y = (arp.r2 ? -arp.r0 : arp.r0) + bombos_y_coord2[i]; + bombos_x_lo[i] = (uint8)x; + bombos_x_hi[i] = x >> 8; + bombos_y_lo[i] = (uint8)y; + bombos_y_hi[i] = y >> 8; + } +} + +void Ancilla19_BombosSpell(int k) { // 88b0ce + if (bombos_var4 == 0) { + if (submodule_index == 0) { + BombosSpell_ControlFireColumns(k); + return; + } + for (int i = 9; i >= 0; i--) + AncillaDraw_BombosFireColumn(i); + } else if (bombos_var4 != 2) { + if (submodule_index == 0) { + BombosSpell_FinishFireColumns(k); + return; + } + for (int i = 9; i >= 0; i--) + AncillaDraw_BombosFireColumn(i); + } else { + if (submodule_index == 0) { + BombosSpell_ControlBlasting(k); + return; + } + int i = ancilla_step[k]; + do { + AncillaDraw_BombosBlast(i); + } while (--i >= 0); + } +} + +void BombosSpell_ControlFireColumns(int k) { // 88b10a + uint8 sa = ancilla_item_to_link[k]; + uint8 sb = ancilla_step[k]; + + int j, i = sb; + do { + if (bombos_arr2[i] == 13) + continue; + + if (sign8(--bombos_arr1[i])) { + bombos_arr1[i] = 3; + if (++bombos_arr2[i] == 13) + continue; + + if (bombos_arr2[i] == 2) { + if (sa) + continue; + + // pushed x + if (sb == 9) { + for (j = 9; j >= 0; j--) { + if (bombos_arr2[j] == 13) { + bombos_arr2[j] = 0; + goto exit_loop; + } + } + } + sb = j = (sb + 1) != 10 ? sb + 1 : 9; +exit_loop: + bombos_var1 = (bombos_var1 + 3 >= 207) ? 207 : bombos_var1 + 3; + bombos_arr7[0] += 6; + AncillaRadialProjection arp = Ancilla_GetRadialProjection(bombos_arr7[0] & 0x3f, bombos_var1); + int x = (arp.r6 ? -arp.r4 : arp.r4) + bombos_x_coord2[0]; + int y = (arp.r2 ? -arp.r0 : arp.r0) + bombos_y_coord2[0]; + bombos_x_lo[j] = (uint8)x; + bombos_x_hi[j] = x >> 8; + bombos_y_lo[j] = (uint8)y; + bombos_y_hi[j] = y >> 8; + + uint16 t = x - BG2HOFS_copy2 + 8; + if (t < 256) + sound_effect_1 = kBombos_Sfx[t >> 5] | 0x2a; + } + } + AncillaDraw_BombosFireColumn(i); + + } while (--i >= 0); + if (bombos_arr7[0] >= 0x80) + bombos_var4 = 1; + ancilla_step[k] = sb; +} + +void BombosSpell_FinishFireColumns(int kk) { // 88b236 + int k = ancilla_step[kk]; + do { + if (sign8(--bombos_arr1[k])) { + bombos_arr1[k] = 3; + if (++bombos_arr2[k] >= 13) + bombos_arr2[k] = 13; + } + AncillaDraw_BombosFireColumn(k); + } while (--k >= 0); + for (int k = 9; k >= 0; k--) { + if (bombos_arr2[k] != 13) + return; + } + bombos_var4 = 2; + Medallion_CheckSpriteDamage(kk); + ancilla_step[kk] = 0; +} + +void AncillaDraw_BombosFireColumn(int kk) { // 88b373 + static const int8 kBombosSpell_FireColumn_X[39] = { + 0, -1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1, 1, -1, -1, 2, -1, -1, + }; + static const int8 kBombosSpell_FireColumn_Y[39] = { + 0, -1, -1, 0, -4, -1, 0, -8, -1, 0, -12, -1, 0, -16, -1, 0, + -4, -20, 0, -8, -24, 0, -12, -28, 0, -16, -32, 0, -16, -32, -18, -34, + -1, -35, -1, -1, -36, -1, -1, + }; + static const uint8 kBombosSpell_FireColumn_Flags[39] = { + 0x3c, 0xff, 0xff, 0x3c, 0x3c, 0xff, 0x3c, 0x3c, 0xff, 0x7c, 0x7c, 0xff, 0x3c, 0x7c, 0xff, 0x3c, + 0x3c, 0x3c, 0xbc, 0x3c, 0x3c, 0x7c, 0x3c, 0x3c, 0x3c, 0x3c, 0x7c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, + 0xff, 0x3c, 0xff, 0xff, 0x3c, 0xff, 0xff, + }; + static const uint8 kBombosSpell_FireColumn_Char[39] = { + 0x40, 0xff, 0xff, 0x42, 0x44, 0xff, 0x42, 0x44, 0xff, 0x42, 0x44, 0xff, 0x42, 0x44, 0xff, 0x40, + 0x46, 0x44, 0x4a, 0x4a, 0x48, 0x4c, 0x4c, 0x4a, 0x4e, 0x4c, 0x4a, 0x4e, 0x6a, 0x4c, 0x4e, 0x68, + 0xff, 0x6a, 0xff, 0xff, 0x4e, 0xff, 0xff, + }; + Ancilla_AllocateOamFromRegion_A_or_D_or_F(kk, 0x10); + OamEnt *oam = GetOamCurPtr(); + for (int i = 0; i < 1; i++) { + int k = bombos_arr2[kk]; + if (k == 13) + continue; + k = k * 3 + 2; + for (int j = 0; j < 3; j++, k--) { + if (kBombosSpell_FireColumn_Char[k] != 0xff) { + uint16 x = bombos_x_lo[kk] | bombos_x_hi[kk] << 8; + uint16 y = bombos_y_lo[kk] | bombos_y_hi[kk] << 8; + y += kBombosSpell_FireColumn_Y[k] - BG2VOFS_copy2; + x += kBombosSpell_FireColumn_X[k] - BG2HOFS_copy2; + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kBombosSpell_FireColumn_Char[k]; + oam->flags = kBombosSpell_FireColumn_Flags[k]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + } + oam = Ancilla_AllocateOamFromCustomRegion(oam); + } + } +} + +void BombosSpell_ControlBlasting(int kk) { // 88b40d + int k = ancilla_step[kk], sb = k; + for (; k >= 0; k--) { + if (bombos_arr3[k] != 8 && sign8(--bombos_arr4[k])) { + bombos_arr4[k] = 3; + if (++bombos_arr3[k] == 1 && !bombos_var2) { + int j = sb; + if (j != 15) { + j = ++sb; + } else { + for (; j >= 0 && bombos_arr3[j] != 8; j--) {} + } + bombos_arr3[j] = 0; + bombos_arr4[j] = 3; + + uint16 y = kBombosBlasts_Tab[frame_counter & 0x3f]; + uint16 x = kBombosBlasts_Tab[(frame_counter & 0x3f) + 3]; + bombos_y_coord[j] = y + BG2VOFS_copy2; + bombos_x_coord[j] = x + BG2HOFS_copy2; + + sound_effect_1 = 0xc | kBombos_Sfx[bombos_x_coord[j] >> 5 & 7]; + } + } + AncillaDraw_BombosBlast(k); + } + + for (int j = 15; j >= 0; j--) { + if (bombos_arr3[j] != 8) { + ancilla_step[kk] = sb; + goto getout; + } + } + ancilla_type[kk] = 0; + load_chr_halfslot_even_odd = 1; + byte_7E0324 = 0; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + link_cant_change_direction = 0; + flag_unk1 = 0; + if (link_player_handler_state != kPlayerState_ReceivingBombos) { + link_player_handler_state = kPlayerState_Ground; + link_delay_timer_spin_attack = 0; + button_mask_b_y = button_b_frames ? (joypad1H_last & 0x80) : 0; + } + link_speed_setting = 0; + byte_7E0325 = 0; +getout: + if (--bombos_var3 == 0) + bombos_var2 = bombos_var3 = 1; +} + +void AncillaDraw_BombosBlast(int k) { // 88b5e1 + static const int8 kBombosSpell_DrawBlast_X[32] = { + -8, -1, -1, -1, -12, -4, -12, -4, -16, 0, -16, 0, -16, 0, -16, 0, + -17, 1, -17, 1, -19, 3, -19, 3, -19, 3, -19, 3, -19, 3, -19, 3, + }; + static const int8 kBombosSpell_DrawBlast_Y[32] = { + -8, -1, -1, -1, -12, -12, -4, -4, -16, -16, 0, 0, -16, -16, 0, 0, + -17, -17, 1, 1, -19, -19, 3, 3, -19, -19, 3, 3, -19, -19, 3, 3, + }; + static const uint8 kBombosSpell_DrawBlast_Flags[32] = { + 0x3c, 0xff, 0xff, 0xff, 0x3c, 0x7c, 0xbc, 0xfc, 0x3c, 0x7c, 0xbc, 0xfc, 0x3c, 0x7c, 0xbc, 0xfc, + 0x3c, 0x7c, 0xbc, 0xfc, 0x3c, 0x7c, 0xbc, 0xfc, 0x3c, 0x7c, 0xbc, 0xfc, 0x3c, 0x7c, 0xbc, 0xfc, + }; + static const uint8 kBombosSpell_DrawBlast_Char[32] = { + 0x60, 0xff, 0xff, 0xff, 0x62, 0x62, 0x62, 0x62, 0x64, 0x64, 0x64, 0x64, 0x66, 0x66, 0x66, 0x66, + 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x6a, 0x6a, 0x6a, 0x6a, 0x4e, 0x4e, 0x4e, 0x4e, + }; + uint16 x = bombos_x_coord[k]; + uint16 y = bombos_y_coord[k]; + if (bombos_arr3[k] == 8) + return; + + Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, 0x10); + OamEnt *oam = GetOamCurPtr(); + + int t = bombos_arr3[k] * 4 + 3; + for (int j = 0; j < 4; j++, t--) { + if (kBombosSpell_DrawBlast_Char[t] != 0xff) { + Ancilla_SetOam_XY(oam, + x + kBombosSpell_DrawBlast_X[t] - BG2HOFS_copy2, + y + kBombosSpell_DrawBlast_Y[t] - BG2VOFS_copy2); + oam->charnum = kBombosSpell_DrawBlast_Char[t]; + oam->flags = kBombosSpell_DrawBlast_Flags[t]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + } + oam = Ancilla_AllocateOamFromCustomRegion(oam); + } + +} + +void Ancilla1C_QuakeSpell(int k) { // 88b66a + if (submodule_index != 0) { + if (quake_arr2[4] != kQuake_Tab1[4]) + AncillaDraw_QuakeInitialBolts(k); + return; + } + if (ancilla_step[k] != 2) { + QuakeSpell_ShakeScreen(k); + QuakeSpell_ControlBolts(k); + QuakeSpell_SpreadBolts(k); + return; + } + Medallion_CheckSpriteDamage(k); + Prepare_ApplyRumbleToSprites(); + ancilla_type[k] = 0; + link_player_handler_state = 0; + load_chr_halfslot_even_odd = 1; + byte_7E0324 = 0; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + link_cant_change_direction = 0; + link_delay_timer_spin_attack = 0; + flag_unk1 = 0; + bg1_x_offset = 0; + bg1_y_offset = 0; + if (BYTE(overworld_screen_index) == 0x47 && !(save_ow_event_info[0x47] & 0x20) && Ancilla_CheckForEntranceTrigger(3)) { + trigger_special_entrance = 4; + subsubmodule_index = 0; + BYTE(R16) = 0; + } + button_mask_b_y = button_b_frames ? (joypad1H_last & 0x80) : 0; + link_speed_setting = 0; + byte_7E0325 = 0; +} + +void QuakeSpell_ShakeScreen(int k) { // 88b6f7 + bg1_y_offset = quake_var3; + quake_var3 = -quake_var3; + link_y_vel += bg1_y_offset; +} + +void QuakeSpell_ControlBolts(int k) { // 88b718 + quake_var4 = ancilla_step[k]; + int j = quake_var5; + do { + if (quake_arr2[j] == kQuake_Tab1[j]) + continue; + + if (sign8(--quake_arr1[j])) { + quake_arr1[j] = 1; + if (++quake_arr2[j] == kQuake_Tab1[j]) + continue; + + if (j == 0 && quake_arr2[j] == 2) { + Ancilla_Sfx2_Near(0xc); + quake_var5 = 1; + } else if (j == 1 && quake_arr2[j] == 2) { + quake_var5 = 4; + } else if (j == 4 && quake_arr2[j] == 7) { + quake_var4 = 1; + } + } + AncillaDraw_QuakeInitialBolts(j); + } while (--j >= 0); + ancilla_step[k] = quake_var4; +} + +void AncillaDraw_QuakeInitialBolts(int k) { // 88b793 + static const uint8 kQuakeDrawGroundBolts_Tab[5] = {0, 0x18, 0, 0x18, 0x2f}; + + int t = quake_arr2[k] + kQuakeDrawGroundBolts_Tab[k]; + OamEnt *oam = GetOamCurPtr(); + int idx = kQuakeItemPos[t], num = kQuakeItemPos[t + 1] - idx; + const QuakeItem *p = &kQuakeItems[idx], *pend = p + num; + do { + uint16 x = p->x + quake_var2 - BG2HOFS_copy2; + uint16 y = p->y + quake_var1 - BG2VOFS_copy2; + + uint8 yval = 0xf0; + if (x < 256 && y < 256) { + oam->x = x; + if (y < 0xf0) + yval = y; + } + oam->y = yval; + oam->charnum = kQuakeDrawGroundBolts_Char[p->f & 0x0f]; + oam->flags = p->f & 0xc0 | 0x3c; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + oam_cur_ptr += 4, oam_ext_cur_ptr += 1; + } while (++p != pend); +} + +void QuakeSpell_SpreadBolts(int k) { // 88b84f + if (ancilla_step[k] != 1) + return; + if (ancilla_timer[k] == 0) { + ancilla_timer[k] = 2; + if (++ancilla_item_to_link[k] == 55) { + ancilla_step[k] = 2; + return; + } + } + + int t = ancilla_item_to_link[k]; + + int idx = kQuakeItemPos2[t], num = kQuakeItemPos2[t + 1] - idx; + const QuakeItem *p = &kQuakeItems2[idx], *pend = p + num; + OamEnt *oam = GetOamCurPtr(); + + do { + oam->x = p->x; + oam->y = p->y; + oam->charnum = kQuakeDrawGroundBolts_Char[p->f & 0x0f]; + oam->flags = p->f & 0xc0 | 0x3c; + bytewise_extended_oam[oam - oam_buf] = p->f >> 4 & 3; + oam_cur_ptr += 4, oam_ext_cur_ptr += 1; + oam = Ancilla_AllocateOamFromCustomRegion(oam + 1); + } while (++p != pend); +} + +void Ancilla1A_PowderDust(int k) { // 88bab0 + if (submodule_index == 0) { + Powder_ApplyDamageToSprites(k); + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 1; + int j = ancilla_dir[k]; + if (ancilla_item_to_link[k] == 9) { + ancilla_type[k] = 0; + byte_7E0333 = 0; + return; + } + ancilla_arr25[k] = kMagicPowder_Tab0[++ancilla_item_to_link[k] + j * 10]; + } + } + Ancilla_AllocateOamFromRegion_B_or_E(ancilla_numspr[k]); + Ancilla_MagicPowder_Draw(k); +} + +void Ancilla_MagicPowder_Draw(int k) { // 88baeb + static const int8 kMagicPowder_DrawX[76] = { + -5, -12, 2, -9, -7, -10, -6, -2, -6, -12, 1, -6, -6, -12, 1, -6, + -6, -12, 1, -6, -6, -12, 1, -6, -6, -12, 1, -6, -17, -23, -14, -19, + -11, -18, -9, -13, -4, -13, -1, -8, -3, -9, 0, -5, -3, -10, -1, -5, + -4, -13, -1, -8, -3, -9, 0, -5, -3, -10, -1, -5, -3, -13, -1, -8, + 9, 15, 6, 11, 3, 10, 1, 5, -4, 5, -7, 0, + }; + static const int8 kMagicPowder_DrawY[76] = { + -20, -15, -13, -7, -18, -13, -13, -13, -20, -13, -13, -8, -20, -13, -13, -8, + -19, -12, -12, -7, -18, -11, -11, -6, -17, -10, -10, -5, -16, -14, -12, -9, + -17, -14, -12, -8, -18, -14, -13, -6, -33, -31, -29, -26, -28, -25, -23, -19, + -22, -18, -17, -10, -2, 0, 2, 5, -9, -6, -4, 0, -16, -12, -11, -4, + -16, -14, -12, -9, -17, -14, -12, -8, -18, -14, -13, -6, + }; + static const uint8 kMagicPowder_Draw_Char[19] = { + 9, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + }; + static const uint8 kMagicPowder_Draw_Flags[76] = { + 0x68, 0x24, 0xa2, 0x28, 0x68, 0xe2, 0x28, 0xa4, 0x68, 0xe2, 0xa4, 0x28, 0x22, 0xa4, 0xe8, 0x62, + 0x24, 0xa8, 0xe2, 0x64, 0x28, 0xa2, 0xe4, 0x68, 0x22, 0xa4, 0xe8, 0x62, 0xe2, 0xa4, 0xe8, 0x64, + 0xe8, 0xa8, 0xe4, 0x62, 0xe4, 0xa8, 0xe2, 0x68, 0xe2, 0xa4, 0xe8, 0x64, 0xe8, 0xa8, 0xe4, 0x62, + 0xe4, 0xa8, 0xe2, 0x68, 0xe2, 0xa4, 0xe8, 0x64, 0xe8, 0xa8, 0xe4, 0x62, 0xe4, 0xa8, 0xe2, 0x68, + 0xe2, 0xa4, 0xe8, 0x64, 0xe8, 0xa8, 0xe4, 0x62, 0xe4, 0xa8, 0xe2, 0x68, + }; + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + int b = ancilla_arr25[k]; + for (int i = 0; i < 4; i++, oam++) { + Ancilla_SetOam_XY(oam, info.x + kMagicPowder_DrawX[b * 4 + i], info.y + kMagicPowder_DrawY[b * 4 + i]); + oam->charnum = kMagicPowder_Draw_Char[b]; + oam->flags = kMagicPowder_Draw_Flags[b * 4 + i] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } +} + +void Powder_ApplyDamageToSprites(int k) { // 88bb58 + uint8 a; + for (int j = 15; j >= 0; j--) { + if ((frame_counter ^ j) & 3 || sprite_state[j] != 9 || sprite_bump_damage[j] & 0x20) + continue; + SpriteHitBox hb; + Ancilla_SetupBasicHitBox(k, &hb); + Sprite_SetupHitBox(j, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + continue; + + if ((a = sprite_type[j]) != 0xb || (a = player_is_indoors) == 0 || (a = dungeon_room_index2 - 1) != 0) { + if (a != 0xd) { + Ancilla_CheckDamageToSprite_preset(j, 10); + continue; + } + if (sprite_head_dir[j] != 0) + continue; + } + sprite_head_dir[j] = 1; + Sprite_SpawnPoofGarnish(j); + } +} + +void Ancilla1D_ScreenShake(int k) { // 88bbbc + if (submodule_index == 0) { + if (sign8(--ancilla_item_to_link[k])) { + bg1_x_offset = 0; + bg1_y_offset = 0; + ancilla_type[k] = 0; + return; + } + int offs = DashTremor_TwiddleOffset(k); + int j = ancilla_dir[k]; + if (j == 0) { + bg1_x_offset = offs; + link_x_vel += offs; + } else { + bg1_y_offset = offs; + link_y_vel += offs; + } + } + sprite_alert_flag = 3; +} + +void Ancilla1E_DashDust(int k) { // 88bc92 + if (ancilla_step[k]) { + DashDust_Motive(k); + return; + } + if (!ancilla_timer[k]) { + ancilla_timer[k] = 3; + if (++ancilla_item_to_link[k] == 5) + return; + if (ancilla_item_to_link[k] == 6) { + ancilla_type[k] = 0; + return; + } + } + if (ancilla_item_to_link[k] == 5) + return; + + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + + static const int8 kDashDust_Draw_X1[4] = {0, 0, 4, -4}; + static const int16 kDashDust_Draw_X[30] = { + 10, 5, -1, 0, 10, 5, 0, 5, -1, 0, -1, -1, 9, -1, -1, 10, + 5, -1, 0, 10, 5, 0, 5, -1, 0, -1, -1, 9, -1, -1, + }; + static const int16 kDashDust_Draw_Y[30] = { + -2, 0, -1, -3, -2, 0, -3, 0, -1, -3, -1, -1, -2, -1, -1, -2, + 0, -1, -3, -2, 0, -3, 0, -1, -3, -1, -1, -2, -1, -1, + }; + static const uint8 kDashDust_Draw_Char[30] = { + 0xcf, 0xa9, 0xff, 0xa9, 0xdf, 0xcf, 0xcf, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xa9, 0xff, 0xff, 0xcf, + 0xcf, 0xff, 0xcf, 0xdf, 0xcf, 0xcf, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, + }; + int r12 = kDashDust_Draw_X1[link_direction_facing >> 1]; + int t = 3 * (ancilla_item_to_link[k] + (draw_water_ripples_or_grass == 1 ? 5 : 0)); + + for (int n = 2; n >= 0; n--, t++) { + if (kDashDust_Draw_Char[t] != 0xff) { + Ancilla_SetOam_XY(oam, info.x + r12 + kDashDust_Draw_X[t], info.y + kDashDust_Draw_Y[t]); + oam->charnum = kDashDust_Draw_Char[t]; + oam->flags = 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } + +} + +void Ancilla1F_Hookshot(int k) { // 88bd74 + if (submodule_index != 0) + goto do_draw; + + if (!ancilla_timer[k]) { + ancilla_timer[k] = 7; + Ancilla_Sfx2_Pan(k, 0xa); + } + + if (related_to_hookshot) + goto do_draw; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (ancilla_step[k]) { + if (sign8(--ancilla_item_to_link[k])) { + ancilla_type[k] = 0; + return; + } + goto do_draw; + } + + if (++ancilla_item_to_link[k] == 32) { + ancilla_step[k] = 1; + ancilla_x_vel[k] = -ancilla_x_vel[k]; + ancilla_y_vel[k] = -ancilla_y_vel[k]; + } + + if (Hookshot_ShouldIEvenBotherWithTiles(k)) + goto do_draw; + + if (!ancilla_L[k] && !ancilla_step[k] && Ancilla_CheckSpriteCollision(k) >= 0 && !ancilla_step[k]) { + ancilla_step[k] = 1; + ancilla_y_vel[k] = -ancilla_y_vel[k]; + ancilla_x_vel[k] = -ancilla_x_vel[k]; + } + + Hookshot_CheckTileCollision(k); + + uint8 r0; + + r0 = 0; + + if (player_is_indoors) { + if (!(ancilla_dir[k] & 2)) { + r0 = (tiledetect_vertical_ledge | (tiledetect_vertical_ledge >> 4)) & 3; + } else { + r0 = detection_of_ledge_tiles_horiz_uphoriz & 3; + } + if (r0 == 0) + goto endif_7; + } else { + if (!((detection_of_ledge_tiles_horiz_uphoriz & 3 | tiledetect_vertical_ledge | detection_of_unknown_tile_types) & 0x33)) + goto endif_7; + } + if (sign8(--ancilla_G[k])) { + if (ancilla_K[k] && ((r0 & 3) || ancilla_K[k] != BYTE(index_of_interacting_tile))) { + ancilla_G[k] = 2; + if (sign8(--ancilla_L[k])) + ancilla_L[k] = 0; + } else { + ancilla_L[k]++; + ancilla_K[k] = index_of_interacting_tile; + ancilla_G[k] = 1; + } + } +endif_7: + if (ancilla_L[k]) + goto do_draw; + if (!sign8(ancilla_G[k])) { + ancilla_G[k]--; + goto do_draw; + } + + if ((R14 >> 4 | R14 | tiledetect_stair_tile | R12) & 3 && !ancilla_step[k]) { + ancilla_step[k] = 1; + ancilla_y_vel[k] = -ancilla_y_vel[k]; + ancilla_x_vel[k] = -ancilla_x_vel[k]; + if (!(tiledetect_misc_tiles & 3)) { + AncillaAdd_HookshotWallClink(k, 6, 1); + Ancilla_Sfx2_Pan(k, (tiledetect_misc_tiles & 0x30) ? 6 : 5); + } + } + + if (tiledetect_misc_tiles & 3) { + if (ancilla_item_to_link[k] < 4) { + ancilla_type[k] = 0; + return; + } + related_to_hookshot = 1; + hookshot_effect_index = k; + } + +do_draw: + static const int8 kHookShot_Move_X[4] = {0, 0, 8, -8}; + static const int8 kHookShot_Move_Y[4] = {8, -9, 0, 0}; + static const uint8 kHookShot_Draw_Flags[12] = {0, 0, 0xff, 0x80, 0x80, 0xff, 0x40, 0xff, 0x40, 0, 0xff, 0}; + static const uint8 kHookShot_Draw_Char[12] = {9, 0xa, 0xff, 9, 0xa, 0xff, 9, 0xff, 0xa, 9, 0xff, 0xa}; + + Point16U info; + Ancilla_PrepOamCoord(k, &info); + if (ancilla_L[k]) + oam_priority_value = 0x3000; + OamEnt *oam = GetOamCurPtr(); + + int j = ancilla_dir[k] * 3; + int x = info.x, y = info.y; + for (int i = 2; i >= 0; i--, j++) { + if (kHookShot_Draw_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kHookShot_Draw_Char[j]; + oam->flags = kHookShot_Draw_Flags[j] | 2 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + if (i == 1) + x -= 8, y += 8; + else + x += 8; + } + + int r10 = 0; + int n = ancilla_item_to_link[k] >> 1; + if (n >= 7) { + r10 = n - 7; + n = 6; + } + if (n == 0) + return; + if (ancilla_dir[k] & 1) + r10 = -r10; + x = info.x, y = info.y; + j = ancilla_dir[k]; + if (kHookShot_Move_Y[j] == 0) + y += 4; + if (kHookShot_Move_X[j] == 0) + x += 4; + do { + if (kHookShot_Move_Y[j]) + y += kHookShot_Move_Y[j] + r10; + if (kHookShot_Move_X[j]) + x += kHookShot_Move_X[j] + r10; + if (!Hookshot_CheckProximityToLink(x, y)) { + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = 0x19; + oam->flags = (frame_counter & 2) << 6 | 2 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } while (--n >= 0); +} + +void Ancilla20_Blanket(int k) { // 88c013 + static const uint8 kBedSpread_Char[8] = {0xa, 0xa, 0xa, 0xa, 0xc, 0xc, 0xa, 0xa}; + static const uint8 kBedSpread_Flags[8] = {0, 0x60, 0xa0, 0xe0, 0, 0x60, 0xa0, 0xe0}; + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + + if (!link_pose_during_opening) { + Oam_AllocateFromRegionB(0x10); + } else { + Oam_AllocateFromRegionA(0x10); + } + + OamEnt *oam = GetOamCurPtr(); + int j = link_pose_during_opening ? 4 : 0; + uint16 x = pt.x, y = pt.y; + for (int i = 3; i >= 0; i--, j++, oam++) { + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kBedSpread_Char[j]; + oam->flags = kBedSpread_Flags[j] | 0xd | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 2; + x += 16; + if (i == 2) + x -= 32, y += 8; + } +} + +void Ancilla21_Snore(int k) { // 88c094 + static const uint8 kBedSpread_Dma[3] = {0x44, 0x43, 0x42}; + if (sign8(--ancilla_aux_timer[k])) { + if (ancilla_item_to_link[k] != 2) + ancilla_item_to_link[k]++; + ancilla_aux_timer[k] = 7; + } + ancilla_x_vel[k] += ancilla_step[k]; + if (abs8(ancilla_x_vel[k]) >= 8) + ancilla_step[k] = -ancilla_step[k]; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (Ancilla_GetY(k) <= (uint16)(link_y_coord - 24)) + ancilla_type[k] = 0; + link_dma_var5 = kBedSpread_Dma[ancilla_item_to_link[k]]; + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = 9; + oam->flags = 0x24; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Ancilla3B_SwordUpSparkle(int k) { // 88c167 + static const int8 kAncilla_VictorySparkle_X[16] = {16, 0, 0, 0, 8, 16, 8, 16, 9, 15, 0, 0, 12, 0, 0, 0}; + static const int8 kAncilla_VictorySparkle_Y[16] = {-7, 0, 0, 0, -11, -11, -3, -3, -7, -7, 0, 0, -7, 0, 0, 0}; + static const uint8 kAncilla_VictorySparkle_Char[16] = {0x92, 0xff, 0xff, 0xff, 0x93, 0x93, 0x93, 0x93, 0xf9, 0xf9, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff}; + static const uint8 kAncilla_VictorySparkle_Flags[16] = {0, 0xff, 0xff, 0xff, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0xff, 0xff, 0, 0xff, 0xff, 0xff}; + + if (ancilla_aux_timer[k]) { + ancilla_aux_timer[k]--; + return; + } + + if (sign8(--ancilla_arr3[k])) { + ancilla_arr3[k] = 1; + if (++ancilla_item_to_link[k] == 4) { + ancilla_type[k] = 0; + ancilla_aux_timer[k]--; + return; + } + } + + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + + int j = ancilla_item_to_link[k] * 4; + for (int i = 0; i < 4; i++, j++) { + if (kAncilla_VictorySparkle_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, + link_x_coord + kAncilla_VictorySparkle_X[j] - BG2HOFS_copy2, + link_y_coord + kAncilla_VictorySparkle_Y[j] - BG2VOFS_copy2); + oam->charnum = kAncilla_VictorySparkle_Char[j]; + oam->flags = kAncilla_VictorySparkle_Flags[j] | 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } +} + +void Ancilla3C_SpinAttackChargeSparkle(int k) { // 88c1ea + static const uint8 kSwordChargeSpark_Char[3] = {0xb7, 0x80, 0x83}; + static const uint8 kSwordChargeSpark_Flags[3] = {4, 4, 0x84}; + + if (!submodule_index && !ancilla_timer[k]) { + ancilla_timer[k] = 4; + if (++ancilla_item_to_link[k] == 3) { + ancilla_type[k] = 0; + return; + } + } + ancilla_oam_idx[k] = Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, 4); + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + Ancilla_SetOam_XY(oam, info.x, info.y); + int j = ancilla_item_to_link[k]; + oam->charnum = kSwordChargeSpark_Char[j]; + oam->flags = kSwordChargeSpark_Flags[j] | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Ancilla35_MasterSwordReceipt(int k) { // 88c25f + static const int8 kSwordCeremony_X[8] = {-1, 8, -1, 8, 0, 7, 0, 7}; + static const int8 kSwordCeremony_Y[8] = {1, 1, 9, 9, 1, 1, 9, 9}; + static const uint8 kSwordCeremony_Char[8] = {0x86, 0x86, 0x96, 0x96, 0x87, 0x87, 0x97, 0x97}; + static const uint8 kSwordCeremony_Flags[8] = {1, 0x41, 1, 0x41, 1, 0x41, 1, 0x41}; + + if (!ancilla_timer[k]) { + ancilla_type[k] = 0; + return; + } + if (sign8(--ancilla_aux_timer[k])) { + ancilla_item_to_link[k] = (ancilla_item_to_link[k] == 2) ? 0 : ancilla_item_to_link[k] + 1; + } + + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + int j = (ancilla_item_to_link[k] - 1) * 4; + if (j < 0) + return; + + for (int i = 0; i < 4; i++, j++, oam++) { + Ancilla_SetOam_XY(oam, pt.x + kSwordCeremony_X[j], pt.y + kSwordCeremony_Y[j]); + oam->charnum = kSwordCeremony_Char[j]; + oam->flags = kSwordCeremony_Flags[j] & ~0x30 | 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } +} + +void Ancilla22_ItemReceipt(int k) { // 88c38a + uint8 a; + + if (flag_is_link_immobilized == 2) + goto endif_1; + if (submodule_index != 0 && submodule_index != 43 && submodule_index != 9) { + if (submodule_index == 2) + ancilla_timer[k] = 16; + goto endif_1; + } + flag_unk1++; + + if (ancilla_step[k] != 0 && ancilla_step[k] != 3) { + if (sign8(--ancilla_aux_timer[k])) + goto endif_11; + + if (ancilla_aux_timer[k] == 0) + goto endif_6; + + if (ancilla_aux_timer[k] == 40 && ancilla_step[k] != 2) { + if (Ancilla_AddRupees(k) || ancilla_item_to_link[k] != 0x17) + Ancilla_Sfx3_Near(0xf); + } + goto label_b; + } + + if (ancilla_item_to_link[k] == 1 && ancilla_step[k] != 2) { + if (ancilla_timer[k] == 0) + goto label_a; + if (ancilla_timer[k] != 17) + goto endif_1; + word_7E02CD = 0xDF3; + savegame_tagalong = 0xe; + goto endif_6; + } + + a = --ancilla_aux_timer[k]; + if (a == 0) + goto label_a; + if (a == 1) { + if (ancilla_item_to_link[k] != 0x37 && ancilla_item_to_link[k] != 0x38 && ancilla_item_to_link[k] != 0x39 || zelda_read_apui00() == 0) + goto endif_6; + ancilla_aux_timer[k]++; + } + goto endif_1; + +label_a: + if (ancilla_item_to_link[k] == 1 && !ancilla_step[k]) { + sound_effect_ambient = 5; + music_control = 2; + } + link_player_handler_state = link_is_in_deep_water ? kPlayerState_Swimming : 0; + link_receiveitem_index = 0; + link_pose_for_item = 0; + link_disable_sprite_damage = 0; + Ancilla_AddRupees(k); +endif_11: + item_receipt_method = 0; + a = ancilla_item_to_link[k]; + if (a == 23 && link_heart_pieces == 0) { + Link_ReceiveItem(0x26, 0); + ancilla_type[k] = 0; + flag_unk1 = 0; + return; + } + + if (a == 0x26 || a == 0x3f) { + if (link_health_capacity != 0xa0) { + link_health_capacity += 8; + link_hearts_filler += link_health_capacity - link_health_current; + Ancilla_Sfx3_Near(0xd); + } + } else if (a == 0x3e) { + flag_is_link_immobilized = 0; + if (link_health_capacity != 0xa0) { + link_health_capacity += 8; + link_hearts_filler += 8; + Ancilla_Sfx3_Near(0xd); + } + } else if (a == 0x42) { + link_hearts_filler += 8; + } else if (a == 0x45) { + link_magic_filler += 16; + } else if (a == 0x22 || a == 0x23) { + Palette_Load_LinkArmorAndGloves(); + } + + ancilla_type[k] = 0; + flag_unk1 = 0; + a = ancilla_item_to_link[k]; + if (ancilla_step[k] == 3 && a != 0x10 && a != 0x26 && a != 0xf && a != 0x20) { + PrepareDungeonExitFromBossFight(); + } + + if (ancilla_step[k] != 2) + flag_is_link_immobilized = 0; + return; + +endif_6: + if (player_is_indoors) { + int room = dungeon_room_index; + if (room == 0xff || room == 0x10f || room == 0x110 || room == 0x112 || room == 0x11f) + goto label_b; + } + int msg; + msg = -1; + if (ancilla_item_to_link[k] == 0x38 || ancilla_item_to_link[k] == 0x39) { + if ((link_which_pendants & 7) == 7) + msg = kReceiveItemMsgs2[ancilla_item_to_link[k] - 0x38]; + else + msg = kReceiveItemMsgs[ancilla_item_to_link[k]]; + } else if (ancilla_step[k] != 2) { + if (ancilla_item_to_link[k] == 0x17) + msg = kReceiveItemMsgs3[link_heart_pieces]; + else + msg = kReceiveItemMsgs[ancilla_item_to_link[k]]; + } + if (msg != -1) { + dialogue_message_index = msg; + if (msg == 0x70) + sound_effect_ambient = 9; + Main_ShowTextMessage(); + } + goto endif_1; + +label_b: + if (ancilla_aux_timer[k] >= 24) { + a = ancilla_y_vel[k] - 1; + if (a >= 248) + ancilla_y_vel[k] = a; + Ancilla_MoveY(k); + } +endif_1: + + if (ancilla_item_to_link[k] == 0x20) { + ancilla_z[k] = 0; + AncillaAdd_OccasionalSparkle(k); + if (zelda_read_apui00() == 0) { + music_control = 0x1a; + ItemReceipt_TransmuteToRisingCrystal(k); + return; + } + } else if (ancilla_item_to_link[k] == 0x1) { + ancilla_arr4[k] = kReceiveItem_Tab0[0]; + if (ancilla_step[k] != 2) { + if (ancilla_timer[k] < 16) { + a = 0; + } else { + if (!sign8(--ancilla_arr3[k])) + goto skipit; + ancilla_arr3[k] = 2; + a = ancilla_arr1[k] + 1; + if (a == 3) + a = 0; + } + ancilla_arr1[k] = a; + ancilla_arr4[k] = kReceiveItem_Tab0[a]; +skipit:; + } + } + + if ((ancilla_item_to_link[k] == 0x34 || ancilla_item_to_link[k] == 0x35 || ancilla_item_to_link[k] == 0x36) && sign8(--ancilla_arr3[k])) { + a = ancilla_arr1[k] + 1; + if (a == 3) + a = 0; + ancilla_arr1[k] = a; + ancilla_arr3[k] = kReceiveItem_Tab4[a]; + WriteTo4BPPBuffer_at_7F4000(kReceiveItem_Tab5[a]); + } +endif_12: + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + Ancilla_ReceiveItem_Draw(k, pt.x, pt.y); +} + +OamEnt *Ancilla_ReceiveItem_Draw(int k, int x, int y) { // 88c690 + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_item_to_link[k]; + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = 0x24; + uint8 a = kWishPond2_OamFlags[j]; + if (sign8(a)) + a = ancilla_arr4[k]; + oam->flags = a * 2 | 0x30; + uint8 ext = kReceiveItem_Tab1[j]; + bytewise_extended_oam[oam - oam_buf] = ext; + oam++; + if (ext == 0) { + Ancilla_SetOam_XY(oam, x, y + 8); + oam->charnum = 0x34; + oam->flags = a * 2 | 0x30; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + return oam; +} + +void Ancilla28_WishPondItem(int k) { // 88c6f2 + Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, 0x10); + + if (submodule_index == 0 && ancilla_timer[k] == 0) { + link_picking_throw_state = 2; + link_state_bits = 0; + ancilla_z_vel[k] -= 2; + Ancilla_MoveZ(k); + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (sign8(ancilla_z[k]) && ancilla_z[k] < 228) { + ancilla_z[k] = 228; + Ancilla_SetXY(k, + Ancilla_GetX(k) + (kGeneratedWishPondItem[ancilla_item_to_link[k]] ? 8 : 4), // wtf + Ancilla_GetY(k) + 18); + Ancilla_TransmuteToSplash(k); + return; + } + } + WishPondItem_Draw(k); +} + +void WishPondItem_Draw(int k) { // 88c760 + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + + if (ancilla_item_to_link[k] == 1) + ancilla_arr4[k] = 5; + + OamEnt *oam = Ancilla_ReceiveItem_Draw(k, pt.x, pt.y - (int8)ancilla_z[k]); + + if (link_picking_throw_state != 2 || !sign8(ancilla_z_vel[k]) && ancilla_z_vel[k] >= 2) + return; + + uint8 xx = kGeneratedWishPondItem[ancilla_item_to_link[k]]; + AncillaDraw_Shadow(oam, + (xx == 2) ? 1 : 2, + pt.x - (xx == 2 ? 0 : 4), + pt.y + 40, HIBYTE(oam_priority_value)); +} + +void Ancilla42_HappinessPondRupees(int k) { // 88c7de + link_picking_throw_state = 2; + link_state_bits = 0; + for (int i = 9; i >= 0; i--) { + if (happiness_pond_arr1[i]) { + HapinessPondRupees_ExecuteRupee(k, i); + if (happiness_pond_step[i] == 2) + happiness_pond_arr1[i] = 0; + } + } + for (int i = 9; i >= 0; i--) { + if (happiness_pond_arr1[i]) + return; + } + ancilla_type[k] = 0; +} + +void HapinessPondRupees_ExecuteRupee(int k, int i) { // 88c819 + Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, 0x10); + HapinessPondRupees_GetState(k, i); + + if (ancilla_step[k]) { + if (!submodule_index && !ancilla_timer[k]) { + ancilla_timer[k] = 6; + if (++ancilla_item_to_link[k] == 5) { + ancilla_step[k]++; + } else { + ObjectSplash_Draw(k); + } + } else { + ObjectSplash_Draw(k); + } + } else if (submodule_index == 0 && ancilla_timer[k] == 0) { + ancilla_z_vel[k] -= 2; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + Ancilla_MoveZ(k); + if (!sign8(ancilla_z[k]) || ancilla_z[k] >= 0xe4) + goto else_label; + ancilla_z[k] = 0xe4; + Ancilla_SetXY(k, Ancilla_GetX(k) - 4, Ancilla_GetY(k) + 30); + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 6; + Ancilla_Sfx2_Pan(k, 0x28); + ancilla_step[k]++; + ObjectSplash_Draw(k); + } else { +else_label: + ancilla_arr4[k] = 2; + ancilla_floor[k] = 0; + WishPondItem_Draw(k); + } + HapinessPondRupees_SaveState(i, k); +} + +void HapinessPondRupees_GetState(int j, int k) { // 88c8be + ancilla_y_lo[j] = happiness_pond_y_lo[k]; + ancilla_y_hi[j] = happiness_pond_y_hi[k]; + ancilla_x_lo[j] = happiness_pond_x_lo[k]; + ancilla_x_hi[j] = happiness_pond_x_hi[k]; + ancilla_z[j] = happiness_pond_z[k]; + ancilla_y_vel[j] = happiness_pond_y_vel[k]; + ancilla_x_vel[j] = happiness_pond_x_vel[k]; + ancilla_z_vel[j] = happiness_pond_z_vel[k]; + ancilla_y_subpixel[j] = happiness_pond_y_subpixel[k]; + ancilla_x_subpixel[j] = happiness_pond_x_subpixel[k]; + ancilla_z_subpixel[j] = happiness_pond_z_subpixel[k]; + ancilla_item_to_link[j] = happiness_pond_item_to_link[k]; + ancilla_step[j] = happiness_pond_step[k]; + ancilla_timer[j] = happiness_pond_timer[k] ? happiness_pond_timer[k] - 1 : 0; +} + +void HapinessPondRupees_SaveState(int k, int j) { // 88c924 + happiness_pond_y_lo[k] = ancilla_y_lo[j]; + happiness_pond_y_hi[k] = ancilla_y_hi[j]; + happiness_pond_x_lo[k] = ancilla_x_lo[j]; + happiness_pond_x_hi[k] = ancilla_x_hi[j]; + happiness_pond_z[k] = ancilla_z[j]; + happiness_pond_y_vel[k] = ancilla_y_vel[j]; + happiness_pond_x_vel[k] = ancilla_x_vel[j]; + happiness_pond_z_vel[k] = ancilla_z_vel[j]; + happiness_pond_y_subpixel[k] = ancilla_y_subpixel[j]; + happiness_pond_x_subpixel[k] = ancilla_x_subpixel[j]; + happiness_pond_z_subpixel[k] = ancilla_z_subpixel[j]; + happiness_pond_item_to_link[k] = ancilla_item_to_link[j]; + happiness_pond_timer[k] = ancilla_timer[j]; + happiness_pond_step[k] = ancilla_step[j]; +} + +void Ancilla_TransmuteToSplash(int k) { // 88c9cd + ancilla_type[k] = 0x3d; + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 6; + Ancilla_SetXY(k, Ancilla_GetX(k) - 8, Ancilla_GetY(k) + 12); + Ancilla_Sfx2_Pan(k, 0x28); + Ancilla3D_ItemSplash(k); +} + +void Ancilla3D_ItemSplash(int k) { // 88ca01 + Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, 8); + if (!submodule_index && !ancilla_timer[k]) { + ancilla_timer[k] = 6; + if (++ancilla_item_to_link[k] == 5) { + ancilla_type[k] = 0; + return; + } + } + ObjectSplash_Draw(k); +} + +void ObjectSplash_Draw(int k) { // 88ca22 + static const int8 kObjectSplash_Draw_X[10] = {0, 0, 0, 0, 11, -3, 15, -7, 15, -7}; + static const int8 kObjectSplash_Draw_Y[10] = {0, 0, -6, 0, -13, -8, -17, -4, -17, -4}; + static const uint8 kObjectSplash_Draw_Char[10] = {0xc0, 0xff, 0xe7, 0xff, 0xaf, 0xbf, 0x80, 0x80, 0x83, 0x83}; + static const uint8 kObjectSplash_Draw_Flags[10] = {0, 0xff, 0, 0xff, 0x40, 0, 0x40, 0, 0xc0, 0x80}; + static const uint8 kObjectSplash_Draw_Ext[10] = {2, 0, 2, 0, 0, 0, 0, 0, 0, 0}; + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_item_to_link[k] * 2; + for (int i = 0; i != 2; i++, j++) { + if (kObjectSplash_Draw_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, pt.x + kObjectSplash_Draw_X[j], pt.y + kObjectSplash_Draw_Y[j]); + oam->charnum = kObjectSplash_Draw_Char[j]; + oam->flags = kObjectSplash_Draw_Flags[j] | 0x24; + bytewise_extended_oam[oam - oam_buf] = kObjectSplash_Draw_Ext[j]; + oam++; + } + } +} + +void Ancilla29_MilestoneItemReceipt(int k) { // 88ca8c + if (ancilla_item_to_link[k] != 0x10 && ancilla_item_to_link[k] != 0x0f) { + if (dung_savegame_state_bits & 0x4000) { + ancilla_type[k] = 0; + return; + } + + if (!(dung_savegame_state_bits & 0x8000)) + return; + + if (byte_7E04C2 != 0) { + if (byte_7E04C2 == 1) { + if (ancilla_item_to_link[k] == 0x20) { + sound_effect_ambient = 0x0f; + DecodeAnimatedSpriteTile_variable(0x28); + } else { + DecodeAnimatedSpriteTile_variable(0x23); + } + } + byte_7E04C2--; + return; + } + if (!ancilla_arr3[k] && ancilla_item_to_link[k] == 0x20) { + ancilla_arr3[k] = 1; + palette_sp6 = 4; + overworld_palette_aux_or_main = 0x200; + Palette_Load_SpriteEnvironment_Dungeon(); + flag_update_cgram_in_nmi++; + } + } else { + if (ancilla_G[k]) { + ancilla_G[k]--; + return; + } + } + + if (ancilla_item_to_link[k] == 0x20) + AncillaAdd_OccasionalSparkle(k); + + if (submodule_index == 0) { + CheckPlayerCollOut coll_out; + if (ancilla_z[k] < 24 && Ancilla_CheckLinkCollision(k, 2, &coll_out) && related_to_hookshot == 0 && link_auxiliary_state == 0) { + ancilla_type[k] = 0; + if (link_player_handler_state == kPlayerState_ReceivingEther || link_player_handler_state == kPlayerState_ReceivingBombos) { + flag_custom_spell_anim_active = 0; + link_force_hold_sword_up = 0; + link_player_handler_state = 0; + } + item_receipt_method = 3; + Link_ReceiveItem(ancilla_item_to_link[k], 0); + return; + } + + if (ancilla_step[k] != 2) { + if (ancilla_step[k] != 0) { + ancilla_z_vel[k]--; + } + Ancilla_MoveZ(k); + if (ancilla_z[k] >= 0xf8) { + ancilla_step[k]++; + ancilla_z_vel[k] = 0x18; + ancilla_z[k] = 0; + } + } + } + + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = Ancilla_ReceiveItem_Draw(k, pt.x, pt.y - ancilla_z[k]); + + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 9; + if (++ancilla_L[k] == 3) + ancilla_L[k] = 0; + } + + int t; + if (ancilla_z[k] == 0) { + t = (dungeon_room_index == 6) ? ancilla_L[k] + 4 : 0; + } else { + t = ancilla_z[k] < 0x20 ? 1 : 2; + } + AncillaDraw_Shadow(oam, t, pt.x, pt.y + 12, 0x20); +} + +void ItemReceipt_TransmuteToRisingCrystal(int k) { // 88cbe4 + ancilla_type[k] = 0x3e; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_y_subpixel[k] = 0; + Ancilla_RisingCrystal(k); +} + +void Ancilla_RisingCrystal(int k) { // 88cbf2 + ancilla_z[k] = 0; + AncillaAdd_OccasionalSparkle(k); + uint8 yy = ancilla_y_vel[k] - 1; + if (yy < 0xf0) + yy = 0xf0; + ancilla_y_vel[k] = yy; + Ancilla_MoveY(k); + + uint16 y = Ancilla_GetY(k) - BG2VOFS_copy; + if (y < 0x49) { + Ancilla_SetY(k, 0x49 + BG2VOFS_copy); + if (!submodule_index) { + link_has_crystals |= kDungeonCrystalPendantBit[BYTE(cur_palace_index_x2) >> 1]; + submodule_index = 0x18; + subsubmodule_index = 0; + memset(aux_palette_buffer + 0x20, 0, sizeof(uint16) * 0x60); + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + } + } + + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + Ancilla_ReceiveItem_Draw(k, pt.x, pt.y); +} + +void AncillaAdd_OccasionalSparkle(int k) { // 88cc93 + if (!(frame_counter & 7)) + AncillaAdd_SwordChargeSparkle(k); +} + +void Ancilla43_GanonsTowerCutscene(int k) { // 88cca0 + OamEnt *oam = GetOamCurPtr(); + if (!ancilla_step[k]) { + uint8 yy = ancilla_y_vel[k] - 1; + ancilla_y_vel[k] = (yy < 0xf0) ? 0xf0 : yy; + Ancilla_MoveY(k); + uint16 x = Ancilla_GetX(k), y = Ancilla_GetY(k); + if ((uint16)(y - BG2VOFS_copy) >= 0x38) + goto lbl_else; + breaktowerseal_y = 0x38 + 8 + BG2VOFS_copy; + breaktowerseal_x = x + 8; + Ancilla_SetY(k, 0x38 + BG2VOFS_copy); + ancilla_step[k]++; + sound_effect_ambient = 5; + music_control = 0xf1; + dialogue_message_index = 0x13b; + Main_ShowTextMessage(); + goto label_a; + } +lbl_else: + if (ancilla_step[k] == 1 && submodule_index == 0) { + ancilla_x_vel[k] = 16; + uint8 bak0 = ancilla_x_lo[k]; + uint8 bak1 = ancilla_x_hi[k]; + ancilla_x_lo[k] = breaktowerseal_var4; + ancilla_x_hi[k] = 0; + Ancilla_MoveX(k); + breaktowerseal_var4 = ancilla_x_lo[k]; + ancilla_x_lo[k] = bak0; + ancilla_x_hi[k] = bak1; + if (breaktowerseal_var4 >= 48) { + breaktowerseal_var4 = 48; + ancilla_step[k]++; + } + } + if (submodule_index) + goto label_b; + if (ancilla_step[k] == 0) + goto label_a; + if (ancilla_step[k] == 1) + goto label_b; + if (ancilla_step[k] == 2) { + if (--breaktowerseal_var5 == 0) { + trigger_special_entrance = 5; + subsubmodule_index = 0; + BYTE(R16) = 0; + ancilla_step[k]++; + } + } else { + ancilla_x_vel[k] = 48; + uint8 bak0 = ancilla_x_lo[k]; + uint8 bak1 = ancilla_x_hi[k]; + ancilla_x_lo[k] = breaktowerseal_var4; + ancilla_x_hi[k] = 0; + Ancilla_MoveX(k); + breaktowerseal_var4 = ancilla_x_lo[k]; + ancilla_x_lo[k] = bak0; + ancilla_x_hi[k] = bak1; + if (breaktowerseal_var4 >= 240) { + palette_sp6 = 0; + overworld_palette_aux_or_main = 0x200; + Palette_Load_SpriteEnvironment_Dungeon(); + flag_update_cgram_in_nmi++; + ancilla_type[k] = 0; + return; + } + } +label_b: + + uint8 astep; + + astep = ancilla_step[k]; + if (astep != 0) + oam = GTCutscene_SparkleALot(oam); + + for (int j = 6; j >= 0; j--) { + if (submodule_index == 0 && astep != 1 && !(frame_counter & 1)) + breaktowerseal_var3[j] = breaktowerseal_var3[j] + 1 & 63; + AncillaRadialProjection arp = Ancilla_GetRadialProjection(breaktowerseal_var3[j], breaktowerseal_var4); + int x = (arp.r6 ? -arp.r4 : arp.r4) + breaktowerseal_x - 8 - BG2HOFS_copy; + int y = (arp.r2 ? -arp.r0 : arp.r0) + breaktowerseal_y - 8 - BG2VOFS_copy; + + breaktowerseal_base_sparkle_x_lo[j] = x; + breaktowerseal_base_sparkle_x_hi[j] = x >> 8; + + breaktowerseal_base_sparkle_y_lo[j] = y; + breaktowerseal_base_sparkle_y_hi[j] = y >> 8; + + AncillaDraw_GTCutsceneCrystal(oam, x, y); + oam++; + } +label_a: + Point16U info; + Ancilla_PrepAdjustedOamCoord(k, &info); + + breaktowerseal_base_sparkle_x_lo[7] = info.x; + breaktowerseal_base_sparkle_x_hi[7] = info.x >> 8; + breaktowerseal_base_sparkle_y_lo[7] = info.y; + breaktowerseal_base_sparkle_y_hi[7] = info.y >> 8; + + AncillaDraw_GTCutsceneCrystal(oam, info.x, info.y); + + if (!ancilla_step[k]) + AncillaAdd_OccasionalSparkle(k); + else if (!submodule_index) + GTCutscene_ActivateSparkle(); +} + +void AncillaDraw_GTCutsceneCrystal(OamEnt *oam, int x, int y) { // 88ceaa + uint8 ext = Ancilla_SetOam_XY_safe(oam, x, y); + oam->charnum = 0x24; + oam->flags = 0x3c; + int j = oam - oam_buf; + bytewise_extended_oam[oam - oam_buf] = ext | 2; +} + +void GTCutscene_ActivateSparkle() { // 88cec7 + for (int k = 0x17; k >= 0; k--) { + if (breaktowerseal_sparkle_var1[k] == 0xff) { + breaktowerseal_sparkle_var1[k] = 0; + breaktowerseal_sparkle_var2[k] = 4; + int r = GetRandomNumber(); + int x = breaktowerseal_base_sparkle_x_hi[k & 7] << 8 | breaktowerseal_base_sparkle_x_lo[k & 7]; + int y = breaktowerseal_base_sparkle_y_hi[k & 7] << 8 | breaktowerseal_base_sparkle_y_lo[k & 7]; + x += r >> 4; + y += r & 0xf; + breaktowerseal_sparkle_x_lo[k] = x; + breaktowerseal_sparkle_x_hi[k] = x >> 8; + breaktowerseal_sparkle_y_lo[k] = y; + breaktowerseal_sparkle_y_hi[k] = y >> 8; + return; + } + } +} + +OamEnt *GTCutscene_SparkleALot(OamEnt *oam) { // 88cf35 + static const uint8 kSwordChargeSpark_Char[3] = {0xb7, 0x80, 0x83}; + static const uint8 kSwordChargeSpark_Flags[3] = {4, 4, 0x84}; + for (int k = 0x17; k >= 0; k--) { + if (breaktowerseal_sparkle_var1[k] == 0xff) + continue; + + if (sign8(--breaktowerseal_sparkle_var2[k])) { + breaktowerseal_sparkle_var2[k] = 4; + if (++breaktowerseal_sparkle_var1[k] == 3) { + breaktowerseal_sparkle_var1[k] = 0xff; + continue; + } + } + + int x = breaktowerseal_sparkle_x_hi[k] << 8 | breaktowerseal_sparkle_x_lo[k]; + int y = breaktowerseal_sparkle_y_hi[k] << 8 | breaktowerseal_sparkle_y_lo[k]; + Ancilla_SetOam_XY(oam, x, y); + int j = breaktowerseal_sparkle_var1[k]; + oam->charnum = kSwordChargeSpark_Char[j]; + oam->flags = kSwordChargeSpark_Flags[j] | 0x30; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + return oam; +} + +void Ancilla36_Flute(int k) { // 88cfaa + static const uint8 kFlute_Vels[4] = {0x18, 0x10, 0xa, 0}; + + if (!submodule_index) { + if (ancilla_step[k] != 3) { + ancilla_z_vel[k] -= 2; + Ancilla_MoveX(k); + Ancilla_MoveZ(k); + if (sign8(ancilla_z[k]) || ancilla_z[k] >= 0xf0) { + ancilla_z_vel[k] = kFlute_Vels[++ancilla_step[k]]; + ancilla_z[k] = 0; + } + } else { + CheckPlayerCollOut coll_out; + if (Ancilla_CheckLinkCollision(k, 2, &coll_out) && !related_to_hookshot && link_auxiliary_state == 0) { + ancilla_type[k] = 0; + item_receipt_method = 0; + Link_ReceiveItem(0x14, 0); + return; + } + } + } + + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + Ancilla_SetOam_XY(oam, pt.x, pt.y - (int8)ancilla_z[k]); + oam->charnum = 0x24; + oam->flags = HIBYTE(oam_priority_value) | 4; + bytewise_extended_oam[oam - oam_buf] = 2; + if (oam->y == 0xf0) + ancilla_type[k] = 0; +} + +void Ancilla37_WeathervaneExplosion(int k) { // 88d03d + if (--weathervane_var2) + return; + weathervane_var2 = 1; + if (!weathervane_var1) { + weathervane_var1 = 1; + music_control = 0xf3; + } + if (--ancilla_G[k]) + return; + ancilla_G[k] = 1; + if (!ancilla_arr3[k]) { + ancilla_arr3[k] += 1; + Ancilla_Sfx2_Near(0xc); + } + if (!ancilla_step[k] && sign8(--ancilla_aux_timer[k])) { + ancilla_step[k] = 1; + Overworld_AlterWeathervane(); + AncillaAdd_CutsceneDuck(0x38, 0); + } + weathervane_var13 = k; + weathervane_var14 = 0; + for (int i = 11; i >= 0; i--) { + if (weathervane_arr12[i] == 0xff) + continue; + if (sign8(--weathervane_arr11[i])) { + weathervane_arr11[i] = 1; + weathervane_arr12[i] ^= 1; + } + + ancilla_item_to_link[k] = weathervane_arr12[i]; + ancilla_y_lo[k] = weathervane_arr6[i]; + ancilla_y_hi[k] = weathervane_arr7[i]; + ancilla_x_lo[k] = weathervane_arr8[i]; + ancilla_x_hi[k] = weathervane_arr9[i]; + ancilla_z[k] = weathervane_arr10[i]; + ancilla_y_vel[k] = weathervane_arr3[i]; + ancilla_x_vel[k] = weathervane_arr4[i]; + weathervane_arr5[i] = ancilla_z_vel[k] = weathervane_arr5[i] - 1; + + Ancilla_MoveY(k); + Ancilla_MoveX(k); + Ancilla_MoveZ(k); + + uint8 c = (ancilla_z[k] < 0xf0) ? 0 : 0xff; + AncillaDraw_WeathervaneExplosionWoodDebris(k); + if (sign8(c)) + weathervane_arr12[i] = c; + weathervane_arr6[i] = ancilla_y_lo[k]; + weathervane_arr7[i] = ancilla_y_hi[k]; + weathervane_arr8[i] = ancilla_x_lo[k]; + weathervane_arr9[i] = ancilla_x_hi[k]; + weathervane_arr10[i] = ancilla_z[k]; + } + for (int i = 11; i >= 0; i--) { + if (weathervane_arr12[i] != 0xff) + return; + } + ancilla_type[k] = 0; +} + +void AncillaDraw_WeathervaneExplosionWoodDebris(int k) { // 88d188 + static const uint8 kWeathervane_Explode_Char[2] = {0x4e, 0x4f}; + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + pt.y -= (int8)ancilla_z[k]; + int i = ancilla_item_to_link[k]; + if (sign8(i)) + return; + OamEnt *oam = GetOamCurPtr() + (weathervane_var14 >> 2); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kWeathervane_Explode_Char[i]; + oam->flags = 0x3c; + weathervane_var14 += 4; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Ancilla38_CutsceneDuck(int k) { // 88d1d8 + static const uint8 kTravelBirdIntro_Tab0[2] = {0x40, 0}; + static const uint8 kTravelBirdIntro_Tab1[2] = {28, 60}; + + if (!(frame_counter & 31)) + Ancilla_Sfx3_Pan(k, 0x1e); + + if (sign8(--ancilla_arr3[k])) { + ancilla_arr3[k] = 3; + ancilla_K[k] ^= 1; + } + + if (!--ancilla_aux_timer[k]) { + ancilla_aux_timer[k] = 1; + if (!ancilla_L[k]) { + if (!sign8(--ancilla_item_to_link[k])) { + ancilla_z_vel[k] += ancilla_step[k] ? 1 : -1; + if (abs8(ancilla_z_vel[k]) >= 12) + ancilla_step[k] ^= 1; + goto after_stuff; + } + ancilla_item_to_link[k] = 0; + ancilla_step[k] = 0; + ancilla_x_vel[k] = kTravelBirdIntro_Tab1[0]; + ancilla_z_vel[k] = -16; + ancilla_L[k]++; + ancilla_step[k] = 3; + } + ancilla_x_vel[k] += (ancilla_step[k] & 1) == 0 ? 1 : -1; + uint8 absx = abs8(ancilla_x_vel[k]); + if (absx == 0 && ++ancilla_L[k] == 7) + ancilla_S[k] = 1; + if (absx >= kTravelBirdIntro_Tab1[ancilla_S[k]]) { + ancilla_step[k] ^= 3; + } + ancilla_dir[k] = sign8(ancilla_x_vel[k]) ? 2 : 3; + uint8 t = (uint8)(kTravelBirdIntro_Tab1[ancilla_S[k]] - absx) >> 1; + ancilla_z_vel[k] = (ancilla_step[k] & 2) ? -t : t; + } +after_stuff: + Ancilla_MoveX(k); + Ancilla_MoveZ(k); + BYTE(flag_travel_bird) = kTravelBird_DmaStuffs[ancilla_K[k] + 1]; + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + + Ancilla_SetOam_XY(oam, info.x + kTravelBird_Draw_X[0], info.y + (int8)ancilla_z[k] + kTravelBird_Draw_Y[0]); + oam->charnum = kTravelBird_Draw_Char[0]; + oam->flags = kTravelBird_Draw_Flags[0] | 0x30 | kTravelBirdIntro_Tab0[ancilla_dir[k] & 1]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + AncillaDraw_Shadow(oam, 1, info.x, info.y + 48, 0x30); + if (!sign16(info.x) && info.x >= 248) { + ancilla_type[k] = 0; + submodule_index = 0; + link_item_flute = 3; + } +} + +void Ancilla23_LinkPoof(int k) { // 88d3bc + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 7; + if (++ancilla_item_to_link[k] == 3) { + ancilla_type[k] = 0; + link_is_transforming = 0; + link_cant_change_direction = 0; + if (!ancilla_step[k]) { + link_animation_steps = 0; + link_visibility_status = 0; + link_is_bunny = link_is_bunny_mirror = BYTE(overworld_screen_index) & 0x40 ? 1 : 0; + if (link_is_bunny) + LoadGearPalettes_bunny(); + else + LoadActualGearPalettes(); + } + return; + } + } + MorphPoof_Draw(k); +} + +void MorphPoof_Draw(int k) { // 88d3fd + static const int8 kMorphPoof_X[12] = {0, 0, 0, 0, 0, 8, 0, 8, -4, 12, -4, 12}; + static const int8 kMorphPoof_Y[12] = {0, 0, 0, 0, 0, 0, 8, 8, -4, -4, 12, 12}; + static const uint8 kMorphPoof_Flags[12] = {0, 0xff, 0xff, 0xff, 0x40, 0, 0xc0, 0x80, 0, 0x40, 0x80, 0xc0}; + static const uint8 kMorphPoof_Char[3] = {0x86, 0xa9, 0x9b}; + static const uint8 kMorphPoof_Ext[3] = {2, 0, 0}; + if (sort_sprites_setting && ancilla_floor[k] && (!flag_for_boomerang_in_place || !(frame_counter & 1))) { + oam_cur_ptr = 0x8d0; + oam_ext_cur_ptr = 0xa20 + (0xd0 >> 2); + } + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + int j = ancilla_item_to_link[k]; + uint8 ext = kMorphPoof_Ext[j]; + uint8 chr = kMorphPoof_Char[j]; + for (int i = 0; i < 4; i++, oam++) { + Ancilla_SetOam_XY(oam, info.x + kMorphPoof_X[j * 4 + i], info.y + kMorphPoof_Y[j * 4 + i]); + oam->charnum = chr; + oam->flags = kMorphPoof_Flags[j * 4 + i] | 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = ext; + if (ext == 2) + break; + } +} + +void Ancilla40_DwarfPoof(int k) { // 88d49a + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 7; + if (++ancilla_item_to_link[k] == 3) { + ancilla_type[k] = 0; + tagalong_var5 = 0; + return; + } + } + MorphPoof_Draw(k); +} + +void Ancilla3F_BushPoof(int k) { // 88d519 + static const int8 kBushPoof_Draw_X[16] = {0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, -2, 10, -2, 10}; + static const int8 kBushPoof_Draw_Y[16] = {0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, -2, -2, 10, 10}; + static const uint8 kBushPoof_Draw_Char[16] = {0x86, 0x87, 0x96, 0x97, 0xa9, 0xa9, 0xa9, 0xa9, 0x8a, 0x8b, 0x9a, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b}; + static const uint8 kBushPoof_Draw_Flags[16] = {0, 0, 0, 0, 0, 0x40, 0x80, 0xc0, 0, 0, 0, 0, 0xc0, 0x80, 0x40, 0}; + + if (ancilla_timer[k] == 0) { + ancilla_timer[k] = 7; + if (++ancilla_item_to_link[k] == 4) { + ancilla_type[k] = 0; + return; + } + } + Oam_AllocateFromRegionC(0x10); + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + + int j = ancilla_item_to_link[k] * 4; + for (int i = 0; i < 4; i++, j++, oam++) { + Ancilla_SetOam_XY(oam, pt.x + kBushPoof_Draw_X[j], pt.y + kBushPoof_Draw_Y[j]); + oam->charnum = kBushPoof_Draw_Char[j]; + oam->flags = kBushPoof_Draw_Flags[j] | 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } +} + +void Ancilla26_SwordSwingSparkle(int k) { // 88d65a + static const int8 kSwordSwingSparkle_X[48] = { + 5, 10, -1, 5, 10, -4, 5, 10, -4, -4, -1, -1, 0, 5, -1, 0, + 5, 14, 0, 5, 14, 14, -1, -1, -23, -27, -1, -23, -27, -22, -23, -27, + -22, -22, -1, -1, 32, 35, -1, 32, 35, 30, 32, 35, 30, 30, -1, -1, + }; + static const int8 kSwordSwingSparkle_Y[48] = { + -22, -18, -1, -22, -18, -17, -22, -18, -17, -17, -1, -1, 35, 40, -1, 35, + 40, 37, 35, 40, 37, 37, -1, -1, 2, 7, -1, 2, 7, 19, 2, 7, + 19, 19, -1, -1, 2, 7, -1, 2, 7, 19, 2, 7, 19, 19, -1, -1, + }; + static const uint8 kSwordSwingSparkle_Char[48] = { + 0xb7, 0xb7, 0xff, 0x80, 0x80, 0xb7, 0x83, 0x83, 0x80, 0x83, 0xff, 0xff, 0xb7, 0xb7, 0xff, 0x80, + 0x80, 0xb7, 0x83, 0x83, 0x80, 0x83, 0xff, 0xff, 0xb7, 0xb7, 0xff, 0x80, 0x80, 0xb7, 0x83, 0x83, + 0x80, 0x83, 0xff, 0xff, 0xb7, 0xb7, 0xff, 0x80, 0x80, 0xb7, 0x83, 0x83, 0x80, 0x83, 0xff, 0xff, + }; + static const uint8 kSwordSwingSparkle_Flags[48] = { + 0, 0, 0xff, 0, 0, 0, 0x80, 0x80, 0, 0x80, 0xff, 0xff, 0, 0, 0xff, 0, + 0, 0, 0x80, 0x80, 0, 0x80, 0xff, 0xff, 0, 0, 0xff, 0, 0, 0, 0x80, 0x80, + 0, 0x80, 0xff, 0xff, 0, 0, 0xff, 0, 0, 0, 0x80, 0x80, 0, 0x80, 0xff, 0xff, + }; + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 0; + if (++ancilla_item_to_link[k] == 4) { + ancilla_type[k] = 0; + return; + } + } + Ancilla_SetXY(k, link_x_coord, link_y_coord); + + Point16U info; + Ancilla_PrepOamCoord(k, &info); + + k = ancilla_item_to_link[k] * 3 + ancilla_dir[k] * 12; + + OamEnt *oam = GetOamCurPtr(); + for (int n = 2; n >= 0; n--, k++, oam++) { + uint8 chr = kSwordSwingSparkle_Char[k]; + if (chr == 0xff) + continue; + oam->charnum = chr; + oam->flags = kSwordSwingSparkle_Flags[k] | 0x4 | (oam_priority_value >> 8); + Ancilla_SetOam_XY(oam, info.x + kSwordSwingSparkle_X[k], info.y + kSwordSwingSparkle_Y[k]); + bytewise_extended_oam[oam - oam_buf] = 0; + } +} + +void Ancilla2A_SpinAttackSparkleA(int k) { // 88d7b2 + static const uint8 kInitialSpinSpark_Timer[6] = {4, 2, 3, 3, 2, 1}; + if (!submodule_index && sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 0; + if (!ancilla_timer[k]) { + int j = ++ancilla_item_to_link[k]; + ancilla_timer[k] = kInitialSpinSpark_Timer[j]; + if (j == 5) { + if (ancilla_step[k]) + AddSwordBeam(j); + else + SpinAttackSparkleA_TransmuteToNextSpark(k); + return; + } + } + } + if (!ancilla_item_to_link[k]) + return; + SpinSpark_Draw(k, -1); +} + +void SpinAttackSparkleA_TransmuteToNextSpark(int k) { // 88d86d + static const uint8 kTransmuteSpinSpark_Arr[16] = {0x21, 0x20, 0x1f, 0x1e, 3, 2, 1, 0, 0x12, 0x11, 0x10, 0xf, 0x31, 0x30, 0x2f, 0x2e}; + static const int8 kTransmuteSpinSpark_X[4] = {-3, 21, 25, -8}; + static const int8 kTransmuteSpinSpark_Y[4] = {28, -2, 24, 6}; + + ancilla_type[k] = 0x2b; + int j = link_direction_facing * 2; + swordbeam_arr[0] = kTransmuteSpinSpark_Arr[j + 0]; + swordbeam_arr[1] = kTransmuteSpinSpark_Arr[j + 1]; + swordbeam_arr[2] = kTransmuteSpinSpark_Arr[j + 2]; + swordbeam_arr[3] = swordbeam_var1 = kTransmuteSpinSpark_Arr[j + 3]; + ancilla_aux_timer[k] = 2; + ancilla_item_to_link[k] = 0x4c; + ancilla_arr3[k] = 8; + ancilla_step[k] = 0; + ancilla_L[k] = 0; + ancilla_arr1[k] = 255; + swordbeam_var2 = 20; + + swordbeam_temp_x = link_x_coord + 8; + swordbeam_temp_y = link_y_coord + 12; + + j = link_direction_facing>>1; + Ancilla_SetXY(k, + link_x_coord + kTransmuteSpinSpark_X[j], + link_y_coord + kTransmuteSpinSpark_Y[j]); + Ancilla2B_SpinAttackSparkleB(k); +} + +void Ancilla2B_SpinAttackSparkleB(int k) { // 88d8fd + static const uint8 kSpinSpark_Char[4] = {0xd7, 0xb7, 0x80, 0x83}; + + if (ancilla_L[k]) { + SpinAttackSparkleB_Closer(k); + return; + } + uint8 flags = 2; + if (!submodule_index) { + uint8 t = (ancilla_item_to_link[k] -= 3); + if (t < 13) { + ancilla_aux_timer[k] = 1; + ancilla_L[k] = 1; + ancilla_item_to_link[k] = 0; + SpinAttackSparkleB_Closer(k); + return; + } + ancilla_step[k] = (t < 0x42) ? 3 : (t == 0x46) ? 1 : (t == 0x43) ? 2 : 0; + if (sign8(--ancilla_aux_timer[k])) { + flags = 4; + ancilla_aux_timer[k] = 2; + } + } + OamEnt *oam = GetOamCurPtr(), *oam_org = oam; + int i = ancilla_step[k]; + do { + if (submodule_index == 0) + swordbeam_arr[i] = (swordbeam_arr[i] + 4) & 0x3f; + Point16U pt = Sparkle_PrepOamFromRadial(Ancilla_GetRadialProjection(swordbeam_arr[i], swordbeam_var2)); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kSpinSpark_Char[i]; + oam->flags = flags | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } while (oam++, --i >= 0); + + if (submodule_index == 0) { + if (!sign8(--ancilla_arr3[k])) + goto endif_2; + + ancilla_arr3[k] = 0; + ancilla_arr1[k] = (ancilla_arr1[k] + 1) & 3; + if (ancilla_arr1[k] == 3) + swordbeam_var1 = (swordbeam_var1 + 9) & 0x3f; + } + + uint8 t; + + t = ancilla_arr1[k]; + if (t != 3) { + static const uint8 kSpinSpark_Char2[3] = {0xb7, 0x80, 0x83}; + Point16U pt = Sparkle_PrepOamFromRadial(Ancilla_GetRadialProjection(swordbeam_var1, swordbeam_var2)); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kSpinSpark_Char2[t]; + oam->flags = 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } +endif_2: + if (ancilla_item_to_link[k] == 7) + bytewise_extended_oam[oam_org - oam_buf + 3] = 1; +} + +Point16U Sparkle_PrepOamFromRadial(AncillaRadialProjection p) { // 88da17 + Point16U pt; + pt.y = (p.r2 ? -p.r0 : p.r0) + swordbeam_temp_y - 4 - BG2VOFS_copy2; + pt.x = (p.r6 ? -p.r4 : p.r4) + swordbeam_temp_x - 4 - BG2HOFS_copy2; + return pt; +} + +void SpinAttackSparkleB_Closer(int k) { // 88da4c + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 1; + if (++ancilla_item_to_link[k] == 3) + ancilla_type[k] = 0; + } + SpinSpark_Draw(k, 4); +} + +void Ancilla30_ByrnaWindupSpark(int k) { // 88db24 + static const int8 kInitialCaneSpark_X[16] = {3, 1, 0, 0, 13, 16, 12, 12, 24, 7, -4, -10, -8, 9, 22, 26}; + static const int8 kInitialCaneSpark_Y[16] = {5, 0, -3, -6, -8, -3, 12, 28, 5, 0, 8, 16, 5, 0, 8, 16}; + static const int8 kInitialCaneSpark_Draw_X[16] = {-4, 0, 0, 0, -8, 0, -8, 0, -8, 0, -8, 0, -8, 0, -8, 0}; + static const int8 kInitialCaneSpark_Draw_Y[16] = {-4, 0, 0, 0, -8, -8, 0, 0, -8, -8, 0, 0, -8, -8, 0, 0}; + static const uint8 kInitialCaneSpark_Draw_Char[16] = {0x92, 0xff, 0xff, 0xff, 0x8c, 0x8c, 0x8c, 0x8c, 0xd6, 0xd6, 0xd6, 0xd6, 0x93, 0x93, 0x93, 0x93}; + static const uint8 kInitialCaneSpark_Draw_Flags[16] = {0x22, 0xff, 0xff, 0xff, 0x22, 0x62, 0xa2, 0xe2, 0x24, 0x64, 0xa4, 0xe4, 0x22, 0x62, 0xa2, 0xe2}; + + if (!submodule_index && sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 1; + if (++ancilla_item_to_link[k] == 17) { + ByrnaWindupSpark_TransmuteToNormal(k); + return; + } + } + if (!ancilla_item_to_link[k]) + return; + + int j = player_handler_timer; + if (j == 2) { + uint8 a = ancilla_arr3[k] - 1; + if (sign8(a)) + a = 0, j = 3; + ancilla_arr3[k] = a; + } + j += link_direction_facing * 2; + Ancilla_SetXY(k, link_x_coord + kInitialCaneSpark_X[j], link_y_coord + kInitialCaneSpark_Y[j]); + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + + uint8 a = (ancilla_item_to_link[k] - 1) & 0xf; + j = 0; + if (a != 0) + j = 4 * ((a != 15) ? (a & 1) + 1 : 3); + + OamEnt *oam = GetOamCurPtr(); + for (int i = 0; i < 4; i++, j++) { + if (kInitialCaneSpark_Draw_Char[j] != 255) { + Ancilla_SetOam_XY(oam, pt.x + kInitialCaneSpark_Draw_X[j], pt.y + kInitialCaneSpark_Draw_Y[j]); + oam->charnum = kInitialCaneSpark_Draw_Char[j]; + oam->flags = kInitialCaneSpark_Draw_Flags[j] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } +} + +void ByrnaWindupSpark_TransmuteToNormal(int k) { // 88dc21 + static const uint8 kCaneSpark_Transmute_Tab[16] = {0x34, 0x33, 0x32, 0x31, 0x16, 0x15, 0x14, 0x13, 0x2a, 0x29, 0x28, 0x27, 0x10, 0xf, 0xe, 0xd}; + + ancilla_type[k] = 0x31; + int j = link_direction_facing << 1; + swordbeam_arr[0] = kCaneSpark_Transmute_Tab[j + 0]; + swordbeam_arr[1] = kCaneSpark_Transmute_Tab[j + 1]; + swordbeam_arr[2] = kCaneSpark_Transmute_Tab[j + 2]; + swordbeam_arr[3] = kCaneSpark_Transmute_Tab[j + 3]; + ancilla_aux_timer[k] = 0x17; + ancilla_G[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_arr3[k] = 8; + ancilla_step[k] = 0; + ancilla_L[k] = 0; + ancilla_arr1[k] = 2; + ancilla_timer[k] = 21; + swordbeam_var2 = 20; + Ancilla_Sfx3_Near(0x30); + Ancilla31_ByrnaSpark(k); +} + +void Ancilla31_ByrnaSpark(int k) { // 88dc70 + static const uint8 kCaneSpark_Magic[3] = {4, 2, 1}; + + uint8 flags = 2; + if (submodule_index == 0) { + if (eq_selected_y_item != 13) { +kill_me: + link_disable_sprite_damage = 0; + ancilla_type[k] = 0; + link_give_damage = 0; + return; + } + link_disable_sprite_damage = 1; + if (!--ancilla_aux_timer[k]) { + ancilla_aux_timer[k] = 1; + uint8 r0 = kCaneSpark_Magic[link_magic_consumption]; + if (!link_magic_power || (uint8)(r0 = link_magic_power - r0) >= 0x80) + goto kill_me; + + if (sign8(--ancilla_G[k])) { + ancilla_G[k] = 0x17; + link_magic_power = r0; + } + if (filtered_joypad_H & 0x40) + goto kill_me; + } + if (ancilla_step[k] != 3) { + uint8 a = ++ancilla_item_to_link[k]; + ancilla_step[k] = (a >= 4) ? 3 : (a == 2) ? 1 : (a == 3) ? 2 : 0; + } + if (sign8(--ancilla_arr1[k])) { + ancilla_arr1[k] = 2; + flags = 4; + } + } + + int z = (int8)link_z_coord; + if (z == -1) + z = 0; + swordbeam_temp_y = link_y_coord + 12 - z; + swordbeam_temp_x = link_x_coord + 8; + if (!ancilla_timer[k]) { + ancilla_timer[k] = 21; + Ancilla_Sfx3_Near(0x30); + } + OamEnt *oam = GetOamCurPtr(); + int i = ancilla_step[k]; + do { + static const uint8 kCaneSpark_Char[4] = {0xd7, 0xb7, 0x80, 0x83}; + if (!submodule_index) + swordbeam_arr[i] = (swordbeam_arr[i] + 3) & 0x3f; + Point16U pt = Sparkle_PrepOamFromRadial(Ancilla_GetRadialProjection(swordbeam_arr[i], swordbeam_var2)); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kCaneSpark_Char[i]; + oam->flags = flags | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + + Ancilla_SetXY(k, pt.x + BG2HOFS_copy2, pt.y + BG2VOFS_copy2); + ancilla_dir[k] = 0; + Ancilla_CheckSpriteCollision(k); + } while (oam++, --i >= 0); +} + +void Ancilla_SwordBeam(int k) { // 88ddc5 + uint8 flags = 2; + + if (!submodule_index) { + Ancilla_SetXY(k, swordbeam_temp_x, swordbeam_temp_y); + Ancilla_MoveX(k); + Ancilla_MoveY(k); + swordbeam_temp_x = Ancilla_GetX(k); + swordbeam_temp_y = Ancilla_GetY(k); + + if ((ancilla_G[k]++ & 0xf) == 0) { + sound_effect_2 = Ancilla_CalculateSfxPan(k) | 1; + } + + if (Ancilla_CheckSpriteCollision(k) >= 0 || Ancilla_CheckTileCollision(k)) { + static const int8 kSwordBeam_Yvel2[4] = {0, 0, -6, -6}; + static const int8 kSwordBeam_Xvel2[4] = {-8, -10, 0, 0}; + int j = ancilla_dir[k]; + Ancilla_SetXY(k, + Ancilla_GetX(k) + kSwordBeam_Xvel2[j], + Ancilla_GetY(k) + kSwordBeam_Yvel2[j]); + ancilla_type[k] = 4; + ancilla_timer[k] = 7; + ancilla_numspr[k] = 0x10; + return; + } + if (sign8(--ancilla_aux_timer[k])) { + flags = 4; + ancilla_aux_timer[k] = 2; + } + } + + OamEnt *oam = GetOamCurPtr(); + uint8 s = ancilla_S[k]; + for (int i = 3; i >= 0; i--, oam++) { + static const uint8 kSwordBeam_Char[4] = {0xd7, 0xb7, 0x80, 0x83}; + if (submodule_index == 0) + swordbeam_arr[i] = (swordbeam_arr[i] + s) & 0x3f; + Point16U pt = Sparkle_PrepOamFromRadial(Ancilla_GetRadialProjection(swordbeam_arr[i], swordbeam_var2)); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kSwordBeam_Char[i]; + oam->flags = flags | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } + + if (submodule_index == 0) { + if (!sign8(--ancilla_arr3[k])) + goto endif_2; + + ancilla_arr3[k] = 0; + ancilla_arr1[k] = (ancilla_arr1[k] + 1) & 3; + if (ancilla_arr1[k] == 3) + swordbeam_var1 = (swordbeam_var1 + s) & 0x3f; + } + + uint8 t; + + t = ancilla_arr1[k]; + if (t != 3) { + static const uint8 kSwordBeam_Char2[3] = {0xb7, 0x80, 0x83}; + Point16U pt = Sparkle_PrepOamFromRadial(Ancilla_GetRadialProjection(swordbeam_var1, swordbeam_var2)); + Ancilla_SetOam_XY(oam, pt.x, pt.y); + oam->charnum = kSwordBeam_Char2[t]; + oam->flags = 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } +endif_2: + oam -= 4; + for (int i = 0; i < 4; i++) { + if (oam[i].y != 0xf0) + return; + } + ancilla_type[k] = 0; +} + +void Ancilla0D_SpinAttackFullChargeSpark(int k) { // 88ddca + static const int8 kSwordFullChargeSpark_Y[4] = {-8, 27, 12, 12}; + static const int8 kSwordFullChargeSpark_X[4] = {4, 4, -13, 20}; + static const uint8 kSwordFullChargeSpark_Flags[4] = {0x20, 0x10, 0x30, 0x20}; + + ancilla_oam_idx[k] = Ancilla_AllocateOamFromRegion_A_or_D_or_F(k, 4); + + if (!ancilla_timer[k]) { + ancilla_type[k] = 0; + return; + } + + int j = link_direction_facing >> 1; + + uint16 x = link_x_coord + kSwordFullChargeSpark_X[j] - BG2HOFS_copy2; + uint16 y = link_y_coord + kSwordFullChargeSpark_Y[j] - BG2VOFS_copy2; + + oam_priority_value = kSwordFullChargeSpark_Flags[ancilla_floor[k]] << 8; + OamEnt *oam = GetOamCurPtr(); + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = 0xd7; + oam->flags = HIBYTE(oam_priority_value) | 2; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Ancilla27_Duck(int k) { // 88dde8 + CheckPlayerCollOut coll; + int j; + + if (submodule_index) + goto endif_1; + + if (ancilla_timer[k]) { + Ancilla_SetXY(k, BG2HOFS_copy2 - 16, link_y_coord - 8); + return; + } + + if (sign8(--ancilla_G[k])) { + ancilla_G[k] = 0x28; + Ancilla_Sfx3_Pan(k, 0x1e); + } + + if (ancilla_L[k] || ancilla_step[k] && (flag_unk1++, true)) { + ancilla_z_vel[k]--; + Ancilla_MoveZ(k); + } + Ancilla_MoveX(k); + + + if (ancilla_L[k]) { + uint16 x = Ancilla_GetX(k); + if (ancilla_step[k]) + flag_unk1++; + if (!sign16(x) && x >= link_x_coord) { + if (ancilla_step[k]) { + ancilla_step[k] = 0; + link_visibility_status = 0; + tagalong_var5 = 0; + link_pose_for_item = 0; + ancilla_y_vel[k] = 0; + flag_is_link_immobilized = 0; + link_disable_sprite_damage = 0; + byte_7E03FD = 0; + countdown_for_blink = 144; + if (!((savegame_tagalong == 12 || savegame_tagalong == 13) && super_bomb_going_off)) { + Follower_Initialize(); + } + } + } else if ((uint16)(link_x_coord - x) < 48) { + j = 3; + goto endif_5; + } + goto endif_1; + } + + if (!Ancilla_CheckLinkCollision(k, 1, &coll) || main_module_index == 15) + goto endif_1; + + if (!player_is_indoors) { + if (link_player_handler_state == 8 || link_player_handler_state == 9 || link_player_handler_state == 10 || + player_near_pit_state == 2 || + (link_pose_for_item | related_to_hookshot | link_force_hold_sword_up | link_disable_sprite_damage) || + (link_state_bits & 0x80)) + goto endif_1; + for (int i = 4; i >= 0; i--) { + uint8 a = ancilla_type[i]; + if (a == 0x2a || a == 0x1f || a == 0x30 || a == 0x31 || a == 0x41) + ancilla_type[i] = 0; + } + if (savegame_tagalong == 9) { + savegame_tagalong = 0; + tagalong_var5 = 0; + } + } + link_state_bits = 0; + link_picking_throw_state = 0; + + bg1_x_offset = 0; + bg1_y_offset = 0; + Link_ResetProperties_A(); + link_is_in_deep_water = 0; + link_need_for_pullforrupees_sprite = 0; + link_visibility_status = 12; + link_player_handler_state = 0; + link_pose_for_item = 1; + flag_is_link_immobilized = 1; + link_disable_sprite_damage = 1; + tagalong_var5 = 1; + ancilla_step[k] = 2; + flag_unk1++; + link_give_damage = 0; + if (player_is_indoors) + byte_7E03FD = player_is_indoors; +endif_1: + if (sign8(--ancilla_arr3[k])) { + ancilla_arr3[k] = 3; + if (++ancilla_K[k] == 3) + ancilla_K[k] = 0; + } + j = ancilla_K[k]; +endif_5: + BYTE(flag_travel_bird) = kTravelBird_DmaStuffs[j]; + + Point16U info; + Ancilla_PrepOamCoord(k, &info); + + OamEnt *oam = GetOamCurPtr(); + int z = ancilla_z[k] ? ancilla_z[k] | ~0xff : 0; + int i = 0, n = ancilla_step[k] + 1; + do { + Ancilla_SetOam_XY(oam, info.x + (int8)kTravelBird_Draw_X[i], info.y + z + (int8)kTravelBird_Draw_Y[i]); + oam->charnum = kTravelBird_Draw_Char[i]; + oam->flags = kTravelBird_Draw_Flags[i] | 0x30; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + } while (++i != n); + + AncillaDraw_Shadow(oam, 1, info.x, info.y + 28, 0x30); + oam += 2; + if (ancilla_step[k]) + AncillaDraw_Shadow(oam, 1, info.x - 7, info.y + 28, 0x30); + + if (!sign16(info.x) && info.x >= 0x130) { + ancilla_type[k] = 0; + if (!ancilla_L[k] && ancilla_step[k]) { + submodule_index = 10; + saved_module_for_menu = main_module_index; + main_module_index = 14; + } + } +} + +void AncillaAdd_SomariaBlock(uint8 type, uint8 y) { // 88e078 + int k = AncillaAdd_AddAncilla_Bank08(type, y); + if (k < 0) { + Refund_Magic(4); + return; + } + for (int j = 4; j >= 0; j--) { + if (j == k || ancilla_type[j] != 0x2c) + continue; + if (j == flag_is_ancilla_to_pick_up - 1) + flag_is_ancilla_to_pick_up = 0; + AncillaAdd_ExplodingSomariaBlock(j); + ancilla_type[k] = 0; + dung_flag_somaria_block_switch = 0; + if (link_speed_setting == 0x12) { + bitmask_of_dragstate = 0; + link_speed_setting = 0; + } + return; + } + + Ancilla_Sfx3_Near(0x2a); + ancilla_step[k] = 0; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 0; + ancilla_arr3[k] = 0; + ancilla_arr1[k] = 0; + ancilla_H[k] = 0; + ancilla_G[k] = 12; + ancilla_timer[k] = 18; + ancilla_L[k] = 0; + ancilla_z[k] = 0; + ancilla_K[k] = 0; + ancilla_R[k] = 0; + ancilla_arr4[k] = 0; + ancilla_S[k] = 9; + ancilla_T[k] = 0; + ancilla_dir[k] = link_direction_facing >> 1; + if (Ancilla_CheckInitialTileCollision_Class2(k)) { + Ancilla_SetX(k, link_x_coord + 8); + Ancilla_SetY(k, link_y_coord + 16); + } else { + static const int8 kCaneOfSomaria_Y[4] = { -8, 31, 17, 17 }; + static const int8 kCaneOfSomaria_X[4] = { 8, 8, -8, 23 }; + int j = link_direction_facing >> 1; + Ancilla_SetX(k, link_x_coord + kCaneOfSomaria_X[j]); + Ancilla_SetY(k, link_y_coord + kCaneOfSomaria_Y[j]); + SomariaBlock_CheckForTransitTile(k); + } +} + +void SomariaBlock_CheckForTransitTile(int k) { // 88e191 + static const int8 kSomariaTransitLine_X[12] = { -8, 0, 8, -8, 0, 8, -16, -16, -16, 16, 16, 16 }; + static const int8 kSomariaTransitLine_Y[12] = { -16, -16, -16, 16, 16, 16, -8, 0, 8, -8, 0, 8 }; + if (!dung_unk6) + return; + for (int j = 11; j >= 0; j--) { + uint16 x = Ancilla_GetX(k) + kSomariaTransitLine_X[j]; + uint16 y = Ancilla_GetY(k) + kSomariaTransitLine_Y[j]; + uint8 bak = ancilla_objprio[k]; + Ancilla_CheckTileCollision_targeted(k, x, y); + ancilla_objprio[k] = bak; + if (ancilla_tile_attr[k] == 0xb6 || ancilla_tile_attr[k] == 0xbc) { + Ancilla_SetX(k, x); + Ancilla_SetY(k, y); + AncillaAdd_SomariaPlatformPoof(k); + return; + } + } +} + +int Ancilla_CheckBasicSpriteCollision(int k) { // 88e1f9 + for (int j = 15; j >= 0; j--) { + if (((j ^ frame_counter) & 3 | sprite_pause[j] | sprite_hit_timer[j]) != 0) + continue; + if (sprite_state[j] < 9 || !(sprite_defl_bits[j] & 2) && ancilla_objprio[k]) + continue; + if (ancilla_floor[k] != sprite_floor[j]) + continue; + if (ancilla_type[k] == 0x2c && (sprite_type[j] == 0x1e || sprite_type[j] == 0x90)) + continue; + if (Ancilla_CheckBasicSpriteCollision_Single(k, j)) + return j; + } + return -1; +} + +bool Ancilla_CheckBasicSpriteCollision_Single(int k, int j) { // 88e23d + SpriteHitBox hb; + Ancilla_SetupBasicHitBox(k, &hb); + Sprite_SetupHitBox(j, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + return false; + if (sprite_type[j] == 0x92 && sprite_C[j] < 3) + return true; + if (sprite_type[j] == 0x80 && sprite_delay_aux4[j] == 0) { + sprite_delay_aux4[j] = 24; + sprite_D[j] ^= 1; + } + if (sprite_ignore_projectile[j]) + return false; + + int x = Ancilla_GetX(k) - 8, y = Ancilla_GetY(k) - 8 - ancilla_z[k]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(j, x, y, 80); + sprite_y_recoil[j] = ~pt.y; + sprite_x_recoil[j] = ~pt.x; + Ancilla_CheckDamageToSprite(j, ancilla_type[k]); + return true; +} + +void Ancilla_SetupBasicHitBox(int k, SpriteHitBox *hb) { // 88e2ca + int x = Ancilla_GetX(k) - 8; + hb->r0_xlo = x; + hb->r8_xhi = x >> 8; + int y = Ancilla_GetY(k) - 8 - ancilla_z[k]; + hb->r1_ylo = y; + hb->r9_yhi = y >> 8; + hb->r2 = 15; + hb->r3 = 15; +} + +void Ancilla2C_SomariaBlock(int k) { // 88e365 + if (!sign8(--ancilla_G[k])) + return; + ancilla_G[k] = 0; + + if (ancilla_H[k]) + goto label_1; + if (submodule_index == 0 || submodule_index == 8 || submodule_index == 16) { + Ancilla_HandleLiftLogic(k); + } else if (k + 1 == flag_is_ancilla_to_pick_up && ancilla_K[k] != 0) { + if (ancilla_K[k] != 3) { + Ancilla_LatchLinkCoordinates(k, 3); + Ancilla_LatchAltitudeAboveLink(k); + ancilla_K[k] = 3; + } + Ancilla_LatchCarriedPosition(k); + } + if (player_is_indoors) { + if (!ancilla_K[k] && !(link_state_bits & 0x80) && (ancilla_z[k] == 0 || ancilla_z[k] == 0xff)) { + if (dung_unk6) { + int j = frame_counter & 3; + do { + uint8 bak = ancilla_objprio[k]; + uint16 x = Ancilla_GetX(k) + kSomarianBlock_Coll_X[j]; + uint16 y = Ancilla_GetY(k) + kSomarianBlock_Coll_Y[j]; + Ancilla_CheckTileCollision_targeted(k, x, y); + ancilla_objprio[k] = bak; + if (ancilla_tile_attr[k] == 0xb6 || ancilla_tile_attr[k] == 0xbc) { + Ancilla_SetXY(k, x, y); + AncillaAdd_SomariaPlatformPoof(k); + if (k + 1 == flag_is_ancilla_to_pick_up) + flag_is_ancilla_to_pick_up = 0; + return; + } + } while ((j += 4) < 12); + } else { + if (!SomariaBlock_CheckForSwitch(k) && (ancilla_z[k] == 0 || ancilla_z[k] == 0xff)) + dung_flag_somaria_block_switch++; + } + } else { +label_1: + if (flag_is_ancilla_to_pick_up == k + 1) + dung_flag_somaria_block_switch = 0; + } + } + + uint16 old_y = Ancilla_LatchYCoordToZ(k); + uint8 s1a = ancilla_dir[k]; + uint8 s1b = ancilla_objprio[k]; + ancilla_objprio[k] = 0; + bool flag = Ancilla_CheckTileCollision_Class2(k); + + if (player_is_indoors && ancilla_L[k] && ancilla_tile_attr[k] == 0x1c) + ancilla_T[k] = 1; + +label1: + if (flag && (!(link_state_bits & 0x80) || link_picking_throw_state)) { + if (!s1b && !ancilla_arr4[k] && ancilla_z[k]) { + ancilla_arr4[k] = 1; + int qq = (ancilla_dir[k] == 1) ? 16 : 4; + if (ancilla_y_vel[k]) + ancilla_y_vel[k] = sign8(ancilla_y_vel[k]) ? qq : -qq; + if (ancilla_x_vel[k]) + ancilla_x_vel[k] = sign8(ancilla_x_vel[k]) ? 4 : -4; + if (ancilla_dir[k] == 1 && ancilla_z[k]) { + ancilla_y_vel[k] = -4; + ancilla_L[k] = 2; + } + } + } else if (!(link_state_bits & 0x80) && (ancilla_z[k] == 0 || ancilla_z[k] == 0xff)) { + ancilla_dir[k] = 16; + uint8 bak0 = ancilla_objprio[k]; + Ancilla_CheckTileCollision(k); + ancilla_objprio[k] = bak0; + uint8 a = ancilla_tile_attr[k]; + if (a == 0x26) { + flag = true; + goto label1; + } else if (a == 0xc || a == 0x1c) { + if (dung_hdr_collision != 3) { + if (ancilla_floor[k] == 0 && ancilla_z[k] != 0 && ancilla_z[k] != 0xff) + ancilla_floor[k] = 1; + } else { + old_y = Ancilla_GetY(k) + dung_floor_y_vel; + Ancilla_SetX(k, Ancilla_GetX(k) + dung_floor_x_vel); + } + } else if (a == 0x20 || (a & 0xf0) == 0xb0 && a != 0xb6 && a != 0xbc) { + if (!(link_state_bits & 0x80)) { + if (k + 1 == flag_is_ancilla_to_pick_up) + flag_is_ancilla_to_pick_up = 0; + if (!ancilla_timer[k]) { + if (link_speed_setting == 18) { + link_speed_setting = 0; + bitmask_of_dragstate = 0; + } + ancilla_type[k] = 0; + return; + } + } + } else if (a == 8) { + if (k + 1 == flag_is_ancilla_to_pick_up) + flag_is_ancilla_to_pick_up = 0; + if (ancilla_timer[k] == 0) { + Ancilla_SetY(k, Ancilla_GetY(k) - 24); + Ancilla_TransmuteToSplash(k); + return; + } + } else if (a == 0x68 || a == 0x69 || a == 0x6a || a == 0x6b) { + Ancilla_ApplyConveyor(k); + old_y = Ancilla_GetY(k); + } else { + ancilla_timer[k] = (ancilla_L[k] | ancilla_H[k]) ? 0 : 2; + } + } + // endif_3 + s1b |= ancilla_objprio[k]; + + if (!(link_state_bits & 0x80) && !--ancilla_S[k]) { + ancilla_S[k] = 1; + ancilla_objprio[k] = 0; + if (Ancilla_CheckBasicSpriteCollision(k) >= 0) { + ancilla_S[k] = 7; + if (++ancilla_step[k] == 5) { + SomariaBlock_FizzleAway(k); + return; + } + } + } + Ancilla_SetY(k, old_y); + ancilla_dir[k] = s1a; + ancilla_objprio[k] = s1b; + + AncillaDraw_SomariaBlock(k); +} + +void AncillaDraw_SomariaBlock(int k) { // 88e61b + static const int8 kSomarianBlock_Draw_X[12] = {-8, 0, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + static const int8 kSomarianBlock_Draw_Y[12] = {-8, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + static const uint8 kSomarianBlock_Draw_Flags[12] = {0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0}; + + if (k + 1 == flag_is_ancilla_to_pick_up && link_state_bits & 0x80 && ancilla_K[k] != 3 && link_direction_facing == 0) { + Ancilla_AllocateOamFromRegion_B_or_E(ancilla_numspr[k]); + } else if (sort_sprites_setting && ancilla_floor[k] && (ancilla_L[k] || k + 1 == flag_is_ancilla_to_pick_up && (link_state_bits & 0x80))) { + oam_cur_ptr = 0x8d0; + oam_ext_cur_ptr = 0xa20 + 0x34; + } + + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(), *oam_org = oam; + int z = (int8)ancilla_z[k]; + if (z != 0 && z != -1 && ancilla_K[k] != 3 && ancilla_objprio[k]) + oam_priority_value = 0x3000; + pt.y -= z; + int j = ancilla_arr1[k] * 4; + int r8 = 0; + do { + uint8 t = Ancilla_SetOam_XY_safe(oam, pt.x + kSomarianBlock_Draw_X[j], pt.y + kSomarianBlock_Draw_Y[j]); + oam->charnum = 0xe9; + oam->flags = kSomarianBlock_Draw_Flags[j] & ~0x30 | 2 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = t; + oam++; + } while (j++, ++r8 & 3); + + if (SomarianBlock_CheckEmpty(oam_org)) { + dung_flag_somaria_block_switch = 0; + ancilla_type[k] = 0; + if (k + 1 == flag_is_ancilla_to_pick_up) { + flag_is_ancilla_to_pick_up = 0; + if (link_state_bits & 128) + link_state_bits = 0; + } + } +} + +bool SomariaBlock_CheckForSwitch(int k) { // 88e75c + static const int8 kSomarianBlock_CheckCover_X[4] = {0, 0, -4, 4}; + static const int8 kSomarianBlock_CheckCover_Y[4] = {-4, 4, 0, 0}; + dung_flag_somaria_block_switch = 0; + ancilla_arr24[k] = 0; + for (int j = 3; j >= 0; j--) { + uint16 y = Ancilla_GetY(k) + kSomarianBlock_CheckCover_Y[j]; + uint16 x = Ancilla_GetX(k) + kSomarianBlock_CheckCover_X[j]; + uint8 bak = ancilla_objprio[k]; + Ancilla_CheckTileCollision_targeted(k, x, y); + ancilla_objprio[k] = bak; + uint8 a = ancilla_tile_attr[k]; + if (a == 0x23 || a == 0x24 || a == 0x25 || a == 0x3b) + ancilla_arr24[k]++; + } + return ancilla_arr24[k] != 4; +} + +void SomariaBlock_FizzleAway(int k) { // 88e9b2 + if (link_speed_setting == 18) { + bitmask_of_dragstate = 0; + link_speed_setting = 0; + } + dung_flag_somaria_block_switch = 0; + ancilla_type[k] = 0x2d; + ancilla_aux_timer[k] = 0; + ancilla_step[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_arr3[k] = 0; + ancilla_arr1[k] = 0; + ancilla_R[k] = 0; + if (k + 1 == flag_is_ancilla_to_pick_up) { + flag_is_ancilla_to_pick_up = 0; + link_state_bits &= 0x80; + } + Ancilla2D_SomariaBlockFizz(k); +} + +void Ancilla2D_SomariaBlockFizz(int k) { // 88e9e8 + static const int8 kSomariaBlockFizzle_X[6] = {-4, -1, -8, 0, -6, -2}; + static const int8 kSomariaBlockFizzle_Y[6] = {-4, -1, -4, -4, -4, -4}; + static const uint8 kSomariaBlockFizzle_Char[6] = {0x92, 0xff, 0xf9, 0xf9, 0xf9, 0xf9}; + static const uint8 kSomariaBlockFizzle_Flags[6] = {6, 0xff, 0x86, 0xc6, 0x86, 0xc6}; + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 3; + if (++ancilla_item_to_link[k] == 3) { + ancilla_type[k] = 0; + return; + } + } + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + uint8 z = ancilla_z[k]; + if (z == 0xff) + z = 0; + int x = pt.x, y = pt.y - (int8)z; + int j = ancilla_item_to_link[k] * 2; + for (int i = 0; i < 2; i++, j++, oam++) { + if (kSomariaBlockFizzle_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, x + kSomariaBlockFizzle_X[j], y + kSomariaBlockFizzle_Y[j]); + oam->charnum = kSomariaBlockFizzle_Char[j]; + oam->flags = kSomariaBlockFizzle_Flags[j] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } + } +} + +void Ancilla39_SomariaPlatformPoof(int k) { // 88ea83 + static const uint8 kSomarianPlatformPoof_Tab0[4] = {1, 0, 3, 2}; + if (!sign8(--ancilla_aux_timer[k])) + return; + ancilla_type[k] = 0; + SpriteSpawnInfo info; + int x = Ancilla_GetX(k) & ~7 | 4, y = Ancilla_GetY(k) & ~7 | 4; + uint8 floor = ancilla_floor[k]; + int j = Sprite_SpawnDynamically(k, 0xed, &info); // wtf + if (j >= 0) { + player_on_somaria_platform = 0; + Sprite_SetX(j, x); + Sprite_SetY(j, y); + + int pos = ((x & 0x1f8) >> 3) + ((y & 0x1f8) << 3) + (floor >= 1 ? 0x1000 : 0); + + int t = 0; + if ((dung_bg2_attr_table[pos + XY(0, -1)] & 0xf0) != 0xb0) { + t += 1; + if ((dung_bg2_attr_table[pos + XY(0, 1)] & 0xf0) != 0xb0) { + t += 1; + if ((dung_bg2_attr_table[pos + XY(-1, 0)] & 0xf0) != 0xb0) { + t += 1; + } + } + } + sprite_D[j] = kSomarianPlatformPoof_Tab0[t]; + sprite_floor[j] = 0; + } else { + AncillaDraw_SomariaBlock(k); + } +} + +void Ancilla2E_SomariaBlockFission(int k) { // 88eb3e + static const int8 kSomarianBlockDivide_X[16] = {-8, 0, -8, 0, -10, -10, 2, 2, -8, 0, -8, 0, -12, -12, 4, 4}; + static const int8 kSomarianBlockDivide_Y[16] = {-10, -10, 2, 2, -8, 0, -8, 0, -12, -12, 4, 4, -8, 0, -8, 0}; + static const uint8 kSomarianBlockDivide_Char[16] = {0xc6, 0xc6, 0xc6, 0xc6, 0xc4, 0xc4, 0xc4, 0xc4, 0xd2, 0xd2, 0xd2, 0xd2, 0xc5, 0xc5, 0xc5, 0xc5}; + static const uint8 kSomarianBlockDivide_Flags[16] = {0xc6, 0x86, 0x46, 6, 0x46, 0xc6, 6, 0x86, 0xc6, 0x86, 0x46, 6, 0x46, 0xc6, 6, 0x86}; + + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 3; + if (++ancilla_item_to_link[k] == 2) { + ancilla_type[k] = 0; + SomariaBlock_SpawnBullets(k); + return; + } + } + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(), *oam_org = oam; + + int8 z = ancilla_z[k] + (ancilla_K[k] == 3 && BYTE(link_z_coord) != 0xff ? BYTE(link_z_coord) : 0); + int j = ancilla_item_to_link[k] * 8; + for (int i = 0; i != 8; i++, j++, oam++) { + Ancilla_SetOam_XY(oam, pt.x + kSomarianBlockDivide_X[j], pt.y + kSomarianBlockDivide_Y[j] - z); + oam->charnum = kSomarianBlockDivide_Char[j]; + oam->flags = kSomarianBlockDivide_Flags[j] & ~0x30 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; + } +} + +void Ancilla2F_LampFlame(int k) { // 88ec13 + static const uint8 kLampFlame_Draw_Char[12] = {0x9c, 0x9c, 0xff, 0xff, 0xa4, 0xa5, 0xb2, 0xb3, 0xe3, 0xf3, 0xff, 0xff}; + static const int8 kLampFlame_Draw_Y[12] = {-3, 0, 0, 0, 0, 0, 8, 8, 0, 8, 0, 0}; + static const int8 kLampFlame_Draw_X[12] = {4, 10, 0, 0, 1, 9, 2, 7, 4, 4, 0, 0}; + + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + if (!ancilla_timer[k]) { + ancilla_type[k] = 0; + return; + } + int j = (ancilla_timer[k] & 0xf8) >> 1; + do { + if (kLampFlame_Draw_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, pt.x + kLampFlame_Draw_X[j], pt.y + kLampFlame_Draw_Y[j]); + oam->charnum = kLampFlame_Draw_Char[j]; + oam->flags = HIBYTE(oam_priority_value) | 2; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + } while (++j & 3); +} + +void Ancilla41_WaterfallSplash(int k) { // 88ecaf + if (!Ancilla_CheckForEntranceTrigger(player_is_indoors ? 0 : 1)) { + ancilla_type[k] = 0; + return; + } + + if (!submodule_index && !(frame_counter & 7)) + Ancilla_Sfx2_Near(0x1c); + + draw_water_ripples_or_grass = 1; + if (!sign8(link_animation_steps - 6)) + link_animation_steps -= 6; + + if (!ancilla_timer[k]) { + ancilla_timer[k] = 2; + ancilla_item_to_link[k] = (ancilla_item_to_link[k] + 1) & 3; + } + + if (player_is_indoors && BYTE(link_y_coord) < 0x38) { + Ancilla_SetY(k, 0xd38); + } else { + Ancilla_SetY(k, link_y_coord); + } + Ancilla_SetX(k, link_x_coord); + + static const int8 kWaterfallSplash_X[8] = {0, 0, -4, 4, -7, 7, -9, 17}; + static const int8 kWaterfallSplash_Y[8] = {-4, 0, -5, -5, -3, -3, 12, 12}; + static const uint8 kWaterfallSplash_Char[8] = {0xc0, 0xff, 0xac, 0xac, 0xae, 0xae, 0xbf, 0xbf}; + static const uint8 kWaterfallSplash_Flags[8] = {0x84, 0xff, 0x84, 0xc4, 0x84, 0xc4, 0x84, 0xc4}; + static const uint8 kWaterfallSplash_Ext[8] = {2, 0xff, 2, 2, 2, 2, 0, 0}; + + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + + uint8 z = link_z_coord; + pt.y -= (sign8(z) ? 0 : z); + + int j = ancilla_item_to_link[k] * 2; + for (int i = 0; i != 2; i++, j++, oam++) { + if (kWaterfallSplash_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, pt.x + kWaterfallSplash_X[j], pt.y + kWaterfallSplash_Y[j]); + oam->charnum = kWaterfallSplash_Char[j]; + oam->flags = kWaterfallSplash_Flags[j] | 0x30; + bytewise_extended_oam[oam - oam_buf] = kWaterfallSplash_Ext[j]; + } + } +} + +void Ancilla24_Gravestone(int k) { // 88ee01 + static const uint8 kAncilla_Gravestone_Char[4] = {0xc8, 0xc8, 0xd8, 0xd8}; + static const uint8 kAncilla_Gravestone_Flags[4] = {0, 0x40, 0, 0x40}; + Point16U pt; + Ancilla_PrepAdjustedOamCoord(k, &pt); + Oam_AllocateFromRegionB(16); + OamEnt *oam = GetOamCurPtr(); + uint16 x = pt.x, y = pt.y; + for (int i = 0; i < 4; i++, oam++) { + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kAncilla_Gravestone_Char[i]; + oam->flags = kAncilla_Gravestone_Flags[i] | 0x3d; + bytewise_extended_oam[oam - oam_buf] = 2; + x += 16; + if (i == 1) + x -= 32, y += 8; + } +} + +void Ancilla34_SkullWoodsFire(int k) { // 88ef9a + static const int8 kSkullWoodsFire_Draw_Y[4] = {0, 0, 0, -3}; + static const uint8 kSkullWoodsFire_Draw_Char[4] = {0x8e, 0xa0, 0xa2, 0xa4}; + static const uint8 kSkullWoodsFire_Draw_Ext[4] = {2, 2, 2, 0}; + static const int8 kSkullWoodsFire_Draw2_X[24] = { + -13, -21, -10, -1, -1, -1, -16, -27, -4, -16, -6, -25, -16, -27, -4, -16, + -6, -25, -13, -5, -27, -11, -22, -3, + }; + static const int8 kSkullWoodsFire_Draw2_Y[24] = { + -31, -24, -22, -1, -1, -1, -37, -32, -32, -23, -16, -14, -37, -32, -32, -23, + -16, -14, -35, -29, -28, -20, -13, -11, + }; + static const uint8 kSkullWoodsFire_Draw2_Char[24] = { + 0x86, 0x86, 0x86, 0xff, 0xff, 0xff, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, + }; + static const uint8 kSkullWoodsFire_Draw2_Flags[24] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x80, 0x40, 0x40, 0x80, 0x40, 0, + }; + static const uint8 kSkullWoodsFire_Draw2_Ext[24] = { + 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 0, 0, 0, 0, + }; + if (skullwoodsfire_var4 && ancilla_item_to_link[k] != 4 && sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 5; + ancilla_item_to_link[k]++; + } + OamEnt *oam = GetOamCurPtr(); + for(int k = 3; k >= 0; k--) { + if (sign8(--skullwoodsfire_var5[k])) { + skullwoodsfire_var5[k] = 5; + if (skullwoodsfire_var0[k] == 128) + goto endif_2; + if (++skullwoodsfire_var0[k] != 0) { + if (skullwoodsfire_var0[k] != 4) + goto endif_2; + skullwoodsfire_var0[k] = 0; + } + skullwoodsfire_var9 -= 8; + if (skullwoodsfire_var9 < 200 && skullwoodsfire_var4 != 1) { + skullwoodsfire_var4 = 1; + sound_effect_1 = kBombos_Sfx[(uint8)(0x98 - BG2HOFS_copy2) >> 5] | 0xc; + } + if (skullwoodsfire_var9 < 168) + skullwoodsfire_var0[k] = 128; + skullwoodsfire_x_arr[k] = skullwoodsfire_var11; + skullwoodsfire_y_arr[k] = skullwoodsfire_var9; + if (sound_effect_1 == 0) + sound_effect_1 = kBombos_Sfx[(uint8)(skullwoodsfire_var11 - BG2HOFS_copy2) >> 5] | 0x2a; + } +endif_2: + if (!sign8(skullwoodsfire_var0[k])) { + int j = skullwoodsfire_var0[k]; + uint16 x = skullwoodsfire_x_arr[k] - BG2HOFS_copy2; + uint16 y = skullwoodsfire_y_arr[k] - BG2VOFS_copy2 + kSkullWoodsFire_Draw_Y[j]; + Ancilla_SetOam_XY(oam, x, y); + oam->charnum = kSkullWoodsFire_Draw_Char[j]; + oam->flags = 0x32; + uint8 ext = kSkullWoodsFire_Draw_Ext[j]; + bytewise_extended_oam[oam - oam_buf] = ext; + oam++; + if (kSkullWoodsFire_Draw_Ext[j] != 2) { + Ancilla_SetOam_XY(oam, x + 8, y); + oam->charnum = kSkullWoodsFire_Draw_Char[j] + 1; + oam->flags = 0x32; + bytewise_extended_oam[oam - oam_buf] = ext; + oam++; + } + } + } + + for (int i = 3; sign8(skullwoodsfire_var0[i]); ) { + if (--i < 0) { + ancilla_type[k] = 0; + return; + } + } + + if (skullwoodsfire_var4 == 0 || ancilla_item_to_link[k] == 4) + return; + + int j = ancilla_item_to_link[k] * 6; + for (int i = 0; i < 6; i++, j++) { + if (kSkullWoodsFire_Draw2_Char[j] != 0xff) { + Ancilla_SetOam_XY(oam, + 168 - BG2HOFS_copy2 + kSkullWoodsFire_Draw2_X[j], + 200 - BG2VOFS_copy2 + kSkullWoodsFire_Draw2_Y[j]); + oam->charnum = kSkullWoodsFire_Draw2_Char[j]; + oam->flags = kSkullWoodsFire_Draw2_Flags[j] | 0x32; + bytewise_extended_oam[oam - oam_buf] = kSkullWoodsFire_Draw2_Ext[j]; + oam++; + } + } +} + +void Ancilla3A_BigBombExplosion(int k) { // 88f18d + static const int8 kSuperBombExplode_X[9] = {0, -16, 0, 16, -24, 24, -16, 0, 16}; + static const int8 kSuperBombExplode_Y[9] = {0, -16, -24, -16, 0, 0, 16, 24, 16}; + + if (!submodule_index && !--ancilla_arr3[k]) { + if (++ancilla_item_to_link[k] == 2) + Ancilla_Sfx2_Pan(k, 0xc); + if (ancilla_item_to_link[k] == 11) { + ancilla_type[k] = 0; + return; + } + ancilla_arr3[k] = kBomb_Tab0[ancilla_item_to_link[k]]; + } + oam_priority_value = 0x3000; + uint8 numframes = kBomb_Draw_Tab2[ancilla_item_to_link[k]]; + int j = kBomb_Draw_Tab0[ancilla_item_to_link[k]] * 6; + ancilla_step[k] = j * 2; + + int yy = 0; + for (int i = 8; i >= 0; i--) { + uint16 x = Ancilla_GetX(k) + kSuperBombExplode_X[i] - BG2HOFS_copy2; + uint16 y = Ancilla_GetY(k) + kSuperBombExplode_Y[i] - BG2VOFS_copy2; + if (x < 256 && y < 256) { + Ancilla_AllocateOamFromRegion_A_or_D_or_F((uint8)(j * 2), 0x18); // wtf + OamEnt *oam = GetOamCurPtr() + yy; + yy += AncillaDraw_Explosion(oam, j, 0, numframes, 0x32, x, y) - oam; + + } + } + if (ancilla_item_to_link[k] == 3 && ancilla_arr3[k] == 1) { + Bomb_CheckForDestructibles(Ancilla_GetX(k), Ancilla_GetY(k), 0); // r14? + savegame_tagalong = 0; + } +} + +void RevivalFairy_Main() { // 88f283 + static const uint8 kAncilla_RevivalFaerie_Tab0[2] = {0, 0x90}; + static const uint8 kAncilla_RevivalFaerie_Tab1[5] = {0x4b, 0x4d, 0x49, 0x47, 0x49}; + + int k = 0; + switch (ancilla_step[k]) { + case 0: + if (!--ancilla_arr3[k]) { + ancilla_arr3[k] = kAncilla_RevivalFaerie_Tab0[++ancilla_step[k]]; + ancilla_K[k] = 0; + ancilla_z_vel[k] = 0; + } else { + Ancilla_MoveZ(k); + } + break; + case 1: + if (!--ancilla_arr3[k]) { + ancilla_step[k]++; + ancilla_z_vel[k] = 0; + ancilla_x_vel[k] = 0; + } else { + if (ancilla_arr3[k] == 0x4f || ancilla_arr3[k] == 0x8f) { + ancilla_L[k]++; + Ancilla_Sfx2_Pan(k, 0x31); + } + if (ancilla_L[k] != 0 && sign8(--ancilla_G[k])) { + ancilla_G[k] = 5; + if (++ancilla_item_to_link[k] == 3) { + ancilla_item_to_link[k] = 0; + ancilla_L[k] = 0; + } + } + ancilla_z_vel[k] += ancilla_K[k] ? 1 : -1; + if (abs8(ancilla_z_vel[k]) == 8) + ancilla_K[k] ^= 1; + Ancilla_MoveZ(k); + } + break; + case 2: + if (ancilla_z_vel[k] < 24) + ancilla_z_vel[k] += 1; + if (ancilla_x_vel[k] < 16) + ancilla_x_vel[k] += 1; + Ancilla_MoveX(k); + Ancilla_MoveZ(k); + break; + case 3: + goto skip_draw; + } + + { + Oam_AllocateFromRegionC(12); + Point16U pt; + Ancilla_PrepOamCoord(k, &pt); + OamEnt *oam = GetOamCurPtr(); + int t = (ancilla_step[k] == 1 && ancilla_L[k]) ? ancilla_item_to_link[k] + 1 : 0; + Ancilla_SetOam_XY(oam, pt.x, pt.y - (int8)ancilla_z[k]); + if (t != 0) + t += 1; + else + t = (frame_counter >> 2) & 1; + oam->charnum = kAncilla_RevivalFaerie_Tab1[t]; + oam->flags = 0x74; + bytewise_extended_oam[oam - oam_buf] = 2; + if (oam->y == 0xf0) { + ancilla_step[k] = 3; + submodule_index++; + TM_copy = mapbak_TM; + } + } +skip_draw: + RevivalFairy_Dust(); + RevivalFairy_MonitorHP(); +} + +void RevivalFairy_Dust() { // 88f3cf + int k = 2; + if (ancilla_step[0] == 0 || ancilla_step[k] == 2 || !sign8(--ancilla_arr3[k])) + return; + ancilla_arr3[k] = 0; + if (!sort_sprites_setting) + Oam_AllocateFromRegionA(16); + else + Oam_AllocateFromRegionD(16); + if (sign8(--ancilla_aux_timer[k])) { + ancilla_aux_timer[k] = 3; + if (ancilla_item_to_link[k] == 9) { + ancilla_arr3[k] = 32; + ancilla_step[k]++; + ancilla_item_to_link[k] = 2; + return; + } + ancilla_arr25[k] = kMagicPowder_Tab0[30 + ++ancilla_item_to_link[k]]; + } + Ancilla_MagicPowder_Draw(k); +} + +void RevivalFairy_MonitorHP() { // 88f430 + if ((link_health_current == link_health_capacity || link_health_current == 0x38) && !is_doing_heart_animation) { + if (link_is_in_deep_water) { + link_some_direction_bits = 4; + link_player_handler_state = kPlayerState_Swimming; + } else if (link_is_bunny) { + link_player_handler_state = kPlayerState_PermaBunny; + link_is_bunny_mirror = 1; + } else { + link_player_handler_state = kPlayerState_Ground; + } + link_auxiliary_state = 0; + player_unk1 = 0; + link_var30d = 0; + some_animation_timer_steps = 0; + BYTE(link_z_coord) = 0; + link_incapacitated_timer = 0; + for(int i = 0; i < 5; i++) + ancilla_type[i] = 0; + return; + } + int k = 1; + if (!ancilla_step[k]) { + if (!--ancilla_arr3[k]) { + ancilla_arr3[k]++; + ancilla_z_vel[k] = 4; + Ancilla_MoveZ(k); + if (ancilla_z[k] >= 16) { + ancilla_step[k]++; + ancilla_z_vel[k] = 2; + } + } + } else { + if (sign8(--ancilla_K[k])) { + ancilla_K[k] = 32; + ancilla_z_vel[k] = -ancilla_z_vel[k]; + } + Ancilla_MoveZ(k); + } + BYTE(link_z_coord) = ancilla_z[k]; +} + +void GameOverText_Draw() { // 88f5c4 + static const uint8 kGameOverText_Chars[16] = {0x40, 0x50, 0x41, 0x51, 0x42, 0x52, 0x43, 0x53, 0x44, 0x54, 0x45, 0x55, 0x43, 0x53, 0x46, 0x56}; + oam_cur_ptr = 0x800; + oam_ext_cur_ptr = 0xa20; + OamEnt *oam = GetOamCurPtr(); + int k = flag_for_boomerang_in_place; + do { + Ancilla_SetOam_XY(oam, Ancilla_GetX(k), 0x57); + oam->charnum = kGameOverText_Chars[k * 2 + 0]; + oam->flags = 0x3c; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + Ancilla_SetOam_XY(oam, Ancilla_GetX(k), 0x5f); + oam->charnum = kGameOverText_Chars[k * 2 + 1]; + oam->flags = 0x3c; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } while (--k >= 0); +} + +int AncillaAdd_AddAncilla_Bank08(uint8 type, uint8 y) { // 88f631 + int k = Ancilla_AllocInit(type, y); + if (k >= 0) { + ancilla_type[k] = type; + ancilla_numspr[k] = kAncilla_Pflags[type]; + ancilla_floor[k] = link_is_on_lower_level; + ancilla_floor2[k] = link_is_on_lower_level_mirror; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_objprio[k] = 0; + ancilla_U[k] = 0; + } + return k; +} + +void Ancilla_PrepOamCoord(int k, Point16U *info) { // 88f671 + oam_priority_value = kTagalongLayerBits[ancilla_floor[k]] << 8; + info->x = Ancilla_GetX(k) - BG2HOFS_copy2; + info->y = Ancilla_GetY(k) - BG2VOFS_copy2; +} + +void Ancilla_PrepAdjustedOamCoord(int k, Point16U *info) { // 88f6a4 + oam_priority_value = kTagalongLayerBits[ancilla_floor[k]] << 8; + info->x = Ancilla_GetX(k) - BG2HOFS_copy; + info->y = Ancilla_GetY(k) - BG2VOFS_copy; +} + +void Ancilla_SetOam_XY(OamEnt *oam, uint16 x, uint16 y) { // 88f6e1 + uint8 yval = 0xf0; + if (x < 256 && y < 256) { + oam->x = x; + if (y < 0xf0) + yval = y; + } + oam->y = yval; +} + +uint8 Ancilla_SetOam_XY_safe(OamEnt *oam, uint16 x, uint16 y) { // 88f702 + uint8 rv = 0; + oam->x = x; + if ((uint16)(x + 0x80) < 0x180) { + rv = (x >> 8) & 1; + oam->y = y; + if ((uint16)(y + 0x10) < 0x100) + return rv; + } + oam->y = 0xf0; + return rv; +} + +bool Ancilla_CheckLinkCollision(int k, int j, CheckPlayerCollOut *out) { // 88f76b + static const int16 kAncilla_Coll_Yoffs[5] = {0, 8, 8, 8, 0}; + static const int16 kAncilla_Coll_Xoffs[5] = {0, 8, 8, 8, 0}; + static const int16 kAncilla_Coll_H[5] = {20, 20, 8, 28, 14}; + static const int16 kAncilla_Coll_W[5] = {20, 3, 8, 24, 14}; + static const int16 kAncilla_Coll_LinkYoffs[5] = {12, 12, 12, 12, 12}; + static const int16 kAncilla_Coll_LinkXoffs[5] = {8, 8, 8, 12, 8}; + uint16 x = Ancilla_GetX(k), y = Ancilla_GetY(k); + y += kAncilla_Coll_Yoffs[j] + (int8)ancilla_z[k]; + x += kAncilla_Coll_Xoffs[j]; + out->r4 = link_y_coord + kAncilla_Coll_LinkYoffs[j] - y; + out->r8 = abs16(out->r4); + out->r6 = link_x_coord + kAncilla_Coll_LinkXoffs[j] - x; + out->r10 = abs16(out->r6); + return out->r8 < kAncilla_Coll_H[j] && out->r10 < kAncilla_Coll_W[j]; +} + +bool Hookshot_CheckProximityToLink(int x, int y) { // 88f7dc + return abs16(link_y_coord - BG2VOFS_copy2 + 12 - y - 4) < 12 && + abs16(link_x_coord - BG2HOFS_copy2 + 8 - x - 4) < 12; +} + +bool Ancilla_CheckForEntranceTrigger(int what) { // 88f844 + static const uint16 kEntranceTrigger_BaseY[4] = {0xd40, 0x210, 0xcfc, 0x100}; + static const uint16 kEntranceTrigger_BaseX[4] = {0xd80, 0xe68, 0x130, 0xf10}; + static const uint8 kEntranceTrigger_SizeY[4] = {11, 32, 16, 12}; + static const uint8 kEntranceTrigger_SizeX[4] = {16, 16, 16, 16}; + return + abs16(link_y_coord + 12 - kEntranceTrigger_BaseY[what]) < kEntranceTrigger_SizeY[what] && + abs16(link_x_coord + 8 - kEntranceTrigger_BaseX[what]) < kEntranceTrigger_SizeX[what]; +} + +void AncillaDraw_Shadow(OamEnt *oam, int k, int x, int y, uint8 pal) { // 88f897 + static const uint8 kAncilla_DrawShadow_Char[14] = {0x6c, 0x6c, 0x28, 0x28, 0x38, 0xff, 0xc8, 0xc8, 0xd8, 0xd8, 0xd9, 0xd9, 0xda, 0xda}; + static const uint8 kAncilla_DrawShadow_Flags[14] = {0x28, 0x68, 0x28, 0x68, 0x28, 0xff, 0x22, 0x22, 0x24, 0x64, 0x24, 0x64, 0x24, 0x64}; + + if (k == 2) + x += 4; + uint8 ext = Ancilla_SetOam_XY_safe(oam, x, y); + oam->charnum = kAncilla_DrawShadow_Char[k * 2]; + oam->flags = kAncilla_DrawShadow_Flags[k * 2] & ~0x30 | pal; + bytewise_extended_oam[oam - oam_buf] = ext; + oam++; + + uint8 ch = kAncilla_DrawShadow_Char[k * 2 + 1]; + if (ch != 0xff) { + x += 8; + ext = Ancilla_SetOam_XY_safe(oam, x, y); + oam->charnum = ch; + oam->flags = kAncilla_DrawShadow_Flags[k * 2 + 1] & ~0x30 | pal; + bytewise_extended_oam[oam - oam_buf] = ext; + } +} + +void Ancilla_AllocateOamFromRegion_B_or_E(uint8 size) { // 88f90a + if (!sort_sprites_setting) + Oam_AllocateFromRegionB(size); + else + Oam_AllocateFromRegionE(size); +} + +OamEnt *Ancilla_AllocateOamFromCustomRegion(OamEnt *oam) { // 88f9ba + int a = (uint8 *)oam - g_ram; + if (sort_sprites_setting) { + if (a < 0x900) { + if (a < 0x8e0) + return oam; + a = 0x820; + } else { + if (a < 0x9d0) + return oam; + a = 0x940; + } + } else { + if (a < 0x990) + return oam; + a = 0x820; + } + oam_cur_ptr = a; + oam_ext_cur_ptr = ((a - 0x800) >> 2) + 0xa20; + return GetOamCurPtr(); +} + +OamEnt *HitStars_UpdateOamBufferPosition(OamEnt *oam) { // 88fa00 + int a = (uint8 *)oam - g_ram; + if (!sort_sprites_setting && a >= 0x9d0) { + oam_cur_ptr = 0x820; + oam_ext_cur_ptr = 0xa20 + (0x20 >> 2); + oam = GetOamCurPtr(); + } + return oam; +} + +bool Hookshot_ShouldIEvenBotherWithTiles(int k) { // 88fa2d + uint16 x = Ancilla_GetX(k), y = Ancilla_GetY(k); + if (!player_is_indoors) { + if (!(ancilla_dir[k] & 2)) { + uint16 t = y - kOverworld_OffsetBaseY[BYTE(current_area_of_player) >> 1]; + return (t < 4) || (t >= overworld_right_bottom_bound_for_scroll); + } else { + uint16 t = x - kOverworld_OffsetBaseX[BYTE(current_area_of_player) >> 1]; + return (t < 6) || (t >= overworld_right_bottom_bound_for_scroll); + } + } + if (!(ancilla_dir[k] & 2)) { + return (y & 0x1ff) < 4 || (y & 0x1ff) >= 0x1e8 || (y & 0x200) != (link_y_coord & 0x200); + } else { + return (x & 0x1ff) < 4 || (x & 0x1ff) >= 0x1f0 || (x & 0x200) != (link_x_coord & 0x200); + } +} + +AncillaRadialProjection Ancilla_GetRadialProjection(uint8 a, uint8 r8) { // 88fadd + static const uint8 kRadialProjection_Tab0[64] = { + 255, 254, 251, 244, 236, 225, 212, 197, 181, 162, 142, 120, 97, 74, 49, 25, + 0, 25, 49, 74, 97, 120, 142, 162, 181, 197, 212, 225, 236, 244, 251, 254, + 255, 254, 251, 244, 236, 225, 212, 197, 181, 162, 142, 120, 97, 74, 49, 25, + 0, 25, 49, 74, 97, 120, 142, 162, 181, 197, 212, 225, 236, 244, 251, 254, + }; + static const uint8 kRadialProjection_Tab2[64] = { + 0, 25, 49, 74, 97, 120, 142, 162, 181, 197, 212, 225, 236, 244, 251, 254, + 255, 254, 251, 244, 236, 225, 212, 197, 181, 162, 142, 120, 97, 74, 49, 25, + 0, 25, 49, 74, 97, 120, 142, 162, 181, 197, 212, 225, 236, 244, 251, 254, + 255, 254, 251, 244, 236, 225, 212, 197, 181, 162, 142, 120, 97, 74, 49, 25, + }; + static const uint8 kRadialProjection_Tab1[64] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + }; + static const uint8 kRadialProjection_Tab3[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + }; + AncillaRadialProjection rv; + int p0 = kRadialProjection_Tab0[a] * r8; + int p1 = kRadialProjection_Tab2[a] * r8; + rv.r0 = (p0 >> 8) + (p0 >> 7 & 1); + rv.r2 = kRadialProjection_Tab1[a]; + rv.r4 = (p1 >> 8) + (p1 >> 7 & 1); + rv.r6 = kRadialProjection_Tab3[a]; + return rv; +} + +int Ancilla_AllocateOamFromRegion_A_or_D_or_F(int k, uint8 size) { // 88fb2b + if (sort_sprites_setting) { + if (ancilla_floor[k]) + return Oam_AllocateFromRegionF(size); + else + return Oam_AllocateFromRegionD(size); + } else { + return Oam_AllocateFromRegionA(size); + } +} + +void Ancilla_AddHitStars(uint8 a, uint8 y) { // 898024 + static const int8 kShovelHitStars_XY[12] = {21, -11, 21, 11, 3, -6, 21, 5, 16, -14, 16, 14}; + static const int8 kShovelHitStars_X2[6] = {-3, 19, 2, 13, -6, 22}; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 2; + ancilla_arr3[k] = 1; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + int j = a; + if (link_item_in_hand) { + j = (link_direction_facing >> 1) + 2; + } else if (link_position_mode) { + j = link_direction_facing != 4 ? 1 : 0; + } + ancilla_step[k] = j; + int t = link_x_coord + kShovelHitStars_X2[j]; + ancilla_A[k] = t; + ancilla_B[k] = t >> 8; + Ancilla_SetXY(k, link_x_coord + kShovelHitStars_XY[j * 2 + 1], link_y_coord + kShovelHitStars_XY[j * 2 + 0]); + } +} + +void AncillaAdd_Blanket(uint8 a) { // 898091 + int k = 0; + ancilla_type[k] = a; + ancilla_numspr[k] = kAncilla_Pflags[a]; + ancilla_floor[k] = link_is_on_lower_level; + ancilla_floor2[k] = link_is_on_lower_level_mirror; + ancilla_objprio[k] = 0; + Ancilla_SetXY(k, 0x938, 0x2162); +} + +void AncillaAdd_Snoring(uint8 a, uint8 y) { // 8980c8 + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_y_vel[k] = -8; + ancilla_aux_timer[k] = 7; + ancilla_x_vel[k] = 8; + ancilla_step[k] = 255; + Ancilla_SetXY(k, link_x_coord + 16, link_y_coord + 4); + } +} + +void AncillaAdd_Bomb(uint8 a, uint8 y) { // 89811f + static const int8 kBomb_Place_X0[4] = {8, 8, 0, 16}; + static const int8 kBomb_Place_Y0[4] = {0, 24, 12, 12}; + static const int8 kBomb_Place_X1[4] = {8, 8, -6, 22}; + static const int8 kBomb_Place_Y1[4] = {4, 28, 12, 12}; + + int k = Ancilla_AddAncilla(a, y); + if (k < 0) + return; + if (link_item_bombs == 0) { + ancilla_type[k] = 0; + return; + } + + if (--link_item_bombs == 0) + Hud_RefreshIcon(); + + ancilla_R[k] = 0; + ancilla_step[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_arr25[k] = 0; + ancilla_L[k] = 0; + ancilla_arr3[k] = kBomb_Tab0[0]; + ancilla_arr26[k] = 7; + ancilla_z[k] = 0; + ancilla_timer[k] = 8; + ancilla_dir[k] = link_direction_facing >> 1; + ancilla_T[k] = 0; + ancilla_arr23[k] = 0; + ancilla_arr22[k] = 0; + if (Ancilla_CheckInitialTileCollision_Class2(k)) { + int j = link_direction_facing >> 1; + Ancilla_SetXY(k, link_x_coord + kBomb_Place_X0[j], link_y_coord + kBomb_Place_Y0[j]); + } else { + int j = link_direction_facing >> 1; + Ancilla_SetXY(k, link_x_coord + kBomb_Place_X1[j], link_y_coord + kBomb_Place_Y1[j]); + } + sound_effect_1 = Link_CalculateSfxPan() | 0xb; +} + +uint8 AncillaAdd_Boomerang(uint8 a, uint8 y) { // 89820f + static const uint8 kBoomerang_Tab0[4] = {0x20, 0x18, 0x30, 0x28}; + static const uint8 kBoomerang_Tab1[2] = {0x20, 0x60}; + static const uint8 kBoomerang_Tab2[2] = {3, 2}; + static const uint8 kBoomerang_Tab3[4] = {8, 4, 2, 1}; + static const uint8 kBoomerang_Tab4[8] = {8, 4, 2, 1, 9, 5, 10, 6}; + static const uint8 kBoomerang_Tab5[8] = {2, 3, 3, 2, 2, 3, 3, 3}; + static const int8 kBoomerang_Tab6[8] = {-10, -8, -9, -9, -10, -8, -9, -9}; + static const int8 kBoomerang_Tab7[8] = {-10, 11, 8, -8, -10, 11, 8, -8}; + static const int8 kBoomerang_Tab8[8] = {-16, 6, 0, 0, -8, 8, -8, 8}; + static const int8 kBoomerang_Tab9[8] = {0, 0, -8, 8, 8, 8, -8, -8}; + + int k = Ancilla_AddAncilla(a, y); + if (k < 0) + return 0; + ancilla_aux_timer[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_K[k] = 0; + ancilla_z[k] = 0; + ancilla_L[k] = ancilla_numspr[k]; + flag_for_boomerang_in_place = 1; + int j = link_item_boomerang - 1; + ancilla_G[k] = j; + ancilla_step[k] = kBoomerang_Tab1[j]; + ancilla_arr3[k] = kBoomerang_Tab2[j]; + + int s = ancilla_G[k] * 2 + ((joypad1H_last & 0xc) && (joypad1H_last & 3) ? 1 : 0); + uint8 r0 = kBoomerang_Tab0[s]; + ancilla_H[k] = r0; + + uint8 r1 = (joypad1H_last & 0xf) ? (joypad1H_last & 0xf) : kBoomerang_Tab3[link_direction_facing >> 1]; + hookshot_effect_index = 0; + + if (r1 & 0xc) { + ancilla_y_vel[k] = r1 & 8 ? -r0 : r0; + int i = sign8(ancilla_y_vel[k]) ? 0 : 1; + ancilla_dir[k] = i; + hookshot_effect_index = kBoomerang_Tab3[i]; + } + ancilla_S[k] = 0; + + if (r1 & 3) { + if (!(r1 & 2)) + ancilla_S[k] = 1; + ancilla_x_vel[k] = (r1 & 2) ? -r0 : r0; + int i = sign8(ancilla_x_vel[k]) ? 2 : 3; + ancilla_dir[k] = i; + hookshot_effect_index |= kBoomerang_Tab3[i]; + } + + j = FindInByteArray(kBoomerang_Tab4, r1, 8); + if (j < 0) + j = 0; + ancilla_arr1[k] = kBoomerang_Tab5[j]; + boomerang_arr1[k] = j << 1; + if (button_b_frames >= 9) { + ancilla_aux_timer[k]++; + } else { + if (s || !(joypad1H_last & 0xf)) + j = link_direction_facing >> 1; + } + s = Ancilla_CheckInitialTile_A(k); + if (s < 0) { + if (ancilla_aux_timer[k]) { + Ancilla_SetXY(k, link_x_coord + kBoomerang_Tab9[j], link_y_coord + 8 + kBoomerang_Tab8[j]); + } else { + Ancilla_SetXY(k, link_x_coord + kBoomerang_Tab7[j], link_y_coord + 8 + kBoomerang_Tab6[j]); + } + } else { + ancilla_type[k] = 0; + flag_for_boomerang_in_place = 0; + if (ancilla_tile_attr[k] != 0xf0) { + sound_effect_1 = Ancilla_CalculateSfxPan(k) | 5; + } else { + sound_effect_1 = Ancilla_CalculateSfxPan(k) | 6; + } + AncillaAdd_BoomerangWallClink(k); + } + return s; +} + +void AncillaAdd_TossedPondItem(uint8 a, uint8 xin, uint8 yin) { // 898a32 + static const uint8 kWishPondItem_X[76] = { + 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 5, 0, 0, 0, + 0, 0, 0, 4, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 2, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, + }; + static const int8 kWishPondItem_Y[76] = { + -13, -13, -13, -13, -13, -12, -12, -13, -13, -12, -12, -12, -10, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -13, -12, -12, -12, -12, -12, -12, -10, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -13, -12, -12, + }; + + link_receiveitem_index = xin; + int k = Ancilla_AddAncilla(a, yin); + if (k >= 0) { + sound_effect_2 = Link_CalculateSfxPan() | 0x13; + uint8 sb = kReceiveItemGfx[xin]; + + if (sb != 0xff) { + if (sb == 0x20) + DecompressShieldGraphics(); + DecodeAnimatedSpriteTile_variable(sb); + } else { + DecodeAnimatedSpriteTile_variable(0); + } + if (sb == 6) + DecompressSwordGraphics(); + + link_state_bits = 0x80; + link_picking_throw_state = 0; + link_direction_facing = 0; + link_animation_steps = 0; + ancilla_z_vel[k] = 20; + ancilla_y_vel[k] = -40; + ancilla_x_vel[k] = 0; + ancilla_z[k] = 0; + ancilla_timer[k] = 16; + ancilla_item_to_link[k] = link_receiveitem_index; + int j = link_receiveitem_index; + Ancilla_SetXY(k, + link_x_coord + kWishPondItem_X[link_receiveitem_index], + link_y_coord + kWishPondItem_Y[link_receiveitem_index]); + } +} + +void AddHappinessPondRupees(uint8 arg) { // 898ae0 + int k = Ancilla_AddAncilla(0x42, 9); + if (k < 0) + return; + sound_effect_2 = Link_CalculateSfxPan() | 0x13; + uint8 sb = kReceiveItemGfx[0x35]; + DecodeAnimatedSpriteTile_variable(sb); + link_state_bits = 0x80; + link_picking_throw_state = 0; + link_direction_facing = 0; + link_animation_steps = 0; + + memset(happiness_pond_arr1, 0, 10); + + static const int8 kHappinessPond_Start[4] = {0, 4, 4, 9}; + static const int8 kHappinessPond_End[4] = {-1, 0, -1, -1}; + static const int8 kHappinessPond_Xvel[10] = {0, -12, -6, 6, 12, -9, -5, 0, 5, 9}; + static const int8 kHappinessPond_Yvel[10] = {-40, -40, -40, -40, -40, -32, -32, -32, -32, -32}; + static const int8 kHappinessPond_Zvel[10] = {20, 20, 20, 20, 20, 16, 16, 16, 16, 16}; + + int j = kHappinessPond_Start[arg], j_end = kHappinessPond_End[arg]; + k = 9; + do { + happiness_pond_arr1[k] = 1; + happiness_pond_z_vel[k] = kHappinessPond_Zvel[j]; + happiness_pond_y_vel[k] = kHappinessPond_Yvel[j]; + happiness_pond_x_vel[k] = kHappinessPond_Xvel[j]; + happiness_pond_z[k] = 0; + happiness_pond_step[k] = 0; + happiness_pond_timer[k] = 16; + happiness_pond_item_to_link[k] = 53; + int x = link_x_coord + 4; + int y = link_y_coord - 12; + happiness_pond_x_lo[k] = x; + happiness_pond_x_hi[k] = x >> 8; + happiness_pond_y_lo[k] = y; + happiness_pond_y_hi[k] = y >> 8; + } while (--k, --j != j_end); +} + +void AncillaAdd_FallingPrize(uint8 a, uint8 item_idx, uint8 yv) { // 898bc1 + static const int8 kFallingItem_Type[7] = {0x10, 0x37, 0x39, 0x38, 0x26, 0xf, 0x20}; + static const int8 kFallingItem_G[7] = {0x40, 0, 0, 0, 0, -1, 0}; + static const int16 kFallingItem_X[7] = {0x78, 0x78, 0x78, 0x78, 0x78, 0x80, 0x78}; + static const int16 kFallingItem_Y[7] = {0x48, 0x78, 0x78, 0x78, 0x78, 0x68, 0x78}; + static const uint8 kFallingItem_Z[7] = {0x60, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}; + link_receiveitem_index = item_idx; + int k = Ancilla_AddAncilla(a, yv); + if (k < 0) + return; + uint8 item_type = kFallingItem_Type[item_idx]; + ancilla_item_to_link[k] = item_type; + if (item_type == 0x10 || item_type == 0xf) + DecodeAnimatedSpriteTile_variable(kReceiveItemGfx[item_type]); + + ancilla_z_vel[k] = -48; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_step[k] = 0; + ancilla_z[k] = kFallingItem_Z[item_idx]; + ancilla_aux_timer[k] = 9; + ancilla_arr3[k] = 0; + ancilla_L[k] = 0; + ancilla_G[k] = kFallingItem_G[item_idx]; + link_receiveitem_index = item_type; + + int x, y; + if (item_idx != 0 && item_idx != 5) { + if (BYTE(cur_palace_index_x2) == 20) { + x = (link_x_coord & 0xff00) | 0x100; + y = (link_y_coord & 0xff00) | 0x100; + } else { + x = kFallingItem_X[item_idx] + BG2HOFS_copy2; + y = kFallingItem_Y[item_idx] + BG2VOFS_copy2; + } + } else { + x = link_x_coord; + y = kFallingItem_Y[item_idx] + BG2VOFS_copy2; + } + Ancilla_SetXY(k, x, y); +} + +void AncillaAdd_ChargedSpinAttackSparkle() { // 898cb1 + for (int k = 9; k >= 0; k--) { + if (ancilla_type[k] == 0 || ancilla_type[k] == 0x3c) { + ancilla_type[k] = 13; + ancilla_floor[k] = link_is_on_lower_level; + ancilla_timer[k] = 6; + break; + } + } +} + +void AncillaAdd_ExplodingWeatherVane(uint8 a, uint8 y) { // 898d11 + static const int8 kWeathervane_Tab4[12] = {8, 10, 9, 4, 11, 12, -10, -8, 4, -6, -10, -4}; + static const int8 kWeathervane_Tab5[12] = {20, 22, 20, 20, 22, 20, 20, 22, 20, 22, 20, 20}; + static const uint8 kWeathervane_Tab6[12] = {0xb0, 0xa3, 0xa0, 0xa2, 0xa0, 0xa8, 0xa0, 0xa0, 0xa8, 0xa1, 0xb0, 0xa0}; + static const uint8 kWeathervane_Tab8[12] = {0, 2, 4, 6, 3, 8, 14, 8, 12, 7, 10, 8}; + static const uint8 kWeathervane_Tab10[12] = {48, 18, 32, 20, 22, 24, 32, 20, 24, 22, 20, 32}; + + int k = Ancilla_AddAncilla(a, y); + if (k < 0) + return; + + ancilla_aux_timer[k] = 10; + ancilla_G[k] = 128; + ancilla_step[k] = 0; + ancilla_arr3[k] = 0; + sound_effect_1 = 0; + music_control = 0xf2; + sound_effect_ambient = 0x17; + + weathervane_var1 = 0; + weathervane_var2 = 0x280; + + for (int i = 11; i >= 0; i--) { + weathervane_arr3[i] = 0; + weathervane_arr4[i] = kWeathervane_Tab4[i]; + weathervane_arr5[i] = kWeathervane_Tab5[i]; + weathervane_arr6[i] = kWeathervane_Tab6[i]; + weathervane_arr7[i] = 7; + weathervane_arr8[i] = kWeathervane_Tab8[i]; + weathervane_arr9[i] = 2; + weathervane_arr10[i] = kWeathervane_Tab10[i]; + weathervane_arr11[i] = 1; + weathervane_arr12[i] = i & 1; + } +} + +void AncillaAdd_CutsceneDuck(uint8 a, uint8 y) { // 898d90 + if (AncillaAdd_CheckForPresence(a)) + return; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_dir[k] = 2; + ancilla_arr3[k] = 3; + ancilla_step[k] = 0; + ancilla_aux_timer[k] = 32; + ancilla_item_to_link[k] = 116; + ancilla_z_vel[k] = 0; + ancilla_L[k] = 0; + ancilla_z[k] = 0; + ancilla_S[k] = 0; + Ancilla_SetXY(k, 0x200, 0x788); + } +} + +void AncillaAdd_SomariaPlatformPoof(int k) { // 898dd2 + ancilla_type[k] = 0x39; + ancilla_aux_timer[k] = 7; + for (int j = 15; j >= 0; j--) { + if (sprite_type[j] == 0xed) { + sprite_state[j] = 0; + player_on_somaria_platform = 0; + } + } + Player_TileDetectNearby(); +} + +void AncillaAdd_SuperBombExplosion(uint8 a, uint8 y) { // 898df9 + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_R[k] = 0; + ancilla_step[k] = 0; + ancilla_arr25[k] = 0; + ancilla_L[k] = 0; + ancilla_arr3[k] = kBomb_Tab0[1]; + ancilla_item_to_link[k] = 1; + int j = WORD(tagalong_var2); + int y = tagalong_y_lo[j] | tagalong_y_hi[j] << 8; + int x = tagalong_x_lo[j] | tagalong_x_hi[j] << 8; + Ancilla_SetXY(k, x + 8, y + 16); + } +} + +void ConfigureRevivalAncillae() { // 898e4e + link_dma_var5 = 80; + int k = 0; + + ancilla_arr3[k] = 64; + ancilla_step[k] = 0; + ancilla_z_vel[k] = 8; + ancilla_L[k] = 0; + ancilla_G[k] = 5; + ancilla_item_to_link[k] = 0; + ancilla_K[k] = 0; + Ancilla_SetXY(k, link_x_coord, link_y_coord); + ancilla_z[k] = 0; + k += 1; + + ancilla_z[k] = 0; + ancilla_arr3[k] = 240; + ancilla_step[k] = 0; + ancilla_K[k] = 0; + k += 1; + + ancilla_item_to_link[k] = 2; + ancilla_aux_timer[k] = 3; + ancilla_arr3[k] = 8; + ancilla_step[k] = 0; + ancilla_dir[k] = 3; + ancilla_arr25[k] = kMagicPowder_Tab0[30 + ancilla_item_to_link[k]]; + + Ancilla_SetXY(k, link_x_coord + 20, link_y_coord + 2); +} + +void AncillaAdd_LampFlame(uint8 a, uint8 y) { // 898f1c + static const int8 kLampFlame_X[4] = {0, 0, -20, 18}; + static const int8 kLampFlame_Y[4] = {-16, 24, 4, 4}; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 0; + ancilla_timer[k] = 23; + int j = link_direction_facing >> 1; + ancilla_dir[k] = j; + Ancilla_SetXY(k, link_x_coord + kLampFlame_X[j], link_y_coord + kLampFlame_Y[j]); + sound_effect_1 = Ancilla_CalculateSfxPan(k) | 42; + } +} + +void AncillaAdd_MSCutscene(uint8 a, uint8 y) { // 898f7c + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 2; + ancilla_timer[k] = 64; + Ancilla_SetXY(k, link_x_coord + 8, link_y_coord - 8); + } +} + +void AncillaAdd_DashDust(uint8 a, uint8 y) { // 898fba + AddDashingDustEx(a, y, 1); +} + +void AncillaAdd_DashDust_charging(uint8 a, uint8 y) { // 898fc1 + AddDashingDustEx(a, y, 0); +} + +void AncillaAdd_BlastWallFireball(uint8 a, uint8 y, int r4) { // 899031 + static const int8 kBlastWall_XY[32] = { + -64, 0, -22, 42, -38, 38, -42, 22, 0, 64, 22, 42, 38, 38, 42, 22, + 64, 0, 22, -42, 38, -38, 42, -22, 0, -64, -22, -42, -38, -38, -42, -22, + }; + for (int k = 10; k != 4; k--) { + if (ancilla_type[k] == 0) { + ancilla_type[k] = 0x32; + ancilla_floor[k] = link_is_on_lower_level; + blastwall_var12[k] = 16; + int j = frame_counter & 15; + ancilla_y_vel[k] = kBlastWall_XY[j * 2 + 0]; + ancilla_x_vel[k] = kBlastWall_XY[j * 2 + 1]; + Ancilla_SetXY(k, blastwall_var11[r4] + 16, blastwall_var10[r4] + 8); + return; + } + } + +} + +int AncillaAdd_Arrow(uint8 a, uint8 ax, uint8 ay, uint16 xcoord, uint16 ycoord) { // 8990a4 + static const int8 kShootBow_X[4] = {4, 4, 0, 4}; + static const int8 kShootBow_Y[4] = {-4, 3, 4, 4}; + static const int8 kShootBow_Xvel[4] = {0, 0, -48, 48}; + static const int8 kShootBow_Yvel[4] = {-48, 48, 0, 0}; + + scratch_0 = ycoord; + scratch_1 = xcoord; + BYTE(index_of_interacting_tile) = ax; + + if (AncillaAdd_CheckForPresence(a)) + return -1; + + int k = AncillaAdd_ArrowFindSlot(a, ay); + + if (k >= 0) { + sound_effect_1 = Link_CalculateSfxPan() | 7; + ancilla_H[k] = 0; + ancilla_item_to_link[k] = 8; + int j = ax >> 1; + ancilla_dir[k] = j | 4; + ancilla_y_vel[k] = kShootBow_Yvel[j]; + ancilla_x_vel[k] = kShootBow_Xvel[j]; + Ancilla_SetXY(k, xcoord + kShootBow_X[j], ycoord + 8 + kShootBow_Y[j]); + } + return k; +} + +void AncillaAdd_BunnyPoof(uint8 a, uint8 y) { // 899102 + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + link_visibility_status = 0xc; + ancilla_step[k] = 0; + if (!link_is_bunny_mirror) + sound_effect_1 = Link_CalculateSfxPan() | 0x14; + else + sound_effect_1 = Link_CalculateSfxPan() | 0x15; + + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 7; + Ancilla_SetXY(k, link_x_coord, link_y_coord + 4); + } +} + +void AncillaAdd_CapePoof(uint8 a, uint8 y) { // 89912c + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_step[k] = 1; + link_is_transforming = 1; + link_cant_change_direction |= 1; + link_direction = 0; + link_direction_last = 0; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 7; + Ancilla_SetXY(k, link_x_coord, link_y_coord + 4); + } +} + +void AncillaAdd_DwarfPoof(uint8 ain, uint8 yin) { // 89915f + int k = Ancilla_AddAncilla(ain, yin); + if (k < 0) + return; + if (savegame_tagalong == 8) + sound_effect_1 = Link_CalculateSfxPan() | 0x14; + else + sound_effect_1 = Link_CalculateSfxPan() | 0x15; + + ancilla_item_to_link[k] = 0; + ancilla_step[k] = 0; + ancilla_aux_timer[k] = 7; + tagalong_var5 = 1; + int j = tagalong_var2; + int x = tagalong_x_lo[j] | tagalong_x_hi[j] << 8; + int y = tagalong_y_lo[j] | tagalong_y_hi[j] << 8; + Ancilla_SetXY(k, x, y + 4); +} + +void AncillaAdd_BushPoof(uint16 x, uint16 y) { // 8991c3 + if (!(link_item_in_hand & 0x40)) + return; + int k = Ancilla_AddAncilla(0x3f, 4); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 7; + sound_effect_1 = Link_CalculateSfxPan() | 21; + Ancilla_SetXY(k, x, y - 2); + } +} + +void AncillaAdd_EtherSpell(uint8 a, uint8 y) { // 8991fc + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_arr25[k] = 0; + ancilla_step[k] = 0; + flag_custom_spell_anim_active = 1; + ancilla_aux_timer[k] = 2; + ancilla_arr3[k] = 3; + ancilla_y_vel[k] = 127; + ether_var2 = 40; + load_chr_halfslot_even_odd = 9; + ether_var1 = 0x40; + sound_effect_2 = Link_CalculateSfxPan() | 0x26; + for(int i = 0; i < 8; i++) + ether_arr1[i] = i * 8; + ether_y = link_y_coord; + uint16 y = BG2VOFS_copy2 - 16; + ether_y_adjusted = y & 0xf0; + ether_x = link_x_coord; + ether_x2 = ether_x + 8; + ether_y2 = link_y_coord - 16; + ether_y3 = ether_y2 + 0x24; + Ancilla_SetXY(k, link_x_coord, y); + } +} + +void AncillaAdd_VictorySpin() { // 8992ac + if ((link_sword_type + 1 & 0xfe) != 0) { + int k = Ancilla_AddAncilla(0x3b, 0); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_arr3[k] = 1; + ancilla_aux_timer[k] = 34; + } + } +} + +void AncillaAdd_MagicPowder(uint8 a, uint8 y) { // 8992f0 + static const int8 kMagicPower_X[4] = {-2, -2, -12, 12}; + static const int8 kMagicPower_Y[4] = {0, 20, 16, 16}; + static const int8 kMagicPower_X1[4] = {10, 10, -8, 28}; + static const int8 kMagicPower_Y1[4] = {1, 40, 22, 22}; + + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_z[k] = 0; + ancilla_aux_timer[k] = 1; + link_dma_var5 = 80; + int j = link_direction_facing >> 1; + ancilla_dir[k] = j; + ancilla_arr25[k] = kMagicPowder_Tab0[j * 10]; + Ancilla_SetXY(k, link_x_coord + kMagicPower_X[j], link_y_coord + kMagicPower_Y[j]); + Ancilla_CheckTileCollision(k); + byte_7E0333 = ancilla_tile_attr[k]; + if (eq_selected_y_item_copy == 9) { + ancilla_type[k] = 0; + return; + } + sound_effect_1 = Link_CalculateSfxPan() | 0xd; + Ancilla_SetXY(k, link_x_coord + kMagicPower_X1[j], link_y_coord + kMagicPower_Y1[j]); + } +} + +void AncillaAdd_WallTapSpark(uint8 a, uint8 y) { // 899395 + static const int8 kWallTapSpark_X[4] = {11, 10, -12, 29}; + static const int8 kWallTapSpark_Y[4] = {-4, 32, 17, 17}; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 5; + ancilla_aux_timer[k] = 1; + int i = link_direction_facing >> 1; + Ancilla_SetXY(k, link_x_coord + kWallTapSpark_X[i], link_y_coord + kWallTapSpark_Y[i]); + } +} + +void AncillaAdd_SwordSwingSparkle(uint8 a, uint8 y) { // 8993c2 + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 1; + ancilla_dir[k] = link_direction_facing >> 1; + Ancilla_SetXY(k, link_x_coord, link_y_coord); + } +} + +void AncillaAdd_DashTremor(uint8 a, uint8 y) { // 8993f3 + static const uint8 kAddDashingDust_X[4] = {4, 4, 6, 0}; + static const uint8 kAddDashingDust_Y[4] = {20, 4, 16, 16}; + static const uint8 kAddDashTremor_Dir[4] = {2, 2, 0, 0}; + static const uint8 kAddDashTremor_Tab[2] = {0x80, 0x78}; + if (AncillaAdd_CheckForPresence(a)) + return; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 16; + ancilla_L[k] = 0; + int j = link_direction_facing >> 1; + ancilla_dir[k] = j = kAddDashTremor_Dir[j]; + uint8 y = link_y_coord - BG2VOFS_copy2; + uint8 x = link_x_coord - BG2HOFS_copy2; + Ancilla_SetY(k, (j ? y : x) < kAddDashTremor_Tab[j >> 1] ? 3 : -3); + } +} + +void AncillaAdd_BoomerangWallClink(int k) { // 899478 + static const int8 kBoomerangWallHit_X[8] = {8, 8, 0, 10, 12, 8, 4, 0}; + static const int8 kBoomerangWallHit_Y[8] = {0, 8, 8, 8, 4, 8, 12, 8}; + static const uint8 kBoomerangWallHit_Tab0[16] = {0, 6, 4, 0, 2, 10, 12, 0, 0, 8, 14, 0, 0, 0, 0, 0}; + boomerang_temp_x = Ancilla_GetX(k); + boomerang_temp_y = Ancilla_GetY(k); + k = Ancilla_AddAncilla(6, 1); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_arr3[k] = 1; + int j = kBoomerangWallHit_Tab0[hookshot_effect_index] >> 1; + Ancilla_SetXY(k, boomerang_temp_x + kBoomerangWallHit_X[j], boomerang_temp_y + kBoomerangWallHit_Y[j]); + } +} + +void AncillaAdd_HookshotWallClink(int kin, uint8 a, uint8 y) { // 8994c6 + static const int8 kHookshotWallHit_X[8] = {8, 8, 0, 10, 12, 8, 4, 0}; + static const int8 kHookshotWallHit_Y[8] = {0, 8, 8, 8, 4, 8, 12, 8}; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_arr3[k] = 1; + int j = ancilla_dir[kin]; + Ancilla_SetXY(k, Ancilla_GetX(kin) + kHookshotWallHit_X[j], Ancilla_GetY(kin) + kHookshotWallHit_Y[j]); + } +} + +void AncillaAdd_Duck_take_off(uint8 a, uint8 y) { // 8994fe + if (AncillaAdd_CheckForPresence(a)) + return; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_timer[k] = 0x78; + ancilla_L[k] = 0; + ancilla_z_vel[k] = 0; + ancilla_z[k] = 0; + ancilla_step[k] = 0; + AddBirdCommon(k); + } +} + +void AddBirdTravelSomething(uint8 a, uint8 y) { // 89951d + if (AncillaAdd_CheckForPresence(a)) + return; + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + link_player_handler_state = 0; + link_speed_setting = 0; + button_mask_b_y &= ~0x81; + button_b_frames = 0; + link_delay_timer_spin_attack = 0; + link_cant_change_direction &= ~1; + ancilla_L[k] = 1; + ancilla_z_vel[k] = 40; + ancilla_z[k] = -51; + ancilla_step[k] = 2; + AddBirdCommon(k); + } +} + +void AncillaAdd_QuakeSpell(uint8 a, uint8 y) { // 899589 + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_step[k] = 0; + ancilla_item_to_link[k] = 0; + load_chr_halfslot_even_odd = 13; + sound_effect_1 = 0x35; + for(int i = 0; i < 5; i++) + quake_arr2[i] = 0; + quake_var5 = 0; + for(int i = 0; i < 5; i++) + quake_arr1[i] = 1; + flag_custom_spell_anim_active = 1; + ancilla_timer[k] = 2; + quake_var1 = link_y_coord + 26; + quake_var2 = link_x_coord + 8; + quake_var3 = 3; + } +} + +void AncillaAdd_SpinAttackInitSpark(uint8 a, uint8 x, uint8 y) { // 89960b + static const int8 kSpinAttackStartSparkle_Y[4] = {32, -8, 10, 20}; + static const int8 kSpinAttackStartSparkle_X[4] = {10, 7, 28, -10}; + + int k = Ancilla_AddAncilla(a, y); + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 0x31) + ancilla_type[i] = 0; + } + ancilla_item_to_link[k] = 0; + ancilla_step[k] = x; + ancilla_timer[k] = 4; + ancilla_aux_timer[k] = 3; + int j = link_direction_facing >> 1; + Ancilla_SetXY(k, + link_x_coord + kSpinAttackStartSparkle_X[j], + link_y_coord + kSpinAttackStartSparkle_Y[j]); +} + +void AncillaAdd_BlastWall() { // 899692 + static const int8 kBlastWall_Tab3[4] = {-16, 16, 0, 0}; + static const int8 kBlastWall_Tab4[4] = {0, 0, -16, 16}; + static const int8 kBlastWall_Tab5[16] = {-8, 0, -8, 16, 16, 0, 16, 16, 0, -8, 16, -8, 0, 16, 16, 16}; + + ancilla_type[0] = 0x33; + ancilla_type[1] = 0x33; + ancilla_type[2] = 0; + ancilla_type[3] = 0; + ancilla_type[4] = 0; + ancilla_type[5] = 0; + + ancilla_item_to_link[0] = 0; + flag_is_ancilla_to_pick_up = 0; + link_state_bits = 0; + link_cant_change_direction = 0; + ancilla_K[0] = 0; + ancilla_floor[0] = link_is_on_lower_level; + ancilla_floor[1] = link_is_on_lower_level; + ancilla_floor2[0] = link_is_on_lower_level_mirror; + blastwall_var1 = 0; + blastwall_var6[1] = 0; + blastwall_var5[1] = 0; + blastwall_var4 = 0; + blastwall_var5[0] = 1; + flag_custom_spell_anim_active = 1; + blastwall_var6[0] = 3; + int j = blastwall_var7; + blastwall_var8 += kBlastWall_Tab3[j]; + blastwall_var9 += kBlastWall_Tab4[j]; + j = (j < 4) ? 4 : 0; + for (int k = 3; k >= 0; k--, j++) { + blastwall_var10[k] = blastwall_var8 + kBlastWall_Tab5[j * 2 + 0]; + blastwall_var11[k] = blastwall_var9 + kBlastWall_Tab5[j * 2 + 1]; + uint16 x = blastwall_var11[k] - BG2HOFS_copy2; + if (x < 256) + sound_effect_1 = kBombos_Sfx[x >> 5] | 0xc; + } + // In dark world forest castle hole outside door + +} + +void AncillaAdd_SwordChargeSparkle(int k) { // 899757 + int j; + for (j = 9; ancilla_type[j] != 0; ) { + if (--j < 0) + return; + } + ancilla_type[j] = 60; + ancilla_floor[j] = link_is_on_lower_level; + ancilla_item_to_link[j] = 0; + ancilla_timer[j] = 4; + + uint8 rand = GetRandomNumber(); + + uint8 z = ancilla_z[k]; + if (z >= 0xF8) + z = 0; + Ancilla_SetXY(j, Ancilla_GetX(k) + 2 + (rand >> 5), Ancilla_GetY(k) - 2 - z + (rand & 0xf)); +} + +void AncillaAdd_SilverArrowSparkle(int kin) { // 8997de + static const int8 kSilverArrowSparkle_X[4] = {-4, -4, 0, 2}; + static const int8 kSilverArrowSparkle_Y[4] = {0, 2, -4, -4}; + int k = Ancilla_AllocHigh(); + if (k >= 0) { + ancilla_type[k] = 0x3c; + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 4; + ancilla_floor[k] = link_is_on_lower_level; + int m = GetRandomNumber(); + int j = ancilla_dir[kin] & 3; + Ancilla_SetXY(k, + Ancilla_GetX(kin) + kSilverArrowSparkle_X[j] + (m >> 4 & 7), + Ancilla_GetY(kin) + kSilverArrowSparkle_Y[j] + (m & 7)); + } +} + +void AncillaAdd_IceRodShot(uint8 a, uint8 y) { // 899863 + static const int8 kIceRod_X[4] = {0, 0, -20, 20}; + static const int8 kIceRod_Y[4] = {-16, 24, 8, 8}; + static const int8 kIceRod_Xvel[4] = {0, 0, -48, 48}; + static const int8 kIceRod_Yvel[4] = {-48, 48, 0, 0}; + + int k = Ancilla_AddAncilla(a, y); + if (k < 0) { + Refund_Magic(0); + return; + } + sound_effect_1 = Link_CalculateSfxPan() | 15; + ancilla_step[k] = 0; + ancilla_arr25[k] = 0; + ancilla_item_to_link[k] = 255; + ancilla_L[k] = 1; + ancilla_aux_timer[k] = 3; + ancilla_arr3[k] = 6; + int j = link_direction_facing >> 1; + ancilla_dir[k] = j; + ancilla_y_vel[k] = kIceRod_Yvel[j]; + ancilla_x_vel[k] = kIceRod_Xvel[j]; + + if (Ancilla_CheckInitialTile_A(k) < 0) { + uint16 x = link_x_coord + kIceRod_X[j]; + uint16 y = link_y_coord + kIceRod_Y[j]; + + if (((x - BG2HOFS_copy2) | (y - BG2VOFS_copy2)) & 0xff00) { + ancilla_type[k] = 0; + return; + } + Ancilla_SetXY(k, x, y); + } else { + ancilla_type[k] = 0x11; + ancilla_numspr[k] = kAncilla_Pflags[0x11]; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 4; + } +} + +bool AncillaAdd_Splash(uint8 a, uint8 y) { // 8998fc + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + sound_effect_1 = Link_CalculateSfxPan() | 0x24; + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 2; + if (player_is_indoors && !link_is_in_deep_water) + link_is_on_lower_level = 0; + Ancilla_SetXY(k, link_x_coord - 11, link_y_coord + 8); + } + return k < 0; +} + +void AncillaAdd_GraveStone(uint8 ain, uint8 yin) { // 8999e9 + static const uint16 kMoveGravestone_Y[8] = {0x550, 0x540, 0x530, 0x520, 0x500, 0x4e0, 0x4c0, 0x4b0}; + static const uint16 kMoveGravestone_X[15] = {0x8b0, 0x8f0, 0x910, 0x950, 0x970, 0x9a0, 0x850, 0x870, 0x8b0, 0x8f0, 0x920, 0x950, 0x880, 0x990, 0x840}; + static const uint16 kMoveGravestone_Y1[15] = {0x540, 0x530, 0x530, 0x530, 0x520, 0x520, 0x510, 0x510, 0x4f0, 0x4f0, 0x4f0, 0x4f0, 0x4d0, 0x4b0, 0x4a0}; + static const uint16 kMoveGravestone_X1[15] = {0x8b0, 0x8f0, 0x910, 0x950, 0x970, 0x9a0, 0x850, 0x870, 0x8b0, 0x8f0, 0x920, 0x950, 0x880, 0x990, 0x840}; + static const uint16 kMoveGravestone_Pos[15] = {0xa16, 0x99e, 0x9a2, 0x9aa, 0x92e, 0x934, 0x88a, 0x88e, 0x796, 0x79e, 0x7a4, 0x7aa, 0x690, 0x5b2, 0x508}; + static const uint8 kMoveGravestone_Ctr[15] = {0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x58}; + static const uint8 kMoveGravestone_Idx[9] = {0, 1, 4, 6, 8, 12, 13, 14, 15}; + + int k = Ancilla_AddAncilla(ain, yin); + if (k < 0) + return; + int t = ((link_y_coord & 0xf) < 7 ? link_y_coord : link_y_coord + 16) & ~0xf; + + int i = 7; + while (kMoveGravestone_Y[i] != t) { + if (--i < 0) { + ancilla_type[k] = 0; + return; + } + } + + int j = kMoveGravestone_Idx[i]; + int end = kMoveGravestone_Idx[i + 1]; + do { + int x = kMoveGravestone_X[j]; + if (x < link_x_coord && (uint16)(x + 15) >= link_x_coord) { + if (j == 13 ? !link_is_running : link_is_running) + break; + + int pos = kMoveGravestone_Pos[j]; + big_rock_starting_address = pos; + door_open_closed_counter = kMoveGravestone_Ctr[j]; + if (door_open_closed_counter == 0x58) { + sound_effect_2 = Link_CalculateSfxPan() | 0x1b; + } else if (door_open_closed_counter == 0x38) { + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x20; + sound_effect_2 = Link_CalculateSfxPan() | 0x1b; + } + + ((uint8 *)door_debris_y)[k] = (pos - 0x80); + ((uint8 *)door_debris_x)[k] = (pos - 0x80) >> 8; + + Overworld_DoMapUpdate32x32_B(); + + if ((sound_effect_2 & 0x3f) != 0x1b) + sound_effect_1 = Link_CalculateSfxPan() | 0x22; + + int yy = kMoveGravestone_Y1[j]; + int xx = kMoveGravestone_X1[j]; + bitmask_of_dragstate = 4; + link_something_with_hookshot = 1; + ancilla_A[k] = (yy - 18); + ancilla_B[k] = (yy - 18) >> 8; + Ancilla_SetXY(k, xx, yy - 2); + return; + } + } while (++j != end); + ancilla_type[k] = 0; +} + +void AncillaAdd_WaterfallSplash() { // 899b68 + if (AncillaAdd_CheckForPresence(0x41)) + return; + int k = Ancilla_AddAncilla(0x41, 4); + if (k >= 0) { + ancilla_timer[k] = 2; + ancilla_item_to_link[k] = 0; + } +} + +void AncillaAdd_GTCutscene() { // 899b83 + if (link_state_bits & 0x80 | link_auxiliary_state || + (link_has_crystals & 0x7f) != 0x7f || + save_ow_event_info[0x43] & 0x20) + return; + + Ancilla_TerminateSparkleObjects(); + + if (AncillaAdd_CheckForPresence(0x43)) + return; + + int k = Ancilla_AddAncilla(0x43, 4); + if (k < 0) + return; + + for (int i = 15; i >= 0; i--) { + if (sprite_type[i] == 0x37) + sprite_state[i] = 0; + } + + for (int i = 0x17; i >= 0; i--) + breaktowerseal_sparkle_var1[i] = 0xff; + DecodeAnimatedSpriteTile_variable(0x28); + palette_sp6 = 4; + overworld_palette_aux_or_main = 0x200; + Palette_Load_SpriteEnvironment_Dungeon(); + flag_update_cgram_in_nmi++; + flag_is_link_immobilized = 1; + ancilla_y_subpixel[k] = 0; + ancilla_x_subpixel[k] = 0; + ancilla_step[k] = 0; + breaktowerseal_var5 = 240; + breaktowerseal_var4 = 0; + + breaktowerseal_var3[0] = 0; + + breaktowerseal_var3[1] = 10; + breaktowerseal_var3[2] = 22; + breaktowerseal_var3[3] = 32; + breaktowerseal_var3[4] = 42; + breaktowerseal_var3[5] = 54; + + Ancilla_SetXY(k, link_x_coord, link_y_coord - 16); +} + +int AncillaAdd_DoorDebris() { // 899c38 + int k = Ancilla_AddAncilla(8, 1); + if (k >= 0) { + ancilla_arr25[k] = 0; + ancilla_arr26[k] = 7; + } + return k; +} + +void FireRodShot_BecomeSkullWoodsFire(int k) { // 899c4f + if (player_is_indoors || !(BYTE(overworld_screen_index) & 0x40)) + return; + + ancilla_type[0] = 0x34; + ancilla_type[1] = 0; + ancilla_type[2] = 0; + ancilla_type[3] = 0; + ancilla_type[4] = 0; + ancilla_type[5] = 0; + flag_for_boomerang_in_place = 0; + ancilla_numspr[0] = kAncilla_Pflags[0x34]; + skullwoodsfire_var0[0] = 253; + skullwoodsfire_var0[1] = 254; + skullwoodsfire_var0[2] = 255; + skullwoodsfire_var0[3] = 0; + skullwoodsfire_var4 = 0; + skullwoodsfire_var5[0] = 5; + skullwoodsfire_var5[1] = 5; + skullwoodsfire_var5[2] = 5; + skullwoodsfire_var5[3] = 5; + ancilla_aux_timer[0] = 5; + skullwoodsfire_var9 = 0x100; + skullwoodsfire_var10 = 0x100; + skullwoodsfire_var11 = 0x98; + skullwoodsfire_var12 = 0x98; + + trigger_special_entrance = 2; + subsubmodule_index = 0; + BYTE(R16) = 0; + ancilla_floor[0] = link_is_on_lower_level; + ancilla_floor2[0] = link_is_on_lower_level_mirror; + ancilla_item_to_link[0] = 0; + ancilla_step[0] = 0; + +} + +int Ancilla_AddAncilla(uint8 a, uint8 y) { // 899ce2 + int k = Ancilla_AllocInit(a, y); + if (k >= 0) { + ancilla_type[k] = a; + ancilla_floor[k] = link_is_on_lower_level; + ancilla_floor2[k] = link_is_on_lower_level_mirror; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_objprio[k] = 0; + ancilla_U[k] = 0; + ancilla_numspr[k] = kAncilla_Pflags[a]; + } + return k; +} + +bool AncillaAdd_CheckForPresence(uint8 a) { // 899d20 + for (int k = 5; k >= 0; k--) { + if (ancilla_type[k] == a) + return true; + } + return false; +} + +int AncillaAdd_ArrowFindSlot(uint8 type, uint8 ay) { // 899d36 + int k, n = 0; + for (k = 4; k >= 0; k--) { + if (ancilla_type[k] == 10) + n++; + } + if (n != ay + 1) { + for (k = 4; k >= 0; k--) { + if (ancilla_type[k] == 0) + break; + } + } else { + do { + if (sign8(--ancilla_alloc_rotate)) + ancilla_alloc_rotate = 4; + k = ancilla_alloc_rotate; + } while (ancilla_type[k] != 10); + } + if (k >= 0) { + ancilla_type[k] = type; + ancilla_floor[k] = link_is_on_lower_level; + ancilla_floor2[k] = link_is_on_lower_level_mirror; + ancilla_y_vel[k] = 0; + ancilla_x_vel[k] = 0; + ancilla_objprio[k] = 0; + ancilla_U[k] = 0; + ancilla_numspr[k] = kAncilla_Pflags[type]; + } + return k; +} + +int Ancilla_CheckInitialTile_A(int k) { // 899dd3 + static const int8 kAncilla_Yoffs_Hb[12] = {8, 0, -8, 8, 16, 24, 8, 8, 8, 8, 8, 8}; + static const int8 kAncilla_Xoffs_Hb[12] = {0, 0, 0, 0, 0, 0, 0, -8, -16, 0, 8, 16}; + int j = ancilla_dir[k] * 3; + int i; + for (i = 2; i >= 0; i--, j++) { + uint16 x = link_x_coord + kAncilla_Xoffs_Hb[j]; + uint16 y = link_y_coord + kAncilla_Yoffs_Hb[j]; + Ancilla_SetXY(k, x, y); + if (Ancilla_CheckTileCollision(k)) + break; + } + return i; +} + +bool Ancilla_CheckInitialTileCollision_Class2(int k) { // 899e44 + static const int16 kAncilla_InitialTileColl_Y[9] = {15, 16, 28, 24, 12, 12, 12, 12, 8}; + static const int16 kAncilla_InitialTileColl_X[9] = {8, 8, 8, 8, -1, 0, 17, 16, 0x4b8b}; // wtf + int j = ancilla_dir[k] * 2; + for (int n = 2; n >= 0; n--, j++) { + Ancilla_SetXY(k, link_x_coord + kAncilla_InitialTileColl_X[j], + link_y_coord + kAncilla_InitialTileColl_Y[j]); + if (Ancilla_CheckTileCollision_Class2(k)) + return true; + } + return false; +} + +uint8 Ancilla_TerminateSelectInteractives(uint8 y) { // 89ac6b + int i = 5; + + do { + if (ancilla_type[i] == 0x3e) { + y = i; + } + else if (ancilla_type[i] == 0x2c) { + dung_flag_somaria_block_switch = 0; + if (bitmask_of_dragstate & 0x80) { + bitmask_of_dragstate = 0; + link_speed_setting = 0; + } + } + + if (sign8(link_state_bits)) { + if (i + 1 != flag_is_ancilla_to_pick_up) + ancilla_type[i] = 0; + } + else { + if (i + 1 == flag_is_ancilla_to_pick_up) + flag_is_ancilla_to_pick_up = 0; + ancilla_type[i] = 0; + } + } while (--i >= 0); + + if (link_position_mode & 0x10) { + link_incapacitated_timer = 0; + link_position_mode = 0; + } + flute_countdown = 0; + tagalong_event_flags = 0; + byte_7E02F3 = 0; + flag_for_boomerang_in_place = 0; + byte_7E03FC = 0; + link_disable_sprite_damage = 0; + byte_7E03FD = 0; + link_electrocute_on_touch = 0; + if (link_player_handler_state == 19) { + link_player_handler_state = 0; + button_mask_b_y &= ~0x40; + link_cant_change_direction &= ~1; + link_position_mode &= ~4; + related_to_hookshot = 0; + } + return y; +} + +void Ancilla_SetXY(int k, uint16 x, uint16 y) { // 89ad06 + Ancilla_SetX(k, x); + Ancilla_SetY(k, y); +} + +void AncillaAdd_ExplodingSomariaBlock(int k) { // 89ad30 + ancilla_type[k] = 0x2e; + ancilla_numspr[k] = kAncilla_Pflags[0x2e]; + ancilla_aux_timer[k] = 3; + ancilla_step[k] = 0; + ancilla_item_to_link[k] = 0; + ancilla_arr3[k] = 0; + ancilla_arr1[k] = 0; + ancilla_R[k] = 0; + ancilla_objprio[k] = 0; + dung_flag_somaria_block_switch = 0; + sound_effect_2 = Ancilla_CalculateSfxPan(k) | 1; +} + +bool Ancilla_AddRupees(int k) { // 89ad6c + static const uint8 kGiveRupeeGift_Tab[5] = {1, 5, 20, 100, 50}; + uint8 a = ancilla_item_to_link[k]; + if (a == 0x34 || a == 0x35 || a == 0x36) { + link_rupees_goal += kGiveRupeeGift_Tab[a - 0x34]; + } else if (a == 0x40 || a == 0x41) { + link_rupees_goal += kGiveRupeeGift_Tab[a - 0x40 + 3]; + } else if (a == 0x46) { + link_rupees_goal += 300; + } else if (a == 0x47) { + link_rupees_goal += 20; + } else { + return false; + } + return true; +} + +void DashDust_Motive(int k) { // 89adf4 + static const uint8 kMotiveDashDust_Draw_Char[3] = {0xa9, 0xcf, 0xdf}; + if (!ancilla_timer[k]) { + ancilla_timer[k] = 3; + if (++ancilla_item_to_link[k] == 3) { + ancilla_type[k] = 0; + return; + } + } + if (link_direction_facing == 2) + Oam_AllocateFromRegionB(4); + Point16U info; + Ancilla_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + Ancilla_SetOam_XY(oam, info.x, info.y); + oam->charnum = kMotiveDashDust_Draw_Char[ancilla_item_to_link[k]]; + oam->flags = 4 | HIBYTE(oam_priority_value); + bytewise_extended_oam[oam - oam_buf] = 0; +} + +uint8 Ancilla_CalculateSfxPan(int k) { // 8dbb5e + return CalculateSfxPan(Ancilla_GetX(k)); +} + +int Ancilla_AllocInit(uint8 type, uint8 y) { // 8ff577 + int n = 0; + for (int k = 0; k < 5; k++) { + if (ancilla_type[k] == type) + n++; + } + if (y + 1 == n) + return -1; + int k = (type == 7 || type == 8) ? 1 : 4; + for (; k >= 0; k--) { + if (ancilla_type[k] == 0) + return k; + } + do { + if (sign8(--ancilla_alloc_rotate)) + ancilla_alloc_rotate = y; + uint8 type = ancilla_type[ancilla_alloc_rotate]; + if (type == 0x3c || type == 0x13 || type == 0xa) + return ancilla_alloc_rotate; + } while (ancilla_alloc_rotate != 0); + return -1; +} + +void AddSwordBeam(uint8 y) { // 8ff67b + static const int8 kSwordBeam_X[4] = {-8, -10, -22, 4}; + static const int8 kSwordBeam_Y[4] = {-24, 8, -6, -6}; + static const int8 kSwordBeam_S[4] = {-8, -8, -8, 8}; + static const uint8 kSwordBeam_Tab[16] = {0x21, 0x1d, 0x19, 0x15, 3, 0x3e, 0x3a, 0x36, 0x12, 0xe, 0xa, 6, 0x31, 0x2d, 0x29, 0x25}; + static const int8 kSwordBeam_Yvel[4] = {-64, 64, 0, 0}; + static const int8 kSwordBeam_Xvel[4] = {0, 0, -64, 64}; + + int k = Ancilla_AddAncilla(0xc, y); + if (k < 0) + return; + int j = link_direction_facing * 2; + swordbeam_arr[0] = kSwordBeam_Tab[j + 0]; + swordbeam_arr[1] = kSwordBeam_Tab[j + 1]; + swordbeam_arr[2] = kSwordBeam_Tab[j + 2]; + swordbeam_arr[3] = swordbeam_var1 = kSwordBeam_Tab[j + 3]; + ancilla_aux_timer[k] = 2; + ancilla_item_to_link[k] = 0x4c; + ancilla_arr3[k] = 8; + ancilla_step[k] = 0; + ancilla_L[k] = 0; + ancilla_G[k] = 0; + ancilla_arr1[k] = 0; + swordbeam_var2 = 14; + j = link_direction_facing >> 1; + ancilla_dir[k] = j; + ancilla_y_vel[k] = kSwordBeam_Yvel[j]; + ancilla_x_vel[k] = kSwordBeam_Xvel[j]; + ancilla_S[k] = kSwordBeam_S[j]; + + swordbeam_temp_y = link_y_coord + 12; + swordbeam_temp_x = link_x_coord + 8; + + if (Ancilla_CheckInitialTile_A(k) >= 0) { + Ancilla_SetXY(k, swordbeam_temp_x + kSwordBeam_X[j], swordbeam_temp_y + kSwordBeam_Y[j]); + sound_effect_2 = 1 | Ancilla_CalculateSfxPan(k); + ancilla_type[k] = 4; + ancilla_timer[k] = 7; + ancilla_numspr[k] = 16; + } +} + +void AncillaSpawn_SwordChargeSparkle() { // 8ff979 + static const uint8 kSwordChargeSparkle_A[4] = {0, 0, 7, 7}; + static const uint8 kSwordChargeSparkle_B[4] = {0x70, 0x70, 0, 0}; + static const uint8 kSwordChargeSparkle_X[4] = {0, 3, 4, 5}; + static const uint8 kSwordChargeSparkle_Y[4] = {5, 12, 8, 8}; + int k = Ancilla_AllocHigh(); + if (k < 0) + return; + ancilla_type[k] = 0x3c; + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 4; + ancilla_floor[k] = link_is_on_lower_level; + int j = link_direction_facing >> 1; + int8 x = 0, y = 0; + uint8 m0 = kSwordChargeSparkle_A[j]; + if (!m0) { + y = link_spin_attack_step_counter >> 2; + if (j == 0) + y = -y; + } + uint8 m1 = kSwordChargeSparkle_B[j]; + if (!m1) { + x = link_spin_attack_step_counter >> 2; + if (j == 2) + x = -x; + } + uint8 r = GetRandomNumber(); + Ancilla_SetXY(k, + link_x_coord + x + kSwordChargeSparkle_X[j] + ((r & m1) >> 4), + link_y_coord + y + kSwordChargeSparkle_Y[j] + (r & m0)); +} + +int DashTremor_TwiddleOffset(int k) { // 8ffafe + int j = ancilla_dir[k]; + uint16 y = -Ancilla_GetY(k); + Ancilla_SetY(k, y); + if (player_is_indoors) + return y; + if (j == 2) { + uint16 start = ow_scroll_vars0.ystart + 1; + uint16 end = ow_scroll_vars0.yend - 1; + uint16 a = y + BG2VOFS_copy2; + return (a <= start || a >= end) ? 0 : y; + } else { + uint16 start = ow_scroll_vars0.xstart + 1; + uint16 end = ow_scroll_vars0.xend - 1; + uint16 a = y + BG2HOFS_copy2; + return (a <= start || a >= end) ? 0 : y; + } +} + +void Ancilla_TerminateIfOffscreen(int j) { // 8ffd52 + uint16 x = Ancilla_GetX(j) - BG2HOFS_copy2; + uint16 y = Ancilla_GetY(j) - BG2VOFS_copy2; + if (x >= 244 || y >= 240) + ancilla_type[j] = 0; +} + +bool Bomb_CheckUndersideSpriteStatus(int k, Point16U *out_pt, uint8 *out_r10) { // 8ffdcf + if (ancilla_item_to_link[k] != 0) + return true; + + uint8 r10 = 0; + if (ancilla_tile_attr[k] == 9) { + if (sign8(--ancilla_arr22[k])) { + ancilla_arr22[k] = 3; + if (++ancilla_arr23[k] == 3) + ancilla_arr23[k] = 0; + } + r10 = ancilla_arr23[k] + 4; + if ((sound_effect_1 & 0x3f) == 0xb || (sound_effect_1 & 0x3f) == 0x21) + sound_effect_1 = Ancilla_CalculateSfxPan(k) | 0x28; + } else if (ancilla_tile_attr[k] == 0x40) { + r10 = 3; + } + + if (ancilla_z[k] >= 2 && ancilla_z[k] < 252) + r10 = 2; + if (k + 1 == flag_is_ancilla_to_pick_up && (link_state_bits & 0x80)) + return true; + int z = (int8)ancilla_z[k]; + out_pt->y += z + 2; + out_pt->x += -8; + *out_r10 = r10; + return false; +} + +void Sprite_CreateDeflectedArrow(int k) { // 9d8040 + ancilla_type[k] = 0; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1b, &info); + if (j >= 0) { + sprite_x_lo[j] = ancilla_x_lo[k]; + sprite_x_hi[j] = ancilla_x_hi[k]; + sprite_y_lo[j] = ancilla_y_lo[k]; + sprite_y_hi[j] = ancilla_y_hi[k]; + sprite_state[j] = 6; + sprite_delay_main[j] = 31; + sprite_x_vel[j] = ancilla_x_vel[k]; + sprite_y_vel[j] = ancilla_y_vel[k]; + sprite_floor[j] = link_is_on_lower_level; + Sprite_PlaceWeaponTink(j); + } +} + diff --git a/ancilla.h b/ancilla.h new file mode 100644 index 00000000..e8346397 --- /dev/null +++ b/ancilla.h @@ -0,0 +1,274 @@ +#pragma once +#include "zelda_rtl.h" +#include "sprite.h" + +struct CheckPlayerCollOut { + uint16 r4, r6; + uint16 r8, r10; +}; + +struct AncillaOamInfo { + uint8 x; + uint8 y; + uint8 flags; +}; + +struct AncillaRadialProjection { + uint8 r0, r2, r4, r6; +}; + +uint16 Ancilla_GetX(int k); +uint16 Ancilla_GetY(int k); +void Ancilla_SetX(int k, uint16 x); +void Ancilla_SetY(int k, uint16 y); +int Ancilla_AllocHigh(); +void Ancilla_Empty(int k); +void Ancilla_Unused_14(int k); +void Ancilla_Unused_25(int k); +void SpinSpark_Draw(int k, int offs); +bool SomarianBlock_CheckEmpty(OamEnt *oam); +void AddDashingDustEx(uint8 a, uint8 y, uint8 flag); +void AddBirdCommon(int k); +ProjectSpeedRet Bomb_ProjectSpeedTowardsPlayer(int k, uint16 x, uint16 y, uint8 vel); +void Boomerang_CheatWhenNoOnesLooking(int k, ProjectSpeedRet *pt); +void Medallion_CheckSpriteDamage(int k); +void Ancilla_CheckDamageToSprite(int k, uint8 type); +void Ancilla_CheckDamageToSprite_aggressive(int k, uint8 type); +void CallForDuckIndoors(); +void Ancilla_Sfx1_Pan(int k, uint8 v); +void Ancilla_Sfx2_Pan(int k, uint8 v); +void Ancilla_Sfx3_Pan(int k, uint8 v); +void AncillaAdd_FireRodShot(uint8 type, uint8 y); +void SomariaBlock_SpawnBullets(int k); +void Ancilla_Main(); +ProjectSpeedRet Ancilla_ProjectReflexiveSpeedOntoSprite(int k, uint16 x, uint16 y, uint8 vel); +void Bomb_CheckSpriteDamage(int k); +void Ancilla_ExecuteAll(); +void Ancilla_ExecuteOne(uint8 type, int k); +void Ancilla13_IceRodSparkle(int k); +void AncillaAdd_IceRodSparkle(int k); +void Ancilla01_SomariaBullet(int k); +bool Ancilla_ReturnIfOutsideBounds(int k, AncillaOamInfo *info); +void SomarianBlast_Draw(int k); +void Ancilla02_FireRodShot(int k); +void FireShot_Draw(int k); +uint8 Ancilla_CheckTileCollision_staggered(int k); +uint8 Ancilla_CheckTileCollision(int k); +bool Ancilla_CheckTileCollisionOneFloor(int k); +bool Ancilla_CheckTileCollision_targeted(int k, uint16 x, uint16 y); +bool Ancilla_CheckTileCollision_Class2(int k); +bool Ancilla_CheckTileCollision_Class2_Inner(int k); +void Ancilla04_BeamHit(int k); +int Ancilla_CheckSpriteCollision(int k); +bool Ancilla_CheckSpriteCollision_Single(int k, int j); +void Ancilla_SetupHitBox(int k, SpriteHitBox *hb); +ProjectSpeedRet Ancilla_ProjectSpeedTowardsPlayer(int k, uint8 vel); +PairU8 Ancilla_IsRightOfLink(int k); +PairU8 Ancilla_IsBelowLink(int k); +void Ancilla_WeaponTink(); +void Ancilla_MoveX(int k); +void Ancilla_MoveY(int k); +void Ancilla_MoveZ(int k); +void Ancilla05_Boomerang(int k); +bool Boomerang_ScreenEdge(int k); +void Boomerang_StopOffScreen(int k); +void Boomerang_Terminate(int k); +void Boomerang_Draw(int k); +void Ancilla06_WallHit(int k); +void Ancilla_SwordWallHit(int k); +void WallHit_Draw(int k); +void Ancilla07_Bomb(int k); +void Ancilla_ApplyConveyor(int k); +void Bomb_CheckSpriteAndPlayerDamage(int k); +void Ancilla_HandleLiftLogic(int k); +void Ancilla_LatchAltitudeAboveLink(int k); +void Ancilla_LatchLinkCoordinates(int k, int j); +void Ancilla_LatchCarriedPosition(int k); +uint16 Ancilla_LatchYCoordToZ(int k); +int Bomb_GetDisplacementFromLink(int k); +void Bomb_Draw(int k); +void Ancilla08_DoorDebris(int k); +void DoorDebris_Draw(int k); +void Ancilla09_Arrow(int k); +void Arrow_Draw(int k); +void Ancilla0A_ArrowInTheWall(int k); +void Ancilla0B_IceRodShot(int k); +void Ancilla11_IceRodWallHit(int k); +void IceShotSpread_Draw(int k); +void Ancilla33_BlastWallExplosion(int k); +void AncillaDraw_BlastWallBlast(int k, int x, int y); +OamEnt *AncillaDraw_Explosion(OamEnt *oam, int frame, int idx, int idx_end, uint8 r11, int x, int y); +void Ancilla15_JumpSplash(int k); +void Ancilla16_HitStars(int k); +void Ancilla17_ShovelDirt(int k); +void Ancilla32_BlastWallFireball(int k); +void Ancilla18_EtherSpell(int k); +void EtherSpell_HandleLightningStroke(int k); +void EtherSpell_HandleOrbPulse(int k); +void EtherSpell_HandleRadialSpin(int k); +OamEnt *AncillaDraw_EtherBlitzBall(OamEnt *oam, const AncillaRadialProjection *arp, int s); +OamEnt *AncillaDraw_EtherBlitzSegment(OamEnt *oam, const AncillaRadialProjection *arp, int s, int k); +void AncillaDraw_EtherBlitz(int k); +void AncillaDraw_EtherOrb(int k, OamEnt *oam); +void AncillaAdd_BombosSpell(uint8 a, uint8 y); +void Ancilla19_BombosSpell(int k); +void BombosSpell_ControlFireColumns(int k); +void BombosSpell_FinishFireColumns(int kk); +void AncillaDraw_BombosFireColumn(int kk); +void BombosSpell_ControlBlasting(int kk); +void AncillaDraw_BombosBlast(int k); +void Ancilla1C_QuakeSpell(int k); +void QuakeSpell_ShakeScreen(int k); +void QuakeSpell_ControlBolts(int k); +void AncillaDraw_QuakeInitialBolts(int k); +void QuakeSpell_SpreadBolts(int k); +void Ancilla1A_PowderDust(int k); +void Ancilla_MagicPowder_Draw(int k); +void Powder_ApplyDamageToSprites(int k); +void Ancilla1D_ScreenShake(int k); +void Ancilla1E_DashDust(int k); +void Ancilla1F_Hookshot(int k); +void Ancilla20_Blanket(int k); +void Ancilla21_Snore(int k); +void Ancilla3B_SwordUpSparkle(int k); +void Ancilla3C_SpinAttackChargeSparkle(int k); +void Ancilla35_MasterSwordReceipt(int k); +void Ancilla22_ItemReceipt(int k); +OamEnt *Ancilla_ReceiveItem_Draw(int k, int x, int y); +void Ancilla28_WishPondItem(int k); +void WishPondItem_Draw(int k); +void Ancilla42_HappinessPondRupees(int k); +void HapinessPondRupees_ExecuteRupee(int k, int i); +void HapinessPondRupees_GetState(int j, int k); +void HapinessPondRupees_SaveState(int k, int j); +void Ancilla_TransmuteToSplash(int k); +void Ancilla3D_ItemSplash(int k); +void ObjectSplash_Draw(int k); +void Ancilla29_MilestoneItemReceipt(int k); +void ItemReceipt_TransmuteToRisingCrystal(int k); +void Ancilla_RisingCrystal(int k); +void AncillaAdd_OccasionalSparkle(int k); +void Ancilla43_GanonsTowerCutscene(int k); +void AncillaDraw_GTCutsceneCrystal(OamEnt *oam, int x, int y); +void GTCutscene_ActivateSparkle(); +OamEnt *GTCutscene_SparkleALot(OamEnt *oam); +void Ancilla36_Flute(int k); +void Ancilla37_WeathervaneExplosion(int k); +void AncillaDraw_WeathervaneExplosionWoodDebris(int k); +void Ancilla38_CutsceneDuck(int k); +void Ancilla23_LinkPoof(int k); +void MorphPoof_Draw(int k); +void Ancilla40_DwarfPoof(int k); +void Ancilla3F_BushPoof(int k); +void Ancilla26_SwordSwingSparkle(int k); +void Ancilla2A_SpinAttackSparkleA(int k); +void SpinAttackSparkleA_TransmuteToNextSpark(int k); +void Ancilla2B_SpinAttackSparkleB(int k); +Point16U Sparkle_PrepOamFromRadial(AncillaRadialProjection p); +void SpinAttackSparkleB_Closer(int k); +void Ancilla30_ByrnaWindupSpark(int k); +void ByrnaWindupSpark_TransmuteToNormal(int k); +void Ancilla31_ByrnaSpark(int k); +void Ancilla_SwordBeam(int k); +void Ancilla0D_SpinAttackFullChargeSpark(int k); +void Ancilla27_Duck(int k); +void AncillaAdd_SomariaBlock(uint8 type, uint8 y); +void SomariaBlock_CheckForTransitTile(int k); +int Ancilla_CheckBasicSpriteCollision(int k); +bool Ancilla_CheckBasicSpriteCollision_Single(int k, int j); +void Ancilla_SetupBasicHitBox(int k, SpriteHitBox *hb); +void Ancilla2C_SomariaBlock(int k); +void AncillaDraw_SomariaBlock(int k); +bool SomariaBlock_CheckForSwitch(int k); +void SomariaBlock_FizzleAway(int k); +void Ancilla2D_SomariaBlockFizz(int k); +void Ancilla39_SomariaPlatformPoof(int k); +void Ancilla2E_SomariaBlockFission(int k); +void Ancilla2F_LampFlame(int k); +void Ancilla41_WaterfallSplash(int k); +void Ancilla24_Gravestone(int k); +void Ancilla34_SkullWoodsFire(int k); +void Ancilla3A_BigBombExplosion(int k); +void RevivalFairy_Main(); +void RevivalFairy_Dust(); +void RevivalFairy_MonitorHP(); +void GameOverText_Draw(); +int AncillaAdd_AddAncilla_Bank08(uint8 type, uint8 y); +void Ancilla_PrepOamCoord(int k, Point16U *info); +void Ancilla_PrepAdjustedOamCoord(int k, Point16U *info); +void Ancilla_SetOam_XY(OamEnt *oam, uint16 x, uint16 y); +uint8 Ancilla_SetOam_XY_safe(OamEnt *oam, uint16 x, uint16 y); +bool Ancilla_CheckLinkCollision(int k, int j, CheckPlayerCollOut *out); +bool Hookshot_CheckProximityToLink(int x, int y); +bool Ancilla_CheckForEntranceTrigger(int what); +void AncillaDraw_Shadow(OamEnt *oam, int k, int x, int y, uint8 pal); +void Ancilla_AllocateOamFromRegion_B_or_E(uint8 size); +OamEnt *Ancilla_AllocateOamFromCustomRegion(OamEnt *oam); +OamEnt *HitStars_UpdateOamBufferPosition(OamEnt *oam); +bool Hookshot_ShouldIEvenBotherWithTiles(int k); +AncillaRadialProjection Ancilla_GetRadialProjection(uint8 a, uint8 r8); +int Ancilla_AllocateOamFromRegion_A_or_D_or_F(int k, uint8 size); +void Ancilla_AddHitStars(uint8 a, uint8 y); +void AncillaAdd_Blanket(uint8 a); +void AncillaAdd_Snoring(uint8 a, uint8 y); +void AncillaAdd_Bomb(uint8 a, uint8 y); +uint8 AncillaAdd_Boomerang(uint8 a, uint8 y); +void AncillaAdd_TossedPondItem(uint8 a, uint8 xin, uint8 yin); +void AddHappinessPondRupees(uint8 arg); +void AncillaAdd_FallingPrize(uint8 a, uint8 item_idx, uint8 yv); +void AncillaAdd_ChargedSpinAttackSparkle(); +void AncillaAdd_ExplodingWeatherVane(uint8 a, uint8 y); +void AncillaAdd_CutsceneDuck(uint8 a, uint8 y); +void AncillaAdd_SomariaPlatformPoof(int k); +void AncillaAdd_SuperBombExplosion(uint8 a, uint8 y); +void ConfigureRevivalAncillae(); +void AncillaAdd_LampFlame(uint8 a, uint8 y); +void AncillaAdd_MSCutscene(uint8 a, uint8 y); +void AncillaAdd_DashDust(uint8 a, uint8 y); +void AncillaAdd_DashDust_charging(uint8 a, uint8 y); +void AncillaAdd_BlastWallFireball(uint8 a, uint8 y, int r4); +int AncillaAdd_Arrow(uint8 a, uint8 ax, uint8 ay, uint16 xcoord, uint16 ycoord); +void AncillaAdd_BunnyPoof(uint8 a, uint8 y); +void AncillaAdd_CapePoof(uint8 a, uint8 y); +void AncillaAdd_DwarfPoof(uint8 ain, uint8 yin); +void AncillaAdd_BushPoof(uint16 x, uint16 y); +void AncillaAdd_EtherSpell(uint8 a, uint8 y); +void AncillaAdd_VictorySpin(); +void AncillaAdd_MagicPowder(uint8 a, uint8 y); +void AncillaAdd_WallTapSpark(uint8 a, uint8 y); +void AncillaAdd_SwordSwingSparkle(uint8 a, uint8 y); +void AncillaAdd_DashTremor(uint8 a, uint8 y); +void AncillaAdd_BoomerangWallClink(int k); +void AncillaAdd_HookshotWallClink(int kin, uint8 a, uint8 y); +void AncillaAdd_Duck_take_off(uint8 a, uint8 y); +void AddBirdTravelSomething(uint8 a, uint8 y); +void AncillaAdd_QuakeSpell(uint8 a, uint8 y); +void AncillaAdd_SpinAttackInitSpark(uint8 a, uint8 x, uint8 y); +void AncillaAdd_BlastWall(); +void AncillaAdd_SwordChargeSparkle(int k); +void AncillaAdd_SilverArrowSparkle(int kin); +void AncillaAdd_IceRodShot(uint8 a, uint8 y); +bool AncillaAdd_Splash(uint8 a, uint8 y); +void AncillaAdd_GraveStone(uint8 ain, uint8 yin); +void AncillaAdd_WaterfallSplash(); +void AncillaAdd_GTCutscene(); +int AncillaAdd_DoorDebris(); +void FireRodShot_BecomeSkullWoodsFire(int k); +int Ancilla_AddAncilla(uint8 a, uint8 y); +bool AncillaAdd_CheckForPresence(uint8 a); +int AncillaAdd_ArrowFindSlot(uint8 type, uint8 ay); +int Ancilla_CheckInitialTile_A(int k); +bool Ancilla_CheckInitialTileCollision_Class2(int k); +uint8 Ancilla_TerminateSelectInteractives(uint8 y); +void Ancilla_SetXY(int k, uint16 x, uint16 y); +void AncillaAdd_ExplodingSomariaBlock(int k); +bool Ancilla_AddRupees(int k); +void DashDust_Motive(int k); +uint8 Ancilla_CalculateSfxPan(int k); +int Ancilla_AllocInit(uint8 type, uint8 y); +void AddSwordBeam(uint8 y); +void AncillaSpawn_SwordChargeSparkle(); +int DashTremor_TwiddleOffset(int k); +void Ancilla_TerminateIfOffscreen(int j); +bool Bomb_CheckUndersideSpriteStatus(int k, Point16U *out_pt, uint8 *out_r10); +void Sprite_CreateDeflectedArrow(int k); diff --git a/attract.cpp b/attract.cpp new file mode 100644 index 00000000..874de94a --- /dev/null +++ b/attract.cpp @@ -0,0 +1,1092 @@ +#include "zelda_rtl.h" +#include "variables.h" +#include "variables_attract.h" +#include "snes_regs.h" +#include "load_gfx.h" +#include "dungeon.h" +#include "sprite.h" +#include "ending.h" +#include "messaging.h" +#include "attract.h" +#include "sprite_main.h" + +const uint16 kMapMode_Zooms1[224] = { + 375, 374, 373, 373, 372, 371, 371, 370, 369, 369, 368, 367, 367, 366, 365, 365, + 364, 363, 363, 361, 361, 360, 359, 359, 358, 357, 357, 356, 355, 355, 354, 354, + 353, 352, 352, 351, 351, 350, 349, 349, 348, 348, 347, 346, 346, 345, 345, 344, + 343, 343, 342, 342, 341, 341, 340, 339, 339, 338, 338, 337, 337, 336, 335, 335, + 334, 334, 333, 333, 332, 332, 331, 331, 330, 330, 328, 327, 327, 326, 326, 325, + 325, 324, 324, 323, 323, 322, 322, 321, 321, 320, 320, 319, 319, 318, 318, 317, + 317, 316, 316, 315, 315, 314, 314, 313, 313, 312, 312, 311, 311, 310, 310, 309, + 309, 309, 308, 308, 307, 307, 306, 306, 305, 305, 304, 304, 303, 303, 303, 302, + 302, 301, 301, 300, 300, 299, 299, 299, 298, 298, 297, 297, 295, 295, 294, 294, + 294, 293, 293, 292, 292, 292, 291, 291, 290, 290, 289, 289, 289, 288, 288, 287, + 287, 287, 286, 286, 285, 285, 285, 284, 284, 283, 283, 283, 282, 282, 281, 281, + 281, 280, 280, 279, 279, 279, 278, 278, 278, 277, 277, 276, 276, 276, 275, 275, + 275, 274, 274, 273, 273, 273, 272, 272, 272, 271, 271, 271, 270, 270, 269, 269, + 269, 268, 268, 268, 267, 267, 267, 266, 266, 266, 265, 265, 265, 264, 264, 264, +}; +const uint16 kMapMode_Zooms2[224] = { + 136, 136, 135, 135, 135, 135, 135, 134, 134, 134, 133, 133, 133, 133, 132, 132, + 132, 132, 132, 131, 131, 131, 130, 130, 130, 130, 130, 129, 129, 129, 129, 129, + 128, 128, 128, 127, 127, 127, 127, 127, 126, 126, 126, 126, 126, 125, 125, 125, + 124, 124, 124, 124, 124, 124, 123, 123, 123, 123, 123, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 120, 120, 120, 120, 120, 120, 119, 119, 119, 118, 118, 118, + 118, 118, 118, 117, 117, 117, 117, 117, 117, 116, 116, 116, 116, 115, 115, 115, + 115, 115, 115, 114, 114, 114, 114, 114, 114, 113, 113, 113, 113, 112, 112, 112, + 112, 112, 112, 112, 111, 111, 111, 111, 111, 111, 110, 110, 110, 110, 110, 109, + 109, 109, 109, 109, 109, 108, 108, 108, 108, 108, 108, 108, 107, 107, 107, 107, + 107, 106, 106, 106, 106, 106, 106, 106, 105, 105, 105, 105, 105, 105, 105, 104, + 104, 104, 104, 104, 103, 103, 103, 103, 103, 103, 103, 103, 102, 102, 102, 102, + 102, 102, 102, 101, 101, 101, 101, 101, 101, 100, 100, 100, 100, 100, 100, 100, + 100, 99, 99, 99, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 96, 96, 96, 96, 96, 96, 96, 96, 96, +}; +static const uint8 kAttract_Legendgraphics_0[157+1] = { + 0x61, 0x65, 0x40, 0x28, 0, 0x35, 0x61, 0x85, 0x40, 0x28, 0x10, 0x35, 0x61, 0xa5, 0, 0x29, + 1, 0x35, 2, 0x35, 1, 0x35, 2, 0x35, 1, 0x35, 2, 0x35, 1, 0x35, 2, 0x35, + 1, 0x35, 3, 0x31, 3, 0x71, 2, 0x35, 1, 0x35, 2, 0x35, 1, 0x35, 2, 0x35, + 1, 0x35, 2, 0x35, 1, 0x35, 2, 0x35, 1, 0x35, 0x61, 0xc5, 0, 0x29, 0x11, 0x35, + 0x12, 0x35, 0x11, 0x35, 0x12, 0x35, 0x11, 0x35, 0x12, 0x35, 0x11, 0x35, 0x12, 0x35, 0x11, 0x35, + 0x13, 0x35, 0x13, 0x75, 0x12, 0x35, 0x11, 0x35, 0x12, 0x35, 0x11, 0x35, 0x12, 0x35, 0x11, 0x35, + 0x12, 0x35, 0x11, 0x35, 0x12, 0x35, 0x11, 0x35, 0x61, 0xe5, 0, 0x29, 0x20, 0x35, 0x21, 0x35, + 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x21, 0x35, + 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x21, 0x35, + 0x20, 0x35, 0x21, 0x35, 0x20, 0x35, 0x62, 5, 0x40, 0x28, 0, 0xb5, 0xff, 0x61, +}; +static const uint8 kAttract_Legendgraphics_1[237+1] = { + 0x61, 0x65, 0x40, 0x28, 0, 0x35, 0x61, 0x85, 0, 0x13, 0x10, 0x35, 0x4e, 0x75, 0x6e, 0x35, + 0x10, 0x35, 0x4e, 0x35, 0x10, 0x35, 0x4c, 0x35, 0x10, 0x35, 0x4e, 0x75, 0x49, 0x35, 0x61, 0x8f, + 0x40, 8, 0x10, 0x35, 0x61, 0x94, 0, 0xb, 0x4e, 0x75, 0x6e, 0x35, 0x10, 0x35, 0x4e, 0x35, + 0x10, 0x35, 0x4c, 0x35, 0x61, 0xa5, 0, 0x29, 0x5f, 0x75, 0x5e, 0x75, 0x7e, 0x35, 0x7f, 0x35, + 0x5e, 0x35, 0x5f, 0x35, 0x4d, 0x35, 0x5f, 0x75, 0x5e, 0x75, 0x4a, 0x35, 0x4b, 0x35, 0x10, 0x35, + 0x49, 0x75, 0x10, 0x35, 0x5f, 0x75, 0x5e, 0x75, 0x7e, 0x35, 0x7f, 0x35, 0x5e, 0x35, 0x5f, 0x35, + 0x4d, 0x35, 0x61, 0xc5, 0, 0x29, 0x50, 0x35, 0x51, 0x35, 0x52, 0x35, 0x53, 0x35, 0x54, 0x35, + 0x55, 0x35, 0x56, 0x35, 0x57, 0x35, 0x58, 0x35, 0x59, 0x35, 0x5a, 0x35, 0x5b, 0x35, 0x5c, 0x35, + 0x5d, 0x35, 0x50, 0x35, 0x51, 0x35, 0x52, 0x35, 0x53, 0x35, 0x54, 0x35, 0x55, 0x35, 0x56, 0x35, + 0x61, 0xe5, 0, 0x29, 0x60, 0x35, 0x61, 0x35, 0x62, 0x35, 0x63, 0x35, 0x64, 0x35, 0x65, 0x35, + 0x66, 0x35, 0x67, 0x35, 0x68, 0x35, 0x69, 0x35, 0x6a, 0x35, 0x6b, 0x35, 0x6c, 0x35, 0x6d, 0x35, + 0x60, 0x35, 0x61, 0x35, 0x62, 0x35, 0x63, 0x35, 0x64, 0x35, 0x65, 0x35, 0x66, 0x35, 0x62, 5, + 0, 0x29, 0x70, 0x35, 0x71, 0x35, 0x72, 0x35, 0x73, 0x35, 0x74, 0x35, 0x75, 0x35, 0x76, 0x35, + 0x77, 0x35, 0x78, 0x35, 0x79, 0x35, 0x7a, 0x35, 0x7b, 0x35, 0x7c, 0x35, 0x7d, 0x35, 0x70, 0x35, + 0x71, 0x35, 0x72, 0x35, 0x73, 0x35, 0x74, 0x35, 0x75, 0x35, 0x76, 0x35, 0xff, 0x61, +}; +static const uint8 kAttract_Legendgraphics_2[199+1] = { + 0x61, 0x65, 0x40, 0x28, 0, 0x35, 0x61, 0x85, 0x40, 0x28, 0x10, 0x35, 0x61, 0xa5, 0, 0x1d, + 0x22, 0x35, 0x23, 0x35, 0x10, 0x35, 0x22, 0x35, 0x23, 0x35, 0x10, 0x35, 0x22, 0x35, 0x23, 0x35, + 0x10, 0x35, 0x22, 0x35, 0x23, 0x35, 0x10, 0x35, 0x10, 0x75, 0x23, 0x75, 0x22, 0x75, 0x61, 0xb4, + 0x40, 6, 0x10, 0x35, 0x61, 0xb8, 0, 3, 0x23, 0x75, 0x22, 0x75, 0x61, 0xc5, 0, 0x29, + 4, 0x35, 5, 0x35, 6, 0x35, 4, 0x35, 5, 0x35, 6, 0x35, 4, 0x35, 5, 0x35, + 6, 0x35, 4, 0x35, 5, 0x35, 6, 0x35, 6, 0x75, 5, 0x75, 4, 0x75, 0x10, 0x75, + 0x23, 0x75, 0x22, 0x75, 6, 0x75, 5, 0x75, 4, 0x75, 0x61, 0xe5, 0, 0x29, 0x14, 0x35, + 0x15, 0x35, 0x16, 0x35, 0x14, 0x35, 0x15, 0x35, 0x16, 0x35, 0x14, 0x35, 0x15, 0x35, 0x16, 0x35, + 0x14, 0x35, 0x15, 0x35, 0x16, 0x35, 0x16, 0x75, 0x15, 0x75, 0x14, 0x75, 6, 0x75, 5, 0x75, + 4, 0x75, 0x16, 0x75, 0x15, 0x75, 0x14, 0x75, 0x62, 5, 0, 0x29, 0x24, 0x35, 0x25, 0x35, + 0x26, 0x35, 0x24, 0x35, 0x25, 0x35, 0x26, 0x35, 0x24, 0x35, 0x25, 0x35, 0x26, 0x35, 0x24, 0x35, + 0x25, 0x35, 0x26, 0x35, 0x26, 0x75, 0x25, 0x75, 0x24, 0x75, 0x26, 0x75, 0x25, 0x75, 0x24, 0x75, + 0x26, 0x75, 0x25, 0x75, 0x24, 0x75, 0xff, 0x61, +}; +static const uint8 kAttract_Legendgraphics_3[265+1] = { + 0x61, 0x65, 0, 0x29, 0, 0x35, 0, 0x35, 0x1b, 0x35, 0x30, 0x35, 0x31, 0x35, 0x32, 0x35, + 0, 0x35, 0, 0x35, 0, 0x35, 0x33, 0x35, 0x41, 0x35, 0x41, 0x75, 0x33, 0x75, 0, 0x75, + 0, 0x75, 0, 0x75, 0x32, 0x75, 0x31, 0x75, 0x30, 0x75, 0x1b, 0x75, 0, 0x75, 0x61, 0x85, + 0x40, 0x1e, 0x10, 0x35, 0x61, 0x86, 0, 9, 0x34, 0x35, 0xb, 0x35, 0x40, 0x35, 0x41, 0x35, + 0x42, 0x35, 0x61, 0x95, 0, 9, 0x42, 0x75, 0x41, 0x75, 0x40, 0x75, 0xb, 0x75, 0x34, 0x75, + 0x61, 0xa5, 0, 0x29, 0x43, 0x35, 0x44, 0x35, 7, 0x35, 8, 0x35, 9, 0x35, 0xa, 0x35, + 0x10, 0x35, 0xc, 0x35, 0xd, 0x35, 0xe, 0x35, 0xf, 0x35, 0xf, 0x75, 0xe, 0x75, 0xd, 0x75, + 0xc, 0x75, 0x10, 0x75, 0xa, 0x75, 9, 0x75, 8, 0x75, 7, 0x75, 0x44, 0x75, 0x61, 0xc5, + 0, 0x29, 0x35, 0x35, 0x36, 0x35, 0x17, 0x35, 0x18, 0x35, 0x19, 0x35, 0x1a, 0x35, 0x10, 0x35, + 0x1c, 0x35, 0x1d, 0x35, 0x1e, 0x35, 0x1f, 0x35, 0x1f, 0x75, 0x1e, 0x75, 0x1d, 0x75, 0x1c, 0x75, + 0x10, 0x75, 0x1a, 0x75, 0x19, 0x75, 0x18, 0x75, 0x17, 0x75, 0x36, 0x75, 0x61, 0xe5, 0, 0x29, + 0x45, 0x35, 0x46, 0x35, 0x27, 0x35, 0x28, 0x35, 0x29, 0x35, 0x2a, 0x35, 0x2b, 0x35, 0x2c, 0x35, + 0x2d, 0x35, 0x2e, 0x35, 0x2f, 0x35, 0x2f, 0x75, 0x2e, 0x75, 0x2d, 0x75, 0x2c, 0x75, 0x2b, 0x75, + 0x2a, 0x75, 0x29, 0x75, 0x28, 0x75, 0x27, 0x75, 0x46, 0x75, 0x62, 5, 0, 0x29, 0x47, 0x35, + 0x48, 0x35, 0x37, 0x35, 0x38, 0x35, 0x39, 0x35, 0x3a, 0x35, 0x3b, 0x35, 0x3c, 0x35, 0x3d, 0x35, + 0x3e, 0x35, 0x3f, 0x35, 0x3f, 0x75, 0x3e, 0x75, 0x3d, 0x75, 0x3c, 0x75, 0x3b, 0x75, 0x3a, 0x75, + 0x39, 0x75, 0x38, 0x75, 0x37, 0x75, 0x48, 0x75, 0xff, 0x0 +}; +void Attract_DrawSpriteSet2(const AttractOamInfo *p, int n) { + OamEnt *oam = &oam_buf[attract_oam_idx + 64]; + attract_oam_idx += n; + for (; n--; oam++) { + oam->x = attract_x_base + p[n].x; + oam->y = attract_y_base + p[n].y; + oam->charnum = p[n].c; + oam->flags = p[n].f; + bytewise_extended_oam[oam - oam_buf] = p[n].e; + } +} + +void Attract_ZeldaPrison_Case0() { + static const AttractOamInfo kZeldaPrison_Oams0[] = { + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x84, 0x3b, 2}, + {16, 0, 0x84, 0x7b, 2}, + { 0, 16, 0xa4, 0x3b, 2}, + {16, 16, 0xa4, 0x7b, 2}, + }; + if (!attract_var4) + attract_var5++; + if (frame_counter & 1) + attract_vram_dst--; + attract_x_base = 0x58; + attract_y_base = attract_var9; + Attract_DrawSpriteSet2(kZeldaPrison_Oams0, 6); + attract_var7 = 0xf8d9; +} + +void Attract_ZeldaPrison_Case1() { + int k; + static const AttractOamInfo kZeldaPrison_Oams1[] = { + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x84, 0x3b, 2}, + {16, 0, 0x84, 0x7b, 2}, + { 0, 16, 0xa4, 0x3b, 2}, + {16, 16, 0xa4, 0x7b, 2}, + + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0xc4, 0x3b, 2}, + {16, 0, 0xc2, 0x3b, 2}, + { 0, 16, 0xe4, 0x3b, 2}, + {16, 16, 0xe6, 0x3b, 2}, + + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x88, 0x3b, 2}, + {16, 0, 0x8a, 0x3b, 2}, + { 0, 16, 0xa8, 0x3b, 2}, + {16, 16, 0xaa, 0x3b, 2}, + + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x82, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa2, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x80, 0x3b, 2}, + {16, 0, 0x80, 0x7b, 2}, + { 0, 16, 0xa0, 0x3b, 2}, + {16, 16, 0xa0, 0x7b, 2}, + }; + if (attract_var10 < 0x80 && (Attract_ShowTimedTextMessage(), oam_priority_value != 0)) { + k = 4; + } else if (attract_var9 != 0x6e) { + attract_var9--; + k = 0; + } else { + if (attract_var10 < 31 && !(attract_var10 & 1)) + INIDISP_copy--; + if (!--attract_var10) { + attract_sequence++; + attract_state -= 2; + return; + } + + k = attract_var10 >= 0xc0 ? 0 : + attract_var10 >= 0xb8 ? 1 : + attract_var10 >= 0xb0 ? 2 : + attract_var10 >= 0xa0 ? 3 : 4; + } + if (frame_counter & 1) + attract_vram_dst--; + attract_x_base = 0x58; + attract_y_base = attract_var9; + Attract_DrawSpriteSet2(&kZeldaPrison_Oams1[k * 6], 6); +} + +void Attract_ZeldaPrison_DrawA() { + OamEnt *oam = &oam_buf[64 + attract_oam_idx]; + + uint8 ext = attract_x_base_hi ? 3 : 2; + bytewise_extended_oam[oam - oam_buf] = ext; + bytewise_extended_oam[oam - oam_buf + 1] = ext; + + oam[0].x = oam[1].x = attract_x_base; + int j = (attract_var1 >> 3) & 1; + oam[0].y = attract_y_base + j; + oam[1].y = attract_y_base + 10; + oam[0].charnum = 6; + oam[1].charnum = j ? 10 : 8; + oam[0].flags = oam[1].flags = 0x3d; + + attract_oam_idx += 2; +} + +void Attract_MaidenWarp_Case0() { + if (attract_var11) + attract_var5++; +} + +void Attract_MaidenWarp_Case1() { + static const AttractOamInfo kZeldaPrison_MaidenWarpCase1_Oam[] = { + { 0, 0, 0xce, 0x35, 0}, + {28, 0, 0xce, 0x35, 0}, + {-2, 3, 0x26, 0x75, 0}, + {30, 3, 0x26, 0x35, 0}, + {-2, 11, 0x36, 0x75, 0}, + {30, 11, 0x36, 0x35, 0}, + { 0, 16, 0x26, 0x75, 0}, + {28, 16, 0x26, 0x35, 0}, + { 0, 24, 0x36, 0x75, 0}, + {28, 24, 0x36, 0x35, 0}, + { 2, 16, 0x20, 0x35, 2}, + {18, 16, 0x20, 0x75, 2}, + { 2, 32, 0x20, 0xb5, 2}, + {18, 32, 0x20, 0xf5, 2}, + { 0, 0, 0xce, 0x37, 0}, + {28, 0, 0xce, 0x37, 0}, + {-2, 3, 0x26, 0x77, 0}, + {30, 3, 0x26, 0x37, 0}, + {-2, 11, 0x36, 0x77, 0}, + {30, 11, 0x36, 0x37, 0}, + { 0, 16, 0x26, 0x77, 0}, + {28, 16, 0x26, 0x37, 0}, + { 0, 24, 0x36, 0x77, 0}, + {28, 24, 0x36, 0x37, 0}, + { 2, 16, 0x22, 0x37, 2}, + {18, 16, 0x22, 0x77, 2}, + { 2, 32, 0x22, 0xb7, 2}, + {18, 32, 0x22, 0xf7, 2}, + }; + int k = frame_counter >> 2 & 1; + static const uint8 kAttract_MaidenWarp_Case1_Num[8] = { 2, 2, 2, 6, 6, 10, 10, 14 }; + attract_x_base = 110; + attract_y_base = 72; + Attract_DrawSpriteSet2(kZeldaPrison_MaidenWarpCase1_Oam + k * 14, kAttract_MaidenWarp_Case1_Num[attract_var21 >> 1 & 7]); + + if (!attract_var21 && attract_var20 == 0x70) + sound_effect_2 = 0x27; + + if (attract_var21 == 15) { + attract_var5++; + } else { + if (attract_var21 == 6) { + intro_times_pal_flash = 0x90; + sound_effect_2 = 0x2b; + } + if (attract_var20) + attract_var20--; + else + attract_var21++; + } +} + +void Attract_MaidenWarp_Case2() { + static const uint8 kMaidenWarp_Case2_Num[8] = { 4, 4, 8, 8, 12, 12, 14, 14 }; + static const AttractOamInfo kAttract_MaidenWarpCase2_Oam[] = { + { 0, 0, 0xce, 0x35, 0}, + {28, 0, 0xce, 0x35, 0}, + {-2, 3, 0x26, 0x75, 0}, + {30, 3, 0x26, 0x35, 0}, + {-2, 11, 0x36, 0x75, 0}, + {30, 11, 0x36, 0x35, 0}, + { 0, 16, 0x26, 0x75, 0}, + {28, 16, 0x26, 0x35, 0}, + { 0, 24, 0x36, 0x75, 0}, + {28, 24, 0x36, 0x35, 0}, + { 2, 16, 0x20, 0x35, 2}, + {18, 16, 0x20, 0x75, 2}, + { 2, 32, 0x20, 0xb5, 2}, + {18, 32, 0x20, 0xf5, 2}, + { 0, 0, 0xce, 0x37, 0}, + {28, 0, 0xce, 0x37, 0}, + {-2, 3, 0x26, 0x77, 0}, + {30, 3, 0x26, 0x37, 0}, + {-2, 11, 0x36, 0x77, 0}, + {30, 11, 0x36, 0x37, 0}, + { 0, 16, 0x26, 0x77, 0}, + {28, 16, 0x26, 0x37, 0}, + { 0, 24, 0x36, 0x77, 0}, + {28, 24, 0x36, 0x37, 0}, + { 2, 16, 0x22, 0x37, 2}, + {18, 16, 0x22, 0x77, 2}, + { 2, 32, 0x22, 0xb7, 2}, + {18, 32, 0x22, 0xf7, 2}, + }; + attract_x_base = 110; + attract_y_base = 72; + int k = frame_counter >> 2 & 1; + int n = kMaidenWarp_Case2_Num[attract_var21 >> 1 & 7]; + Attract_DrawSpriteSet2(kAttract_MaidenWarpCase2_Oam + k * 14 + (14 - n), n); + if (attract_var21 == 0) { + if (!--attract_var19) + attract_var5++; + } else { + attract_var21--; + } +} + +void Attract_MaidenWarp_Case3() { + static const AttractOamInfo kAttract_MaidenWarpCase3_Oam[] = { + { 0, 0, 0xc6, 0x3d, 2}, + { 0, 0, 0x24, 0x35, 2}, + {16, 0, 0x24, 0x75, 2}, + }; + static const uint8 kMaidenWarp_Case3_Xbase[2] = { 0x78, 0x70 }; + + if (attract_var21 == 6) { + attract_var15++; + sound_effect_1 = 51; + } else if (attract_var21 == 0x40) { + attract_var21 = 224; + attract_var5++; + } else if (attract_var21 < 0xf) { + int k = attract_var21 >> 3 & 1; + attract_x_base = kMaidenWarp_Case3_Xbase[k]; + attract_y_base = 0x60; + Attract_DrawSpriteSet2(kAttract_MaidenWarpCase3_Oam + k, k ? 2 : 1); + } + attract_var21++; +} + +void Attract_MaidenWarp_Case4() { + Attract_ShowTimedTextMessage(); + if (!oam_priority_value) { + if (attract_var21 < 31 && !(attract_var21 & 1)) { + INIDISP_copy--; + } + if (!--attract_var21) + attract_var22++; + } +} + +void Dungeon_LoadAndDrawEntranceRoom(uint8 a) { // 82c533 + attract_room_index = a; + Dungeon_LoadEntrance(); + dung_num_lit_torches = 0; + hdr_dungeon_dark_with_lantern = 0; + Dungeon_LoadAndDrawRoom(); + Dungeon_ResetTorchBackgroundAndPlayer(); +} + +void Dungeon_SaveAndLoadLoadAllPalettes(uint8 a, uint8 k) { // 82c546 + sprite_graphics_index = k; + main_tile_theme_index = a; + aux_tile_theme_index = a; + InitializeTilesets(); + overworld_palette_aux_or_main = 0x200; + flag_update_cgram_in_nmi++; + Palette_BgAndFixedColor_Black(); + Palette_Load_SpritePal0Left(); + Palette_Load_SpriteMain(); + Palette_Load_SpriteAux1(); + Palette_Load_SpriteAux2(); + Palette_Load_SpriteEnvironment_Dungeon(); + Palette_Load_HUD(); + Palette_Load_DungeonSet(); +} + +void Module14_Attract() { // 8cedad + uint8 st = attract_state; + if (INIDISP_copy && INIDISP_copy != 128 && st && st != 2 && st != 6 && filtered_joypad_H & 0x90) + attract_state = st = 9; + + switch (st) { + case 0: Attract_Fade(); break; + case 1: Attract_InitGraphics(); break; + case 2: Attract_FadeOutSequence(); break; + case 3: Attract_LoadNewScene(); break; + case 4: Attract_FadeInSequence(); break; + case 5: Attract_EnactStory(); break; + case 6: Attract_FadeOutSequence(); break; + case 7: Attract_LoadNewScene(); break; + case 8: Attract_EnactStory(); break; + case 9: Attract_SkipToFileSelect(); break; + } +} + +void Attract_Fade() { // 8cede6 + Intro_HandleAllTriforceAnimations(); + intro_did_run_step = 0; + is_nmi_thread_active = 0; + Intro_PeriodicSwordAndIntroFlash(); + if (INIDISP_copy) { + INIDISP_copy--; + return; + } + EnableForceBlank(); + irq_flag = 255; + is_nmi_thread_active = 0; + nmi_flag_update_polyhedral = 0; + attract_state++; +} + +void Attract_InitGraphics() { // 8cee0c + memset(&attract_var12, 0, 0x51); + EraseTileMaps_normal(); + Attract_LoadBG3GFX(); + overworld_palette_mode = 4; + hud_palette = 1; + overworld_palette_aux_or_main = 0; + Palette_Load_HUD(); + overworld_palette_aux_or_main = 0x200; + Palette_Load_OWBGMain(); + Palette_Load_HUD(); + Palette_Load_LinkArmorAndGloves(); + main_palette_buffer[0x1d] = 0x3800; + flag_update_cgram_in_nmi++; + BYTE(BG3VOFS_copy2) = 20; + Attract_BuildBackgrounds(); + messaging_module = 0; + dialogue_message_index = 0x112; + BG2VOFS_copy2 = 0; + attract_legend_ctr = 0x1010; + attract_state += 3; + HdmaSetup(0xCFA87, 0xCFA94, 1, (uint8)WH0, (uint8)WH2, 0); + HDMAEN_copy = 0xc0; + + W12SEL_copy = 0; + W34SEL_copy = 0; + WOBJSEL_copy = 0xb0; + TMW_copy = 3; + TSW_copy = 0; + COLDATA_copy0 = 0x25; + COLDATA_copy1 = 0x45; + COLDATA_copy2 = 0x85; + CGWSEL_copy = 0x10; + CGADSUB_copy = 0xa3; + zelda_ppu_write(WBGLOG, 0); + zelda_ppu_write(WOBJLOG, 0); + + music_control = 6; + attract_legend_flag++; +} + +void Attract_FadeInStep() { // 8ceea6 + if (INIDISP_copy != 15) { + if (sign8(--link_speed_setting)) { + INIDISP_copy++; + link_speed_setting = 1; + } + } else { + attract_var18++; + } +} + +void Attract_FadeInSequence() { // 8ceeba + if (INIDISP_copy != 15) { + if (sign8(--link_speed_setting)) { + INIDISP_copy++; + link_speed_setting = 1; + } + } else { + attract_state++; + } +} + +void Attract_FadeOutSequence() { // 8ceecb + if (INIDISP_copy != 0) { + if (sign8(--link_speed_setting)) { + INIDISP_copy--; + link_speed_setting = 1; + } + } else { + EnableForceBlank(); + EraseTileMaps_normal(); + attract_state++; + } +} + +void Attract_LoadNewScene() { // 8ceee5 + switch (attract_sequence) { + case 0: AttractScene_PolkaDots(); break; + case 1: AttractScene_WorldMap(); break; + case 2: AttractScene_ThroneRoom(); break; + case 3: Attract_PrepZeldaPrison(); break; + case 4: Attract_PrepMaidenWarp(); break; + case 5: AttractScene_EndOfStory(); break; + } +} + +void AttractScene_PolkaDots() { // 8ceef8 + attract_next_legend_gfx = 0; + attract_state++; + INIDISP_copy = 0; +} + +void AttractScene_WorldMap() { // 8ceeff + zelda_ppu_write(BG1SC, 0x13); + zelda_ppu_write(BG2SC, 0x3); + CGWSEL_copy = 0x80; + CGADSUB_copy = 0x21; + zelda_ppu_write(BGMODE, 7); + BGMODE_copy = 7; + zelda_ppu_write(M7SEL, 0x80); + WorldMap_LoadLightWorldMap(); + M7Y_copy = 0xed; + M7X_copy = 0x100; + BG1HOFS_copy = 0x80; + BG1VOFS_copy = 0xc0; + timer_for_mode7_zoom = 255; + Attract_ControlMapZoom(); + attract_var10 = 1; + attract_state++; + INIDISP_copy = 0; +} + +void AttractScene_ThroneRoom() { // 8cef4e + zelda_snes_dummy_write(HDMAEN, 0); + HDMAEN_copy = 0; + CGWSEL_copy = 2; + CGADSUB_copy = 0x20; + misc_sprites_graphics_index = 10; + LoadCommonSprites_2(); + uint16 bak0 = attract_var12; + uint16 bak1 = WORD(attract_state); + Dungeon_LoadAndDrawEntranceRoom(0x74); + WORD(attract_state) = bak1; + attract_var12 = bak0; + dung_hdr_palette_1 = 0; + overworld_palette_sp0 = 0; + sprite_aux1_palette = 14; + sprite_aux2_palette = 3; + Dungeon_SaveAndLoadLoadAllPalettes(0, 0x7e); + + main_palette_buffer[0x1d] = 0x3800; + messaging_module = 0; + dialogue_message_index = 0x113; + attract_var10 = 2; + attract_var13 = 0xe0; + oam_priority_value = 0x210; + + Attract_PrepFinish(); +} + +void Attract_PrepFinish() { // 8cefc0 + attract_state++; + INIDISP_copy = 0; + BYTE(BG3VOFS_copy2) = 0; + BG2HOFS_copy &= 0x1ff; + BG2VOFS_copy &= 0x1ff; + BG2HOFS_copy2 &= 0x1ff; + BG2VOFS_copy2 &= 0x1ff; +} + +void Attract_PrepZeldaPrison() { // 8cefe3 + CGWSEL_copy = 0; + CGADSUB_copy = 0; + + uint16 bak0 = attract_var12; + uint16 bak1 = WORD(attract_state); + Dungeon_LoadAndDrawEntranceRoom(0x73); + WORD(attract_state) = bak1; + attract_var12 = bak0; + + dung_hdr_palette_1 = 2; + overworld_palette_sp0 = 0; + sprite_aux1_palette = 14; + sprite_aux2_palette = 3; + Dungeon_SaveAndLoadLoadAllPalettes(1, 0x7f); + main_palette_buffer[0x1d] = 0x3800; + + messaging_module = 0; + dialogue_message_index = 0x114; + + attract_var9 = 148; + attract_vram_dst = 0x68; + attract_var1 = 0; + attract_var3 = 0; + attract_x_base_hi = 0; + attract_var17 = 0; + attract_var18 = 0; + attract_var10 = 255; + oam_priority_value = 0x240; + Attract_PrepFinish(); +} + +void Attract_PrepMaidenWarp() { // 8cf058 + uint16 bak0 = attract_var12; + uint16 bak1 = WORD(attract_state); + Dungeon_LoadAndDrawEntranceRoom(0x75); + WORD(attract_state) = bak1; + attract_var12 = bak0; + + dung_hdr_palette_1 = 0; + overworld_palette_sp0 = 0; + sprite_aux1_palette = 14; + sprite_aux2_palette = 3; + + overworld_palette_aux_or_main = 0; + Palette_Load_SpritePal0Left(); + Palette_Load_SpriteMain(); + Palette_Load_SpriteAux1(); + Palette_Load_SpriteAux2(); + Palette_Load_SpriteEnvironment_Dungeon(); + Palette_Load_HUD(); + Palette_Load_DungeonSet(); + Dungeon_SaveAndLoadLoadAllPalettes(2, 0x7f); + aux_palette_buffer[0x1d] = main_palette_buffer[0x1d] = 0x3800; + + messaging_module = 0; + dialogue_message_index = 0x115; + attract_var10 = 255; + BYTE(attract_vram_dst) = 112; + attract_var19 = 112; + attract_var20 = 112; + attract_var1 = 8; + attract_var17 = 0; + attract_var21 = 0; + attract_var15 = 0; + attract_var18 = 0; + attract_var5 = 0; + attract_var11 = 0; + + oam_priority_value = 0xc0; + Attract_PrepFinish(); +} + +void AttractScene_EndOfStory() { // 8cf0dc + Attract_SetUpConclusionHDMA(); + Death_Func31(); +} + +void Death_Func31() { // 8cf0e2 + nmi_disable_core_updates++; + Intro_InitializeMemory_darken(); + Overworld_LoadAllPalettes(); + BYTE(BG3VOFS_copy2) = 0; + M7Y_copy = 0; + M7X_copy = 0; + BG1HOFS_copy = 0; + BG1VOFS_copy = 0; + BG2HOFS_copy = 0; + BG2VOFS_copy = 0; + music_control = 0xF1; + attract_sequence = 0; + main_module_index = 0; + submodule_index = 10; + subsubmodule_index = 10; +} + +void Attract_EnactStory() { // 8cf115 + switch (attract_sequence) { + case 0: AttractDramatize_PolkaDots(); break; + case 1: AttractDramatize_WorldMap(); break; + case 2: Attract_ThroneRoom(); break; + case 3: AttractDramatize_Prison(); break; + case 4: AttractDramatize_AgahnimAltar(); break; + } +} + +void AttractDramatize_PolkaDots() { // 8cf126 + if (!(frame_counter & 3)) { + BYTE(BG1VOFS_copy)++; + BYTE(BG1HOFS_copy)++; + BYTE(BG2VOFS_copy)++; + BYTE(BG2HOFS_copy)--; + } + + if (attract_legend_flag) { + Attract_BuildNextImageTileMap(); + attract_legend_flag = 0; + attract_next_legend_gfx += 2; + } + joypad1L_last = 0; + filtered_joypad_L = 0; + filtered_joypad_H = 0; + RenderText(); + if (!--attract_legend_ctr) { + attract_sequence++; + attract_state -= 3; + } else { + if (attract_legend_ctr < 0x18 && attract_legend_ctr & 1) + INIDISP_copy--; + } +} + +void AttractDramatize_WorldMap() { // 8cf176 + if (timer_for_mode7_zoom != 0) { + if (timer_for_mode7_zoom < 15) + INIDISP_copy--; + if (!--attract_var10) { + attract_var10 = 1; + timer_for_mode7_zoom -= 1; + Attract_ControlMapZoom(); + } + } else { + EnableForceBlank(); + zelda_ppu_write(BGMODE, 9); + BGMODE_copy = 9; + EraseTileMaps_normal(); + attract_sequence++; + attract_state -= 2; + } +} + +void Attract_ThroneRoom() { // 8cf1c8 + static const AttractOamInfo kThroneRoom_Oams[] = { + {16, 16, 0x2a, 0x7b, 2}, + { 0, 16, 0x2a, 0x3b, 2}, + {16, 0, 0x0a, 0x7b, 2}, + { 0, 0, 0x0a, 0x3b, 2}, + { 0, 0, 0x0c, 0x31, 2}, + {16, 0, 0x0e, 0x31, 2}, + {32, 0, 0x0c, 0x71, 2}, + { 0, 16, 0x2c, 0x31, 2}, + {16, 16, 0x2e, 0x31, 2}, + {32, 16, 0x2c, 0x71, 2}, + }; + static const uint8 kThroneRoom_OamOffs[3] = { 0, 4, 10 }; + static const int8 kAttract_ThroneRoom_Xbase[2] = { 80, 104 }; + static const int8 kAttract_ThroneRoom_Ybase[2] = { 88, 32 }; + attract_oam_idx = 0; + if (!attract_var15) { + if (INIDISP_copy != 15) + INIDISP_copy++; + else + attract_var15++; + } + if (!BG2VOFS_copy) { + Attract_ShowTimedTextMessage(); + if (!oam_priority_value) { + if (attract_var13 < 31 && !(attract_var13 & 1)) + INIDISP_copy--; + if (!--attract_var13) { + attract_sequence++; + attract_state++; + return; + } + } + } else { + BG2VOFS_copy--; + BG1VOFS_copy--; + } + for (int i = 1; i >= 0; i--) { + const AttractOamInfo *oamp = &kThroneRoom_Oams[kThroneRoom_OamOffs[i]]; + int n = kThroneRoom_OamOffs[i + 1] - kThroneRoom_OamOffs[i]; + uint16 y = kAttract_ThroneRoom_Ybase[i] - BG2VOFS_copy; + if (!sign16(y + 32)) { + attract_x_base = kAttract_ThroneRoom_Xbase[i]; + attract_y_base = y; + Attract_DrawSpriteSet2(oamp, n); + } + } + + attract_var7 = 0xf8a7; +} + +void AttractDramatize_Prison() { // 8cf27a + static const uint8 kAttract_ZeldaPrison_Tab0[16] = { 0, 1, 2, 3, 4, 5, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1 }; + static const int8 kZeldaPrison_Soldier_X[2] = { 32, -12 }; + static const int8 kZeldaPrison_Soldier_Y[2] = { 24, 24 }; + static const uint8 kZeldaPrison_Soldier_Dir[2] = { 1, 1 }; + static const uint8 kZeldaPrison_Soldier_Flags[2] = { 9, 7 }; + + attract_oam_idx = 0; + if (!attract_var18) + Attract_FadeInStep(); + attract_x_base = 56; + Attract_DrawZelda(); + if (attract_var10 >= 192) { + attract_y_base = 112; + if (sign8(--attract_var17)) + attract_var17 = 0xf; + int t = attract_vram_dst + kAttract_ZeldaPrison_Tab0[attract_var17]; + attract_x_base_hi = t >> 8; + attract_x_base = t; + Attract_ZeldaPrison_DrawA(); + + for (int k = 1; k >= 0; k--) { + SpritePrep_ResetProperties(k * 2); + uint16 x = kZeldaPrison_Soldier_X[k] + attract_vram_dst + 0x100; + attract_var4 = x; + Sprite_SimulateSoldier(k * 2, + x, attract_y_base + kZeldaPrison_Soldier_Y[k], + kZeldaPrison_Soldier_Dir[k], kZeldaPrison_Soldier_Flags[k], attract_var3); + } + + if (!(++attract_var1 & 7)) { + if (attract_var3 == 2) { + attract_var3 = 0xff; + if (!HIBYTE(attract_vram_dst) && attract_var1 & 8) + sound_effect_2 = 4; + } + attract_var3++; + } + } + + switch (attract_var5) { + case 0: Attract_ZeldaPrison_Case0(); break; + case 1: Attract_ZeldaPrison_Case1(); break; + } +} + +void AttractDramatize_AgahnimAltar() { // 8cf423 + if (attract_var22) { + attract_sequence++; + attract_state -= 2; + return; + } + attract_oam_idx = 0; + HandleScreenFlash(); + if (!attract_var18) + Attract_FadeInStep(); + if (attract_var17 != 255) + attract_var17++; + if (intro_times_pal_flash & 4) + sound_effect_2 = 0x2b; + switch (attract_var5) { + case 0: Attract_MaidenWarp_Case0(); break; + case 1: Attract_MaidenWarp_Case1(); break; + case 2: Attract_MaidenWarp_Case2(); break; + case 3: Attract_MaidenWarp_Case3(); break; + case 4: Attract_MaidenWarp_Case4(); break; + } + + static const uint8 kMaidenWarp_Soldier_X[6] = { 48, 192, 48, 192, 80, 160 }; + static const uint8 kMaidenWarp_Soldier_Y[6] = { 112, 112, 152, 152, 192, 192 }; + static const uint8 kMaidenWarp_Soldier_Dir[6] = { 0, 1, 0, 1, 3, 3 }; + static const uint8 kMaidenWarp_Soldier_Flags[6] = { 9, 9, 9, 9, 7, 9 }; + for (int k = 5; k >= 0; k--) { + + SpritePrep_ResetProperties(k); + Sprite_SimulateSoldier(k, kMaidenWarp_Soldier_X[k], kMaidenWarp_Soldier_Y[k], + kMaidenWarp_Soldier_Dir[k], kMaidenWarp_Soldier_Flags[k], 0); + } + + if (attract_var17 >= 0xa0) { + if (BYTE(attract_vram_dst) != 0x60) { + if (!--attract_var1) { + BYTE(attract_vram_dst)--; + attract_var1 = 8; + } + } else { + attract_var11++; + } + } + + if (attract_var15 == 0) { + static const AttractOamInfo kZeldaPrison_MaidenWarp0[] = { + { 0, 0, 0x03, 0x3d, 2}, + { 8, 0, 0x04, 0x3d, 2}, + { 0, 0, 0x00, 0x3d, 2}, + { 8, 0, 0x01, 0x3d, 2}, + }; + + attract_x_base = 116; + attract_y_base = attract_vram_dst; + Attract_DrawSpriteSet2(kZeldaPrison_MaidenWarp0 + (BYTE(attract_vram_dst) == 0x70 ? 0 : 2), 2); + static const uint8 kAttract_MaidenWarp_Xbase[8] = { 4, 4, 3, 3, 2, 2, 1, 0 }; + static const AttractOamInfo kZeldaPrison_MaidenWarp1[] = { + { 0, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 2, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 2, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 4, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 4, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 6, 0, 0x6c, 0x38, 2}, + { 0, 0, 0x6c, 0x38, 2}, + { 8, 0, 0x6c, 0x38, 2}, + }; + int k = 7; + if (BYTE(attract_vram_dst) < 0x68) + k = (BYTE(attract_vram_dst) - 0x68) & 7; + attract_x_base = 0x74 + kAttract_MaidenWarp_Xbase[k]; + attract_y_base = 0x76; + Attract_DrawSpriteSet2(kZeldaPrison_MaidenWarp1 + k * 2, 2); + + } + static const AttractOamInfo kZeldaPrison_MaidenWarp2[] = { + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x82, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa2, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x80, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa0, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x82, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa2, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x82, 0x3b, 2}, + {16, 0, 0x80, 0x7b, 2}, + { 0, 16, 0xa2, 0x3b, 2}, + {16, 16, 0xa0, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x82, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa2, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x80, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa0, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x82, 0x3b, 2}, + {16, 0, 0x82, 0x7b, 2}, + { 0, 16, 0xa2, 0x3b, 2}, + {16, 16, 0xa2, 0x7b, 2}, + { 5, 25, 0x6c, 0x38, 2}, + {11, 25, 0x6c, 0x38, 2}, + { 0, 0, 0x80, 0x3b, 2}, + {16, 0, 0x80, 0x7b, 2}, + { 0, 16, 0xa0, 0x3b, 2}, + {16, 16, 0xa0, 0x7b, 2}, + }; + int k = attract_var17 >> 5 & 7; + attract_x_base = 112; + attract_y_base = 70; + Attract_DrawSpriteSet2(kZeldaPrison_MaidenWarp2 + k * 6, 6); + +} + +void Attract_SkipToFileSelect() { // 8cf700 + if (--INIDISP_copy) + return; + EnableForceBlank(); + zelda_ppu_write(BG1SC, 0x13); + zelda_ppu_write(BG2SC, 0x3); + Attract_SetUpConclusionHDMA(); + M7Y_copy = 0; + M7X_copy = 0; + BG1HOFS_copy = 0; + BG1VOFS_copy = 0; + BG3VOFS_copy2 = 0; + FadeMusicAndResetSRAMMirror(); +} + +void Attract_BuildNextImageTileMap() { // 8cf73e + static const uint8 *const kAttract_LegendGraphics_pointers[4] = { + kAttract_Legendgraphics_0, + kAttract_Legendgraphics_1, + kAttract_Legendgraphics_2, + kAttract_Legendgraphics_3, + }; + static const uint16 kAttract_LegendGraphics_sizes[4] = { 157+1, 237+1, 199+1, 265+1 }; + int i = attract_next_legend_gfx >> 1; + memcpy(&g_ram[0x1002], kAttract_LegendGraphics_pointers[i], kAttract_LegendGraphics_sizes[i]); + nmi_load_bg_from_vram = 1; +} + +void Attract_ShowTimedTextMessage() { // 8cf766 + attract_var12 = BG2VOFS_copy2; + BYTE(joypad1L_last) = 0; + BYTE(filtered_joypad_L) = 0; + BYTE(filtered_joypad_H) = 0; + RenderText(); + if (oam_priority_value) + oam_priority_value--; +} + +void Attract_ControlMapZoom() { // 8cf783 + for (int i = 223; i >= 0; i--) + mode7_hdma_table[i] = kMapMode_Zooms1[i] * timer_for_mode7_zoom >> 8; +} + +void Attract_BuildBackgrounds() { // 8cf7e6 + static const uint16 kAttract_CopyToVram_Tab0[16] = { 0x1a0, 0x9a6, 0x89a5, 0x1a0, 0x9a5, 0x1a0, 0x1a0, 0x89a6, 0x49a5, 0x1a0, 0x1a0, 0x49a5, 0x1a0, 0x89a5, 0xc9a5, 0x1a0 }; + static const uint16 kAttract_CopyToVram_Tab1[4] = { 0x9a1, 0x9a2, 0x9a3, 0x9a4 }; + + BGMODE_copy = 9; + TM_copy = 0x17; + TS_copy = 0; + + zelda_ppu_write(BG1SC, 0x10); + zelda_ppu_write(BG2SC, 0x0); + + { + int k = 0; + const uint16 *p = kAttract_CopyToVram_Tab0; + uint16 *dst = (uint16 *)&g_ram[0x1006]; + do { + int j = k & 3; + do { + dst[k++] = p[j++]; + } while (j & 3); + } while (k & 0x1f || (p += 4, k != 0x80)); + Attract_TriggerBGDMA(0x1000); + } + + { + int k = 0; + uint16 *dst = (uint16 *)&g_ram[0x1006]; + do { + int j = k & 1; + const uint16 *p = kAttract_CopyToVram_Tab1 + ((k & 0x20) >> 4); + do { + dst[k++] = p[j++]; + } while (j & 1); + } while (k != 0x80); + Attract_TriggerBGDMA(0); + } + attract_vram_dst = 0; +} + +void Attract_TriggerBGDMA(uint16 dstv) { // 8cf879 + uint16 *dst = &g_zenv.vram[dstv]; + for (int i = 0; i < 8; i++) { + memcpy(dst, &g_ram[0x1006], 0x100); + dst += 0x80; + } +} + +void Attract_DrawPreloadedSprite(const uint8 *xp, const uint8 *yp, const uint8 *cp, const uint8 *fp, const uint8 *ep, int n) { // 8cf9b5 + OamEnt *oam = &oam_buf[attract_oam_idx + 64]; + attract_oam_idx += n + 1; + do { + oam->x = attract_x_base + xp[n]; + oam->y = attract_y_base + yp[n]; + oam->charnum = cp[n]; + oam->flags = fp[n]; + bytewise_extended_oam[oam - oam_buf] = ep[n]; + } while (oam++, --n >= 0); +} + +void Attract_DrawZelda() { // 8cf9e8 + OamEnt *oam = &oam_buf[64 + attract_oam_idx]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam[0].x = oam[1].x = 0x60; + oam[0].y = attract_x_base; + oam[1].y = attract_x_base + 10; + oam[0].charnum = 0x28; + oam[1].charnum = 0x2a; + oam[0].flags = 0x29; + oam[1].flags = 0x29; + attract_oam_idx += 2; +} + +void Sprite_SimulateSoldier(int k, uint16 x, uint16 y, uint8 dir, uint8 flags, uint8 gfx) { // 9deb84 + static const uint8 kSimulateSoldier_Gfx[4] = { 11, 4, 0, 7 }; + Sprite_SetX(k, x); + Sprite_SetY(k, y); + sprite_z[k] = 0; + Sprite_Get16BitCoords(k); + sprite_D[k] = sprite_head_dir[k] = dir; + sprite_graphics[k] = kSimulateSoldier_Gfx[dir] + gfx; + sprite_flags3[k] = 16; + sprite_obj_prio[k] = 0; + sprite_oam_flags[k] = flags | 0x30; + sprite_type[k] = (flags == 9) ? 0x41 : 0x43; + sprite_flags2[k] = 7; + int oam_idx = k * 8; + oam_cur_ptr = 0x800 + oam_idx * 4; + oam_ext_cur_ptr = 0xa20 + oam_idx; + Guard_HandleAllAnimation(k); +} + diff --git a/attract.h b/attract.h new file mode 100644 index 00000000..02adb290 --- /dev/null +++ b/attract.h @@ -0,0 +1,50 @@ +#pragma once +struct AttractOamInfo { + int8 x, y; + uint8 c, f, e; +}; + + +extern const uint16 kMapMode_Zooms1[224]; +extern const uint16 kMapMode_Zooms2[224]; +void Attract_DrawSpriteSet2(const AttractOamInfo *p, int n); +void Attract_ZeldaPrison_Case0(); +void Attract_ZeldaPrison_Case1(); +void Attract_ZeldaPrison_DrawA(); +void Attract_MaidenWarp_Case0(); +void Attract_MaidenWarp_Case1(); +void Attract_MaidenWarp_Case2(); +void Attract_MaidenWarp_Case3(); +void Attract_MaidenWarp_Case4(); +void Dungeon_LoadAndDrawEntranceRoom(uint8 a); +void Dungeon_SaveAndLoadLoadAllPalettes(uint8 a, uint8 k); +void Module14_Attract(); +void Attract_Fade(); +void Attract_InitGraphics(); +void Attract_FadeInStep(); +void Attract_FadeInSequence(); +void Attract_FadeOutSequence(); +void Attract_LoadNewScene(); +void AttractScene_PolkaDots(); +void AttractScene_WorldMap(); +void AttractScene_ThroneRoom(); +void Attract_PrepFinish(); +void Attract_PrepZeldaPrison(); +void Attract_PrepMaidenWarp(); +void AttractScene_EndOfStory(); +void Death_Func31(); +void Attract_EnactStory(); +void AttractDramatize_PolkaDots(); +void AttractDramatize_WorldMap(); +void Attract_ThroneRoom(); +void AttractDramatize_Prison(); +void AttractDramatize_AgahnimAltar(); +void Attract_SkipToFileSelect(); +void Attract_BuildNextImageTileMap(); +void Attract_ShowTimedTextMessage(); +void Attract_ControlMapZoom(); +void Attract_BuildBackgrounds(); +void Attract_TriggerBGDMA(uint16 dstv); +void Attract_DrawPreloadedSprite(const uint8 *xp, const uint8 *yp, const uint8 *cp, const uint8 *fp, const uint8 *ep, int n); +void Attract_DrawZelda(); +void Sprite_SimulateSoldier(int k, uint16 x, uint16 y, uint8 dir, uint8 flags, uint8 gfx); diff --git a/dsp_regs.h b/dsp_regs.h new file mode 100644 index 00000000..05696e7c --- /dev/null +++ b/dsp_regs.h @@ -0,0 +1,108 @@ +#pragma once + +enum DspReg { + V0VOLL = 0, + V0VOLR = 1, + V0PITCHL = 2, + V0PITCHH = 3, + V0SRCN = 4, + V0ADSR1 = 5, + V0ADSR2 = 6, + V0GAIN = 7, + V0ENVX = 8, + V0OUTX = 9, + MVOLL = 0xC, + EFB = 0xD, + FIR0 = 0xF, + V1VOLL = 0x10, + V1VOLR = 0x11, + V1PL = 0x12, + V1PH = 0x13, + V1SRCN = 0x14, + V1ADSR1 = 0x15, + V1ADSR2 = 0x16, + V1GAIN = 0x17, + V1ENVX = 0x18, + V1OUTX = 0x19, + MVOLR = 0x1C, + FIR1 = 0x1F, + V2VOLL = 0x20, + V2VOLR = 0x21, + V2PL = 0x22, + V2PH = 0x23, + V2SRCN = 0x24, + V2ADSR1 = 0x25, + V2ADSR2 = 0x26, + V2GAIN = 0x27, + V2ENVX = 0x28, + V2OUTX = 0x29, + EVOLL = 0x2C, + PMON = 0x2D, + FIR2 = 0x2F, + V3VOLL = 0x30, + V3VOLR = 0x31, + V3PL = 0x32, + V3PH = 0x33, + V3SRCN = 0x34, + V3ADSR1 = 0x35, + V3ADSR2 = 0x36, + V3GAIN = 0x37, + V3ENVX = 0x38, + V3OUTX = 0x39, + EVOLR = 0x3C, + NON = 0x3D, + FIR3 = 0x3F, + V4VOLL = 0x40, + V4VOLR = 0x41, + V4PL = 0x42, + V4PH = 0x43, + V4SRCN = 0x44, + V4ADSR1 = 0x45, + V4ADSR2 = 0x46, + V4GAIN = 0x47, + V4ENVX = 0x48, + V4OUTX = 0x49, + KON = 0x4C, + EON = 0x4D, + FIR4 = 0x4F, + V5VOLL = 0x50, + V5VOLR = 0x51, + V5PL = 0x52, + V5PH = 0x53, + V5SRCN = 0x54, + V5ADSR1 = 0x55, + V5ADSR2 = 0x56, + V5GAIN = 0x57, + V5ENVX = 0x58, + V5OUTX = 0x59, + KOF = 0x5C, + + DIR = 0x5D, + FIR5 = 0x5F, + V6VOLL = 0x60, + V6VOLR = 0x61, + V6PL = 0x62, + V6PH = 0x63, + V6SRCN = 0x64, + V6ADSR1 = 0x65, + V6ADSR2 = 0x66, + V6GAIN = 0x67, + V6ENVX = 0x68, + V6OUTX = 0x69, + FLG = 0x6C, + ESA = 0x6D, + FIR6 = 0x6F, + V7VOLL = 0x70, + V7VOLR = 0x71, + V7PL = 0x72, + V7PH = 0x73, + V7SRCN = 0x74, + V7ADSR1 = 0x75, + V7ADSR2 = 0x76, + V7GAIN = 0x77, + V7ENVX = 0x78, + V7OUTX = 0x79, + ENDX = 0x7C, + EDL = 0x7D, + FIR7 = 0x7F, +}; \ No newline at end of file diff --git a/dungeon.cpp b/dungeon.cpp new file mode 100644 index 00000000..a6000143 --- /dev/null +++ b/dungeon.cpp @@ -0,0 +1,8786 @@ +#include "zelda_rtl.h" + +#include "variables.h" +#include "dungeon.h" +#include "snes_regs.h" +#include "nmi.h" +#include "hud.h" +#include "load_gfx.h" +#include "overworld.h" +#include "sprite.h" +#include "ancilla.h" +#include "ending.h" +#include "player.h" +#include "misc.h" +#include "player_oam.h" +#include "tables/generated_dungeon_rooms.h" +#include "tagalong.h" + +// todo: move to config +static const uint16 kBossRooms[] = { + 200, 51, 7, + 32, + 6, 90, 41, 144, 222, 164, 172, + 13 +}; +static const uint8 kDungeonExit_From[12] = {200, 51, 7, 32, 6, 90, 41, 144, 222, 164, 172, 13}; +static const uint8 kDungeonExit_To[12] = {201, 99, 119, 32, 40, 74, 89, 152, 14, 214, 219, 13}; +static const uint16 kObjectSubtype1Params[] = { + 0x3d8, 0x2e8, 0x2f8, 0x328, 0x338, 0x400, 0x410, 0x388, 0x390, 0x420, 0x42a, 0x434, 0x43e, 0x448, 0x452, 0x45c, + 0x466, 0x470, 0x47a, 0x484, 0x48e, 0x498, 0x4a2, 0x4ac, 0x4b6, 0x4c0, 0x4ca, 0x4d4, 0x4de, 0x4e8, 0x4f2, 0x4fc, + 0x506, 0x598, 0x600, 0x63c, 0x63c, 0x63c, 0x63c, 0x63c, 0x642, 0x64c, 0x652, 0x658, 0x65e, 0x664, 0x66a, 0x688, + 0x694, 0x6a8, 0x6a8, 0x6a8, 0x6c8, 0x0, 0x78a, 0x7aa, 0xe26, 0x84a, 0x86a, 0x882, 0x8ca, 0x85a, 0x8fa, 0x91a, + 0x920, 0x92a, 0x930, 0x936, 0x93c, 0x942, 0x948, 0x94e, 0x96c, 0x97e, 0x98e, 0x902, 0x99e, 0x9d8, 0x9d8, 0x9d8, + 0x9fa, 0x156c, 0x1590, 0x1d86, 0x0, 0xa14, 0xa24, 0xa54, 0xa54, 0xa84, 0xa84, 0x14dc, 0x1500, 0x61e, 0xe52, 0x600, + 0x3d8, 0x2c8, 0x2d8, 0x308, 0x318, 0x3e0, 0x3f0, 0x378, 0x380, 0x5fa, 0x648, 0x64a, 0x670, 0x67c, 0x6a8, 0x6a8, + 0x6a8, 0x6c8, 0x0, 0x7aa, 0x7ca, 0x84a, 0x89a, 0x8b2, 0x90a, 0x926, 0x928, 0x912, 0x9f8, 0x1d7e, 0x0, 0xa34, + 0xa44, 0xa54, 0xa6c, 0xa84, 0xa9c, 0x1524, 0x1548, 0x85a, 0x606, 0xe52, 0x5fa, 0x6a0, 0x6a2, 0xb12, 0xb14, 0x9b0, + 0xb46, 0xb56, 0x1f52, 0x1f5a, 0x288, 0xe82, 0x1df2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d8, 0x3d8, 0x3d8, 0x3d8, 0x5aa, 0x5b2, 0x5b2, 0x5b2, 0x5b2, 0xe0, 0xe0, 0xe0, 0xe0, 0x110, 0x0, 0x0, + 0x6a4, 0x6a6, 0xae6, 0xb06, 0xb0c, 0xb16, 0xb26, 0xb36, 0x1f52, 0x1f5a, 0x288, 0xeba, 0xe82, 0x1df2, 0x0, 0x0, + 0x3d8, 0x510, 0x5aa, 0x5aa, 0x0, 0x168, 0xe0, 0x158, 0x100, 0x110, 0x178, 0x72a, 0x72a, 0x72a, 0x75a, 0x670, + 0x670, 0x130, 0x148, 0x72a, 0x72a, 0x72a, 0x75a, 0xe0, 0x110, 0xf0, 0x110, 0x0, 0xab4, 0x8da, 0xade, 0x188, + 0x1a0, 0x1b0, 0x1c0, 0x1d0, 0x1e0, 0x1f0, 0x200, 0x120, 0x2a8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +}; +static const uint16 kObjectSubtype2Params[] = { + 0xb66, 0xb86, 0xba6, 0xbc6, 0xc66, 0xc86, 0xca6, 0xcc6, 0xbe6, 0xc06, 0xc26, 0xc46, 0xce6, 0xd06, 0xd26, 0xd46, + 0xd66, 0xd7e, 0xd96, 0xdae, 0xdc6, 0xdde, 0xdf6, 0xe0e, 0x398, 0x3a0, 0x3a8, 0x3b0, 0xe32, 0xe26, 0xea2, 0xe9a, + 0xeca, 0xed2, 0xede, 0xede, 0xf1e, 0xf3e, 0xf5e, 0xf6a, 0xef6, 0xf72, 0xf92, 0xfa2, 0xfa2, 0x1088, 0x10a8, 0x10a8, + 0x10c8, 0x10c8, 0x10c8, 0x10c8, 0xe52, 0x1108, 0x1108, 0x12a8, 0x1148, 0x1160, 0x1178, 0x1190, 0x1458, 0x1488, 0x2062, 0x2086, +}; +static const uint16 kObjectSubtype3Params[] = { + 0x1614, 0x162c, 0x1654, 0xa0e, 0xa0c, 0x9fc, 0x9fe, 0xa00, 0xa02, 0xa04, 0xa06, 0xa08, 0xa0a, 0x0, 0xa10, 0xa12, + 0x1dda, 0x1de2, 0x1dd6, 0x1dea, 0x15fc, 0x1dfa, 0x1df2, 0x1488, 0x1494, 0x149c, 0x14a4, 0x10e8, 0x10e8, 0x10e8, 0x11a8, 0x11c8, + 0x11e8, 0x1208, 0x3b8, 0x3c0, 0x3c8, 0x3d0, 0x1228, 0x1248, 0x1268, 0x1288, 0x0, 0xe5a, 0xe62, 0x0, 0x0, 0xe82, + 0xe8a, 0x14ac, 0x14c4, 0x10e8, 0x1614, 0x1614, 0x1614, 0x1614, 0x1614, 0x1614, 0x1cbe, 0x1cee, 0x1d1e, 0x1d4e, 0x1d8e, 0x1d96, + 0x1d9e, 0x1da6, 0x1dae, 0x1db6, 0x1dbe, 0x1dc6, 0x1dce, 0x220, 0x260, 0x280, 0x1f3a, 0x1f62, 0x1f92, 0x1ff2, 0x2016, 0x1f42, + 0xeaa, 0x1f4a, 0x1f52, 0x1f5a, 0x202e, 0x2062, 0x9b8, 0x9c0, 0x9c8, 0x9d0, 0xfa2, 0xfb2, 0xfc4, 0xff4, 0x1018, 0x1020, + 0x15b4, 0x15d8, 0x20f6, 0xeba, 0x22e6, 0x22ee, 0x5da, 0x281e, 0x2ae0, 0x2d2a, 0x2f2a, 0x22f6, 0x2316, 0x232e, 0x2346, 0x235e, + 0x2376, 0x23b6, 0x1e9a, 0x0, 0x2436, 0x149c, 0x24b6, 0x24e6, 0x2516, 0x1028, 0x1040, 0x1060, 0x1070, 0x1078, 0x1080, 0x0, +}; +static const uint16 kDoorTypeSrcData[] = { + 0x2716, 0x272e, 0x272e, 0x2746, 0x2746, 0x2746, 0x2746, 0x2746, 0x2746, 0x275e, 0x275e, 0x275e, 0x275e, 0x2776, 0x278e, 0x27a6, + 0x27be, 0x27be, 0x27d6, 0x27d6, 0x27ee, 0x2806, 0x2806, 0x281e, 0x2836, 0x2836, 0x2836, 0x2836, 0x284e, 0x2866, 0x2866, 0x2866, + 0x2866, 0x287e, 0x2896, 0x28ae, 0x28c6, 0x28de, 0x28f6, 0x28f6, 0x28f6, 0x290e, 0x2926, 0x2958, 0x2978, 0x2990, 0x2990, 0x2990, + 0x2990, 0x29a8, 0x29c0, 0x29d8, +}; +static const uint16 kDoorTypeSrcData2[] = { + 0x29f0, 0x2a08, 0x2a08, 0x2a20, 0x2a20, 0x2a20, 0x2a20, 0x2a20, 0x2a20, 0x2a38, 0x2a38, 0x2a38, 0x2a38, 0x2a50, 0x2a68, 0x2a80, + 0x2a98, 0x2a98, 0x2a98, 0x2a98, 0x2a98, 0x2ab0, 0x2ac8, 0x2ae0, 0x2af8, 0x2af8, 0x2af8, 0x2af8, 0x2b10, 0x2b28, 0x2b28, 0x2b28, + 0x2b28, 0x2b40, 0x2b58, 0x2b70, 0x2b88, 0x2ba0, 0x2bb8, 0x2bb8, 0x2bb8, 0x2bd0, 0x2be8, 0x2c1a, 0x2c3a, 0x2c52, 0x2c6a, 0x2c6a, +}; +static const uint16 kDoorTypeSrcData3[] = { + 0x2c6a, 0x2c82, 0x2c82, 0x2c9a, 0x2c9a, 0x2c9a, 0x2c9a, 0x2c9a, 0x2c9a, 0x2cb2, 0x2cb2, 0x2cb2, 0x2cb2, 0x2cca, 0x2ce2, 0x2cfa, + 0x2cfa, 0x2cfa, 0x2cfa, 0x2cfa, 0x2cfa, 0x2d12, 0x2d12, 0x2d2a, 0x2d42, 0x2d42, 0x2d42, 0x2d42, 0x2d5a, 0x2d72, 0x2d72, 0x2d72, + 0x2d72, 0x2d8a, 0x2da2, 0x2dba, 0x2dd2, 0x2dea, 0x2e02, 0x2e02, 0x2e02, 0x2e1a, 0x2e32, 0x2e32, 0x2e52, 0x2e6a, 0x2e6a, 0x2e6a, +}; +static const uint16 kDoorTypeSrcData4[] = { + 0x2e6a, 0x2e82, 0x2e82, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2e9a, 0x2eb2, 0x2eb2, 0x2eb2, 0x2eb2, 0x2eca, 0x2ee2, 0x2efa, + 0x2efa, 0x2efa, 0x2efa, 0x2efa, 0x2efa, 0x2f12, 0x2f12, 0x2f2a, 0x2f42, 0x2f42, 0x2f42, 0x2f42, 0x2f5a, 0x2f72, 0x2f72, 0x2f72, + 0x2f72, 0x2f8a, 0x2fa2, 0x2fba, 0x2fd2, 0x2fea, 0x3002, 0x3002, 0x3002, 0x301a, 0x3032, 0x3032, 0x3052, 0x306a, 0x306a, +}; +static const uint16 kDoorPositionToTilemapOffs_Up[] = { 0x21c, 0x23c, 0x25c, 0x39c, 0x3bc, 0x3dc, 0x121c, 0x123c, 0x125c, 0x139c, 0x13bc, 0x13dc }; +static const uint16 kDoorPositionToTilemapOffs_Down[] = { 0xd1c, 0xd3c, 0xd5c, 0xb9c, 0xbbc, 0xbdc, 0x1d1c, 0x1d3c, 0x1d5c, 0x1b9c, 0x1bbc, 0x1bdc }; +static const uint16 kDoorPositionToTilemapOffs_Left[] = { 0x784, 0xf84, 0x1784, 0x78a, 0xf8a, 0x178a, 0x7c4, 0xfc4, 0x17c4, 0x7ca, 0xfca, 0x17ca }; +static const uint16 kDoorPositionToTilemapOffs_Right[] = { 0x7b4, 0xfb4, 0x17b4, 0x7ae, 0xfae, 0x17ae, 0x7f4, 0xff4, 0x17f4, 0x7ee, 0xfee, 0x17ee }; +static const int8 kSpiralTab1[] = { 0, 1, 1, -1, 1, 1, 1, 1 }; +static const int8 kTeleportPitLevel1[] = { 0, 1, 1 }; +static const int8 kTeleportPitLevel2[] = { 0, 0, 1 }; +static const uint8 kDoorTypeRemap[] = { + 0, 2, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 80, 0, 80, 80, + 96, 98, 100, 102, 82, 90, 80, 82, 84, 86, 0, 80, 80, 0, 0, 0, + 64, 88, 88, 0, 88, 88, 0, 0, +}; +static const int8 kStaircaseTab2[] = { + 12, 32, 48, 56, 72, -44, -40, -64, -64, -88, 12, 24, 40, 48, 64, -28, + -40, -56, -64, -80, +}; +static const int8 kStaircaseTab3[] = { 4, -4, 4, -4 }; +static const int8 kStaircaseTab4[] = { 52, 52, 59, 58 }; +static const int8 kStaircaseTab5[] = { 32, -64, 32, -32 }; +static const uint8 kMovingWall_Sizes0[4] = { 5, 7, 11, 15 }; +static const uint8 kMovingWall_Sizes1[4] = { 8, 16, 24, 32 }; +static const uint8 kWatergateLayout[17] = { + 0x1b, 0xa1, 0xc9, + 0x51, 0xa1, 0xc9, + 0x92, 0xa1, 0xc9, + 0xa1, 0x33, 0xc9, + 0xa1, 0x72, 0xc9, + 0xff, 0xff, +}; +static const uint16 kChestOpenMasks[] = { 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000 }; +const uint8 kLayoutQuadrantFlags[] = { 0xF, 0xF, 0xF, 0xF, 0xB, 0xB, 7, 7, 0xF, 0xB, 0xF, 7, 0xB, 0xF, 7, 0xF, 0xE, 0xD, 0xE, 0xD, 0xF, 0xF, 0xE, 0xD, 0xE, 0xD, 0xF, 0xF, 0xA, 9, 6, 5 }; +static const uint8 kQuadrantVisitingFlags[] = { 8, 4, 2, 1, 0xC, 0xC, 3, 3, 0xA, 5, 0xA, 5, 0xF, 0xF, 0xF, 0xF }; +#define XY(x, y) ((y)*64+(x)) +static const uint8 kDungeon_MinigameChestPrizes1[8] = { + 0x40, 0x41, 0x34, 0x42, 0x43, 0x44, 0x27, 0x17 +}; +static const uint8 kDungeon_RupeeChestMinigamePrizes[32] = { + 0x47, 0x34, 0x46, 0x34, 0x46, 0x46, 0x34, 0x47, 0x46, 0x47, 0x34, 0x46, 0x47, 0x34, 0x46, 0x47, + 0x34, 0x47, 0x41, 0x47, 0x41, 0x41, 0x47, 0x34, 0x41, 0x34, 0x47, 0x41, 0x34, 0x47, 0x41, 0x34, +}; +static const int8 kDungeon_QueryIfTileLiftable_x[4] = { 7, 7, -3, 16 }; +static const int8 kDungeon_QueryIfTileLiftable_y[4] = { 3, 24, 14, 14 }; +static const uint16 kDungeon_QueryIfTileLiftable_rv[16] = { 0x5252, 0x5050, 0x5454, 0x0, 0x2323 }; +static const uint16 kDoor_BlastWallUp_Dsts[] = { 0xd8a, 0xdaa, 0xdca, 0x2b6, 0xab6, 0x12b6 }; +#define adjacent_doors_flags (*(uint16*)(g_ram+0x1100)) +#define adjacent_doors ((uint16*)(g_ram+0x1110)) +static const DungPalInfo kDungPalinfos[41] = { + { 0, 0, 3, 1}, + { 2, 0, 3, 1}, + { 4, 0, 10, 1}, + { 6, 0, 1, 7}, + {10, 2, 2, 7}, + { 4, 4, 3, 10}, + {12, 5, 8, 20}, + {14, 0, 3, 10}, + { 2, 0, 15, 20}, + {10, 2, 0, 7}, + { 2, 0, 15, 12}, + { 6, 0, 6, 7}, + { 0, 0, 14, 18}, + {18, 5, 5, 11}, + {18, 0, 2, 12}, + {16, 5, 10, 7}, + {16, 0, 16, 12}, + {22, 7, 2, 7}, + {22, 0, 7, 15}, + { 8, 0, 4, 12}, + { 8, 0, 4, 9}, + { 4, 0, 3, 1}, + {20, 0, 4, 4}, + {20, 0, 20, 12}, + {24, 5, 7, 11}, + {24, 6, 16, 12}, + {26, 5, 8, 20}, + {26, 2, 0, 7}, + { 6, 0, 3, 10}, + {28, 0, 3, 1}, + {30, 0, 11, 17}, + { 4, 0, 11, 17}, + {14, 0, 0, 2}, + {32, 8, 19, 13}, + {10, 0, 3, 10}, + {20, 0, 4, 4}, + {26, 2, 2, 7}, + {26, 10, 0, 0}, + { 0, 0, 3, 2}, + {14, 0, 3, 7}, + {26, 5, 5, 11}, +}; +// these are not used by the code, but needed for the comparison with the real rom to work. +static const uint8 kDungeon_DrawObjectOffsets_BG1[33] = { + 0, 0x20, 0x7e, 2, 0x20, 0x7e, 4, 0x20, 0x7e, 6, 0x20, 0x7e, 0x80, 0x20, 0x7e, 0x82, + 0x20, 0x7e, 0x84, 0x20, 0x7e, 0x86, 0x20, 0x7e, 0, 0x21, 0x7e, 0x80, 0x21, 0x7e, 0, 0x22, + 0x7e, +}; +static const uint8 kDungeon_DrawObjectOffsets_BG2[33] = { + 0, 0x40, 0x7e, 2, 0x40, 0x7e, 4, 0x40, 0x7e, 6, 0x40, 0x7e, 0x80, 0x40, 0x7e, 0x82, + 0x40, 0x7e, 0x84, 0x40, 0x7e, 0x86, 0x40, 0x7e, 0, 0x41, 0x7e, 0x80, 0x41, 0x7e, 0, 0x42, + 0x7e, +}; +static const uint16 kUploadBgSrcs[] = { 0x0, 0x1000, 0x0, 0x40, 0x40, 0x1040, 0x1000, 0x1040, 0x1000, 0x0, 0x40, 0x0, 0x1040, 0x40, 0x1040, 0x1000 }; +static const uint8 kUploadBgDsts[] = { 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 }; +static const uint16 kTileAttrsByDoor[] = { + 0x8080, 0x8484, 0x0, 0x101, 0x8484, 0x8e8e, 0x0, 0x0, 0x8888, 0x8e8e, 0x8080, 0x8080, 0x8282, 0x8080, 0x8080, 0x8080, + 0x8080, 0x8080, 0x8080, 0x8080, 0x8282, 0x8e8e, 0x8080, 0x8282, 0x8080, 0x8080, 0x8080, 0x8282, 0x8282, 0x8080, 0x8080, 0x8080, + 0x8484, 0x8484, 0x8686, 0x8888, 0x8686, 0x8686, 0x8080, 0x8080, +}; +static PlayerHandlerFunc *const kDungeon_Effect_Handler[28] = { + &LayerEffect_Nothing, + &LayerEffect_Nothing, + &LayerEffect_Scroll, + &LayerEffect_WaterRapids, + &LayerEffect_Trinexx, + &LayerEffect_Agahnim2, + &LayerEffect_InvisibleFloor, + &LayerEffect_Ganon, +}; +static const int16 kPushBlockMoveDistances[] = { -0x100, 0x100, -0x4, 0x4 }; +static HandlerFuncK *const kDungTagroutines[] = { + &Dung_TagRoutine_0x00, + &RoomTag_NorthWestTrigger, + &Dung_TagRoutine_0x2A, + &Dung_TagRoutine_0x2B, + &Dung_TagRoutine_0x2C, + &Dung_TagRoutine_0x2D, + &Dung_TagRoutine_0x2E, + &Dung_TagRoutine_0x2F, + &Dung_TagRoutine_0x30, + &RoomTag_QuadrantTrigger, + &RoomTag_RoomTrigger, + &RoomTag_NorthWestTrigger, + &Dung_TagRoutine_0x2A, + &Dung_TagRoutine_0x2B, + &Dung_TagRoutine_0x2C, + &Dung_TagRoutine_0x2D, + &Dung_TagRoutine_0x2E, + &Dung_TagRoutine_0x2F, + &Dung_TagRoutine_0x30, + &RoomTag_QuadrantTrigger, + &RoomTag_RoomTrigger_BlockDoor, + &RoomTag_PrizeTriggerDoorDoor, + &RoomTag_SwitchTrigger_HoldDoor, + &RoomTag_SwitchTrigger_ToggleDoor, + &RoomTag_WaterOff, + &RoomTag_WaterOn, + &RoomTag_WaterGate, + &Dung_TagRoutine_0x1B, + &RoomTag_MovingWall_East, + &RoomTag_MovingWall_West, + &RoomTag_MovingWallTorchesCheck, + &RoomTag_MovingWallTorchesCheck, + &RoomTag_Switch_ExplodingWall, + &RoomTag_Holes0, + &RoomTag_ChestHoles0, + &Dung_TagRoutine_0x23, + &RoomTag_Holes2, + &RoomTag_GetHeartForPrize, + &RoomTag_KillRoomBlock, + &RoomTag_TriggerChest, + &RoomTag_PullSwitchExplodingWall, + &RoomTag_NorthWestTrigger, + &Dung_TagRoutine_0x2A, + &Dung_TagRoutine_0x2B, + &Dung_TagRoutine_0x2C, + &Dung_TagRoutine_0x2D, + &Dung_TagRoutine_0x2E, + &Dung_TagRoutine_0x2F, + &Dung_TagRoutine_0x30, + &RoomTag_QuadrantTrigger, + &RoomTag_RoomTrigger, + &RoomTag_TorchPuzzleDoor, + &Dung_TagRoutine_0x34, + &Dung_TagRoutine_0x35, + &Dung_TagRoutine_0x36, + &Dung_TagRoutine_0x37, + &RoomTag_Agahnim, + &Dung_TagRoutine_0x39, + &Dung_TagRoutine_0x3A, + &Dung_TagRoutine_0x3B, + &RoomTag_PushBlockForChest, + &RoomTag_GanonDoor, + &RoomTag_TorchPuzzleChest, + &RoomTag_RekillableBoss, +}; +static const uint16 kDoorAnimUpSrc[] = { 0x306a, 0x306a, 0x3082, 0x309a, 0x30b2 }; +static const uint16 kDoorAnimDownSrc[] = { 0x30b2, 0x30ca, 0x30e2, 0x30fa, 0x3112 }; +static const uint16 kDoorAnimLeftSrc[] = { 0x3112, 0x312a, 0x3142, 0x315a, 0x3172 }; +static const uint16 kDoorAnimRightSrc[] = { 0x3172, 0x318a, 0x31a2, 0x31ba, 0x31D2 }; +static PlayerHandlerFunc *const kDungeon_IntraRoomTrans[8] = { + &DungeonTransition_Subtile_PrepTransition, + &DungeonTransition_Subtile_ApplyFilter, + &DungeonTransition_Subtile_ResetShutters, + &DungeonTransition_ScrollRoom, + &DungeonTransition_FindSubtileLanding, + &Dungeon_IntraRoomTrans_State5, + &DungeonTransition_Subtile_ApplyFilter, + &DungeonTransition_Subtile_TriggerShutters, +}; +static PlayerHandlerFunc *const kDungeon_InterRoomTrans[16] = { + &Module07_02_00_InitializeTransition, + &Module07_02_01_LoadNextRoom, + &Module07_02_FadedFilter, + &Dungeon_InterRoomTrans_State3, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_State7, + &DungeonTransition_ScrollRoom, + &Dungeon_InterRoomTrans_State9, + &Dungeon_InterRoomTrans_State10, + &Dungeon_InterRoomTrans_State9, + &Dungeon_InterRoomTrans_State12, + &Dungeon_InterRoomTrans_State13, + &Module07_02_FadedFilter, + &Dungeon_InterRoomTrans_State15, +}; +static PlayerHandlerFunc *const kDungeon_Submodule_7_DownFloorTrans[18] = { + &Module07_07_00_HandleMusicAndResetRoom, + &ApplyPaletteFilter_bounce, + &Dungeon_InitializeRoomFromSpecial, + &DungeonTransition_TriggerBGC34UpdateAndAdvance, + &DungeonTransition_TriggerBGC56UpdateAndAdvance, + &DungeonTransition_LoadSpriteGFX, + &Module07_07_06_SyncBG1and2, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_Staircase14, + &Module07_07_0F_FallingFadeIn, + &Module07_07_10_LandLinkFromFalling, + &Module07_07_11_CacheRoomAndSetMusic, +}; +static PlayerHandlerFunc *const kWatergateFuncs[6] = { + &FloodDam_PrepTiles_init, + &Watergate_Main_State1, + &Watergate_Main_State1, + &Watergate_Main_State1, + &FloodDam_Expand, + &FloodDam_Fill, +}; +static const int8 kSpiralStaircaseX[] = { -28, -28, 24, 24 }; +static const int8 kSpiralStaircaseY[] = { 16, -10, -10, -32 }; +static PlayerHandlerFunc *const kDungeon_SpiralStaircase[20] = { + &Module07_0E_00_InitPriorityAndScreens, + &Module07_0E_01_HandleMusicAndResetProps, + &Module07_0E_02_ApplyFilterIf, + &Dungeon_InitializeRoomFromSpecial, + &DungeonTransition_TriggerBGC34UpdateAndAdvance, + &DungeonTransition_TriggerBGC56UpdateAndAdvance, + &DungeonTransition_LoadSpriteGFX, + &Dungeon_SyncBackgroundsFromSpiralStairs, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_SpiralStaircase11, + &Dungeon_SpiralStaircase12, + &Dungeon_SpiralStaircase11, + &Dungeon_SpiralStaircase12, + &Dungeon_DoubleApplyAndIncrementGrayscale, + &Dungeon_AdvanceThenSetBossMusicUnorthodox, + &Dungeon_SpiralStaircase17, + &Dungeon_SpiralStaircase18, + &Module07_0E_13_SetRoomAndLayerAndCache, +}; +static PlayerHandlerFunc *const kDungeon_Submodule_F[2] = { + &Module07_0F_00_InitSpotlight, + &Module07_0F_01_OperateSpotlight, +}; +static PlayerHandlerFunc *const kDungeon_StraightStaircase[2] = { + &Module07_10_00_InitStairs, + &Module07_10_01_ClimbStairs, +}; +static PlayerHandlerFunc *const kDungeon_StraightStaircaseDown[2] = { + &Module07_08_00_InitStairs, + &Module07_08_01_ClimbStairs, +}; +static PlayerHandlerFunc *const kDungeon_StraightStairs[19] = { + &Module07_11_00_PrepAndReset, + &Module07_11_01_FadeOut, + &Module07_11_02_LoadAndPrepRoom, + &Module07_11_03_FilterAndLoadBGChars, + &Module07_11_04_FilterDoBGAndResetSprites, + &Dungeon_SpiralStaircase11, + &Dungeon_SpiralStaircase12, + &Dungeon_SpiralStaircase11, + &Dungeon_SpiralStaircase12, + &Module07_11_09_LoadSpriteGraphics, + &Module07_11_0A_ScrollCamera, + &Module07_11_0B_PrepDestination, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_DoubleApplyAndIncrementGrayscale, + &Module07_11_19_SetSongAndFilter, + &Module07_11_11_KeepSliding, + &ResetThenCacheRoomEntryProperties, +}; +static PlayerHandlerFunc *const kDungeon_Teleport[15] = { + &ResetTransitionPropsAndAdvance_ResetInterface, + &Module07_15_01_ApplyMosaicAndFilter, + &Dungeon_InitializeRoomFromSpecial, + &DungeonTransition_LoadSpriteGFX, + &Module07_15_04_SyncRoomPropsAndBuildOverlay, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_InterRoomTrans_notDarkRoom, + &Dungeon_InterRoomTrans_State4, + &Dungeon_Staircase14, + &Module07_15_0E_FadeInFromWarp, + &Module07_15_0F_FinalizeAndCacheEntry, +}; +static PlayerHandlerFunc *const kDungeonSubmodules[31] = { + &Module07_00_PlayerControl, + &Module07_01_SubtileTransition, + &Module07_02_SupertileTransition, + &Module07_03_OverlayChange, + &Module07_04_UnlockDoor, + &Module07_05_ControlShutters, + &Module07_06_FatInterRoomStairs, + &Module07_07_FallingTransition, + &Module07_08_NorthIntraRoomStairs, + &Module07_09_OpenCrackedDoor, + &Module07_0A_ChangeBrightness, + &Module07_0B_DrainSwampPool, + &Module07_0C_FloodSwampWater, + &Module07_0D_FloodDam, + &Module07_0E_SpiralStairs, + &Module07_0F_LandingWipe, + &Module07_10_SouthIntraRoomStairs, + &Module07_11_StraightInterroomStairs, + &Module07_11_StraightInterroomStairs, + &Module07_11_StraightInterroomStairs, + &Module07_14_RecoverFromFall, + &Module07_15_WarpPad, + &Module07_16_UpdatePegs, + &Module07_17_PressurePlate, + &Module07_18_RescuedMaiden, + &Module07_19_MirrorFade, + &Module07_1A_RoomDraw_OpenTriforceDoor_bounce, +}; +const uint8 kDungAnimatedTiles[24] = { + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5f, 0x5d, 0x5f, 0x5f, 0x5e, 0x5f, 0x5e, 0x5e, 0x5d, + 0x5d, 0x5e, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, +}; +uint16 *DstoPtr(uint16 d) { + return (uint16 *)&(g_ram[dung_line_ptrs_row0 + d * 2]); +} + +void Object_Fill_Nx1(int n, const uint16 *src, uint16 *dst) { + int t = src[0]; + do *dst++ = t; while (--n); +} + +void Object_Draw_5x4(const uint16 *src, uint16 *dst) { + int n = 5; + do { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(2, 0)] = src[2]; + dst[XY(3, 0)] = src[3]; + dst += XY(0, 1), src += 4; + } while (--n); +} + +void Object_Draw_4x2_BothBgs(const uint16 *src, uint16 dsto) { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(1, 0)] = dung_bg2[dsto + XY(1, 0)] = src[1]; + dung_bg1[dsto + XY(2, 0)] = dung_bg2[dsto + XY(2, 0)] = src[2]; + dung_bg1[dsto + XY(3, 0)] = dung_bg2[dsto + XY(3, 0)] = src[3]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[4]; + dung_bg1[dsto + XY(1, 1)] = dung_bg2[dsto + XY(1, 1)] = src[5]; + dung_bg1[dsto + XY(2, 1)] = dung_bg2[dsto + XY(2, 1)] = src[6]; + dung_bg1[dsto + XY(3, 1)] = dung_bg2[dsto + XY(3, 1)] = src[7]; +} + +void Object_ChestPlatform_Helper(const uint16 *src, int dsto) { + dung_bg2[dsto] = src[0]; + int n = src[3]; + for (int i = dung_draw_width_indicator; i--; dsto++) + dung_bg2[1 + dsto] = n; + + dung_bg2[1 + dsto] = src[6]; + dung_bg2[2 + dsto] = dung_bg2[3 + dsto] = dung_bg2[4 + dsto] = dung_bg2[5 + dsto] = src[9]; + + dung_bg2[6 + dsto] = src[12]; + n = src[15]; + for (int i = dung_draw_width_indicator; i--; dsto++) + dung_bg2[7 + dsto] = n; + + dung_bg2[7 + dsto] = src[18]; +} + +void Object_Hole(const uint16 *src, uint16 *dst) { + Object_SizeAtoAplus15(4); + int w = dung_draw_width_indicator; + for (int i = 0; i < w; i++) + Object_Fill_Nx1(w, src, dst + XY(0, i)); + // fill top/bottom + src = SrcPtr(0x63c); + dst[XY(0, 0)] = src[0]; + Object_Fill_Nx1(w - 2, src + 1, dst + XY(1, 0)); + dst[XY(w - 1, 0)] = src[2]; + + dst[XY(0, w - 1)] = src[3]; + Object_Fill_Nx1(w - 2, src + 4, dst + XY(1, w - 1)); + dst[XY(w - 1, w - 1)] = src[5]; + + // fill left/right edge + src = SrcPtr(0x648); + for (int i = 1; i < w - 1; i++) { + dst[XY(0, i)] = src[0]; + dst[XY(w - 1, i)] = src[1]; + } +} + +// dsto is half the value of Y +void LoadType1ObjectSubtype1(uint8 idx, uint16 *dst, uint16 dsto) { + uint16 param1 = kObjectSubtype1Params[idx]; + const uint16 *src = SrcPtr(param1); + int n; + + switch (idx) { + case 0x0: // RoomDraw_Rightwards2x2_1to15or32 - Ceiling + case 0xb8: case 0xb9: // B8 - Blue Switch Block [L-R] + RoomDraw_GetObjectSize_1to15or32(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + case 0x1: case 0x2: // RoomDraw_Rightwards2x4_1to15or26 - [N]Wall Horz: [L-R] + case 0xb6: case 0xb7: // B6 - [N]Wall Decor: 1/2 [L-R] + RoomDraw_GetObjectSize_1to15or26(); + do { + RoomDraw_Object_Nx4(2, src, dst), dst += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + + case 0x3: case 0x4: // RoomDraw_Rightwards2x4spaced4_1to16 - 03 - [N]Wall Horz: (LOW) [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = dung_bg2[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = dung_bg2[dsto + XY(0, 3)] = src[3]; + dung_bg1[dsto + XY(1, 0)] = dung_bg2[dsto + XY(1, 0)] = src[4]; + dung_bg1[dsto + XY(1, 1)] = dung_bg2[dsto + XY(1, 1)] = src[5]; + dung_bg1[dsto + XY(1, 2)] = dung_bg2[dsto + XY(1, 2)] = src[6]; + dung_bg1[dsto + XY(1, 3)] = dung_bg2[dsto + XY(1, 3)] = src[7]; + dsto += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + + case 0x5: case 0x6: // RoomDraw_Rightwards2x4spaced4_1to16_BothBG - 05 - [N]Wall Column [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Object_Nx4(2, src, dst), dst += XY(6, 0); + } while (--dung_draw_width_indicator); + break; + + case 0x7: case 0x8: case 0x53: // RoomDraw_Rightwards2x2_1to16 - 07 - [N]Wall Pit [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + + case 0x9: case 0x0c: case 0x0d: case 0x10: case 0x11: case 0x14: // 09 - / Wall Wood Bot (HIGH) [NW] + Object_SizeAtoAplus15(6); + do { + RoomDraw_DrawObject2x2and1(src, dst), dst += XY(1, -1); + } while (--dung_draw_width_indicator); + break; + + case 0x0a: case 0x0b: case 0x0e: case 0x0f: case 0x12: case 0x13: // 12 - \ Wall Tile2 Bot (HIGH) [SW] + Object_SizeAtoAplus15(6); + do { + RoomDraw_DrawObject2x2and1(src, dst), dst += XY(1, 1); + } while (--dung_draw_width_indicator); + break; + + case 0x15: case 0x18: case 0x19: case 0x1C: case 0x1D: case 0x20: // 15 - / Wall Tile Top (LOW)[NW] + Object_SizeAtoAplus15(6); + do { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = dung_bg2[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = dung_bg2[dsto + XY(0, 3)] = src[3]; + dung_bg1[dsto + XY(0, 4)] = dung_bg2[dsto + XY(0, 4)] = src[4]; + dsto -= 63; + } while (--dung_draw_width_indicator); + break; + + case 0x16: case 0x17: case 0x1A: case 0x1B: case 0x1E: case 0x1F: // 16 - \ Wall Tile Top (LOW)[SW] + Object_SizeAtoAplus15(6); + do { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = dung_bg2[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = dung_bg2[dsto + XY(0, 3)] = src[3]; + dung_bg1[dsto + XY(0, 4)] = dung_bg2[dsto + XY(0, 4)] = src[4]; + dsto += 65; + } while (--dung_draw_width_indicator); + break; + + case 0x21: // 21 - Mini Stairs [L-R] + dung_draw_width_indicator = (dung_draw_width_indicator << 2 | dung_draw_height_indicator) * 2 + 1; + RoomDraw_1x3_rightwards(2, src, dst), dst += XY(2, 0); + do { + RoomDraw_1x3_rightwards(1, src + 3, dst), dst += XY(1, 0); + } while (--dung_draw_width_indicator); + RoomDraw_1x3_rightwards(1, src + 6, dst); + break; + + case 0x22: { // 22 - Horz: Rail Thin [L-R] + Object_SizeAtoAplus15(2); + if ((dst[0] & 0x3ff) != 0xe2) + dst[0] = src[0]; + n = src[1]; + do *++dst = n; while (--dung_draw_width_indicator); + dst[1] = src[2]; + break; + } + case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: + case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: // 23 - Pit [N]Edge [L-R] + case 0x3f: case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: // 3F - Water Edge [L-R] + case 0x45: case 0x46: case 0xb3: case 0xb4: + RoomDraw_GetObjectSize_1to16(); + n = dst[0] & 0x3ff; + if (n != 0x1db && n != 0x1a6 && n != 0x1dd && n != 0x1fc) + dst[0] = src[0]; + n = src[1]; + do *++dst = n; while (--dung_draw_width_indicator); + dst[1] = src[2]; + break; + + case 0x2f: // 2F - Rail Wall [L-R] + Object_SizeAtoAplus15(10); + n = *src++; + if ((dst[0] & 0x3ff) != 0xe2) { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(1, 1)] = dst[XY(0, 1)] = n; + dst += 2; + } + src += 2; + do { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = n; + } while (dst++, --dung_draw_width_indicator); + src++; + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(1, 1)] = dst[XY(0, 1)] = n; + break; + + case 0x30: // 30 - Rail Wall [L-R] + Object_SizeAtoAplus15(10); + n = *src++; + if ((dst[XY(0, 1)] & 0x3ff) != 0xe2) { + dst[XY(0, 0)] = dst[XY(1, 0)] = n; + dst[XY(0, 1)] = src[0]; + dst[XY(1, 1)] = src[1]; + dst += 2; + } + src += 2; + do { + dst[XY(0, 0)] = n; + dst[XY(0, 1)] = src[0]; + } while (dst++, --dung_draw_width_indicator); + src++; + dst[XY(0, 0)] = dst[XY(1, 0)] = n; + dst[XY(0, 1)] = src[0]; + dst[XY(1, 1)] = src[1]; + break; + case 0x31: case 0x32: // 31 - Unused -empty + case 0x35: case 0x54: case 0x57:case 0x58:case 0x59:case 0x5A: + break; + case 0x33: // 33 - Red Carpet Floor [L-R] + case 0xb2: case 0xba: // B2 - Floor? [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_4x4(src, dst), dst += XY(4, 0); + } while (--dung_draw_width_indicator); + break; + case 0x34: // 34 - Red Carpet Floor Trim [L-R] + Object_SizeAtoAplus15(4); + n = src[0]; + do *dst++ = n; while (--dung_draw_width_indicator); + break; + case 0x36: case 0x37: // 36 - [N]Curtain [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_4x4(src, dst), dst += XY(6, 0); + } while (--dung_draw_width_indicator); + break; + case 0x38: // 38 - Statue [L-R] + src = (uint16 *)((uint8 *)src - param1 + 0xe26); + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_1x3_rightwards(2, src, dst), dst += XY(4, 0); + } while (--dung_draw_width_indicator); + break; + case 0x39: case 0x3d: // 39 - Column [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Object_Nx4(2, src, dst), dst += XY(6, 0); + } while (--dung_draw_width_indicator); + break; + case 0x3a: case 0x3b: // 3A - [N]Wall Decor: [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_1x3_rightwards(4, src, dst), dst += XY(8, 0); + } while (--dung_draw_width_indicator); + break; + case 0x3c: // 3C - Double Chair [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + const uint16 *src = SrcPtr(0x8ca); + RoomDraw_Rightwards2x2(src + 0, dst); + RoomDraw_Rightwards2x2(src + 4, dst + XY(0, 6)); + dst += 4; + } while (--dung_draw_width_indicator); + break; + case 0x3e: case 0x4b: // 3E - [N]Wall Column [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(14, 0); + } while (--dung_draw_width_indicator); + break; + case 0x47: // 47 - Unused Waterfall [L-R] + RoomDraw_GetObjectSize_1to16(); + dung_draw_width_indicator <<= 1; + dst = RoomDraw_DrawObject2x2and1(src, dst) + 1; + do { + RoomDraw_DrawObject2x2and1(src + 5, dst); + } while (dst++, --dung_draw_width_indicator); + RoomDraw_DrawObject2x2and1(src + 10, dst); + break; + case 0x48: + RoomDraw_GetObjectSize_1to16(); + dung_draw_width_indicator <<= 1; + RoomDraw_1x3_rightwards(1, src, dst), dst += XY(1, 0); + do { + dst[XY(0, 0)] = src[3]; + dst[XY(0, 1)] = src[4]; + dst[XY(0, 2)] = src[5]; + } while (dst++, --dung_draw_width_indicator); + RoomDraw_1x3_rightwards(1, src + 6, dst); + break; + case 0x49: case 0x4A: // RoomDraw_RightwardsFloorTile4x2_1to16 ; 49 - N/A + RoomDraw_GetObjectSize_1to16(); + RoomDraw_Downwards4x2VariableSpacing(4, src, dst); + break; + case 0x4c: // 4C - Bar [L-R] + RoomDraw_GetObjectSize_1to16(); + dung_draw_width_indicator <<= 1; + dst = RoomDraw_RightwardBarSegment(src, dst) + 1; + do { + dst = RoomDraw_RightwardBarSegment(src + 3, dst) + 1; + } while (--dung_draw_width_indicator); + dst = RoomDraw_RightwardBarSegment(src + 6, dst) + 1; + break; + + case 0x4d: case 0x4e: case 0x4f: // 4C - Bar [L-R] + RoomDraw_GetObjectSize_1to16(); + RoomDraw_Object_Nx4(1, src, dst), dst += XY(1, 0); + do { + RoomDraw_Object_Nx4(2, src + 4, dst), dst += XY(2, 0); + } while (--dung_draw_width_indicator); + RoomDraw_RightwardShelfEnd(src + 12, dst); + break; + + case 0x50: // 50 - Cane Ride [L-R] + Object_SizeAtoAplus15(2); + n = src[0]; + do *dst++ = n; while (--dung_draw_width_indicator); + break; + + case 0x51: case 0x52: // 51 - [N]Canon Hole [L-R] + case 0x5B: case 0x5C: + RoomDraw_GetObjectSize_1to16(); + RoomDraw_1x3_rightwards(2, src, dst), dst += XY(2, 0); + while (--dung_draw_width_indicator) + RoomDraw_1x3_rightwards(2, src + 6, dst), dst += XY(2, 0); + RoomDraw_1x3_rightwards(2, src + 12, dst); + break; + + case 0x55: case 0x56: // 55 - [N]Wall Torches [L-R] + RoomDraw_GetObjectSize_1to16(); + RoomDraw_Downwards4x2VariableSpacing(12, src, dst); + break; + + case 0x5D: // 5D - Large Horz: Rail [L-R] + RoomDraw_GetObjectSize_1to16(); + dung_draw_width_indicator++; + RoomDraw_1x3_rightwards(2, src, dst), dst += XY(2, 0); + do { + RoomDraw_RightwardBarSegment(src + 6, dst), dst += XY(1, 0); + } while (--dung_draw_width_indicator); + RoomDraw_1x3_rightwards(2, src + 9, dst); + break; + + case 0x5E: // 5E - Block [L-R] + case 0xbb: // BB - N/A + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(4, 0); + } while (--dung_draw_width_indicator); + break; + + case 0x5f: { // 5F - Long Horz: Rail [L-R] + Object_SizeAtoAplus15(21); + if ((dst[0] & 0x3ff) != 0xe2) + dst[0] = src[0]; + n = src[1]; + do *++dst = n; while (--dung_draw_width_indicator); + dst[1] = src[2]; + break; + } + + case 0x60: // 60 - Ceiling [U-D] + case 0x92: case 0x93: // 92 - Blue Peg Block [U-D] + RoomDraw_GetObjectSize_1to15or32(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(0, 2); + } while (--dung_draw_width_indicator); + break; + + case 0x61: case 0x62: case 0x90: case 0x91: // 61 - [W]Wall Vert: [U-D] + RoomDraw_GetObjectSize_1to15or26(); + RoomDraw_Downwards4x2VariableSpacing(2 * 64, src, dst); + break; + + case 0x63: + case 0x64: // RoomDraw_Downwards4x2_1to16_BothBG - 63 - [W]Wall Vert: (LOW) [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(1, 0)] = dung_bg2[dsto + XY(1, 0)] = src[1]; + dung_bg1[dsto + XY(2, 0)] = dung_bg2[dsto + XY(2, 0)] = src[2]; + dung_bg1[dsto + XY(3, 0)] = dung_bg2[dsto + XY(3, 0)] = src[3]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[4]; + dung_bg1[dsto + XY(1, 1)] = dung_bg2[dsto + XY(1, 1)] = src[5]; + dung_bg1[dsto + XY(2, 1)] = dung_bg2[dsto + XY(2, 1)] = src[6]; + dung_bg1[dsto + XY(3, 1)] = dung_bg2[dsto + XY(3, 1)] = src[7]; + dsto += XY(0, 2); + } while (--dung_draw_width_indicator); + break; + + case 0x65: case 0x66: // 65 - [W]Wall Column [U-D] + RoomDraw_GetObjectSize_1to16(); + RoomDraw_Downwards4x2VariableSpacing(6 * 64, src, dst); + break; + + case 0x67: case 0x68: // 67 - [W]Wall Pit [U-D] + case 0x7d: // 7D - Pipe Ride [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(0, 2); + } while (--dung_draw_width_indicator); + break; + case 0x69: // 69 - Vert: Rail Thin [U-D] + Object_SizeAtoAplus15(2); + if ((dst[0] & 0x3ff) != 0xe3) + dst[0] = src[0]; + n = src[1]; + do { dst += 64; *dst = n; } while (--dung_draw_width_indicator); + dst[64] = src[2]; + break; + case 0x6a: case 0x6b: // 6A - [W]Pit Edge [U-D] + case 0x79: case 0x7a: // 79 - Water Edge [U-D] + case 0x8d: case 0x8e: // 8D - [W]Edge [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + dst[0] = src[0], dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0x6c: // 6C - [W]Rail Wall [U-D] + Object_SizeAtoAplus15(10); + n = *src++; + if ((dst[0] & 0x3ff) != 0xe3) { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(1, 0)] = dst[XY(1, 1)] = n; + dst += XY(0, 2); + } + src += 2; + do { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = n; + dst += XY(0, 1); + } while (--dung_draw_width_indicator); + src += 1; + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(1, 0)] = dst[XY(1, 1)] = n; + break; + case 0x6d: // 6D - [E]Rail Wall [U-D] + Object_SizeAtoAplus15(10); + n = *src++; + if ((dst[XY(1, 0)] & 0x3ff) != 0xe3) { + dst[XY(0, 0)] = dst[XY(0, 1)] = n; + dst[XY(1, 0)] = src[0]; + dst[XY(1, 1)] = src[1]; + dst += XY(0, 2); + } + src += 2; + do { + dst[XY(0, 0)] = n; + dst[XY(1, 0)] = src[0]; + dst += XY(0, 1); + } while (--dung_draw_width_indicator); + src += 1; + dst[XY(0, 0)] = dst[XY(0, 1)] = n; + dst[XY(1, 0)] = src[0]; + dst[XY(1, 1)] = src[1]; + break; + case 0x6e: case 0x6f: // unused + case 0x72: case 0x7e: + break; + case 0x70: case 0x94: // 70 - Red Floor/Wire Floor [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_4x4(src, dst), dst += XY(0, 4); + } while (--dung_draw_width_indicator); + break; + case 0x71: // 71 - Red Carpet Floor Trim [U-D] + Object_SizeAtoAplus15(4); + do { + *dst = src[0], dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0x73: case 0x74: // 73 - [W]Curtain [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_4x4(src, dst), dst += XY(0, 6); + } while (--dung_draw_width_indicator); + break; + case 0x75: case 0x87: // 75 - Column [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Object_Nx4(2, src, dst), dst += XY(0, 6); + } while (--dung_draw_width_indicator); + break; + case 0x76: case 0x77: // 76 - [W]Wall Decor: [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Object_Nx4(3, src, dst), dst += XY(0, 8); + } while (--dung_draw_width_indicator); + break; + case 0x78: case 0x7b: // 78 - [W]Wall Top Column [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(0, 14); + } while (--dung_draw_width_indicator); + break; + case 0x7c: // 7C - Cane Ride [U-D] + RoomDraw_GetObjectSize_1to16(); + dung_draw_width_indicator += 1; + do { + dst[0] = src[0], dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0x7f: case 0x80: // 7F - [W]Wall Torches [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Object_Nx4(2, src, dst), dst += XY(0, 12); + } while (--dung_draw_width_indicator); + break; + case 0x81: case 0x82: case 0x83: case 0x84: // 81 - [W]Wall Decor: [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Object_Nx4(3, src, dst), dst += XY(0, 6); + } while (--dung_draw_width_indicator); + break; + case 0x85: case 0x86: // 85 - [W]Wall Canon Hole [U-D] + RoomDraw_GetObjectSize_1to16(); + Object_Draw_3x2(src, dst), dst += XY(0, 2); + while (--dung_draw_width_indicator) + Object_Draw_3x2(src + 6, dst), dst += XY(0, 2); + Object_Draw_3x2(src + 12, dst); + break; + case 0x88: // 88 - Large Vert: Rail [U-D] + RoomDraw_GetObjectSize_1to16(); + RoomDraw_Rightwards2x2(src, dst), dst += XY(0, 2), src += 4; + do { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst += XY(0, 1); + } while (--dung_draw_width_indicator); + RoomDraw_1x3_rightwards(2, src + 2, dst); + break; + case 0x89: // 89 - Block Vert: [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_Rightwards2x2(src, dst), dst += XY(0, 4); + } while (--dung_draw_width_indicator); + break; + case 0x8a: // 8A - Long Vert: Rail [U-D] + Object_SizeAtoAplus15(21); + if ((dst[0] & 0x3ff) != 0xe3) + dst[0] = src[0]; + n = src[1]; + do { dst += XY(0, 1); *dst = n; } while (--dung_draw_width_indicator); + dst[XY(0, 1)] = src[2]; + break; + case 0x8b: case 0x8c: // 8B - [W]Vert: Jump Edge [U-D] + Object_SizeAtoAplus15(8); + do { + dst[0] = src[0], dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0x8f: // 8F - N/A + Object_SizeAtoAplus15(2); + dung_draw_width_indicator <<= 1; + dst[XY(0, 0)] = src[0], dst[XY(1, 0)] = src[1]; + do { + dst[XY(0, 1)] = src[2], dst[XY(1, 1)] = src[3], dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0x95: // 95 - Fake Pot [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_SinglePot(src, dst, dsto); + dst += XY(0, 2), dsto += XY(0, 2); + } while (--dung_draw_width_indicator); + break; + case 0x96: // 96 - Hammer Peg Block [U-D] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_HammerPegSingle(src, dst, dsto); + dst += XY(0, 2), dsto += XY(0, 2); + } while (--dung_draw_width_indicator); + break; + case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: + case 0xad: case 0xae: case 0xaf: + case 0xbe: case 0xbf: + break; + case 0xa0: // A0 - / Ceiling [NW] + case 0xa5: case 0xa9: // A5 - / Ceiling [Trans][NW] + Object_SizeAtoAplus15(4); + do { + Object_Fill_Nx1(dung_draw_width_indicator, src, dst), dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0xa1: // A1 - \ Ceiling [SW] + case 0xa6: case 0xaa: // A6 - \ Ceiling [Trans][SW] + Object_SizeAtoAplus15(4); + n = 1; + do { + Object_Fill_Nx1(n++, src, dst), dst += XY(0, 1); + } while (--dung_draw_width_indicator); + break; + case 0xa2: // A2 - \ Ceiling [NE] + case 0xa7: case 0xab: // A7 - \ Ceiling [Trans][NE] + Object_SizeAtoAplus15(4); + do { + Object_Fill_Nx1(dung_draw_width_indicator, src, dst), dst += XY(1, 1); + } while (--dung_draw_width_indicator); + break; + case 0xa3: // A3 - / Ceiling [SE] + case 0xa8: case 0xac: // A8 - / Ceiling [Trans][SE] + Object_SizeAtoAplus15(4); + do { + Object_Fill_Nx1(dung_draw_width_indicator, src, dst), dst += XY(1, -1); + } while (--dung_draw_width_indicator); + break; + case 0xa4: // A4 - Hole [4-way] + Object_Hole(src, dst); + break; + case 0xb0: case 0xb1: // B0 - [S]Horz: Jump Edge [L-R] + Object_SizeAtoAplus15(8); + Object_Fill_Nx1(dung_draw_width_indicator, src, dst); + break; + case 0xb5: // B5 - N/A + RoomDraw_GetObjectSize_1to16(); + do { + src = SrcPtr(0xb16); + RoomDraw_Object_Nx4(2, src, dst), dst += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + case 0xbc: // BC - fake pots [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_SinglePot(src, dst, dsto); + dst += XY(2, 0), dsto += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + case 0xbd: // BD - Hammer Pegs [L-R] + RoomDraw_GetObjectSize_1to16(); + do { + RoomDraw_HammerPegSingle(src, dst, dsto); + dst += XY(2, 0), dsto += XY(2, 0); + } while (--dung_draw_width_indicator); + break; + case 0xc0: case 0xc2: // C0 - Ceiling Large [4-way] + n = src[0]; + for (int y = dung_draw_height_indicator; y-- >= 0; ) { + uint16 *dst_org = dst; + for (int x = dung_draw_width_indicator; x-- >= 0; dst += XY(4, 0)) { + dst[XY(0, 0)] = dst[XY(1, 0)] = dst[XY(2, 0)] = dst[XY(3, 0)] = n; + dst[XY(0, 1)] = dst[XY(1, 1)] = dst[XY(2, 1)] = dst[XY(3, 1)] = n; + dst[XY(0, 2)] = dst[XY(1, 2)] = dst[XY(2, 2)] = dst[XY(3, 2)] = n; + dst[XY(0, 3)] = dst[XY(1, 3)] = dst[XY(2, 3)] = dst[XY(3, 3)] = n; + } + dst = dst_org + XY(0, 4); + } + break; + case 0xc1: { // C1 - Chest Pedastal [4-way] + dung_draw_width_indicator += 4; + dung_draw_height_indicator += 1; + // draw upper part + uint16 *dsto = dst; + RoomDraw_1x3_rightwards(3, src, dst), src += 9, dst += XY(3, 0); + for (int i = dung_draw_width_indicator; i--; ) + RoomDraw_1x3_rightwards(2, src, dst), dst += XY(2, 0); + RoomDraw_1x3_rightwards(3, src + 6, dst), src += 6 + 9; + // draw center part + dst = dsto + XY(0, 3); + for (int i = dung_draw_height_indicator; i--; ) { + uint16 *dt = dst; + Object_Draw_3x2(src, dt), dt += XY(3, 0); + for (int j = dung_draw_width_indicator; j--; ) + RoomDraw_Rightwards2x2(src + 6, dt), dt += XY(2, 0); + Object_Draw_3x2(src + 10, dt); + dst += XY(0, 2); + } + dsto = dst; + src += 6 + 4 + 6; + RoomDraw_1x3_rightwards(3, src, dst), src += 9, dst += XY(3, 0); + for (int i = dung_draw_width_indicator; i--; ) + RoomDraw_1x3_rightwards(2, src, dst), dst += XY(2, 0); + RoomDraw_1x3_rightwards(3, src + 6, dst), src += 6 + 9; + + src = SrcPtr(0x590); + RoomDraw_Rightwards2x2(src, dsto + XY(dung_draw_width_indicator + 2, -(dung_draw_height_indicator + 1))); + break; + } + case 0xc3: // C3 - Falling Edge Mask [4-way] + case 0xd7: // D7 - overlay tile? [4-way] + dung_draw_width_indicator++; + dung_draw_height_indicator++; + n = *src; + do { + uint16 *d = dst; + for (int i = dung_draw_width_indicator; i--; d += XY(3, 0)) { + d[XY(0, 0)] = d[XY(1, 0)] = d[XY(2, 0)] = n; + d[XY(0, 1)] = d[XY(1, 1)] = d[XY(2, 1)] = n; + d[XY(0, 2)] = d[XY(1, 2)] = d[XY(2, 2)] = n; + } + dst += XY(0, 3); + } while (--dung_draw_height_indicator); + break; + + case 0xc4: // C4 - Doorless Room Transition + src = SrcPtr(dung_floor_2_filler_tiles); + goto fill_floor; + + case 0xdb: // C4 - DB - Floor2 [4-way] + src = SrcPtr(dung_floor_1_filler_tiles); + goto fill_floor; + + case 0xc5: case 0xc6: case 0xc7: case 0xc8: case 0xc9: case 0xca: + case 0xd1: case 0xd2: case 0xd9: + case 0xdf: case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: + case 0xe5: case 0xe6: case 0xe7: case 0xe8: +fill_floor: + dung_draw_width_indicator++; + dung_draw_height_indicator++; + do { + RoomDraw_A_Many32x32Blocks(dung_draw_width_indicator, src, dst); + dst += XY(0, 4); + } while (--dung_draw_height_indicator); + break; + + case 0xcd: { // CD - Moving Wall Right [4-way] + if (!RoomDraw_CheckIfWallIsMoved()) + return; + dung_hdr_collision_2_mirror++; + int size0 = kMovingWall_Sizes0[dung_draw_width_indicator]; + int size1 = kMovingWall_Sizes1[dung_draw_height_indicator]; + MovingWall_FillReplacementBuffer(dsto - size1 - 1); + moving_wall_var2 = dung_draw_height_indicator * 2; + src = SrcPtr(0x3d8); + uint16 *dst1 = dst - size1; + do { + uint16 *dst2 = dst1; + dst2[XY(0, 0)] = src[0]; + int n1 = size0 * 2 + 4; + do { + dst2[XY(0, 1)] = src[1]; + dst2 += XY(0, 1); + } while (--n1); + dst2[XY(0, 1)] = src[2]; + dst1++; + } while (--size1); + src = SrcPtr(0x72a); + RoomDraw_1x3_rightwards(3, src, dst); + dst += XY(0, 3); + do { + Object_Draw_3x2(src + 9, dst); + } while (dst += XY(0, 2), --size0); + RoomDraw_1x3_rightwards(3, src + 9 + 6, dst); + break; + } + + case 0xce: { // CE - Moving Wall Left [4-way] + if (!RoomDraw_CheckIfWallIsMoved()) + return; + dung_hdr_collision_2_mirror++; + src = SrcPtr(0x75a); + int size1 = kMovingWall_Sizes1[dung_draw_height_indicator]; + int size0 = kMovingWall_Sizes0[dung_draw_width_indicator]; + moving_wall_var2 = dung_draw_height_indicator * 2; + MovingWall_FillReplacementBuffer(dsto + 3 + size1); + uint16 *dst1 = dst; + RoomDraw_1x3_rightwards(3, src, dst1); + dst1 += XY(0, 3); + int n = size0; + do { + Object_Draw_3x2(src + 9, dst1); + dst1 += XY(0, 2); + } while (--n); + RoomDraw_1x3_rightwards(3, src + 15, dst1); + src = SrcPtr(0x3d8); + dst1 = dst + XY(3, 0); + do { + uint16 *dst2 = dst1; + dst2[XY(0, 0)] = src[0]; + int n1 = size0 * 2 + 4; + do { + dst2[XY(0, 1)] = src[1]; + dst2 += XY(0, 1); + } while (--n1); + dst2[XY(0, 1)] = src[2]; + dst1++; + } while (--size1); + break; + } + + case 0xd8: { + // loads of lava/water hdma stuff + dung_draw_width_indicator += 2; + water_hdma_var3 = (dung_draw_width_indicator << 4); + dung_draw_height_indicator += 2; + water_hdma_var2 = (dung_draw_height_indicator << 4); + water_hdma_var4 = water_hdma_var2 - 24; + water_hdma_var0 = (dsto & 0x3f) << 3; + water_hdma_var0 += (dung_draw_width_indicator << 4) + dung_loade_bgoffs_h_copy; + water_hdma_var1 = (dsto & 0xfc0) >> 3; + water_hdma_var1 += (dung_draw_height_indicator << 4) + dung_loade_bgoffs_v_copy; + if (dung_savegame_state_bits & 0x800) { + dung_hdr_tag[1] = 0; + dung_hdr_bg2_properties = 0; + dung_num_interpseudo_upnorth_stairs = dung_num_inroom_upnorth_stairs_water; + dung_some_stairs_unk4 = dung_num_activated_water_ladders; + dung_num_activated_water_ladders = 0; + dung_num_inroom_upnorth_stairs_water = 0; + dung_num_stairs_wet = dung_num_inroom_upsouth_stairs_water; + dung_num_inroom_upsouth_stairs_water = 0; + dsto += (dung_draw_width_indicator - 1) << 1; + dsto += (dung_draw_height_indicator - 1) << 7; + DrawWaterThing(&dung_bg2[dsto], SrcPtr(0x1438)); + } else { + src = SrcPtr(0x110); + do { + RoomDraw_A_Many32x32Blocks(dung_draw_width_indicator, src, dst); + dst += XY(0, 4); + } while (--dung_draw_height_indicator); + } + break; + } + + case 0xda: { // water hdma stuff + dung_draw_width_indicator += 2; + water_hdma_var3 = (dung_draw_width_indicator << 4) - 24; + + dung_draw_height_indicator += 2; + water_hdma_var4 = (dung_draw_height_indicator << 4) - 8; + + water_hdma_var2 = water_hdma_var4 - 24; + water_hdma_var5 = 0; + water_hdma_var0 = (dsto & 0x3f) << 3; + water_hdma_var0 += (dung_draw_width_indicator << 4) + dung_loade_bgoffs_h_copy; + water_hdma_var1 = (dsto & 0xfc0) >> 3; + water_hdma_var1 += (dung_draw_height_indicator << 4) + dung_loade_bgoffs_v_copy - 8; + if (dung_savegame_state_bits & 0x800) { + dung_hdr_tag[1] = 0; + } else { + dung_hdr_bg2_properties = 0; + dung_num_interpseudo_upnorth_stairs = dung_num_inroom_upnorth_stairs_water; + dung_some_stairs_unk4 = dung_num_activated_water_ladders; + dung_num_activated_water_ladders = 0; + dung_num_inroom_upnorth_stairs_water = 0; + dung_num_stairs_wet = dung_num_inroom_upsouth_stairs_water; + dung_num_inroom_upsouth_stairs_water = 0; + } + int n = dung_draw_height_indicator * 2 - 1; + src = SrcPtr(0x110); + do { + uint16 *dst2 = dst; + int j = dung_draw_width_indicator; + do { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(2, 0)] = src[2]; + dst[XY(3, 0)] = src[3]; + dst[XY(0, 1)] = src[4]; + dst[XY(1, 1)] = src[5]; + dst[XY(2, 1)] = src[6]; + dst[XY(3, 1)] = src[7]; + dst += 4; + } while (--j); + dst = dst2 + XY(0, 2); + } while (--n); + break; + } + + case 0xdc: { // DC - Chest Platform? [4-way] + dsto |= (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_draw_width_indicator++; + dung_draw_height_indicator = dung_draw_height_indicator * 2 + 5; + src = SrcPtr(0xAB4); + do { + Object_ChestPlatform_Helper(src, dsto), dsto += XY(0, 1); + } while (--dung_draw_height_indicator); + Object_ChestPlatform_Helper(src + 1, dsto), dsto += XY(0, 1); + Object_ChestPlatform_Helper(src + 2, dsto), dsto += XY(0, 1); + break; + } + case 0xdd: // DD - Table / Rock [4-way] + dung_draw_width_indicator++; + dung_draw_height_indicator = dung_draw_height_indicator * 2 + 1; + Object_Table_Helper(src, dst), dst += XY(0, 1); + do { + Object_Table_Helper(src + 4, dst), dst += XY(0, 1); + } while (--dung_draw_height_indicator); + Object_Table_Helper(src + 8, dst), dst += XY(0, 1); + Object_Table_Helper(src + 12, dst), dst += XY(0, 1); + break; + + case 0xde: // DE - Spike Block [4-way] + dung_draw_width_indicator++; + dung_draw_height_indicator++; + do { + int n = dung_draw_width_indicator; + uint16 *dst1 = dst; + do { + RoomDraw_Rightwards2x2(src, dst1), dst1 += XY(2, 0); + } while (--n); + dst += XY(0, 2); + } while (--dung_draw_height_indicator); + break; + + case 0xcb: case 0xcc: case 0xcf: case 0xd0: + case 0xd3: case 0xd4: case 0xd5: case 0xd6: + case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: + assert(0); + break; + default: + assert(0); + } +} + +void Object_DrawNx3_BothBgs(int n, const uint16 *src, int dsto) { + do { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = dung_bg2[dsto + XY(0, 2)] = src[2]; + src += 3, dsto += 1; + } while (--n); +} + +void LoadType1ObjectSubtype2(uint8 idx, uint16 *dst, uint16 dsto) { + uint16 params = kObjectSubtype2Params[idx]; + const uint16 *src = SrcPtr(params); + int i; + switch (idx) { + case 0x00: case 0x01: case 0x02: case 0x03: + case 0x04: case 0x05: case 0x06: case 0x07: // 00 - Wall Outer Corner (HIGH) [NW] + case 0x1c: case 0x24: case 0x25: case 0x29: + RoomDraw_Object_Nx4(4, src, dst); + break; + case 0x08: case 0x09: case 0x0a: case 0x0b: + case 0x0c: case 0x0d: case 0x0e: case 0x0f: // 08 - Wall Outer Corner (LOW) [NW] + Object_DrawNx4_BothBgs(4, src, dsto); + break; + case 0x10: case 0x11: case 0x12: case 0x13: // 10 - Wall S-Bend (LOW) [N1] + Object_DrawNx4_BothBgs(3, src, dsto); + break; + case 0x14: case 0x15: case 0x16: case 0x17: // 14 - Wall S-Bend (LOW) [W1] + Object_DrawNx3_BothBgs(4, src, dsto); + break; + case 0x18: case 0x19: case 0x1a: case 0x1b: // 18 - Wall Pit Corner (Lower) [NW] + case 0x27: case 0x2b: case 0x34: + RoomDraw_Rightwards2x2(src, dst); + break; + case 0x1d: case 0x21: case 0x26: // 1D - Statue + RoomDraw_1x3_rightwards(2, src, dst); + break; + case 0x1e: // 1E - Star Tile Off + RoomDraw_Rightwards2x2(src, dst); + break; + case 0x1f: // 1F - Star Tile On + i = dung_num_star_shaped_switches >> 1; + dung_num_star_shaped_switches += 2; + star_shaped_switches_tile[i] = (dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000)); + RoomDraw_Rightwards2x2(src, dst); + break; + case 0x20: // 20 - Torch Lit + dung_num_lit_torches++; + RoomDraw_Rightwards2x2(src, dst); + break; + case 0x22: case 0x28: // 22 - Weird Bed + Object_Draw_5x4(src, dst); + break; + case 0x23: // 23 - Table + RoomDraw_1x3_rightwards(4, src, dst); + break; + case 0x2a: // 2A - Wall Painting + dung_draw_width_indicator = 1; + RoomDraw_Downwards4x2VariableSpacing(1, src, dst); + break; + case 0x2c: // 2C - ??? + RoomDraw_1x3_rightwards(6, src, dst); + break; + case 0x2d: // 2D - Floor Stairs Up (room) + i = dung_num_inter_room_upnorth_stairs >> 1; + dung_inter_starcases[i] = (dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000)); + dung_num_inter_room_upnorth_stairs = + dung_num_wall_upnorth_spiral_stairs = + dung_num_wall_upnorth_spiral_stairs_2 = + dung_num_inter_room_upnorth_straight_stairs = + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_upnorth_stairs + 2; + RoomDraw_4x4(SrcPtr(0x1088), dst); + break; + case 0x2e: // 2E - Floor Stairs Down (room) + case 0x2f: // 2F - Floor Stairs Down2 (room) + i = dung_num_inter_room_southdown_stairs >> 1; + dung_inter_starcases[i] = (dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000)); + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_southdown_stairs + 2; + RoomDraw_4x4(SrcPtr(0x10A8), dst); + break; + case 0x30: // 30 - Stairs [N](unused) + assert(0); + break; + case 0x31: // 31 - Stairs [N](layer) + i = dung_num_inroom_southdown_stairs >> 1; + dung_stairs_table_1[i] = dsto; + dung_num_inroom_southdown_stairs = + dung_num_water_ladders = + dung_some_stairs_unk4 = dung_num_inroom_southdown_stairs + 2; + Object_DrawNx4_BothBgs(4, src, dsto); + break; + case 0x32: // 32 - Stairs [N](layer) +non_submerged: + i = dung_num_interpseudo_upnorth_stairs >> 1; + dung_stairs_table_1[i] = dsto; + dung_num_interpseudo_upnorth_stairs = + dung_num_water_ladders = + dung_some_stairs_unk4 = dung_num_interpseudo_upnorth_stairs + 2; + RoomDraw_4x4(src, dst); + break; + case 0x33: // 33 - Stairs Submerged [N](layer) + if (dung_hdr_tag[1] == 27 && !(save_dung_info[dungeon_room_index] & 0x100)) { + dung_hdr_bg2_properties = 0; + src = SrcPtr(0x10C8); + goto non_submerged; + } else { + i = dung_num_inroom_upnorth_stairs_water >> 1; + dung_stairs_table_1[i] = dsto; + dung_num_inroom_upnorth_stairs_water = + dung_num_activated_water_ladders = dung_num_inroom_upnorth_stairs_water + 2; + RoomDraw_4x4(SrcPtr(0x10C8), dst); + } + break; + case 0x35: // 35 - Water Ladder + if (dung_hdr_tag[1] == 27 && !(save_dung_info[dungeon_room_index] & 0x100)) + goto inactive_water_ladder; + dung_stairs_table_1[dung_num_activated_water_ladders >> 1] = dsto; + dung_num_activated_water_ladders += 2; + dung_draw_width_indicator = 1; + RoomDraw_Downwards4x2VariableSpacing(1, SrcPtr(0x1108), dst); + break; + case 0x36: // 36 - Water Ladder Inactive +inactive_water_ladder: + dung_stairs_table_1[dung_num_water_ladders >> 1] = dsto; + dung_some_stairs_unk4 = (dung_num_water_ladders += 2); + Object_Draw_4x2_BothBgs(SrcPtr(0x1108), dsto); + break; + case 0x37: // 37 - Water Gate Large + if (!(dung_savegame_state_bits & 0x800)) { + RoomDraw_Object_Nx4(10, src, dst); + watergate_var1 = 0xf; + watergate_pos = dsto * 2; + } else { + RoomDraw_Object_Nx4(10, SrcPtr(0x13e8), dst); + uint16 bak0 = dung_load_ptr; + uint16 bak1 = dung_load_ptr_offs; + uint8 bak2 = dung_load_ptr_bank; + RoomTag_OperateWaterFlooring(); + dung_load_ptr_bank = bak2; + dung_load_ptr_offs = bak1; + dung_load_ptr = bak0; + } + break; + case 0x38: // 38 - Door Staircase Up R + i = dung_num_wall_upnorth_spiral_stairs >> 1; + dung_inter_starcases[i] = (dsto - 0x40) | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_wall_upnorth_spiral_stairs = + dung_num_wall_upnorth_spiral_stairs_2 = + dung_num_inter_room_upnorth_straight_stairs = + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_wall_upnorth_spiral_stairs + 2; + RoomDraw_1x3_rightwards(4, SrcPtr(0x1148), dst); + dung_bg2[dsto - 1] |= 0x2000; + dung_bg2[dsto + 4] |= 0x2000; + break; + case 0x39: // 39 - Door Staircase Down L + i = dung_num_wall_downnorth_spiral_stairs >> 1; + dung_inter_starcases[i] = (dsto - 0x40) | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_wall_downnorth_spiral_stairs + 2; + RoomDraw_1x3_rightwards(4, SrcPtr(0x1160), dst); + dung_bg2[dsto - 1] |= 0x2000; + dung_bg2[dsto + 4] |= 0x2000; + break; + case 0x3a: // 3A - Door Staircase Up R (Lower) + i = dung_num_wall_upnorth_spiral_stairs_2 >> 1; + dung_inter_starcases[i] = (dsto - 0x40) | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_wall_upnorth_spiral_stairs_2 = + dung_num_inter_room_upnorth_straight_stairs = + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_wall_upnorth_spiral_stairs_2 + 2; + RoomDraw_1x3_rightwards(4, SrcPtr(0x1178), dst); + dung_bg1[dsto - 1] |= 0x2000; + dung_bg1[dsto + 4] |= 0x2000; + break; + case 0x3b: // 3B - Door Staircase Down L (Lower) + i = dung_num_wall_downnorth_spiral_stairs_2 >> 1; + dung_inter_starcases[i] = (dsto - 0x40) | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = + dung_num_wall_downnorth_spiral_stairs_2 + 2; + RoomDraw_1x3_rightwards(4, SrcPtr(0x1190), dst); + dung_bg1[dsto - 1] |= 0x2000; + dung_bg1[dsto + 4] |= 0x2000; + break; + case 0x3c: // 3C - Sanctuary Wall + for (int i = 0; i < 6; i++) { + dung_bg2[dsto + 0] = dung_bg2[dsto + 4] = dung_bg2[dsto + 8] = + dung_bg2[dsto + 14] = dung_bg2[dsto + 18] = dung_bg2[dsto + 22] = src[0]; + dung_bg2[dsto + 1] = dung_bg2[dsto + 5] = dung_bg2[dsto + 9] = + dung_bg2[dsto + 15] = dung_bg2[dsto + 19] = dung_bg2[dsto + 23] = src[0] | 0x4000; + dung_bg2[dsto + 2] = dung_bg2[dsto + 6] = dung_bg2[dsto + 16] = dung_bg2[dsto + 20] = src[6]; + dung_bg2[dsto + 3] = dung_bg2[dsto + 7] = dung_bg2[dsto + 17] = dung_bg2[dsto + 21] = src[6] | 0x4000; + dsto += XY(0, 1); + src++; + } + RoomDraw_1x3_rightwards(4, src + 6, dst + 10); + break; + case 0x3e: // 3E - Church Pew + RoomDraw_1x3_rightwards(6, src, dst); + break; + case 0x3f: { // 3F - used in hole at the smithy dwarves + dsto |= (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dst = &dung_bg2[dsto]; + for (int i = 0; i < 8; i++) { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst[XY(0, 3)] = src[3]; + dst[XY(0, 4)] = src[4]; + dst[XY(0, 5)] = src[5]; + dst[XY(0, 6)] = src[6]; + dst += XY(1, 0); + src += 7; + } + break; + } + + default: + assert(0); + } +} + +void Object_BombableFloorHelper(uint16 a, const uint16 *src, const uint16 *src_below, uint16 *dst, uint16 dsto) { + int i = dung_misc_objs_index >> 1; + dung_replacement_tile_state[i] = a; + dung_misc_objs_index += 2; + dung_object_pos_in_objdata[i] = dung_load_ptr_offs; + dung_object_tilemap_pos[i] = dsto * 2 | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x2000); + replacement_tilemap_UL[i] = src_below[0]; + replacement_tilemap_LL[i] = src_below[1]; + replacement_tilemap_UR[i] = src_below[2]; + replacement_tilemap_LR[i] = src_below[3]; + RoomDraw_Rightwards2x2(src, dst); +} + +void LoadType1ObjectSubtype3(uint8 idx, uint16 *dst, uint16 dsto) { + uint16 params = kObjectSubtype3Params[idx]; + const uint16 *src = SrcPtr(params); + int i; + + switch (idx) { + case 0x00: // 00 - Water Face Closed + if (dung_hdr_tag[1] == 27) { + if (save_dung_info[dungeon_room_index] & 0x100) + goto water_face_open; + } else if (dung_hdr_tag[1] == 25) { + if (dung_savegame_state_bits & 0x800) + goto water_face_open; + } + word_7E047C = dsto * 2; + RoomDraw_WaterHoldingObject(3, src, dst); + break; + case 0x01: // 01 - Waterfall Face +water_face_open: + RoomDraw_WaterHoldingObject(5, SrcPtr(0x162c), dst); + break; + case 0x02: // 02 - Waterfall Face Longer + RoomDraw_WaterHoldingObject(7, src, dst); + break; + case 0x03: case 0x0e: // 03 - Cane Ride Spawn [?]Block + dung_unk6++; + dst[0] = src[0]; + break; + case 0x04: case 0x05: case 0x06: case 0x07: // 04 - Cane Ride Node [4-way] + case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0f: + dst[0] = src[0]; + break; + case 0x0d: case 0x17: { // 0D - Prison Cell + src = SrcPtr(0x1488); + dsto |= (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + uint16 *d = &dung_bg2[dsto], *dd = d; + for (int i = 0; i < 5; i++, d++) { + d[XY(2, 0)] = d[XY(9, 0)] = src[1]; + d[XY(2, 1)] = src[2]; + d[XY(9, 1)] = src[2] | 0x4000; + d[XY(2, 2)] = src[4]; + d[XY(9, 2)] = src[4] | 0x4000; + d[XY(2, 3)] = src[5]; + d[XY(9, 3)] = src[5] | 0x4000; + } + dd[XY(0, 0)] = src[0]; + dd[XY(15, 0)] = src[0] | 0x4000; + dd[XY(1, 0)] = dd[XY(7, 0)] = dd[XY(8, 0)] = dd[XY(14, 0)] = src[1]; + dd[XY(1, 2)] = src[3]; + dd[XY(14, 2)] = src[3] | 0x4000; + break; + } + case 0x10: case 0x11: case 0x13: case 0x1a: case 0x22: case 0x23: + case 0x24: case 0x25: + case 0x3e: case 0x3f: case 0x40: case 0x41: case 0x42: + case 0x43: case 0x44: case 0x45: case 0x46: case 0x49: case 0x4a: case 0x4f: + case 0x50: case 0x51: case 0x52: case 0x53: case 0x56: case 0x57: case 0x58: case 0x59: + case 0x5e: case 0x5f: case 0x63: case 0x64: case 0x65: + case 0x75: case 0x7c: case 0x7d: case 0x7e: + RoomDraw_Rightwards2x2(src, dst); + break; + + case 0x12: // 12 - Rupee Floor + if (dung_savegame_state_bits & 0x1000) + return; + src = SrcPtr(0x1dd6); + dst = &dung_bg2[dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000)]; + for (int i = 0; i < 3; i++) { + dst[XY(0, 0)] = dst[XY(0, 3)] = dst[XY(0, 6)] = src[0]; + dst[XY(0, 1)] = dst[XY(0, 4)] = dst[XY(0, 7)] = src[1]; + dst += 2; + } + break; + case 0x14: case 0x4E: // 14 - Down Warp Door + case 0x67: case 0x68: case 0x6c: case 0x6d: case 0x79: + RoomDraw_1x3_rightwards(4, src, dst); + break; + case 0x15: // 15 - Kholdstare Shell - BG2 + if (dung_savegame_state_bits & 0x8000) + return; + src = SrcPtr(0x1dfa); + RoomDraw_SomeBigDecors(10, src, dsto); + break; + case 0x16: // 16 - Single Hammer Peg + RoomDraw_HammerPegSingle(src, dst, dsto); + break; + case 0x18: // 18 - Cell Lock + i = dung_num_bigkey_locks_x2 >> 1; + dung_num_bigkey_locks_x2 += 2; + if (!(dung_savegame_state_bits & kChestOpenMasks[i])) { + dung_chest_locations[i] = dsto * 2; + RoomDraw_Rightwards2x2(SrcPtr(0x1494), dst); + } else { + dung_chest_locations[i] = 0; + } + break; + case 0x19: { // 19 - Chest + if (main_module_index == 26) + return; + i = dung_num_chests_x2 >> 1; + dung_num_bigkey_locks_x2 = (dung_num_chests_x2 += 2); + + int h = -1; + if (dung_hdr_tag[0] == 0x27 || dung_hdr_tag[0] == 0x3c || + dung_hdr_tag[0] == 0x3e || dung_hdr_tag[0] >= 0x29 && dung_hdr_tag[0] < 0x33) + h = 0; + else if (dung_hdr_tag[1] == 0x27 || dung_hdr_tag[1] == 0x3c || + dung_hdr_tag[1] == 0x3e || dung_hdr_tag[1] >= 0x29 && dung_hdr_tag[1] < 0x33) + h = 1; + + dung_chest_locations[i] = 2 * (dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000)); + if (!(dung_savegame_state_bits & kChestOpenMasks[i])) { + if (h >= 0) { + if (!(dung_savegame_state_bits & kChestOpenMasks[h])) + return; + dung_hdr_tag[h] = 0; + } + RoomDraw_Rightwards2x2(SrcPtr(0x149c), dst); + } else { + dung_chest_locations[i] = 0; + if (h >= 0) + dung_hdr_tag[h] = 0; + RoomDraw_Rightwards2x2(SrcPtr(0x14a4), dst); + } + break; + } + case 0x1b: // 1B - Stair + dung_stairs_table_1[dung_num_stairs_1 >> 1] = dsto; + dung_num_stairs_1 += 2; +stair1b: + for (int i = 0; i < 4; i++) { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = dung_bg2[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = dung_bg2[dsto + XY(0, 3)] = src[3]; + src += 4, dsto += 1; + } + break; + case 0x1c: // 1C - Stair [S](Layer) + dung_stairs_table_2[dung_num_stairs_2 >> 1] = dsto; + dung_num_stairs_2 += 2; + goto stair1b; + case 0x1d: // 1D - Stair Wet [S](Layer) +stairs_wet: + dung_stairs_table_2[dung_num_stairs_wet >> 1] = dsto; + dung_num_stairs_wet += 2; + RoomDraw_4x4(src, dst); + break; + case 0x1e: // 1E - Staircase going Up(Up) + dung_inter_starcases[dung_num_inter_room_upnorth_straight_stairs >> 1] = dsto; + dung_num_inter_room_upnorth_straight_stairs = + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_upnorth_straight_stairs + 2; + RoomDraw_Object_Nx4(4, src, dst); + break; + case 0x1f: // 1F - Staircase Going Down (Up) + dung_inter_starcases[dung_num_inter_room_downnorth_straight_stairs >> 1] = dsto; + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_downnorth_straight_stairs + 2; + RoomDraw_Object_Nx4(4, src, dst); + break; + case 0x20: // 20 - Staircase Going Up (Down) + dung_inter_starcases[dung_num_inter_room_upsouth_straight_stairs >> 1] = dsto; + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_upsouth_straight_stairs + 2; + RoomDraw_Object_Nx4(4, src, dst); + break; + case 0x21: // 21 - Staircase Going Down (Down) + dung_inter_starcases[dung_num_inter_room_downsouth_straight_stairs >> 1] = dsto; + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_downsouth_straight_stairs + 2; + RoomDraw_Object_Nx4(4, src, dst); + break; + case 0x26: // 26 - Staircase Going Up (Lower) + i = dung_num_inter_room_upnorth_straight_stairs >> 1; + dung_inter_starcases[i] = dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_inter_room_upnorth_straight_stairs = + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = dung_num_inter_room_upnorth_straight_stairs + 2; +door26: + for (int i = 0; i < 4; i++) { + dung_bg1[dsto] = dung_bg2[dsto] = src[0]; + dung_bg1[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = src[3]; + src += 4, dsto++; + } + dsto += XY(-4, -4); +copy_door_bg2: + dung_bg2[dsto + XY(0, 0)] |= 0x2000; + dung_bg2[dsto + XY(0, 1)] |= 0x2000; + dung_bg2[dsto + XY(0, 2)] |= 0x2000; + dung_bg2[dsto + XY(0, 3)] |= 0x2000; + break; + case 0x27: // 27 - Staircase Going Up (Lower) + i = dung_num_inter_room_downnorth_straight_stairs >> 1; + dung_inter_starcases[i] = dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = + dung_num_inter_room_downnorth_straight_stairs + 2; + goto door26; + case 0x28: // 28 - Staircase Going Down (Lower) + i = dung_num_inter_room_upsouth_straight_stairs >> 1; + dung_inter_starcases[i] = dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_inter_room_upsouth_straight_stairs = + dung_num_inter_room_southdown_stairs = + dung_num_wall_downnorth_spiral_stairs = + dung_num_wall_downnorth_spiral_stairs_2 = + dung_num_inter_room_downnorth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs = + dung_num_inter_room_upsouth_straight_stairs + 2; +door28: + for (int i = 0; i < 4; i++) { + dung_bg1[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = dung_bg2[dsto + XY(0, 3)] = src[3]; + src += 4, dsto++; + } + dsto += XY(-4, 4); + goto copy_door_bg2; + case 0x29: // 29 - Staircase Going Down (Lower) + i = dung_num_inter_room_downsouth_straight_stairs >> 1; + dung_inter_starcases[i] = dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000); + dung_num_inter_room_downsouth_straight_stairs = + dung_num_inter_room_downsouth_straight_stairs + 2; + goto door28; + case 0x2a: // 2A - Dark Room BG2 Mask + RoomDraw_SingleLampCone(0x514, 0x16dc); + RoomDraw_SingleLampCone(0x554, 0x17f6); + RoomDraw_SingleLampCone(0x1514, 0x1914); + RoomDraw_SingleLampCone(0x1554, 0x1a2a); + break; + case 0x2b: // 2B - Staircase Going Down (Lower) not really + DrawBigGraySegment(0x1010, src, dst, dsto); + break; + case 0x2c: // 2C - Large Pick Up Block + DrawBigGraySegment(0x2020, SrcPtr(0xe62), dst, dsto); + DrawBigGraySegment(0x2121, SrcPtr(0xe6a), dst + XY(2, 0), dsto + XY(2, 0)); + DrawBigGraySegment(0x2222, SrcPtr(0xe72), dst + XY(0, 2), dsto + XY(0, 2)); + DrawBigGraySegment(0x2323, SrcPtr(0xe7a), dst + XY(2, 2), dsto + XY(2, 2)); + break; + case 0x2d: { // 2D - Agahnim Altar + src = SrcPtr(0x1b4a); + uint16 *d = &dung_bg2[dsto]; + for (int j = 0; j < 14; j++) { + i = src[0], d[0] = i, d[13] = i | 0x4000; + i = src[14], d[1] = d[2] = i, d[11] = d[12] = i ^ 0x4000; + i = src[28], d[3] = i, d[10] = i ^ 0x4000; + i = src[42], d[4] = i, d[9] = i ^ 0x4000; + i = src[56], d[5] = i, d[8] = i ^ 0x4000; + i = src[70], d[6] = i, d[7] = i ^ 0x4000; + src++, d += 64; + } + break; + } + case 0x2e: // 2E - Agahnim Room + RoomDraw_AgahnimsWindows(dsto); + break; + case 0x2f: // 2F - Pot + RoomDraw_SinglePot(src, dst, dsto); + break; + case 0x30: // 30 - ?? + DrawBigGraySegment(0x1212, src, dst, dsto); + break; + case 0x31: // 31 - Big Chest + i = dung_num_chests_x2; + dung_chest_locations[i >> 1] = dsto * 2 | 0x8000 | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x2000); + if (dung_savegame_state_bits & kChestOpenMasks[i >> 1]) { + dung_chest_locations[i >> 1] = 0; + dung_num_chests_x2 = dung_num_bigkey_locks_x2 = i + 2; + RoomDraw_1x3_rightwards(4, SrcPtr(0x14c4), dst); + } else { + dung_num_chests_x2 = dung_num_bigkey_locks_x2 = i + 2; + RoomDraw_1x3_rightwards(4, SrcPtr(0x14ac), dst); + } + break; + case 0x32: // 32 - Big Chest Open + RoomDraw_1x3_rightwards(4, src, dst); + break; + case 0x33: // 33 - Stairs Submerged [S](layer) + if (dung_hdr_tag[1] == 27) { + if (!(save_dung_info[dungeon_room_index] & 0x100)) { + dung_hdr_bg2_properties = 0; + goto stairs_wet; + } + WORD(CGWSEL_copy) = 0x6202; + } + dung_stairs_table_2[dung_num_inroom_upsouth_stairs_water >> 1] = dsto; + dung_num_inroom_upsouth_stairs_water += 2; + RoomDraw_4x4(src, dst); + break; + case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + assert(0); + break; + case 0x3a: case 0x3b: // 3A - Pipe Ride Mouth [S] + RoomDraw_1x3_rightwards(4, src, dst); + RoomDraw_1x3_rightwards(4, src + 12, dst + XY(0, 3)); + break; + case 0x3c: case 0x3d: case 0x5c: // 3C - Pipe Ride Mouth [E] + RoomDraw_Object_Nx4(6, src, dst); + break; + case 0x47: // 47 - Bomb Floor + RoomDraw_BombableFloor(src, dst, dsto); + break; + case 0x48: case 0x66: case 0x6b: case 0x7a: // 48 - Fake Bomb Floor + RoomDraw_4x4(src, dst); + break; + case 0x4b: case 0x76: case 0x77: + RoomDraw_1x3_rightwards(8, src, dst); + break; + case 0x4c: + RoomDraw_SomeBigDecors(6, SrcPtr(0x1f92), dsto); + break; + case 0x4d: case 0x5d: // 5D - Forge + RoomDraw_1x3_rightwards(6, src, dst); + break; + case 0x54: + RoomDraw_FortuneTellerRoom(dsto); + break; + case 0x55: + case 0x5b: // 5B - Water Troof + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(2, 0)] = src[2]; + for (int i = 0; i < 3; i++) { + dst[XY(0, 1)] = src[3]; + dst[XY(1, 1)] = src[4]; + dst[XY(2, 1)] = src[5]; + dst += XY(0, 1); + } + dst[XY(0, 1)] = src[6]; + dst[XY(1, 1)] = src[7]; + dst[XY(2, 1)] = src[8]; + break; + + case 0x5a: // 5A - Plate on Table + RoomDraw_WaterHoldingObject(2, src, dst); + break; + + case 0x60: case 0x61: // 60 - Left/Right Warp Door + RoomDraw_1x3_rightwards(3, src, dst); + RoomDraw_1x3_rightwards(3, src + 9, dst + XY(0, 3)); + break; + + case 0x62: { // 62 ?? + src = SrcPtr(0x20f6); + uint16 *d = &dung_bg1[dsto]; + for (int i = 0; i < 22; i++) { + d[XY(0, 0)] = src[0]; + d[XY(0, 1)] = src[1]; + d[XY(0, 2)] = src[2]; + d[XY(0, 3)] = src[3]; + d[XY(0, 4)] = src[4]; + d[XY(0, 5)] = src[5]; + d[XY(0, 6)] = src[6]; + d[XY(0, 7)] = src[7]; + d[XY(0, 8)] = src[8]; + d[XY(0, 9)] = src[9]; + d[XY(0, 10)] = src[10]; + d += XY(1, 0), src += 11; + } + d -= XY(1, 0) * 22; + src = SrcPtr(0x22da); + for (int i = 0; i < 3; i++) { + d[XY(9, 11)] = src[0]; + d[XY(9, 12)] = src[3]; + d += XY(1, 0), src += 1; + } + break; + } + case 0x69: case 0x6a: case 0x6e: case 0x6f: // 69 - Left Crack Wall + RoomDraw_Object_Nx4(3, src, dst); + break; + + case 0x70: // 70 - Window Light + RoomDraw_4x4(src, dst + XY(0, 0)); + RoomDraw_4x4(SrcPtr(0x2376), dst + XY(0, 2)); + RoomDraw_4x4(SrcPtr(0x2396), dst + XY(0, 6)); + break; + + case 0x71: // 71 - Floor Light Blind BG2 + if (!(save_dung_info[101] & 0x100)) + return; + Object_Draw8x8(src, dst); + break; + case 0x72: // 72 - TrinexxShell Boss Goo/Shell BG2 + if (dung_savegame_state_bits & 0x8000) + return; + RoomDraw_SomeBigDecors(10, src, dsto); + break; + case 0x73: // 73 - Entire floor is pit, Bg2 Full Mask + RoomDraw_FloorChunks(SrcPtr(0xe0)); + break; + case 0x74: // 74 - Boss Entrance + Object_Draw8x8(src, dst); + break; + + case 0x78: // Triforce + RoomDraw_4x4(src, dst); + RoomDraw_4x4(src + 16, dst + XY(-2, 4)); + RoomDraw_4x4(src + 16, dst + XY(2, 4)); + break; + case 0x7b: // 7B - Vitreous Boss? + RoomDraw_A_Many32x32Blocks(5, src, dst); + RoomDraw_A_Many32x32Blocks(5, src, dst + XY(0, 4)); + break; + default: + assert(0); + } +} + +void RoomBounds_AddA(RoomBounds *r) { + r->a0 += 0x100; + r->a1 += 0x100; +} + +void RoomBounds_AddB(RoomBounds *r) { + r->b0 += 0x200; + r->b1 += 0x200; +} + +void RoomBounds_SubB(RoomBounds *r) { + r->b0 -= 0x200; + r->b1 -= 0x200; +} + +void RoomBounds_SubA(RoomBounds *r) { + r->a0 -= 0x100; + r->a1 -= 0x100; +} + +void Dungeon_StartInterRoomTrans_Left() { + link_quadrant_x ^= 1; + Dungeon_AdjustQuadrant(); + RoomBounds_SubA(&room_bounds_x); + Dung_SaveDataForCurrentRoom(); + DungeonTransition_AdjustCamera_X(link_quadrant_x ^ 1); + HandleEdgeTransition_AdjustCameraBoundaries(3); + submodule_index++; + if (link_quadrant_x) { + RoomBounds_SubB(&room_bounds_x); + BYTE(dungeon_room_index_prev) = dungeon_room_index; + if ((link_tile_below & 0xcf) == 0x89) { + dungeon_room_index = dung_hdr_travel_destinations[3]; + Dungeon_AdjustForTeleportDoors(dungeon_room_index + 1, 0xff); + } else { + if ((uint8)dungeon_room_index != (uint8)dungeon_room_index2) { + BYTE(dungeon_room_index_prev) = dungeon_room_index2; + Dungeon_AdjustAfterSpiralStairs(); + } + dungeon_room_index--; + } + submodule_index += 1; + if (room_transitioning_flags & 1) { + link_is_on_lower_level ^= 1; + link_is_on_lower_level_mirror = link_is_on_lower_level; + } + if (room_transitioning_flags & 2) { + cur_palace_index_x2 ^= 2; + } + } + room_transitioning_flags = 0; + quadrant_fullsize_y = (dung_blastwall_flag_y || (kLayoutQuadrantFlags[composite_of_layout_and_quadrant] & (link_quadrant_y ? 8 : 4)) == 0) ? 2 : 0; +} + +void Dung_StartInterRoomTrans_Left_Plus() { + link_x_coord -= 8; + Dungeon_StartInterRoomTrans_Left(); +} + +void Dungeon_StartInterRoomTrans_Up() { + link_quadrant_y ^= 2; + Dungeon_AdjustQuadrant(); + RoomBounds_SubA(&room_bounds_y); + Dung_SaveDataForCurrentRoom(); + DungeonTransition_AdjustCamera_Y(link_quadrant_y ^ 2); + HandleEdgeTransition_AdjustCameraBoundaries(1); + submodule_index++; + if (link_quadrant_y) { + RoomBounds_SubB(&room_bounds_y); + BYTE(dungeon_room_index_prev) = dungeon_room_index; + if (link_tile_below == 0x8e) { + Dung_HandleExitToOverworld(); + return; + } + + if (dungeon_room_index == 0) { + SaveDungeonKeys(); + main_module_index = 25; + submodule_index = 0; + subsubmodule_index = 0; + return; + } + + if (BYTE(dungeon_room_index2) == BYTE(dungeon_room_index)) { + BYTE(dungeon_room_index_prev) = BYTE(dungeon_room_index2); + Dungeon_AdjustAfterSpiralStairs(); + } + BYTE(dungeon_room_index) -= 0x10; + submodule_index += 1; + if (room_transitioning_flags & 1) { + link_is_on_lower_level ^= 1; + link_is_on_lower_level_mirror = link_is_on_lower_level; + } + if (room_transitioning_flags & 2) { + cur_palace_index_x2 ^= 2; + } + } + room_transitioning_flags = 0; + quadrant_fullsize_x = (dung_blastwall_flag_x || (kLayoutQuadrantFlags[composite_of_layout_and_quadrant] & (link_quadrant_x ? 2 : 1)) == 0) ? 2 : 0; +} + +void Dungeon_StartInterRoomTrans_Down() { + link_quadrant_y ^= 2; + Dungeon_AdjustQuadrant(); + RoomBounds_AddA(&room_bounds_y); + Dung_SaveDataForCurrentRoom(); + DungeonTransition_AdjustCamera_Y(link_quadrant_y); + HandleEdgeTransition_AdjustCameraBoundaries(0); + submodule_index++; + if (!link_quadrant_y) { + RoomBounds_AddB(&room_bounds_y); + BYTE(dungeon_room_index_prev) = dungeon_room_index; + if (link_tile_below == 0x8e) { + Dung_HandleExitToOverworld(); + return; + } + + if ((uint8)dungeon_room_index != (uint8)dungeon_room_index2) { + BYTE(dungeon_room_index_prev) = dungeon_room_index2; + Dungeon_AdjustAfterSpiralStairs(); + } + BYTE(dungeon_room_index) += 16; + submodule_index += 1; + if (room_transitioning_flags & 1) { + link_is_on_lower_level ^= 1; + link_is_on_lower_level_mirror = link_is_on_lower_level; + } + if (room_transitioning_flags & 2) { + cur_palace_index_x2 ^= 2; + } + } + room_transitioning_flags = 0; + quadrant_fullsize_x = (dung_blastwall_flag_x || (kLayoutQuadrantFlags[composite_of_layout_and_quadrant] & (link_quadrant_x ? 2 : 1)) == 0) ? 2 : 0; +} + +void Dungeon_Store2x2(uint16 pos, uint16 t0, uint16 t1, uint16 t2, uint16 t3, uint8 attr) { + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + dst[2] = t0; + dst[5] = t1; + dst[8] = t2; + dst[11] = t3; + overworld_tileattr[pos] = t0; + overworld_tileattr[pos + 64] = t1; + overworld_tileattr[pos + 1] = t2; + overworld_tileattr[pos + 65] = t3; + + dung_bg2_attr_table[pos] = attr; + dung_bg2_attr_table[pos + 64] = attr; + dung_bg2_attr_table[pos + 1] = attr; + dung_bg2_attr_table[pos + 65] = attr; + + dst[0] = Dungeon_MapVramAddr(pos + 0); + dst[3] = Dungeon_MapVramAddr(pos + 64); + dst[6] = Dungeon_MapVramAddr(pos + 1); + dst[9] = Dungeon_MapVramAddr(pos + 65); + + dst[1] = 0x100; + dst[4] = 0x100; + dst[7] = 0x100; + dst[10] = 0x100; + + dst[12] = 0xffff; + + vram_upload_offset += 24; + nmi_load_bg_from_vram = 1; +} + +uint16 Dungeon_MapVramAddr(uint16 pos) { + pos *= 2; + return swap16(((pos & 0x40) << 4) | ((pos & 0x303f) >> 1) | ((pos & 0xf80) >> 2)); +} + +uint16 Dungeon_MapVramAddrNoSwap(uint16 pos) { + pos *= 2; + return ((pos & 0x40) << 4) | ((pos & 0x303f) >> 1) | ((pos & 0xf80) >> 2); +} + +void Door_Up_EntranceDoor(uint16 dsto) { + // NOTE: This don't pass the right value to RoomDraw_FlagDoorsAndGetFinalType + assert(0); +} + +void Door_Down_EntranceDoor(uint16 dsto) { + // NOTE: This don't pass the right value to RoomDraw_FlagDoorsAndGetFinalType + assert(0); +} + +void Door_Left_EntranceDoor(uint16 dsto) { + // NOTE: This don't pass the right value to RoomDraw_FlagDoorsAndGetFinalType + assert(0); +} + +void Door_Right_EntranceDoor(uint16 dsto) { + // NOTE: This don't pass the right value to RoomDraw_FlagDoorsAndGetFinalType + assert(0); +} + +void Door_Draw_Helper4(uint8 door_type, uint16 dsto) { + int t = RoomDraw_FlagDoorsAndGetFinalType(1, door_type, dsto), new_type; + if (t & 0x100) + return; + + if ((new_type = kDoorType_Regular, t == kDoorType_1E || t == kDoorType_36) || + (new_type = kDoorType_ShuttersTwoWay, t == kDoorType_38)) { + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + + const uint16 *src = SrcPtr(kDoorTypeSrcData2[t >> 1]); + uint16 *dst = DstoPtr(dsto); + for (int i = 0; i < 4; i++) { + dst[XY(0, 1)] = src[0]; + dst[XY(0, 2)] = src[1]; + dst[XY(0, 3)] = src[2]; + dst++, src += 3; + } +} + +const uint16 *GetRoomDoorInfo(int room) { + return (uint16 *)(kDungeonRoom + kDungeonRoomDoorOffs[room]); +} + +const uint8 *GetRoomHeaderPtr(int room) { + return kDungeonRoomHeaders + kDungeonRoomHeadersOffs[room]; +} + +const uint8 *GetDefaultRoomLayout(int i) { + return kDungeonRoomDefault + kDungeonRoomDefaultOffs[i]; +} + +const uint8 *GetDungeonRoomLayout(int i) { + return kDungeonRoom + kDungeonRoomOffs[i]; +} + +static inline void WriteAttr1(int j, uint16 attr) { + dung_bg1_attr_table[j + 0] = attr; + dung_bg1_attr_table[j + 1] = attr >> 8; +} + +static inline void WriteAttr2(int j, uint16 attr) { + dung_bg2_attr_table[j + 0] = attr; + dung_bg2_attr_table[j + 1] = attr >> 8; +} + +void Dung_TagRoutine_0x22_0x3B(int k, uint8 j) { + if (dung_savegame_state_bits & 0x100) { + dung_hdr_tag[k] = 0; + dung_overlay_to_load = j; + dung_load_ptr_offs = 0; + subsubmodule_index = 0; + sound_effect_2 = 0x1b; + submodule_index = 3; + } +} + +void Sprite_HandlePushedBlocks_One(int i) { + Oam_AllocateFromRegionB(4); + + int y = (uint8)pushedblocks_y_lo[i] | (uint8)pushedblocks_y_hi[i] << 8; + int x = (uint8)pushedblocks_x_lo[i] | (uint8)pushedblocks_x_hi[i] << 8; + + y -= BG2VOFS_copy2 + 1; + x -= BG2HOFS_copy2; + + if (pushedblocks_some_index < 3) { + uint8 *oam = &g_ram[oam_cur_ptr]; + oam[0] = x; + oam[1] = y; + oam[2] = 12; + oam[3] = 0x20; + g_ram[oam_ext_cur_ptr] = 2; + } +} + +void Object_Draw_DoorLeft_3x4(uint16 src, int door) { + const uint16 *s = SrcPtr(src); + uint16 *dst = &dung_bg2[dung_door_tilemap_address[door] >> 1]; + for (int i = 0; i < 3; i++) { + dst[XY(0, 0)] = s[0]; + dst[XY(0, 1)] = s[1]; + dst[XY(0, 2)] = s[2]; + dst[XY(0, 3)] = s[3]; + dst += 1, s += 4; + } +} + +void Object_Draw_DoorRight_3x4(uint16 src, int door) { + const uint16 *s = SrcPtr(src); + uint16 *dst = &dung_bg2[dung_door_tilemap_address[door] >> 1]; + for (int i = 0; i < 3; i++) { + dst[XY(1, 0)] = s[0]; + dst[XY(1, 1)] = s[1]; + dst[XY(1, 2)] = s[2]; + dst[XY(1, 3)] = s[3]; + dst += 1, s += 4; + } +} + +void Dungeon_OpeningLockedDoor_Combined(bool skip_anim) { + uint8 ctr = 2; + int k, dma_ptr; + + if (skip_anim) { + door_animation_step_indicator = 16; + goto step12; + } + + door_animation_step_indicator++; + if (door_animation_step_indicator != 4) { + if (door_animation_step_indicator != 12) + goto middle; +step12: + int m = kUpperBitmasks[dung_bg2_attr_table[dung_cur_door_pos] & 7]; + dung_door_opened_incl_adjacent |= m; + dung_door_opened |= m; + ctr = 4; + } + door_open_closed_counter = ctr; + + k = dung_bg2_attr_table[dung_cur_door_pos] & 0xf; + dma_ptr = DrawDoorOpening_Step1(k, 0); + Dungeon_PrepOverlayDma_nextPrep(dma_ptr, dung_door_tilemap_address[k]); + sound_effect_2 = 21; + nmi_copy_packets_flag = 1; + +middle: + if (door_animation_step_indicator == 16) { + Dungeon_LoadToggleDoorAttr_OtherEntry(dung_bg2_attr_table[dung_cur_door_pos] & 0xf); + if (dung_bg2_attr_table[dung_cur_door_pos] >= 0xf0) { + k = dung_bg2_attr_table[dung_cur_door_pos] & 0xf; + uint8 door_type = door_type_and_slot[k]; + if (door_type >= kDoorType_StairMaskLocked0 && door_type <= kDoorType_StairMaskLocked3) + DrawCompletelyOpenDoor(); + } + submodule_index = 0; + } +} + +const DungPalInfo *GetDungPalInfo(int idx) { + return &kDungPalinfos[idx]; +} + +uint16 Dungeon_GetTeleMsg(int room) { + return kDungeonRoomTeleMsg[room]; +} + +uint8 GetEntranceMusicTrack(int entrance) { + return kEntranceData_musicTrack[entrance]; +} + +bool Dungeon_IsPitThatHurtsPlayer() { + for (int i = countof(kDungeonPitsHurtPlayer) - 1; i >= 0; i--) { + if (kDungeonPitsHurtPlayer[i] == dungeon_room_index) + return true; + } + return false; + +} + +void Dungeon_PrepareNextRoomQuadrantUpload() { // 80913f + int ofs = (overworld_screen_transition & 0xf) + dung_cur_quadrant_upload; + uint16 *src = &dung_bg2[kUploadBgSrcs[ofs] / 2]; + int p = 0; + do { + UploadVram_32x32 *d = (UploadVram_32x32 *)&g_ram[0x1000 + p * 2]; + do { + d->row[0].col[0] = src[XY(0, 0)]; + d->row[0].col[1] = src[XY(1, 0)]; + d->row[1].col[0] = src[XY(0, 1)]; + d->row[1].col[1] = src[XY(1, 1)]; + d->row[2].col[0] = src[XY(0, 2)]; + d->row[2].col[1] = src[XY(1, 2)]; + d->row[3].col[0] = src[XY(0, 3)]; + d->row[3].col[1] = src[XY(1, 3)]; + d = (UploadVram_32x32 *)((uint16 *)d + 2); + src += 2, p += 2; + } while (p & 0x1f); + src += 224; + p += 128 - 32; + } while (p != 0x400); + dung_cur_quadrant_upload += 4; + BYTE(nmi_load_target_addr) = kUploadBgDsts[ofs]; + nmi_subroutine_index = 1; + nmi_disable_core_updates = 1; +} + +void WaterFlood_BuildOneQuadrantForVRAM() { // 8091c4 + + // It never seems to be 25 here, so skip updating water stuff + assert(dung_hdr_tag[0] != 25); + TileMapPrep_NotWaterOnTag(); +} + +void TileMapPrep_NotWaterOnTag() { // 8091d3 + int ofs = (overworld_screen_transition & 0xf) + dung_cur_quadrant_upload; + uint16 *src = &dung_bg1[kUploadBgSrcs[ofs] / 2]; + int p = 0; + do { + UploadVram_32x32 *d = (UploadVram_32x32 *)&g_ram[0x1000 + p * 2]; + do { + d->row[0].col[0] = src[XY(0, 0)]; + d->row[0].col[1] = src[XY(1, 0)]; + d->row[1].col[0] = src[XY(0, 1)]; + d->row[1].col[1] = src[XY(1, 1)]; + d->row[2].col[0] = src[XY(0, 2)]; + d->row[2].col[1] = src[XY(1, 2)]; + d->row[3].col[0] = src[XY(0, 3)]; + d->row[3].col[1] = src[XY(1, 3)]; + d = (UploadVram_32x32 *)((uint16 *)d + 2); + src += 2, p += 2; + } while (p & 0x1f); + src += 224; + p += 128 - 32; + } while (p != 0x400); + BYTE(nmi_load_target_addr) = kUploadBgDsts[ofs] + 0x10; + nmi_subroutine_index = 1; + nmi_disable_core_updates = 1; +} + +void OrientLampLightCone() { // 80f567 + static const uint16 kOrientLampBgTab0[] = { 0, 256, 0, 256 }; + static const uint16 kOrientLampBgTab1[] = { 0, 0, 256, 256 }; + static const int16 kOrientLampBgTab2[] = { 52, -2, 56, 6 }; + static const int16 kOrientLampBgTab3[] = { 64, 64, 82, -176 }; + static const int16 kOrientLampBgTab4[] = { 128, 384, 160, 160 }; + + if (!hdr_dungeon_dark_with_lantern || submodule_index == 20) + return; + + uint8 a = link_direction_facing >> 1, idx = a; + if (is_standing_in_doorway) { + idx = (is_standing_in_doorway & 0xfe); + if (idx) { + if (a < 2) + idx += ((uint8)(link_x_coord + 8) >= 0x80); + else + idx = a; + } else { + if (a >= 2) + idx += ((uint8)link_y_coord >= 0x80); + else + idx = a; + } + } + + if (idx < 2) { + BG1HOFS_copy2 = BG2HOFS_copy2 - (link_x_coord - 0x77) + kOrientLampBgTab0[idx]; + uint16 t = BG2VOFS_copy2 - (link_y_coord - 0x58) + kOrientLampBgTab1[idx] + kOrientLampBgTab2[idx] + kOrientLampBgTab3[idx]; + if ((int16)t < 0) t = 0; + if (t > kOrientLampBgTab4[idx]) t = kOrientLampBgTab4[idx]; + BG1VOFS_copy2 = t - kOrientLampBgTab3[idx]; + } else { + BG1VOFS_copy2 = BG2VOFS_copy2 - (link_y_coord - 0x72) + kOrientLampBgTab1[idx]; + uint16 t = BG2HOFS_copy2 - (link_x_coord - 0x58) + kOrientLampBgTab0[idx] + kOrientLampBgTab2[idx] + kOrientLampBgTab3[idx]; + if ((int16)t < 0) t = 0; + if (t > kOrientLampBgTab4[idx]) t = kOrientLampBgTab4[idx]; + BG1HOFS_copy2 = t - kOrientLampBgTab3[idx]; + } +} + +void PrepareDungeonExitFromBossFight() { // 80f945 + SavePalaceDeaths(); + SaveDungeonKeys(); + dung_savegame_state_bits |= 0x8000; + Dungeon_FlagRoomData_Quadrants(); + + int j = FindInByteArray(kDungeonExit_From, BYTE(dungeon_room_index), countof(kDungeonExit_From)); + assert(j >= 0); + BYTE(dungeon_room_index) = kDungeonExit_To[j]; + if (BYTE(dungeon_room_index) == 0x20) { + sram_progress_indicator = 3; + save_ow_event_info[2] |= 0x20; + savegame_is_darkworld ^= 0x40; + Sprite_LoadGraphicsProperties_light_world_only(); + Ancilla_TerminateSelectInteractives(0); + link_disable_sprite_damage = 0; + button_b_frames = 0; + button_mask_b_y = 0; + link_force_hold_sword_up = 0; + flag_is_link_immobilized = 1; + saved_module_for_menu = 8; + main_module_index = 21; + submodule_index = 0; + subsubmodule_index = 0; + } else if (BYTE(dungeon_room_index) == 0xd) { + main_module_index = 24; + submodule_index = 0; + overworld_map_state = 0; + CGADSUB_copy = 0x20; + } else { + if (j >= 3) { + music_control = 0xf1; + music_unk1 = 0xf1; + main_module_index = 22; + } else { + main_module_index = 19; + } + saved_module_for_menu = 8; + submodule_index = 0; + subsubmodule_index = 0; + } +} + +void SavePalaceDeaths() { // 80f9dd + int j = BYTE(cur_palace_index_x2); + deaths_per_palace[j >> 1] = death_save_counter; + if (j != 8) + death_save_counter = 0; +} + +void Dungeon_LoadRoom() { // 81873a + Dungeon_LoadHeader(); + dung_unk6 = 0; + + dung_hdr_collision_2_mirror = dung_hdr_collision_2; + dung_hdr_collision_2_mirror_PADDING = dung_hdr_tag[0]; + dung_some_subpixel[0] = 0x30; + dung_some_subpixel[1] = 0xff; + dung_floor_move_flags = 0; + word_7E0420 = 0; + dung_floor_x_vel = dung_floor_y_vel = 0; + dung_floor_x_offs = dung_floor_y_offs = 0; + invisible_door_dir_and_index_x2 = 0xffff; + dung_blastwall_flag_x = dung_blastwall_flag_y = 0; + dung_unk_blast_walls_2 = dung_unk_blast_walls_3 = 0; + water_hdma_var5 = 0; + dung_num_toggle_floor = 0; + dung_num_toggle_palace = 0; + dung_unk2 = 0; + dung_cur_quadrant_upload = 0; + dung_num_inter_room_upnorth_stairs = 0; + dung_num_inter_room_southdown_stairs = 0; + dung_num_inroom_upnorth_stairs = 0; + dung_num_inroom_southdown_stairs = 0; + dung_num_interpseudo_upnorth_stairs = 0; + dung_num_inroom_upnorth_stairs_water = 0; + dung_num_activated_water_ladders = 0; + dung_num_water_ladders = 0; + dung_some_stairs_unk4 = 0; + dung_num_stairs_1 = 0; + dung_num_stairs_2 = 0; + dung_num_stairs_wet = 0; + dung_num_inroom_upsouth_stairs_water = 0; + dung_num_wall_upnorth_spiral_stairs = 0; + dung_num_wall_downnorth_spiral_stairs = 0; + dung_num_wall_upnorth_spiral_stairs_2 = 0; + dung_num_wall_downnorth_spiral_stairs_2 = 0; + dung_num_inter_room_upnorth_straight_stairs = 0; + dung_num_inter_room_upsouth_straight_stairs = 0; + dung_num_inter_room_downnorth_straight_stairs = 0; + dung_num_inter_room_downsouth_straight_stairs = 0; + dung_exit_door_addresses[0] = 0; + dung_exit_door_addresses[1] = 0; + dung_exit_door_addresses[2] = 0; + dung_exit_door_addresses[3] = 0; + dung_exit_door_count = 0; + dung_door_switch_triggered = 0; + dung_num_star_shaped_switches = 0; + dung_misc_objs_index = 0; + dung_index_of_torches = 0; + dung_num_chests_x2 = 0; + dung_num_bigkey_locks_x2 = 0; + dung_unk5 = 0; + dung_cur_door_idx = 0; + + for (int i = 0; i < 16; i++) { + dung_door_tilemap_address[i] = 0; + door_type_and_slot[i] = 0; + dung_door_direction[i] = 0; + dung_torch_timers[i] = 0; + dung_replacement_tile_state[i] = 0; + dung_object_pos_in_objdata[i] = 0; + dung_object_tilemap_pos[i] = 0; + } + + const uint8 *cur_p0 = GetDungeonRoomLayout(dungeon_room_index); + dung_load_ptr_offs = 0; + RoomDraw_DrawFloors(cur_p0); + + uint16 old_offs = dung_load_ptr_offs; + dung_layout_and_starting_quadrant = cur_p0[dung_load_ptr_offs]; + + const uint8 *cur_p1 = GetDefaultRoomLayout(dung_layout_and_starting_quadrant >> 2); + + dung_load_ptr_offs = 0; + RoomDraw_DrawAllObjects(cur_p1); + + dung_load_ptr_offs = old_offs + 1; + + RoomDraw_DrawAllObjects(cur_p0); // Draw Layer 1 objects to BG2 + dung_load_ptr_offs += 2; + + memcpy(&dung_line_ptrs_row0, kDungeon_DrawObjectOffsets_BG2, 33); + RoomDraw_DrawAllObjects(cur_p0); // Draw Layer 2 objects to BG2 + dung_load_ptr_offs += 2; + + memcpy(&dung_line_ptrs_row0, kDungeon_DrawObjectOffsets_BG1, 33); + RoomDraw_DrawAllObjects(cur_p0); // Draw Layer 3 objects to BG2 + + for (dung_load_ptr_offs = 0; dung_load_ptr_offs != 0x18C; dung_load_ptr_offs += 4) { + MovableBlockData &m = movable_block_datas[dung_load_ptr_offs >> 2]; + if (m.room == dungeon_room_index) + DrawObjects_PushableBlock(m.tilemap, dung_load_ptr_offs); + } + + uint16 t; + + dung_index_of_torches = dung_index_of_torches_start = dung_misc_objs_index; + int i = 0; + do { + if (dung_torch_data[i >> 1] == dungeon_room_index) { + i += 2; + + do { + t = dung_torch_data[i >> 1]; + i += 2; + DrawObjects_LightableTorch(t, i - 2); + } while (dung_torch_data[i >> 1] != 0xffff); + break; + } + i += 2; + do { + t = dung_torch_data[i >> 1]; + i += 2; + } while (t != 0xffff); + } while (i != 0x120); + + dung_load_ptr_offs = 0x120; +} + +void RoomDraw_DrawAllObjects(const uint8 *level_data) { // 8188e4 + for (;;) { + dung_draw_width_indicator = dung_draw_height_indicator = 0; + uint16 d = WORD(level_data[dung_load_ptr_offs]); + if (d == 0xffff) + return; + if (d == 0xfff0) + break; + RoomData_DrawObject(d, level_data); + } + for (;;) { + dung_load_ptr_offs += 2; + uint16 d = WORD(level_data[dung_load_ptr_offs]); + if (d == 0xffff) + return; + RoomData_DrawObject_Door(d); + } +} + +void RoomData_DrawObject_Door(uint16 a) { // 818916 + uint8 door_type = a >> 8; + uint8 position = a >> 4 & 0xf; + + switch (a & 3) { + case 0: RoomDraw_Door_North(door_type, position); break; + case 1: RoomDraw_Door_South(door_type, position); break; + case 2: RoomDraw_Door_West(door_type, position); break; + case 3: RoomDraw_Door_East(door_type, position); break; + } +} + +void RoomData_DrawObject(uint16 r0, const uint8 *level_data) { // 81893c + uint16 offs = dung_load_ptr_offs; + uint8 idx = level_data[offs + 2]; + dung_load_ptr_offs = offs + 3; + + if ((r0 & 0xfc) != 0xfc) { + dung_draw_width_indicator = (r0 & 3); + dung_draw_height_indicator = (r0 >> 8) & 3; + uint8 x = (uint8)r0 >> 2; + uint8 y = (r0 >> 10); + uint16 dst = y * 64 + x; + if (idx < 0xf8) { + LoadType1ObjectSubtype1(idx, DstoPtr(dst), dst); + } else { + idx = (idx & 7) << 4 | ((r0 >> 8) & 3) << 2 | (r0 & 3); + LoadType1ObjectSubtype3(idx, DstoPtr(dst), dst); + } + } else { + uint8 x = (r0 & 3) << 4 | (r0 >> 12) & 0xf; + uint8 y = ((r0 >> 8) & 0xf) << 2 | (idx >> 6); + uint16 dst = y * 64 + x; + LoadType1ObjectSubtype2(idx & 0x3f, DstoPtr(dst), dst); + } +} + +void RoomDraw_DrawFloors(const uint8 *level_data) { // 8189dc + memcpy(&dung_line_ptrs_row0, kDungeon_DrawObjectOffsets_BG2, 33); + uint8 ft = level_data[dung_load_ptr_offs++]; + dung_floor_1_filler_tiles = ft & 0xf0; + RoomDraw_FloorChunks(SrcPtr(dung_floor_1_filler_tiles)); + memcpy(&dung_line_ptrs_row0, kDungeon_DrawObjectOffsets_BG1, 33); + dung_floor_2_filler_tiles = (ft & 0xf) << 4; + RoomDraw_FloorChunks(SrcPtr(dung_floor_2_filler_tiles)); +} + +void RoomDraw_FloorChunks(const uint16 *src) { // 818a1f + static const uint16 kDungeon_QuadrantOffsets[] = { 0x0, 0x40, 0x1000, 0x1040 }; + for (int i = 0; i < 4; i++) { + uint16 *dst = DstoPtr(kDungeon_QuadrantOffsets[i] / 2); + for (int j = 0; j < 8; j++) { + RoomDraw_A_Many32x32Blocks(8, src, dst); + dst += XY(0, 4); + } + } +} + +void RoomDraw_A_Many32x32Blocks(int n, const uint16 *src, uint16 *dst) { // 818a44 + do { + // draw 4x2 twice + for (int i = 0; i < 2; i++) { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(2, 0)] = src[2]; + dst[XY(3, 0)] = src[3]; + dst[XY(0, 1)] = src[4]; + dst[XY(1, 1)] = src[5]; + dst[XY(2, 1)] = src[6]; + dst[XY(3, 1)] = src[7]; + dst += XY(0, 2); + } + dst += XY(4, -4); + } while (--n); +} + +void RoomDraw_1x3_rightwards(int n, const uint16 *src, uint16 *dst) { // 818d80 + do { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst++, src += 3; + } while (--n); +} + +bool RoomDraw_CheckIfWallIsMoved() { // 819298 + dung_some_subpixel[0] = dung_some_subpixel[1] = 0; + dung_floor_move_flags = 0; + int i; + if ((i = 0, dung_hdr_tag[0] >= 0x1c && dung_hdr_tag[0] < 0x20) || + (i = 1, dung_hdr_tag[1] >= 0x1c && dung_hdr_tag[1] < 0x20)) { + if (dung_savegame_state_bits & (0x1000 >> i)) { + dung_hdr_collision = 0; + dung_hdr_tag[i] = 0; + dung_hdr_bg2_properties = 0; + return false; + } + } + return true; +} + +void MovingWall_FillReplacementBuffer(int dsto) { // 8192d1 + for (int i = 0; i < 64; i++) + moving_wall_arr1[i] = 0x1ec; + moving_wall_var1 = (dsto & 0x1f) | (dsto & 0x20 ? 0x400 : 0) | 0x1000; +} + +void Object_Table_Helper(const uint16 *src, uint16 *dst) { // 8193f7 + int n = dung_draw_width_indicator; + dst[0] = src[0]; + do { + dst[1] = src[1]; + dst[2] = src[2]; + dst += 2; + } while (--n); + dst[1] = src[3]; +} + +void DrawWaterThing(uint16 *dst, const uint16 *src) { // 8195a0 + for (int i = 3; i >= 0; i--) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst += XY(0, 1), src += 4; + } +} + +void RoomDraw_4x4(const uint16 *src, uint16 *dst) { // 8197ed + RoomDraw_Object_Nx4(4, src, dst); +} + +void RoomDraw_Object_Nx4(int n, const uint16 *src, uint16 *dst) { // 8197f0 + do { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst[XY(0, 3)] = src[3]; + src += 4; + dst += XY(1, 0); + } while (--n); +} + +void Object_DrawNx4_BothBgs(int n, const uint16 *src, int dsto) { // 819819 + do { + dung_bg1[dsto + XY(0, 0)] = dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = dung_bg2[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = dung_bg2[dsto + XY(0, 3)] = src[3]; + src += 4, dsto += 1; + } while (--n); +} + +void RoomDraw_Rightwards2x2(const uint16 *src, uint16 *dst) { // 819895 + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(1, 0)] = src[2]; + dst[XY(1, 1)] = src[3]; +} + +void Object_Draw_3x2(const uint16 *src, uint16 *dst) { // 819d04 + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(2, 0)] = src[2]; + dst[XY(0, 1)] = src[3]; + dst[XY(1, 1)] = src[4]; + dst[XY(2, 1)] = src[5]; +} + +void RoomDraw_WaterHoldingObject(int n, const uint16 *src, uint16 *dst) { // 819d6f + do { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + src += 4; + dst += XY(0, 1); + } while (--n); +} + +void RoomDraw_SomeBigDecors(int n, const uint16 *src, uint16 dsto) { // 819da2 + uint16 *dst = &dung_bg2[dsto | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x1000)]; + for (int i = 0; i < 8; i++) { + for (int j = 0; j < n; j++) + dst[j] = src[j]; + dst += 64, src += n; + } +} + +void RoomDraw_SingleLampCone(uint16 a, uint16 y) { // 819e06 + const uint16 *src = SrcPtr(y); + uint16 *dst = &dung_bg1[a / 2]; + for (int i = 0; i < 12; i++) { + for (int j = 0; j < 12; j++) + *dst++ = *src++; + dst += 64 - 12; + } +} + +void RoomDraw_AgahnimsWindows(uint16 dsto) { // 819ea3 + const uint16 *src; + + uint16 *d = &dung_bg2[dsto]; + src = SrcPtr(0x1BF2); + for (int i = 0; i < 6; i++) { + d[XY(7, 4)] = d[XY(13, 4)] = d[XY(19, 4)] = src[0]; + d[XY(7, 5)] = d[XY(13, 5)] = d[XY(19, 5)] = src[1]; + d[XY(7, 6)] = d[XY(13, 6)] = d[XY(19, 6)] = src[2]; + d[XY(7, 7)] = d[XY(13, 7)] = d[XY(19, 7)] = src[3]; + src += 4, d += XY(1, 0); + } + d -= 6; + + src = SrcPtr(0x1c22); + for (int i = 0; i < 5; i++) { + int j = src[0]; + d[XY(2, 10)] = d[XY(3, 9)] = d[XY(4, 8)] = d[XY(5, 7)] = d[XY(6, 6)] = d[XY(7, 5)] = d[XY(8, 4)] = j; + d[XY(23, 4)] = d[XY(24, 5)] = d[XY(25, 6)] = d[XY(26, 7)] = d[XY(27, 8)] = d[XY(28, 9)] = d[XY(29, 10)] = j | 0x4000; + src++, d += XY(0, 1); + } + d -= XY(0, 1) * 5; + + src = SrcPtr(0x1c2c); + for (int i = 0; i < 6; i++) { + int j = src[0]; + d[XY(2, 11)] = d[XY(2, 17)] = d[XY(2, 23)] = j; + d[XY(29, 11)] = d[XY(29, 17)] = d[XY(29, 23)] = j | 0x4000; + j = src[1]; + d[XY(3, 11)] = d[XY(3, 17)] = d[XY(3, 23)] = j; + d[XY(28, 11)] = d[XY(28, 17)] = d[XY(28, 23)] = j | 0x4000; + j = src[2]; + d[XY(4, 11)] = d[XY(4, 17)] = d[XY(4, 23)] = j; + d[XY(27, 11)] = d[XY(27, 17)] = d[XY(27, 23)] = j | 0x4000; + j = src[3]; + d[XY(5, 11)] = d[XY(5, 17)] = d[XY(5, 23)] = j; + d[XY(26, 11)] = d[XY(26, 17)] = d[XY(26, 23)] = j | 0x4000; + src += 4, d += XY(0, 1); + } + d -= XY(0, 1) * 6; + + src = SrcPtr(0x1c5c); + for (int i = 0; i < 6; i++) { + d[XY(12, 9)] = d[XY(18, 9)] = src[0]; + d[XY(12, 10)] = d[XY(18, 10)] = src[6]; + src += 1, d += XY(1, 0); + } + d -= XY(1, 0) * 6; + + src = SrcPtr(0x1c74); + for (int i = 0; i < 6; i++) { + d[XY(7, 14)] = d[XY(7, 20)] = src[0]; + d[XY(8, 14)] = d[XY(8, 20)] = src[1]; + src += 2, d += XY(0, 1); + } + d -= XY(0, 1) * 6; + + src = SrcPtr(0x1c8c); + for (int i = 0; i < 5; i++) { + d[XY(7, 9)] = src[0]; + d[XY(7, 10)] = src[1]; + d[XY(7, 11)] = src[2]; + d[XY(7, 12)] = src[3]; + d[XY(7, 13)] = src[4]; + src += 5, d += XY(1, 0); + } + d -= XY(1, 0) * 5; + + for (int i = 0; i < 4; i++) { + d[XY(14, 28)] |= 0x2000; + d[XY(14, 29)] |= 0x2000; + d += XY(1, 0); + } +} + +void RoomDraw_FortuneTellerRoom(uint16 dsto) { // 81a095 + const uint16 *src = SrcPtr(0x202e), *src_org = src; + uint16 *d = &dung_bg2[dsto]; + int j; + + for (int i = 0; i < 6; i++) { + d[XY(1, 0)] = + d[XY(2, 0)] = + d[XY(1, 1)] = + d[XY(2, 1)] = src[0]; + d[XY(1, 2)] = (j = src[1]); + d[XY(2, 2)] = j | 0x4000; + d += XY(2, 0); + } + d -= XY(2, 0) * 6; + + for (int i = 0; i < 3; i++) { + d[XY(0, 3)] = d[XY(2, 3)] = d[XY(10, 3)] = d[XY(12, 3)] = (j = src[2]); + d[XY(1, 3)] = d[XY(3, 3)] = d[XY(11, 3)] = d[XY(13, 3)] = j | 0x4000; + d[XY(4, 3)] = d[XY(6, 3)] = d[XY(8, 3)] = (j = src[5]); + d[XY(5, 3)] = d[XY(7, 3)] = d[XY(9, 3)] = j | 0x4000; + src++, d += XY(0, 1); + } + d -= XY(0, 1) * 3; + + d[XY(0, 0)] = d[XY(0, 1)] = (j = src[5]); + d[XY(13, 0)] = d[XY(13, 1)] = j | 0x4000; + d[XY(0, 2)] = (j = src[6]); + d[XY(13, 2)] = j | 0x4000; + + src = src_org; + for (int i = 0; i < 4; i++) { + d[XY(3, 10)] = (j = src[10]); + d[XY(10, 10)] = j ^ 0x4000; + d[XY(4, 10)] = (j = src[14]); + d[XY(9, 10)] = j ^ 0x4000; + d[XY(5, 10)] = (j = src[18]); + d[XY(8, 10)] = j ^ 0x4000; + d[XY(6, 10)] = (j = src[22]); + d[XY(7, 10)] = j ^ 0x4000; + src++, d += XY(0, 1); + } +} + +void Object_Draw8x8(const uint16 *src, uint16 *dst) { // 81a7dc + RoomDraw_4x4(src, dst + XY(0, 0)); + RoomDraw_4x4(src + 16, dst + XY(4, 0)); + RoomDraw_4x4(src + 32, dst + XY(0, 4)); + RoomDraw_4x4(src + 48, dst + XY(4, 4)); +} + +void RoomDraw_Door_North(int type, int pos_enum) { // 81a81c + uint16 dsto = kDoorPositionToTilemapOffs_Up[pos_enum] / 2; + if (type == kDoorType_LgExplosion) + RoomDraw_Door_ExplodingWall(pos_enum); + else if (type == kDoorType_PlayerBgChange) + RoomDraw_MarkLayerToggleDoor(dsto - 0xfe / 2); + else if (type == kDoorType_Slashable) + RoomDraw_NorthCurtainDoor(dsto); + else if (type == kDoorType_EntranceDoor) + Door_Up_EntranceDoor(dsto); + else if (type == kDoorType_ThroneRoom) + RoomDraw_MarkDungeonToggleDoor(dsto - 0xfe / 2); + else if (type == kDoorType_Regular2) { + RoomDraw_MakeDoorPartsHighPriority_Y(dsto & (0xF07F / 2)); + RoomDraw_NormalRangedDoors_North(type, dsto, pos_enum); + } else if (type == kDoorType_ExitToOw) { + dung_exit_door_addresses[dung_exit_door_count >> 1] = dsto * 2; + dung_exit_door_count += 2; + } else if (type == kDoorType_WaterfallTunnel) { + RoomDraw_NormalRangedDoors_North(type, dsto, pos_enum); + Door_PrioritizeCurDoor(); + } else if (type >= kDoorType_StairMaskLocked0 && type <= kDoorType_StairMaskLocked3) { + Door_Up_StairMaskLocked(type, dsto); + } else if (type >= kDoorType_RegularDoor33) + RoomDraw_HighRangeDoor_North(type, dsto, pos_enum); + else + RoomDraw_NormalRangedDoors_North(type, dsto, pos_enum); + +} + +void Door_Up_StairMaskLocked(uint8 door_type, uint16 dsto) { // 81a892 + int i = dung_cur_door_idx >> 1; + dung_door_direction[i] = 0; + dung_door_tilemap_address[i] = dsto * 2; + door_type_and_slot[i] = i << 8 | door_type; + if (dung_door_opened_incl_adjacent & kUpperBitmasks[i & 7]) { + dung_cur_door_idx += 2; + return; + } + + if (door_type < kDoorType_StairMaskLocked2) { + RoomDraw_OneSidedShutters_North(door_type, dsto); + return; + } + + uint8 t = RoomDraw_FlagDoorsAndGetFinalType(0, door_type, dsto); + const uint16 *src = SrcPtr(kDoorTypeSrcData[t >> 1]); + for (int i = 0; i < 4; i++) { + dung_bg1[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = src[2]; + dsto++, src += 3; + } + Door_PrioritizeCurDoor(); +} + +void Door_PrioritizeCurDoor() { // 81a8fa + dung_door_tilemap_address[(dung_cur_door_idx >> 1) - 1] |= 0x2000; +} + +void RoomDraw_NormalRangedDoors_North(uint8 door_type, uint16 dsto, int pos_enum) { // 81a90f + if (pos_enum >= 6) { + uint16 bak = dung_cur_door_idx; + dung_cur_door_idx |= 0x10; + RoomDraw_CheckIfLowerLayerDoors_Y(door_type, kDoorPositionToTilemapOffs_Down[pos_enum - 6] / 2); + dung_cur_door_idx = bak; + } + RoomDraw_OneSidedShutters_North(door_type, dsto); +} + +void RoomDraw_OneSidedShutters_North(uint8 door_type, uint16 dsto) { // 81a932 + int t = RoomDraw_FlagDoorsAndGetFinalType(0, door_type, dsto); + if (t & 0x100) + return; + // Remap type + if (t == 54 || t == 56) { + int new_type = (t == 54) ? kDoorType_ShuttersTwoWay : kDoorType_Regular; + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + const uint16 *src = SrcPtr(kDoorTypeSrcData[t >> 1]); + uint16 *dst = DstoPtr(dsto); + for (int i = 0; i < 4; i++) { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst++, src += 3; + } +} + +void RoomDraw_Door_South(int type, int pos_enum) { // 81a984 + uint16 dsto = kDoorPositionToTilemapOffs_Down[pos_enum] / 2; + if (type == kDoorType_PlayerBgChange) + RoomDraw_MarkLayerToggleDoor(dsto + XY(1, 4)); + else if (type == kDoorType_EntranceDoor) + Door_Down_EntranceDoor(dsto); + else if (type == kDoorType_ThroneRoom) + RoomDraw_MarkDungeonToggleDoor(dsto + XY(1, 4)); + else if (type == kDoorType_ExitToOw) { + dung_exit_door_addresses[dung_exit_door_count >> 1] = dsto * 2; + dung_exit_door_count += 2; + } else if (type >= kDoorType_RegularDoor33) { + RoomDraw_OneSidedLowerShutters_South(type, dsto); + } else if (type == kDoorType_EntranceLarge) { + RoomDraw_FlagDoorsAndGetFinalType(1, type, dsto); + RoomDraw_SomeBigDecors(10, SrcPtr(0x2656), dsto + XY(-3, -4)); + } else if (type == kDoorType_EntranceLarge2) { + dsto |= 0x1000; + RoomDraw_FlagDoorsAndGetFinalType(1, type, dsto); + dsto += XY(-3, -4); + RoomDraw_SomeBigDecors(10, SrcPtr(0x2656), dsto); + dsto += -0x1000 + XY(0, 7); + for (int i = 0; i < 10; i++) { + dung_bg2[dsto] = dung_bg1[dsto] | 0x2000; + dsto += 1; + } + } else if (type == kDoorType_EntranceCave || type == kDoorType_EntranceCave2) { + if (type == kDoorType_EntranceCave2) + RoomDraw_MakeDoorPartsHighPriority_Y(dsto + XY(0, 4)); + RoomDraw_FlagDoorsAndGetFinalType(1, type, dsto); + RoomDraw_4x4(SrcPtr(0x26f6), DstoPtr(dsto)); + } else if (type == kDoorType_4) { + uint16 dsto_org = dsto; + dsto |= 0x1000; + RoomDraw_MakeDoorPartsHighPriority_Y(dsto + XY(0, 4)); + RoomDraw_FlagDoorsAndGetFinalType(1, type, dsto); + RoomDraw_4x4(SrcPtr(0x26f6), DstoPtr(dsto)); + for (int i = 0; i < 4; i++) { + dung_bg2[dsto_org + XY(0, 3)] = dung_bg1[dsto_org + XY(0, 3)] | 0x2000; + dsto_org += 1; + } + } else { + RoomDraw_CheckIfLowerLayerDoors_Y(type, dsto); + } +} + +void RoomDraw_CheckIfLowerLayerDoors_Y(uint8 door_type, uint16 dsto) { // 81aa66 + if (door_type == kDoorType_Regular2) { + RoomDraw_MakeDoorPartsHighPriority_Y(dsto + XY(0, 4)); + Door_Draw_Helper4(door_type, dsto); + } else if (door_type == kDoorType_WaterfallTunnel) { + Door_Draw_Helper4(door_type, dsto); + Door_PrioritizeCurDoor(); + } else { + Door_Draw_Helper4(door_type, dsto); + } +} + +void RoomDraw_Door_West(int type, int pos_enum) { // 81aad7 + uint16 dsto = kDoorPositionToTilemapOffs_Left[pos_enum] / 2; + if (type == kDoorType_PlayerBgChange) + RoomDraw_MarkLayerToggleDoor(dsto + XY(-2, 1)); + else if (type == kDoorType_EntranceDoor) + Door_Left_EntranceDoor(dsto); + else if (type == kDoorType_ThroneRoom) + RoomDraw_MarkDungeonToggleDoor(dsto + XY(-2, 1)); + else if (type == kDoorType_Regular2) { + RoomDraw_MakeDoorPartsHighPriority_X(dsto & ~0x1f); + RoomDraw_NormalRangedDoors_West(type, dsto, pos_enum); + } else if (type == kDoorType_WaterfallTunnel) { + RoomDraw_NormalRangedDoors_West(type, dsto, pos_enum); + Door_PrioritizeCurDoor(); + } else if (type < kDoorType_RegularDoor33) { + RoomDraw_NormalRangedDoors_West(type, dsto, pos_enum); + } else { + RoomDraw_HighRangeDoor_West(type, dsto, pos_enum); + } +} + +void RoomDraw_NormalRangedDoors_West(uint8 door_type, uint16 dsto, int pos_enum) { // 81ab1f + if (pos_enum >= 6) { + uint16 bak = dung_cur_door_idx; + dung_cur_door_idx |= 0x10; + RoomDraw_NormalRangedDoors_East(door_type, kDoorPositionToTilemapOffs_Right[pos_enum - 6] / 2); + dung_cur_door_idx = bak; + } + + int t = RoomDraw_FlagDoorsAndGetFinalType(2, door_type, dsto), new_type; + if (t & 0x100) + return; + + if ((new_type = kDoorType_ShuttersTwoWay, t == kDoorType_36) || + (new_type = kDoorType_Regular, t == kDoorType_38)) { + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + + const uint16 *src = SrcPtr(kDoorTypeSrcData3[t >> 1]); + uint16 *dst = DstoPtr(dsto); + for (int i = 0; i < 3; i++) { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst[XY(0, 3)] = src[3]; + dst++, src += 4; + } + +} + +void RoomDraw_Door_East(int type, int pos_enum) { // 81ab99 + uint16 dsto = kDoorPositionToTilemapOffs_Right[pos_enum] / 2; + if (type == kDoorType_PlayerBgChange) + RoomDraw_MarkLayerToggleDoor(dsto + XY(4, 1)); + else if (type == kDoorType_EntranceDoor) + Door_Right_EntranceDoor(dsto); + else if (type == kDoorType_ThroneRoom) + RoomDraw_MarkDungeonToggleDoor(dsto + XY(4, 1)); + else if (type < kDoorType_RegularDoor33) { + RoomDraw_NormalRangedDoors_East(type, dsto); + } else { + RoomDraw_OneSidedLowerShutters_East(type, dsto); + } +} + +void RoomDraw_NormalRangedDoors_East(uint8 door_type, uint16 dsto) { // 81abc8 + if (door_type == kDoorType_Regular2) + RoomDraw_MakeDoorPartsHighPriority_X(dsto + XY(4, 0)); + if (door_type == kDoorType_WaterfallTunnel) { + RoomDraw_OneSidedShutters_East(door_type, dsto); + Door_PrioritizeCurDoor(); + } else { + RoomDraw_OneSidedShutters_East(door_type, dsto); + } +} + +void RoomDraw_OneSidedShutters_East(uint8 door_type, uint16 dsto) { // 81abe2 + int t = RoomDraw_FlagDoorsAndGetFinalType(3, door_type, dsto), new_type; + if (t & 0x100) + return; + if ((new_type = kDoorType_Regular, t == kDoorType_36) || + (new_type = kDoorType_ShuttersTwoWay, t == kDoorType_38)) { + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + const uint16 *src = SrcPtr(kDoorTypeSrcData4[t >> 1]); + uint16 *dst = DstoPtr(dsto) + 1; + for (int i = 0; i < 3; i++) { + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst[XY(0, 3)] = src[3]; + dst++, src += 4; + } +} + +void RoomDraw_NorthCurtainDoor(uint16 dsto) { // 81ac3b + int rv = RoomDraw_FlagDoorsAndGetFinalType(0, kDoorType_Slashable, dsto); + if (rv & 0x100) { + RoomDraw_4x4(SrcPtr(0x78a), DstoPtr(dsto)); + } else { + RoomDraw_4x4(SrcPtr(kDoorTypeSrcData[rv >> 1]), DstoPtr(dsto)); + } +} + +void RoomDraw_Door_ExplodingWall(int pos_enum) { // 81ac70 + uint16 dsto = kDoor_BlastWallUp_Dsts[pos_enum] / 2; + int i = dung_cur_door_idx >> 1; + dung_door_tilemap_address[i] = 2 * (dsto + 10); + door_type_and_slot[i] = i << 8 | kDoorType_LgExplosion; + if (!(dung_door_opened_incl_adjacent & kUpperBitmasks[i & 7])) { + dung_door_direction[i] = 0; + dung_cur_door_idx += 2; + return; + } + int slot = dung_hdr_tag[0] != 0x20 && dung_hdr_tag[0] != 0x25 && dung_hdr_tag[0] != 0x28; + dung_hdr_tag[slot] = 0; + quadrant_fullsize_y = 2; + dung_blastwall_flag_y = 1; + RoomDraw_ExplodingWallSegment(SrcPtr(kDoorTypeSrcData2[42]), dsto); + dung_cur_door_idx += 2; + dung_unk2 |= 0x200; + RoomDraw_ExplodingWallSegment(SrcPtr(kDoorTypeSrcData[42]), dsto + XY(0, 6)); +} + +void RoomDraw_ExplodingWallSegment(const uint16 *src, uint16 dsto) { // 81ace4 + RoomDraw_ExplodingWallColumn(src, DstoPtr(dsto)); + src += 12, dsto += 2; + int n = src[0]; + uint16 *d = &dung_bg2[dsto]; + dung_draw_width_indicator = 18; + do { + d[XY(0, 0)] = d[XY(0, 1)] = d[XY(0, 2)] = n; + d[XY(0, 3)] = d[XY(0, 4)] = d[XY(0, 5)] = n; + d++; + } while (--dung_draw_width_indicator); + RoomDraw_ExplodingWallColumn(src + 1, DstoPtr(dsto + 18)); +} + +void RoomDraw_ExplodingWallColumn(const uint16 *src, uint16 *dst) { // 81ad25 + for (int i = 0; i < 6; i++) { + dst[0] = src[0]; + dst[1] = src[6]; + dst += XY(0, 1), src += 1; + } +} + +void RoomDraw_HighRangeDoor_North(uint8 door_type, uint16 dsto, int pos_enum) { // 81ad41 + if (pos_enum >= 6 && door_type != kDoorType_WarpRoomDoor) { + uint16 bak = dung_cur_door_idx; + dung_cur_door_idx |= 0x10; + RoomDraw_OneSidedLowerShutters_South(door_type, kDoorPositionToTilemapOffs_Down[pos_enum - 6] / 2); + dung_cur_door_idx = bak; + } + uint8 t = RoomDraw_FlagDoorsAndGetFinalType(0, door_type, dsto); + if (t == kDoorType_ShutterTrapUR || t == kDoorType_ShutterTrapDL) { + int new_type = (t == kDoorType_ShutterTrapUR) ? kDoorType_RegularDoor33 : kDoorType_Shutter; + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + uint16 dsto_org = dsto; + const uint16 *src = SrcPtr(kDoorTypeSrcData[t >> 1]); + for (int i = 0; i < 4; i++) { + dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = src[2]; + dsto++, src += 3; + } + if (door_type != kDoorType_WarpRoomDoor) + RoomDraw_MakeDoorHighPriority_North(dsto_org); + Door_PrioritizeCurDoor(); +} + +void RoomDraw_OneSidedLowerShutters_South(uint8 door_type, uint16 dsto) { // 81add4 + uint8 t = RoomDraw_FlagDoorsAndGetFinalType(1, door_type, dsto); + if (t == kDoorType_ShutterTrapUR || t == kDoorType_ShutterTrapDL) { + int new_type = (t == kDoorType_ShutterTrapUR) ? kDoorType_Shutter : kDoorType_RegularDoor33; + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + uint16 dsto_org = dsto; + const uint16 *src = SrcPtr(kDoorTypeSrcData2[t >> 1]); + for (int i = 0; i < 4; i++) { + dung_bg1[dsto + XY(0, 1)] = src[0]; + dung_bg1[dsto + XY(0, 2)] = src[1]; + dung_bg2[dsto + XY(0, 3)] = src[2]; + dsto++, src += 3; + } + RoomDraw_MakeDoorHighPriority_South(dsto_org + XY(0, 4)); + Door_PrioritizeCurDoor(); +} + +void RoomDraw_HighRangeDoor_West(uint8 door_type, uint16 dsto, int pos_enum) { // 81ae40 + if (pos_enum >= 6) { + uint16 bak = dung_cur_door_idx; + dung_cur_door_idx |= 0x10; + RoomDraw_OneSidedLowerShutters_East(door_type, kDoorPositionToTilemapOffs_Right[pos_enum - 6] / 2); + dung_cur_door_idx = bak; + } + + uint8 t = RoomDraw_FlagDoorsAndGetFinalType(2, door_type, dsto), new_type; + if ((new_type = kDoorType_Shutter, t == kDoorType_ShutterTrapUR) || + (new_type = kDoorType_RegularDoor33, t == kDoorType_ShutterTrapDL)) { + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + + const uint16 *src = SrcPtr(kDoorTypeSrcData3[t >> 1]); + uint16 dsto_org = dsto; + dung_bg2[dsto + XY(0, 0)] = src[0]; + dung_bg2[dsto + XY(0, 1)] = src[1]; + dung_bg2[dsto + XY(0, 2)] = src[2]; + dung_bg2[dsto + XY(0, 3)] = src[3]; + dsto++, src += 4; + for (int i = 0; i < 2; i++) { + dung_bg1[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(0, 1)] = src[1]; + dung_bg1[dsto + XY(0, 2)] = src[2]; + dung_bg1[dsto + XY(0, 3)] = src[3]; + dsto++, src += 4; + } + RoomDraw_MakeDoorHighPriority_West(dsto_org); + Door_PrioritizeCurDoor(); +} + +void RoomDraw_OneSidedLowerShutters_East(uint8 door_type, uint16 dsto) { // 81aef0 + uint8 t = RoomDraw_FlagDoorsAndGetFinalType(3, door_type, dsto), new_type; + if ((new_type = kDoorType_RegularDoor33, t == kDoorType_ShutterTrapUR) || + (new_type = kDoorType_Shutter, t == kDoorType_ShutterTrapDL)) { + int i = (dung_cur_door_idx >> 1) - 1; + door_type_and_slot[i] = (i << 8) | new_type; + t = new_type; + } + + uint16 dst_org = dsto; + const uint16 *src = SrcPtr(kDoorTypeSrcData4[t >> 1]); + for (int i = 0; i < 2; i++) { + dung_bg1[dsto + XY(1, 0)] = src[0]; + dung_bg1[dsto + XY(1, 1)] = src[1]; + dung_bg1[dsto + XY(1, 2)] = src[2]; + dung_bg1[dsto + XY(1, 3)] = src[3]; + dsto++, src += 4; + } + dung_bg2[dsto + XY(1, 0)] = src[0]; + dung_bg2[dsto + XY(1, 1)] = src[1]; + dung_bg2[dsto + XY(1, 2)] = src[2]; + dung_bg2[dsto + XY(1, 3)] = src[3]; + RoomDraw_MakeDoorHighPriority_East(dst_org + XY(4, 0)); + Door_PrioritizeCurDoor(); +} + +void RoomDraw_MakeDoorHighPriority_North(uint16 dsto) { // 81af8b + uint16 dsto_org = dsto; + dsto &= 0xF07F >> 1; + do { + dung_bg2[dsto + 0] |= 0x2000; + dung_bg2[dsto + 1] |= 0x2000; + dung_bg2[dsto + 2] |= 0x2000; + dung_bg2[dsto + 3] |= 0x2000; + dsto += XY(0, 1); + } while (dsto != dsto_org); +} + +void RoomDraw_MakeDoorHighPriority_South(uint16 dsto) { // 81afd4 + do { + dung_bg2[dsto + 0] |= 0x2000; + dung_bg2[dsto + 1] |= 0x2000; + dung_bg2[dsto + 2] |= 0x2000; + dung_bg2[dsto + 3] |= 0x2000; + dsto += XY(0, 1); + } while (dsto & 0x7c0); +} + +void RoomDraw_MakeDoorHighPriority_West(uint16 dsto) { // 81b017 + uint16 dsto_org = dsto; + dsto &= 0xffe0; + do { + dung_bg2[dsto + XY(0, 0)] |= 0x2000; + dung_bg2[dsto + XY(0, 1)] |= 0x2000; + dung_bg2[dsto + XY(0, 2)] |= 0x2000; + dung_bg2[dsto + XY(0, 3)] |= 0x2000; + dsto += XY(1, 0); + } while (dsto != dsto_org); +} + +void RoomDraw_MakeDoorHighPriority_East(uint16 dsto) { // 81b05c + uint16 *d = &dung_bg2[dsto]; + do { + d[XY(0, 0)] |= 0x2000; + d[XY(0, 1)] |= 0x2000; + d[XY(0, 2)] |= 0x2000; + d[XY(0, 3)] |= 0x2000; + d += XY(1, 0), dsto += 1; + } while (dsto & 0x1f); +} + +void RoomDraw_MarkDungeonToggleDoor(uint16 dsto) { // 81b092 + dung_toggle_palace_pos[dung_num_toggle_palace >> 1] = dsto; + dung_num_toggle_palace += 2; +} + +void RoomDraw_MarkLayerToggleDoor(uint16 dsto) { // 81b09f + dung_toggle_floor_pos[dung_num_toggle_floor >> 1] = dsto; + dung_num_toggle_floor += 2; +} + +void RoomDraw_GetObjectSize_1to16() { // 81b0ac + dung_draw_width_indicator = (dung_draw_width_indicator << 2 | dung_draw_height_indicator) + 1; + dung_draw_height_indicator = 0; +} + +void Object_SizeAtoAplus15(uint8 a) { // 81b0af + dung_draw_width_indicator = (dung_draw_width_indicator << 2 | dung_draw_height_indicator) + a; + dung_draw_height_indicator = 0; +} + +void RoomDraw_GetObjectSize_1to15or26() { // 81b0be + uint16 x = dung_draw_width_indicator << 2 | dung_draw_height_indicator; + dung_draw_width_indicator = x ? x : 26; +} + +void RoomDraw_GetObjectSize_1to15or32() { // 81b0cc + uint16 x = dung_draw_width_indicator << 2 | dung_draw_height_indicator; + dung_draw_width_indicator = x ? x : 32; +} + +// returns 0x100 on inverse carry +int RoomDraw_FlagDoorsAndGetFinalType(uint8 direction, uint8 door_type, uint16 dsto) { // 81b0da + int slot = dung_cur_door_idx >> 1; + dung_door_direction[slot] = direction; + dung_door_tilemap_address[slot] = dsto * 2; + door_type_and_slot[slot] = slot << 8 | door_type; + + uint8 door_type_remapped = door_type; + + if ((slot & 7) < 4 && (dung_door_opened_incl_adjacent & kUpperBitmasks[slot & 7])) { + if ((door_type == kDoorType_ShuttersTwoWay || door_type == kDoorType_Shutter) && dung_flag_trapdoors_down) + goto dont_mark_opened; + door_type_remapped = kDoorTypeRemap[door_type >> 1]; + + if (door_type != kDoorType_ShuttersTwoWay && door_type != kDoorType_Shutter && + door_type >= kDoorType_InvisibleDoor && door_type != kDoorType_RegularDoor33 && door_type != kDoorType_WarpRoomDoor) + dung_door_opened |= kUpperBitmasks[slot]; + } +dont_mark_opened: + dung_cur_door_idx = slot * 2 + 2; + + if (door_type_remapped == kDoorType_Slashable || door_type_remapped == kDoorType_WaterfallTunnel) + return 0x100 | door_type_remapped; + + if (door_type != kDoorType_InvisibleDoor) + return door_type_remapped; + + invisible_door_dir_and_index_x2 = (slot << 8 | direction) * 2; + // if (direction * 2 == link_direction_facing || ((direction * 2) ^ 2) == link_direction_facing) + // return door_type_remapped; + dung_door_opened_incl_adjacent |= kUpperBitmasks[slot]; + return kDoorType_Regular; +} + +void RoomDraw_MakeDoorPartsHighPriority_Y(uint16 dsto) { // 81b1a4 + uint16 *d = &dung_bg2[dsto]; + for (int i = 0; i < 7; i++) { + d[XY(0, 0)] |= 0x2000; + d[XY(1, 0)] |= 0x2000; + d[XY(2, 0)] |= 0x2000; + d[XY(3, 0)] |= 0x2000; + d += XY(0, 1); + } +} + +void RoomDraw_MakeDoorPartsHighPriority_X(uint16 dsto) { // 81b1e7 + uint16 *d = &dung_bg2[dsto]; + for (int i = 0; i < 5; i++) { + d[XY(0, 0)] |= 0x2000; + d[XY(0, 1)] |= 0x2000; + d[XY(0, 2)] |= 0x2000; + d[XY(0, 3)] |= 0x2000; + d += XY(1, 0); + } +} + +void RoomDraw_Downwards4x2VariableSpacing(int increment, const uint16 *src, uint16 *dst) { // 81b220 + do { + dst[XY(0, 0)] = src[0]; + dst[XY(1, 0)] = src[1]; + dst[XY(2, 0)] = src[2]; + dst[XY(3, 0)] = src[3]; + dst[XY(0, 1)] = src[4]; + dst[XY(1, 1)] = src[5]; + dst[XY(2, 1)] = src[6]; + dst[XY(3, 1)] = src[7]; + dst += increment; + } while (--dung_draw_width_indicator); +} + +uint16 *RoomDraw_DrawObject2x2and1(const uint16 *src, uint16 *dst) { // 81b279 + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst[XY(0, 3)] = src[3]; + dst[XY(0, 4)] = src[4]; + return dst; +} + +uint16 *RoomDraw_RightwardShelfEnd(const uint16 *src, uint16 *dst) { // 81b2e1 + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + dst[XY(0, 3)] = src[3]; + return dst; +} + +uint16 *RoomDraw_RightwardBarSegment(const uint16 *src, uint16 *dst) { // 81b2f6 + dst[XY(0, 0)] = src[0]; + dst[XY(0, 1)] = src[1]; + dst[XY(0, 2)] = src[2]; + return dst; +} + +void DrawBigGraySegment(uint16 a, const uint16 *src, uint16 *dst, uint16 dsto) { // 81b33a + int i = dung_misc_objs_index >> 1; + dung_replacement_tile_state[i] = a; + dung_misc_objs_index += 2; + dung_object_pos_in_objdata[i] = dung_load_ptr_offs; + dung_object_tilemap_pos[i] = dsto * 2 | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x2000); + replacement_tilemap_UL[i] = dst[XY(0, 0)]; + replacement_tilemap_LL[i] = dst[XY(0, 1)]; + replacement_tilemap_UR[i] = dst[XY(1, 0)]; + replacement_tilemap_LR[i] = dst[XY(1, 1)]; + RoomDraw_Rightwards2x2(src, dst); +} + +void RoomDraw_SinglePot(const uint16 *src, uint16 *dst, uint16 dsto) { // 81b395 + int i = dung_misc_objs_index >> 1; + dung_misc_objs_index += 2; + dung_replacement_tile_state[i] = 0x1111; + dung_object_pos_in_objdata[i] = dung_load_ptr_offs; + dung_object_tilemap_pos[i] = (dsto * 2) | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x2000); + replacement_tilemap_UL[i] = 0x0d0e; + replacement_tilemap_LL[i] = 0x0d1e; + replacement_tilemap_UR[i] = 0x4d0e; + replacement_tilemap_LR[i] = 0x4d1e; + if (savegame_is_darkworld) + src = SrcPtr(0xe92); + RoomDraw_Rightwards2x2(src, dst); +} + +void RoomDraw_BombableFloor(const uint16 *src, uint16 *dst, uint16 dsto) { // 81b3e1 + if (dungeon_room_index == 101 && (dung_savegame_state_bits & 0x1000)) { + dung_draw_width_indicator = 0; + dung_draw_height_indicator = 0; + Object_Hole(SrcPtr(0x5aa), dst); + return; + } + + src = SrcPtr(0x220); + const uint16 *src_below = SrcPtr(0x5ba); + + Object_BombableFloorHelper(0x3030, src, src_below, dst, dsto); + Object_BombableFloorHelper(0x3131, src + 4, src_below + 4, dst + XY(2, 0), dsto + XY(2, 0)); + Object_BombableFloorHelper(0x3232, src + 8, src_below + 8, dst + XY(0, 2), dsto + XY(0, 2)); + Object_BombableFloorHelper(0x3333, src + 12, src_below + 12, dst + XY(2, 2), dsto + XY(2, 2)); +} + +void RoomDraw_HammerPegSingle(const uint16 *src, uint16 *dst, uint16 dsto) { // 81b493 + int i = dung_misc_objs_index >> 1; + dung_misc_objs_index += 2; + dung_replacement_tile_state[i] = 0x4040; + dung_object_pos_in_objdata[i] = dung_load_ptr_offs; + dung_object_tilemap_pos[i] = (dsto * 2) | (dung_line_ptrs_row0 != 0x4000 ? 0 : 0x2000); + replacement_tilemap_UL[i] = 0x19d8; + replacement_tilemap_LL[i] = 0x19d9; + replacement_tilemap_UR[i] = 0x59d8; + replacement_tilemap_LR[i] = 0x59d9; + RoomDraw_Rightwards2x2(src, dst); +} + +void DrawObjects_PushableBlock(uint16 dsto_x2, uint16 slot) { // 81b4d6 + int x = dung_misc_objs_index >> 1; + dung_misc_objs_index += 2; + dung_replacement_tile_state[x] = 0; + dung_object_pos_in_objdata[x] = slot; + dung_object_tilemap_pos[x] = dsto_x2; + uint16 *dst = DstoPtr((dsto_x2 >> 1) & 0x1fff); + replacement_tilemap_UL[x] = dst[XY(0, 0)]; + replacement_tilemap_LL[x] = dst[XY(0, 1)]; + replacement_tilemap_UR[x] = dst[XY(1, 0)]; + replacement_tilemap_LR[x] = dst[XY(1, 1)]; + RoomDraw_Rightwards2x2(SrcPtr(0xe52), dst); +} + +void DrawObjects_LightableTorch(uint16 dsto_x2, uint16 slot) { // 81b509 + int x = dung_index_of_torches >> 1; + dung_index_of_torches += 2; + dung_object_tilemap_pos[x] = dsto_x2; + dung_object_pos_in_objdata[x] = slot; + uint16 src_img = 0xec2; + uint16 *dst = DstoPtr((dsto_x2 >> 1) & 0x1fff); + if (dsto_x2 & 0x8000) { + src_img = 0xeca; + if (dung_num_lit_torches < 3) + dung_num_lit_torches++; + } + RoomDraw_Rightwards2x2(SrcPtr(src_img), dst); +} + +void Dungeon_LoadHeader() { // 81b564 + dung_flag_statechange_waterpuzzle = 0; + dung_flag_somaria_block_switch = 0; + dung_flag_movable_block_was_pushed = 0; + + static const int16 kAdjustment[] = { 256, -256 }; + + if (submodule_index == 0) { + dung_loade_bgoffs_h_copy = BG2HOFS_copy2 & ~0x1FF; + dung_loade_bgoffs_v_copy = BG2VOFS_copy2 & ~0x1FF; + } else if (submodule_index == 21 || submodule_index < 18 && submodule_index >= 6) { + dung_loade_bgoffs_h_copy = (BG2HOFS_copy2 + 0x20) & ~0x1FF; + dung_loade_bgoffs_v_copy = (BG2VOFS_copy2 + 0x20) & ~0x1FF; + } else { + if (((link_direction & 0xf) >> 1) < 2) { + dung_loade_bgoffs_h_copy = (BG2HOFS_copy2 + kAdjustment[(link_direction & 0xf) >> 1]) & ~0x1FF; + dung_loade_bgoffs_v_copy = (BG2VOFS_copy2 + 0x20) & ~0x1FF; + } else { + dung_loade_bgoffs_h_copy = (BG2HOFS_copy2 + 0x20) & ~0x1FF; + dung_loade_bgoffs_v_copy = (BG2VOFS_copy2 + kAdjustment[(link_direction & 0xf) >> 3]) & ~0x1FF; + } + } + + const uint8 *hdr_ptr = GetRoomHeaderPtr(dungeon_room_index); + + dung_bg2_properties_backup = dung_hdr_bg2_properties; + dung_hdr_bg2_properties = hdr_ptr[0] >> 5; + dung_hdr_collision = (hdr_ptr[0] >> 2) & 7; + dung_want_lights_out_copy = dung_want_lights_out; + dung_want_lights_out = hdr_ptr[0] & 1; + const DungPalInfo *dpi = &kDungPalinfos[hdr_ptr[1]]; + dung_hdr_palette_1 = dpi->pal0; + overworld_palette_sp0 = dpi->pal1; + sprite_aux1_palette = dpi->pal2; + sprite_aux2_palette = dpi->pal3; + aux_tile_theme_index = hdr_ptr[2]; + sprite_graphics_index = hdr_ptr[3] + 0x40; + dung_hdr_collision_2 = hdr_ptr[4]; + dung_hdr_tag[0] = hdr_ptr[5]; + dung_hdr_tag[1] = hdr_ptr[6]; + dung_hdr_hole_teleporter_plane = hdr_ptr[7] & 3; + dung_hdr_staircase_plane[0] = (hdr_ptr[7] >> 2) & 3; + dung_hdr_staircase_plane[1] = (hdr_ptr[7] >> 4) & 3; + dung_hdr_staircase_plane[2] = (hdr_ptr[7] >> 6) & 3; + dung_hdr_staircase_plane[3] = hdr_ptr[8] & 3; + dung_hdr_travel_destinations[0] = hdr_ptr[9]; + dung_hdr_travel_destinations[1] = hdr_ptr[10]; + dung_hdr_travel_destinations[2] = hdr_ptr[11]; + dung_hdr_travel_destinations[3] = hdr_ptr[12]; + dung_hdr_travel_destinations[4] = hdr_ptr[13]; + dung_flag_trapdoors_down = 1; + dung_overlay_to_load = 0; + dung_index_x3 = dungeon_room_index * 3; + + uint16 x = save_dung_info[dungeon_room_index]; + dung_door_opened = x & 0xf000; + dung_door_opened_incl_adjacent = dung_door_opened | 0xf00; + dung_savegame_state_bits = (x & 0xff0) << 4; + dung_quadrants_visited = x & 0xf; + + const uint16 *dp = GetRoomDoorInfo(dungeon_room_index); + int i = 0; + for (; dp[i] != 0xffff; i++) + dung_door_tilemap_address[i] = dp[i]; + dung_door_tilemap_address[i] = 0; + + if (((dungeon_room_index - 1) & 0xf) != 0xf) + Dungeon_CheckAdjacentRoomsForOpenDoors(18, dungeon_room_index - 1); + if (((dungeon_room_index + 1) & 0xf) != 0) + Dungeon_CheckAdjacentRoomsForOpenDoors(12, dungeon_room_index + 1); + if (dungeon_room_index - 16 >= 0) + Dungeon_CheckAdjacentRoomsForOpenDoors(6, dungeon_room_index - 16); + if (dungeon_room_index + 16 < 0x140) + Dungeon_CheckAdjacentRoomsForOpenDoors(0, dungeon_room_index + 16); +} + +void Dungeon_CheckAdjacentRoomsForOpenDoors(int idx, int room) { // 81b759 + static const uint16 kLookup[] = { + 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, + 0x61, 0x71, 0x81, 0x91, 0xa1, 0xb1, + 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, + 0x63, 0x73, 0x83, 0x93, 0xa3, 0xb3, + }; + static const uint16 kLookup2[] = { + 0x61, 0x71, 0x81, 0x91, 0xa1, 0xb1, + 0x0, 0x10, 0x20, 0x30, 0x40, 0x50, + 0x63, 0x73, 0x83, 0x93, 0xa3, 0xb3, + 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, + }; + Dungeon_LoadAdjacentRoomDoors(room); + int i, j; + uint16 a; + for (i = 0; i != 8 && (a = adjacent_doors[i]) != 0xffff; i++) { + a &= 0xff; + j = idx; + if (a == kLookup[j] || a == kLookup[++j] || a == kLookup[++j] || a == kLookup[++j] || a == kLookup[++j] || a == kLookup[++j]) { + uint8 rev = kLookup2[j]; + for (j = 0; j != 8; j++) { + if ((uint8)dung_door_tilemap_address[j] == rev) { + uint8 k = dung_door_tilemap_address[j] >> 8; + if (k == 0x30) + break; + if (k == 0x44 || k == 0x18) { + // trapdoor + if (room != dungeon_room_index_prev) + break; + dung_flag_trapdoors_down = 0; + } else { + // not trapdoor + if (!(adjacent_doors_flags & kUpperBitmasks[i])) + break; + } + dung_door_opened_incl_adjacent |= kUpperBitmasks[j]; + break; + } + } + } + } +} + +void Dungeon_LoadAdjacentRoomDoors(int room) { // 81b7ef + const uint16 *dp = GetRoomDoorInfo(room); + adjacent_doors_flags = (save_dung_info[room] & 0xf000) | 0xf00; + for (int i = 0; ; i++) { + uint16 a = dp[i]; + adjacent_doors[i] = a; + if (a == 0xffff) + break; + if ((a & 0xff00) == 0x4000 || (a & 0xff00) < 0x200) + adjacent_doors_flags |= kUpperBitmasks[i]; + } +} + +void Dungeon_LoadAttribute_Selectable() { // 81b8b4 + switch (overworld_map_state) { + case 0: // Dungeon_LoadBasicAttribute + overworld_map_state = 1; + dung_draw_width_indicator = dung_draw_height_indicator = 0; + case 1: + Dungeon_LoadBasicAttribute_full(0x40); + break; + case 2: + Dungeon_LoadObjectAttribute(); + break; + case 3: + Dungeon_LoadDoorAttribute(); + break; + case 4: + overworld_map_state = 5; + if (orange_blue_barrier_state) + Dungeon_FlipCrystalPegAttribute(); + break; + case 5: + break; + default: + assert(0); + } +} + +void Dungeon_LoadAttributeTable() { // 81b8bf + dung_draw_width_indicator = dung_draw_height_indicator = 0; + Dungeon_LoadBasicAttribute_full(0x1000); + Dungeon_LoadObjectAttribute(); + Dungeon_LoadDoorAttribute(); + if (orange_blue_barrier_state) + Dungeon_FlipCrystalPegAttribute(); + overworld_map_state = 0; +} + +void Dungeon_LoadBasicAttribute_full(uint16 loops) { // 81b8f3 + do { + int i = dung_draw_width_indicator / 2; + uint8 a0 = attributes_for_tile[dung_bg2[i] & 0x3ff]; + if (a0 >= 0x10 && a0 < 0x1c) + a0 |= (dung_bg2[i] >> 14); // vflip/hflip + uint8 a1 = attributes_for_tile[dung_bg2[i + 1] & 0x3ff]; + if (a1 >= 0x10 && a1 < 0x1c) + a1 |= (dung_bg2[i + 1] >> 14); // vflip/hflip + int j = dung_draw_height_indicator; + dung_bg2_attr_table[j] = a0; + dung_bg2_attr_table[j + 1] = a1; + dung_draw_height_indicator = j + 2; + dung_draw_width_indicator += 4; + } while (--loops); + if (dung_draw_height_indicator == 0x2000) + overworld_map_state++; +} + +void Dungeon_LoadObjectAttribute() { // 81b967 + for (int i = 0; i != dung_num_star_shaped_switches; i += 2) { + int j = star_shaped_switches_tile[i >> 1]; + WriteAttr2(j + XY(0, 0), 0x3b3b); + WriteAttr2(j + XY(0, 1), 0x3b3b); + } + + int i = 0, t = 0x3030; + for (; i != dung_num_inter_room_upnorth_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 2), 0); + WriteAttr2(j + XY(1, 0), 0x2626); + WriteAttr2(j + XY(1, 1), t); + } + for (; i != dung_num_wall_upnorth_spiral_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0x5e5e); + WriteAttr2(j + XY(1, 2), 0x5e5e); + WriteAttr2(j + XY(1, 3), 0x5e5e); + WriteAttr2(j + XY(1, 1), t); + } + for (; i != dung_num_wall_upnorth_spiral_stairs_2; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0x5f5f); + WriteAttr2(j + XY(1, 2), 0x5f5f); + WriteAttr2(j + XY(1, 3), 0x5f5f); + WriteAttr2(j + XY(1, 1), t); + } + for (; i != dung_num_inter_room_upnorth_straight_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0x3838); + WriteAttr2(j + XY(1, 2), 0); + WriteAttr2(j + XY(1, 3), 0); + WriteAttr2(j + XY(1, 1), t); + } + for (; i != dung_num_inter_room_upsouth_straight_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0); + WriteAttr2(j + XY(1, 1), 0); + WriteAttr2(j + XY(1, 2), t); + WriteAttr2(j + XY(1, 3), 0x3939); + } + t = (t & 0x707) | 0x3434; + for (; i != dung_num_inter_room_southdown_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 2), t); + WriteAttr2(j + XY(1, 3), 0x2626); + } + for (; i != dung_num_wall_downnorth_spiral_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0x5e5e); + WriteAttr2(j + XY(1, 1), t); + WriteAttr2(j + XY(1, 2), 0x5e5e); + WriteAttr2(j + XY(1, 3), 0x5e5e); + } + for (; i != dung_num_wall_downnorth_spiral_stairs_2; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0x5f5f); + WriteAttr2(j + XY(1, 1), t); + WriteAttr2(j + XY(1, 2), 0x5f5f); + WriteAttr2(j + XY(1, 3), 0x5f5f); + } + for (; i != dung_num_inter_room_downnorth_straight_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0x3838); + WriteAttr2(j + XY(1, 1), t); + WriteAttr2(j + XY(1, 2), 0); + WriteAttr2(j + XY(1, 3), 0); + } + for (; i != dung_num_inter_room_downsouth_straight_stairs; i += 2, t += 0x101) { + int j = dung_inter_starcases[i >> 1]; + WriteAttr2(j + XY(1, 0), 0); + WriteAttr2(j + XY(1, 1), 0); + WriteAttr2(j + XY(1, 2), t); + WriteAttr2(j + XY(1, 3), 0x3939); + } + + i = 0; + int type = 0, iend = dung_num_inroom_upnorth_stairs; + uint16 attr = 0x1f1f; + if (iend == 0) { + type = 1, attr = 0x1e1e; + iend = dung_num_inroom_southdown_stairs; + if (iend == 0) { + type = 2, attr = 0x1d1d; + iend = dung_num_interpseudo_upnorth_stairs; + if (iend == 0) + goto skip3; + } + } + kind_of_in_room_staircase = type; + for (; i != iend; i += 2) { + int j = dung_stairs_table_1[i >> 1]; + WriteAttr2(j + XY(0, 0), 0x02); + WriteAttr1(j + XY(0, 3), 0x02); + WriteAttr2(j + XY(2, 0), 0x0200); + WriteAttr1(j + XY(2, 3), 0x0200); + WriteAttr2(j + XY(0, 1), 0x01); + WriteAttr1(j + XY(0, 2), 0x01); + WriteAttr2(j + XY(2, 1), 0x0100); // todo: use 8-bit write? + WriteAttr1(j + XY(2, 2), 0x0100); + WriteAttr2(j + XY(1, 1), attr); + WriteAttr1(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + WriteAttr1(j + XY(1, 2), attr); + } +skip3: + if (i != dung_some_stairs_unk4) { + kind_of_in_room_staircase = 2; + for (; i != dung_some_stairs_unk4; i += 2) { + int j = dung_stairs_table_1[i >> 1]; + WriteAttr2(j + XY(0, 0), 0xa03); + WriteAttr1(j + XY(0, 0), 0xa03); + WriteAttr2(j + XY(2, 0), 0x30a); + WriteAttr1(j + XY(2, 0), 0x30a); + WriteAttr2(j + XY(0, 1), 0x803); + WriteAttr2(j + XY(2, 1), 0x308); + } + } + i = 0; + if (i != dung_num_inroom_upnorth_stairs_water) { + kind_of_in_room_staircase = 2; + for (; i != dung_num_inroom_upnorth_stairs_water; i += 2) { + int j = dung_stairs_table_1[i >> 1]; + WriteAttr2(j + XY(0, 0), 0x003); + WriteAttr2(j + XY(2, 0), 0x300); + WriteAttr1(j + XY(0, 0), 0xa03); + WriteAttr1(j + XY(2, 0), 0x30a); + WriteAttr2(j + XY(0, 1), 0x808); + WriteAttr2(j + XY(2, 1), 0x808); + } + } + if (i != dung_num_activated_water_ladders) { + kind_of_in_room_staircase = 2; + for (; i != dung_num_activated_water_ladders; i += 2) { + int j = dung_stairs_table_1[i >> 1]; + WriteAttr2(j + XY(0, 0), 0x003); + WriteAttr2(j + XY(2, 0), 0x300); + WriteAttr1(j + XY(0, 0), 0xa03); + WriteAttr1(j + XY(2, 0), 0x30a); + } + } + + for (i = 0, t = 0x7070; i != dung_misc_objs_index; i += 2, t += 0x101) { + uint16 k = dung_replacement_tile_state[i >> 1]; + if ((k & 0xf0) != 0x30) { + int j = (dung_object_tilemap_pos[i >> 1] & 0x3fff) >> 1; + WriteAttr2(j + XY(0, 0), t); + WriteAttr2(j + XY(0, 1), t); + } + } + + if (i != dung_index_of_torches) { + for (t = 0xc0c0; i != dung_index_of_torches; i += 2, t = (t & 0xefef) + 0x101) { + int j = (dung_object_tilemap_pos[i >> 1] & 0x3fff) >> 1; + WriteAttr2(j + XY(0, 0), t); + WriteAttr2(j + XY(0, 1), t); + } + dung_index_of_torches = 0; + } + + t = 0x5858, i = 0; + if (dung_num_chests_x2) { + if (dung_hdr_tag[0] == 0x27 || dung_hdr_tag[0] == 0x3c || dung_hdr_tag[0] == 0x3e || dung_hdr_tag[0] >= 0x29 && dung_hdr_tag[0] < 0x33) + goto no_big_key_locks; + if (dung_hdr_tag[1] == 0x27 || dung_hdr_tag[1] == 0x3c || dung_hdr_tag[1] == 0x3e || dung_hdr_tag[1] >= 0x29 && dung_hdr_tag[1] < 0x33) + goto no_big_key_locks; + + for (; i != dung_num_chests_x2; i += 2, t += 0x101) { + int k = dung_chest_locations[i >> 1]; + if (k != 0) { + int j = (k & 0x7fff) >> 1; + WriteAttr2(j + XY(0, 0), t); + WriteAttr2(j + XY(0, 1), t); + if (k & 0x8000) { + dung_chest_locations[i >> 1] = k & 0x7fff; + WriteAttr2(j + XY(2, 1), t); + WriteAttr2(j + XY(0, 2), t); + WriteAttr2(j + XY(2, 2), t); + } + } + } + } + for (; i != dung_num_bigkey_locks_x2; i += 2, t += 0x101) { + int k = dung_chest_locations[i >> 1]; + dung_chest_locations[i >> 1] = k | 0x8000; + int j = (k & 0x7fff) >> 1; + WriteAttr2(j + XY(0, 0), t); + WriteAttr2(j + XY(0, 1), t); + } +no_big_key_locks: + + i = 0; + type = 0, iend = dung_num_stairs_1; + attr = 0x3f3f; + if (iend == 0) { + type = 1, attr = 0x3e3e; + iend = dung_num_stairs_2; + if (iend == 0) { + type = 2, attr = 0x3d3d; + iend = dung_num_stairs_wet; + if (iend == 0) + goto skip7; + } + } + kind_of_in_room_staircase = type; + for (i = 0; i != iend; i += 2) { + int j = dung_stairs_table_2[i >> 1]; + WriteAttr1(j + XY(0, 0), 0x02); + WriteAttr2(j + XY(0, 3), 0x02); + WriteAttr1(j + XY(0, 1), 0x01); + WriteAttr2(j + XY(0, 2), 0x01); + WriteAttr1(j + XY(2, 0), 0x0200); + WriteAttr2(j + XY(2, 3), 0x0200); + WriteAttr1(j + XY(2, 1), 0x0100); // todo: use 8-bit write? + WriteAttr2(j + XY(2, 2), 0x0100); + WriteAttr1(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 1), attr); + WriteAttr1(j + XY(1, 2), attr); + WriteAttr2(j + XY(1, 2), attr); + } +skip7: + + if (dung_num_inroom_upsouth_stairs_water) { + kind_of_in_room_staircase = 2; + for (i = 0; i != dung_num_inroom_upsouth_stairs_water; i += 2) { + int j = dung_stairs_table_2[i >> 1]; + WriteAttr1(j + XY(0, 3), 0xa03); + WriteAttr1(j + XY(2, 3), 0x30a); + WriteAttr2(j + XY(0, 3), 0x003); + WriteAttr2(j + XY(2, 3), 0x300); + WriteAttr2(j + XY(0, 2), 0x808); + WriteAttr2(j + XY(2, 2), 0x808); + } + } + overworld_map_state += 1; +} + +void Dungeon_LoadDoorAttribute() { // 81be17 + for (int i = 0; i != 16; i++) { + if (dung_door_tilemap_address[i]) + Dungeon_LoadSingleDoorAttribute(i); + } + Dungeon_LoadSingleDoorTileAttribute(); + ChangeDoorToSwitch(); + overworld_map_state += 1; +} + +void Dungeon_LoadSingleDoorAttribute(int k) { // 81be35 + assert(k >= 0 && k < 16); + uint8 t = door_type_and_slot[k] & 0xfe, dir; + uint16 attr; + int i, j; + + if (t == kDoorType_Regular || t == kDoorType_EntranceDoor || t == kDoorType_ExitToOw || t == kDoorType_EntranceLarge || t == kDoorType_EntranceCave) + goto alpha; + + if (t == kDoorType_EntranceLarge2 || t == kDoorType_EntranceCave2 || t == kDoorType_4 || t == kDoorType_Regular2 || t == kDoorType_WaterfallTunnel) + goto beta; + + if (t == kDoorType_LgExplosion) + return; + + if (t >= kDoorType_RegularDoor33) { + if (t == kDoorType_RegularDoor33 || t == kDoorType_WarpRoomDoor) + goto beta; + if (dung_door_opened_incl_adjacent & kUpperBitmasks[k]) + goto beta; + + j = dung_door_tilemap_address[k] >> 1; + attr = (0xf0 + k) * 0x101; + WriteAttr2(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + return; + + } + + i = (t == kDoorType_ShuttersTwoWay || t == kDoorType_Shutter) ? k : k & 7; + if (!(dung_door_opened_incl_adjacent & kUpperBitmasks[i])) { + j = dung_door_tilemap_address[k] >> 1; + attr = (0xf0 + k) * 0x101; + WriteAttr2(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + return; + } + +alpha: + if (t >= kDoorType_StairMaskLocked0 && t <= kDoorType_StairMaskLocked3) + return; + attr = kTileAttrsByDoor[t >> 1]; + dir = dung_door_direction[k] & 3; + if (dir == 0) { + uint16 a = dung_door_tilemap_address[k]; + if (a == dung_exit_door_addresses[0] || a == dung_exit_door_addresses[1] || a == dung_exit_door_addresses[2] || a == dung_exit_door_addresses[3]) + attr = 0x8e8e; + j = (a >> 1) & ~0x7c0; + WriteAttr2(j + XY(1, 0), attr); + WriteAttr2(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + WriteAttr2(j + XY(1, 3), attr); + WriteAttr2(j + XY(1, 4), attr); + WriteAttr2(j + XY(1, 5), attr); + WriteAttr2(j + XY(1, 6), attr); + WriteAttr2(j + XY(1, 7), 0); + } else if (dir == 1) { + uint16 a = dung_door_tilemap_address[k]; + if (t == kDoorType_EntranceLarge || t == kDoorType_EntranceCave || + a == dung_exit_door_addresses[0] || a == dung_exit_door_addresses[1] || a == dung_exit_door_addresses[2] || a == dung_exit_door_addresses[3]) + attr = 0x8e8e; + j = a >> 1; + WriteAttr2(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + WriteAttr2(j + XY(1, 3), attr); + WriteAttr2(j + XY(1, 4), attr); + WriteAttr2(j + XY(1, 5), attr); + } else if (dir == 2) { + j = (dung_door_tilemap_address[k] >> 1) & ~0x1f; + WriteAttr2(j + XY(0, 1), attr + 0x101); + WriteAttr2(j + XY(2, 1), attr + 0x101); + WriteAttr2(j + XY(0, 2), attr + 0x101); + WriteAttr2(j + XY(2, 2), attr + 0x101); + WriteAttr2(j + XY(4, 1), (attr + 0x101) & 0xff); + WriteAttr2(j + XY(4, 2), (attr + 0x101) & 0xff); + } else { + j = (dung_door_tilemap_address[k] >> 1); + WriteAttr2(j + XY(2, 1), attr + 0x101); + WriteAttr2(j + XY(4, 1), attr + 0x101); + WriteAttr2(j + XY(2, 2), attr + 0x101); + WriteAttr2(j + XY(4, 2), attr + 0x101); + WriteAttr2(j + XY(0, 1), (attr + 0x101) & 0xff00); + WriteAttr2(j + XY(0, 2), (attr + 0x101) & 0xff00); + } + return; + +beta: + attr = kTileAttrsByDoor[t >> 1]; + dir = dung_door_direction[k] & 3; + if (dir == 0) { + j = (dung_door_tilemap_address[k] >> 1) & ~0x7c0; + WriteAttr2(j + XY(1, 0), attr); + WriteAttr2(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + WriteAttr2(j + XY(1, 3), attr); + WriteAttr2(j + XY(1, 4), attr); + WriteAttr2(j + XY(1, 5), attr); + WriteAttr2(j + XY(1, 6), attr); + WriteAttr2(j + XY(1, 7), attr); + WriteAttr2(j + XY(1, 8), attr); + WriteAttr2(j + XY(1, 9), attr); + } else if (dir == 1) { + uint16 a = dung_door_tilemap_address[k] & 0x1fff; + if (t == kDoorType_EntranceLarge2 || t == kDoorType_EntranceCave2 || t == kDoorType_4 || + a == dung_exit_door_addresses[0] || a == dung_exit_door_addresses[1] || a == dung_exit_door_addresses[2] || a == dung_exit_door_addresses[3]) + attr = 0x8e8e; + j = dung_door_tilemap_address[k] >> 1; + WriteAttr2(j + XY(1, 1), attr); + WriteAttr2(j + XY(1, 2), attr); + WriteAttr2(j + XY(1, 3), attr); + WriteAttr2(j + XY(1, 4), attr); + WriteAttr2(j + XY(1, 5), attr); + WriteAttr2(j + XY(1, 6), attr); + WriteAttr2(j + XY(1, 7), attr); + WriteAttr2(j + XY(1, 8), attr); + } else if (dir == 2) { + j = (dung_door_tilemap_address[k] >> 1) & ~0x1f; + WriteAttr2(j + XY(0, 1), attr + 0x101); + WriteAttr2(j + XY(2, 1), attr + 0x101); + WriteAttr2(j + XY(4, 1), attr + 0x101); + WriteAttr2(j + XY(6, 1), attr + 0x101); + WriteAttr2(j + XY(0, 2), attr + 0x101); + WriteAttr2(j + XY(2, 2), attr + 0x101); + WriteAttr2(j + XY(4, 2), attr + 0x101); + WriteAttr2(j + XY(6, 2), attr + 0x101); + } else { + j = ((dung_door_tilemap_address[k] >> 1) + 1); + WriteAttr2(j + XY(0, 1), attr + 0x101); + WriteAttr2(j + XY(2, 1), attr + 0x101); + WriteAttr2(j + XY(4, 1), attr + 0x101); + WriteAttr2(j + XY(6, 1), attr + 0x101); + WriteAttr2(j + XY(0, 2), attr + 0x101); + WriteAttr2(j + XY(2, 2), attr + 0x101); + WriteAttr2(j + XY(4, 2), attr + 0x101); + WriteAttr2(j + XY(6, 2), attr + 0x101); + } +} + +void Door_LoadBlastWallAttr(int k) { // 81bfc1 + int j = dung_door_tilemap_address[k] >> 1; + if (!(dung_door_direction[k] & 2)) { + for (int n = 12; n; n--) { + WriteAttr2(j + XY(0, 0), 0x102); + for (int i = 2; i < 20; i += 2) + WriteAttr2(j + XY(i, 0), 0x0); + WriteAttr2(j + XY(20, 0), 0x201); + j += XY(0, 1); + } + } else { + for (int n = 5; n; n--) { + WriteAttr2(j + XY(0, 0), 0x101); + WriteAttr2(j + XY(0, 21), 0x101); + WriteAttr2(j + XY(0, 1), 0x202); + WriteAttr2(j + XY(0, 20), 0x202); + for (int i = 2; i < 20; i++) + WriteAttr2(j + XY(0, i), 0x0); + j += XY(2, 0); + } + } +} + +void ChangeDoorToSwitch() { // 81c1ba + assert(dung_unk5 == 0); +} + +void Dungeon_FlipCrystalPegAttribute() { // 81c22a + for (int i = 0xfff; i >= 0; i--) { + if ((dung_bg2_attr_table[i] & ~1) == 0x66) + dung_bg2_attr_table[i] ^= 1; + if ((dung_bg1_attr_table[i] & ~1) == 0x66) + dung_bg1_attr_table[i] ^= 1; + } +} + +void Dungeon_HandleRoomTags() { // 81c2fd + if (!flag_skip_call_tag_routines) { + Dungeon_DetectStaircase(); + g_ram[14] = 0; + kDungTagroutines[dung_hdr_tag[0]](0); + g_ram[14] = 1; + kDungTagroutines[dung_hdr_tag[1]](1); + } + flag_skip_call_tag_routines = 0; +} + +void Dung_TagRoutine_0x00(int k) { // 81c328 +} + +void Dungeon_DetectStaircase() { // 81c329 + int k = link_direction & 12; + if (!k) + return; + + static const int8 kBuggyLookup[] = { 7, 24, 8, 8, 0, 0, -1, 17 }; + int pos = ((link_y_coord + kBuggyLookup[k >> 1]) & 0x1f8) << 3; + pos |= (link_x_coord & 0x1f8) >> 3; + pos |= (link_is_on_lower_level ? 0x1000 : 0); + + uint8 at = dung_bg2_attr_table[pos + (k == 4 ? 0x80 : 0)]; + if (!(at == 0x26 || at == 0x38 || at == 0x39 || at == 0x5e || at == 0x5f)) + return; + + uint8 attr2 = dung_bg2_attr_table[pos + XY(0, 1)]; + if ((attr2 & 0xf8) != 0x30) + return; + + if (link_state_bits & 0x80) { + link_y_coord = link_y_coord_prev; + return; + } + + which_staircase_index = attr2; + which_staircase_index_PADDING = pos >> 8; // residual + dungeon_room_index_prev = dungeon_room_index; + Dungeon_FlagRoomData_Quadrants(); + + if (at == 0x38 || at == 0x39) { + staircase_var1 = 0x20; + if (at == 0x38) + Dungeon_StartInterRoomTrans_Up(); + else + Dungeon_StartInterRoomTrans_Down(); + } + + int j = (which_staircase_index & 3); + BYTE(dungeon_room_index) = dung_hdr_travel_destinations[j + 1]; + cur_staircase_plane = dung_hdr_staircase_plane[j]; + byte_7E0492 = (link_is_on_lower_level || link_is_on_lower_level_mirror) ? 2 : 0; + subsubmodule_index = 0; + bitmask_of_dragstate = 0; + link_delay_timer_spin_attack = 0; + button_mask_b_y = 0; + button_b_frames = 0; + link_cant_change_direction &= ~1; + if (at == 0x26) { + submodule_index = 6; + sound_effect_1 = (cur_staircase_plane < 0x34 ? 22 : 24); // wtf? + } else if (at == 0x38 || at == 0x39) { + submodule_index = (at == 0x38) ? 18 : 19; + link_timer_push_get_tired = 7; + } else { + UsedForStraightInterRoomStaircase(); + submodule_index = 14; + } +} + +void RoomTag_NorthWestTrigger(int k) { // 81c432 + if (!(link_x_coord & 0x100) && !(link_y_coord & 0x100)) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x2A(int k) { // 81c438 + if ((link_x_coord & 0x100) && !(link_y_coord & 0x100)) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x2B(int k) { // 81c43e + if (!(link_x_coord & 0x100) && (link_y_coord & 0x100)) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x2C(int k) { // 81c444 + if ((link_x_coord & 0x100) && (link_y_coord & 0x100)) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x2D(int k) { // 81c44a + if (!(link_x_coord & 0x100)) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x2E(int k) { // 81c450 + if (link_x_coord & 0x100) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x2F(int k) { // 81c456 + if (!(link_y_coord & 0x100)) + RoomTag_QuadrantTrigger(k); +} + +void Dung_TagRoutine_0x30(int k) { // 81c45c + if (link_y_coord & 0x100) + RoomTag_QuadrantTrigger(k); +} + +void RoomTag_QuadrantTrigger(int k) { // 81c461 + uint8 tag = dung_hdr_tag[k]; + if (tag >= 0xb) { + if (tag >= 0x29) { + if (Sprite_CheckIfScreenIsClear()) + RoomTag_OperateChestReveal(k); + } else { + uint8 a = (dung_flag_movable_block_was_pushed ^ 1); + if (a != BYTE(dung_flag_trapdoors_down)) { + BYTE(dung_flag_trapdoors_down) = a; + sound_effect_2 = 37; + submodule_index = 5; + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + } + } + } else { + if (Sprite_CheckIfScreenIsClear()) + Dung_TagRoutine_TrapdoorsUp(); + } +} + +void Dung_TagRoutine_TrapdoorsUp() { // 81c49e + if (dung_flag_trapdoors_down) { + dung_flag_trapdoors_down = 0; + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + sound_effect_2 = 0x1b; + submodule_index = 5; + } +} + +void RoomTag_RoomTrigger(int k) { // 81c4bf + if (dung_hdr_tag[k] == 10) { + if (Sprite_CheckIfRoomIsClear()) + Dung_TagRoutine_TrapdoorsUp(); + } else { + if (Sprite_CheckIfRoomIsClear()) + RoomTag_OperateChestReveal(k); + } +} + +void RoomTag_RekillableBoss(int k) { // 81c4db + if (Sprite_CheckIfRoomIsClear()) { + flag_block_link_menu = 0; + dung_hdr_tag[1] = 0; + } +} + +void RoomTag_RoomTrigger_BlockDoor(int k) { // 81c4e7 + if (dung_flag_statechange_waterpuzzle && dung_flag_trapdoors_down) { + dung_flag_trapdoors_down = 0; + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + submodule_index = 5; + } +} + +// Used for bosses +void RoomTag_PrizeTriggerDoorDoor(int k) { // 81c508 + int t = savegame_is_darkworld ? link_has_crystals : link_which_pendants; + if (t & kDungeonCrystalPendantBit[BYTE(cur_palace_index_x2) >> 1]) { + dung_flag_trapdoors_down = 0; + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + submodule_index = 5; + dung_hdr_tag[k] = 0; + } +} + +void RoomTag_SwitchTrigger_HoldDoor(int k) { // 81c541 + uint16 i = -2, v; + uint8 tmp; + for (;;) { + i += 2; + if (i == dung_index_of_torches_start) + break; + if (dung_replacement_tile_state[i >> 1] == 5) { + v = related_to_trapdoors_somehow; + if (v != 0xffff) + goto shortcut; + break; + } + } + v = !dung_flag_somaria_block_switch && !dung_flag_statechange_waterpuzzle && !RoomTag_CheckForPressedSwitch(&tmp); +shortcut: + if (v != dung_flag_trapdoors_down) { + dung_flag_trapdoors_down = v; + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + if (v == 0) + sound_effect_2 = 0x25; + submodule_index = 5; + } +} + +void RoomTag_SwitchTrigger_ToggleDoor(int k) { // 81c599 + uint8 attr; + if (!dung_door_switch_triggered) { + if (RoomTag_MaybeCheckShutters(&attr)) { + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + sound_effect_2 = 0x25; + PushPressurePlate(attr); + dung_flag_trapdoors_down ^= 1; + dung_door_switch_triggered = 1; + } + } else { + if (!RoomTag_MaybeCheckShutters(&attr)) + dung_door_switch_triggered = 0; + } +} + +void PushPressurePlate(uint8 attr) { // 81c5cf + submodule_index = 5; + if (attr == 0x23 || !word_7E04B6) + return; + saved_module_for_menu = submodule_index; + submodule_index = 23; + subsubmodule_index = 32; + link_y_coord += 2; + if ((WORD(dung_bg2_attr_table[word_7E04B6]) & 0xfe00) != 0x2400) + word_7E04B6++; + Dungeon_UpdateTileMapWithCommonTile((word_7E04B6 & 0x3f) << 3, (word_7E04B6 >> 3) & 0x1f8, 0x10); +} + +void RoomTag_TorchPuzzleDoor(int k) { // 81c629 + int j = 0; + for (int i = 0; i < 16; i++) + if (dung_object_tilemap_pos[i] & 0x8000) + j++; + int down = (j < 4); + if (down != dung_flag_trapdoors_down) { + dung_flag_trapdoors_down = down; + dung_cur_door_pos = 0; + door_animation_step_indicator = 0; + sound_effect_2 = 0x1b; + submodule_index = 5; + } +} + +void RoomTag_Switch_ExplodingWall(int k) { // 81c67a + uint8 yv; + if (!RoomTag_MaybeCheckShutters(&yv)) + return; + + Dung_TagRoutine_BlastWallStuff(k); +} + +void RoomTag_PullSwitchExplodingWall(int k) { // 81c685 + if (!dung_flag_statechange_waterpuzzle) + return; + Dung_TagRoutine_BlastWallStuff(k); +} + +void Dung_TagRoutine_BlastWallStuff(int k) { // 81c68c + static const uint8 kBlastWall_Tab0[5] = { 4, 6, 0, 0, 2 }; + static const uint16 kBlastWall_Tab1[5] = { 0, 0xa, 0, 0, 0x280 }; + + dung_hdr_tag[k] = 0; + + int j = -1; + do { + j++; + } while ((door_type_and_slot[j] & ~1) != 0x30); + dung_unk_blast_walls_3 = j * 2; + + int i = ((link_y_coord >> 8 & 1) + 1) * 2; + if (dung_door_direction[j] & 2) + i = (link_x_coord >> 8 & 1); + + messaging_buf[0x1c / 2] = kBlastWall_Tab0[i]; + j = dung_door_tilemap_address[j] + kBlastWall_Tab1[i]; + + messaging_buf[0x1a / 2] = (j & 0x7e) * 4 + dung_loade_bgoffs_h_copy; + messaging_buf[0x18 / 2] = ((j & 0x1f80) >> 4) + dung_loade_bgoffs_v_copy; + sound_effect_2 = 27; + BYTE(dung_unk_blast_walls_2) = 1; + AncillaAdd_BlastWall(); +} + +// Used for bosses +void RoomTag_GetHeartForPrize(int k) { // 81c709 + static const uint8 kBossFinishedFallingItem[13] = { 0, 0, 1, 2, 0, 6, 6, 6, 6, 6, 3, 6, 6 }; + if (!(dung_savegame_state_bits & 0x8000)) + return; + int t = savegame_is_darkworld ? link_has_crystals : link_which_pendants; + if (!(t & kDungeonCrystalPendantBit[BYTE(cur_palace_index_x2) >> 1])) { + byte_7E04C2 = 128; + Ancilla_SpawnFallingPrize(kBossFinishedFallingItem[BYTE(cur_palace_index_x2) >> 1]); + } + dung_hdr_tag[k] = 0; +} + +void RoomTag_Agahnim(int k) { // 81c74e + if (!(save_ow_event_info[0x5b] & 0x20) && dung_savegame_state_bits & 0x8000) { + Palette_RevertTranslucencySwap(); + dung_hdr_tag[0] = 0; + PrepareDungeonExitFromBossFight(); + } +} + +void RoomTag_GanonDoor(int tagidx) { // 81c767 + for (int k = 15; k >= 0; k--) { + if (sprite_state[k] == 4 || !(sprite_flags4[k] & 64) && sprite_state[k]) + return; + } + if (link_player_handler_state != kPlayerState_FallingIntoHole) { + flag_is_link_immobilized = 26; + submodule_index = 26; + subsubmodule_index = 0; + dung_hdr_tag[0] = 0; + link_force_hold_sword_up = 1; + button_mask_b_y = 0; + button_b_frames = 0; + R16 = 0x364; + } +} + +void RoomTag_KillRoomBlock(int k) { // 81c7a2 + if (link_x_coord & 0x100 && link_y_coord & 0x100) { + if (Sprite_CheckIfScreenIsClear()) { + sound_effect_2 = 0x1b; + dung_hdr_tag[k] = 0; + } + } +} + +void RoomTag_PushBlockForChest(int k) { // 81c7c2 + if (!nmi_load_bg_from_vram && dung_flag_movable_block_was_pushed) + RoomTag_OperateChestReveal(k); +} + +void RoomTag_TriggerChest(int k) { // 81c7cc + uint8 attr; + if (!countdown_for_blink && RoomTag_MaybeCheckShutters(&attr)) + RoomTag_OperateChestReveal(k); +} + +void RoomTag_OperateChestReveal(int k) { // 81c7d8 + dung_hdr_tag[k] = 0; + vram_upload_offset = 0; + WORD(overworld_map_state) = 0; + uint16 attr = 0x5858; + do { + int pos = dung_chest_locations[WORD(overworld_map_state) >> 1] >> 1 & 0x1fff; + + WORD(dung_bg2_attr_table[pos + XY(0, 0)]) = attr; + WORD(dung_bg2_attr_table[pos + XY(0, 1)]) = attr; + attr += 0x101; + + const uint16 *src = SrcPtr(0x149c); + dung_bg2[pos + XY(0, 0)] = src[0]; + dung_bg2[pos + XY(0, 1)] = src[1]; + dung_bg2[pos + XY(1, 0)] = src[2]; + dung_bg2[pos + XY(1, 1)] = src[3]; + + uint16 yy = WORD(overworld_map_state); + + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + dst[0] = RoomTag_BuildChestStripes(XY(0, 0) * 2, yy); + dst[3] = RoomTag_BuildChestStripes(XY(0, 1) * 2, yy); + dst[6] = RoomTag_BuildChestStripes(XY(1, 0) * 2, yy); + dst[9] = RoomTag_BuildChestStripes(XY(1, 1) * 2, yy); + + dst[2] = src[0]; + dst[5] = src[1]; + dst[8] = src[2]; + dst[11] = src[3]; + + dst[1] = 0x100; + dst[4] = 0x100; + dst[7] = 0x100; + dst[10] = 0x100; + + dst[12] = 0xffff; + + vram_upload_offset += 24; + WORD(overworld_map_state) += 2; + } while (WORD(overworld_map_state) != dung_num_chests_x2); + WORD(overworld_map_state) = 0; + sound_effect_2 = 26; + nmi_load_bg_from_vram = 1; +} + +void RoomTag_TorchPuzzleChest(int k) { // 81c8ae + int j = 0; + for (int i = 0; i < 16; i++) + if (dung_object_tilemap_pos[i] & 0x8000) + j++; + if (j >= 4) + RoomTag_OperateChestReveal(k); +} + +void RoomTag_MovingWall_East(int k) { // 81c8d4 + static const int16 kMovingWall_Tab1[8] = { -63, -127, -191, -255, -71, -135, -199, -263 }; + + if (!dung_floor_move_flags) { + RoomTag_MovingWallTorchesCheck(k); + dung_floor_x_vel = 0; + } else { + flag_unk1 = 1; + RoomTag_MovingWallShakeItUp(k); + dung_floor_x_vel = MovingWall_MoveALittle(); + } + dung_floor_x_offs -= dung_floor_x_vel; + BG1HOFS_copy2 = BG2HOFS_copy2 + dung_floor_x_offs; + + if (dung_floor_x_vel) { + if (dung_floor_x_offs < (uint16)kMovingWall_Tab1[moving_wall_var2 >> 1] && + dung_floor_x_offs < (uint16)kMovingWall_Tab1[RoomTag_AdvanceGiganticWall(k) >> 1]) { + sound_effect_2 = 0x1b; + sound_effect_ambient = 5; + dung_hdr_tag[k] = 0; + flag_is_link_immobilized = 0; + flag_unk1 = 0; + bg1_x_offset = bg1_y_offset = 0; + } + nmi_subroutine_index = 5; + nmi_load_target_addr = (moving_wall_var1 - ((-dung_floor_x_offs & 0x1f8) >> 3)) & 0x141f; + } +} + +void RoomTag_MovingWallShakeItUp(int k) { // 81c969 + int i = frame_counter & 1; + bg1_x_offset = i ? -1 : 1; + bg1_y_offset = -bg1_x_offset; + if (!dung_hdr_tag[k]) + bg1_x_offset = bg1_y_offset = 0; +} + +void RoomTag_MovingWall_West(int k) { // 81c98b + static const uint16 kMovingWall_Tab0[8] = { 0x42, 0x82, 0xc2, 0x102, 0x4a, 0x8a, 0xca, 0x10a }; + + if (!dung_floor_move_flags) { + RoomTag_MovingWallTorchesCheck(k); + dung_floor_x_vel = 0; + } else { + flag_unk1 = 1; + RoomTag_MovingWallShakeItUp(k); + dung_floor_x_vel = MovingWall_MoveALittle(); + } + dung_floor_x_offs += dung_floor_x_vel; + BG1HOFS_copy2 = BG2HOFS_copy2 + dung_floor_x_offs; + if (dung_floor_x_vel) { + if (dung_floor_x_offs >= kMovingWall_Tab0[moving_wall_var2 >> 1] && + dung_floor_x_offs >= kMovingWall_Tab0[RoomTag_AdvanceGiganticWall(k) >> 1]) { + sound_effect_2 = 0x1b; + sound_effect_ambient = 5; + dung_hdr_tag[k] = 0; + flag_is_link_immobilized = 0; + flag_unk1 = 0; + bg1_x_offset = bg1_y_offset = 0; + } + nmi_subroutine_index = 5; + nmi_load_target_addr = moving_wall_var1 + ((dung_floor_x_offs & 0x1f8) >> 3); + if (nmi_load_target_addr & 0x1020) + nmi_load_target_addr = (nmi_load_target_addr & 0x1020) ^ 0x420; + } +} + +void RoomTag_MovingWallTorchesCheck(int k) { // 81ca17 + if (!dung_flag_statechange_waterpuzzle) { + int count = 0; + for (int i = 0; i < 16; i++) + count += (dung_object_tilemap_pos[i] & 0x8000) != 0; + if (count < 4) + return; + } + dung_floor_move_flags++; + WORD(dung_flag_statechange_waterpuzzle) = 0; + dung_savegame_state_bits |= 0x1000 >> k; + sound_effect_ambient = 7; + flag_is_link_immobilized = 1; + flag_unk1 = 1; +} + +int MovingWall_MoveALittle() { // 81ca66 + int t = dung_some_subpixel[1] + 0x22; + dung_some_subpixel[1] = t; + return t >> 8; +} + +int RoomTag_AdvanceGiganticWall(int k) { // 81ca75 + int i = moving_wall_var2; + if (dung_hdr_tag[k] < 0x20) { + dung_hdr_collision = 0; + TM_copy = 0x16; + i += 8; + } + return i; +} + +void RoomTag_WaterOff(int k) { // 81ca94 + if (dung_flag_statechange_waterpuzzle) { + W12SEL_copy = 3; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + TMW_copy = 22; + TSW_copy = 1; + turn_on_off_water_ctr = 1; + AdjustWaterHDMAWindow(); + submodule_index = 11; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + mosaic_target_level = 31; + flag_update_cgram_in_nmi++; + dung_hdr_tag[1] = 0; + dung_savegame_state_bits |= 0x800; + dung_flag_statechange_waterpuzzle = 0; + int dsto = ((water_hdma_var1 & 0x1ff) - 0x10) << 3 | ((water_hdma_var0 & 0x1ff) - 0x10) >> 3; + DrawWaterThing(&dung_bg2[dsto], SrcPtr(0x1438)); + Dungeon_PrepOverlayDma_nextPrep(0, dsto * 2); + sound_effect_2 = 0x1b; + sound_effect_1 = 0x2e; + nmi_copy_packets_flag = 1; + } +} + +void RoomTag_WaterOn(int k) { // 81cb1a + if (dung_flag_statechange_waterpuzzle) { + sound_effect_2 = 0x1b; + sound_effect_1 = 0x2f; + submodule_index = 12; + subsubmodule_index = 0; + BYTE(dung_floor_y_offs) = 1; + dung_hdr_tag[1] = 0; + dung_savegame_state_bits |= 0x800; + dung_flag_statechange_waterpuzzle = 0; + dung_cur_quadrant_upload = 0; + } +} + +void RoomTag_WaterGate(int k) { // 81cb49 + if (dung_savegame_state_bits & 0x800 || !dung_flag_statechange_waterpuzzle) + return; + submodule_index = 13; + subsubmodule_index = 0; + dung_hdr_tag[1] = 0; + dung_savegame_state_bits |= 0x800; + dung_flag_statechange_waterpuzzle = 0; + BYTE(water_hdma_var2) = 0; + BYTE(spotlight_var4) = 0; + W12SEL_copy = 3; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + TMW_copy = 0x16; + TSW_copy = 1; + CGWSEL_copy = 2; + CGADSUB_copy = 0x62; + save_ow_event_info[0x3b] |= 32; + save_ow_event_info[0x7b] |= 32; + save_dung_info[0x28] |= 0x100; + RoomTag_OperateWaterFlooring(); + water_hdma_var0 = ((watergate_pos & 0x7e) << 2) + (dung_draw_width_indicator * 16 + dung_loade_bgoffs_h_copy + 40); + word_7E0678 = spotlight_y_upper = (watergate_pos & 0x1f80) >> 4; + water_hdma_var1 = word_7E0678 + dung_loade_bgoffs_v_copy; + water_hdma_var3 = 0; + sound_effect_2 = 0x1b; + sound_effect_1 = 0x2f; +} + +void Dung_TagRoutine_0x1B(int k) { // 81cbff + // empty +} + +void RoomTag_Holes0(int k) { // 81cc00 + Dung_TagRoutine_Func2(1); +} + +void Dung_TagRoutine_0x23(int k) { // 81cc04 + Dung_TagRoutine_Func2(3); +} + +void Dung_TagRoutine_0x34(int k) { // 81cc08 + Dung_TagRoutine_Func2(6); +} + +void Dung_TagRoutine_0x35(int k) { // 81cc0c + Dung_TagRoutine_Func2(8); +} + +void Dung_TagRoutine_0x36(int k) { // 81cc10 + Dung_TagRoutine_Func2(10); +} + +void Dung_TagRoutine_0x37(int k) { // 81cc14 + Dung_TagRoutine_Func2(12); +} + +void Dung_TagRoutine_0x39(int k) { // 81cc18 + Dung_TagRoutine_Func2(14); +} + +void Dung_TagRoutine_0x3A(int k) { // 81cc1c + Dung_TagRoutine_Func2(16); +} + +void Dung_TagRoutine_Func2(uint8 av) { // 81cc1e + uint8 yv; + if (!dung_overlay_to_load) + dung_overlay_to_load = av; + + if (RoomTag_CheckForPressedSwitch(&yv) && (av += yv) != dung_overlay_to_load) { + dung_overlay_to_load = av; + dung_load_ptr_offs = 0; + subsubmodule_index = 0; + sound_effect_2 = 27; + submodule_index = 3; + byte_7E04BC ^= 1; + Dungeon_RestoreStarTileChr(); + } +} + +void RoomTag_ChestHoles0(int k) { // 81cc5b + Dung_TagRoutine_0x22_0x3B(k, 0x0); +} + +void Dung_TagRoutine_0x3B(int k) { // 81cc62 + Dung_TagRoutine_0x22_0x3B(k, 0x12); +} + +void RoomTag_Holes2(int k) { // 81cc89 + uint8 yv; + + if (!RoomTag_CheckForPressedSwitch(&yv)) + return; + + dung_hdr_tag[k] = 0; + dung_overlay_to_load = 5; + dung_load_ptr_offs = 0; + subsubmodule_index = 0; + sound_effect_2 = 0x1b; + submodule_index = 3; +} + +void RoomTag_OperateWaterFlooring() { // 81cc95 + dung_load_ptr_offs = 0; + const uint8 *layoutsrc = kWatergateLayout; + for (;;) { + dung_draw_width_indicator = 0; + dung_draw_height_indicator = 0; + uint16 t = WORD(*layoutsrc); + if (t == 0xffff) + break; + dung_draw_width_indicator = (t & 3) + 1; + dung_draw_height_indicator = (t >> 8 & 3) + 1; + dung_load_ptr_offs += 3, layoutsrc += 3; + const uint16 *src = SrcPtr(0x110); + int dsto2 = (t & 0xfc) >> 2 | (t >> 10) << 6; + do { + int dsto = dsto2; + int n = dung_draw_width_indicator; + do { + int nn = 2; + do { + dung_bg1[dsto + XY(0, 0)] = src[0]; + dung_bg1[dsto + XY(1, 0)] = src[1]; + dung_bg1[dsto + XY(2, 0)] = src[2]; + dung_bg1[dsto + XY(3, 0)] = src[3]; + dung_bg1[dsto + XY(0, 1)] = src[4]; + dung_bg1[dsto + XY(1, 1)] = src[5]; + dung_bg1[dsto + XY(2, 1)] = src[6]; + dung_bg1[dsto + XY(3, 1)] = src[7]; + dsto += XY(0, 2); + } while (--nn); + dsto += XY(4, -4); + } while (--n); + dsto2 += XY(0, 4); + } while (--dung_draw_height_indicator); + } +} + +bool RoomTag_MaybeCheckShutters(uint8 *attr_out) { // 81cd39 + int p, t; + word_7E04B6 = 0; + if (flag_is_link_immobilized || link_auxiliary_state) + return false; + p = RoomTag_GetTilemapCoords(); + t = WORD(dung_bg2_attr_table[p]); + if (t == 0x2323 || t == 0x2424) + goto done; + t = WORD(dung_bg2_attr_table[p += 64]); + if (t == 0x2323 || t == 0x2424) + goto done; + t = WORD(dung_bg2_attr_table[p -= 63]); + if (t == 0x2323 || t == 0x2424) + goto done; + t = WORD(dung_bg2_attr_table[p += 64]); + if (t == 0x2323 || t == 0x2424) + goto done; + return false; +done: + if (t != WORD(dung_bg2_attr_table[p + 64])) + return false; + *attr_out = t; + word_7E04B6 = p; + return true; +} + +int RoomTag_GetTilemapCoords() { // 81cda5 + return ((link_x_coord - 1) & 0x1f8) >> 3 | ((link_y_coord + 14) & 0x1f8) << 3 | (link_is_on_lower_level ? 0x1000 : 0); + +} + +bool RoomTag_CheckForPressedSwitch(uint8 *y_out) { // 81cdcc + int p, t; + word_7E04B6 = 0; + if (flag_is_link_immobilized || link_auxiliary_state) + return false; + p = RoomTag_GetTilemapCoords(); + t = WORD(dung_bg2_attr_table[p]); + if (t == 0x2323 || t == 0x3a3a || t == 0x3b3b) + goto done; + t = WORD(dung_bg2_attr_table[p += 64]); + if (t == 0x2323 || t == 0x3a3a || t == 0x3b3b) + goto done; + t = WORD(dung_bg2_attr_table[p -= 63]); + if (t == 0x2323 || t == 0x3a3a || t == 0x3b3b) + goto done; + t = WORD(dung_bg2_attr_table[p += 64]); + if (t == 0x2323 || t == 0x3a3a || t == 0x3b3b) + goto done; + return false; +done: + if (t != WORD(dung_bg2_attr_table[p + 64])) + return false; + *y_out = (t == 0x3b3b); + word_7E04B6 = p; + return true; +} + +void Dungeon_ProcessTorchesAndDoors() { // 81ce70 + static const int16 kDungLinkOffs1X[] = { 0, 0, -1, 17 }; + static const int16 kDungLinkOffs1Y[] = { 7, 24, 8, 8 }; + static const uint16 kDungLinkOffs1Pos[] = { 0x2, 0x2, 0x80, 0x80 }; + + if ((frame_counter & 3) == 0 && !flag_custom_spell_anim_active) { + for (int i = 0; i != 16; i++) { + if (dung_torch_timers[i] && !--dung_torch_timers[i]) { + byte_7E0333 = 0xc0 + i; + Dungeon_ExtinguishTorch(); + } + } + } + + if (!flag_is_link_immobilized) { + int dir = link_direction_facing >> 1; + int pos = ((link_y_coord + kDungLinkOffs1Y[dir]) & 0x1f8) << 3; + pos |= ((link_x_coord + kDungLinkOffs1X[dir]) & 0x1f8) >> 3; + pos |= (link_is_on_lower_level ? 0x1000 : 0); + + if ((dung_bg2_attr_table[pos] & 0xf0) == 0xf0 || + (dung_bg2_attr_table[pos += kDungLinkOffs1Pos[dir]] & 0xf0) == 0xf0) { + int k = dung_bg2_attr_table[pos] & 0xf; + dung_which_key_x2 = 2 * k; + + if ((dung_door_direction[k] & 3) != dir) + goto not_openable; + + uint8 door_type = door_type_and_slot[k] & 0xfe; + if (door_type == kDoorType_BreakableWall) { + if (link_is_running && link_dash_ctr < 63) { + dung_cur_door_pos = pos; + + int db = AncillaAdd_DoorDebris(); + if (db >= 0) { + door_debris_direction[db] = dung_door_direction[k] & 3; + door_debris_x[db] = dung_loade_bgoffs_h_copy + (dung_door_tilemap_address[k] & 0x7e) * 4; + door_debris_y[db] = dung_loade_bgoffs_v_copy + ((dung_door_tilemap_address[k] & 0x1f80) >> 4); + } + sound_effect_2 = 27; + submodule_index = 9; + Sprite_RepelDash(); + return; + } + } else if (door_type == kDoorType_1E) { + door_animation_step_indicator = 0; + dung_cur_door_pos = pos; + if (link_bigkey & kUpperBitmasks[cur_palace_index_x2 >> 1]) + goto has_key_for_door; + if (!big_key_door_message_triggered) { + big_key_door_message_triggered = 1; + dialogue_message_index = 0x7a; + Main_ShowTextMessage(); + } + } else if (door_type >= kDoorType_SmallKeyDoor && door_type < 0x2c && door_type != 0x2a && link_num_keys != 0) { + link_num_keys -= 1; +has_key_for_door: + door_animation_step_indicator = 0; + dung_cur_door_pos = pos; + submodule_index = 4; + static const uint8 kOpenDoorPanning[] = { 0x0, 0x0, 0x80, 0x40 }; + sound_effect_2 = 20 | kOpenDoorPanning[dung_door_direction[k] & 3]; + return; + } + } else { +not_openable: + big_key_door_message_triggered = 0; + } + } + + if (!(invisible_door_dir_and_index_x2 & 0x80) && !is_standing_in_doorway && (link_x_coord >> 8) == 0xc) { + uint8 dir = invisible_door_dir_and_index_x2; + int j = (invisible_door_dir_and_index_x2 >> 8) >> 1; + uint16 m = dung_door_opened_incl_adjacent; + if (dir != link_direction_facing && (dir ^ 2) == link_direction_facing) + m |= kUpperBitmasks[j]; + else + m &= ~kUpperBitmasks[j]; + if (m != dung_door_opened_incl_adjacent) { + dung_door_opened_incl_adjacent = m; + // 81:D01F + assert(0); + } + } + + if (!(button_mask_b_y & 0x80) || button_b_frames != 4) + return; + + int pos = ((link_y_coord + (int8)player_oam_y_offset) & 0x1f8) << 3; + pos |= ((link_x_coord + (int8)player_oam_x_offset) & 0x1f8) >> 3; + uint8 attr, y; + +#define is_6c_fx(yv,x) (y=yv, ((attr = (dung_bg2_attr_table[x] & 0xfc)) == 0x6c || (attr & 0xf0) == 0xf0)) + + if (!(is_6c_fx(0x41, pos) || is_6c_fx(0x40, pos += 1) || is_6c_fx(1, pos += 63) || is_6c_fx(0, pos += 1))) + return; + + int addr; + + if (attr == 0x6c) { + if (y & 0x40 && (dung_bg2_attr_table[pos -= 64] & 0xfc) != 0x6c) + pos += 64; + if (y & 1 && (dung_bg2_attr_table[pos -= 1] & 0xfc) != 0x6c) + pos += 1; + attr = dung_bg2_attr_table[pos]; + WriteAttr2(pos + XY(0, 0), 0x202); + WriteAttr2(pos + XY(0, 1), 0x202); + static const uint16 kSrcTiles1[] = { 0x7ea, 0x80a, 0x80a, 0x82a }; + addr = (pos - XY(1, 1)) * 2; + RoomDraw_Object_Nx4(4, SrcPtr(kSrcTiles1[attr & 3]), &dung_bg2[addr >> 1]); + } else { + dung_cur_door_pos = pos; + int k = attr & 0xf; + + uint8 door_type = door_type_and_slot[k]; + if (door_type != kDoorType_Slashable) + return; + sound_effect_2 = 27; + addr = dung_door_tilemap_address[k]; + dung_door_opened_incl_adjacent |= kUpperBitmasks[k]; + dung_door_opened |= kUpperBitmasks[k]; + door_open_closed_counter = 0; + dung_cur_door_idx = k * 2; + dung_which_key_x2 = k * 2; + RoomDraw_Object_Nx4(4, SrcPtr(kDoorTypeSrcData[0x56 / 2]), &dung_bg2[addr >> 1]); + Dungeon_LoadToggleDoorAttr_OtherEntry(k); + } + + Dungeon_PrepOverlayDma_nextPrep(0, addr); + sound_effect_1 = 30 | CalculateSfxPan_Arbitrary((addr & 0x7f) * 2); + nmi_copy_packets_flag = 1; +} + +void Bomb_CheckForDestructibles(uint16 x, uint16 y, uint8 r14) { // 81d1f4 + if (main_module_index != 7) { + Overworld_BombTiles32x32(x, y); + return; + } + int k = ((y & 0x1f8) << 3 | (x & 0x1f8) >> 3) - 0x82; + uint8 a; + for (int i = 2; i >= 0; i--) { + a = dung_bg2_attr_table[k]; + if (a == 0x62) { +handle_62: + if (dungeon_room_index == 0x65) + dung_savegame_state_bits |= 0x1000; + Point16U pt; + printf("Wtf is R6\n"); + ThievesAttic_DrawLightenedHole(0, 0, &pt); + sound_effect_2 = 0x1b; + return; + } + if ((a & 0xf0) == 0xf0) { +handle_f0: + int j = a & 0xf; + a = door_type_and_slot[j] & 0xfe; + if (a != kDoorType_BreakableWall && a != 0x2A && a != 0x2E) + return; + dung_cur_door_pos = k; + door_debris_x[r14] = ((dung_door_tilemap_address[j] & 0x7e) << 2) + dung_loade_bgoffs_h_copy; + door_debris_y[r14] = ((dung_door_tilemap_address[j] & 0x1f80) >> 4) + dung_loade_bgoffs_v_copy; + door_debris_direction[r14] = dung_door_direction[j] & 3; + sound_effect_2 = 0x1b; + submodule_index = 9; + return; + } + + a = dung_bg2_attr_table[k += 2]; + if (a == 0x62) goto handle_62; + if ((a & 0xf0) == 0xf0) goto handle_f0; + + a = dung_bg2_attr_table[k += 2]; + if (a == 0x62) goto handle_62; + if ((a & 0xf0) == 0xf0) goto handle_f0; + + k += 0x7c; + } + +} + +int DrawDoorOpening_Step1(int door, int dma_ptr) { // 81d2e8 + dung_cur_door_idx = door * 2; + dung_which_key_x2 = door * 2; + switch (dung_door_direction[door] & 3) { + case 0: return DoorDoorStep1_North(door, dma_ptr); + case 1: return DoorDoorStep1_South(door, dma_ptr); + case 2: return DoorDoorStep1_West(door, dma_ptr); + case 3: return DoorDoorStep1_East(door, dma_ptr); + } + return 0; +} + +void DrawShutterDoorSteps(int door) { // 81d311 + dung_cur_door_idx = door * 2; + dung_which_key_x2 = door * 2; + switch (dung_door_direction[door] & 3) { + case 0: GetDoorDrawDataIndex_North_clean_door_index(door); break; + case 1: GetDoorDrawDataIndex_South_clean_door_index(door); break; + case 2: GetDoorDrawDataIndex_West_clean_door_index(door); break; + case 3: GetDoorDrawDataIndex_East_clean_door_index(door); break; + } +} + +void DrawEyeWatchDoor(int door) { // 81d33a + dung_cur_door_idx = door * 2; + dung_which_key_x2 = door * 2; + switch (dung_door_direction[door] & 3) { + case 0: DrawDoorToTileMap_North(door, door); break; + case 1: DrawDoorToTileMap_South(door, door); break; + case 2: DrawDoorToTileMap_West(door, door); break; + case 3: DrawDoorToTileMap_East(door, door); break; + } +} + +void Door_BlastWallExploding_Draw(int dsto) { // 81d373 + uint16 *dst = &dung_bg2[dsto]; + const uint16 *src = SrcPtr(0x31ea); + ClearExplodingWallFromTileMap_ClearOnePair(dst, src); + dst += 2; + uint16 v = src[24]; + for (int n = dung_unk_blast_walls_2 - 1; n; n--) { + for (int j = 0; j < 12; j++) + dst[XY(0, j)] = v; + dst++; + } + ClearExplodingWallFromTileMap_ClearOnePair(dst, src + 25); +} + +void OperateShutterDoors() { // 81d38f + int anim_dst = 0; + uint8 y = 2; + + if (++door_animation_step_indicator != 4) { + y = dung_flag_trapdoors_down ? 0 : 4; + if (door_animation_step_indicator != 8) + goto getout; + } + door_open_closed_counter = y; + + for (dung_cur_door_pos = 0; dung_cur_door_pos != 0x18; dung_cur_door_pos += 2) { + int j = dung_cur_door_pos >> 1; + uint8 door_type = door_type_and_slot[j] & 0xfe; + if (door_type != kDoorType_Shutter && door_type != kDoorType_ShuttersTwoWay) + continue; + + int mask = kUpperBitmasks[j]; + if (!dung_flag_trapdoors_down) { + if (dung_door_opened_incl_adjacent & mask) + continue; + if (door_animation_step_indicator == 8) { + sound_effect_2 = 21; + dung_door_opened_incl_adjacent ^= mask; + } + } else { + if (!(dung_door_opened_incl_adjacent & mask)) + continue; + if (door_animation_step_indicator == 8) { + sound_effect_2 = 22; + dung_door_opened_incl_adjacent ^= mask; + } + } + DrawShutterDoorSteps(j); + anim_dst = Dungeon_PrepOverlayDma_nextPrep(anim_dst, dung_door_tilemap_address[j]); + if (door_animation_step_indicator == 8) + Dungeon_LoadToggleDoorAttr_OtherEntry(j); + } + dung_cur_door_pos -= 2; + + if (anim_dst != 0) { + nmi_disable_core_updates = nmi_copy_packets_flag = 1; +getout: + if (BYTE(door_animation_step_indicator) != 0x10) + return; + } + submodule_index = 0; + nmi_copy_packets_flag = 0; +} + +void OpenCrackedDoor() { // 81d469 + Dungeon_OpeningLockedDoor_Combined(true); +} + +void Dungeon_LoadToggleDoorAttr_OtherEntry(int door) { // 81d51c + Dungeon_LoadSingleDoorAttribute(door); + Dungeon_LoadSingleDoorTileAttribute(); +} + +void Dungeon_LoadSingleDoorTileAttribute() { // 81d51f + for (int i = 0; i != dung_num_toggle_floor; i += 2) { + int j = dung_toggle_floor_pos[i >> 1]; + if ((dung_bg2_attr_table[j] & 0xf0) == 0x80) { + uint16 attr = *(uint16 *)&dung_bg2_attr_table[j]; + WriteAttr2(j + XY(0, 0), attr | 0x1010); + WriteAttr2(j + XY(0, 1), attr | 0x1010); + } else { + uint16 attr = *(uint16 *)&dung_bg1_attr_table[j]; + WriteAttr1(j + XY(0, 0), attr | 0x1010); + WriteAttr1(j + XY(0, 1), attr | 0x1010); + } + } + for (int i = 0; i != dung_num_toggle_palace; i += 2) { + int j = dung_toggle_palace_pos[i >> 1]; + if ((dung_bg2_attr_table[j] & 0xf0) == 0x80) { + uint16 attr = *(uint16 *)&dung_bg2_attr_table[j]; + WriteAttr2(j + XY(0, 0), attr | 0x2020); + WriteAttr2(j + XY(0, 1), attr | 0x2020); + } else { + uint16 attr = *(uint16 *)&dung_bg1_attr_table[j]; + WriteAttr1(j + XY(0, 0), attr | 0x2020); + WriteAttr1(j + XY(0, 1), attr | 0x2020); + } + } +} + +void DrawCompletelyOpenDoor() { // 81d5aa + uint16 t; + int i; + + for (i = 0, t = 0x3030; i != dung_num_inter_room_upnorth_stairs; i += 2, t += 0x101) {} + + for (; i != dung_num_wall_upnorth_spiral_stairs; i += 2, t += 0x101) { + int pos = dung_inter_starcases[i >> 1]; + WriteAttr2(pos + XY(1, 0), 0x5e5e); + WriteAttr2(pos + XY(1, 1), t); + WriteAttr2(pos + XY(1, 2), 0); + WriteAttr2(pos + XY(1, 3), 0); + } + + for (; i != dung_num_wall_upnorth_spiral_stairs_2; i += 2, t += 0x101) { + int pos = dung_inter_starcases[i >> 1]; + WriteAttr2(pos + XY(1, 0), 0x5f5f); + WriteAttr2(pos + XY(1, 1), t); + WriteAttr2(pos + XY(1, 2), 0); + WriteAttr2(pos + XY(1, 3), 0); + } + + for (; i != dung_num_inter_room_upnorth_straight_stairs; i += 2, t += 0x101) {} + for (; i != dung_num_inter_room_upsouth_straight_stairs; i += 2, t += 0x101) {} + + t = (t & 0x707) | 0x3434; + + for (; i != dung_num_inter_room_southdown_stairs; i += 2, t += 0x101) {} + + for (; i != dung_num_wall_downnorth_spiral_stairs; i += 2, t += 0x101) { + int pos = dung_inter_starcases[i >> 1]; + WriteAttr2(pos + XY(1, 0), 0x5e5e); + WriteAttr2(pos + XY(1, 1), t); + WriteAttr2(pos + XY(1, 2), 0); + WriteAttr2(pos + XY(1, 3), 0); + } + + for (; i != dung_num_wall_downnorth_spiral_stairs_2; i += 2, t += 0x101) { + int pos = dung_inter_starcases[i >> 1]; + WriteAttr2(pos + XY(1, 0), 0x5f5f); + WriteAttr2(pos + XY(1, 1), t); + WriteAttr2(pos + XY(1, 2), 0); + WriteAttr2(pos + XY(1, 3), 0); + } +} + +void Dungeon_ClearAwayExplodingWall() { // 81d6c1 + flag_is_link_immobilized = 6; + flag_unk1 = 6; + if (BYTE(messaging_buf[0]) != 6) + return; + + word_7E045E = 0; + g_ram[12] = 0; + door_animation_step_indicator = 0; + dung_cur_door_idx = dung_unk_blast_walls_3; + int dsto = (dung_door_tilemap_address[dung_unk_blast_walls_3 >> 1] -= 2) >> 1; + + Door_BlastWallExploding_Draw(dsto); + ClearAndStripeExplodingWall(dsto); + + WORD(nmi_disable_core_updates) = 0xffff; + dung_unk_blast_walls_2 += 2; + + if (dung_unk_blast_walls_2 == 21) { + int m = kUpperBitmasks[dung_unk_blast_walls_3 >> 1]; + dung_door_opened_incl_adjacent |= m; + dung_door_opened |= m; + + if (dung_door_direction[dung_unk_blast_walls_3 >> 1] & 2) { + dung_blastwall_flag_x = 1; + quadrant_fullsize_x = 2; + } else { + dung_blastwall_flag_y = 1; + quadrant_fullsize_y = 2; + } + WORD(quadrant_fullsize_x_cached) = WORD(quadrant_fullsize_x); + Door_LoadBlastWallAttr(dung_unk_blast_walls_3 >> 1); + dung_unk_blast_walls_2 = 0; + dung_unk_blast_walls_3 = 0; + Dungeon_FlagRoomData_Quadrants(); + flag_is_link_immobilized = 0; + flag_unk1 = 0; + } + nmi_copy_packets_flag = 3; +} + +uint16 Dungeon_CheckForAndIDLiftableTile() { // 81d748 + uint16 x = (link_x_coord + kDungeon_QueryIfTileLiftable_x[link_direction_facing >> 1]) & 0x1f8; + uint16 y = (link_y_coord + kDungeon_QueryIfTileLiftable_y[link_direction_facing >> 1]) & 0x1f8; + uint16 xy = (y << 3) | (x >> 3) | (link_is_on_lower_level ? 0x1000 : 0x0); + + uint8 attr = dung_bg2_attr_table[xy]; + if ((attr & 0xf0) != 0x70) + return 0xffff; // clc + + uint16 rt = dung_replacement_tile_state[attr & 0xf]; + if (rt == 0) + return 0xffff; + if ((rt & 0xf0f0) == 0x2020) + return 0x55; + return kDungeon_QueryIfTileLiftable_rv[rt & 0xf]; +} + +void Dungeon_PushBlock_Handler() { // 81d81b + while (dung_misc_objs_index != dung_index_of_torches_start) { + int k = dung_misc_objs_index >> 1; + int st = dung_replacement_tile_state[k]; + if (st == 1) { + RoomDraw_16x16Single(k * 2); + dung_object_tilemap_pos[k] += kPushBlockMoveDistances[push_block_direction >> 1]; + dung_replacement_tile_state[k] = 2; + } else if (st == 2) { + PushBlock_Slide(k * 2); + + if (dung_replacement_tile_state[dung_misc_objs_index >> 1] == 3) { + PushBlock_CheckForPit(dung_misc_objs_index); + dung_replacement_tile_state[dung_misc_objs_index >> 1]++; + } + } else if (st == 4) { + PushBlock_HandleFalling(k * 2); + } + + dung_misc_objs_index += 2; + } +} + +void RoomDraw_16x16Single(uint8 index) { // 81d828 + index >>= 1; + uint16 pos = (dung_object_tilemap_pos[index] & 0x3fff) >> 1; + Dungeon_Store2x2(pos, + replacement_tilemap_UL[index], + replacement_tilemap_LL[index], + replacement_tilemap_UR[index], + replacement_tilemap_LR[index], + attributes_for_tile[replacement_tilemap_LR[index] & 0x3ff]); +} + +void PushBlock_CheckForPit(uint8 y) { // 81d8d4 + y >>= 1; + if (!(dung_object_tilemap_pos[y] & 0x4000)) + dung_flag_movable_block_was_pushed ^= 1; + + int p = (dung_object_tilemap_pos[y] & 0x3fff) >> 1; + uint8 attr = dung_bg2_attr_table[p]; + if (attr == 0x20) { // fall into pit + sound_effect_1 = 0x20; + int k = dung_object_pos_in_objdata[y] >> 2; + movable_block_datas[k].room = dung_hdr_travel_destinations[0]; + movable_block_datas[k].tilemap = dung_object_tilemap_pos[y]; + return; + } + + int i = (index_of_changable_dungeon_objs[1] - 1) == y; + index_of_changable_dungeon_objs[i] = 0; + + if (attr == 0x23) { + related_to_trapdoors_somehow = dung_flag_trapdoors_down ^ 1; + dung_replacement_tile_state[y] = 4; + } else { + dung_replacement_tile_state[y] = 0xffff; + } + Dungeon_Store2x2(p, 0x922, 0x932, 0x923, 0x933, 0x27); +} + +uint8 Dungeon_LiftAndReplaceLiftable(Point16U *pt) { // 81d9ec + uint16 x = link_x_coord + kDungeon_QueryIfTileLiftable_x[link_direction_facing >> 1]; + uint16 y = link_y_coord + kDungeon_QueryIfTileLiftable_y[link_direction_facing >> 1]; + pt->x = x; + pt->y = y; + + R16 = y; + R18 = x; + + x &= 0x1f8; + y &= 0x1f8; + uint16 xy = (y << 3) | (x >> 3) | (link_is_on_lower_level ? 0x1000 : 0x0); + + uint8 attr = dung_bg2_attr_table[xy]; + + assert((attr & 0x70) == 0x70); + + attr &= 0xf; + uint16 rt = dung_replacement_tile_state[attr]; + + if ((rt & 0xf0f0) == 0x1010) { + dung_misc_objs_index = attr * 2; + RevealPotItem(xy, dung_object_tilemap_pos[attr]); + RoomDraw_16x16Single(dung_misc_objs_index); + ManipBlock_Something(pt); + return kDungeon_QueryIfTileLiftable_rv[rt & 0xf]; + } else if ((rt & 0xf0f0) == 0x2020) { + return ThievesAttic_DrawLightenedHole(xy, (attr - (rt & 0xf)) * 2, pt); + } else { + return 0; + } + return 0; +} + +uint8 ThievesAttic_DrawLightenedHole(uint16 pos6, uint16 a, Point16U *pt) { // 81da71 + dung_misc_objs_index = a; + RevealPotItem(pos6, dung_object_tilemap_pos[a >> 1]); + RoomDraw_16x16Single(a); + RoomDraw_16x16Single(a + 2); + RoomDraw_16x16Single(a + 4); + RoomDraw_16x16Single(a + 6); + ManipBlock_Something(pt); + return 0x55; +} + +uint8 HandleItemTileAction_Dungeon(uint16 x, uint16 y) { // 81dabb + if (!(link_item_in_hand & 2)) + return 0; + uint16 pos = (y & 0x1f8) * 8 + x + (link_is_on_lower_level ? 0x1000 : 0); + uint16 tile = dung_bg2_attr_table[pos]; + if ((tile & 0xf0) == 0x70) { + uint16 tile2 = dung_replacement_tile_state[tile & 0xf]; + if ((tile2 & 0xf0f0) == 0x4040) { + dung_misc_objs_index = (tile & 0xf) * 2; + RoomDraw_16x16Single(dung_misc_objs_index); + sound_effect_1 = 0x11; + } else if ((tile2 & 0xf0f0) == 0x1010) { + dung_misc_objs_index = (tile & 0xf) * 2; + RevealPotItem(pos, dung_object_tilemap_pos[tile & 0xf]); + RoomDraw_16x16Single(dung_misc_objs_index); + Point16U pt; + ManipBlock_Something(&pt); + BYTE(dung_secrets_unk1) |= 0x80; + Sprite_SpawnImmediatelySmashedTerrain(1, pt.x, pt.y); + AncillaAdd_BushPoof(pt.x, pt.y); // return value wtf? + } + } + return 0; +} + +void ManipBlock_Something(Point16U *pt) { // 81db41 + uint16 pos = dung_object_tilemap_pos[dung_misc_objs_index >> 1]; + pt->x = (link_x_coord & 0xfe00) | ((pos & 0x007e) << 2); + pt->y = (link_y_coord & 0xfe00) | ((pos & 0x1f80) >> 4); +} + +void RevealPotItem(uint16 pos6, uint16 pos4) { // 81e6b2 + BYTE(dung_secrets_unk1) = 0; + + const uint8 *src_ptr = kDungeonSecrets + WORD(kDungeonSecrets[dungeon_room_index * 2]); + + int index = 0; + for (;;) { + uint16 test_pos = *(uint16 *)src_ptr; + if (test_pos == 0xffff) + return; + assert(!(test_pos & 0x8000)); + if (test_pos == pos4) + break; + src_ptr += 3; + index++; + } + + uint8 data = src_ptr[2]; + if (data == 0) + return; + + if (data < 0x80) { + if (data != 8) { + uint16 mask = 1 << index; + uint16 *pr = &pots_revealed_in_room[dungeon_room_index]; + if (*pr & mask) + return; + *pr |= mask; + } + BYTE(dung_secrets_unk1) |= data; + } else if (data != 0x88) { + int j = dung_bg2_attr_table[pos6] & 0xf; + int k = (j - (dung_replacement_tile_state[j] & 0xf)); + dung_misc_objs_index = 2 * k; + sound_effect_2 = 0x1b; + const uint16 *src = SrcPtr(0x5ba); + for (int i = 0; i < 4; i++, k++, src += 4) { + replacement_tilemap_UL[k] = src[0]; + replacement_tilemap_LL[k] = src[1]; + replacement_tilemap_UR[k] = src[2]; + replacement_tilemap_LR[k] = src[3]; + } + } else { + int k = dung_misc_objs_index >> 1; + replacement_tilemap_UL[k] = 0xD0B; + replacement_tilemap_LL[k] = 0xD1B; + replacement_tilemap_UR[k] = 0x4D0B; + replacement_tilemap_LR[k] = 0x4D1B; + } +} + +void Dungeon_UpdateTileMapWithCommonTile(int x, int y, uint8 v) { // 81e7a9 + if (v == 8) + Dungeon_PrepSpriteInducedDma(x + 16, y, v + 2); + Dungeon_PrepSpriteInducedDma(x, y, v); + nmi_load_bg_from_vram = 1; +} + +void Dungeon_PrepSpriteInducedDma(int x, int y, uint8 v) { // 81e7df + static const uint16 kPrepSpriteInducedDma_Srcs[10] = { 0xe0, 0xade, 0x5aa, 0x198, 0x210, 0x218, 0x1f3a, 0xeaa, 0xeb2, 0x140 }; + int pos = ((y + 1) & 0x1f8) << 3 | (x & 0x1f8) >> 3; + const uint16 *src = SrcPtr(kPrepSpriteInducedDma_Srcs[v >> 1]); + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + dst[0] = Dungeon_MapVramAddr(pos + 0); + dst[3] = Dungeon_MapVramAddr(pos + 64); + dst[6] = Dungeon_MapVramAddr(pos + 1); + dst[9] = Dungeon_MapVramAddr(pos + 65); + uint8 attr = attributes_for_tile[src[3] & 0x3ff]; + dung_bg2_attr_table[pos + XY(0, 0)] = attr; + dung_bg2_attr_table[pos + XY(0, 1)] = attr; + dung_bg2_attr_table[pos + XY(1, 0)] = attr; + dung_bg2_attr_table[pos + XY(1, 1)] = attr; + dung_bg2[pos + XY(0, 0)] = dst[2] = src[0]; + dung_bg2[pos + XY(0, 1)] = dst[5] = src[1]; + dung_bg2[pos + XY(1, 0)] = dst[8] = src[2]; + dung_bg2[pos + XY(1, 1)] = dst[11] = src[3]; + dst[1] = 0x100; + dst[4] = 0x100; + dst[7] = 0x100; + dst[10] = 0x100; + dst[12] = 0xffff; + vram_upload_offset += 24; +} + +void Dungeon_DeleteRupeeTile(uint16 x, uint16 y) { // 81e8bd + int pos = (y & 0x1f8) * 8 | (x & 0x1f8) >> 3; + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + dst[2] = 0x190f; + dst[5] = 0x190f; + dung_bg2[pos + XY(0, 0)] = 0x190f; + dung_bg2[pos + XY(0, 1)] = 0x190f; + uint16 attr = attributes_for_tile[0x190f & 0x3ff] * 0x101; + WORD(dung_bg2_attr_table[pos + XY(0, 0)]) = attr; + WORD(dung_bg2_attr_table[pos + XY(0, 1)]) = attr; + dst[0] = Dungeon_MapVramAddr(pos + XY(0, 0)); + dst[3] = Dungeon_MapVramAddr(pos + XY(0, 1)); + dst[1] = 0x100; + dst[4] = 0x100; + dst[6] = 0xffff; + vram_upload_offset += 24; + dung_savegame_state_bits |= 0x1000; + nmi_load_bg_from_vram = 1; +} + +// This doesn't return exactly like the original +// Also returns in scratch_0 +uint8 OpenChestForItem(uint8 tile, int *chest_position) { // 81eb66 + static const uint16 kChestOpenMasks[] = { 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000 }; + if (tile == 0x63) + return OpenMiniGameChest(chest_position); + + int chest_idx = tile - 0x58, chest_idx_org = chest_idx; + + uint16 loc = dung_chest_locations[chest_idx], pos, chest_room; + uint8 data = 0xff; + const uint16 *ptr; + + if (loc >= 0x8000) { + // big key lock + if (!(link_bigkey & kUpperBitmasks[cur_palace_index_x2 >> 1])) { + dialogue_message_index = 0x7a; + Main_ShowTextMessage(); + return 0xff; + } else { + dung_savegame_state_bits |= kChestOpenMasks[chest_idx]; + sound_effect_1 = 0x29; + sound_effect_2 = 0x15; + pos = (loc & 0x7fff) >> 1; + + ptr = SrcPtr(dung_floor_2_filler_tiles); + overworld_tileattr[pos + 0] = ptr[0]; + overworld_tileattr[pos + 64] = ptr[1]; + overworld_tileattr[pos + 1] = ptr[2]; + overworld_tileattr[pos + 65] = ptr[3]; + goto afterStoreCrap; + } + } else { + const uint8 *chest_data; + int i; + chest_data = kDungeonRoomChests; + for (i = 0; i < countof(kDungeonRoomChests); i += 3, chest_data += 3) { + chest_room = *(uint16 *)chest_data; + if ((chest_room & 0x7fff) == dungeon_room_index && --chest_idx < 0) { + data = chest_data[2]; + if (chest_room & 0x8000) { + if (!(link_bigkey & kUpperBitmasks[cur_palace_index_x2 >> 1])) { + dialogue_message_index = 0x7a; + Main_ShowTextMessage(); + return 0xff; + } + dung_savegame_state_bits |= kChestOpenMasks[chest_idx_org]; + OpenBigChest(loc, chest_position); + return data; + } else { + dung_savegame_state_bits |= kChestOpenMasks[chest_idx_org]; + ptr = SrcPtr(0x14A4); + pos = loc >> 1; + + overworld_tileattr[pos + 0] = ptr[0]; + overworld_tileattr[pos + 64] = ptr[1]; + overworld_tileattr[pos + 1] = ptr[2]; + overworld_tileattr[pos + 65] = ptr[3]; + +afterStoreCrap: + uint8 attr = (loc < 0x8000) ? 0x27 : 0x00; + + dung_bg2_attr_table[pos + 0] = attr; + dung_bg2_attr_table[pos + 64] = attr; + dung_bg2_attr_table[pos + 1] = attr; + dung_bg2_attr_table[pos + 65] = attr; + + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + dst[0] = Dungeon_MapVramAddr(pos + 0); + dst[3] = Dungeon_MapVramAddr(pos + 64); + dst[6] = Dungeon_MapVramAddr(pos + 1); + dst[9] = Dungeon_MapVramAddr(pos + 65); + + dst[2] = ptr[0]; + dst[5] = ptr[1]; + dst[8] = ptr[2]; + dst[11] = ptr[3]; + + dst[1] = 0x100; + dst[4] = 0x100; + dst[7] = 0x100; + dst[10] = 0x100; + + dst[12] = 0xffff; + + vram_upload_offset += 24; + nmi_load_bg_from_vram = 1; + Dungeon_FlagRoomData_Quadrants(); + if (sound_effect_2 == 0) + sound_effect_2 = 14; + + *chest_position = loc & 0x7fff; + return data; + } + } + } + return 0xff; + } +} + +void OpenBigChest(uint16 loc, int *chest_position) { // 81ed05 + uint16 pos = loc >> 1; + const uint16 *src = SrcPtr(0x14C4); + + for (int i = 0; i < 4; i++) { + dung_bg2[pos + XY(i, 0)] = src[0]; + dung_bg2[pos + XY(i, 1)] = src[1]; + dung_bg2[pos + XY(i, 2)] = src[2]; + src += 3; + } + + Dungeon_PrepOverlayDma_nextPrep(0, loc); + *chest_position = (loc + 2); + WORD(dung_bg2_attr_table[pos + XY(0, 0)]) = 0x2727; + WORD(dung_bg2_attr_table[pos + XY(2, 0)]) = 0x2727; + WORD(dung_bg2_attr_table[pos + XY(0, 1)]) = 0x2727; + WORD(dung_bg2_attr_table[pos + XY(2, 1)]) = 0x2727; + WORD(dung_bg2_attr_table[pos + XY(0, 2)]) = 0x2727; + WORD(dung_bg2_attr_table[pos + XY(2, 2)]) = 0x2727; + Dungeon_FlagRoomData_Quadrants(); + sound_effect_2 = 14; + nmi_copy_packets_flag = 1; + byte_7E0B9E = 1; +} + +uint8 OpenMiniGameChest(int *chest_position) { // 81edab + int t; + if (minigame_credits == 0) { + dialogue_message_index = 0x163; + Main_ShowTextMessage(); + return 0xff; + } + if (minigame_credits == 255) { + dialogue_message_index = 0x162; + Main_ShowTextMessage(); + return 0xff; + } + minigame_credits--; + + int pos = ((link_y_coord - 4) & 0x1f8) * 8; + pos |= ((link_x_coord + 7) & 0x1f8) >> 3; + + if (WORD(dung_bg2_attr_table[pos]) != 0x6363) { + pos--; + if (WORD(dung_bg2_attr_table[pos]) != 0x6363) + pos -= 2; + } + + *chest_position = pos * 2; + + WORD(dung_bg2_attr_table[pos]) = 0x202; + WORD(dung_bg2_attr_table[pos + 64]) = 0x202; + + pos += XY(0, 2); + + const uint16 *src = SrcPtr(0x14A4); + dung_bg2[pos + XY(0, 0)] = src[0]; + dung_bg2[pos + XY(0, 1)] = src[1]; + dung_bg2[pos + XY(1, 0)] = src[2]; + dung_bg2[pos + XY(1, 1)] = src[3]; + + uint16 yy = 0x14A4; // wtf + + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + dst[0] = RoomTag_BuildChestStripes((pos + 0) * 2, yy); + dst[3] = RoomTag_BuildChestStripes((pos + 64) * 2, yy); + dst[6] = RoomTag_BuildChestStripes((pos + 1) * 2, yy); + dst[9] = RoomTag_BuildChestStripes((pos + 65) * 2, yy); + + dst[2] = src[0]; + dst[5] = src[1]; + dst[8] = src[2]; + dst[11] = src[3]; + + dst[1] = 0x100; + dst[4] = 0x100; + dst[7] = 0x100; + dst[10] = 0x100; + + dst[12] = 0xffff; + + vram_upload_offset += 24; + + uint8 rv; + + uint16 r16 = g_ram[0xc8]; + + t = GetRandomNumber(); + if (BYTE(dungeon_room_index) == 0) { + t = t & 0xf; + rv = kDungeon_RupeeChestMinigamePrizes[t & 0xf]; + + } else if (BYTE(dungeon_room_index) == 0x18) { + t = 0x10 + (t & 0xf); + rv = kDungeon_RupeeChestMinigamePrizes[0x10 + (t & 0xf)]; + } else { + t &= 7; + if (t >= 2 && t == r16) { + t = (t + 1) & 7; + } + if (t == 7) { + if (dung_savegame_state_bits & 0x4000) { + t = 0; + } else { + dung_savegame_state_bits |= 0x4000; + } + } + rv = kDungeon_MinigameChestPrizes1[t]; + } + g_ram[0xc8] = t; + nmi_load_bg_from_vram = 1; + sound_effect_2 = 14; + return rv; +} + +uint16 RoomTag_BuildChestStripes(uint16 pos, uint16 y) { // 81ef0f + pos += dung_chest_locations[y >> 1]; + return swap16(((pos & 0x40) << 4) | ((pos & 0x303f) >> 1) | ((pos & 0xf80) >> 2)); +} + +void Dungeon_SetAttrForActivatedWaterOff() { // 81ef93 + CGWSEL_copy = 2; + CGADSUB_copy = 0x32; + zelda_ppu_write(TS, 0); + TS_copy = 0; + W12SEL_copy = 0; + dung_hdr_collision = 0; + WORD(TMW_copy) = 0; + for (int j = 0; j != dung_num_inroom_upnorth_stairs_water; j += 2) { + int dsto = dung_stairs_table_1[j >> 1]; + WriteAttr2(dsto + XY(1, 1), 0x1d1d); + WriteAttr2(dsto + XY(1, 2), 0x1d1d); + } + for (int j = 0; j != dung_num_inroom_upsouth_stairs_water; j += 2) { + int dsto = dung_stairs_table_2[j >> 1]; + WriteAttr2(dsto + XY(1, 1), 0x1d1d); + WriteAttr2(dsto + XY(1, 2), 0x1d1d); + } + flag_update_cgram_in_nmi++; + subsubmodule_index++; +} + +void Dungeon_FloodSwampWater_PrepTileMap() { // 81f046 + WaterFlood_BuildOneQuadrantForVRAM(); + dung_cur_quadrant_upload += 4; + if (++subsubmodule_index == 6) { + dung_cur_quadrant_upload = 0; + subsubmodule_index = 0; + submodule_index = 0; + } +} + +void Dungeon_AdjustWaterVomit(const uint16 *src, int depth) { // 81f0c9 + int dsto = (word_7E047C >> 1) + XY(0, 2); + uint16 *dst = &dung_bg2[dsto]; + do { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst += XY(0, 1), src += 4; + } while (--depth); + uint16 *vram = vram_upload_data; + for (int i = 0; i < 4; i++) { + uint16 *dst = &dung_bg2[dsto]; + vram[0] = Dungeon_MapVramAddr(dsto); + vram[1] = 0x980; + vram[2] = dst[XY(0, 0)]; + vram[3] = dst[XY(0, 1)]; + vram[4] = dst[XY(0, 2)]; + vram[5] = dst[XY(0, 3)]; + vram[6] = dst[XY(0, 4)]; + vram += 7, dsto++; + } + vram[0] = 0xffff; + nmi_load_bg_from_vram = 1; +} + +void Dungeon_SetAttrForActivatedWater() { // 81f237 + WORD(TMW_copy) = 0; + for (int j = 0; j != dung_num_interpseudo_upnorth_stairs; j += 2) { + int dsto = dung_stairs_table_1[j >> 1]; + WriteAttr2(dsto + 0, 0x003); + WriteAttr2(dsto + 2, 0x300); + WriteAttr1(dsto + 0, 0xa03); + WriteAttr1(dsto + 2, 0x30a); + WriteAttr2(dsto + XY(0, 1), 0x808); + WriteAttr2(dsto + XY(2, 1), 0x808); + WriteAttr1(dsto + XY(0, 1), 0x808); + WriteAttr1(dsto + XY(2, 1), 0x808); + WriteAttr1(dsto + XY(0, 2), 0x808); + WriteAttr1(dsto + XY(2, 2), 0x808); + WriteAttr1(dsto + XY(0, 3), 0x808); + WriteAttr1(dsto + XY(2, 3), 0x808); + } + + for (int j = 0; j != dung_num_stairs_wet; j += 2) { + int dsto = dung_stairs_table_2[j >> 1]; + WriteAttr2(dsto + XY(0, 3), 0x003); + WriteAttr2(dsto + XY(2, 3), 0x300); + WriteAttr1(dsto + XY(0, 3), 0xa03); + WriteAttr1(dsto + XY(2, 3), 0x30a); + WriteAttr2(dsto + XY(0, 2), 0x808); + WriteAttr2(dsto + XY(2, 2), 0x808); + WriteAttr1(dsto + XY(0, 0), 0x808); + WriteAttr1(dsto + XY(2, 0), 0x808); + WriteAttr1(dsto + XY(0, 1), 0x808); + WriteAttr1(dsto + XY(2, 1), 0x808); + WriteAttr1(dsto + XY(0, 2), 0x808); + WriteAttr1(dsto + XY(2, 2), 0x808); + } + submodule_index = 0; + nmi_boolean = 0; // wtf + subsubmodule_index = 0; +} + +void FloodDam_Expand() { // 81f30c + watergate_var1++; + water_hdma_var3 = watergate_var1 >> 1; + uint8 r0 = water_hdma_var3 - 8; + BYTE(spotlight_y_upper) = word_7E0678; + BYTE(spotlight_var4) += 1; + BYTE(water_hdma_var2) = spotlight_var4 + r0; + + if (watergate_var1 & 0xf) + return; + + if (watergate_var1 == 64) + subsubmodule_index++; + + static const uint16 kWatergateSrcs1[] = { 0x12f8, 0x1348, 0x1398, 0x13e8 }; + RoomDraw_Object_Nx4(10, SrcPtr(kWatergateSrcs1[(watergate_var1 >> 4) - 1]), &dung_bg2[watergate_pos >> 1]); + int pos = watergate_pos; + int n = 3; + int dma_ptr = 0; + do { + dma_ptr = Dungeon_PrepOverlayDma_watergate(dma_ptr, pos, 0x881, 4); + pos += 6; + } while (--n); + nmi_copy_packets_flag = 1; +} + +void FloodDam_PrepTiles_init() { // 81f3a7 + dung_cur_quadrant_upload = 0; + overworld_screen_transition = 0; + WaterFlood_BuildOneQuadrantForVRAM(); + dung_cur_quadrant_upload += 4; + subsubmodule_index++; +} + +void Watergate_Main_State1() { // 81f3aa + overworld_screen_transition = 0; + WaterFlood_BuildOneQuadrantForVRAM(); + dung_cur_quadrant_upload += 4; + subsubmodule_index++; +} + +void FloodDam_Fill() { // 81f3bd + BYTE(water_hdma_var2)++; + uint8 t = water_hdma_var2 + spotlight_y_upper; + if (t >= 225) { + dung_cur_quadrant_upload = 0; + submodule_index = 0; + subsubmodule_index = 0; + TMW_copy = 0; + TSW_copy = 0; + IrisSpotlight_ResetTable(); + } +} + +void Ganon_ExtinguishTorch_adjust_translucency() { // 81f496 + Palette_AssertTranslucencySwap(); + byte_7E0333 = 0xc0; + Dungeon_ExtinguishTorch(); +} + +void Ganon_ExtinguishTorch() { // 81f4a1 + byte_7E0333 = 193; + Dungeon_ExtinguishTorch(); +} + +void Dungeon_ExtinguishTorch() { // 81f4a6 + int y = (byte_7E0333 & 0xf) * 2 + dung_index_of_torches_start; + + uint16 r8 = (dung_object_tilemap_pos[y >> 1] &= 0x7fff); + + dung_torch_data[(dung_object_pos_in_objdata[y >> 1] & 0xff) >> 1] = r8; + + r8 &= 0x3fff; + RoomDraw_AdjustTorchLightingChange(r8, 0xec2, r8); + nmi_copy_packets_flag = 1; + + if (dung_want_lights_out && dung_num_lit_torches != 0 && --dung_num_lit_torches < 3) { + if (dung_num_lit_torches == 0) + TS_copy = 1; + overworld_fixed_color_plusminus = kLitTorchesColorPlus[dung_num_lit_torches]; + submodule_index = 10; + subsubmodule_index = 0; + } + + dung_torch_timers[byte_7E0333 & 0xf] = 0; + byte_7E0333 = 0; +} + +void SpiralStairs_MakeNearbyWallsHighPriority_Entering() { // 81f528 + int pos = dung_inter_starcases[which_staircase_index & 3] - 4; + word_7E048C = pos * 2; + uint16 *dst = &dung_bg2[pos]; + for (int i = 0; i < 5; i++) { + dst[XY(0, 0)] |= 0x2000; + dst[XY(0, 1)] |= 0x2000; + dst[XY(0, 2)] |= 0x2000; + dst[XY(0, 3)] |= 0x2000; + dst += 1; + } + int dp = Dungeon_PrepOverlayDma_nextPrep(0, pos * 2); + Dungeon_PrepOverlayDma_nextPrep(dp, pos * 2 + 8); + nmi_copy_packets_flag = 1; +} + +void SpiralStairs_MakeNearbyWallsLowPriority() { // 81f585 + int pos = word_7E048C >> 1; + uint16 *dst = &dung_bg2[pos]; + for (int i = 0; i < 5; i++) { + dst[XY(0, 0)] &= ~0x2000; + dst[XY(0, 1)] &= ~0x2000; + dst[XY(0, 2)] &= ~0x2000; + dst[XY(0, 3)] &= ~0x2000; + dst += 1; + } + int dp = Dungeon_PrepOverlayDma_nextPrep(0, pos * 2); + Dungeon_PrepOverlayDma_nextPrep(dp, pos * 2 + 8); + nmi_copy_packets_flag = 1; +} + +void ClearAndStripeExplodingWall(uint16 dsto) { // 81f811 + static const uint16 kBlastWall_Tab2[16] = { 4, 8, 0xc, 0x10, 0x14, 0x18, 0x1c, 0x20, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700, 0x800 }; + + uint16 r6 = 0x80; + uint16 r14 = 0; + uint16 r10 = dung_unk_blast_walls_2 + 3; + uint16 r2 = 0; + + if (!sign16(r10 - 8)) { + r2 = r10 - 6; + r14 = 1; + r10 = 3; + } + if (!(dung_door_direction[dung_cur_door_idx >> 1] & 2)) + r6++; + + uint16 *uvdata = &uvram.t3.data[0]; + for (;;) { + const uint16 *bg2 = &dung_bg2[dsto]; + do { + uint16 vram_addr = Dungeon_MapVramAddrNoSwap(dsto); + uvdata[0] = vram_addr; + uvdata[1] = r6 | 0xa00; + uvdata[2] = bg2[XY(0, 0)]; + uvdata[3] = bg2[XY(0, 1)]; + uvdata[4] = bg2[XY(0, 2)]; + uvdata[5] = bg2[XY(0, 3)]; + uvdata[6] = bg2[XY(0, 4)]; + uvdata[7] = vram_addr + 0x4a0; + uvdata[8] = r6 | 0xe00; + uvdata[9] = bg2[XY(0, 5)]; + uvdata[10] = bg2[XY(0, 6)]; + uvdata[11] = bg2[XY(0, 7)]; + uvdata[12] = bg2[XY(0, 8)]; + uvdata[13] = bg2[XY(0, 9)]; + uvdata[14] = bg2[XY(0, 10)]; + uvdata[15] = bg2[XY(0, 11)]; + dsto++, bg2++, uvdata += 16; + } while (--r10); + if (!r14) + break; + r14--; + dsto += kBlastWall_Tab2[(r2 >> 1) + ((r6 & 1) ? 0 : 8) - 1] >> 1; + r10 = 3; + } + uvdata[0] = 0xffff; +} + +void Dungeon_DrawRoomOverlay(const uint8 *src) { // 81f967 + for (;;) { + dung_draw_width_indicator = 0; + dung_draw_height_indicator = 0; + uint16 a = WORD(*src); + if (a == 0xffff) + break; + uint16 *p = &dung_bg2[(src[0] >> 2) | (src[1] >> 2) << 6]; + uint8 type = src[2]; + if (type == 0xa4) { + p[XY(0, 1)] = p[XY(1, 1)] = p[XY(2, 1)] = p[XY(3, 1)] = + p[XY(0, 2)] = p[XY(1, 2)] = p[XY(2, 2)] = p[XY(3, 2)] = SrcPtr(0x5aa)[0]; + p[XY(0, 0)] = p[XY(1, 0)] = p[XY(2, 0)] = p[XY(3, 0)] = SrcPtr(0x63c)[1]; + p[XY(0, 3)] = p[XY(1, 3)] = p[XY(2, 3)] = p[XY(3, 3)] = SrcPtr(0x642)[1]; + } else { + const uint16 *sp = SrcPtr(dung_floor_2_filler_tiles); + p[XY(0, 0)] = p[XY(2, 0)] = p[XY(0, 2)] = p[XY(2, 2)] = sp[0]; + p[XY(1, 0)] = p[XY(3, 0)] = p[XY(1, 2)] = p[XY(3, 2)] = sp[1]; + p[XY(0, 1)] = p[XY(2, 1)] = p[XY(0, 3)] = p[XY(2, 3)] = sp[4]; + p[XY(1, 1)] = p[XY(3, 1)] = p[XY(1, 3)] = p[XY(3, 3)] = sp[5]; + } + src += 3; + } +} + +void GetDoorDrawDataIndex_North_clean_door_index(int door) { // 81fa4a + GetDoorDrawDataIndex_North(door, door); +} + +int DoorDoorStep1_North(int door, int dma_ptr) { // 81fa54 + int pos = dung_door_tilemap_address[door]; + if ((pos & 0x1fff) >= kDoorPositionToTilemapOffs_Up[6]) { + pos -= 0x500; + if ((door_type_and_slot[door] & 0xfe) >= 0x42) + pos -= 0x300; + GetDoorDrawDataIndex_South(door ^ 8, door & 7); + dma_ptr = Dungeon_PrepOverlayDma_nextPrep(dma_ptr, pos); + Dungeon_LoadSingleDoorAttribute(door ^ 8); + } + GetDoorDrawDataIndex_North(door, door & 7); + return dma_ptr; +} + +void GetDoorDrawDataIndex_North(int door, int r4_door) { // 81faa0 + uint8 door_type = door_type_and_slot[door] & 0xfe; + int x = door_open_closed_counter; + if (x == 0 || x == 4) { + DrawDoorToTileMap_North(door, r4_door); + return; + } + x += (door_type == kDoorType_StairMaskLocked2 || door_type == kDoorType_StairMaskLocked3 || door_type >= 0x42) ? 4 : 0; + x += (door_type == kDoorType_ShuttersTwoWay || door_type == kDoorType_Shutter) ? 2 : 0; + // assert(x < 8); + Object_Draw_DoorUp_4x3(kDoorAnimUpSrc[x >> 1], door); +} + +void DrawDoorToTileMap_North(int door, int r4_door) { // 81fad7 + Object_Draw_DoorUp_4x3(kDoorTypeSrcData[GetDoorGraphicsIndex(door, r4_door) >> 1], door); +} + +void Object_Draw_DoorUp_4x3(uint16 src, int door) { // 81fae3 + const uint16 *s = SrcPtr(src); + uint16 *dst = &dung_bg2[dung_door_tilemap_address[door] >> 1]; + for (int i = 0; i < 4; i++) { + dst[XY(0, 0)] = s[0]; + dst[XY(0, 1)] = s[1]; + dst[XY(0, 2)] = s[2]; + dst += 1, s += 3; + } +} + +void GetDoorDrawDataIndex_South_clean_door_index(int door) { // 81fb0b + GetDoorDrawDataIndex_South(door, door); +} + +int DoorDoorStep1_South(int door, int dma_ptr) { // 81fb15 + int pos = dung_door_tilemap_address[door]; + if ((pos & 0x1fff) < kDoorPositionToTilemapOffs_Down[9]) { + pos += 0x500; + if ((door_type_and_slot[door] & 0xfe) >= 0x42) + pos += 0x300; + GetDoorDrawDataIndex_North(door ^ 8, door & 7); + dma_ptr = Dungeon_PrepOverlayDma_nextPrep(dma_ptr, pos); + Dungeon_LoadSingleDoorAttribute(door ^ 8); + } + GetDoorDrawDataIndex_South(door, door & 7); + return dma_ptr; +} + +void GetDoorDrawDataIndex_South(int door, int r4_door) { // 81fb61 + uint8 door_type = door_type_and_slot[door] & 0xfe; + int x = door_open_closed_counter; + if (x == 0 || x == 4) { + DrawDoorToTileMap_South(door, r4_door); + return; + } + x += (door_type >= 0x42) ? 4 : 0; + x += (door_type == kDoorType_ShuttersTwoWay || door_type == kDoorType_Shutter) ? 2 : 0; + // assert(x < 8); + Object_Draw_DoorDown_4x3(kDoorAnimDownSrc[x >> 1], door); +} + +void DrawDoorToTileMap_South(int door, int r4_door) { // 81fb8e + Object_Draw_DoorDown_4x3(kDoorTypeSrcData2[GetDoorGraphicsIndex(door, r4_door) >> 1], door); +} + +void Object_Draw_DoorDown_4x3(uint16 src, int door) { // 81fb9b + const uint16 *s = SrcPtr(src); + uint16 *dst = &dung_bg2[dung_door_tilemap_address[door] >> 1]; + for (int i = 0; i < 4; i++) { + dst[XY(0, 1)] = s[0]; + dst[XY(0, 2)] = s[1]; + dst[XY(0, 3)] = s[2]; + dst += 1, s += 3; + } +} + +void GetDoorDrawDataIndex_West_clean_door_index(int door) { // 81fbc2 + GetDoorDrawDataIndex_West(door, door); +} + +int DoorDoorStep1_West(int door, int dma_ptr) { // 81fbcc + int pos = dung_door_tilemap_address[door]; + if ((pos & 0x7ff) >= kDoorPositionToTilemapOffs_Left[6]) { + pos -= 16; + if ((door_type_and_slot[door] & 0xfe) >= 0x42) + pos -= 12; + GetDoorDrawDataIndex_East(door ^ 8, door & 7); + dma_ptr = Dungeon_PrepOverlayDma_nextPrep(dma_ptr, pos); + Dungeon_LoadSingleDoorAttribute(door ^ 8); + } + GetDoorDrawDataIndex_West(door, door & 7); + return dma_ptr; +} + +void GetDoorDrawDataIndex_West(int door, int r4_door) { // 81fc18 + uint8 door_type = door_type_and_slot[door] & 0xfe; + int x = door_open_closed_counter; + if (x == 0 || x == 4) { + DrawDoorToTileMap_West(door, r4_door); + return; + } + x += (door_type >= 0x42) ? 4 : 0; + x += (door_type == kDoorType_ShuttersTwoWay || door_type == kDoorType_Shutter) ? 2 : 0; + Object_Draw_DoorLeft_3x4(kDoorAnimLeftSrc[x >> 1], door); +} + +void DrawDoorToTileMap_West(int door, int r4_door) { // 81fc45 + Object_Draw_DoorLeft_3x4(kDoorTypeSrcData3[GetDoorGraphicsIndex(door, r4_door) >> 1], door); +} + +void GetDoorDrawDataIndex_East_clean_door_index(int door) { // 81fc80 + GetDoorDrawDataIndex_East(door, door); +} + +int DoorDoorStep1_East(int door, int dma_ptr) { // 81fc8a + int pos = dung_door_tilemap_address[door]; + if ((pos & 0x7ff) < kDoorPositionToTilemapOffs_Right[6]) { + pos += 16; + if ((door_type_and_slot[door] & 0xfe) >= 0x42) + pos += 12; + GetDoorDrawDataIndex_West(door ^ 8, door & 7); + dma_ptr = Dungeon_PrepOverlayDma_nextPrep(dma_ptr, pos); + Dungeon_LoadSingleDoorAttribute(door ^ 8); + } + GetDoorDrawDataIndex_East(door, door & 7); + return dma_ptr; +} + +void GetDoorDrawDataIndex_East(int door, int r4_door) { // 81fcd6 + uint8 door_type = door_type_and_slot[door] & 0xfe; + int x = door_open_closed_counter; + if (x == 0 || x == 4) { + DrawDoorToTileMap_East(door, r4_door); + return; + } + x += (door_type >= 0x42) ? 4 : 0; + x += (door_type == kDoorType_ShuttersTwoWay || door_type == kDoorType_Shutter) ? 2 : 0; + Object_Draw_DoorRight_3x4(kDoorAnimRightSrc[x >> 1], door); +} + +void DrawDoorToTileMap_East(int door, int r4_door) { // 81fd03 + Object_Draw_DoorRight_3x4(kDoorTypeSrcData4[GetDoorGraphicsIndex(door, r4_door) >> 1], door); +} + +uint8 GetDoorGraphicsIndex(int door, int r4_door) { // 81fd79 + uint8 door_type = door_type_and_slot[door] & 0xfe; + if (dung_door_opened_incl_adjacent & kUpperBitmasks[r4_door]) + door_type = kDoorTypeRemap[door_type >> 1]; + return door_type; +} + +void ClearExplodingWallFromTileMap_ClearOnePair(uint16 *dst, const uint16 *src) { // 81fddb + for (int i = 2; i != 0; i--) { + for (int j = 0; j < 12; j++) + dst[XY(0, j)] = src[j]; + dst++; + src += 12; + } +} + +void Dungeon_DrawRoomOverlay_Apply(int p) { // 81fe41 + for (int j = 0; j < 4; j++, p += 64) { + for (int i = 0; i < 4; i++) { + uint16 t = dung_bg2[p + i] & 0x3fe; + dung_bg2_attr_table[p + i] = (t == 0xee || t == 0xfe) ? 0 : 0x20; + } + } +} + +void ApplyGrayscaleFixed_Incremental() { // 81feb0 + uint8 a = COLDATA_copy0 & 0x1f; + if (a == overworld_fixed_color_plusminus) + return; + a += (a < overworld_fixed_color_plusminus) ? 1 : -1; + Dungeon_ApproachFixedColor_variable(a); +} + +void Dungeon_ApproachFixedColor_variable(uint8 a) { // 81fec1 + COLDATA_copy0 = a | 0x20; + COLDATA_copy1 = a | 0x40; + COLDATA_copy2 = a | 0x80; +} + +void Module_PreDungeon() { // 82821e + sound_effect_ambient = 5; + sound_effect_1 = 0; + dungeon_room_index = 0; + dungeon_room_index_prev = 0; + dung_savegame_state_bits = 0; + + agahnim_pal_setting[0] = agahnim_pal_setting[1] = agahnim_pal_setting[2] = 0; + agahnim_pal_setting[3] = agahnim_pal_setting[4] = agahnim_pal_setting[5] = 0; + + Dungeon_LoadEntrance(); + uint8 d = cur_palace_index_x2; + link_num_keys = (d != 0xff) ? link_keys_earned_per_dungeon[d == 2 ? 0 : (d >> 1)] : 0xff; + Hud_Rebuild(); + dung_num_lit_torches = 0; + hdr_dungeon_dark_with_lantern = 0; + Dungeon_LoadAndDrawRoom(); + Dungeon_LoadCustomTileAttr(); + + DecompressAnimatedDungeonTiles(kDungAnimatedTiles[main_tile_theme_index]); + Dungeon_LoadAttributeTable(); + misc_sprites_graphics_index = 10; + InitializeTilesets(); + palette_sp6 = 10; + Dungeon_LoadPalettes(); + if (link_is_bunny_mirror | link_is_bunny) + LoadGearPalettes_bunny(); + + dung_loade_bgoffs_h_copy = (dungeon_room_index & 0xf) << 9; + dung_loade_bgoffs_v_copy = swap16((dungeon_room_index & 0xff0) >> 3); + + if (dungeon_room_index == 0x104 && sram_progress_flags & 0x10) + WORD(dung_want_lights_out) = 0; + + SetAndSaveVisitedQuadrantFlags(); + CGWSEL_copy = 2; + CGADSUB_copy = 0xb3; + + uint8 x = dung_num_lit_torches; + if (!dung_want_lights_out) { + x = 3; + CGADSUB_copy = dung_hdr_bg2_properties == 7 ? 0x32 : + dung_hdr_bg2_properties == 4 ? 0x62 : 0x20; + } + overworld_fixed_color_plusminus = kLitTorchesColorPlus[x]; + Dungeon_ApproachFixedColor_variable(overworld_fixed_color_plusminus); + BYTE(palette_filter_countdown) = 0x1f; + mosaic_target_level = 0; + BYTE(darkening_or_lightening_screen) = 2; + overworld_palette_aux_or_main = 0; + link_speed_modifier = 0; + button_mask_b_y = 0; + button_b_frames = 0; + Dungeon_ResetTorchBackgroundAndPlayer(); + Link_CheckBunnyStatus(); + ResetThenCacheRoomEntryProperties(); + if (savegame_tagalong == 13) { + savegame_tagalong = 0; + super_bomb_indicator_unk2 = 0; + Hud_RemoveSuperBombIndicator(); + } + BGMODE_copy = 9; + Follower_Initialize(); + Sprite_ResetAll(); + Dungeon_ResetSprites(); + byte_7E02F0 = 0; + flag_skip_call_tag_routines++; + if (!sram_progress_indicator && !(sram_progress_flags & 0x10)) { + COLDATA_copy0 = 0x30; + COLDATA_copy1 = 0x50; + COLDATA_copy2 = 0x80; + dung_want_lights_out = dung_want_lights_out_copy = 0; + Link_TuckIntoBed(); + } + saved_module_for_menu = 7; + main_module_index = 7; + submodule_index = 15; + Dungeon_LoadSongBankIfNeeded(); + Module_PreDungeon_setAmbientSfx(); +} + +void Module_PreDungeon_setAmbientSfx() { // 82838c + if (sram_progress_indicator < 2) { + sound_effect_ambient = 5; + if (!sign8(dung_cur_floor) && dungeon_room_index != 2 && dungeon_room_index != 18) + sound_effect_ambient = 3; + } +} + +void LoadOWMusicIfNeeded() { // 82854c + if (!flag_which_music_type) + return; + zelda_snes_dummy_write(NMITIMEN, 0); + zelda_snes_dummy_write(HDMAEN, 0); + flag_which_music_type = 0; + LoadOverworldSongs(); + zelda_snes_dummy_write(NMITIMEN, 0x81); +} + +void Module07_Dungeon() { // 8287a2 + Dungeon_HandleLayerEffect(); + kDungeonSubmodules[submodule_index](); + dung_misc_objs_index = 0; + Dungeon_PushBlock_Handler(); + if (submodule_index) goto skip; + Graphics_LoadChrHalfSlot(); + Dungeon_HandleCamera(); + if (submodule_index) goto skip; + Dungeon_HandleRoomTags(); + if (submodule_index) goto skip; + Dungeon_ProcessTorchesAndDoors(); + if (dung_unk_blast_walls_2) + Dungeon_ClearAwayExplodingWall(); + if (!is_standing_in_doorway) + Dungeon_TryScreenEdgeTransition(); +skip: + OrientLampLightCone(); + + int bg2x = BG2HOFS_copy2; + int bg2y = BG2VOFS_copy2; + int bg1x = BG1HOFS_copy2; + int bg1y = BG1VOFS_copy2; + + BG2HOFS_copy2 = BG2HOFS_copy = bg2x + bg1_x_offset; + BG2VOFS_copy2 = BG2VOFS_copy = bg2y + bg1_y_offset; + BG1HOFS_copy2 = BG1HOFS_copy = bg1x + bg1_x_offset; + BG1VOFS_copy2 = BG1VOFS_copy = bg1y + bg1_y_offset; + + if (dung_hdr_collision_2_mirror) { + BG1HOFS_copy2 = BG1HOFS_copy = bg1x = BG2HOFS_copy2 + dung_floor_x_offs; + BG1VOFS_copy2 = BG1VOFS_copy = bg1y = BG2VOFS_copy2 + dung_floor_y_offs; + } + + Sprite_Dungeon_DrawAllPushBlocks(); + Sprite_Main(); + + BG2HOFS_copy2 = bg2x; + BG2VOFS_copy2 = bg2y; + BG1HOFS_copy2 = bg1x; + BG1VOFS_copy2 = bg1y; + + LinkOam_Main(); + Hud_RefillLogic(); + Hud_FloorIndicator(); +} + +void Dungeon_TryScreenEdgeTransition() { // 82885e + int dir; + + if (link_y_vel != 0) { + int y = (link_y_coord & 0x1ff); + if ((dir = 3, y < 4) || (dir = 2, y >= 476)) + goto trigger_trans; + } + + if (link_x_vel != 0) { + int y = (link_x_coord & 0x1ff); + if ((dir = 1, y < 8) || (dir = 0, y >= 489)) + goto trigger_trans; + } + return; + +trigger_trans: + if (!Link_CheckForEdgeScreenTransition() && main_module_index == 7) { + Dungeon_HandleEdgeTransitionMovement(dir); + if (main_module_index == 7) + submodule_index = 2; + } +} + +void Dungeon_HandleEdgeTransitionMovement(int dir) { // 8288c5 + static const uint8 kLimitDirectionOnOneAxis[] = { 0x3, 0x3, 0xc, 0xc }; + link_direction &= kLimitDirectionOnOneAxis[dir]; + switch (dir) { + case 0: Dungeon_StartInterRoomTrans_Right(); break; + case 1: Dungeon_StartInterRoomTrans_Left(); break; + case 2: Dungeon_StartInterRoomTrans_Down(); break; + case 3: Dungeon_StartInterRoomTrans_Up(); break; + default: + assert(0); + } +} + +void Module07_00_PlayerControl() { // 8288de + if (!(flag_custom_spell_anim_active | flag_is_link_immobilized | flag_block_link_menu)) { + if (filtered_joypad_H & 0x10) { + overworld_map_state = 0; + submodule_index = 1; + saved_module_for_menu = main_module_index; + main_module_index = 14; + return; + } + if (filtered_joypad_L & 0x40 && (uint8)cur_palace_index_x2 != 0xff && (uint8)dungeon_room_index) { + overworld_map_state = 0; + submodule_index = 3; + saved_module_for_menu = main_module_index; + main_module_index = 14; + return; + } + if (joypad1H_last & 0x20 && sram_progress_indicator) { + choice_in_multiselect_box_bak = choice_in_multiselect_box; + dialogue_message_index = 0x186; + uint8 bak = main_module_index; + Main_ShowTextMessage(); + main_module_index = bak; + subsubmodule_index = 0; + overworld_map_state = 0; + submodule_index = 11; + saved_module_for_menu = main_module_index; + main_module_index = 14; + return; + } + } + Link_Main(); +} + +void Module07_01_SubtileTransition() { // 82897c + link_y_coord_prev = link_y_coord; + link_x_coord_prev = link_x_coord; + Link_HandleMovingAnimation_FullLongEntry(); + kDungeon_IntraRoomTrans[subsubmodule_index](); +} + +void DungeonTransition_Subtile_ResetShutters() { // 828995 + BYTE(dung_flag_trapdoors_down) = 0; + BYTE(door_animation_step_indicator) = 7; + uint8 bak = submodule_index; + OperateShutterDoors(); + submodule_index = bak; + BYTE(palette_filter_countdown) = 31; + mosaic_target_level = 0; + subsubmodule_index++; +} + +void DungeonTransition_Subtile_PrepTransition() { // 8289b6 + darkening_or_lightening_screen = 0; + palette_filter_countdown = 0; + mosaic_target_level = 31; + unused_config_gfx = 0; + dung_flag_somaria_block_switch = 0; + dung_flag_statechange_waterpuzzle = 0; + subsubmodule_index++; +} + +void DungeonTransition_Subtile_ApplyFilter() { // 8289d8 + if (!dung_want_lights_out) { + subsubmodule_index++; + return; + } + ApplyPaletteFilter_bounce(); + if (BYTE(palette_filter_countdown)) + ApplyPaletteFilter_bounce(); +} + +void DungeonTransition_Subtile_TriggerShutters() { // 8289f0 + ResetThenCacheRoomEntryProperties(); + if (!BYTE(dung_flag_trapdoors_down)) { + BYTE(dung_flag_trapdoors_down)++; + BYTE(dung_cur_door_pos) = 0; + BYTE(door_animation_step_indicator) = 0; + submodule_index = 5; + } +} + +void Module07_02_SupertileTransition() { // 828a26 + link_y_coord_prev = link_y_coord; + link_x_coord_prev = link_x_coord; + if (subsubmodule_index != 0) { + if (subsubmodule_index >= 7) + Graphics_IncrementalVRAMUpload(); + Dungeon_LoadAttribute_Selectable(); + } + Link_HandleMovingAnimation_FullLongEntry(); + kDungeon_InterRoomTrans[subsubmodule_index](); +} + +void Module07_02_00_InitializeTransition() { // 828a4f + uint8 bak = hdr_dungeon_dark_with_lantern; + ResetTransitionPropsAndAdvanceSubmodule(); + hdr_dungeon_dark_with_lantern = bak; +} + +void Module07_02_01_LoadNextRoom() { // 828a5b + Dungeon_LoadRoom(); + ResetStarTileGraphics(); + LoadTransAuxGFX_sprite(); + subsubmodule_index++; + overworld_map_state = 0; + BYTE(dungeon_room_index2) = BYTE(dungeon_room_index); + Dungeon_ResetSprites(); + if (!hdr_dungeon_dark_with_lantern) + MirrorBg1Bg2Offs(); + hdr_dungeon_dark_with_lantern = 0; +} + +void Dungeon_InterRoomTrans_State3() { // 828a87 + if (dung_want_lights_out | dung_want_lights_out_copy) + TS_copy = 0; + Dungeon_AdjustForRoomLayout(); + LoadNewSpriteGFXSet(); + MirrorBg1Bg2Offs(); + WaterFlood_BuildOneQuadrantForVRAM(); + subsubmodule_index++; +} + +void Dungeon_InterRoomTrans_State10() { // 828aa5 + if (dung_want_lights_out | dung_want_lights_out_copy) + ApplyPaletteFilter_bounce(); + Dungeon_InterRoomTrans_notDarkRoom(); +} + +void Dungeon_SpiralStaircase11() { // 828aaf + ApplyPaletteFilter_bounce(); + WaterFlood_BuildOneQuadrantForVRAM(); + subsubmodule_index++; +} + +void Dungeon_InterRoomTrans_notDarkRoom() { // 828ab3 + WaterFlood_BuildOneQuadrantForVRAM(); + subsubmodule_index++; +} + +void Dungeon_InterRoomTrans_State9() { // 828aba + if (dung_want_lights_out | dung_want_lights_out_copy) + ApplyPaletteFilter_bounce(); + Dungeon_InterRoomTrans_State4(); +} + +void Dungeon_SpiralStaircase12() { // 828ac4 + ApplyPaletteFilter_bounce(); + Dungeon_PrepareNextRoomQuadrantUpload(); + subsubmodule_index++; +} + +void Dungeon_InterRoomTrans_State4() { // 828ac8 + Dungeon_PrepareNextRoomQuadrantUpload(); + subsubmodule_index++; +} + +void Dungeon_InterRoomTrans_State12() { // 828acf + if (submodule_index == 2) { + if (overworld_map_state != 5) + return; + SubtileTransitionCalculateLanding(); + if (dung_want_lights_out | dung_want_lights_out_copy) + ApplyPaletteFilter_bounce(); + } + subsubmodule_index++; + Dungeon_ResetTorchBackgroundAndPlayer(); +} + +void Dungeon_Staircase14() { // 828aed + subsubmodule_index++; + Dungeon_ResetTorchBackgroundAndPlayer(); +} + +void Dungeon_ResetTorchBackgroundAndPlayer() { // 828aef + uint8 ts = kSpiralTab1[dung_hdr_bg2_properties], tm = 0x16; + if (sign8(ts)) + tm = 0x17, ts = 0; + if (dung_hdr_bg2_properties == 2) + ts = 3; + TM_copy = tm; + TS_copy = ts; + Hud_RestoreTorchBackground(); + Dungeon_ResetTorchBackgroundAndPlayerInner(); +} + +void Dungeon_ResetTorchBackgroundAndPlayerInner() { // 828b0c + Ancilla_TerminateSelectInteractives(0); + if (link_is_running) { + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + link_actual_vel_z = 0xff; + g_ram[0xc7] = 0xff; + link_delay_timer_spin_attack = 0; + link_speed_setting = 0; + swimcoll_var5[0] &= ~0xff; + link_is_running = 0; + link_player_handler_state = 0; + } +} + +void Dungeon_InterRoomTrans_State7() { // 828b2e + BG1HOFS_copy2 = BG2HOFS_copy2; + BG1VOFS_copy2 = BG2VOFS_copy2; + + if (dungeon_room_index != 54 && dungeon_room_index != 56) { + uint16 y = kSpiralTab1[dung_hdr_bg2_properties] ? 0x116 : 0x16; + if (y != (TM_copy | TS_copy << 8) && (TM_copy == 0x17 || (TM_copy | TS_copy) != 0x17)) + TM_copy = y, TS_copy = y >> 8; + } + DungeonTransition_RunFiltering(); +} + +void DungeonTransition_RunFiltering() { // 828b67 + if (dung_want_lights_out | dung_want_lights_out_copy) { + overworld_fixed_color_plusminus = kLitTorchesColorPlus[dung_want_lights_out ? dung_num_lit_torches : 3]; + Dungeon_ApproachFixedColor_variable(overworld_fixed_color_plusminus); + mosaic_target_level = 0; + } + Dungeon_HandleTranslucencyAndPalette(); +} + +void Module07_02_FadedFilter() { // 828b92 + if (dung_want_lights_out | dung_want_lights_out_copy) { + ApplyPaletteFilter_bounce(); + if (BYTE(palette_filter_countdown)) + ApplyPaletteFilter_bounce(); + } else { + subsubmodule_index++; + } +} + +void Dungeon_InterRoomTrans_State15() { // 828bae + ResetThenCacheRoomEntryProperties(); + if (!BYTE(dung_flag_trapdoors_down) && (BYTE(dungeon_room_index) != 172 || dung_savegame_state_bits & 0x3000)) { + BYTE(dung_flag_trapdoors_down) = 1; + BYTE(dung_cur_door_pos) = 0; + BYTE(door_animation_step_indicator) = 0; + submodule_index = 5; + } + Dungeon_PlayMusicIfDefeated(); +} + +void Dungeon_PlayMusicIfDefeated() { // 828bd7 + uint8 x = 0x14; + if (dungeon_room_index != 18) { + x = 0x10; + if (dungeon_room_index != 2) { + if (FindInWordArray(kBossRooms, dungeon_room_index, countof(kBossRooms)) < 0) + return; + if (Sprite_CheckIfScreenIsClear()) + return; + x = 0x15; + } + } + music_control = x; +} + +void Module07_03_OverlayChange() { // 828c05 + const uint8 *overlay_p = kDungeonRoomOverlay + kDungeonRoomOverlayOffs[dung_overlay_to_load]; + Dungeon_DrawRoomOverlay(overlay_p); + int dst_pos = 0; + for (;;) { + uint16 a = WORD(*overlay_p); + if (a == 0xffff) + break; + int p = (overlay_p[0] >> 2) | (overlay_p[1] >> 2) << 6; + dst_pos = Dungeon_PrepOverlayDma_nextPrep(dst_pos, p * 2); + Dungeon_DrawRoomOverlay_Apply(p); + overlay_p += 3; + } + nmi_copy_packets_flag = 1; + submodule_index = 0; +} + +void Module07_04_UnlockDoor() { // 828c0a + Dungeon_OpeningLockedDoor_Combined(false); +} + +void Module07_05_ControlShutters() { // 828c0f + OperateShutterDoors(); +} + +void Module07_06_FatInterRoomStairs() { // 828c14 + int j; + + if (subsubmodule_index >= 3) + Dungeon_LoadAttribute_Selectable(); + + if (subsubmodule_index >= 13) { + Graphics_IncrementalVRAMUpload(); + if (!staircase_var1) + goto table; + if (staircase_var1-- == 0x10) + link_speed_modifier = 2; + link_direction = which_staircase_index & 4 ? 4 : 8; + Link_HandleVelocity(); + Dungeon_HandleCamera(); + } + Link_HandleMovingAnimation_FullLongEntry(); +table: + switch (subsubmodule_index) { + case 0: ResetTransitionPropsAndAdvance_ResetInterface(); break; + case 1: + ApplyPaletteFilter_bounce(); + if (BYTE(palette_filter_countdown)) + ApplyPaletteFilter_bounce(); + break; + case 2: Dungeon_InitializeRoomFromSpecial(); break; + case 3: DungeonTransition_TriggerBGC34UpdateAndAdvance(); break; + case 4: DungeonTransition_TriggerBGC56UpdateAndAdvance(); break; + case 5: DungeonTransition_LoadSpriteGFX(); break; + case 6: DungeonTransition_AdjustForFatStairScroll(); break; + case 7: Dungeon_InterRoomTrans_State4(); break; + case 8: Dungeon_InterRoomTrans_notDarkRoom(); break; + case 9: Dungeon_InterRoomTrans_State4(); break; + case 10: Dungeon_SpiralStaircase11(); break; + case 11: Dungeon_SpiralStaircase12(); break; + case 12: Dungeon_SpiralStaircase11(); break; + case 13: Dungeon_SpiralStaircase12(); break; + case 14: Dungeon_DoubleApplyAndIncrementGrayscale(); break; + case 15: Dungeon_Staircase14(); break; + case 16: + if (!(BYTE(darkening_or_lightening_screen) | BYTE(palette_filter_countdown)) && overworld_map_state == 5) + ResetThenCacheRoomEntryProperties(); + break; + } +} + +void Module07_0E_01_HandleMusicAndResetProps() { // 828c78 + if ((dungeon_room_index == 7 || dungeon_room_index == 23 && music_unk1 != 17) && !(link_which_pendants & 1)) + music_control = 0xf1; + staircase_var1 = (which_staircase_index & 4) ? 106 : 88; + overworld_map_state = 0; + ResetTransitionPropsAndAdvanceSubmodule(); +} + +void ResetTransitionPropsAndAdvance_ResetInterface() { // 828ca9 + overworld_map_state = 0; + ResetTransitionPropsAndAdvanceSubmodule(); +} + +void ResetTransitionPropsAndAdvanceSubmodule() { // 828cac + WORD(mosaic_level) = 0; + darkening_or_lightening_screen = 0; + palette_filter_countdown = 0; + mosaic_target_level = 31; + unused_config_gfx = 0; + dung_num_lit_torches = 0; + if (hdr_dungeon_dark_with_lantern) { + CGWSEL_copy = 0x02; + CGADSUB_copy = 0xB3; + } + hdr_dungeon_dark_with_lantern = 0; + Dungeon_ResetTorchBackgroundAndPlayerInner(); + Overworld_CopyPalettesToCache(); + subsubmodule_index += 1; +} + +void Dungeon_InitializeRoomFromSpecial() { // 828ce2 + Dungeon_AdjustAfterSpiralStairs(); + Dungeon_LoadRoom(); + ResetStarTileGraphics(); + LoadTransAuxGFX(); + Dungeon_LoadCustomTileAttr(); + BYTE(dungeon_room_index2) = BYTE(dungeon_room_index); + Follower_Initialize(); + subsubmodule_index += 1; +} + +void DungeonTransition_LoadSpriteGFX() { // 828d10 + LoadNewSpriteGFXSet(); + Dungeon_ResetSprites(); + DungeonTransition_RunFiltering(); +} + +void DungeonTransition_AdjustForFatStairScroll() { // 828d1b + MirrorBg1Bg2Offs(); + Dungeon_AdjustForRoomLayout(); + uint8 ts = kSpiralTab1[dung_hdr_bg2_properties]; + uint8 tm = 0x16; + if (sign8(ts)) + tm = 0x17, ts = 0; + TM_copy = tm; + TS_copy = ts; + + link_speed_modifier = 1; + if (which_staircase_index & 4) { + dung_cur_floor--; + staircase_var1 = 32; + sound_effect_1 = 0x19; + } else { + dung_cur_floor++; + staircase_var1 = 48; + sound_effect_1 = 0x17; + } + sound_effect_2 = 0x24; + Dungeon_PlayBlipAndCacheQuadrantVisits(); + Dungeon_InterRoomTrans_notDarkRoom(); +} + +void ResetThenCacheRoomEntryProperties() { // 828d71 + overworld_map_state = 0; + subsubmodule_index = 0; + overworld_screen_transition = 0; + submodule_index = 0; + dung_flag_statechange_waterpuzzle = 0; + dung_flag_movable_block_was_pushed = 0; + CacheCameraProperties(); +} + +void DungeonTransition_TriggerBGC34UpdateAndAdvance() { // 828e0f + PrepTransAuxGfx(); + nmi_subroutine_index = nmi_disable_core_updates = 9; + subsubmodule_index += 1; +} + +void DungeonTransition_TriggerBGC56UpdateAndAdvance() { // 828e1d + nmi_subroutine_index = nmi_disable_core_updates = 10; + subsubmodule_index += 1; +} + +void Module07_07_FallingTransition() { // 828e27 + if (subsubmodule_index >= 6) { + Graphics_IncrementalVRAMUpload(); + Dungeon_LoadAttribute_Selectable(); + ApplyGrayscaleFixed_Incremental(); + } + kDungeon_Submodule_7_DownFloorTrans[subsubmodule_index](); +} + +void Module07_07_00_HandleMusicAndResetRoom() { // 828e63 + if (dungeon_room_index == 0x10 || dungeon_room_index == 7 || dungeon_room_index == 0x17) + music_control = 0xf1; + ResetTransitionPropsAndAdvance_ResetInterface(); +} + +void Module07_07_06_SyncBG1and2() { // 828e80 + MirrorBg1Bg2Offs(); + Dungeon_AdjustForRoomLayout(); + uint8 ts = kSpiralTab1[dung_hdr_bg2_properties]; + uint8 tm = 0x16; + if (sign8(ts)) + tm = 0x17, ts = 0; + TM_copy = tm; + TS_copy = ts; + WaterFlood_BuildOneQuadrantForVRAM(); + subsubmodule_index++; +} + +void Module07_07_0F_FallingFadeIn() { // 828ea1 + ApplyPaletteFilter_bounce(); + if (BYTE(darkening_or_lightening_screen)) + return; + HIBYTE(tiledetect_which_y_pos[0]) = HIBYTE(link_y_coord) + (BYTE(link_y_coord) >= BYTE(tiledetect_which_y_pos[0])); + Dungeon_SetBossMusicUnorthodox(); + if (BYTE(dungeon_room_index) == 0x89 || BYTE(dungeon_room_index) == 0x4f) + return; + if (BYTE(dungeon_room_index) == 0xA7) { + hud_floor_changed_timer = 0; + dung_cur_floor = 1; + return; + } + dung_cur_floor--; + Dungeon_PlayBlipAndCacheQuadrantVisits(); +} + +void Dungeon_PlayBlipAndCacheQuadrantVisits() { // 828ec9 + hud_floor_changed_timer = 1; + sound_effect_2 = 36; + SetAndSaveVisitedQuadrantFlags(); +} + +void Module07_07_10_LandLinkFromFalling() { // 828ee0 + HandleDungeonLandingFromPit(); + if (submodule_index) + return; + submodule_index = 7; + subsubmodule_index = 17; + load_chr_halfslot_even_odd = 1; + Graphics_LoadChrHalfSlot(); +} + +void Module07_07_11_CacheRoomAndSetMusic() { // 828efa + if (overworld_map_state == 5) { + ResetThenCacheRoomEntryProperties(); + Dungeon_PlayMusicIfDefeated(); + Graphics_LoadChrHalfSlot(); + } +} + +// straight staircase going down when walking south +void Module07_08_NorthIntraRoomStairs() { // 828f0c + uint8 t = staircase_var1; + if (t) { + staircase_var1--; + if (t == 20) + link_speed_modifier = 2; + Link_HandleVelocity(); + ApplyLinksMovementToCamera(); + Dungeon_HandleCamera(); + Link_HandleMovingAnimation_FullLongEntry(); + } + kDungeon_StraightStaircaseDown[subsubmodule_index](); +} + +void Module07_08_00_InitStairs() { // 828f35 + draw_water_ripples_or_grass = 0; + + uint8 v1 = 0x3c, sfx = 25; + if (link_direction & 8) { + v1 = 0x38, sfx = 23; + link_is_on_lower_level_mirror = 0; + if ((uint8)kind_of_in_room_staircase != 2) + link_is_on_lower_level = 0; + } + staircase_var1 = v1; + sound_effect_1 = sfx; + link_speed_modifier = 1; + subsubmodule_index++; +} + +void Module07_08_01_ClimbStairs() { // 828f5f + if (staircase_var1) + return; + if (link_direction & 4) { + link_is_on_lower_level_mirror = 1; + if ((uint8)kind_of_in_room_staircase != 2) + link_is_on_lower_level = 1; + } + subsubmodule_index = 0; + overworld_screen_transition = 0; + submodule_index = 0; + SetAndSaveVisitedQuadrantFlags(); +} + +// straight staircase going up when walking south +void Module07_10_SouthIntraRoomStairs() { // 828f88 + uint8 t = staircase_var1; + if (t) { + staircase_var1--; + if (t == 20) + link_speed_modifier = 2; + Link_HandleVelocity(); + ApplyLinksMovementToCamera(); + Dungeon_HandleCamera(); + Link_HandleMovingAnimation_FullLongEntry(); + } + kDungeon_StraightStaircase[subsubmodule_index](); +} + +void Module07_10_00_InitStairs() { // 828fb1 + uint8 v1 = 0x3c, sfx = 25; + if (link_direction & 4) { + v1 = 0x38, sfx = 23; + link_is_on_lower_level_mirror ^= 1; + if ((uint8)kind_of_in_room_staircase != 2) + link_is_on_lower_level ^= 1; + } + staircase_var1 = v1; + sound_effect_1 = sfx; + link_speed_modifier = 1; + subsubmodule_index++; +} + +void Module07_10_01_ClimbStairs() { // 828fe1 + if (staircase_var1) + return; + if (link_direction & 8) { + link_is_on_lower_level_mirror ^= 1; + if ((uint8)kind_of_in_room_staircase != 2) + link_is_on_lower_level ^= 1; + } + subsubmodule_index = 0; + overworld_screen_transition = 0; + submodule_index = 0; + SetAndSaveVisitedQuadrantFlags(); +} + +void Module07_09_OpenCrackedDoor() { // 82900f + OpenCrackedDoor(); +} + +// Used when lighting a lamp +void Module07_0A_ChangeBrightness() { // 829014 + OrientLampLightCone(); + ApplyGrayscaleFixed_Incremental(); + if ((COLDATA_copy0 & 0x1f) != overworld_fixed_color_plusminus) + return; + submodule_index = 0; + subsubmodule_index = 0; +} + +void Module07_0B_DrainSwampPool() { // 82902d + static const int8 kTurnOffWater_Tab0[16] = { -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1 }; + switch (subsubmodule_index) { + case 0: { + if (!(turn_on_off_water_ctr & 7)) { + int k = (turn_on_off_water_ctr >> 2) & 3; + if (water_hdma_var2 == water_hdma_var4) { + Dungeon_SetAttrForActivatedWaterOff(); + return; + } + water_hdma_var2 += kTurnOffWater_Tab0[k]; + water_hdma_var3 += kTurnOffWater_Tab0[k]; + } + turn_on_off_water_ctr++; + AdjustWaterHDMAWindow(); + break; + } + case 1: { + uint16 v = SrcPtr(0x1e0)[0]; + for (int i = 0; i < 0x1000; i++) + dung_bg1[i] = v; + dung_cur_quadrant_upload = 0; + subsubmodule_index++; + break; + } + case 2: case 3: case 4: case 5: + Dungeon_FloodSwampWater_PrepTileMap(); + break; + } +} + +void Module07_0C_FloodSwampWater() { // 82904a + int k; + static const int8 kTurnOnWater_Tab2[4] = { 1, 1, 1, -1 }; + static const int8 kTurnOnWater_Tab1[4] = { 1, 2, 1, -1 }; + static const int8 kTurnOnWater_Tab0[4] = { 1, -1, 1, -1 }; + + switch (subsubmodule_index) { + case 0: case 1: case 2: case 3: + Dungeon_FloodSwampWater_PrepTileMap(); + break; + case 4: case 5: case 6: case 7: case 8: + if (!--turn_on_off_water_ctr) { + turn_on_off_water_ctr = 4; + int depth = ++subsubmodule_index - 4; + water_hdma_var3 = 8; + water_hdma_var5 = 0; + water_hdma_var2 = 0x30; + Dungeon_AdjustWaterVomit(SrcPtr(0x1654 + 0x10), depth); + } + break; + case 9: + W12SEL_copy = 3; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + TMW_copy = 22; + TSW_copy = 1; + TS_copy = 1; + CGWSEL_copy = 2; + CGADSUB_copy = 98; + turn_on_off_water_ctr = 0; + subsubmodule_index++; + // fall through + case 10: { + k = (turn_on_off_water_ctr & 3); + uint16 r0 = 0x688 - BG2VOFS_copy2 - 0x24; + water_hdma_var3 += kTurnOnWater_Tab0[k]; + water_hdma_var5 += kTurnOnWater_Tab1[k]; + if (water_hdma_var5 >= r0) { + dung_hdr_bg2_properties = 7; + subsubmodule_index++; + } + turn_on_off_water_ctr++; + spotlight_y_lower = 0x688 - BG2VOFS_copy2 - water_hdma_var2; + spotlight_y_upper = spotlight_y_lower + water_hdma_var5; + AdjustWaterHDMAWindow_X(spotlight_y_upper); + break; + } + case 11: { + if (!(turn_on_off_water_ctr & 7)) { + k = (turn_on_off_water_ctr >> 2) & 3; + if (water_hdma_var2 == water_hdma_var4) { + Dungeon_SetAttrForActivatedWater(); + return; + } + water_hdma_var2 += kTurnOnWater_Tab2[k]; + water_hdma_var3 += kTurnOnWater_Tab2[k]; + + uint16 a = water_hdma_var4 - water_hdma_var2; + if (a == 0 || a == 8) + Dungeon_AdjustWaterVomit(SrcPtr(a == 0 ? 0x16b4 : 0x168c), 5); + } + turn_on_off_water_ctr++; + AdjustWaterHDMAWindow(); + break; + } + } +} + +void Module07_0D_FloodDam() { // 82904f + FloodDam_PrepFloodHDMA(); + kWatergateFuncs[subsubmodule_index](); +} + +void Module07_0E_SpiralStairs() { // 829054 + if (subsubmodule_index >= 7) { + Graphics_IncrementalVRAMUpload(); + Dungeon_LoadAttribute_Selectable(); + } + HandleLinkOnSpiralStairs(); + kDungeon_SpiralStaircase[subsubmodule_index](); +} + +void Dungeon_DoubleApplyAndIncrementGrayscale() { // 829094 + ApplyPaletteFilter_bounce(); + ApplyPaletteFilter_bounce(); + ApplyGrayscaleFixed_Incremental(); +} + +void Module07_0E_02_ApplyFilterIf() { // 8290a1 + if (staircase_var1 < 9) { + ApplyPaletteFilter_bounce(); + if (palette_filter_countdown) + ApplyPaletteFilter_bounce(); + } + if (staircase_var1 != 0) { + staircase_var1--; + return; + } + tagalong_var5 = link_visibility_status = 12; +} + +void Dungeon_SyncBackgroundsFromSpiralStairs() { // 8290c7 + if (savegame_tagalong == 6 && BYTE(dungeon_room_index) == 100) + savegame_tagalong = 0; + uint8 bak = link_is_on_lower_level; + link_y_coord += which_staircase_index & 4 ? 48 : -48; + link_is_on_lower_level = kTeleportPitLevel2[cur_staircase_plane]; + SpiralStairs_MakeNearbyWallsHighPriority_Exiting(); + link_is_on_lower_level = bak; + link_y_coord += which_staircase_index & 4 ? -48 : 48; + BG1HOFS_copy2 = BG2HOFS_copy2; + BG1VOFS_copy2 = BG2VOFS_copy2; + Dungeon_AdjustForRoomLayout(); + uint8 ts = kSpiralTab1[dung_hdr_bg2_properties], tm = 0x16; + if (sign8(ts)) + tm = 0x17, ts = 0; + if (dung_hdr_bg2_properties == 2) + ts = 3; + TM_copy = tm; + TS_copy = ts; + dung_cur_floor += (which_staircase_index & 4) ? -1 : 1; + staircase_var1 = 24; + Dungeon_PlayBlipAndCacheQuadrantVisits(); + Hud_RestoreTorchBackground(); + Dungeon_InterRoomTrans_notDarkRoom(); +} + +void Dungeon_AdvanceThenSetBossMusicUnorthodox() { // 82915b + Dungeon_ResetTorchBackgroundAndPlayerInner(); + staircase_var1 = 0x38; + subsubmodule_index++; + Dungeon_SetBossMusicUnorthodox(); +} + +void Dungeon_SetBossMusicUnorthodox() { // 829165 + uint8 x = 0x1c; + if (dungeon_room_index != 16) { + x = 0x15; + if (dungeon_room_index != 7) { + x = 0x11; + if (dungeon_room_index != 23 || music_unk1 == 17) + return; + } + if (music_unk1 != 0xf1 && (link_which_pendants & 1)) + return; + } + music_control = x; +} + +void Dungeon_SpiralStaircase17() { // 82919b + SpiralStairs_FindLandingSpot(); + if (!--staircase_var1) { + staircase_var1 = which_staircase_index & 4 ? 10 : 24; + subsubmodule_index++; + } +} + +void Dungeon_SpiralStaircase18() { // 8291b5 + SpiralStairs_FindLandingSpot(); + if (!--staircase_var1) { + subsubmodule_index++; + overworld_map_state = 0; + } +} + +void Module07_0E_00_InitPriorityAndScreens() { // 8291c4 + SpiralStairs_MakeNearbyWallsHighPriority_Entering(); + if (link_is_on_lower_level) { + TM_copy &= 0xf; + TS_copy |= 0x10; + link_is_on_lower_level = 3; + } + subsubmodule_index++; +} + +void Module07_0E_13_SetRoomAndLayerAndCache() { // 8291dd + link_is_on_lower_level_mirror = kTeleportPitLevel1[cur_staircase_plane]; + link_is_on_lower_level = kTeleportPitLevel2[cur_staircase_plane]; + TM_copy |= 0x10; + TS_copy &= 0xf; + if (!(which_staircase_index & 4)) + SpiralStairs_MakeNearbyWallsLowPriority(); + BYTE(dungeon_room_index2) = BYTE(dungeon_room_index); + ResetThenCacheRoomEntryProperties(); +} + +void RepositionLinkAfterSpiralStairs() { // 82921a + link_visibility_status = 0; + tagalong_var5 = 0; + + int i = (cur_staircase_plane == 0 && byte_7E0492 != 0) ? 1 : 0; + i += (which_staircase_index & 4) ? 2 : 0; + + link_x_coord += kSpiralStaircaseX[i]; + link_y_coord += kSpiralStaircaseY[i]; + + if (TM_copy & 0x10) { + if (cur_staircase_plane == 2) { + link_is_on_lower_level = 3; + TM_copy &= 0xf; + TS_copy |= 0x10; + if (byte_7E0492 != 2) + link_y_coord += 24; + } + Follower_Initialize(); + } else { + if (cur_staircase_plane != 2) { + TM_copy |= 0x10; + TS_copy &= 0xf; + if (byte_7E0492 != 2) + link_y_coord -= 24; + } + Follower_Initialize(); + } +} + +void SpiralStairs_MakeNearbyWallsHighPriority_Exiting() { // 8292b1 + if (which_staircase_index & 4) + return; + int lf = (word_7E048C + 8) & 0x7f; + int x = 0, p; + while ((((p = dung_inter_starcases[x]) * 2) & 0x7f) != lf) + x++; + p -= 4; + word_7E048C = p * 2; + uint16 *dst = &dung_bg2[p]; + for (int i = 0; i < 5; i++) { + dst[XY(0, 0)] |= 0x2000; + dst[XY(0, 1)] |= 0x2000; + dst[XY(0, 2)] |= 0x2000; + dst[XY(0, 3)] |= 0x2000; + dst += 1; + } +} + +void Module07_0F_LandingWipe() { // 82931d + kDungeon_Submodule_F[subsubmodule_index](); + Link_HandleMovingAnimation_FullLongEntry(); + LinkOam_Main(); +} + +void Module07_0F_00_InitSpotlight() { // 82932d + Spotlight_open(); + subsubmodule_index++; +} + +void Module07_0F_01_OperateSpotlight() { // 829334 + Sprite_Main(); + IrisSpotlight_ConfigureTable(); + if (!submodule_index) { + W12SEL_copy = 0; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + TMW_copy = 0; + TSW_copy = 0; + subsubmodule_index = 0; + if (buffer_for_playing_songs != 0xff) + music_control = buffer_for_playing_songs; + } +} + +// This is used for straight inter room stairs for example stairs to throne room in first dung +void Module07_11_StraightInterroomStairs() { // 829357 + if (subsubmodule_index >= 3) + Dungeon_LoadAttribute_Selectable(); + if (subsubmodule_index >= 13) + Graphics_IncrementalVRAMUpload(); + if (staircase_var1) { + if (staircase_var1-- == 16) + link_speed_modifier = 2; + link_direction = (submodule_index == 18) ? 8 : 4; + Link_HandleVelocity(); + } + Link_HandleMovingAnimation_FullLongEntry(); + kDungeon_StraightStairs[subsubmodule_index](); +} + +void Module07_11_00_PrepAndReset() { // 8293bb + if (link_is_running) { + link_is_running = 0; + link_speed_setting = 2; + } + sound_effect_1 = (which_staircase_index & 4) ? 24 : 22; + if (dungeon_room_index == 48 || dungeon_room_index == 64) + music_control = 0xf1; + ResetTransitionPropsAndAdvance_ResetInterface(); +} + +void Module07_11_01_FadeOut() { // 8293ed + if (staircase_var1 < 9) { + ApplyPaletteFilter_bounce(); + if (BYTE(palette_filter_countdown) == 23) + subsubmodule_index++; + } +} + +void Module07_11_02_LoadAndPrepRoom() { // 829403 + ApplyPaletteFilter_bounce(); + Dungeon_LoadRoom(); + Dungeon_RestoreStarTileChr(); + LoadTransAuxGFX(); + Dungeon_LoadCustomTileAttr(); + Dungeon_AdjustForRoomLayout(); + Follower_Initialize(); + subsubmodule_index++; +} + +void Module07_11_03_FilterAndLoadBGChars() { // 829422 + ApplyPaletteFilter_bounce(); + DungeonTransition_TriggerBGC34UpdateAndAdvance(); +} + +void Module07_11_04_FilterDoBGAndResetSprites() { // 82942a + ApplyPaletteFilter_bounce(); + DungeonTransition_TriggerBGC56UpdateAndAdvance(); + BYTE(dungeon_room_index2) = BYTE(dungeon_room_index); + Dungeon_ResetSprites(); +} + +void Module07_11_0B_PrepDestination() { // 82943b + uint8 ts = kSpiralTab1[dung_hdr_bg2_properties], tm = 0x16; + if (sign8(ts)) + tm = 0x17, ts = 0; + TM_copy = tm; + TS_copy = ts; + + link_speed_modifier = 1; + dung_cur_floor += (which_staircase_index & 4) ? -1 : 1; + staircase_var1 = (which_staircase_index & 4) ? 0x32 : 0x3c; + sound_effect_1 = (which_staircase_index & 4) ? 25 : 23; + + uint8 r0 = 0; + if (link_is_on_lower_level) { + link_y_coord += (submodule_index == 18) ? -32 : 32; + r0++; + } + link_is_on_lower_level_mirror = kTeleportPitLevel1[cur_staircase_plane]; + link_is_on_lower_level = kTeleportPitLevel2[cur_staircase_plane]; + if (link_is_on_lower_level) { + link_y_coord += (submodule_index == 18) ? -32 : 32; + r0++; + } + + if (!r0) { + if (submodule_index == 18) { + link_y_coord += (which_staircase_index & 4) ? -24 : -8; + } else { + link_y_coord += 12; + } + } + + Dungeon_PlayBlipAndCacheQuadrantVisits(); + Hud_RestoreTorchBackground(); + Dungeon_InterRoomTrans_notDarkRoom(); +} + +void Module07_11_09_LoadSpriteGraphics() { // 8294e0 + ApplyPaletteFilter_bounce(); + subsubmodule_index--; + LoadNewSpriteGFXSet(); + Dungeon_HandleTranslucencyAndPalette(); +} + +void Module07_11_19_SetSongAndFilter() { // 8294ed + if (overworld_map_state == 5 && !BYTE(darkening_or_lightening_screen)) { + subsubmodule_index++; + if (dungeon_room_index == 48) + music_control = 0x1c; + else if (dungeon_room_index == 64) + music_control = 0x10; + } + ApplyGrayscaleFixed_Incremental(); +} + +void Module07_11_11_KeepSliding() { // 829518 + if (staircase_var1 == 0) + subsubmodule_index++; + else + ApplyGrayscaleFixed_Incremental(); +} + +void Module07_14_RecoverFromFall() { // 829520 + switch (subsubmodule_index) { + case 0: + Module07_14_00_ScrollCamera(); + break; + case 1: + RecoverPositionAfterDrowning(); + break; + } +} + +void Module07_14_00_ScrollCamera() { // 82952a + for (int i = 0; i < 2; i++) { + if (BG2HOFS_copy2 != BG2HOFS_copy2_cached) + BG2HOFS_copy2 += BG2HOFS_copy2 < BG2HOFS_copy2_cached ? 1 : -1; + if (BG2VOFS_copy2 != BG2VOFS_copy2_cached) + BG2VOFS_copy2 += BG2VOFS_copy2 < BG2VOFS_copy2_cached ? 1 : -1; + } + if (BG2HOFS_copy2 == BG2HOFS_copy2_cached && BG2VOFS_copy2 == BG2VOFS_copy2_cached) + subsubmodule_index++; + if (!hdr_dungeon_dark_with_lantern) + MirrorBg1Bg2Offs(); +} + +void Module07_15_WarpPad() { // 82967a + if (subsubmodule_index >= 3) { + Graphics_IncrementalVRAMUpload(); + Dungeon_LoadAttribute_Selectable(); + } + kDungeon_Teleport[subsubmodule_index](); +} + +void Module07_15_01_ApplyMosaicAndFilter() { // 8296ac + ConditionalMosaicControl(); + MOSAIC_copy = mosaic_level | 3; + ApplyPaletteFilter_bounce(); +} + +void Module07_15_04_SyncRoomPropsAndBuildOverlay() { // 8296ba + ApplyGrayscaleFixed_Incremental(); + if (dungeon_room_index == 0x17) + dung_cur_floor = 4; + MirrorBg1Bg2Offs(); + Dungeon_AdjustForRoomLayout(); + uint8 ts = kSpiralTab1[dung_hdr_bg2_properties], tm = 0x16; + if (sign8(ts)) + tm = 0x17, ts = 0; + TM_copy = tm; + TS_copy = ts; + WaterFlood_BuildOneQuadrantForVRAM(); + subsubmodule_index++; +} + +void Module07_15_0E_FadeInFromWarp() { // 8296ec + if (palette_filter_countdown & 1 && mosaic_level != 0) + mosaic_level -= 0x10; + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 3; + ApplyPaletteFilter_bounce(); +} + +void Module07_15_0F_FinalizeAndCacheEntry() { // 82970f + if (overworld_map_state == 5) { + SetAndSaveVisitedQuadrantFlags(); + submodule_index = 0; + ResetThenCacheRoomEntryProperties(); + } +} + +void Module07_16_UpdatePegs() { // 82972a + if (++subsubmodule_index & 3) + return; + switch (subsubmodule_index >> 2) { + case 0: + case 1: Module07_16_UpdatePegs_Step1(); break; + case 2: Module07_16_UpdatePegs_Step2(); break; + case 3: RecoverPegGFXFromMapping(); break; + case 4: + Dungeon_FlipCrystalPegAttribute(); + subsubmodule_index = 0; + submodule_index = 0; + break; + } +} + +void Module07_17_PressurePlate() { // 8297c8 + if (--subsubmodule_index) + return; + link_y_coord -= 2; + Dungeon_UpdateTileMapWithCommonTile((word_7E04B6 & 0x3f) << 3, (word_7E04B6 >> 3) & 0x1f8, 0xe); + submodule_index = saved_module_for_menu; +} + +void Module07_18_RescuedMaiden() { // 82980a + switch (subsubmodule_index) { + case 0: + PaletteFilter_RestoreBGSubstractiveStrict(); + main_palette_buffer[0] = main_palette_buffer[32]; + if (BYTE(darkening_or_lightening_screen) != 255) + return; + for (int i = 0; i < 0x1000; i++) + dung_bg2[i] = dung_bg1[i] = 0x1ec; + bg1_y_offset = 0; + bg1_x_offset = 0; + dung_floor_x_offs = 0; + dung_floor_y_offs = 0; + overworld_screen_transition = 0; + dung_cur_quadrant_upload = 0; + subsubmodule_index++; + break; + case 1: { + static const uint16 kCrystal_Tab0[7] = { 0x1618, 0x1658, 0x1658, 0x1618, 0x658, 0x1618, 0x1658 }; + PaletteFilter_Crystal(); + TS_copy = 1; + flag_is_link_immobilized = 2; + int j = FindInWordArray(kBossRooms, dungeon_room_index, countof(kBossRooms)) - 4; + uint16 *dst = &dung_bg1[kCrystal_Tab0[j] >> 1]; + for (int n = 0, t = 0; n != 4; n++) { + for (int i = 0; i != 8; i++, t++) { + dst[i + XY(0, 0)] = 0x1f80 | t; + dst[i + XY(0, 4)] = 0x1f88 | t; + } + t += 8, dst += XY(0, 1); + } + subsubmodule_index++; + break; + } + case 2: case 4: case 6: case 8: + Dungeon_InterRoomTrans_notDarkRoom(); + break; + case 3: case 5: case 7: case 9: + Dungeon_InterRoomTrans_State4(); + break; + case 10: + is_nmi_thread_active++; + Polyhedral_InitializeThread(); + CrystalCutscene_Initialize(); + submodule_index = 0; + subsubmodule_index = 0; + break; + } +} + +void Module07_19_MirrorFade() { // 8298f7 + // When using mirror + Overworld_ResetMosaic_alwaysIncrease(); + if (!--INIDISP_copy) { + main_module_index = 5; + submodule_index = 0; + nmi_load_bg_from_vram = 0; + last_music_control = music_unk1; + if (overworld_palette_swap_flag) + Palette_RevertTranslucencySwap(); + } +} + +void Module07_1A_RoomDraw_OpenTriforceDoor_bounce() { // 829916 + static const uint16 kOpenGanonDoor_Tab[4] = { 0x2556, 0x2596, 0x25d6, 0x2616 }; + + flag_is_link_immobilized = 1; + if (R16 != 0) { + if (--BYTE(R16) || --HIBYTE(R16)) + return; + sound_effect_ambient = 21; + link_force_hold_sword_up = 0; + link_cant_change_direction = 0; + } + flag_is_link_immobilized = 0; + if (++subsubmodule_index & 3) + return; + + const uint16 *src = SrcPtr(kOpenGanonDoor_Tab[(subsubmodule_index - 4) >> 2]); + uint16 *dst = &dung_bg2[0]; + for (int i = 0; i < 8; i++) { + dst[XY(44, 3)] = src[0]; + dst[XY(44, 4)] = src[1]; + dst[XY(44, 5)] = src[2]; + dst[XY(44, 6)] = src[3]; + dst += XY(1, 0), src += 4; + } + + Dungeon_PrepOverlayDma_watergate(0, 0x1d8, 0x881, 8); + if (subsubmodule_index == 16) { + WriteAttr2(XY(44, 5), 0x202); + WriteAttr2(XY(44, 6), 0x202); + WriteAttr2(XY(50, 5), 0x200); + WriteAttr2(XY(50, 6), 0x200); + for (int i = 0; i != 6; i += 2) { + WriteAttr2(XY(45 + i, 0), 0x0); + WriteAttr2(XY(45 + i, 1), 0x0); + WriteAttr2(XY(45 + i, 2), 0x0); + WriteAttr2(XY(45 + i, 3), 0x0); + WriteAttr2(XY(45 + i, 4), 0x0); + WriteAttr2(XY(45 + i, 5), 0x0); + WriteAttr2(XY(45 + i, 6), 0x0); + } + room_bounds_y.a0 = -64; + submodule_index = 0; + subsubmodule_index = 0; + } + nmi_copy_packets_flag = 1; +} + +void Module11_DungeonFallingEntrance() { // 829af9 + switch (subsubmodule_index) { + case 0: // Module_11_00_SetSongAndInit + if (kEntranceData_musicTrack[which_entrance] != 3 || sram_progress_indicator >= 2) + music_control = 0xf1; + ResetTransitionPropsAndAdvance_ResetInterface(); + break; + case 1: + if (!(frame_counter & 1)) + ApplyPaletteFilter_bounce(); + break; + case 2: + Module11_02_LoadEntrance(); + break; + case 3: + DungeonTransition_LoadSpriteGFX(); + break; + case 4: + INIDISP_copy = (INIDISP_copy + 1) & 0xf; + if (INIDISP_copy == 15) + subsubmodule_index++; + case 5: + HandleDungeonLandingFromPit(); + if (submodule_index) + return; + main_module_index = 7; + flag_skip_call_tag_routines++; + Dungeon_PlayBlipAndCacheQuadrantVisits(); + ResetThenCacheRoomEntryProperties(); + music_control = buffer_for_playing_songs; + last_music_control = music_unk1; + break; + } +} + +void Module11_02_LoadEntrance() { // 829b1c + EnableForceBlank(); + CGWSEL_copy = 2; + Dungeon_LoadEntrance(); + + uint8 dung = BYTE(cur_palace_index_x2); + link_num_keys = (dung != 255) ? link_keys_earned_per_dungeon[((dung == 2) ? 0 : dung) >> 1] : 255; + Hud_Rebuild(); + link_this_controls_sprite_oam = 4; + player_near_pit_state = 3; + link_visibility_status = 12; + link_speed_modifier = 16; + + uint8 y = link_y_coord - BG2VOFS_copy2; + link_state_bits = 0; + link_picking_throw_state = 0; + some_animation_timer = 0; + dungeon_room_index_prev = dungeon_room_index; + tiledetect_which_y_pos[0] = link_y_coord; + link_y_coord -= y + 16; + + uint8 bak = subsubmodule_index; + dung_num_lit_torches = 0; + hdr_dungeon_dark_with_lantern = 0; + Dungeon_LoadAndDrawRoom(); + Dungeon_LoadCustomTileAttr(); + DecompressAnimatedDungeonTiles(kDungAnimatedTiles[main_tile_theme_index]); + Dungeon_LoadAttributeTable(); + subsubmodule_index = bak + 1; + misc_sprites_graphics_index = 10; + zelda_ppu_write(OBSEL, 2); + InitializeTilesets(); + palette_sp6 = 10; + Dungeon_LoadPalettes(); + Hud_RestoreTorchBackground(); + button_mask_b_y = 0; + button_b_frames = 0; + Dungeon_ResetTorchBackgroundAndPlayer(); + if (link_is_bunny_mirror) + LoadGearPalettes_bunny(); + HDMAEN_copy = 0x80; + Hud_RefillLogic(); + Module_PreDungeon_setAmbientSfx(); + submodule_index = 7; + Dungeon_LoadSongBankIfNeeded(); +} + +void Dungeon_LoadSongBankIfNeeded() { // 829bd7 + if (buffer_for_playing_songs == 0xff || buffer_for_playing_songs == 0xf2) + return; + + if (buffer_for_playing_songs == 3 || buffer_for_playing_songs == 7 || buffer_for_playing_songs == 14) { + LoadOWMusicIfNeeded(); + } else { + if (flag_which_music_type) + return; + zelda_snes_dummy_write(NMITIMEN, 0); + zelda_snes_dummy_write(HDMAEN, 0); + flag_which_music_type = 1; + LoadDungeonSongs(); + zelda_snes_dummy_write(NMITIMEN, 0x81); + } +} + +void Mirror_SaveRoomData() { // 82a1b1 + if (cur_palace_index_x2 == 0xff) { + sound_effect_1 = 60; + return; + } + submodule_index = 25; + subsubmodule_index = 0; + sound_effect_1 = 51; + Dungeon_FlagRoomData_Quadrants(); + SaveDungeonKeys(); +} + +void SaveDungeonKeys() { // 82a1c7 + uint8 idx = cur_palace_index_x2; + if (idx == 0xff) + return; + if (idx == 2) + idx = 0; + link_keys_earned_per_dungeon[idx >> 1] = link_num_keys; +} + +void Dungeon_AdjustAfterSpiralStairs() { // 82a2f0 + int xd = ((dungeon_room_index & 0xf) - (dungeon_room_index_prev & 0xf)) * 0x200; + link_x_coord += xd; + BG2HOFS_copy2 += xd; + room_bounds_x.a1 += xd; + room_bounds_x.b1 += xd; + room_bounds_x.a0 += xd; + room_bounds_x.b0 += xd; + + int yd = (((dungeon_room_index & 0xf0) >> 4) - ((dungeon_room_index_prev & 0xf0) >> 4)) * 0x200; + link_y_coord += yd; + BG2VOFS_copy2 += yd; + room_bounds_y.a1 += yd; + room_bounds_y.b1 += yd; + room_bounds_y.a0 += yd; + room_bounds_y.b0 += yd; +} + +void Dungeon_AdjustForTeleportDoors(uint8 room, uint8 flag) { // 82a37c + dungeon_room_index2 = room; + dungeon_room_index_prev = room; + + uint16 xx = (room & 0xf) * 2 - (link_x_coord >> 8) + flag; + link_x_coord += (xx << 8); + BG2HOFS_copy2 += (xx << 8); + room_bounds_x.a1 += (xx << 8); + room_bounds_x.b1 += (xx << 8); + room_bounds_x.a0 += (xx << 8); + room_bounds_x.b0 += (xx << 8); + + xx = ((room & 0xf0) >> 3) - (link_y_coord >> 8); + link_y_coord += (xx << 8); + BG2VOFS_copy2 += (xx << 8); + room_bounds_y.a1 += (xx << 8); + room_bounds_y.b1 += (xx << 8); + room_bounds_y.a0 += (xx << 8); + room_bounds_y.b0 += (xx << 8); + + for (int i = 0; i < 20; i++) + tagalong_y_hi[i] = link_y_coord >> 8; +} + +void Dungeon_AdjustForRoomLayout() { // 82b5dc + Dungeon_AdjustQuadrant(); + quadrant_fullsize_x = (dung_blastwall_flag_x || (kLayoutQuadrantFlags[composite_of_layout_and_quadrant] & (link_quadrant_x ? 2 : 1)) == 0) ? 2 : 0; + quadrant_fullsize_y = (dung_blastwall_flag_y || (kLayoutQuadrantFlags[composite_of_layout_and_quadrant] & (link_quadrant_y ? 8 : 4)) == 0) ? 2 : 0; + if ((uint8)dung_unk2) + quadrant_fullsize_x = (uint8)dung_unk2; + if ((uint8)(dung_unk2 >> 8)) + quadrant_fullsize_y = (uint8)(dung_unk2 >> 8); +} + +void HandleEdgeTransitionMovementEast_RightBy8() { // 82b62e + link_x_coord += 8; + Dungeon_StartInterRoomTrans_Right(); +} + +void Dungeon_StartInterRoomTrans_Right() { // 82b63a + link_quadrant_x ^= 1; + Dungeon_AdjustQuadrant(); + RoomBounds_AddA(&room_bounds_x); + Dung_SaveDataForCurrentRoom(); + DungeonTransition_AdjustCamera_X(link_quadrant_x); + HandleEdgeTransition_AdjustCameraBoundaries(2); + submodule_index++; + if (!link_quadrant_x) { + RoomBounds_AddB(&room_bounds_x); + BYTE(dungeon_room_index_prev) = dungeon_room_index; + if ((link_tile_below & 0xcf) == 0x89) { + dungeon_room_index = dung_hdr_travel_destinations[4]; + Dungeon_AdjustForTeleportDoors(dungeon_room_index - 1, 1); + } else { + if ((uint8)dungeon_room_index != (uint8)dungeon_room_index2) { + BYTE(dungeon_room_index_prev) = dungeon_room_index2; + Dungeon_AdjustAfterSpiralStairs(); + } + dungeon_room_index += 1; + } + submodule_index += 1; + if (room_transitioning_flags & 1) { + link_is_on_lower_level ^= 1; + link_is_on_lower_level_mirror = link_is_on_lower_level; + } + if (room_transitioning_flags & 2) { + cur_palace_index_x2 ^= 2; + } + } + room_transitioning_flags = 0; + quadrant_fullsize_y = (dung_blastwall_flag_y || (kLayoutQuadrantFlags[composite_of_layout_and_quadrant] & (link_quadrant_y ? 8 : 4)) == 0) ? 2 : 0; +} + +void HandleEdgeTransitionMovementSouth_DownBy16() { // 82b76e + link_y_coord += 16; + Dungeon_StartInterRoomTrans_Down(); +} + +void Dung_HandleExitToOverworld() { // 82b7ae + SaveDungeonKeys(); + SaveQuadrantsToSram(); + saved_module_for_menu = 8; + main_module_index = 15; + submodule_index = 0; + subsubmodule_index = 0; + Dungeon_ResetTorchBackgroundAndPlayerInner(); +} + +void AdjustQuadrantAndCamera_right() { // 82b8bd + link_quadrant_x ^= 1; + Dungeon_AdjustQuadrant(); + RoomBounds_AddA(&room_bounds_x); + SetAndSaveVisitedQuadrantFlags(); +} + +void SetAndSaveVisitedQuadrantFlags() { // 82b8cb + dung_quadrants_visited |= kQuadrantVisitingFlags[(quadrant_fullsize_y << 2) + (quadrant_fullsize_x << 1) + link_quadrant_y + link_quadrant_x]; + save_dung_info[dungeon_room_index] |= dung_quadrants_visited; +} + +void SaveQuadrantsToSram() { // 82b8e5 + save_dung_info[dungeon_room_index] |= dung_quadrants_visited; +} + +void AdjustQuadrantAndCamera_left() { // 82b8f9 + link_quadrant_x ^= 1; + Dungeon_AdjustQuadrant(); + RoomBounds_SubA(&room_bounds_x); + SetAndSaveVisitedQuadrantFlags(); +} + +void AdjustQuadrantAndCamera_down() { // 82b909 + link_quadrant_y ^= 2; + Dungeon_AdjustQuadrant(); + RoomBounds_AddA(&room_bounds_y); + SetAndSaveVisitedQuadrantFlags(); +} + +void AdjustQuadrantAndCamera_up() { // 82b919 + link_quadrant_y ^= 2; + Dungeon_AdjustQuadrant(); + RoomBounds_SubA(&room_bounds_y); + SetAndSaveVisitedQuadrantFlags(); +} + +void Dungeon_FlagRoomData_Quadrants() { // 82b929 + dung_quadrants_visited |= kQuadrantVisitingFlags[(quadrant_fullsize_y << 2) + (quadrant_fullsize_x << 1) + link_quadrant_y + link_quadrant_x]; + Dung_SaveDataForCurrentRoom(); +} + +void Dung_SaveDataForCurrentRoom() { // 82b947 + save_dung_info[dungeon_room_index] = + (dung_savegame_state_bits >> 4) | + (dung_door_opened & 0xf000) | + dung_quadrants_visited; +} + +void HandleEdgeTransition_AdjustCameraBoundaries(uint8 arg) { // 82b9dc + static const uint16 kCameraBoundsX[] = { 127, 383, 127, 383 }; + static const uint16 kCameraBoundsY[] = { 120, 376, 136, 392 }; + overworld_screen_transition = arg; + if (link_direction & 3) { + uint8 t = link_direction & 1 ? 0 : 2; + if (link_quadrant_x) t += 1; + camera_x_coord_scroll_low = kCameraBoundsX[t]; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low + 2; + } else { + uint8 t = link_direction & 4 ? 0 : 2; + if (link_quadrant_y) t += 1; + camera_y_coord_scroll_low = kCameraBoundsY[t]; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low + 2; + } +} + +void Dungeon_AdjustQuadrant() { // 82ba27 + composite_of_layout_and_quadrant = dung_layout_and_starting_quadrant | link_quadrant_y | link_quadrant_x; +} + +void Dungeon_HandleCamera() { // 82ba31 + if (link_y_vel) { + int z = (allow_scroll_z && link_z_coord != 0xffff) ? link_z_coord : 0; + int y = ((link_y_coord - z) & 0x1ff) + 12; + int scrollamt = 1; + int y_vel_abs = sign8(link_y_vel) ? (scrollamt = -1, -(int8)link_y_vel) : link_y_vel; + do { + int qm = quadrant_fullsize_y >> 1; + if (sign8(link_y_vel)) { + if (y > camera_y_coord_scroll_low) + continue; + } else { + if (y < camera_y_coord_scroll_hi) + continue; + qm += 2; + } + if (BG2VOFS_copy2 == room_bounds_y.v[qm]) + continue; + BG2VOFS_copy2 += scrollamt; + if (dungeon_room_index == 0xffff) + continue; + + BG1VOFS_subpixel += 0x8000; + BG1VOFS_copy2 += (scrollamt >> 1) + ((BG1VOFS_subpixel & 0x8000) == 0); + camera_y_coord_scroll_low += scrollamt; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low + 2; + } while (--y_vel_abs); + } + if (link_x_vel) { + int x = (link_x_coord & 0x1ff) + 8; + int scrollamt = 1; + int x_vel_abs = sign8(link_x_vel) ? (scrollamt = -1, -(int8)link_x_vel) : link_x_vel; + do { + int qm = quadrant_fullsize_x >> 1; + if (sign8(link_x_vel)) { + if (x > camera_x_coord_scroll_low) + continue; + } else { + if (x < camera_x_coord_scroll_hi) + continue; + qm += 2; + } + if (BG2HOFS_copy2 == room_bounds_x.v[qm]) + continue; + BG2HOFS_copy2 += scrollamt; + if (dungeon_room_index == 0xffff) + continue; + BG1HOFS_subpixel += 0x8000; + BG1HOFS_copy2 += (scrollamt >> 1) + ((BG1HOFS_subpixel & 0x8000) == 0); + camera_x_coord_scroll_low += scrollamt; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low + 2; + } while (--x_vel_abs); + } + if (dungeon_room_index != 0xffff) { + if (dung_hdr_bg2_properties == 0 || dung_hdr_bg2_properties == 2 || dung_hdr_bg2_properties == 3 || dung_hdr_bg2_properties == 4 || dung_hdr_bg2_properties >= 6) { + BG1HOFS_copy2 = BG2HOFS_copy2; + BG1VOFS_copy2 = BG2VOFS_copy2; + } + } +} + +void MirrorBg1Bg2Offs() { // 82bb7b + BG1HOFS_copy2 = BG2HOFS_copy2; + BG1VOFS_copy2 = BG2VOFS_copy2; +} + +void DungeonTransition_AdjustCamera_X(uint8 arg) { // 82bdc8 + static const uint16 kUpDownScroll[4] = { 0, 256, 256, 0 }; + left_right_scroll_target = kUpDownScroll[arg * 2]; + left_right_scroll_target_end = kUpDownScroll[arg * 2 + 1]; +} + +void DungeonTransition_AdjustCamera_Y(uint8 arg) { // 82bde2 + static const uint16 kUpDownScroll[4] = { 0, 272, 256, 16 }; + up_down_scroll_target = kUpDownScroll[arg]; + up_down_scroll_target_end = kUpDownScroll[arg + 1]; +} + +void DungeonTransition_ScrollRoom() { // 82be03 + transition_counter++; + int i = overworld_screen_transition; + bg1_y_offset = bg1_x_offset = 0; + uint16 t; + + if (i >= 2) { + t = BG1HOFS_copy2 = BG2HOFS_copy2 = (BG2HOFS_copy2 + kStaircaseTab3[i]) & ~1; + if (transition_counter >= kStaircaseTab4[i]) + link_x_coord += kStaircaseTab3[i]; + } else { + t = BG1VOFS_copy2 = BG2VOFS_copy2 = (BG2VOFS_copy2 + kStaircaseTab3[i]) & ~1; + if (transition_counter >= kStaircaseTab4[i]) + link_y_coord += kStaircaseTab3[i]; + } + + if ((t & 0x1fc) == (&up_down_scroll_target)[i]) { + SetAndSaveVisitedQuadrantFlags(); + subsubmodule_index++; + transition_counter = 0; + if (submodule_index == 2) + WaterFlood_BuildOneQuadrantForVRAM(); + } + +} + +void Module07_11_0A_ScrollCamera() { // 82be75 + link_visibility_status = tagalong_var5 = 12; + int i = overworld_screen_transition; + BG1VOFS_copy2 = BG2VOFS_copy2 = (BG2VOFS_copy2 + kStaircaseTab3[i]) & ~3; + if ((BG1VOFS_copy2 & 0x1fc) == (&up_down_scroll_target)[i]) { + if (submodule_index >= 18) + i += 2; + link_y_coord += kStaircaseTab5[i]; + link_visibility_status = tagalong_var5 = 0; + subsubmodule_index++; + } +} + +void DungeonTransition_FindSubtileLanding() { // 82c110 + Dungeon_ResetTorchBackgroundAndPlayerInner(); + SubtileTransitionCalculateLanding(); + subsubmodule_index++; + save_dung_info[dungeon_room_index] |= dung_quadrants_visited; +} + +void SubtileTransitionCalculateLanding() { // 82c12c + int st = overworld_screen_transition; + int a = CalculateTransitionLanding(); + if (a == 2) + a = 1; + else if (a == 4) + a = 2; + a += overworld_screen_transition * 5; + + int8 v = kStaircaseTab2[a]; + v -= (v < 0) ? -8 : 8; + if (st & 2) + BYTE(link_x_coord) = v; + else + BYTE(link_y_coord) = v; + link_visibility_status = 0; +} + +void Dungeon_InterRoomTrans_State13() { // 82c162 + if (dung_want_lights_out | dung_want_lights_out_copy) + ApplyPaletteFilter_bounce(); + Dungeon_IntraRoomTrans_State5(); +} + +void Dungeon_IntraRoomTrans_State5() { // 82c170 + Link_HandleMovingAnimation_FullLongEntry(); + if (!DungeonTransition_MoveLinkOutDoor()) + return; + if (byte_7E004E == 2 || byte_7E004E == 4) + is_standing_in_doorway = 0; + // todo: write to tiledetect_diag_state + BYTE(force_move_any_direction) = 0; + byte_7E004E = 0; + overworld_screen_transition = 0; + subsubmodule_index++; +} + +bool DungeonTransition_MoveLinkOutDoor() { // 82c191 + uint8 x = kStaircaseTab2[byte_7E004E + overworld_screen_transition * 5]; + int r0 = overworld_screen_transition & 1 ? -2 : 2; + if ((overworld_screen_transition & 2) == 0) { + link_y_coord += r0; + return (BYTE(link_y_coord) & 0xfe) == x; + } else { + link_x_coord += r0; + return (BYTE(link_x_coord) & 0xfe) == x; + } +} + +uint8 CalculateTransitionLanding() { // 82c1e5 + int pos = ((link_y_coord + 12) & 0x1f8) << 3; + pos |= ((link_x_coord + 8) & 0x1f8) >> 3; + pos |= (link_is_on_lower_level ? 0x1000 : 0); + uint8 a = dung_bg2_attr_table[pos]; + uint8 r = (a == 0 || a == 9) ? 0 : + ((a &= 0x8e) == 0x80) ? 1 : + (a == 0x82) ? 2 : + (a == 0x84 || a == 0x88) ? 3 : + (a == 0x86) ? 4 : 2; + return byte_7E004E = r; +} + +// This gets called when entering a dungeon from ow. +void Dungeon_LoadAndDrawRoom() { // 82c57b + int bak = HDMAEN_copy; + zelda_snes_dummy_write(HDMAEN, 0); + HDMAEN_copy = 0; + Dungeon_LoadRoom(); + overworld_screen_transition = 0; + overworld_map_state = 0; + for (dung_cur_quadrant_upload = 0; dung_cur_quadrant_upload != 16; ) { + TileMapPrep_NotWaterOnTag(); + NMI_UploadTilemap(); + Dungeon_PrepareNextRoomQuadrantUpload(); + NMI_UploadTilemap(); + } + HDMAEN_copy = bak; + nmi_subroutine_index = 0; + overworld_map_state = 0; + subsubmodule_index = 0; +} + +void Dungeon_LoadEntrance() { // 82d8b3 + player_is_indoors = 1; + + if (death_var5) { + death_var5 = 0; + } else { + overworld_area_index_exit = overworld_area_index; + TM_copy_exit = WORD(TM_copy); + BG2VOFS_copy2_exit = BG2VOFS_copy2; + BG2HOFS_copy2_exit = BG2HOFS_copy2; + link_y_coord_exit = link_y_coord; + link_x_coord_exit = link_x_coord; + camera_y_coord_scroll_low_exit = camera_y_coord_scroll_low; + camera_x_coord_scroll_low_exit = camera_x_coord_scroll_low; + overworld_screen_index_exit = overworld_screen_index; + map16_load_src_off_exit = map16_load_src_off; + overworld_screen_index = 0; + overlay_index = 0; + ow_scroll_vars0_exit = ow_scroll_vars0; + up_down_scroll_target_exit = up_down_scroll_target; + up_down_scroll_target_end_exit = up_down_scroll_target_end; + left_right_scroll_target_exit = left_right_scroll_target; + left_right_scroll_target_end_exit = left_right_scroll_target_end; + overworld_unk1_exit = overworld_unk1; + overworld_unk1_neg_exit = overworld_unk1_neg; + overworld_unk3_exit = overworld_unk3; + overworld_unk3_neg_exit = overworld_unk3_neg; + byte_7EC164 = byte_7E0AA0; + main_tile_theme_index_exit = main_tile_theme_index; + aux_tile_theme_index_exit = aux_tile_theme_index; + sprite_graphics_index_exit = sprite_graphics_index; + } + bg1_y_offset = bg1_x_offset = 0; + WORD(death_var5) = 0; + if (WORD(savegame_tagalong) == 4 || WORD(death_var4)) { + int i = which_starting_point; + WORD(which_entrance) = kStartingPoint_entrance[i]; + dungeon_room_index = dungeon_room_index2 = kStartingPoint_rooms[i]; + BG1VOFS_copy = BG2VOFS_copy = BG1VOFS_copy2 = BG2VOFS_copy2 = kStartingPoint_scrollY[i]; + BG1HOFS_copy = BG2HOFS_copy = BG1HOFS_copy2 = BG2HOFS_copy2 = kStartingPoint_scrollX[i]; + if (WORD(sram_progress_indicator)) { + link_y_coord = kStartingPoint_playerY[i]; + link_x_coord = kStartingPoint_playerX[i]; + } + camera_y_coord_scroll_low = kStartingPoint_cameraY[i]; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low + 2; + camera_x_coord_scroll_low = kStartingPoint_cameraX[i]; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low + 2; + tilemap_location_calc_mask = 0x1f8; + ow_entrance_value = kStartingPoint_doorSettings[i]; + up_down_scroll_target = 0; + up_down_scroll_target_end = 0x110; + left_right_scroll_target = 0; + left_right_scroll_target_end = 0x100; + room_bounds_y.a0 = kStartingPoint_relativeCoords[i * 8 + 0] << 8; + room_bounds_y.b0 = kStartingPoint_relativeCoords[i * 8 + 1] << 8; + room_bounds_y.a1 = kStartingPoint_relativeCoords[i * 8 + 2] << 8 | 0x10; + room_bounds_y.b1 = kStartingPoint_relativeCoords[i * 8 + 3] << 8 | 0x10; + room_bounds_x.a0 = kStartingPoint_relativeCoords[i * 8 + 4] << 8; + room_bounds_x.b0 = kStartingPoint_relativeCoords[i * 8 + 5] << 8; + room_bounds_x.a1 = kStartingPoint_relativeCoords[i * 8 + 6] << 8; + room_bounds_x.b1 = kStartingPoint_relativeCoords[i * 8 + 7] << 8; + + link_direction_facing = 2; + main_tile_theme_index = kStartingPoint_blockset[i]; + dung_cur_floor = kStartingPoint_floor[i]; + BYTE(cur_palace_index_x2) = kStartingPoint_palace[i]; + is_standing_in_doorway = 0; + link_is_on_lower_level = kStartingPoint_startingBg[i] >> 4; + link_is_on_lower_level_mirror = kStartingPoint_startingBg[i] & 0xf; + quadrant_fullsize_x = kStartingPoint_quadrant1[i] >> 4; + quadrant_fullsize_y = kStartingPoint_quadrant1[i] & 0xf; + link_quadrant_x = kStartingPoint_quadrant2[i] >> 4; + link_quadrant_y = kStartingPoint_quadrant2[i] & 0xf; + + buffer_for_playing_songs = kStartingPoint_musicTrack[i]; + if (i == 0 && sram_progress_indicator == 0) + buffer_for_playing_songs = 0xff; + death_var4 = 0; + } else { + int i = which_entrance; + dungeon_room_index = dungeon_room_index2 = kEntranceData_rooms[i]; + BG1VOFS_copy = BG2VOFS_copy = BG1VOFS_copy2 = BG2VOFS_copy2 = kEntranceData_scrollY[i]; + BG1HOFS_copy = BG2HOFS_copy = BG1HOFS_copy2 = BG2HOFS_copy2 = kEntranceData_scrollX[i]; + if (WORD(sram_progress_indicator)) { + link_y_coord = kEntranceData_playerY[i]; + link_x_coord = kEntranceData_playerX[i]; + } + camera_y_coord_scroll_low = kEntranceData_cameraY[i]; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low + 2; + camera_x_coord_scroll_low = kEntranceData_cameraX[i]; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low + 2; + tilemap_location_calc_mask = 0x1f8; + ow_entrance_value = kEntranceData_doorSettings[i]; + big_rock_starting_address = 0; + up_down_scroll_target = 0; + up_down_scroll_target_end = 0x110; + left_right_scroll_target = 0; + left_right_scroll_target_end = 0x100; + + room_bounds_y.a0 = kEntranceData_relativeCoords[i * 8 + 0] << 8; + room_bounds_y.b0 = kEntranceData_relativeCoords[i * 8 + 1] << 8; + room_bounds_y.a1 = kEntranceData_relativeCoords[i * 8 + 2] << 8 | 0x10; + room_bounds_y.b1 = kEntranceData_relativeCoords[i * 8 + 3] << 8 | 0x10; + + room_bounds_x.a0 = kEntranceData_relativeCoords[i * 8 + 4] << 8; + room_bounds_x.b0 = kEntranceData_relativeCoords[i * 8 + 5] << 8; + room_bounds_x.a1 = kEntranceData_relativeCoords[i * 8 + 6] << 8; + room_bounds_x.b1 = kEntranceData_relativeCoords[i * 8 + 7] << 8; + + link_direction_facing = (i == 0 || i == 0x43) ? 2 : 0; + main_tile_theme_index = kEntranceData_blockset[i]; + buffer_for_playing_songs = kEntranceData_musicTrack[i]; + if (buffer_for_playing_songs == 3 && sram_progress_indicator >= 2) + buffer_for_playing_songs = 18; + + dung_cur_floor = kEntranceData_floor[i]; + BYTE(cur_palace_index_x2) = kEntranceData_palace[i]; + is_standing_in_doorway = kEntranceData_doorwayOrientation[i]; + link_is_on_lower_level = kEntranceData_startingBg[i] >> 4; + link_is_on_lower_level_mirror = kEntranceData_startingBg[i] & 0xf; + quadrant_fullsize_x = kEntranceData_quadrant1[i] >> 4; + quadrant_fullsize_y = kEntranceData_quadrant1[i] & 0xf; + link_quadrant_x = kEntranceData_quadrant2[i] >> 4; + link_quadrant_y = kEntranceData_quadrant2[i] & 0xf; + + if (dungeon_room_index >= 0x100) + dung_cur_floor = 0; + } + player_oam_x_offset = player_oam_y_offset = 0x80; + link_direction_mask_a = link_direction_mask_b = 0xf; + BYTE(link_z_coord) = link_actual_vel_z = 0xff; + memcpy(movable_block_datas, kMovableBlockDataInit, sizeof(kMovableBlockDataInit)); + memcpy(&movable_block_datas[99], kTorchDataInit, 116); // junk + memcpy(dung_torch_data, kTorchDataInit, sizeof(kTorchDataInit)); + memcpy(&dung_torch_data[144], kTorchDataJunk, sizeof(kTorchDataJunk)); + + memset(memorized_tile_addr, 0, 0x100); + memset(pots_revealed_in_room, 0, 0x280); + orange_blue_barrier_state = 0; + byte_7E04BC = 0; +} + +void PushBlock_Slide(uint8 j) { // 87edb5 + if (submodule_index) + return; + int i = (index_of_changable_dungeon_objs[1] - 1) * 2 == j; + pushedblocks_maybe_timeout = 9; + pushedblocks_some_index = 0; + PushBlock_ApplyVelocity(i); + int y = (uint8)pushedblocks_y_lo[i] | (uint8)pushedblocks_y_hi[i] << 8; + int x = (uint8)pushedblocks_x_lo[i] | (uint8)pushedblocks_x_hi[i] << 8; + PushBlock_HandleCollision(i, x, y); +} + +void PushBlock_HandleFalling(uint8 y) { // 87edf9 + y >>= 1; + + if (!sign8(--pushedblocks_maybe_timeout)) + return; + + pushedblocks_maybe_timeout = 9; + + if (++pushedblocks_some_index == 4) { + BYTE(dung_replacement_tile_state[y]) = 0; + pushedblocks_some_index = 0; + int i = (index_of_changable_dungeon_objs[1] - 1) == y; + index_of_changable_dungeon_objs[i] = 0; + } +} + +void PushBlock_ApplyVelocity(uint8 i) { // 87ee35 + static const uint8 kPushedBlockDirMask[] = { 0x8, 0x4, 0x2, 0x1 }; + uint8 m = kPushedBlockDirMask[(uint8)pushedblock_facing[i] >> 1]; + uint32 o; + link_actual_vel_x = link_actual_vel_y = 0; + if (m & 3) { + int8 vel = (m & 2) ? -12 : 12; + link_actual_vel_x = vel; + o = (pushedblocks_subpixel[i] | pushedblocks_x_lo[i] << 8 | pushedblocks_x_hi[i] << 16) + vel * 16; + pushedblocks_subpixel[i] = (uint8)o; + pushedblocks_x_lo[i] = (uint8)(o >> 8); + pushedblocks_x_hi[i] = (uint8)(o >> 16); + } else { + int8 vel = (m & 8) ? -12 : 12; + link_actual_vel_y = vel; + o = (pushedblocks_subpixel[i] | pushedblocks_y_lo[i] << 8 | pushedblocks_y_hi[i] << 16); + o += vel * 16; + pushedblocks_subpixel[i] = (uint8)o; + pushedblocks_y_lo[i] = (uint8)(o >> 8); + pushedblocks_y_hi[i] = (uint8)(o >> 16); + } + if (((o >> 8) & 0xf) == (uint8)pushedblocks_target[i]) { + int j = index_of_changable_dungeon_objs[i] - 1; + dung_replacement_tile_state[j]++; + link_cant_change_direction &= ~0x4; + bitmask_of_dragstate &= ~0x4; + } + uint16 x = pushedblocks_x_lo[i] | pushedblocks_x_hi[i] << 8; + uint16 y = pushedblocks_y_lo[i] | pushedblocks_y_hi[i] << 8; + for (int j = 15; j >= 0; j--) { + if (sprite_state[j] >= 9) { + uint16 sx = sprite_x_lo[j] | sprite_x_hi[j] << 8; + uint16 sy = sprite_y_lo[j] | sprite_y_hi[j] << 8; + if ((uint16)(x - sx + 0x10) < 0x20 && (uint16)(y - sy + 0x10) < 0x20) { + sprite_F[j] = 8; + static const uint8 kPushBlockTab1[] = { 0x0, 0x0, 0xe0, 0x20 }; + static const uint8 kPushBlockTab2[] = { 0xe0, 0x20, 0x0, 0x0 }; + int k = (uint8)pushedblock_facing[i] >> 1; + sprite_x_recoil[j] = kPushBlockTab1[k]; + sprite_y_recoil[j] = kPushBlockTab2[k]; + } + } + } +} + +void PushBlock_HandleCollision(uint8 i, uint16 x, uint16 y) { // 87efb9 + static const uint8 kPushBlock_A[] = { 0, 0, 8, 8 }; + static const uint8 kPushBlock_B[] = { 15, 15, 23, 23 }; + static const uint8 kPushBlock_D[] = { 15, 15, 15, 15 }; + static const uint8 kPushBlock_C[] = { 0x0, 0x0, 0x0, 0x0 }; + static const uint8 kPushBlock_E[] = { 8, 24, 0, 16 }; + static const uint8 kPushBlock_F[] = { 15, 0, 15, 0 }; + + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_hi = link_x_coord >> 8; + + int dir = 3; + uint8 m = link_direction & 0xf; + while (!(m & 1)) { + m >>= 1; + if (--dir < 0) + return; + } + int l = (dir < 2) ? link_x_coord : link_y_coord; + int o = (dir < 2) ? x : y; + + uint16 r0 = l + kPushBlock_A[dir]; + uint16 r2 = l + kPushBlock_B[dir]; + uint16 r4 = o + kPushBlock_C[dir]; + uint16 r6 = o + kPushBlock_D[dir]; + + uint16 *coord_p = (dir < 2) ? &link_y_coord : &link_x_coord; + uint16 r8 = *coord_p + kPushBlock_E[dir]; + uint16 r10 = ((dir < 2) ? y : x) + kPushBlock_F[dir]; + + bitmask_of_dragstate &= ~4; + + if (r0 >= r4 && r0 < r6 || r2 >= r4 && r2 < r6) { + if (link_direction_facing == pushedblock_facing[i]) + bitmask_of_dragstate |= index_of_changable_dungeon_objs[i] ? 4 : 1; + if (dir & 1 ? (r8 >= r10 && (uint16)(r8 - r10) < 8) : (uint16)(r8 - r10) >= 0xfff8) { + *coord_p -= r8 - r10; + (dir & 2 ? link_x_vel : link_y_vel) -= r8 - r10; + } + } + HandleIndoorCameraAndDoors(); +} + +void Sprite_Dungeon_DrawAllPushBlocks() { // 87f0ac + for (int i = 1; i >= 0; i--) + if (index_of_changable_dungeon_objs[i]) + Sprite_HandlePushedBlocks_One(i); +} + +void UsedForStraightInterRoomStaircase() { // 87f25a + int i = 9; + do { + if (ancilla_type[i] == 13) + ancilla_type[i] = 0; + } while (--i >= 0); + if (link_animation_steps >= 5) + link_animation_steps = 0; + link_subpixel_x = 0; + link_subpixel_y = 0; + some_animation_timer_steps = 0; + link_timer_push_get_tired = 28; + countdown_timer_for_staircases = 32; + link_disable_sprite_damage = 1; + Ancilla_Sfx2_Near(which_staircase_index & 4 ? 0x18 : 0x16); + + tiledetect_which_y_pos[1] = link_x_coord + (which_staircase_index & 4 ? -15 : 16); + tiledetect_which_y_pos[0] = link_y_coord; +} + +void HandleLinkOnSpiralStairs() { // 87f2c1 + link_x_coord_prev = link_x_coord; + link_y_coord_prev = link_y_coord; + if (some_animation_timer_steps) + return; + + link_give_damage = 0; + link_incapacitated_timer = 0; + link_auxiliary_state = 0; + + if (which_staircase_index & 4) { + link_actual_vel_y = -2; + if (sign8(--link_timer_push_get_tired)) { + link_timer_push_get_tired = 0; + link_actual_vel_y = 0; + link_actual_vel_x = -2; + } + } else { + link_actual_vel_y = -2; + if (sign8(--link_timer_push_get_tired)) { + link_timer_push_get_tired = 0; + link_actual_vel_y = -2; + link_actual_vel_x = 2; + } + } + LinkHop_FindArbitraryLandingSpot(); + Link_HandleMovingAnimation_StartWithDash(); + if (!link_timer_push_get_tired && sign8(--countdown_timer_for_staircases)) { + countdown_timer_for_staircases = 0; + link_direction_facing = (which_staircase_index & 4) ? 4 : 6; + } + + int8 xd = link_x_coord - tiledetect_which_y_pos[1]; + if (xd < 0) + xd = -xd; + if (xd) + return; + + RepositionLinkAfterSpiralStairs(); + if (savegame_tagalong) + Follower_Initialize(); + + tiledetect_which_y_pos[1] = link_x_coord + ((which_staircase_index & 4) ? -8 : 12); + some_animation_timer_steps = 1; + countdown_timer_for_staircases = 6; + Ancilla_Sfx2_Near(which_staircase_index & 4 ? 25 : 23); +} + +void SpiralStairs_FindLandingSpot() { // 87f391 + link_give_damage = 0; + link_incapacitated_timer = 0; + link_auxiliary_state = 0; + link_disable_sprite_damage = 0; + link_x_coord_prev = link_x_coord; + link_y_coord_prev = link_y_coord; + if (sign8(--countdown_timer_for_staircases)) { + countdown_timer_for_staircases = 0; + link_direction_facing = 2; + } + link_actual_vel_x = 4, link_actual_vel_y = 0; + if (which_staircase_index & 4) + link_actual_vel_x = -4, link_actual_vel_y = 2; + if (some_animation_timer_steps == 2) + link_actual_vel_x = 0, link_actual_vel_y = 16; + LinkHop_FindArbitraryLandingSpot(); + Link_HandleMovingAnimation_StartWithDash(); + if ((uint8)link_x_coord == (uint8)tiledetect_which_y_pos[1]) + some_animation_timer_steps = 2; +} + +void Dungeon_HandleLayerEffect() { // 8afe80 + kDungeon_Effect_Handler[dung_hdr_collision_2](); +} + +void LayerEffect_Nothing() { // 8afe87 +} + +void LayerEffect_Scroll() { // 8afe88 + if (dung_savegame_state_bits & 0x8000) { + dung_hdr_collision_2 = 0; + return; + } + dung_floor_x_vel = dung_floor_y_vel = 0; + if (dung_floor_move_flags & 1) + return; + int t = dung_some_subpixel[1] + 0x80; + dung_some_subpixel[1] = t; + t >>= 8; + if (dung_floor_move_flags & 2) + t = -t; + + if (dung_floor_move_flags < 4) { + dung_floor_x_vel = t; + dung_floor_x_offs -= t; + BG1HOFS_copy2 = BG2HOFS_copy2 + dung_floor_x_offs; + } else { + dung_floor_y_vel = t; + dung_floor_y_offs -= t; + BG1VOFS_copy2 = BG2VOFS_copy2 + dung_floor_y_offs; + } +} + +void LayerEffect_Trinexx() { // 8afeee + dung_floor_x_offs += dung_floor_x_vel; + dung_floor_y_offs += dung_floor_y_vel; + dung_floor_x_vel = 0; + dung_floor_y_vel = 0; +} + +void LayerEffect_Agahnim2() { // 8aff0d + int j = frame_counter & 0x7f; + if (j == 3 || j == 36) { + main_palette_buffer[0x6d] = 0x1d59; + main_palette_buffer[0x6e] = 0x25ff; + main_palette_buffer[0x77] = main_palette_buffer[0x6f] = 0x1a; + flag_update_cgram_in_nmi++; + } else if (j == 5 || j == 38) { + main_palette_buffer[0x6d] = aux_palette_buffer[0x6d]; + main_palette_buffer[0x6e] = aux_palette_buffer[0x6e]; + main_palette_buffer[0x77] = main_palette_buffer[0x6f] = aux_palette_buffer[0x6f]; + flag_update_cgram_in_nmi++; + } + TS_copy = 2; +} + +void LayerEffect_InvisibleFloor() { // 8aff5d + int count = 0; + for (int i = 0; i < 16; i++) + count += (dung_object_tilemap_pos[i] & 0x8000) != 0; + + uint16 x = 0x2940, y = 0x4e60; + if (count == 0) + x = y = 0; + + if (aux_palette_buffer[0x7b] != x) { + main_palette_buffer[0x7b] = aux_palette_buffer[0x7b] = x; + main_palette_buffer[0x7c] = aux_palette_buffer[0x7c] = y; + flag_update_cgram_in_nmi++; + } + TS_copy = 2; +} + +void LayerEffect_Ganon() { // 8affa4 + int count = 0; + for (int i = 0; i < 16; i++) + count += (dung_object_tilemap_pos[i] & 0x8000) != 0; + + byte_7E04C5 = count; + if (count == 0) { + TS_copy = 0; + CGADSUB_copy = 0xb3; + } else if (count == 1) { + TS_copy = 2; + CGADSUB_copy = 0x70; + } else { + TS_copy = 0; + CGADSUB_copy = 0x70; + } +} + +void LayerEffect_WaterRapids() { // 8affde + int t; + dung_some_subpixel[1] = t = dung_some_subpixel[1] + 0x80; + dung_floor_x_vel = -(t >> 8); +} + +void Dungeon_LoadCustomTileAttr() { // 8e942a + memcpy(&attributes_for_tile[0x140], &kDungAttrsForTile[kDungAttrsForTile_Offs[aux_tile_theme_index]], 0x80); +} + +void Link_CheckBunnyStatus() { // 8ffd22 + if (link_player_handler_state == kPlayerState_RecoilWall) { + link_player_handler_state = + !link_is_bunny_mirror ? kPlayerState_Ground : + link_item_moon_pearl ? kPlayerState_TempBunny : kPlayerState_PermaBunny; + } +} + +void CrystalCutscene_Initialize() { // 9ecce3 + static const uint16 kCrystalMaiden_Pal[8] = { 0, 0x3821, 0x4463, 0x54a5, 0x5ce7, 0x6d29, 0x79ad, 0x7e10 }; + + CGADSUB_copy = 0x33; + BYTE(palette_filter_countdown) = 0; + BYTE(darkening_or_lightening_screen) = 0; + Palette_AssertTranslucencySwap(); + PaletteFilter_Crystal(); + for (int i = 0; i < 8; i++) + main_palette_buffer[112 + i] = kCrystalMaiden_Pal[i]; + flag_update_cgram_in_nmi++; + CrystalCutscene_SpawnMaiden(); + CrystalCutscene_InitializePolyhedral(); +} + +void CrystalCutscene_SpawnMaiden() { // 9ecd48 + memset(sprite_state, 0, 16); + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(0, 0xab, &info); + sprite_x_hi[j] = link_x_coord >> 8; + sprite_y_hi[j] = link_y_coord >> 8; + sprite_x_lo[j] = 0x78; + sprite_y_lo[j] = 0x7c; + sprite_D[j] = 1; + sprite_oam_flags[j] = 0xb; + sprite_subtype2[j] = 0; + sprite_floor[j] = 0; + sprite_A[j] = Ancilla_TerminateSelectInteractives(j); + item_receipt_method = 0; + if (BYTE(cur_palace_index_x2) == 24) { + sprite_oam_flags[j] = 9; + savegame_tagalong = 1; + } else { + savegame_tagalong = 6; + } + LoadFollowerGraphics(); + savegame_tagalong = 0; + dung_floor_x_offs = BG2HOFS_copy2 - link_x_coord + 0x79; + dung_floor_y_offs = 0x30 - (uint8)BG1VOFS_copy2; + dung_hdr_collision_2_mirror = 1; +} + diff --git a/dungeon.h b/dungeon.h new file mode 100644 index 00000000..aed45c41 --- /dev/null +++ b/dungeon.h @@ -0,0 +1,459 @@ +#pragma once + +enum { + kDoorType_Regular = 0, + kDoorType_Regular2 = 2, + kDoorType_4 = 4, + kDoorType_EntranceDoor = 6, + kDoorType_WaterfallTunnel = 8, + kDoorType_EntranceLarge = 10, + kDoorType_EntranceLarge2 = 12, + kDoorType_EntranceCave = 14, + kDoorType_EntranceCave2 = 16, + kDoorType_ExitToOw = 18, + kDoorType_ThroneRoom = 20, + kDoorType_PlayerBgChange = 22, + kDoorType_ShuttersTwoWay = 24, + kDoorType_InvisibleDoor = 26, + kDoorType_SmallKeyDoor = 0x1c, + kDoorType_1E = 0x1e, + kDoorType_StairMaskLocked0 = 32, + kDoorType_StairMaskLocked1 = 34, + kDoorType_StairMaskLocked2 = 36, + kDoorType_StairMaskLocked3 = 38, + kDoorType_BreakableWall = 0x28, + kDoorType_LgExplosion = 48, + kDoorType_Slashable = 50, + kDoorType_36 = 0x36, + kDoorType_38 = 0x38, + + kDoorType_RegularDoor33 = 64, + kDoorType_Shutter = 68, + kDoorType_WarpRoomDoor = 70, + kDoorType_ShutterTrapUR = 72, + kDoorType_ShutterTrapDL = 74, +}; + +struct DungPalInfo { + uint8 pal0; + uint8 pal1; + uint8 pal2; + uint8 pal3; +}; + +struct RoomBounds { + union { + struct { + uint16 a0, b0, a1, b1; + }; + uint16 v[4]; + }; +}; + +#define room_bounds_y (*(RoomBounds*)(g_ram+0x600)) +#define room_bounds_x (*(RoomBounds*)(g_ram+0x608)) + +extern const uint8 kDungAnimatedTiles[24]; +uint16 *DstoPtr(uint16 d); +void Object_Fill_Nx1(int n, const uint16 *src, uint16 *dst); +void Object_Draw_5x4(const uint16 *src, uint16 *dst); +void Object_Draw_4x2_BothBgs(const uint16 *src, uint16 dsto); +void Object_ChestPlatform_Helper(const uint16 *src, int dsto); +void Object_Hole(const uint16 *src, uint16 *dst); +void LoadType1ObjectSubtype1(uint8 idx, uint16 *dst, uint16 dsto); +void Object_DrawNx3_BothBgs(int n, const uint16 *src, int dsto); +void LoadType1ObjectSubtype2(uint8 idx, uint16 *dst, uint16 dsto); +void Object_BombableFloorHelper(uint16 a, const uint16 *src, const uint16 *src_below, uint16 *dst, uint16 dsto); +void LoadType1ObjectSubtype3(uint8 idx, uint16 *dst, uint16 dsto); +void RoomBounds_AddA(RoomBounds *r); +void RoomBounds_AddB(RoomBounds *r); +void RoomBounds_SubB(RoomBounds *r); +void RoomBounds_SubA(RoomBounds *r); +void Dungeon_StartInterRoomTrans_Left(); +void Dung_StartInterRoomTrans_Left_Plus(); +void Dungeon_StartInterRoomTrans_Up(); +void Dungeon_StartInterRoomTrans_Down(); +void Dungeon_Store2x2(uint16 pos, uint16 t0, uint16 t1, uint16 t2, uint16 t3, uint8 attr); +uint16 Dungeon_MapVramAddr(uint16 pos); +uint16 Dungeon_MapVramAddrNoSwap(uint16 pos); +void Door_Up_EntranceDoor(uint16 dsto); +void Door_Down_EntranceDoor(uint16 dsto); +void Door_Left_EntranceDoor(uint16 dsto); +void Door_Right_EntranceDoor(uint16 dsto); +void Door_Draw_Helper4(uint8 door_type, uint16 dsto); +const uint16 *GetRoomDoorInfo(int room); +const uint8 *GetRoomHeaderPtr(int room); +const uint8 *GetDefaultRoomLayout(int i); +const uint8 *GetDungeonRoomLayout(int i); +void Dung_TagRoutine_0x22_0x3B(int k, uint8 j); +void Sprite_HandlePushedBlocks_One(int i); +void Object_Draw_DoorLeft_3x4(uint16 src, int door); +void Object_Draw_DoorRight_3x4(uint16 src, int door); +void Dungeon_OpeningLockedDoor_Combined(bool skip_anim); +const DungPalInfo *GetDungPalInfo(int idx); +uint16 Dungeon_GetTeleMsg(int room); +uint8 GetEntranceMusicTrack(int entrance); +bool Dungeon_IsPitThatHurtsPlayer(); +void Dungeon_PrepareNextRoomQuadrantUpload(); +void WaterFlood_BuildOneQuadrantForVRAM(); +void TileMapPrep_NotWaterOnTag(); +void OrientLampLightCone(); +void PrepareDungeonExitFromBossFight(); +void SavePalaceDeaths(); +void Dungeon_LoadRoom(); +void RoomDraw_DrawAllObjects(const uint8 *level_data); +void RoomData_DrawObject_Door(uint16 a); +void RoomData_DrawObject(uint16 r0, const uint8 *level_data); +void RoomDraw_DrawFloors(const uint8 *level_data); +void RoomDraw_FloorChunks(const uint16 *src); +void RoomDraw_A_Many32x32Blocks(int n, const uint16 *src, uint16 *dst); +void RoomDraw_1x3_rightwards(int n, const uint16 *src, uint16 *dst); +bool RoomDraw_CheckIfWallIsMoved(); +void MovingWall_FillReplacementBuffer(int dsto); +void Object_Table_Helper(const uint16 *src, uint16 *dst); +void DrawWaterThing(uint16 *dst, const uint16 *src); +void RoomDraw_4x4(const uint16 *src, uint16 *dst); +void RoomDraw_Object_Nx4(int n, const uint16 *src, uint16 *dst); +void Object_DrawNx4_BothBgs(int n, const uint16 *src, int dsto); +void RoomDraw_Rightwards2x2(const uint16 *src, uint16 *dst); +void Object_Draw_3x2(const uint16 *src, uint16 *dst); +void RoomDraw_WaterHoldingObject(int n, const uint16 *src, uint16 *dst); +void RoomDraw_SomeBigDecors(int n, const uint16 *src, uint16 dsto); +void RoomDraw_SingleLampCone(uint16 a, uint16 y); +void RoomDraw_AgahnimsWindows(uint16 dsto); +void RoomDraw_FortuneTellerRoom(uint16 dsto); +void Object_Draw8x8(const uint16 *src, uint16 *dst); +void RoomDraw_Door_North(int type, int pos_enum); +void Door_Up_StairMaskLocked(uint8 door_type, uint16 dsto); +void Door_PrioritizeCurDoor(); +void RoomDraw_NormalRangedDoors_North(uint8 door_type, uint16 dsto, int pos_enum); +void RoomDraw_OneSidedShutters_North(uint8 door_type, uint16 dsto); +void RoomDraw_Door_South(int type, int pos_enum); +void RoomDraw_CheckIfLowerLayerDoors_Y(uint8 door_type, uint16 dsto); +void RoomDraw_Door_West(int type, int pos_enum); +void RoomDraw_NormalRangedDoors_West(uint8 door_type, uint16 dsto, int pos_enum); +void RoomDraw_Door_East(int type, int pos_enum); +void RoomDraw_NormalRangedDoors_East(uint8 door_type, uint16 dsto); +void RoomDraw_OneSidedShutters_East(uint8 door_type, uint16 dsto); +void RoomDraw_NorthCurtainDoor(uint16 dsto); +void RoomDraw_Door_ExplodingWall(int pos_enum); +void RoomDraw_ExplodingWallSegment(const uint16 *src, uint16 dsto); +void RoomDraw_ExplodingWallColumn(const uint16 *src, uint16 *dst); +void RoomDraw_HighRangeDoor_North(uint8 door_type, uint16 dsto, int pos_enum); +void RoomDraw_OneSidedLowerShutters_South(uint8 door_type, uint16 dsto); +void RoomDraw_HighRangeDoor_West(uint8 door_type, uint16 dsto, int pos_enum); +void RoomDraw_OneSidedLowerShutters_East(uint8 door_type, uint16 dsto); +void RoomDraw_MakeDoorHighPriority_North(uint16 dsto); +void RoomDraw_MakeDoorHighPriority_South(uint16 dsto); +void RoomDraw_MakeDoorHighPriority_West(uint16 dsto); +void RoomDraw_MakeDoorHighPriority_East(uint16 dsto); +void RoomDraw_MarkDungeonToggleDoor(uint16 dsto); +void RoomDraw_MarkLayerToggleDoor(uint16 dsto); +void RoomDraw_GetObjectSize_1to16(); +void Object_SizeAtoAplus15(uint8 a); +void RoomDraw_GetObjectSize_1to15or26(); +void RoomDraw_GetObjectSize_1to15or32(); +int RoomDraw_FlagDoorsAndGetFinalType(uint8 direction, uint8 door_type, uint16 dsto); +void RoomDraw_MakeDoorPartsHighPriority_Y(uint16 dsto); +void RoomDraw_MakeDoorPartsHighPriority_X(uint16 dsto); +void RoomDraw_Downwards4x2VariableSpacing(int increment, const uint16 *src, uint16 *dst); +uint16 *RoomDraw_DrawObject2x2and1(const uint16 *src, uint16 *dst); +uint16 *RoomDraw_RightwardShelfEnd(const uint16 *src, uint16 *dst); +uint16 *RoomDraw_RightwardBarSegment(const uint16 *src, uint16 *dst); +void DrawBigGraySegment(uint16 a, const uint16 *src, uint16 *dst, uint16 dsto); +void RoomDraw_SinglePot(const uint16 *src, uint16 *dst, uint16 dsto); +void RoomDraw_BombableFloor(const uint16 *src, uint16 *dst, uint16 dsto); +void RoomDraw_HammerPegSingle(const uint16 *src, uint16 *dst, uint16 dsto); +void DrawObjects_PushableBlock(uint16 dsto_x2, uint16 slot); +void DrawObjects_LightableTorch(uint16 dsto_x2, uint16 slot); +void Dungeon_LoadHeader(); +void Dungeon_CheckAdjacentRoomsForOpenDoors(int idx, int room); +void Dungeon_LoadAdjacentRoomDoors(int room); +void Dungeon_LoadAttribute_Selectable(); +void Dungeon_LoadAttributeTable(); +void Dungeon_LoadBasicAttribute_full(uint16 loops); +void Dungeon_LoadObjectAttribute(); +void Dungeon_LoadDoorAttribute(); +void Dungeon_LoadSingleDoorAttribute(int k); +void Door_LoadBlastWallAttr(int k); +void ChangeDoorToSwitch(); +void Dungeon_FlipCrystalPegAttribute(); +void Dungeon_HandleRoomTags(); +void Dung_TagRoutine_0x00(int k); +void Dungeon_DetectStaircase(); +void RoomTag_NorthWestTrigger(int k); +void Dung_TagRoutine_0x2A(int k); +void Dung_TagRoutine_0x2B(int k); +void Dung_TagRoutine_0x2C(int k); +void Dung_TagRoutine_0x2D(int k); +void Dung_TagRoutine_0x2E(int k); +void Dung_TagRoutine_0x2F(int k); +void Dung_TagRoutine_0x30(int k); +void RoomTag_QuadrantTrigger(int k); +void Dung_TagRoutine_TrapdoorsUp(); +void RoomTag_RoomTrigger(int k); +void RoomTag_RekillableBoss(int k); +void RoomTag_RoomTrigger_BlockDoor(int k); +void RoomTag_PrizeTriggerDoorDoor(int k); +void RoomTag_SwitchTrigger_HoldDoor(int k); +void RoomTag_SwitchTrigger_ToggleDoor(int k); +void PushPressurePlate(uint8 attr); +void RoomTag_TorchPuzzleDoor(int k); +void RoomTag_Switch_ExplodingWall(int k); +void RoomTag_PullSwitchExplodingWall(int k); +void Dung_TagRoutine_BlastWallStuff(int k); +void RoomTag_GetHeartForPrize(int k); +void RoomTag_Agahnim(int k); +void RoomTag_GanonDoor(int tagidx); +void RoomTag_KillRoomBlock(int k); +void RoomTag_PushBlockForChest(int k); +void RoomTag_TriggerChest(int k); +void RoomTag_OperateChestReveal(int k); +void RoomTag_TorchPuzzleChest(int k); +void RoomTag_MovingWall_East(int k); +void RoomTag_MovingWallShakeItUp(int k); +void RoomTag_MovingWall_West(int k); +void RoomTag_MovingWallTorchesCheck(int k); +int MovingWall_MoveALittle(); +int RoomTag_AdvanceGiganticWall(int k); +void RoomTag_WaterOff(int k); +void RoomTag_WaterOn(int k); +void RoomTag_WaterGate(int k); +void Dung_TagRoutine_0x1B(int k); +void RoomTag_Holes0(int k); +void Dung_TagRoutine_0x23(int k); +void Dung_TagRoutine_0x34(int k); +void Dung_TagRoutine_0x35(int k); +void Dung_TagRoutine_0x36(int k); +void Dung_TagRoutine_0x37(int k); +void Dung_TagRoutine_0x39(int k); +void Dung_TagRoutine_0x3A(int k); +void Dung_TagRoutine_Func2(uint8 av); +void RoomTag_ChestHoles0(int k); +void Dung_TagRoutine_0x3B(int k); +void RoomTag_Holes2(int k); +void RoomTag_OperateWaterFlooring(); +bool RoomTag_MaybeCheckShutters(uint8 *attr_out); +int RoomTag_GetTilemapCoords(); +bool RoomTag_CheckForPressedSwitch(uint8 *y_out); +void Dungeon_ProcessTorchesAndDoors(); +void Bomb_CheckForDestructibles(uint16 x, uint16 y, uint8 r14); +int DrawDoorOpening_Step1(int door, int dma_ptr); +void DrawShutterDoorSteps(int door); +void DrawEyeWatchDoor(int door); +void Door_BlastWallExploding_Draw(int dsto); +void OperateShutterDoors(); +void OpenCrackedDoor(); +void Dungeon_LoadToggleDoorAttr_OtherEntry(int door); +void Dungeon_LoadSingleDoorTileAttribute(); +void DrawCompletelyOpenDoor(); +void Dungeon_ClearAwayExplodingWall(); +uint16 Dungeon_CheckForAndIDLiftableTile(); +void Dungeon_PushBlock_Handler(); +void RoomDraw_16x16Single(uint8 index); +void PushBlock_CheckForPit(uint8 y); +uint8 Dungeon_LiftAndReplaceLiftable(Point16U *pt); +uint8 ThievesAttic_DrawLightenedHole(uint16 pos6, uint16 a, Point16U *pt); +uint8 HandleItemTileAction_Dungeon(uint16 x, uint16 y); +void ManipBlock_Something(Point16U *pt); +void RevealPotItem(uint16 pos6, uint16 pos4); +void Dungeon_UpdateTileMapWithCommonTile(int x, int y, uint8 v); +void Dungeon_PrepSpriteInducedDma(int x, int y, uint8 v); +void Dungeon_DeleteRupeeTile(uint16 x, uint16 y); +uint8 OpenChestForItem(uint8 tile, int *chest_position); +void OpenBigChest(uint16 loc, int *chest_position); +uint8 OpenMiniGameChest(int *chest_position); +uint16 RoomTag_BuildChestStripes(uint16 pos, uint16 y); +void Dungeon_SetAttrForActivatedWaterOff(); +void Dungeon_FloodSwampWater_PrepTileMap(); +void Dungeon_AdjustWaterVomit(const uint16 *src, int depth); +void Dungeon_SetAttrForActivatedWater(); +void FloodDam_Expand(); +void FloodDam_PrepTiles_init(); +void Watergate_Main_State1(); +void FloodDam_Fill(); +void Ganon_ExtinguishTorch_adjust_translucency(); +void Ganon_ExtinguishTorch(); +void Dungeon_ExtinguishTorch(); +void SpiralStairs_MakeNearbyWallsHighPriority_Entering(); +void SpiralStairs_MakeNearbyWallsLowPriority(); +void ClearAndStripeExplodingWall(uint16 dsto); +void Dungeon_DrawRoomOverlay(const uint8 *src); +void GetDoorDrawDataIndex_North_clean_door_index(int door); +int DoorDoorStep1_North(int door, int dma_ptr); +void GetDoorDrawDataIndex_North(int door, int r4_door); +void DrawDoorToTileMap_North(int door, int r4_door); +void Object_Draw_DoorUp_4x3(uint16 src, int door); +void GetDoorDrawDataIndex_South_clean_door_index(int door); +int DoorDoorStep1_South(int door, int dma_ptr); +void GetDoorDrawDataIndex_South(int door, int r4_door); +void DrawDoorToTileMap_South(int door, int r4_door); +void Object_Draw_DoorDown_4x3(uint16 src, int door); +void GetDoorDrawDataIndex_West_clean_door_index(int door); +int DoorDoorStep1_West(int door, int dma_ptr); +void GetDoorDrawDataIndex_West(int door, int r4_door); +void DrawDoorToTileMap_West(int door, int r4_door); +void GetDoorDrawDataIndex_East_clean_door_index(int door); +int DoorDoorStep1_East(int door, int dma_ptr); +void GetDoorDrawDataIndex_East(int door, int r4_door); +void DrawDoorToTileMap_East(int door, int r4_door); +uint8 GetDoorGraphicsIndex(int door, int r4_door); +void ClearExplodingWallFromTileMap_ClearOnePair(uint16 *dst, const uint16 *src); +void Dungeon_DrawRoomOverlay_Apply(int p); +void ApplyGrayscaleFixed_Incremental(); +void Dungeon_ApproachFixedColor_variable(uint8 a); +void Module_PreDungeon(); +void Module_PreDungeon_setAmbientSfx(); +void LoadOWMusicIfNeeded(); +void Module07_Dungeon(); +void Dungeon_TryScreenEdgeTransition(); +void Dungeon_HandleEdgeTransitionMovement(int dir); +void Module07_00_PlayerControl(); +void Module07_01_SubtileTransition(); +void DungeonTransition_Subtile_ResetShutters(); +void DungeonTransition_Subtile_PrepTransition(); +void DungeonTransition_Subtile_ApplyFilter(); +void DungeonTransition_Subtile_TriggerShutters(); +void Module07_02_SupertileTransition(); +void Module07_02_00_InitializeTransition(); +void Module07_02_01_LoadNextRoom(); +void Dungeon_InterRoomTrans_State3(); +void Dungeon_InterRoomTrans_State10(); +void Dungeon_SpiralStaircase11(); +void Dungeon_InterRoomTrans_notDarkRoom(); +void Dungeon_InterRoomTrans_State9(); +void Dungeon_SpiralStaircase12(); +void Dungeon_InterRoomTrans_State4(); +void Dungeon_InterRoomTrans_State12(); +void Dungeon_Staircase14(); +void Dungeon_ResetTorchBackgroundAndPlayer(); +void Dungeon_ResetTorchBackgroundAndPlayerInner(); +void Dungeon_InterRoomTrans_State7(); +void DungeonTransition_RunFiltering(); +void Module07_02_FadedFilter(); +void Dungeon_InterRoomTrans_State15(); +void Dungeon_PlayMusicIfDefeated(); +void Module07_03_OverlayChange(); +void Module07_04_UnlockDoor(); +void Module07_05_ControlShutters(); +void Module07_06_FatInterRoomStairs(); +void Module07_0E_01_HandleMusicAndResetProps(); +void ResetTransitionPropsAndAdvance_ResetInterface(); +void ResetTransitionPropsAndAdvanceSubmodule(); +void Dungeon_InitializeRoomFromSpecial(); +void DungeonTransition_LoadSpriteGFX(); +void DungeonTransition_AdjustForFatStairScroll(); +void ResetThenCacheRoomEntryProperties(); +void DungeonTransition_TriggerBGC34UpdateAndAdvance(); +void DungeonTransition_TriggerBGC56UpdateAndAdvance(); +void Module07_07_FallingTransition(); +void Module07_07_00_HandleMusicAndResetRoom(); +void Module07_07_06_SyncBG1and2(); +void Module07_07_0F_FallingFadeIn(); +void Dungeon_PlayBlipAndCacheQuadrantVisits(); +void Module07_07_10_LandLinkFromFalling(); +void Module07_07_11_CacheRoomAndSetMusic(); +void Module07_08_NorthIntraRoomStairs(); +void Module07_08_00_InitStairs(); +void Module07_08_01_ClimbStairs(); +void Module07_10_SouthIntraRoomStairs(); +void Module07_10_00_InitStairs(); +void Module07_10_01_ClimbStairs(); +void Module07_09_OpenCrackedDoor(); +void Module07_0A_ChangeBrightness(); +void Module07_0B_DrainSwampPool(); +void Module07_0C_FloodSwampWater(); +void Module07_0D_FloodDam(); +void Module07_0E_SpiralStairs(); +void Dungeon_DoubleApplyAndIncrementGrayscale(); +void Module07_0E_02_ApplyFilterIf(); +void Dungeon_SyncBackgroundsFromSpiralStairs(); +void Dungeon_AdvanceThenSetBossMusicUnorthodox(); +void Dungeon_SetBossMusicUnorthodox(); +void Dungeon_SpiralStaircase17(); +void Dungeon_SpiralStaircase18(); +void Module07_0E_00_InitPriorityAndScreens(); +void Module07_0E_13_SetRoomAndLayerAndCache(); +void RepositionLinkAfterSpiralStairs(); +void SpiralStairs_MakeNearbyWallsHighPriority_Exiting(); +void Module07_0F_LandingWipe(); +void Module07_0F_00_InitSpotlight(); +void Module07_0F_01_OperateSpotlight(); +void Module07_11_StraightInterroomStairs(); +void Module07_11_00_PrepAndReset(); +void Module07_11_01_FadeOut(); +void Module07_11_02_LoadAndPrepRoom(); +void Module07_11_03_FilterAndLoadBGChars(); +void Module07_11_04_FilterDoBGAndResetSprites(); +void Module07_11_0B_PrepDestination(); +void Module07_11_09_LoadSpriteGraphics(); +void Module07_11_19_SetSongAndFilter(); +void Module07_11_11_KeepSliding(); +void Module07_14_RecoverFromFall(); +void Module07_14_00_ScrollCamera(); +void Module07_15_WarpPad(); +void Module07_15_01_ApplyMosaicAndFilter(); +void Module07_15_04_SyncRoomPropsAndBuildOverlay(); +void Module07_15_0E_FadeInFromWarp(); +void Module07_15_0F_FinalizeAndCacheEntry(); +void Module07_16_UpdatePegs(); +void Module07_17_PressurePlate(); +void Module07_18_RescuedMaiden(); +void Module07_19_MirrorFade(); +void Module07_1A_RoomDraw_OpenTriforceDoor_bounce(); +void Module11_DungeonFallingEntrance(); +void Module11_02_LoadEntrance(); +void Dungeon_LoadSongBankIfNeeded(); +void Mirror_SaveRoomData(); +void SaveDungeonKeys(); +void Dungeon_AdjustAfterSpiralStairs(); +void Dungeon_AdjustForTeleportDoors(uint8 room, uint8 flag); +void Dungeon_AdjustForRoomLayout(); +void HandleEdgeTransitionMovementEast_RightBy8(); +void Dungeon_StartInterRoomTrans_Right(); +void HandleEdgeTransitionMovementSouth_DownBy16(); +void Dung_HandleExitToOverworld(); +void AdjustQuadrantAndCamera_right(); +void SetAndSaveVisitedQuadrantFlags(); +void SaveQuadrantsToSram(); +void AdjustQuadrantAndCamera_left(); +void AdjustQuadrantAndCamera_down(); +void AdjustQuadrantAndCamera_up(); +void Dungeon_FlagRoomData_Quadrants(); +void Dung_SaveDataForCurrentRoom(); +void HandleEdgeTransition_AdjustCameraBoundaries(uint8 arg); +void Dungeon_AdjustQuadrant(); +void Dungeon_HandleCamera(); +void MirrorBg1Bg2Offs(); +void DungeonTransition_AdjustCamera_X(uint8 arg); +void DungeonTransition_AdjustCamera_Y(uint8 arg); +void DungeonTransition_ScrollRoom(); +void Module07_11_0A_ScrollCamera(); +void DungeonTransition_FindSubtileLanding(); +void SubtileTransitionCalculateLanding(); +void Dungeon_InterRoomTrans_State13(); +void Dungeon_IntraRoomTrans_State5(); +bool DungeonTransition_MoveLinkOutDoor(); +uint8 CalculateTransitionLanding(); +void Dungeon_LoadAndDrawRoom(); +void Dungeon_LoadEntrance(); +void PushBlock_Slide(uint8 j); +void PushBlock_HandleFalling(uint8 y); +void PushBlock_ApplyVelocity(uint8 i); +void PushBlock_HandleCollision(uint8 i, uint16 x, uint16 y); +void Sprite_Dungeon_DrawAllPushBlocks(); +void UsedForStraightInterRoomStaircase(); +void HandleLinkOnSpiralStairs(); +void SpiralStairs_FindLandingSpot(); +void Dungeon_HandleLayerEffect(); +void LayerEffect_Nothing(); +void LayerEffect_Scroll(); +void LayerEffect_Trinexx(); +void LayerEffect_Agahnim2(); +void LayerEffect_InvisibleFloor(); +void LayerEffect_Ganon(); +void LayerEffect_WaterRapids(); +void Dungeon_LoadCustomTileAttr(); +void Link_CheckBunnyStatus(); +void CrystalCutscene_Initialize(); +void CrystalCutscene_SpawnMaiden(); diff --git a/ending.cpp b/ending.cpp new file mode 100644 index 00000000..0d4a257f --- /dev/null +++ b/ending.cpp @@ -0,0 +1,2608 @@ +#include "zelda_rtl.h" +#include "variables.h" +#include "load_gfx.h" +#include "dungeon.h" +#include "sprite.h" +#include "ending.h" +#include "overworld.h" +#include "player.h" +#include "misc.h" +#include "messaging.h" +#include "player_oam.h" +#include "tables/generated_ending.h" +#include "sprite_main.h" + +static const uint16 kPolyhedralPalette[8] = { 0, 0x14d, 0x1b0, 0x1f3, 0x256, 0x279, 0x2fd, 0x35f }; + +#define ending_which_dung (*(uint16*)(g_ram+0xcc)) +#define kPolyThreadRam (g_ram + 0x1f00) +static const int8 kIntroSprite0_Xvel[3] = { 1, 0, -1 }; +static const int8 kIntroSprite0_Yvel[3] = { -1, 1, -1 }; +static const uint8 kIntroSprite3_X[4] = { 0xc2, 0x98, 0x6f, 0x34 }; +static const uint8 kIntroSprite3_Y[4] = { 0x7c, 0x54, 0x7c, 0x57 }; +static const uint8 kIntroSprite3_State[8] = { 0, 1, 2, 3, 2, 1, 0xff, 0xff }; +static const uint8 kTriforce_Xfinal[3] = { 0x59, 0x5f, 0x67 }; +static const uint8 kTriforce_Yfinal[3] = { 0x74, 0x68, 0x74 }; +static const uint16 kEndingSprites_X[] = { + 0x1e0, 0x200, 0x1ed, 0x203, 0x1da, 0x216, 0x1c8, 0x228, 0x1c0, 0x1e0, 0x208, 0x228, + 0xf8, 0xf0, + 0x278, 0x298, 0x1e0, 0x200, 0x220, 0x288, 0x1e2, + 0xe0, 0x150, 0xe8, 0x168, 0x128, 0x170, 0x170, + 0x335, 0x335, 0x300, + 0xb8, 0xce, 0xac, 0xc4, + 0x3b0, 0x390, 0x3d0, + 0xf8, 0xc8, + 0x80, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xe8, 0xf8, 0xd8, 0xf8, 0xc8, 0x108, + 0x70, 0x70, 0x70, 0x68, 0x88, 0x70, + 0x40, 0x70, 0x4f, 0x61, 0x37, 0x79, + 0xc8, 0x278, 0x258, 0x1d8, 0x1c8, 0x188, 0x270, + 0x180, + 0x2e8, 0x270, 0x270, 0x2a0, 0x2a0, 0x2a4, 0x2fc, + 0x76, 0x73, 0x76, 0x0, 0xd0, 0x80, +}; +static const uint16 kEndingSprites_Y[] = { + 0x158, 0x158, 0x138, 0x138, 0x140, 0x140, 0x150, 0x150, 0x120, 0x120, 0x120, 0x120, + 0x60, 0x37, + 0xc2, 0xc2, 0x16b, 0x16c, 0x16b, 0xb8, 0x16b, + 0x80, 0x60, 0x146, 0x146, 0x1c6, 0x70, 0x70, + 0x128, 0x128, 0x16f, + 0xf5, 0xfc, 0x10d, 0x10d, + 0x40, 0x40, 0x40, + 0x150, 0x158, + 0xf4, + 0x120, 0x120, 0x120, 0x120, 0x120, 0x108, 0x100, 0xd8, 0xd8, 0xf0, 0xf0, + 0x3c, 0x3c, 0x3c, 0x90, 0x80, 0x3c, + 0x16c, 0x16c, 0x174, 0x174, 0x175, 0x175, + 0x250, 0x2b0, 0x2b0, 0x2a0, 0x2b0, 0x2b0, 0x2b8, + 0xd8, + 0x24b, 0x1b0, 0x1c8, 0x1c8, 0x1b0, 0x230, 0x230, + 0x8b, 0x83, 0x85, 0x2c, 0xf8, 0x100, +}; +static const uint8 kEndingSprites_Idx[17] = { + 0, 12, 14, 21, 28, 31, 35, 38, 40, 41, 52, 58, 64, 71, 72, 79, 85 +}; +static PlayerHandlerFunc *const kEndSequence0_Funcs[3] = { +&Credits_LoadScene_Overworld_PrepGFX, +&Credits_LoadScene_Overworld_Overlay, +&Credits_LoadScene_Overworld_LoadMap, +}; +static PrepOamCoordsRet g_ending_coords; +static const uint16 kEnding1_TargetScrollY[16] = { 0x6f2, 0x210, 0x72c, 0xc00, 0x10c, 0xa9b, 0x10, 0x510, 0x89, 0xa8e, 0x222c, 0x2510, 0x826, 0x5c, 0x20a, 0x30 }; +static const uint16 kEnding1_TargetScrollX[16] = { 0x77f, 0x480, 0x193, 0xaa, 0x878, 0x847, 0x4fd, 0xc57, 0x40f, 0x478, 0xa00, 0x200, 0x201, 0xaa1, 0x26f, 0 }; +static const int8 kEnding1_Yvel[16] = { -1, -1, 1, -1, 1, 1, 0, 1, 0, -1, -1, 0, 0, 0, 1, -1 }; +static const int8 kEnding1_Xvel[16] = { 0, 0, -1, 0, 0, -1, 1, 0, -1, 0, 0, 0, 1, -1, 1, 0 }; +static PlayerHandlerFunc *const kEndSequence_Funcs[39] = { +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Dungeon, +&Credits_ScrollScene_Dungeon, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Dungeon, +&Credits_ScrollScene_Dungeon, +&Credits_LoadNextScene_Dungeon, +&Credits_ScrollScene_Dungeon, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&Credits_LoadNextScene_Overworld, +&Credits_ScrollScene_Overworld, +&EndSequence_32, +&Credits_BrightenTriangles, +&Credits_FadeColorAndBeginAnimating, +&Credits_StopCreditsScroll, +&Credits_FadeAndDisperseTriangles, +&Credits_FadeInTheEnd, +&Credits_HangForever, +}; +#define intro_sword_ypos WORD(g_ram[0xc8]) +#define intro_sword_18 g_ram[0xca] +#define intro_sword_19 g_ram[0xcb] +#define intro_sword_20 g_ram[0xcc] +#define intro_sword_21 g_ram[0xcd] +#define intro_sword_24 g_ram[0xd0] +static const uint16 kEnding_Tab1[16] = { + 0x1000, 2, 0x1002, 0x1012, 0x1004, 0x1006, 0x1010, 0x1014, 0x100a, + 0x1016, 0x5d, 0x64, 0x100e, 0x1008, 0x1018, 0x180 }; +static const uint8 kEnding_SpritePack[17] = { + 0x28, 0x46, 0x27, 0x2e, 0x2b, 0x2b, 0xe, 0x2c, 0x1a, 0x29, 0x47, 0x28, 0x27, 0x28, 0x2a, 0x28, 0x2d, +}; +static const uint8 kEnding_SpritePal[17] = { + 1, 0x40, 1, 4, 1, 1, 1, 0x11, 1, 1, 0x47, 0x40, 1, 1, 1, 1, 1, +}; +void Intro_SetupScreen() { // 828000 + nmi_disable_core_updates = 0x80; + EnableForceBlank(); + TM_copy = 16; + TS_copy = 0; + Intro_InitializeBackgroundSettings(); + CGWSEL_copy = 32; + zelda_ppu_write(OBSEL, 2); + load_chr_halfslot_even_odd = 20; + Graphics_LoadChrHalfSlot(); + load_chr_halfslot_even_odd = 0; + LoadOWMusicIfNeeded(); + + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write_word(VMADDL, 0x27f0); + int i = 16; + do { + zelda_ppu_write_word(VMDATAL, 0); + main_palette_buffer[144 + i] = 0x7fff; + } while (--i >= 0); + R16 = 0x1ffe; + R18 = 0x1bfe; +} + +void Intro_LoadTextPointersAndPalettes() { // 828116 + Text_GenerateMessagePointers(); + Overworld_LoadAllPalettes(); +} + +void Credits_LoadScene_Overworld_PrepGFX() { // 828604 + EnableForceBlank(); + EraseTileMaps_normal(); + CGWSEL_copy = 0x82; + int k = submodule_index >> 1; + dungeon_room_index = kEnding_Tab1[k]; + + if (k != 6 && k != 15) + LoadOverworldFromDungeon(); + else + Overworld_EnterSpecialArea(); + music_control = 0; + sound_effect_ambient = 0; + + int t = BYTE(overworld_screen_index) & ~0x40; + DecompressAnimatedOverworldTiles((t == 3 || t == 5 || t == 7) ? 0x58 : 0x5a); + + k = submodule_index >> 1; + sprite_graphics_index = kEnding_SpritePack[k]; + uint8 sprpal = kEnding_SpritePal[k]; + InitializeTilesets(); + OverworldLoadScreensPaletteSet(); + Overworld_LoadPalettes(GetOverworldBgPalette(BYTE(overworld_screen_index)), sprpal); + + hud_palette = 1; + Palette_Load_HUD(); + if (!submodule_index) + TransferFontToVRAM(); + Overworld_LoadPalettesInner(); + Overworld_SetFixedColAndScroll(); + if (BYTE(overworld_screen_index) >= 128) + Palette_SetOwBgColor(); + BGMODE_copy = 9; + subsubmodule_index++; +} + +void Credits_LoadScene_Overworld_Overlay() { // 828697 + Overworld_LoadOverlays2(); + music_control = 0; + sound_effect_ambient = 0; + submodule_index--; + subsubmodule_index++; +} + +void Credits_LoadScene_Overworld_LoadMap() { // 8286a5 + Overworld_LoadAndBuildScreen(); + Credits_PrepAndLoadSprites(); + R16 = 0; + subsubmodule_index = 0; +} + +void Credits_OperateScrollingAndTileMap() { // 8286b3 + Credits_HandleCameraScrollControl(); + if (BYTE(overworld_screen_trans_dir_bits2)) + OverworldHandleMapScroll(); +} + +void Credits_LoadCoolBackground() { // 8286c0 + main_tile_theme_index = 33; + aux_tile_theme_index = 59; + sprite_graphics_index = 45; + InitializeTilesets(); + BYTE(overworld_screen_index) = 0x5b; + Overworld_LoadPalettes(GetOverworldBgPalette(BYTE(overworld_screen_index)), 0x13); + overworld_palette_aux2_bp5to7_hi = 3; + Palette_Load_OWBG2(); + Overworld_CopyPalettesToCache(); + Overworld_LoadOverlays2(); + BG1VOFS_copy2 = 0; + BG1HOFS_copy2 = 0; + submodule_index--; +} + +void Credits_LoadScene_Dungeon() { // 8286fd + EnableForceBlank(); + EraseTileMaps_normal(); + WORD(which_entrance) = kEnding_Tab1[submodule_index >> 1]; + + Dungeon_LoadEntrance(); + dung_num_lit_torches = 0; + hdr_dungeon_dark_with_lantern = 0; + Dungeon_LoadAndDrawRoom(); + DecompressAnimatedDungeonTiles(kDungAnimatedTiles[main_tile_theme_index]); + + int i = submodule_index >> 1; + sprite_graphics_index = kEnding_SpritePack[i]; + const DungPalInfo *dpi = GetDungPalInfo(kEnding_SpritePal[i] & 0x3f); + sprite_aux1_palette = dpi->pal2; + sprite_aux2_palette = dpi->pal3; + misc_sprites_graphics_index = 10; + InitializeTilesets(); + palette_sp6 = 10; + Dungeon_LoadPalettes(); + BGMODE_copy = 9; + R16 = 0; + INIDISP_copy = 0; + submodule_index++; + Credits_PrepAndLoadSprites(); +} + +void Module19_TriforceRoom() { // 829fec + switch (subsubmodule_index) { + case 0: // + Link_ResetProperties_A(); + link_last_direction_moved_towards = 0; + music_control = 0xf1; + ResetTransitionPropsAndAdvance_ResetInterface(); + break; + case 1: // + ConditionalMosaicControl(); + ApplyPaletteFilter_bounce(); + break; + case 2: // + EnableForceBlank(); + zelda_snes_dummy_write(NMITIMEN, 0); + LoadCreditsSongs(); + zelda_snes_dummy_write(NMITIMEN, 0x81); + dungeon_room_index = 0x189; + EraseTileMaps_normal(); + Palette_RevertTranslucencySwap(); + Overworld_EnterSpecialArea(); + Overworld_LoadOverlays2(); + subsubmodule_index++; + main_module_index = 25; + submodule_index = 0; + break; + case 3: // + main_tile_theme_index = 36; + sprite_graphics_index = 125; + aux_tile_theme_index = 81; + InitializeTilesets(); + Overworld_LoadAreaPalettesEx(4); + Overworld_LoadPalettes(14, 0); + SpecialOverworld_CopyPalettesToCache(); + subsubmodule_index++; + break; + case 4: { // + uint8 bak0 = subsubmodule_index; + Module08_02_LoadAndAdvance(); + subsubmodule_index = bak0 + 1; + INIDISP_copy = 15; + palette_filter_countdown = 31; + mosaic_target_level = 0; + HIBYTE(BG1HOFS_copy2) = 1; + CGWSEL_copy = 2; + CGADSUB_copy = 50; + mosaic_level = 240; + BYTE(link_y_coord) = 236; + BYTE(link_x_coord) = 120; + link_is_on_lower_level = 2; + music_control = 32; + main_module_index = 25; + submodule_index = 0; + break; + } + case 5: // + link_direction = 8; + link_direction_last = 8; + link_direction_facing = 0; + if (BYTE(link_y_coord) < 192) { + link_direction = 0; + link_direction_last = 0; + link_animation_steps = 0; + subsubmodule_index++; + } + break; + case 6: // + if (!(palette_filter_countdown & 1) && mosaic_level != 0) + mosaic_level -= 0x10; + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 7; + ApplyPaletteFilter_bounce(); + break; + case 7: // + TriforceRoom_PrepGFXSlotForPoly(); + dialogue_message_index = 0x173; + Main_ShowTextMessage(); + RenderText(); + BYTE(R16) = 0x80; + main_module_index = 25; + subsubmodule_index++; + break; + case 8: // + case 10: // + AdvancePolyhedral(); + if (subsubmodule_index == 11) { + music_control = 33; + main_module_index = 25; + link_direction = 0; + link_direction_last = 0; + submodule_index++; + } + break; + case 9: // + AdvancePolyhedral(); + RenderText(); + if (!submodule_index) { + overworld_map_state = 0; + main_module_index = 25; + subsubmodule_index++; + } + break; + case 11: // + AdvancePolyhedral(); + TriforceRoom_LinkApproachTriforce(); + if (subsubmodule_index == 12) { + link_direction = 0; + link_direction_last = 0; + } + break; + case 12: // + AdvancePolyhedral(); + if (!--BYTE(R16)) { + Palette_AnimGetMasterSword2(); + submodule_index++; + } + break; + case 13: // + AdvancePolyhedral(); + PaletteFilter_BlindingWhiteTriforce(); + if (BYTE(darkening_or_lightening_screen) == 255) + subsubmodule_index++; + break; + case 14: // + if (!--INIDISP_copy) { + main_module_index = 26; + submodule_index = 0; + subsubmodule_index = 0; + irq_flag = 255; + is_nmi_thread_active = 0; + nmi_flag_update_polyhedral = 0; + savegame_is_darkworld = 0; + } + break; + } + BG1HOFS_copy = BG1HOFS_copy2; + BG1VOFS_copy = BG1VOFS_copy2; + BG2HOFS_copy = BG2HOFS_copy2; + BG2VOFS_copy = BG2VOFS_copy2; + if (subsubmodule_index < 7 || subsubmodule_index >= 11) { + Link_HandleVelocity(); + Link_HandleMovingAnimation_FullLongEntry(); + } + LinkOam_Main(); +} + +void Intro_InitializeBackgroundSettings() { // 82c500 + zelda_ppu_write(SETINI, 0); + BGMODE_copy = 9; + MOSAIC_copy = 0; + zelda_ppu_write(BG1SC, 0x13); + zelda_ppu_write(BG2SC, 3); + zelda_ppu_write(BG3SC, 0x63); + zelda_ppu_write(BG12NBA, 0x22); + zelda_ppu_write(BG34NBA, 7); + CGADSUB_copy = 32; + COLDATA_copy0 = 32; + COLDATA_copy1 = 64; + COLDATA_copy2 = 128; +} + +void Polyhedral_InitializeThread() { // 89f7de + static const uint8 kPolyThreadInit[13] = { 9, 0, 0x1f, 0, 0, 0, 0, 0, 0, 0x30, 0x1d, 0xf8, 9 }; + memset(kPolyThreadRam, 0, 256); + thread_other_stack = 0x1f31; + memcpy(&g_ram[0x1f32], kPolyThreadInit, 13); +} + +void Module00_Intro() { // 8cc120 + if (submodule_index >= 8 && ((filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0)) { + FadeMusicAndResetSRAMMirror(); + return; + } + switch (submodule_index) { + case 0: Intro_Init(); break; + case 1: Intro_Init_Continue(); break; + case 10: + case 2: Intro_InitializeTriforcePolyThread(); break; + case 3: + case 4: + case 9: + case 11: Intro_HandleAllTriforceAnimations(); break; + case 5: IntroZeldaFadein(); break; + case 6: Intro_SwordComingDown(); break; + case 7: Intro_FadeInBg(); break; + case 8: Intro_WaitPlayer(); break; + } +} + +void Intro_Init() { // 8cc15d + Intro_SetupScreen(); + INIDISP_copy = 15; + subsubmodule_index = 0; + flag_update_cgram_in_nmi++; + submodule_index++; + sound_effect_2 = 10; + Intro_Init_Continue(); +} + +void Intro_Init_Continue() { // 8cc170 + Intro_DisplayLogo(); + int t = subsubmodule_index++; + if (t >= 11) { + if (--INIDISP_copy) + return; + Intro_InitializeMemory_darken(); + return; + } + switch (t) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + Intro_Clear1kbBlocksOfWRAM(); + break; + case 8: Intro_LoadTextPointersAndPalettes(); break; + case 9: LoadItemGFXIntoWRAM4BPPBuffer(); break; + case 10:LoadFollowerGraphics(); break; + } +} + +void Intro_Clear1kbBlocksOfWRAM() { // 8cc1a0 + uint16 i = R16; + uint8 *dst = (uint8 *)&g_ram[0x2000]; + do { + for (int j = 0; j < 15; j++) + WORD(dst[i + j * 0x2000]) = 0; + } while ((i -= 2) != R18); + R16 = i; + R18 = i - 0x400; +} + +void Intro_InitializeMemory_darken() { // 8cc1f5 + EnableForceBlank(); + EraseTileMaps_normal(); + zelda_ppu_write(OBSEL, 2); + main_tile_theme_index = 35; + sprite_graphics_index = 125; + aux_tile_theme_index = 81; + misc_sprites_graphics_index = 8; + LoadDefaultGraphics(); + InitializeTilesets(); + DecompressAnimatedDungeonTiles(0x5d); + bg_tile_animation_countdown = 2; + BYTE(overworld_screen_index) = 0; + dung_hdr_palette_1 = 0; + overworld_palette_aux3_bp7_lo = 0; + R16 = 0; + R18 = 0; + darkening_or_lightening_screen = 2; + palette_filter_countdown = 31; + mosaic_target_level = 0; + submodule_index++; +} + +void IntroZeldaFadein() { // 8cc25c + Intro_HandleAllTriforceAnimations(); + if (!(frame_counter & 1)) + return; + Palette_FadeIntroOneStep(); + if (BYTE(palette_filter_countdown) == 0) { + subsubmodule_index = 42; + submodule_index++; + Intro_SetupSwordAndIntroFlash(); + } else if (BYTE(palette_filter_countdown) == 13) { + TM_copy = 0x15; + TS_copy = 0; + } +} + +void Intro_FadeInBg() { // 8cc284 + Intro_PeriodicSwordAndIntroFlash(); + Intro_HandleAllTriforceAnimations(); + if (BYTE(palette_filter_countdown)) { + if (frame_counter & 1) + Palette_FadeIntro2(); + } else { + if ((filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0) + FadeMusicAndResetSRAMMirror(); + else { + if (!--subsubmodule_index) + submodule_index++; + } + } +} + +void Intro_SwordComingDown() { // 8cc2ae + Intro_HandleAllTriforceAnimations(); + intro_did_run_step = 0; + is_nmi_thread_active = 0; + Intro_PeriodicSwordAndIntroFlash(); + if (!--subsubmodule_index) { + submodule_index++; + CGWSEL_copy = 2; + CGADSUB_copy = 0x22; + palette_filter_countdown = 31; + TS_copy = 2; + } +} + +void Intro_WaitPlayer() { // 8cc2d4 + Intro_HandleAllTriforceAnimations(); + intro_did_run_step = 0; + is_nmi_thread_active = 0; + Intro_PeriodicSwordAndIntroFlash(); + if (!--subsubmodule_index) { + submodule_index++; + main_module_index = 20; + submodule_index = 0; + BYTE(link_x_coord) = 0; + } +} + +void FadeMusicAndResetSRAMMirror() { // 8cc2f0 + irq_flag = 255; + TM_copy = 0x15; + TS_copy = 0; + player_is_indoors = 0; + music_control = 0xf1; + SetBackdropcolorBlack(); + + memset(&link_y_coord, 0, 0x70); + memset(save_dung_info, 0, 256 * 5); + + main_module_index = 1; + death_var4 = 1; + submodule_index = 0; +} + +void Intro_InitializeTriforcePolyThread() { // 8cc33c + misc_sprites_graphics_index = 8; + LoadCommonSprites_2(); + Intro_InitGfx_Helper(); + intro_sprite_isinited[0] = 1; + intro_sprite_isinited[1] = 1; + intro_sprite_isinited[2] = 1; + intro_sprite_subtype[0] = 0; + intro_sprite_subtype[1] = 0; + intro_sprite_subtype[2] = 0; + intro_sprite_isinited[4] = 1; + intro_sprite_subtype[4] = 2; + INIDISP_copy = 15; + submodule_index++; +} + +void Intro_InitGfx_Helper() { // 8cc36f + Polyhedral_InitializeThread(); + LoadTriforceSpritePalette(); + virq_trigger = 0x90; + poly_config1 = 255; + poly_base_x = 32; + poly_base_y = 32; + BYTE(poly_var1) = 32; + poly_a = 0xA0; + poly_b = 0x60; + poly_config_color_mode = 1; + poly_which_model = 1; + is_nmi_thread_active = 1; + intro_did_run_step = 1; + memset(&intro_step_index, 0, 7 * 16); +} + +void LoadTriforceSpritePalette() { // 8cc3bd + memcpy(main_palette_buffer + 0xd0, kPolyhedralPalette, 16); + flag_update_cgram_in_nmi++; +} + +void Intro_HandleAllTriforceAnimations() { // 8cc404 + intro_frame_ctr++; + Intro_AnimateTriforce(); + Scene_AnimateEverySprite(); +} + +void Scene_AnimateEverySprite() { // 8cc412 + intro_sprite_alloc = 0x800; + for (int k = 7; k >= 0; k--) + Intro_AnimOneObj(k); +} + +void Intro_AnimateTriforce() { // 8cc435 + is_nmi_thread_active = 1; + if (!intro_did_run_step) { + Intro_RunStep(); + intro_did_run_step = 1; + } +} + +void Intro_RunStep() { // 8cc448 + switch (intro_step_index) { + case 0: + if (++intro_step_timer == 64) + intro_step_index++; + poly_b += 5, poly_a += 3; + break; + case 1: + if (poly_config1 < 2) { + poly_config1 = 0; + intro_step_index++; + intro_step_timer = 64; + return; + } + poly_config1 -= 2; + poly_b += 5; + poly_a += 3; + if (poly_config1 < 225) + submodule_index = 4; + if (poly_config1 == 113) + music_control = 1; + break; + case 2: + if (!--intro_step_timer) { + intro_step_index++; + } else { + poly_b += 5, poly_a += 3; + } + break; + case 3: + if (poly_b >= 250 && poly_a >= 252) { + intro_step_index++; + intro_step_timer = 32; + } else { + poly_b += 5, poly_a += 3; + } + break; + case 4: + poly_b = 0; + poly_a = 0; + if (!--intro_step_timer) { + intro_step_index++; + intro_sprite_isinited[5] = 1; + intro_sprite_subtype[5] = 3; + TM_copy = 0x10; + TS_copy = 5; + CGWSEL_copy = 2; + CGADSUB_copy = 0x31; + subsubmodule_index = 0; + flag_update_cgram_in_nmi++; + nmi_load_bg_from_vram = 3; + submodule_index++; + } + break; + } + +} + +void Intro_AnimOneObj(int k) { // 8cc534 + switch (intro_sprite_isinited[k]) { + case 0: + break; + case 1: + switch (intro_sprite_subtype[k]) { + case 0: Intro_SpriteType_A_0(k); break; + case 1: EXIT_0CCA90(k); break; + case 2: InitializeSceneSprite_Copyright(k); break; + case 3: InitializeSceneSprite_Sparkle(k); break; + case 4: + case 5: + case 6: InitializeSceneSprite_TriforceRoomTriangle(k); break; + case 7: InitializeSceneSprite_CreditsTriangle(k); break; + } + break; + case 2: + switch (intro_sprite_subtype[k]) { + case 0: Intro_SpriteType_B_0(k); break; + case 1: EXIT_0CCA90(k); break; + case 2: AnimateSceneSprite_Copyright(k); break; + case 3: AnimateSceneSprite_Sparkle(k); break; + case 4: + case 5: + case 6: Intro_SpriteType_B_456(k); break; + case 7: AnimateSceneSprite_CreditsTriangle(k); break; + } + break; + } +} + +void Intro_SpriteType_A_0(int k) { // 8cc57e + static const int16 kIntroSprite0_X[3] = { -38, 95, 230 }; + static const int16 kIntroSprite0_Y[3] = { 200, -67, 200 }; + intro_x_lo[k] = kIntroSprite0_X[k]; + intro_x_hi[k] = kIntroSprite0_X[k] >> 8; + intro_y_lo[k] = kIntroSprite0_Y[k]; + intro_y_hi[k] = kIntroSprite0_Y[k] >> 8; + intro_x_vel[k] = kIntroSprite0_Xvel[k]; + intro_y_vel[k] = kIntroSprite0_Yvel[k]; + intro_sprite_isinited[k]++; +} + +void Intro_SpriteType_B_0(int k) { // 8cc5b1 + static const uint8 kIntroSprite0_XLimit[3] = { 75, 95, 117 }; + static const uint8 kIntroSprite0_YLimit[3] = { 88, 48, 88 }; + + AnimateSceneSprite_DrawTriangle(k); + AnimateSceneSprite_MoveTriangle(k); + if (intro_step_index != 5) { + if (!(intro_frame_ctr & 31)) { + intro_x_vel[k] += kIntroSprite0_Xvel[k]; + intro_y_vel[k] += kIntroSprite0_Yvel[k]; + } + if (intro_x_lo[k] == kIntroSprite0_XLimit[k]) + intro_x_vel[k] = 0; + if (intro_y_lo[k] == kIntroSprite0_YLimit[k]) + intro_y_vel[k] = 0; + } else { + intro_x_vel[k] = 0; + intro_y_vel[k] = 0; + } +} + +void AnimateSceneSprite_DrawTriangle(int k) { // 8cc70f + static const IntroSpriteEnt kIntroSprite0_Left_Ents[16] = { + { 0, 0, 0x80, 0x1b, 2}, + {16, 0, 0x82, 0x1b, 2}, + {32, 0, 0x84, 0x1b, 2}, + {48, 0, 0x86, 0x1b, 2}, + { 0, 16, 0xa0, 0x1b, 2}, + {16, 16, 0xa2, 0x1b, 2}, + {32, 16, 0xa4, 0x1b, 2}, + {48, 16, 0xa6, 0x1b, 2}, + { 0, 32, 0x88, 0x1b, 2}, + {16, 32, 0x8a, 0x1b, 2}, + {32, 32, 0x8c, 0x1b, 2}, + {48, 32, 0x8e, 0x1b, 2}, + { 0, 48, 0xa8, 0x1b, 2}, + {16, 48, 0xaa, 0x1b, 2}, + {32, 48, 0xac, 0x1b, 2}, + {48, 48, 0xae, 0x1b, 2}, + }; + static const IntroSpriteEnt kIntroSprite0_Right_Ents[16] = { + {48, 0, 0x80, 0x5b, 2}, + {32, 0, 0x82, 0x5b, 2}, + {16, 0, 0x84, 0x5b, 2}, + { 0, 0, 0x86, 0x5b, 2}, + {48, 16, 0xa0, 0x5b, 2}, + {32, 16, 0xa2, 0x5b, 2}, + {16, 16, 0xa4, 0x5b, 2}, + { 0, 16, 0xa6, 0x5b, 2}, + {48, 32, 0x88, 0x5b, 2}, + {32, 32, 0x8a, 0x5b, 2}, + {16, 32, 0x8c, 0x5b, 2}, + { 0, 32, 0x8e, 0x5b, 2}, + {48, 48, 0xa8, 0x5b, 2}, + {32, 48, 0xaa, 0x5b, 2}, + {16, 48, 0xac, 0x5b, 2}, + { 0, 48, 0xae, 0x5b, 2}, + }; + AnimateSceneSprite_AddObjectsToOamBuffer(k, k == 2 ? kIntroSprite0_Right_Ents : kIntroSprite0_Left_Ents, 16); +} + +void Intro_CopySpriteType4ToOam(int k) { // 8cc82f + static const IntroSpriteEnt kIntroTriforceOam_Left[16] = { + { 0, 0, 0x80, 0x2b, 2}, + {16, 0, 0x82, 0x2b, 2}, + {32, 0, 0x84, 0x2b, 2}, + {48, 0, 0x86, 0x2b, 2}, + { 0, 16, 0xa0, 0x2b, 2}, + {16, 16, 0xa2, 0x2b, 2}, + {32, 16, 0xa4, 0x2b, 2}, + {48, 16, 0xa6, 0x2b, 2}, + { 0, 32, 0x88, 0x2b, 2}, + {16, 32, 0x8a, 0x2b, 2}, + {32, 32, 0x8c, 0x2b, 2}, + {48, 32, 0x8e, 0x2b, 2}, + { 0, 48, 0xa8, 0x2b, 2}, + {16, 48, 0xaa, 0x2b, 2}, + {32, 48, 0xac, 0x2b, 2}, + {48, 48, 0xae, 0x2b, 2}, + }; + static const IntroSpriteEnt kIntroTriforceOam_Right[16] = { + {48, 0, 0x80, 0x6b, 2}, + {32, 0, 0x82, 0x6b, 2}, + {16, 0, 0x84, 0x6b, 2}, + { 0, 0, 0x86, 0x6b, 2}, + {48, 16, 0xa0, 0x6b, 2}, + {32, 16, 0xa2, 0x6b, 2}, + {16, 16, 0xa4, 0x6b, 2}, + { 0, 16, 0xa6, 0x6b, 2}, + {48, 32, 0x88, 0x6b, 2}, + {32, 32, 0x8a, 0x6b, 2}, + {16, 32, 0x8c, 0x6b, 2}, + { 0, 32, 0x8e, 0x6b, 2}, + {48, 48, 0xa8, 0x6b, 2}, + {32, 48, 0xaa, 0x6b, 2}, + {16, 48, 0xac, 0x6b, 2}, + { 0, 48, 0xae, 0x6b, 2}, + }; + AnimateSceneSprite_AddObjectsToOamBuffer(k, k == 2 ? kIntroTriforceOam_Right : kIntroTriforceOam_Left, 16); +} + +void EXIT_0CCA90(int k) { // 8cc84f + // empty +} + +void InitializeSceneSprite_Copyright(int k) { // 8cc850 + intro_x_lo[k] = 76; + intro_x_hi[k] = 0; + intro_y_lo[k] = 184; + intro_y_hi[k] = 0; + intro_sprite_isinited[k]++; +} + +void AnimateSceneSprite_Copyright(int k) { // 8cc864 + static const IntroSpriteEnt kIntroSprite2_Ents[13] = { + { 0, 0, 0x40, 0x0a, 0}, + { 8, 0, 0x41, 0x0a, 0}, + {16, 0, 0x42, 0x0a, 0}, + {24, 0, 0x68, 0x0a, 0}, + {32, 0, 0x41, 0x0a, 0}, + {40, 0, 0x42, 0x0a, 0}, + {48, 0, 0x43, 0x0a, 0}, + {56, 0, 0x44, 0x0a, 0}, + {64, 0, 0x50, 0x0a, 0}, + {72, 0, 0x51, 0x0a, 0}, + {80, 0, 0x52, 0x0a, 0}, + {88, 0, 0x53, 0x0a, 0}, + {96, 0, 0x54, 0x0a, 0}, + }; + AnimateSceneSprite_AddObjectsToOamBuffer(k, kIntroSprite2_Ents, 13); +} + +void InitializeSceneSprite_Sparkle(int k) { // 8cc8e2 + int j = intro_frame_ctr >> 5 & 3; + intro_x_lo[k] = kIntroSprite3_X[j]; + intro_x_hi[k] = 0; + intro_y_lo[k] = kIntroSprite3_Y[j]; + intro_y_hi[k] = 0; + intro_sprite_isinited[k]++; +} + +void AnimateSceneSprite_Sparkle(int k) { // 8cc90d + static const IntroSpriteEnt kIntroSprite3_Ents[4] = { + { 0, 0, 0x80, 0x34, 0}, + { 0, 0, 0xb7, 0x34, 0}, + {-4, -3, 0x64, 0x38, 2}, + {-4, -3, 0x62, 0x34, 2}, + }; + if (intro_sprite_state[k] < 4) + AnimateSceneSprite_AddObjectsToOamBuffer(k, kIntroSprite3_Ents + intro_sprite_state[k], 1); + + intro_sprite_state[k] = kIntroSprite3_State[intro_frame_ctr >> 2 & 7]; + int j = intro_frame_ctr >> 5 & 3; + intro_x_lo[k] = kIntroSprite3_X[j]; + intro_y_lo[k] = kIntroSprite3_Y[j]; +} + +void AnimateSceneSprite_AddObjectsToOamBuffer(int k, const IntroSpriteEnt *src, int num) { // 8cc972 + uint16 x = intro_x_hi[k] << 8 | intro_x_lo[k]; + uint16 y = intro_y_hi[k] << 8 | intro_y_lo[k]; + OamEnt *oam = (OamEnt *)&g_ram[intro_sprite_alloc]; + intro_sprite_alloc += num * 4; + do { + uint16 xcur = x + src->x; + uint16 ycur = y + src->y; + oam->x = xcur; + oam->y = ClampYForOam(ycur); + oam->charnum = src->charnum; + oam->flags = src->flags; + bytewise_extended_oam[oam - oam_buf] = src->ext | (xcur >> 8 & 1); + } while (oam++, src++, --num); +} + +void AnimateSceneSprite_MoveTriangle(int k) { // 8cc9f1 + if (intro_x_vel[k] != 0) { + uint32 t = intro_x_subpixel[k] + (intro_x_lo[k] << 8) + (intro_x_hi[k] << 16) + ((int8)intro_x_vel[k] << 4); + intro_x_subpixel[k] = t, intro_x_lo[k] = t >> 8, intro_x_hi[k] = t >> 16; + } + if (intro_y_vel[k] != 0) { + uint32 t = intro_y_subpixel[k] + (intro_y_lo[k] << 8) + (intro_y_hi[k] << 16) + ((int8)intro_y_vel[k] << 4); + intro_y_subpixel[k] = t, intro_y_lo[k] = t >> 8, intro_y_hi[k] = t >> 16; + } +} + +void TriforceRoom_PrepGFXSlotForPoly() { // 8cca54 + misc_sprites_graphics_index = 8; + LoadCommonSprites_2(); + Intro_InitGfx_Helper(); + intro_sprite_isinited[0] = 1; + intro_sprite_isinited[1] = 1; + intro_sprite_isinited[2] = 1; + intro_sprite_subtype[0] = 4; + intro_sprite_subtype[1] = 5; + intro_sprite_subtype[2] = 6; + INIDISP_copy = 15; + submodule_index++; +} + +void Credits_InitializePolyhedral() { // 8cca81 + misc_sprites_graphics_index = 8; + LoadCommonSprites_2(); + Intro_InitGfx_Helper(); + poly_config1 = 0; + intro_sprite_isinited[0] = 1; + intro_sprite_isinited[1] = 1; + intro_sprite_isinited[2] = 1; + intro_sprite_subtype[0] = 7; + intro_sprite_subtype[1] = 7; + intro_sprite_subtype[2] = 7; + INIDISP_copy = 15; + submodule_index++; +} + +void AdvancePolyhedral() { // 8ccab1 + TriforceRoom_HandlePoly(); + Scene_AnimateEverySprite(); +} + +void TriforceRoom_HandlePoly() { // 8ccabc + is_nmi_thread_active = 1; + intro_want_double_ret = 1; + if (intro_did_run_step) + return; + switch (intro_step_index) { + case 0: + poly_config1 -= 2; + if (poly_config1 < 2) { + poly_config1 = 0; + intro_step_index++; + subsubmodule_index++; + } + // fall through + case 1: + if (subsubmodule_index >= 10) { + intro_step_index++; + intro_y_vel[1] = 5; + } + poly_b += 2, poly_a += 1; + break; + case 2: + triforce_ctr = 0x1c0; + if (poly_config1 < 128) { + poly_config1 += 1; + } else { + if ((poly_b - 10 & 0x7f) >= 92 && + (uint8)(poly_a - 11) >= 220) { + poly_a = 0; + poly_b = 0; + subsubmodule_index++; + intro_step_index++; + sound_effect_1 = 44; + main_palette_buffer[0xd7] = 0x7fff; + flag_update_cgram_in_nmi++; + intro_step_timer = 6; + break; + } + } + poly_b += 5, poly_a += 3; + break; + case 3: + if (!--intro_step_timer) { + main_palette_buffer[0xd7] = kPolyhedralPalette[7]; + flag_update_cgram_in_nmi++; + intro_step_index++; + } + break; + case 4: + break; + } + intro_did_run_step = 1; + intro_want_double_ret = 0; + intro_frame_ctr++; +} + +void Credits_AnimateTheTriangles() { // 8ccba2 + intro_frame_ctr++; + is_nmi_thread_active = 1; + if (!intro_did_run_step) { + poly_b += 3; + poly_a += 1; + intro_did_run_step = 1; + } + Scene_AnimateEverySprite(); +} + +void InitializeSceneSprite_TriforceRoomTriangle(int k) { // 8ccbe8 + static const int16 kIntroTriforce_X[3] = { 0x4e, 0x5f, 0x72 }; + static const int16 kIntroTriforce_Y[3] = { 0x9c, 0x9c, 0x9c }; + static const int8 kIntroTriforce_Xvel[3] = { -2, 0, 2 }; + static const int8 kIntroTriforce_Yvel[3] = { 4, -4, 4 }; + + intro_x_lo[k] = kIntroTriforce_X[k]; + intro_x_hi[k] = 0; + intro_y_lo[k] = kIntroTriforce_Y[k]; + intro_y_hi[k] = 0; + intro_x_vel[k] = kIntroTriforce_Xvel[k]; + intro_y_vel[k] = kIntroTriforce_Yvel[k]; + intro_sprite_isinited[k]++; +} + +void Intro_SpriteType_B_456(int k) { // 8ccc13 + static const int8 kTriforce_Xacc[3] = { -1, 0, 1 }; + static const int8 kTriforce_Yacc[3] = { -1, -1, -1 }; + static const uint8 kTriforce_Yfinal2[3] = { 0x72, 0x66, 0x72 }; + + Intro_CopySpriteType4ToOam(k); + if (intro_want_double_ret) + return; + AnimateSceneSprite_MoveTriangle(k); + switch (intro_step_index) { + case 0: + if (!(intro_frame_ctr & 7)) + intro_x_vel[k] += kTriforce_Xacc[k]; + if (!(intro_frame_ctr & 3)) + intro_y_vel[k] += kTriforce_Yacc[k]; + break; + case 1: + intro_x_vel[k] = 0; + intro_y_vel[k] = 0; + break; + case 2: + if (!(intro_frame_ctr & 3)) + AnimateTriforceRoomTriangle_HandleContracting(k); + if (kTriforce_Xfinal[k] == intro_x_lo[k]) + intro_x_vel[k] = 0; + if (kTriforce_Yfinal[k] == intro_y_lo[k]) + intro_y_vel[k] = 0; + break; + case 3: + case 4: + if (triforce_ctr == 0) { + intro_y_lo[k] = kTriforce_Yfinal2[k]; + } else { + triforce_ctr -= 1; + } + break; + } +} + +void AnimateTriforceRoomTriangle_HandleContracting(int k) { // 8cccb0 + uint8 new_vel = intro_x_vel[k] + (intro_x_lo[k] <= kTriforce_Xfinal[k] ? 1 : -1); + intro_x_vel[k] = (new_vel == 0x11) ? 0x10 : (new_vel == 0xef) ? 0xf0 : new_vel; + new_vel = intro_y_vel[k] + (intro_y_lo[k] <= kTriforce_Yfinal[k] ? 1 : -1); + intro_y_vel[k] = (new_vel == 0x11) ? 0x10 : (new_vel == 0xef) ? 0xf0 : new_vel; +} + +void InitializeSceneSprite_CreditsTriangle(int k) { // 8ccd19 + static const uint8 kIntroSprite7_X[3] = { 0x29, 0x5f, 0x97 }; + static const uint8 kIntroSprite7_Y[3] = { 0x70, 0x20, 0x70 }; + intro_x_lo[k] = kIntroSprite7_X[k]; + intro_x_hi[k] = 0; + intro_y_lo[k] = kIntroSprite7_Y[k]; + intro_y_hi[k] = 0; + intro_sprite_isinited[k]++; +} + +void AnimateSceneSprite_CreditsTriangle(int k) { // 8ccd3e + static const int8 kIntroSprite7_XAcc[3] = { -1, 0, 1 }; + static const int8 kIntroSprite7_YAcc[3] = { 1, -1, 1 }; + + LoadTriforceSpritePalette(); + Intro_CopySpriteType4ToOam(k); + AnimateSceneSprite_MoveTriangle(k); + if (submodule_index != 36) { + intro_sprite_state[k] = 0; + return; + } + if (intro_sprite_state[k] != 80) { + intro_sprite_state[k]++; + intro_x_vel[k] += kIntroSprite7_XAcc[k]; + intro_y_vel[k] += kIntroSprite7_YAcc[k]; + } +} + +void Intro_DisplayLogo() { // 8ced82 + static const uint8 kIntroLogo_X[4] = { 0x60, 0x70, 0x80, 0x88 }; + static const uint8 kIntroLogo_Tile[4] = { 0x69, 0x6b, 0x6d, 0x6e }; + OamEnt *oam = oam_buf; + for (int i = 0; i < 4; i++) { + oam[i].x = kIntroLogo_X[i]; + oam[i].y = 0x68; + oam[i].charnum = kIntroLogo_Tile[i]; + oam[i].flags = 0x32; + bytewise_extended_oam[i] = 2; + } +} + +void Intro_SetupSwordAndIntroFlash() { // 8cfe45 + intro_sword_19 = 7; + intro_sword_20 = 0; + intro_sword_21 = 0; + intro_sword_ypos = -130; + + Intro_PeriodicSwordAndIntroFlash(); +} + +void Intro_PeriodicSwordAndIntroFlash() { // 8cfe56 + if (intro_sword_18) + intro_sword_18--; + SetBackdropcolorBlack(); + if (intro_times_pal_flash) { + if ((intro_times_pal_flash & 3) != 0) { + (&COLDATA_copy0)[intro_sword_24] |= 0x1f; + intro_sword_24 = (intro_sword_24 == 2) ? 0 : intro_sword_24 + 1; + } + intro_times_pal_flash--; + } + OamEnt *oam = oam_buf + 0x52; + for (int j = 9; j >= 0; j--) { + static const uint8 kIntroSword_Char[10] = { 0, 2, 0x20, 0x22, 4, 6, 8, 0xa, 0xc, 0xe }; + static const uint8 kIntroSword_X[10] = { 0x40, 0x40, 0x30, 0x50, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 }; + static const uint16 kIntroSword_Y[10] = { 0x10, 0x20, 0x28, 0x28, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80 }; + bytewise_extended_oam[0x52 + j] = 2; + oam[j].charnum = kIntroSword_Char[j]; + oam[j].flags = 0x21; + oam[j].x = kIntroSword_X[j]; + uint16 y = intro_sword_ypos + kIntroSword_Y[j]; + oam[j].y = ((y & 0xff00) ? 0xf8 : y) - 8; + } + + if (intro_sword_ypos != 30) { + if (intro_sword_ypos == 0xffbe) { + sound_effect_1 = 1; + } else if (intro_sword_ypos == 14) { + WORD(intro_sword_24) = 0; + intro_times_pal_flash = 0x20; + sound_effect_1 = 0x2c; + } + intro_sword_ypos += 16; + } + + switch (intro_sword_20 >> 1) { + case 0: + if (!intro_times_pal_flash && intro_sword_ypos == 30) + intro_sword_20 += 2; + break; + case 1: { + static const uint8 kSwordSparkle_Tab[8] = { 4, 4, 6, 6, 6, 4, 4 }; + + if (!intro_sword_18) { + intro_sword_19 -= 1; + if (sign8(intro_sword_19)) { + intro_sword_19 = 0; + intro_sword_18 = 2; + intro_sword_20 += 2; + return; + } + intro_sword_18 = kSwordSparkle_Tab[intro_sword_19]; + } + static const uint8 kSwordSparkle_Char[7] = { 0x28, 0x37, 0x27, 0x36, 0x27, 0x37, 0x28 }; + bytewise_extended_oam[0x50] = 0; + oam_buf[0x50].x = 0x44; + oam_buf[0x50].y = 0x43; + oam_buf[0x50].flags = 0x25; + oam_buf[0x50].charnum = kSwordSparkle_Char[intro_sword_19]; + break; + } + case 2: { + static const uint8 kIntroSwordSparkle_Char[8] = { 0x26, 0x20, 0x24, 0x34, 0x25, 0x20, 0x35, 0x20 }; + int k = intro_sword_19; + if (k >= 7) + return; + bytewise_extended_oam[0x50] = 0; + bytewise_extended_oam[0x51] = 0; + oam_buf[0x51].x = oam_buf[0x50].x = 0x42; + + uint8 y = (intro_sword_21 < 0x50 ? intro_sword_21 : 0x4f) + intro_sword_ypos + 0x31; + oam_buf[0x50].y = y; + oam_buf[0x51].y = y + 8; + oam_buf[0x50].charnum = kIntroSwordSparkle_Char[k]; + oam_buf[0x51].charnum = kIntroSwordSparkle_Char[k + 1]; + oam_buf[0x51].flags = oam_buf[0x50].flags = 0x23; + if (intro_sword_18 == 0) { + intro_sword_21 += 4; + if (intro_sword_21 == 0x4 || intro_sword_21 == 0x48 || intro_sword_21 == 0x4c || intro_sword_21 == 0x58) + intro_sword_19 += 2; + } + break; + } + } +} + +void Module1A_Credits() { // 8e986e + oam_region_base[0] = 0x30; + oam_region_base[1] = 0x1d0; + oam_region_base[2] = 0x0; + + kEndSequence_Funcs[submodule_index](); +} + +void Credits_LoadNextScene_Overworld() { // 8e9889 + kEndSequence0_Funcs[subsubmodule_index](); + Credits_AddEndingSequenceText(); +} + +void Credits_LoadNextScene_Dungeon() { // 8e9891 + Credits_LoadScene_Dungeon(); + Credits_AddEndingSequenceText(); +} + +void Credits_PrepAndLoadSprites() { // 8e98b9 + for (int k = 15; k >= 0; k--) { + SpritePrep_ResetProperties(k); + sprite_state[k] = 0; + sprite_flags5[k] = 0; + sprite_defl_bits[k] = 0; + } + int k = submodule_index >> 1; + switch (k) { +init_sprites_0: + case 0: case 4: case 5: case 8: case 13: { + int idx = kEndingSprites_Idx[k]; + int num = kEndingSprites_Idx[k + 1] - idx; + const uint16 *px = kEndingSprites_X + idx; + const uint16 *py = kEndingSprites_Y + idx; + for (k = num - 1; k >= 0; k--) { + sprcoll_x_size = sprcoll_y_size = 0xffff; + uint16 x = (swap16(overworld_area_index << 1) & 0xf00) + px[k]; + uint16 y = (swap16(overworld_area_index >> 2) & 0xe00) + py[k]; + Sprite_SetX(k, x); + Sprite_SetY(k, y); + } + break; + } +init_sprites_1: + case 1: { + int idx = kEndingSprites_Idx[k]; + int num = kEndingSprites_Idx[k + 1] - idx; + const uint16 *px = kEndingSprites_X + idx; + const uint16 *py = kEndingSprites_Y + idx; + byte_7E0FB1 = dungeon_room_index2 >> 3 & 254; + byte_7E0FB0 = (dungeon_room_index2 & 15) << 1; + for (k = num - 1; k >= 0; k--) { + sprcoll_x_size = sprcoll_y_size = 0xffff; + uint16 x = byte_7E0FB0 * 256 + px[k]; + uint16 y = byte_7E0FB1 * 256 + py[k]; + Sprite_SetX(k, x); + Sprite_SetY(k, y); + } + break; + } + case 2: + sprite_y_vel[6] = -16; + goto init_sprites_0; + case 3: + sprite_A[5] = 22; + sprite_y_vel[0] = -16; + sprite_y_vel[1] = 16; + sprite_head_dir[1] = 1; + for (int j = 2; j >= 0; j--) { + sprite_type[2 + j] = 0x57; + sprite_oam_flags[2 + j] = 0x31; + } + goto init_sprites_0; + case 6: + sprite_delay_main[0] = 255; + sprite_delay_main[1] = 255; + sprite_delay_main[2] = 255; + goto init_sprites_0; + case 7: + sprite_delay_main[1] = 255; + goto init_sprites_0; + case 9: + for (int j = 4; j >= 0; j--) { + sprite_delay_main[j] = j * 19; + sprite_state[j] = 0; + } + sprite_type[5] = 0x2e; + for (int j = 1; j >= 0; j--) { + sprite_type[7 + j] = 0x9f; + sprite_type[9 + j] = 0xa0; + sprite_flags2[7 + j] = 1; + sprite_flags2[9 + j] = 2; + sprite_flags3[7 + j] = 0x10; + sprite_flags3[9 + j] = 0x10; + } + goto init_sprites_0; + case 10: + sprite_delay_main[1] = 0x10; + sprite_delay_main[2] = 0x20; + sprite_oam_flags[3] = 8; + sprite_oam_flags[4] = 8; + goto init_sprites_1; + case 11: + sprite_oam_flags[4] = 0x79; + sprite_oam_flags[5] = 0x39; + sprite_D[1] = 1; + sprite_A[1] = 4; + goto init_sprites_1; + case 12: + for (int j = 1; j >= 0; j--) { + sprite_oam_flags[j + 3] = 0x39; + sprite_type[j + 3] = 0xb; + sprite_flags3[j + 3] = 0x10; + sprite_flags2[j + 3] = 1; + } + sprite_type[5] = 0x2a; + sprite_type[6] = 0x79; + sprite_ai_state[6] = 1; + sprite_z[6] = 5; + goto init_sprites_0; + case 14: + sprite_y_vel[5] = -16; + sprite_y_vel[6] = 16; + sprite_head_dir[6] = 1; + sprite_A[0] = 8; + for (int j = 3; j >= 0; j--) + sprite_y_vel[1 + j] = 4; + goto init_sprites_0; + case 15: + sprite_C[4] = 2; + sprite_y_vel[5] = 8; + sprite_delay_main[1] = 0x13; + sprite_delay_main[4] = 0x40; + goto init_sprites_0; + } +} + +void Credits_ScrollScene_Overworld() { // 8e9958 + + for (int k = 15; k >= 0; k--) + if (sprite_delay_main[k]) + sprite_delay_main[k]--; + + int i = submodule_index >> 1, k; + + link_x_vel = link_y_vel = 0; + if (R16 >= 0x40 && !(R16 & 1)) { + if (BG2VOFS_copy2 != kEnding1_TargetScrollY[i]) + link_y_vel = kEnding1_Yvel[i]; + if (BG2HOFS_copy2 != kEnding1_TargetScrollX[i]) + link_x_vel = kEnding1_Xvel[i]; + } + + Credits_OperateScrollingAndTileMap(); + Credits_HandleSceneFade(); +} + +void Credits_ScrollScene_Dungeon() { // 8e99c5 + for (int k = 15; k >= 0; k--) + if (sprite_delay_main[k]) + sprite_delay_main[k]--; + + int i = submodule_index >> 1; + if (R16 >= 0x40 && !(R16 & 1)) { + if (BG2VOFS_copy2 != kEnding1_TargetScrollY[i]) + BG2VOFS_copy2 += kEnding1_Yvel[i]; + if (BG2HOFS_copy2 != kEnding1_TargetScrollX[i]) + BG2HOFS_copy2 += kEnding1_Xvel[i]; + } + Credits_HandleSceneFade(); +} + +void Credits_HandleSceneFade() { // 8e9a2a + static const uint16 kEnding1_3_Tab0[16] = { 0x300, 0x280, 0x250, 0x2e0, 0x280, 0x250, 0x2c0, 0x2c0, 0x250, 0x250, 0x280, 0x250, 0x480, 0x400, 0x250, 0x500 }; + static const uint8 kEndSequence_Case0_Tab1[12] = { 0x1e, 0x20, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x16, 0x16, 0x16, 0x16 }; + static const uint8 kEndSequence_Case0_Tab0[12] = { 6, 3, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6 }; + static const uint8 kEndSequence_Case0_OamFlags[12] = { 0x3b, 0x31, 0x3d, 0x3f, 0x39, 0x3b, 0x37, 0x3d, 0x39, 0x37, 0x37, 0x39 }; + int i = submodule_index >> 1, j, k; + + switch (i) { + case 0: + for (int k = 11; k != 7; k--) { + sprite_oam_flags[k] = kEndSequence_Case0_OamFlags[k]; + Credits_SpriteDraw_Single(k, kEndSequence_Case0_Tab0[k], kEndSequence_Case0_Tab1[k]); + } + for (int k = 7; k != 1; k--) { + sprite_oam_flags[k] = kEndSequence_Case0_OamFlags[k] | (frame_counter << 2 & 0x40); + Credits_SpriteDraw_Single(k, kEndSequence_Case0_Tab0[k], kEndSequence_Case0_Tab1[k]); + } + for (int k = 1; k >= 0; k--) { + sprite_oam_flags[k] = kEndSequence_Case0_OamFlags[k]; + Credits_SpriteDraw_Single(k, kEndSequence_Case0_Tab0[k], kEndSequence_Case0_Tab1[k]); + } + break; + case 1: + Credits_SpriteDraw_Single(0, 3, 12); + Credits_SpriteDraw_DrawShadow(0); + k = 1; + sprite_type[k] = 0x73; + sprite_oam_flags[k] = 0x27; + sprite_E[k] = 2; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 16); + break; + case 2: { + static const uint8 kEnding_Case2_Tab0[2] = { 0x20, 0x40 }; + static const int8 kEnding_Case2_Tab1[2] = { 16, -16 }; + static const int8 kEnding_Case2_Tab2[5] = { 0x28, 0x2a, 0x2c, 0x2e, 0x2c }; + static const int8 kEnding_Case2_Tab3[5] = { 3, 3, 3, 3, 3 }; + static const uint8 kEnding_Case2_Delay[2] = { 0x30, 0x10 }; + + BYTE(flag_travel_bird) = kEnding_Case2_Tab0[frame_counter >> 2 & 1]; + k = 6; + j = sprite_x_vel[k] >> 7 & 1; + sprite_oam_flags[k] = (sprite_x_vel[k] + kEnding_Case2_Tab1[j]) >> 1 & 0x40 | 0x32; + Credits_SpriteDraw_Single(k, 2, 0x24); + Credits_SpriteDraw_CirclingBirds(k); + k -= 1; + sprite_oam_flags[k] = 0x31; + if (!sprite_delay_main[k]) { + j = sprite_A[k]; + sprite_A[k] ^= 1; + sprite_delay_main[k] = kEnding_Case2_Delay[j]; + sprite_graphics[k] = sprite_graphics[k] + 1 & 3; + } + Credits_SpriteDraw_Single(k, 2, 0x26); + k -= 1; + do { + if (!(frame_counter & 15)) + sprite_graphics[k] ^= 1; + sprite_oam_flags[k] = 0x31; + Credits_SpriteDraw_Single(k, kEnding_Case2_Tab3[k], kEnding_Case2_Tab2[k]); + EndSequence_DrawShadow2(k); + } while (--k >= 0); + break; + } + case 3: { + static const uint8 kEnding_Case3_Gfx[4] = { 1, 2, 3, 2 }; + for (k = 0; k < 5; k++) { + if (k < 2) { + sprite_type[k] = 1; + sprite_oam_flags[k] = 0xb; + Credits_SpriteDraw_SetShadowProp(k, 2); + sprite_z[k] = 48; + j = (frame_counter + (k ? 0x5f : 0x7d)) >> 2 & 3; + sprite_graphics[k] = kEnding_Case3_Gfx[j]; + Credits_SpriteDraw_CirclingBirds(k); + Credits_SpriteDraw_PreexistingSpriteDraw(k, 12); + } else { + Credits_SpriteDraw_PreexistingSpriteDraw(k, 16); + } + } + Credits_SpriteDraw_Single(k, 2, 0x38); + Ending_Func2(k, 0x30); + k++; + Credits_SpriteDraw_Single(k, 3, 0x3a); + break; + } + case 4: { + static const uint8 kEnding_Case4_Tab1[2] = { 0x30, 0x32 }; + static const uint8 kEnding_Case4_Tab0[2] = { 2, 2 }; + static const uint8 kEnding_Case4_Ctr[2] = { 0x20, 0 }; + static const int8 kEnding_Case4_XYvel[10] = { 0, -12, -16, -12, 0, 12, 16, 12, 0, -12 }; + static const uint8 kEnding_Case4_DelayVel[24] = { + 0x3b, 0x14, 0x1e, 0x1d, 0x2c, 0x2b, 0x42, 0x20, 0x27, 0x28, 0x2e, 0x38, 0x3a, 0x4c, 0x32, 0x44, + 0x2e, 0x2f, 0x1e, 0x28, 0x47, 0x35, 0x32, 0x30, + }; + k = 2; + sprite_oam_flags[k] = 0x35; + Credits_SpriteDraw_Single(k, 1, 0x3c); + k--; + do { + sprite_oam_flags[k] = (sprite_x_vel[k] - 1) >> 1 & 0x40 ^ 0x71; + sprite_graphics[k] = frame_counter >> 3 & 1; + if (R16 >= kEnding_Case4_Ctr[k] && !sprite_delay_main[k]) { + uint8 a = kEnding_Case4_DelayVel[sprite_A[k]]; + sprite_delay_main[k] = a & 0xf8; + sprite_y_vel[k] = kEnding_Case4_XYvel[(a & 7) + 2]; + sprite_x_vel[k] = kEnding_Case4_XYvel[a & 7]; + sprite_A[k]++; + } + Credits_SpriteDraw_Single(k, kEnding_Case4_Tab0[k], kEnding_Case4_Tab1[k]); + EndSequence_DrawShadow2(k); + Sprite_MoveXY(k); + } while (--k >= 0); + break; + } + case 5: { + static const uint8 kEnding_Case5_Tab0[2] = { 0, 4 }; + static const uint16 kEnding_Case5_Tab1[2] = { 0xa, 0x224 }; + static const uint8 kEnding_Case5_Tab2[2] = { 10, 14 }; + if (R16 == 0x200) + sound_effect_1 = 1; + else if (R16 == 0x208) + sound_effect_1 = 0x2c; + if ((uint16)(R16 - 0x208) < 0x30) + Credits_SpriteDraw_AddSparkle(2, 10, R16 - 0x208); // wtf x,y + k = 3; + if (R16 >= 0x200) + sprite_graphics[k] = 1; + sprite_oam_flags[k] = 0x31; + Credits_SpriteDraw_Single(k, 4, 8); + EndSequence_DrawShadow2(k); + int j = sprite_graphics[k]; + sprite_graphics[--k] = j; + link_dma_var3 = 0; + link_dma_var4 = kEnding_Case5_Tab0[j]; + sprite_oam_flags[k] = 0x30; + + link_dma_graphics_index = kEnding_Case5_Tab1[j]; + Credits_SpriteDraw_Single(k, 5, kEnding_Case5_Tab2[j]); + EndSequence_DrawShadow2(k); + break; + } + case 6: { + static const uint8 kEnding_Case6_SprType[3] = { 0x52, 0x55, 0x55 }; + static const uint8 kEnding_Case6_OamSize[3] = { 0x20, 8, 8 }; + static const uint8 kEnding_Case6_State[3] = { 3, 1, 1 }; + static const uint8 kEnding_Case6_Gfx[6] = { 0, 5, 5, 1, 6, 6 }; + + int idx = kEndingSprites_Idx[i]; + int num = kEndingSprites_Idx[i + 1] - idx; + + for (int k = num - 1; k >= 0; k--) { + cur_object_index = k; + sprite_type[k] = kEnding_Case6_SprType[k]; + Oam_AllocateFromRegionA(kEnding_Case6_OamSize[k]); + sprite_ai_state[k] = kEnding_Case6_State[k]; + j = (R16 >= 0x26f) ? k + 3 : k; + if (R16 == 0x26f) + sound_effect_2 = 0x21; + sprite_graphics[k] = kEnding_Case6_Gfx[j]; + sprite_oam_flags[k] = 0x33; + Sprite_Get16BitCoords(k); + SpriteActive_Main(k); + } + break; + } + case 7: + k = 1; + Credits_SpriteDraw_SetShadowProp(k, 2); + sprite_type[k] = 0xe9; + Oam_AllocateFromRegionA(0xc); + sprite_oam_flags[k] = 0x37; + Sprite_Get16BitCoords(k); + if (!(frame_counter & 15)) + sprite_graphics[k] ^= 1; + SpriteActive_Main(k); + if (R16 >= 0x180) { + sprite_y_vel[k] = 4; + if (sprite_y_lo[k] != 0x7c) + Sprite_MoveXY(k); + } + k--; + sprite_type[k] = 0x36; + Oam_AllocateFromRegionA(0x18); + sprite_oam_flags[k] = 0x39; + Sprite_Get16BitCoords(k); + if (!sprite_delay_main[k]) { + static const int8 kEnding_Case7_Gfx[2] = { 1, -1 }; + sprite_delay_main[k] = 4; + sprite_graphics[k] = sprite_graphics[k] + kEnding_Case7_Gfx[R16 >> 9 & 1] & 7; + } + SpriteActive_Main(k); + break; + case 8: + k = 0; + sprite_type[k] = 0x2c; + Oam_AllocateFromRegionA(0x2c); + sprite_oam_flags[k] = 0x3b; + Sprite_Get16BitCoords(k); + sprite_graphics[k] = R16 < 0x1c0 ? R16 >> 5 & 1 : 2; + SpriteActive_Main(k); + break; + case 9: + for (k = 0; k < 5; k++) { + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 96; + sprite_state[k] = 96; + sprite_x_vel[k] = 0; + sprite_x_lo[k] = 238; + sprite_x_hi[k] = 4; + sprite_y_lo[k] = 24; + sprite_y_hi[k] = 11; + } + if (sprite_state[k]) { + sprite_y_vel[k] = -8; + Sprite_MoveXY(k); + if (!(frame_counter & 1)) + sprite_x_vel[k] += ((frame_counter >> 5) ^ k) & 1 ? -1 : 1; + Credits_SpriteDraw_Single(k, 1, 0x10); + } + } + for (;;) { + if (!sprite_delay_main[k]) { + static const uint8 kEnding_Case8_Delay1[4] = { 16, 14, 16, 18 }; + static const uint8 kEnding_Case8_Delay2[4] = { 20, 48, 20, 20 }; + sprite_delay_main[k] = (k == 5) ? kEnding_Case8_Delay1[sprite_A[k]] : kEnding_Case8_Delay2[sprite_A[k]]; + sprite_A[k] = sprite_A[k] + 1 & 3; + sprite_graphics[k] ^= 1; + } + if (k == 5) { + sprite_oam_flags[k] = 0x31; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 0x10); + k++; + } else { + Credits_SpriteDraw_Single(k, 2, 0x12); + k++; + break; + } + } + do { + static const uint8 kEnding_Case8_D[4] = { 0, 1, 0, 1 }; + static const uint8 kEnding_Case8_OamFlags[4] = { 55, 55, 59, 61 }; + static const uint8 kEnding_Case8_Tab0[4] = { 8, 8, 12, 12 }; + sprite_oam_flags[k] = kEnding_Case8_OamFlags[k - 7]; + sprite_D[k] = kEnding_Case8_D[k - 7]; + Credits_SpriteDraw_ActivateAndRunSprite(k, kEnding_Case8_Tab0[k - 7]); + } while (++k != 11); + break; + case 10: { + static const uint8 kWishPond_X[8] = { 0, 4, 8, 12, 16, 20, 24, 0 }; + static const uint8 kWishPond_Y[8] = { 0, 8, 16, 24, 32, 40, 4, 36 }; + k = 5; + Sprite_Get16BitCoords(k); + if (!sprite_pause[k]) { + uint8 xb = kWishPond_X[GetRandomNumber() & 7] + cur_sprite_x; + uint8 yb = kWishPond_Y[GetRandomNumber() & 7] + cur_sprite_y; + Credits_SpriteDraw_AddSparkle(3, xb, yb); + } + for (int k = 3; k < 5; k++) { + if (sprite_delay_aux1[k]) + sprite_delay_aux1[k]--; + sprite_type[k] = 0xe3; + Credits_SpriteDraw_SetShadowProp(k, 1); + Credits_SpriteDraw_ActivateAndRunSprite(k, 8); + } + sprite_type[k] = 0x72; + sprite_oam_flags[k] = 0x3b; + sprite_state[k] = 9; + sprite_B[k] = 9; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 0x30); + break; + } + case 11: + if (R16 >= 0x170) { + for (int k = 4; k != 6; k++) { + Credits_SpriteDraw_Single(k, 1, 0x3e); + } + k = 0; + sprite_oam_flags[k] = 0x39; + if (R16 < 0x1c0) { + sprite_graphics[k] = 2; + } else if (sprite_delay_main[k] == 0) { + sprite_delay_main[k] = 0x20; + sprite_graphics[k] = (sprite_graphics[k] ^ 1) & 1; + } + Credits_SpriteDraw_Single(k, 4, 6); + } else { + static const uint8 kEnding_Case11_Gfx[16] = { 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0 }; + for (int k = 0; k < 2; k++) { + sprite_type[k] = 0x1a; + sprite_oam_flags[k] = 0x39; + Credits_SpriteDraw_SetShadowProp(k, 2); + uint8 bak0 = main_module_index; + Credits_SpriteDraw_ActivateAndRunSprite(k, 0xc); + main_module_index = bak0; + if (sprite_B[k] == 15 && sprite_A[k] == 4) + sprite_delay_main[k + 2] = 15; + int j = sprite_delay_main[k + 2]; + if (j != 0) { + sprite_oam_flags[k + 2] = 2; + sprite_graphics[k + 2] = kEnding_Case11_Gfx[j]; + Credits_SpriteDraw_Single(k + 2, 2, 0x36); + } + } + } + break; + case 12: + k = 6; + sprite_graphics[k] = frame_counter & 1; + if (!sprite_graphics[k]) { + sprite_x_vel[k] += sign8(sprite_x_lo[k] - 0x80) ? 1 : -1; + sprite_y_vel[k] += sign8(sprite_y_lo[k] - 0xb0) ? 1 : -1; + Sprite_MoveXY(k); + } + + sprite_oam_flags[k] = sprite_x_vel[k] >> 1 & 0x40 ^ 0x7e; + sprite_flags2[k] = 1; + sprite_flags3[k] = 0x30; + sprite_z[k] = 16; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 8); + k--; + sprite_oam_flags[k] = 0x37; + Credits_SpriteDraw_SetShadowProp(k, 2); + Credits_SpriteDraw_ActivateAndRunSprite(k, 12); + k--; + Credits_SpriteDraw_ActivateAndRunSprite(k, 8); + k--; + Credits_SpriteDraw_ActivateAndRunSprite(k, 8); + k--; + do { + static const uint8 kEnding_Case12_Tab[3] = { 3, 3, 8 }; + static const uint8 kEnding_Case12_Z[15] = { 2, 4, 5, 6, 6, 7, 7, 7, 7, 6, 6, 5, 4, 2, 0 }; + + Credits_SpriteDraw_Single(k, kEnding_Case12_Tab[k], k * 2); + if (k == 0) { + Ending_Func2(k, 0x30); + } else if (k & ~1) { + sprite_graphics[k] = frame_counter >> 3 & 1; + } else { + int j = frame_counter & 0x1f; + if (j < 0xf) { + sprite_z[k] = kEnding_Case12_Z[j]; + } + sprite_graphics[k] = (j < 0xf) ? 1 : 0; + Credits_SpriteDraw_DrawShadow(k); + } + } while (--k >= 0); + break; + case 13: + k = 0; + if (R16 == 0x200) + sprite_x_vel[k] = -4; + sprite_graphics[k] = frame_counter >> 4 & 1; + if (sprite_x_lo[k] == 56) { + sprite_x_vel[k] = 0; + sprite_graphics[k] += 2; + } + Credits_SpriteDraw_Single(k, 3, 0x34); + Sprite_MoveXY(k); + break; + case 14: { + static const int8 kEnding_Case14_Tab1[4] = { 0, 1, 0, 2 }; + static const int8 kEnding_Case14_Tab0[5] = { 2, 8, 32, 32, 8 }; + for (k = 6; k; k--) { + if (k >= 5) { + sprite_type[k] = 0; + Credits_SpriteDraw_SetShadowProp(k, 1); + sprite_graphics[k] = (frame_counter + 0x4a & 8) >> 3; + sprite_z[k] = 32; + Credits_SpriteDraw_CirclingBirds(k); + sprite_oam_flags[k] = (sprite_x_vel[k] >> 1 & 0x40) ^ 0xf; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 8); + } else { + sprite_type[k] = 0xd; + if (k == 1) + sprite_head_dir[k] = 0xd; + Credits_SpriteDraw_SetShadowProp(k, 3); + sprite_oam_flags[k] = 0x2b; + uint8 a = sprite_delay_main[k]; + if (!a) + sprite_delay_main[k] = a = 0xc0; + a >>= 1; + if (a == 0) { + sprite_y_vel[k] = sprite_x_vel[k] = 0; + } else { + if (a < kEnding_Case14_Tab0[k] && !(frame_counter & 3) && (a = sprite_y_vel[k]) != 0) { + sprite_y_vel[k] = --a; + a -= 4; + if (k < 3) + a = -a; + sprite_x_vel[k] = a; + } + } + Sprite_MoveXY(k); + sprite_graphics[k] = kEnding_Case14_Tab1[frame_counter >> 3 & 3]; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 16); + } + } + Credits_SpriteDraw_Single(k, 3, 0x18); + Ending_Func2(k, 0x20); + break; + } + case 15: { + static const uint8 kEnding_Case15_X[4] = { 0x76, 0x73, 0x71, 0x78 }; + static const uint8 kEnding_Case15_Y[4] = { 0x8b, 0x83, 0x8d, 0x85 }; + static const uint8 kEnding_Case15_Delay[8] = { 6, 6, 6, 6, 6, 6, 10, 8 }; + static const uint8 kEnding_Case15_OamFlags[4] = { 0x61, 0x61, 0x3b, 0x39 }; + j = kGeneratedEndSequence15[frame_counter] & 3; + Credits_SpriteDraw_AddSparkle(2, kEnding_Case15_X[j], kEnding_Case15_Y[j]); + k = 2; + sprite_type[k] = 0x62; + sprite_oam_flags[k] = 0x39; + Credits_SpriteDraw_PreexistingSpriteDraw(k, 0x18); + for (j = 1; j >= 0; j--) { + k++; + if (sprite_delay_aux1[k]) + sprite_delay_aux1[k]--; + sprite_oam_flags[k] = (sprite_x_vel[k] >> 1 & 0x40) ^ kEnding_Case15_OamFlags[j]; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 128; + sprite_A[k] = 0; + } + if (!sprite_A[k]) { + sprite_graphics[k] = (frame_counter >> 2 & 1) + 2; + Credits_SpriteDraw_MoveSquirrel(k); + } else if (!sprite_delay_aux1[k]) { + if (sprite_B[k] == 8) + sprite_B[k] = 0; + sprite_delay_aux1[k] = kEnding_Case15_Delay[sprite_B[k] & 7]; + sprite_graphics[k] = sprite_graphics[k] & 1 ^ 1; + sprite_B[k]++; + } + Credits_SpriteDraw_Single(k, 1, 20); + EndSequence_DrawShadow2(k); + } + Credits_SpriteDraw_WalkLinkAwayFromPedestal(k + 1); + break; + } + } + + k = submodule_index >> 1; + if (R16 >= kEnding1_3_Tab0[k]) { + if (!(R16 & 1) && !--INIDISP_copy) + submodule_index++; + else + R16++; + } else { + if (!(R16 & 1) && INIDISP_copy != 15) + INIDISP_copy++; + R16++; + } + BG2HOFS_copy = BG2HOFS_copy2; + BG2VOFS_copy = BG2VOFS_copy2; + BG1HOFS_copy = BG1HOFS_copy2; + BG1VOFS_copy = BG1VOFS_copy2; +} + +void Credits_SpriteDraw_DrawShadow(int k) { // 8ea5f8 + sprite_oam_flags[k] = 0x30; + Credits_SpriteDraw_SetShadowProp(k, 0); + Oam_AllocateFromRegionA(4); + SpriteDraw_Shadow(k, &g_ending_coords); +} + +void EndSequence_DrawShadow2(int k) { // 8ea5fd + Credits_SpriteDraw_SetShadowProp(k, 0); + Oam_AllocateFromRegionA(4); + SpriteDraw_Shadow(k, &g_ending_coords); +} + +void Ending_Func2(int k, uint8 ain) { // 8ea645 + static const uint8 kEnding_Func2_Delay[27] = { + 10, 10, 10, 10, 20, 8, 8, 0, 255, 12, 12, 12, 12, 12, 12, 30, + 8, 4, 4, 4, 0, 0, 255, 255, 144, 4, 0, + }; + static const int8 kEnding_Func2_Tab0[28] = { + 0, 0, 1, 0, 1, 0, 2, 3, 0, 2, 0, 1, 0, 1, 0, 1, + 2, 3, 4, 5, 6, 3, 0, -1, -1, -1, 2, 3, + }; + sprite_oam_flags[k] = ain; + EndSequence_DrawShadow2(k); + int j = sprite_A[k]; + if (!sprite_delay_main[k]) { + j++; + if (j == 8) + j = 6; + else if (j == 22) + j = 21; + else if (j == 28) + j = 27; + sprite_A[k] = j; + sprite_delay_main[k] = kEnding_Func2_Delay[j - 1]; + } + uint8 a = kEnding_Func2_Tab0[j]; + sprite_graphics[k] = (a == 255) ? frame_counter >> 3 & 1 : a; + if ((j < 5 || j >= 10 && j < 15) && !(frame_counter & 1)) + sprite_y_lo[k]++; +} + +void Credits_SpriteDraw_ActivateAndRunSprite(int k, uint8 a) { // 8ea694 + cur_object_index = k; + Oam_AllocateFromRegionA(a); + Sprite_Get16BitCoords(k); + uint8 bak0 = submodule_index; + submodule_index = 0; + sprite_state[k] = 9; + SpriteActive_Main(k); + submodule_index = bak0; +} + +void Credits_SpriteDraw_PreexistingSpriteDraw(int k, uint8 a) { // 8ea6b3 + Oam_AllocateFromRegionA(a); + cur_object_index = k; + Sprite_Get16BitCoords(k); + SpriteActive_Main(k); +} + +void Credits_SpriteDraw_Single(int k, uint8 a, uint8 j) { // 8ea703 + static const DrawMultipleData kEndSequence_Dmd0[12] = { + { 0, -8, 0x072a, 2}, + { 0, -8, 0x072a, 2}, + { 0, 0, 0x4fca, 2}, + { 0, -8, 0x072a, 2}, + { 0, -8, 0x072a, 2}, + { 0, 0, 0x0fca, 2}, + {-2, 0, 0x0f77, 0}, + { 0, -8, 0x072a, 2}, + { 0, 0, 0x4fca, 2}, + {-3, 0, 0x0f66, 0}, + { 0, -8, 0x072a, 2}, + { 0, 0, 0x4fca, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd1[6] = { + {14, -7, 0x0d48, 2}, + { 0, -6, 0x0944, 2}, + { 0, 0, 0x094e, 2}, + {13, -14, 0x0d48, 2}, + { 0, -8, 0x0944, 2}, + { 0, 0, 0x0946, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd2[16] = { + {-2, -16, 0x3d78, 0}, + { 0, -24, 0x3d24, 2}, + { 0, -16, 0x3dc2, 2}, + {61, -16, 0x3777, 0}, + {64, -24, 0x37c4, 2}, + {64, -16, 0x77ca, 2}, + { 0, -6, 0x326c, 2}, + {64, -6, 0x326c, 2}, + {-2, -16, 0x3d68, 0}, + { 0, -24, 0x3d24, 2}, + { 0, -16, 0x3dc2, 2}, + {61, -16, 0x3766, 0}, + {64, -24, 0x37c4, 2}, + {64, -16, 0x77ca, 2}, + { 0, -6, 0x326c, 2}, + {64, -6, 0x326c, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd3[12] = { + { 0, 0, 0x0022, 2}, + {48, 0, 0x0064, 2}, + { 0, 10, 0x016c, 2}, + {48, 10, 0x016c, 2}, + { 0, 0, 0x0064, 2}, + {48, 0, 0x0022, 2}, + { 0, 10, 0x016c, 2}, + {48, 10, 0x016c, 2}, + { 0, 0, 0x0064, 2}, + {48, 0, 0x0064, 2}, + { 0, 10, 0x016c, 2}, + {48, 10, 0x016c, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd4[8] = { + {10, 8, 0x8a32, 0}, + {10, 16, 0x8a22, 0}, + { 0, -10, 0x0800, 2}, + { 0, 0, 0x082c, 2}, + {10, -14, 0x0a22, 0}, + {10, -6, 0x0a32, 0}, + {0, -10, 0x082a, 2}, + {0, 0, 0x0828, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd5[10] = { + {10, 16, 0x8a05, 0}, + {10, 8, 0x8a15, 0}, + {-4, 2, 0x0a07, 2}, + { 0, -7, 0x0e00, 2}, + { 0, 1, 0x0e02, 2}, + {10, -20, 0x0a05, 0}, + {10, -12, 0x0a15, 0}, + {-7, 1, 0x4a07, 2}, + { 0, -7, 0x0e00, 2}, + { 0, 1, 0x0e02, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd6[3] = { + {-6, -2, 0x0706, 2}, + { 0, -9, 0x090e, 2}, + { 0, -1, 0x0908, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd7[10] = { + {0, -10, 0x082a, 2}, + {0, 0, 0x0828, 2}, + {10, 16, 0x8a05, 0}, + {10, 8, 0x8a15, 0}, + {-4, 2, 0x0a07, 2}, + { 0, -7, 0x0e00, 2}, + { 0, 1, 0x0e02, 2}, + {10, -20, 0x0a05, 0}, + {10, -12, 0x0a15, 0}, + {-7, 1, 0x4a07, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd8[1] = { + {0, -19, 0x39af, 0}, + }; + static const DrawMultipleData kEndSequence_Dmd9[4] = { + {-16, -24, 0x3704, 2}, + {-16, -16, 0x3764, 2}, + {-16, -24, 0x3762, 2}, + {-16, -16, 0x3764, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd10[4] = { + {0, 0, 0x0c0c, 2}, + {0, 0, 0x0c0a, 2}, + {0, 0, 0x0cc5, 2}, + {0, 0, 0x0ce1, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd11[6] = { + {1, 4, 0x002a, 0}, + {1, 12, 0x003a, 0}, + {4, 0, 0x0026, 2}, + {0, 9, 0x0024, 2}, + {8, 9, 0x4024, 2}, + {4, 20, 0x016c, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd12[21] = { + { 0, -7, 0x0d00, 2}, + { 0, -7, 0x0d00, 2}, + { 0, 0, 0x0d06, 2}, + { 0, -7, 0x0d00, 2}, + { 0, -7, 0x0d00, 2}, + { 0, 0, 0x4d06, 2}, + { 0, -8, 0x0d00, 2}, + { 0, -8, 0x0d00, 2}, + { 0, 0, 0x0d20, 2}, + { 0, -8, 0x0d02, 2}, + { 0, -8, 0x0d02, 2}, + { 0, 0, 0x0d2c, 2}, + {-3, 0, 0x0d2f, 0}, + { 0, -7, 0x0d02, 2}, + { 0, 0, 0x0d2c, 2}, + {-5, 2, 0x0d2f, 0}, + { 0, -8, 0x0d02, 2}, + { 0, 0, 0x0d2c, 2}, + {-5, 2, 0x0d3f, 0}, + { 0, -8, 0x0d02, 2}, + { 0, 0, 0x0d2c, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd13[16] = { + {0, -7, 0x0e00, 2}, + {0, 1, 0x4e02, 2}, + {0, -8, 0x0e00, 2}, + {0, 1, 0x0e02, 2}, + {0, -9, 0x0e00, 2}, + {0, 1, 0x0e02, 2}, + {0, -7, 0x0e00, 2}, + {0, 1, 0x0e02, 2}, + {0, -7, 0x0e00, 2}, + {0, 1, 0x4e02, 2}, + {0, -8, 0x0e00, 2}, + {0, 1, 0x4e02, 2}, + {0, -9, 0x0e00, 2}, + {0, 1, 0x4e02, 2}, + {0, -7, 0x0e00, 2}, + {0, 1, 0x4e02, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd14[6] = { + {0, 0, 0, 0}, + {0, 0, 0x34c7, 0}, + {0, 0, 0x3480, 0}, + {0, 0, 0x34b6, 0}, + {0, 0, 0x34b7, 0}, + {0, 0, 0x34a6, 0}, + }; + static const DrawMultipleData kEndSequence_Dmd15[6] = { + {-3, 17, 0x002b, 0}, + {-3, 25, 0x003b, 0}, + { 0, 0, 0x000e, 2}, + {16, 0, 0x400e, 2}, + { 0, 16, 0x002e, 2}, + {16, 16, 0x402e, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd16[3] = { + { 8, 5, 0x0a04, 2}, + { 0, 16, 0x0806, 2}, + {16, 16, 0x4806, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd17[2] = { + {0, 0, 0x0000, 2}, + {0, 11, 0x0002, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd18[2] = { + {0, 0, 0x000e, 2}, + {0, 64, 0x006c, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd19[8] = { + {0, 0, 0x0882, 2}, + {0, 7, 0x0a4e, 2}, + {0, 0, 0x4880, 2}, + {0, 7, 0x0a4e, 2}, + {0, 0, 0x0882, 2}, + {0, 7, 0x0a4e, 2}, + {0, 0, 0x0880, 2}, + {0, 7, 0x0a4e, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd20[6] = { + {-4, 1, 0x0c68, 0}, + { 0, -8, 0x0c40, 2}, + { 0, 1, 0x0c42, 2}, + {-4, 1, 0x0c78, 0}, + { 0, -8, 0x0c40, 2}, + { 0, 1, 0x0c42, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd21[6] = { + {8, 5, 0x0679, 0}, + {0, -10, 0x088e, 2}, + {0, 0, 0x066e, 2}, + {0, -10, 0x088e, 2}, + {0, -10, 0x088e, 2}, + {0, 0, 0x066e, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd22[6] = { + {11, -3, 0x0869, 0}, + { 0, -12, 0x0804, 2}, + { 0, 0, 0x0860, 2}, + {10, -3, 0x0867, 0}, + { 0, -12, 0x0804, 2}, + { 0, 0, 0x0860, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd23[6] = { + {-2, 1, 0x0868, 0}, + { 0, -8, 0x08c0, 2}, + { 0, 0, 0x08c2, 2}, + {-3, 1, 0x0878, 0}, + { 0, -8, 0x08c0, 2}, + { 0, 0, 0x08c2, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd24[4] = { + {0, -10, 0x084c, 2}, + {0, 0, 0x0a6c, 2}, + {0, -9, 0x084c, 2}, + {0, 0, 0x0aa8, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd25[4] = { + {0, -7, 0x084a, 2}, + {0, 0, 0x0c6a, 2}, + {0, -7, 0x084a, 2}, + {0, 0, 0x0ca6, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd26[12] = { + {-18, -24, 0x39a4, 2}, + {-16, -16, 0x39a8, 2}, + {-18, -24, 0x39a4, 2}, + {-18, -24, 0x39a4, 2}, + {-16, -16, 0x39a6, 2}, + {-18, -24, 0x39a4, 2}, + { -6, -17, 0x392d, 0}, + {-16, -24, 0x39a0, 2}, + {-16, -16, 0x39aa, 2}, + { -5, -17, 0x392c, 0}, + {-16, -24, 0x39a0, 2}, + {-16, -16, 0x39aa, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd27[6] = { + { 0, -4, 0x30aa, 2}, + { 0, -4, 0x30aa, 2}, + {-4, -8, 0x3090, 0}, + {12, -8, 0x7090, 0}, + {-6, -10, 0x3091, 0}, + {14, -10, 0x7091, 0}, + }; + static const DrawMultipleData kEndSequence_Dmd28[8] = { + {0, 0, 0x0722, 2}, + {0, -8, 0x09c2, 2}, + {0, 0, 0x4722, 2}, + {0, -8, 0x09c2, 2}, + {0, -9, 0x09c4, 2}, + {0, 0, 0x0722, 2}, + {0, -9, 0x0924, 2}, + {0, 0, 0x0722, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd29[3] = { + {-16, -12, 0x3f08, 2}, + { 0, -12, 0x3f20, 2}, + { 16, -12, 0x3f20, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd30[1] = { + {0, 0, 0x0086, 2}, + }; + static const DrawMultipleData kEndSequence_Dmd31[1] = { + {0, 0, 0x8060, 2}, + }; + static const DrawMultipleData *const kEndSequence_Dmds[] = { + kEndSequence_Dmd0, kEndSequence_Dmd1, kEndSequence_Dmd2, kEndSequence_Dmd3, + kEndSequence_Dmd4, kEndSequence_Dmd5, kEndSequence_Dmd6, kEndSequence_Dmd7, + kEndSequence_Dmd8, kEndSequence_Dmd9, kEndSequence_Dmd10, kEndSequence_Dmd11, + kEndSequence_Dmd12, kEndSequence_Dmd13, kEndSequence_Dmd14, kEndSequence_Dmd15, + kEndSequence_Dmd16, kEndSequence_Dmd17, kEndSequence_Dmd18, kEndSequence_Dmd19, + kEndSequence_Dmd20, kEndSequence_Dmd21, kEndSequence_Dmd22, kEndSequence_Dmd23, + kEndSequence_Dmd24, kEndSequence_Dmd25, kEndSequence_Dmd26, kEndSequence_Dmd27, + kEndSequence_Dmd28, kEndSequence_Dmd29, kEndSequence_Dmd30, kEndSequence_Dmd31 + }; + + Oam_AllocateFromRegionA(a * 4); + Sprite_Get16BitCoords(k); + Sprite_DrawMultiple(k, kEndSequence_Dmds[j >> 1] + a * sprite_graphics[k], a, &g_ending_coords); +} + +void Credits_SpriteDraw_SetShadowProp(int k, uint8 a) { // 8eaca2 + sprite_flags2[k] = a; + sprite_flags3[k] = 16; +} + +void Credits_SpriteDraw_AddSparkle(int j_count, uint8 xb, uint8 yb) { // 8eace5 + static const uint8 kEnding_Func3_Delay[6] = { 32, 4, 4, 4, 5, 6 }; + sprite_C[0] = j_count; + for (int k = 0; k < j_count; k++) { + int j = sprite_graphics[k]; + if (!sprite_delay_main[k]) { + if (++j >= 6) { + sprite_x_lo[k] = xb; + sprite_y_lo[k] = yb; + j = 0; + } + sprite_graphics[k] = j; + sprite_delay_main[k] = kEnding_Func3_Delay[j]; + } + if (j) + Credits_SpriteDraw_Single(k, 1, 0x1c); + } +} + +void Credits_SpriteDraw_WalkLinkAwayFromPedestal(int k) { // 8eadf7 + static const uint16 kEnding_Func6_Dma[8] = { 0x16c, 0x16e, 0x170, 0x172, 0x16c, 0x174, 0x176, 0x178 }; + if (!sprite_delay_main[k]) { + sprite_graphics[k] = sprite_graphics[k] + 1 & 7; + sprite_delay_main[k] = 4; + } + link_dma_graphics_index = kEnding_Func6_Dma[sprite_graphics[k]]; + sprite_oam_flags[k] = 32; + Credits_SpriteDraw_Single(k, 2, 26); + EndSequence_DrawShadow2(k); + Sprite_MoveXY(k); +} + +void Credits_SpriteDraw_MoveSquirrel(int k) { // 8eae35 + static const int8 kEnding_Func5_Xvel[4] = { 32, 24, -32, -24 }; + static const int8 kEnding_Func5_Yvel[4] = { 8, -8, -8, 8 }; + if (sprite_delay_main[k] < 64) { + sprite_C[k] = sprite_C[k] + 1 & 3; + sprite_A[k]++; + } else { + int j = sprite_C[k]; + sprite_x_vel[k] = kEnding_Func5_Xvel[j]; + sprite_y_vel[k] = kEnding_Func5_Yvel[j]; + Sprite_MoveXY(k); + } +} + +void Credits_SpriteDraw_CirclingBirds(int k) { // 8eae63 + static const int8 kEnding_MoveSprite_Func1_TargetX[2] = { 0x20, -0x20 }; + static const int8 kEnding_MoveSprite_Func1_TargetY[2] = { 0x10, -0x10 }; + + int j = sprite_D[k] & 1; + sprite_x_vel[k] += j ? -1 : 1; + if (sprite_x_vel[k] == (uint8)kEnding_MoveSprite_Func1_TargetX[j]) + sprite_D[k]++; + if (!(frame_counter & 1)) { + j = sprite_head_dir[k] & 1; + sprite_y_vel[k] += j ? -1 : 1; + if (sprite_y_vel[k] == (uint8)kEnding_MoveSprite_Func1_TargetY[j]) + sprite_head_dir[k]++; + } + Sprite_MoveXY(k); +} + +void Credits_HandleCameraScrollControl() { // 8eaea6 + if (link_y_vel != 0) { + uint8 yvel = link_y_vel; + BG2VOFS_copy2 += (int8)yvel; + uint16 *which = sign8(yvel) ? &overworld_unk1 : &overworld_unk1_neg; + *which += abs8(yvel); + if (!sign16(*which - 0x10)) { + *which -= 0x10; + overworld_screen_trans_dir_bits2 |= sign8(yvel) ? 8 : 4; + } + (sign8(yvel) ? overworld_unk1_neg : overworld_unk1) = -*which; + uint16 r4 = (int8)yvel, subp; + WORD(byte_7E069E[0]) = r4; + uint8 oi = BYTE(overlay_index); + if (oi != 0x97 && oi != 0x9d) { + if (oi == 0xb5 || oi == 0xbe) { + subp = (r4 & 3) << 14; + r4 >>= 2; + if (r4 >= 0x3000) + r4 |= 0xf000; + } else { + subp = (r4 & 1) << 15; + r4 >>= 1; + if (r4 >= 0x7000) + r4 |= 0xf000; + } + uint32 tmp = BG1VOFS_subpixel | BG1VOFS_copy2 << 16; + tmp += subp | r4 << 16; + BG1VOFS_subpixel = (uint16)(tmp); + BG1VOFS_copy2 = (uint16)(tmp >> 16); + } + } + + if (link_x_vel != 0) { + uint8 xvel = link_x_vel; + BG2HOFS_copy2 += (int8)xvel; + uint16 *which = sign8(xvel) ? &overworld_unk3 : &overworld_unk3_neg; + *which += abs8(xvel); + if (!sign16(*which - 0x10)) { + *which -= 0x10; + overworld_screen_trans_dir_bits2 |= sign8(xvel) ? 2 : 1; + } + (sign8(xvel) ? overworld_unk3_neg : overworld_unk3) = -*which; + + uint16 r4 = (int8)xvel, subp; + WORD(byte_7E069E[1]) = r4; + uint8 oi = BYTE(overlay_index); + if (oi != 0x97 && oi != 0x9d && r4 != 0) { + if (oi == 0x95 || oi == 0x9e) { + subp = (r4 & 3) << 14; + r4 >>= 2; + if (r4 >= 0x3000) + r4 |= 0xf000; + } else { + subp = (r4 & 1) << 15; + r4 >>= 1; + if (r4 >= 0x7000) + r4 |= 0xf000; + } + uint32 tmp = BG1HOFS_subpixel | BG1HOFS_copy2 << 16; + tmp += subp | r4 << 16; + BG1HOFS_subpixel = (uint16)(tmp), BG1HOFS_copy2 = (uint16)(tmp >> 16); + } + } + + if (BYTE(overlay_index) == 0x9c) { + uint32 tmp = BG1VOFS_subpixel | BG1VOFS_copy2 << 16; + tmp -= 0x2000; + BG1VOFS_subpixel = (uint16)(tmp), BG1VOFS_copy2 = (uint16)(tmp >> 16) + WORD(byte_7E069E[0]); + BG1HOFS_copy2 = BG2HOFS_copy2; + } else if (BYTE(overlay_index) == 0x97 || BYTE(overlay_index) == 0x9d) { + uint32 tmp = BG1VOFS_subpixel | BG1VOFS_copy2 << 16; + tmp += 0x2000; + BG1VOFS_subpixel = (uint16)(tmp), BG1VOFS_copy2 = (uint16)(tmp >> 16); + tmp = BG1HOFS_subpixel | BG1HOFS_copy2 << 16; + tmp += 0x2000; + BG1HOFS_subpixel = (uint16)(tmp), BG1HOFS_copy2 = (uint16)(tmp >> 16); + } + + if (dungeon_room_index == 0x181) { + BG1VOFS_copy2 = BG2VOFS_copy2 | 0x100; + BG1HOFS_copy2 = BG2HOFS_copy2; + } +} + +void EndSequence_32() { // 8ebc6d + EnableForceBlank(); + EraseTileMaps_triforce(); + TransferFontToVRAM(); + Credits_LoadCoolBackground(); + Credits_InitializePolyhedral(); + INIDISP_copy = 128; + overworld_palette_aux_or_main = 0x200; + hud_palette = 1; + Palette_Load_HUD(); + flag_update_cgram_in_nmi++; + deaths_per_palace[4] = 0; + deaths_per_palace[13] += death_save_counter; + int sum = deaths_per_palace[13]; + for (int i = 12; i >= 0; i--) + sum += deaths_per_palace[i]; + death_var2 = sum; + death_save_counter = 0; + link_health_current = kHealthAfterDeath[link_health_capacity >> 3]; + savegame_is_darkworld = 0x40; + SaveGameFile(); + aux_palette_buffer[38] = 0; + main_palette_buffer[38] = 0; + aux_palette_buffer[0] = 0; + main_palette_buffer[0] = 0; + TM_copy = 0x16; + TS_copy = 0; + R16 = 0x6800; + R18 = 0; + ending_which_dung = 0; + BG2VOFS_copy2 = -0x48; + BG2HOFS_copy2 = 0x90; + BG3VOFS_copy2 = 0; + BG3HOFS_copy2 = 0; + Credits_AddNextAttribution(); + music_control = 0x22; + CGWSEL_copy = 0; + CGADSUB_copy = 162; + zelda_ppu_write(BG2SC, 0x12); + COLDATA_copy0 = 0x3f; + COLDATA_copy1 = 0x5f; + COLDATA_copy2 = 0x9f; + subsubmodule_index = 64; + INIDISP_copy = 0; + + HdmaSetup(0, 0xebd53, 0x42, 0, (uint8)BG2HOFS, 0); + HDMAEN_copy = 0x80; + + BG2HOFS_copy = BG2HOFS_copy2; + BG2VOFS_copy = BG2VOFS_copy2; + BG1HOFS_copy = BG1HOFS_copy2; + BG1VOFS_copy = BG1VOFS_copy2; +} + +void Credits_FadeOutFixedCol() { // 8ebd66 + if (--subsubmodule_index == 0) { + subsubmodule_index = 16; + if (COLDATA_copy0 != 32) { + COLDATA_copy0--; + } else if (COLDATA_copy1 != 64) { + COLDATA_copy1--; + } else if (COLDATA_copy2 != 128) { + COLDATA_copy2--; + } + } +} + +void Credits_FadeColorAndBeginAnimating() { // 8ebd8b + Credits_FadeOutFixedCol(); + nmi_disable_core_updates = 1; + Credits_AnimateTheTriangles(); + if (!(frame_counter & 3)) { + if (++BG2HOFS_copy2 == 0xc00) + zelda_ppu_write_word(BG1SC, 0x1300); + room_bounds_y.a1 = BG2HOFS_copy2 >> 1; + room_bounds_y.a0 = room_bounds_y.a1 + BG2HOFS_copy2; + room_bounds_y.b0 = room_bounds_y.a0 >> 1; + room_bounds_y.b1 = room_bounds_y.a1 >> 1; + if (BG3VOFS_copy2 == 3288) { + R16 = 0x80; + submodule_index++; + } else { + BG3VOFS_copy2++; + if ((BG3VOFS_copy2 & 7) == 0) { + R18 = BG3VOFS_copy2 >> 3; + Credits_AddNextAttribution(); + } + } + } + BG2HOFS_copy = BG2HOFS_copy2; + BG2VOFS_copy = BG2VOFS_copy2; + BG1HOFS_copy = BG1HOFS_copy2; + BG1VOFS_copy = BG1VOFS_copy2; +} + +void Credits_AddNextAttribution() { // 8ebe24 + static const uint8 kEnding_Func9_Tab2[14] = { 1, 0, 2, 3, 10, 6, 5, 8, 11, 9, 7, 12, 13, 15 }; + static const uint16 kEnding_Digits_ScrollY[14] = { 0x290, 0x298, 0x2a0, 0x2a8, 0x2b0, 0x2ba, 0x2c2, 0x2ca, 0x2d2, 0x2da, 0x2e2, 0x2ea, 0x2f2, 0x310 }; + static const uint16 kEnding_Credits_DigitChar[2] = { 0x3ce6, 0x3cf6 }; + + uint16 *dst = vram_upload_data + (vram_upload_offset >> 1); + + dst[0] = swap16(R16); + dst[1] = 0x3e40; + dst[2] = kEnding_MapData[159]; + dst += 3; + + if (R18 < 394) { + const uint8 *src = &kEnding_Credits_Text[kEnding_Credits_Offs[R18]]; + if (*src != 0xff) { + *dst++ = swap16(R16 + *src++); + int n = *src++; + *dst++ = swap16(n); + n = (n + 1) >> 1; + do { + *dst++ = kEnding_MapData[*src++]; + } while (--n); + } + + if ((ending_which_dung & 1) || R18 * 2 == kEnding_Digits_ScrollY[ending_which_dung >> 1]) { + int t = kEnding_Credits_DigitChar[ending_which_dung & 1]; + WORD(g_ram[0xce]) = t; + + dst[0] = swap16(R16 + 0x19); + dst[1] = 0x500; + + uint16 deaths = deaths_per_palace[kEnding_Func9_Tab2[ending_which_dung >> 1]]; + if (deaths >= 1000) + deaths = 999; + + dst[4] = t + deaths % 10, deaths /= 10; + dst[3] = t + deaths % 10, deaths /= 10; + dst[2] = t + deaths; + dst += 5; + ending_which_dung++; + } + } + +done: + R16 += 0x20; + if (!(R16 & 0x3ff)) + R16 = (R16 & 0x6800) ^ 0x800; + vram_upload_offset = (char *)dst - (char *)vram_upload_data; + BYTE(*dst) = 0xff; + nmi_load_bg_from_vram = 1; +} + +void Credits_AddEndingSequenceText() { // 8ec303 + + uint16 *dst = vram_upload_data; + dst[0] = 0x60; + dst[1] = 0xfe47; + dst[2] = kEnding_MapData[159]; + dst += 3; + + const uint8 *curo = &kEnding0_Data[kEnding0_Offs[submodule_index >> 1]]; + const uint8 *endo = &kEnding0_Data[kEnding0_Offs[(submodule_index >> 1) + 1]]; + do { + dst[0] = WORD(curo[0]); + dst[1] = WORD(curo[2]); + int m = (dst[1] >> 9) & 0x7f; + dst += 2, curo += 4; + do { + *dst++ = kEnding_MapData[*curo++]; + } while (--m >= 0); + } while (curo != endo); + + vram_upload_offset = (char *)dst - (char *)vram_upload_data; + BYTE(*dst) = 0xff; + nmi_load_bg_from_vram = 1; +} + +void Credits_BrightenTriangles() { // 8ec37c + if (!(frame_counter & 15) && ++INIDISP_copy == 15) + submodule_index++; + Credits_AnimateTheTriangles(); +} + +void Credits_StopCreditsScroll() { // 8ec391 + if (!--BYTE(R16)) { + darkening_or_lightening_screen = 0; + palette_filter_countdown = 0; + WORD(mosaic_target_level) = 0x1f; + submodule_index++; + R16 = 0xc0; + R18 = 0; + } + Credits_AnimateTheTriangles(); +} + +void Credits_FadeAndDisperseTriangles() { // 8ec3b8 + BYTE(R16)--; + if (!BYTE(R18)) { + ApplyPaletteFilter_bounce(); + if (BYTE(palette_filter_countdown)) { + Credits_AnimateTheTriangles(); + return; + } + BYTE(R18)++; + } + if (BYTE(R16)) { + Credits_AnimateTheTriangles(); + return; + } + submodule_index++; + PaletteFilter_WishPonds_Inner(); +} + +void Credits_FadeInTheEnd() { // 8ec3d5 + if (!(frame_counter & 7)) { + PaletteFilter_SP5F(); + if (!BYTE(palette_filter_countdown)) + submodule_index++;; + } + Credits_HangForever(); +} + +void Credits_HangForever() { // 8ec41a + static const OamEntSigned kEndSequence37_Oams[4] = { + {-96, -72, 0x00, 0x3b}, + {-80, -72, 0x02, 0x3b}, + {-64, -72, 0x04, 0x3b}, + {-48, -72, 0x06, 0x3b}, + }; + memcpy(oam_buf, kEndSequence37_Oams, 4 * 4); + bytewise_extended_oam[0] = bytewise_extended_oam[1] = bytewise_extended_oam[2] = bytewise_extended_oam[3] = 2; +} + +void CrystalCutscene_InitializePolyhedral() { // 9ecdd9 + poly_config1 = 156; + poly_config_color_mode = 1; + is_nmi_thread_active = 1; + intro_did_run_step = 1; + poly_base_x = 32; + poly_base_y = 32; + BYTE(poly_var1) = 32; + poly_which_model = 0; + poly_a = 16; + TS_copy = 0; + TM_copy = 0x16; +} + diff --git a/ending.h b/ending.h new file mode 100644 index 00000000..60977e87 --- /dev/null +++ b/ending.h @@ -0,0 +1,91 @@ +#pragma once + +struct IntroSpriteEnt { + int8 x, y; + uint8 charnum, flags; + uint8 ext; +}; + +void Intro_SetupScreen(); +void Intro_LoadTextPointersAndPalettes(); +void Credits_LoadScene_Overworld_PrepGFX(); +void Credits_LoadScene_Overworld_Overlay(); +void Credits_LoadScene_Overworld_LoadMap(); +void Credits_OperateScrollingAndTileMap(); +void Credits_LoadCoolBackground(); +void Credits_LoadScene_Dungeon(); +void Module19_TriforceRoom(); +void Intro_InitializeBackgroundSettings(); +void Polyhedral_InitializeThread(); +void Module00_Intro(); +void Intro_Init(); +void Intro_Init_Continue(); +void Intro_Clear1kbBlocksOfWRAM(); +void Intro_InitializeMemory_darken(); +void IntroZeldaFadein(); +void Intro_FadeInBg(); +void Intro_SwordComingDown(); +void Intro_WaitPlayer(); +void FadeMusicAndResetSRAMMirror(); +void Intro_InitializeTriforcePolyThread(); +void Intro_InitGfx_Helper(); +void LoadTriforceSpritePalette(); +void Intro_HandleAllTriforceAnimations(); +void Scene_AnimateEverySprite(); +void Intro_AnimateTriforce(); +void Intro_RunStep(); +void Intro_AnimOneObj(int k); +void Intro_SpriteType_A_0(int k); +void Intro_SpriteType_B_0(int k); +void AnimateSceneSprite_DrawTriangle(int k); +void Intro_CopySpriteType4ToOam(int k); +void EXIT_0CCA90(int k); +void InitializeSceneSprite_Copyright(int k); +void AnimateSceneSprite_Copyright(int k); +void InitializeSceneSprite_Sparkle(int k); +void AnimateSceneSprite_Sparkle(int k); +void AnimateSceneSprite_AddObjectsToOamBuffer(int k, const IntroSpriteEnt *src, int num); +void AnimateSceneSprite_MoveTriangle(int k); +void TriforceRoom_PrepGFXSlotForPoly(); +void Credits_InitializePolyhedral(); +void AdvancePolyhedral(); +void TriforceRoom_HandlePoly(); +void Credits_AnimateTheTriangles(); +void InitializeSceneSprite_TriforceRoomTriangle(int k); +void Intro_SpriteType_B_456(int k); +void AnimateTriforceRoomTriangle_HandleContracting(int k); +void InitializeSceneSprite_CreditsTriangle(int k); +void AnimateSceneSprite_CreditsTriangle(int k); +void Intro_DisplayLogo(); +void Intro_SetupSwordAndIntroFlash(); +void Intro_PeriodicSwordAndIntroFlash(); +void Module1A_Credits(); +void Credits_LoadNextScene_Overworld(); +void Credits_LoadNextScene_Dungeon(); +void Credits_PrepAndLoadSprites(); +void Credits_ScrollScene_Overworld(); +void Credits_ScrollScene_Dungeon(); +void Credits_HandleSceneFade(); +void Credits_SpriteDraw_DrawShadow(int k); +void EndSequence_DrawShadow2(int k); +void Ending_Func2(int k, uint8 ain); +void Credits_SpriteDraw_ActivateAndRunSprite(int k, uint8 a); +void Credits_SpriteDraw_PreexistingSpriteDraw(int k, uint8 a); +void Credits_SpriteDraw_Single(int k, uint8 a, uint8 j); +void Credits_SpriteDraw_SetShadowProp(int k, uint8 a); +void Credits_SpriteDraw_AddSparkle(int j_count, uint8 xb, uint8 yb); +void Credits_SpriteDraw_WalkLinkAwayFromPedestal(int k); +void Credits_SpriteDraw_MoveSquirrel(int k); +void Credits_SpriteDraw_CirclingBirds(int k); +void Credits_HandleCameraScrollControl(); +void EndSequence_32(); +void Credits_FadeOutFixedCol(); +void Credits_FadeColorAndBeginAnimating(); +void Credits_AddNextAttribution(); +void Credits_AddEndingSequenceText(); +void Credits_BrightenTriangles(); +void Credits_StopCreditsScroll(); +void Credits_FadeAndDisperseTriangles(); +void Credits_FadeInTheEnd(); +void Credits_HangForever(); +void CrystalCutscene_InitializePolyhedral(); diff --git a/hud.cpp b/hud.cpp new file mode 100644 index 00000000..7286ee59 --- /dev/null +++ b/hud.cpp @@ -0,0 +1,1486 @@ +#include +#include +#include +#include +#include +#include +#include "zelda_rtl.h" + +#include "variables.h" +#include "hud.h" +const uint8 kMaxBombsForLevel[] = { 10, 15, 20, 25, 30, 35, 40, 50 }; +const uint8 kMaxArrowsForLevel[] = { 30, 35, 40, 45, 50, 55, 60, 70 }; +static const uint8 kMaxHealthForLevel[] = { 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, 25, 25, 25, 25, 25, 25 }; +static const uint16 kHudItemInVramPtr[20] = { + 0x11c8, 0x11ce, 0x11d4, 0x11da, + 0x11e0, 0x1288, 0x128e, 0x1294, + 0x129a, 0x12a0, 0x1348, 0x134e, + 0x1354, 0x135a, 0x1360, 0x1408, + 0x140e, 0x1414, 0x141a, 0x1420, +}; +static const uint16 kHudBottlesGfx[128] = { + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x2563, 0x2563, 0x255b, 0x2554, 0x24f5, 0x24f5, + 0x255b, 0x2558, 0x2555, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554, + 0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554, + 0x2552, 0x2564, 0x2561, 0x2554, 0x256a, 0x2550, 0x255b, 0x255b, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2550, 0x2554, 0x2561, 0x2558, 0x2554, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2554, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2556, 0x255e, 0x255e, 0x2553, 0x24f5, 0x2551, 0x2554, 0x2554, +}; +static const uint16 kHudItemBottles[9][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2044, 0x2045, 0x2046, 0x2047}, + {0x2837, 0x2838, 0x2cc3, 0x2cd3}, + {0x24d2, 0x64d2, 0x24e2, 0x24e3}, + {0x3cd2, 0x7cd2, 0x3ce2, 0x3ce3}, + {0x2cd2, 0x6cd2, 0x2ce2, 0x2ce3}, + {0x2855, 0x6855, 0x2c57, 0x2c5a}, + {0x2837, 0x2838, 0x2839, 0x283a}, + {0x2837, 0x2838, 0x2839, 0x283a}, +}; +static const uint16 kHudItemBow[5][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x28ba, 0x28e9, 0x28e8, 0x28cb}, + {0x28ba, 0x284a, 0x2849, 0x28cb}, + {0x28ba, 0x28e9, 0x28e8, 0x28cb}, + {0x28ba, 0x28bb, 0x24ca, 0x28cb}, +}; +static const uint16 kHudItemBoomerang[3][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2cb8, 0x2cb9, 0x2cf5, 0x2cc9}, + {0x24b8, 0x24b9, 0x24f5, 0x24c9}, +}; +static const uint16 kHudItemHookshot[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x24f5, 0x24f6, 0x24c0, 0x24f5}, +}; +static const uint16 kHudItemBombs[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2cb2, 0x2cb3, 0x2cc2, 0x6cc2}, +}; +static const uint16 kHudItemMushroom[3][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2444, 0x2445, 0x2446, 0x2447}, + {0x203b, 0x203c, 0x203d, 0x203e}, +}; +static const uint16 kHudItemFireRod[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x24b0, 0x24b1, 0x24c0, 0x24c1}, +}; +static const uint16 kHudItemIceRod[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2cb0, 0x2cbe, 0x2cc0, 0x2cc1}, +}; +static const uint16 kHudItemBombos[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x287d, 0x287e, 0xe87e, 0xe87d}, +}; +static const uint16 kHudItemEther[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2876, 0x2877, 0xE877, 0xE876}, +}; +static const uint16 kHudItemQuake[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2866, 0x2867, 0xE867, 0xE866}, +}; +static const uint16 kHudItemTorch[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x24bc, 0x24bd, 0x24cc, 0x24cd}, +}; +static const uint16 kHudItemHammer[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x20b6, 0x20b7, 0x20c6, 0x20c7}, +}; +static const uint16 kHudItemFlute[4][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x20d0, 0x20d1, 0x20e0, 0x20e1}, + {0x2cd4, 0x2cd5, 0x2ce4, 0x2ce5}, + {0x2cd4, 0x2cd5, 0x2ce4, 0x2ce5}, +}; +static const uint16 kHudItemBugNet[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x3c40, 0x3c41, 0x2842, 0x3c43}, +}; +static const uint16 kHudItemBookMudora[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x3ca5, 0x3ca6, 0x3cd8, 0x3cd9}, +}; +static const uint16 kHudItemCaneSomaria[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x24dc, 0x24dd, 0x24ec, 0x24ed}, +}; +static const uint16 kHudItemCaneByrna[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2cdc, 0x2cdd, 0x2cec, 0x2ced}, +}; +static const uint16 kHudItemCape[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x24b4, 0x24b5, 0x24c4, 0x24c5}, +}; +static const uint16 kHudItemMirror[4][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x28de, 0x28df, 0x28ee, 0x28ef}, + {0x2c62, 0x2c63, 0x2c72, 0x2c73}, + {0x2886, 0x2887, 0x2888, 0x2889}, +}; +static const uint16 kHudItemGloves[3][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2130, 0x2131, 0x2140, 0x2141}, + {0x28da, 0x28db, 0x28ea, 0x28eb}, +}; +static const uint16 kHudItemBoots[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x3429, 0x342a, 0x342b, 0x342c}, +}; +static const uint16 kHudItemFlippers[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2c9a, 0x2c9b, 0x2c9d, 0x2c9e}, +}; +static const uint16 kHudItemMoonPearl[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2433, 0x2434, 0x2435, 0x2436}, +}; +static const uint16 kHudItemEmpty[1][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, +}; +static const uint16 kHudItemSword[5][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x2c64, 0x2cce, 0x2c75, 0x3d25}, + {0x2c8a, 0x2c65, 0x2474, 0x3d26}, + {0x248a, 0x2465, 0x3c74, 0x2d48}, + {0x288a, 0x2865, 0x2c74, 0x2d39}, +}; +static const uint16 kHudItemShield[4][4] = { + {0x24f5, 0x24f5, 0x24f5, 0x24f5}, + {0x2cfd, 0x6cfd, 0x2cfe, 0x6cfe}, + {0x34ff, 0x74ff, 0x349f, 0x749f}, + {0x2880, 0x2881, 0x288d, 0x288e}, +}; +static const uint16 kHudItemArmor[5][4] = { + {0x3c68, 0x7c68, 0x3c78, 0x7c78}, + {0x2c68, 0x6c68, 0x2c78, 0x6c78}, + {0x2468, 0x6468, 0x2478, 0x6478}, +}; +static const uint16 kHudItemDungeonCompass[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x24bf, 0x64bf, 0x2ccf, 0x6ccf}, +}; +static const uint16 kHudItemPalaceItem[3][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x28d6, 0x68d6, 0x28e6, 0x28e7}, + {0x354b, 0x354c, 0x354d, 0x354e}, +}; +static const uint16 kHudItemDungeonMap[2][4] = { + {0x20f5, 0x20f5, 0x20f5, 0x20f5}, + {0x28de, 0x28df, 0x28ee, 0x28ef}, +}; +static const uint16 kHudPendants0[2][4] = { + {0x313b, 0x313c, 0x313d, 0x313e}, + {0x252b, 0x252c, 0x252d, 0x252e} +}; +static const uint16 kHudPendants1[2][4] = { + {0x313b, 0x313c, 0x313d, 0x313e}, + {0x2d2b, 0x2d2c, 0x2d2d, 0x2d2e} +}; +static const uint16 kHudPendants2[2][4] = { + {0x313b, 0x313c, 0x313d, 0x313e}, + {0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e} +}; +static const uint16 kHudItemHeartPieces[4][4] = { + {0x2484, 0x6484, 0x2485, 0x6485}, + {0x24ad, 0x6484, 0x2485, 0x6485}, + {0x24ad, 0x6484, 0x24ae, 0x6485}, + {0x24ad, 0x64ad, 0x24ae, 0x6485}, +}; +static const uint16 kHudAbilityText[80] = { + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d27, + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d61, 0x2d54, 0x2d50, 0x2d53, + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d63, 0x2d50, 0x2d5b, 0x2d5a, + 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, + 0x2cf5, 0x2cf5, 0x2c2e, 0x2cf5, 0x2cf5, 0x2d5f, 0x2d64, 0x2d5b, 0x2d5b, 0x2cf5, + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d61, 0x2d64, 0x2d5d, 0x2cf5, + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d62, 0x2d66, 0x2d58, 0x2d5c, + 0x2cf5, 0x2cf5, 0x2cf5, 0x207f, 0x207f, 0x2c01, 0x2c18, 0x2c28, 0x207f, 0x207f, +}; +static const uint16 kHudGlovesText[20] = { + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d28, + 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2cf5, 0x2d5b, 0x2d58, 0x2d55, 0x2d63, 0x2d29, +}; +static const uint16 kProgressIconPendantsBg[90] = { + 0x28fb, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x68fb, + 0x28fc, 0x2521, 0x2522, 0x2523, 0x2524, 0x253f, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x24f5, 0x213b, 0x213c, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x24f5, 0x213d, 0x213e, 0x24f5, 0x68fc, + 0xa8fb, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xe8fb, +}; +static const uint16 kProgressIconCrystalsBg[90] = { + 0x28fb, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x28f9, 0x68fb, + 0x28fc, 0x252f, 0x2534, 0x2535, 0x2536, 0x2537, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x68fc, + 0x28fc, 0x24f5, 0x24f5, 0x3146, 0x3147, 0x3146, 0x3147, 0x24f5, 0x24f5, 0x68fc, + 0xa8fb, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xa8f9, 0xe8fb, +}; +static const uint16 kHudItemText[320] = { + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2557, 0x255e, 0x255e, 0x255a, 0x2562, 0x2557, 0x255e, 0x2563, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x255c, 0x2551, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2558, 0x2561, 0x2554, 0x2561, 0x255e, 0x2553, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2558, 0x2552, 0x2554, 0x2561, 0x255e, 0x2553, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x255c, 0x2551, 0x255e, 0x2562, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2554, 0x2563, 0x2557, 0x2554, 0x2561, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2560, 0x2564, 0x2550, 0x255a, 0x2554, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255b, 0x2550, 0x255c, 0x255f, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2557, 0x2550, 0x255c, 0x255c, 0x2554, 0x2561, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2562, 0x2557, 0x255e, 0x2565, 0x2554, 0x255b, 0x24f5, 0x24f5, + 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x2551, 0x255e, 0x255e, 0x255a, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x255c, 0x2564, 0x2553, 0x255e, 0x2561, 0x2550, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c, + 0x2552, 0x2550, 0x255d, 0x2554, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x24f5, 0x2562, 0x255e, 0x255c, 0x2550, 0x2561, 0x2558, 0x2550, + 0x2552, 0x2550, 0x255d, 0x2554, 0x24f5, 0x255e, 0x2555, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2568, 0x2561, 0x255d, 0x2550, + 0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2552, 0x2550, 0x255f, 0x2554, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, +}; +static const uint16 kHudBottlesItemText[128] = { + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2564, 0x2562, 0x2557, 0x2561, 0x255e, 0x255e, 0x255c, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x255e, 0x2563, 0x2563, 0x255b, 0x2554, 0x24f5, 0x24f5, + 0x255b, 0x2558, 0x2555, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554, + 0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554, + 0x2552, 0x2564, 0x2561, 0x2554, 0x256a, 0x2550, 0x255b, 0x255b, 0x255c, 0x2554, 0x2553, 0x2558, 0x2552, 0x2558, 0x255d, 0x2554, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x2550, 0x2554, 0x2561, 0x2558, 0x2554, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2551, 0x2554, 0x2554, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2556, 0x255e, 0x255e, 0x2553, 0x24f5, 0x2551, 0x2554, 0x2554, +}; +static const uint16 kHudMushroomItemText[16] = { + 0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x255f, 0x255e, 0x2566, 0x2553, 0x2554, 0x2561, 0x24f5, +}; +static const uint16 kHudFluteItemText[32] = { + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x255b, 0x2564, 0x2563, 0x2554, 0x24f5, 0x24f5, 0x24f5, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x2555, 0x255b, 0x2564, 0x2563, 0x2554, 0x24f5, 0x24f5, 0x24f5 +}; +static const uint16 kHudMirrorItemText[16] = { + 0x255c, 0x2550, 0x2556, 0x2558, 0x2552, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x255c, 0x2558, 0x2561, 0x2561, 0x255e, 0x2561 +}; +static const uint16 kHudBowItemText[48] = { + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x256e, 0x256f, 0x257c, 0x257d, 0x257e, 0x257f, + 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x256b, 0x256c, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, 0x24f5, + 0x256b, 0x256c, 0x24f5, 0x256e, 0x256f, 0x24f5, 0x24f5, 0x24f5, 0x2578, 0x2579, 0x257a, 0x257b, 0x257c, 0x257d, 0x257e, 0x257f, +}; +static const uint16 kHudTilemap[165] = { + 0x207f, 0x207f, 0x2850, 0xa856, 0x2852, 0x285b, 0x285b, 0x285c, 0x207f, 0x3ca8, 0x207f, 0x207f, 0x2c88, 0x2c89, 0x207f, 0x20a7, 0x20a9, 0x207f, 0x2871, 0x207f, 0x207f, 0x207f, 0x288b, 0x288f, 0x24ab, 0x24ac, 0x688f, 0x688b, 0x207f, 0x207f, 0x207f, 0x207f, + 0x207f, 0x207f, 0x2854, 0x2871, 0x2858, 0x207f, 0x207f, 0x285d, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, + 0x207f, 0x207f, 0x2854, 0x304e, 0x2858, 0x207f, 0x207f, 0x285d, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, + 0x207f, 0x207f, 0x2854, 0x305e, 0x2859, 0xa85b, 0xa85b, 0xa85c, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, + 0x207f, 0x207f, 0x2854, 0x305e, 0x6854, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, 0x207f, + 0x207f, 0x207f, 0xa850, 0x2856, 0xe850, +}; +const uint16 *const kHudItemBoxGfxPtrs[] = { + kHudItemBow[0], + kHudItemBoomerang[0], + kHudItemHookshot[0], + kHudItemBombs[0], + kHudItemMushroom[0], + kHudItemFireRod[0], + kHudItemIceRod[0], + kHudItemBombos[0], + kHudItemEther[0], + kHudItemQuake[0], + kHudItemTorch[0], + kHudItemHammer[0], + kHudItemFlute[0], + kHudItemBugNet[0], + kHudItemBookMudora[0], + kHudItemBottles[0], + kHudItemCaneSomaria[0], + kHudItemCaneByrna[0], + kHudItemCape[0], + kHudItemMirror[0], + kHudItemGloves[0], + kHudItemBoots[0], + kHudItemFlippers[0], + kHudItemMoonPearl[0], + kHudItemEmpty[0], + kHudItemSword[0], + kHudItemShield[0], + kHudItemArmor[0], + kHudItemBottles[0], + kHudItemBottles[0], + kHudItemBottles[0], + kHudItemBottles[0], +}; +static const uint16 kUpdateMagicPowerTilemap[17][4] = { + {0x3cf5, 0x3cf5, 0x3cf5, 0x3cf5}, + {0x3cf5, 0x3cf5, 0x3cf5, 0x3c5f}, + {0x3cf5, 0x3cf5, 0x3cf5, 0x3c4c}, + {0x3cf5, 0x3cf5, 0x3cf5, 0x3c4d}, + {0x3cf5, 0x3cf5, 0x3cf5, 0x3c4e}, + {0x3cf5, 0x3cf5, 0x3c5f, 0x3c5e}, + {0x3cf5, 0x3cf5, 0x3c4c, 0x3c5e}, + {0x3cf5, 0x3cf5, 0x3c4d, 0x3c5e}, + {0x3cf5, 0x3cf5, 0x3c4e, 0x3c5e}, + {0x3cf5, 0x3c5f, 0x3c5e, 0x3c5e}, + {0x3cf5, 0x3c4c, 0x3c5e, 0x3c5e}, + {0x3cf5, 0x3c4d, 0x3c5e, 0x3c5e}, + {0x3cf5, 0x3c4e, 0x3c5e, 0x3c5e}, + {0x3c5f, 0x3c5e, 0x3c5e, 0x3c5e}, + {0x3c4c, 0x3c5e, 0x3c5e, 0x3c5e}, + {0x3c4d, 0x3c5e, 0x3c5e, 0x3c5e}, + {0x3c4e, 0x3c5e, 0x3c5e, 0x3c5e}, +}; +static const uint16 kDungFloorIndicator_Gfx0[11] = { 0x2508, 0x2509, 0x2509, 0x250a, 0x250b, 0x250c, 0x250d, 0x251d, 0xe51c, 0x250e, 0x7f }; +static const uint16 kDungFloorIndicator_Gfx1[11] = { 0x2518, 0x2519, 0xa509, 0x251a, 0x251b, 0x251c, 0x2518, 0xa51d, 0xe50c, 0xa50e, 0x7f }; +void Hud_RefreshIcon() { + Hud_SearchForEquippedItem(); + Hud_UpdateHud(); + Hud_Rebuild(); + overworld_map_state = 0; +} + +uint8 CheckPalaceItemPosession() { + switch (cur_palace_index_x2 >> 1) { + case 2: return link_item_bow != 0; + case 3: return link_item_gloves != 0; + case 5: return link_item_hookshot != 0; + case 6: return link_item_hammer != 0; + case 7: return link_item_cane_somaria != 0; + case 8: return link_item_fire_rod != 0; + case 9: return link_armor != 0; + case 10: return link_item_moon_pearl != 0; + case 11: return link_item_gloves != 1; + case 12: return link_shield_type == 3; + case 13: return link_armor == 2; + default: + return 0; + } +} + +void Hud_GotoPrevItem() { + if (--hud_cur_item < 1) + hud_cur_item = 20; +} + +void Hud_GotoNextItem() { + if (++hud_cur_item >= 21) + hud_cur_item = 1; +} + +void Hud_FloorIndicator() { // 8afd0c + uint16 a = hud_floor_changed_timer; + if (a == 0) { + Hud_RemoveSuperBombIndicator(); + return; + } + a += 1; + if (a == 0xc0) + a = 0; + WORD(hud_floor_changed_timer) = a; + + hud_tile_indices_buffer[0xf2 / 2] = 0x251e; + hud_tile_indices_buffer[0x134 / 2] = 0x251f; + hud_tile_indices_buffer[0x132 / 2] = 0x2520; + hud_tile_indices_buffer[0xf4 / 2] = 0x250f; + + int k = 0, j; + + if (!sign8(dung_cur_floor)) { + if (!WORD(dung_cur_floor) && dungeon_room_index != 2 && sram_progress_indicator < 2) + sound_effect_ambient = 3; + j = dung_cur_floor; + } else { + sound_effect_ambient = 5; + k++; + j = dung_cur_floor ^ 0xff; + } + hud_tile_indices_buffer[k + 0xf2 / 2] = kDungFloorIndicator_Gfx0[j]; + hud_tile_indices_buffer[k + 0x132 / 2] = kDungFloorIndicator_Gfx1[j]; + flag_update_hud_in_nmi++; +} + +void Hud_RemoveSuperBombIndicator() { // 8afd90 + hud_tile_indices_buffer[0xf2 / 2] = 0x7f; + hud_tile_indices_buffer[0x132 / 2] = 0x7f; + hud_tile_indices_buffer[0xf4 / 2] = 0x7f; + hud_tile_indices_buffer[0x134 / 2] = 0x7f; +} + +void Hud_SuperBombIndicator() { // 8afda8 + if (!super_bomb_indicator_unk1) { + if (sign8(super_bomb_indicator_unk2)) + goto remove; + super_bomb_indicator_unk2--; + super_bomb_indicator_unk1 = 62; + } + super_bomb_indicator_unk1--; + if (sign8(super_bomb_indicator_unk2)) { +remove: + super_bomb_indicator_unk2 = 0xff; + Hud_RemoveSuperBombIndicator(); + return; + } + + int r = super_bomb_indicator_unk2 % 10; + int q = super_bomb_indicator_unk2 / 10; + + int j = sign8(r - 1) ? 9 : r - 1; + hud_tile_indices_buffer[0xf4 / 2] = kDungFloorIndicator_Gfx0[j]; + hud_tile_indices_buffer[0x134 / 2] = kDungFloorIndicator_Gfx1[j]; + + j = sign8(q - 1) ? 10 : q - 1; + hud_tile_indices_buffer[0xf2 / 2] = kDungFloorIndicator_Gfx0[j]; + hud_tile_indices_buffer[0x132 / 2] = kDungFloorIndicator_Gfx1[j]; + +} + +void Hud_RefillLogic() { // 8ddb92 + if (overworld_map_state) + return; + if (link_magic_filler) { + if (link_magic_power >= 128) { + link_magic_power = 128; + link_magic_filler = 0; + } else { + link_magic_filler--; + link_magic_power++; + if ((frame_counter & 3) == 0 && sound_effect_1 == 0) + sound_effect_1 = 45; + } + } + + uint16 a = link_rupees_actual; + if (a != link_rupees_goal) { + if (a >= link_rupees_goal) { + if ((int16)--a < 0) + link_rupees_goal = a = 0; + } else { + if (++a >= 1000) + link_rupees_goal = a = 999; + } + link_rupees_actual = a; + if (sound_effect_1 == 0) { + if ((rupee_sfx_sound_delay++ & 7) == 0) + sound_effect_1 = 41; + } else { + rupee_sfx_sound_delay = 0; + } + } else { + rupee_sfx_sound_delay = 0; + } + + if (link_bomb_filler) { + link_bomb_filler--; + if (link_item_bombs != kMaxBombsForLevel[link_bomb_upgrades]) + link_item_bombs++; + } + + if (link_arrow_filler) { + link_arrow_filler--; + if (link_num_arrows != kMaxArrowsForLevel[link_arrow_upgrades]) + link_num_arrows++; + if (link_item_bow && (link_item_bow & 1) == 1) { + link_item_bow++; + Hud_RefreshIcon(); + } + } + + if (!flag_is_link_immobilized && !link_hearts_filler && + link_health_current < kMaxHealthForLevel[link_health_capacity >> 3]) { + if (link_lowlife_countdown_timer_beep) { + link_lowlife_countdown_timer_beep--; + } else if (!sound_effect_1) { + sound_effect_1 = 43; + link_lowlife_countdown_timer_beep = 32 - 1; + } + } + + if (is_doing_heart_animation) + goto doing_animation; + if (link_hearts_filler) { + if (link_health_current < link_health_capacity) { + link_health_current += 8; + if (link_health_current >= link_health_capacity) + link_health_current = link_health_capacity; + + if (sound_effect_2 == 0) + sound_effect_2 = 13; + + link_hearts_filler -= 8; + is_doing_heart_animation++; + animate_heart_refill_countdown = 7; + +doing_animation: + Hud_Update_IgnoreHealth(); + Hud_AnimateHeartRefill(); + flag_update_hud_in_nmi++; + return; + } + link_health_current = link_health_capacity; + link_hearts_filler = 0; + } + Hud_Update_IgnoreItemBox(); + flag_update_hud_in_nmi++; +} + +void Hud_Module_Run() { // 8ddd36 + byte_7E0206++; + switch (overworld_map_state) { + case 0: Hud_ClearTileMap(); break; + case 1: Hud_Init(); break; + case 2: Hud_BringMenuDown(); break; + case 3: Hud_ChooseNextMode(); break; + case 4: Hud_NormalMenu(); break; + case 5: Hud_UpdateHud(); break; + case 6: Hud_CloseMenu(); break; + case 7: Hud_GotoBottleMenu(); break; + case 8: Hud_InitBottleMenu(); break; + case 9: Hud_ExpandBottleMenu(); break; + case 10: Hud_BottleMenu(); break; + case 11: Hud_EraseBottleMenu(); break; + case 12: Hud_RestoreNormalMenu(); break; + default: + assert(0); + } +} + +void Hud_ClearTileMap() { // 8ddd5a + uint16 *target = (uint16 *)&g_ram[0x1000]; + for (int i = 0; i < 1024; i++) + target[i] = 0x207f; + sound_effect_2 = 17; + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; + overworld_map_state++; +} + +void Hud_Init() { // 8dddab + Hud_SearchForEquippedItem(); + + Hud_DrawYButtonItems(Hud_GetPaletteMask(1)); + Hud_DrawUnknownBox(Hud_GetPaletteMask(1)); + + Hud_DrawAbilityText(Hud_GetPaletteMask(1)); + Hud_DrawAbilityIcons(); + Hud_DrawProgressIcons(); + Hud_DrawMoonPearl(); + + Hud_DrawEquipment(Hud_GetPaletteMask(1)); + Hud_DrawShield(); + Hud_DrawArmor(); + Hud_DrawMapAndBigKey(); + Hud_DrawCompass(); + + uint8 or_all = 0; + for (int i = 0; i < 20; i++) + or_all |= (&link_item_bow)[i]; + + if (or_all) { + uint8 or_bottle = link_bottle_info[0] | link_bottle_info[1] | link_bottle_info[2] | link_bottle_info[3]; + if (or_bottle == 0) { + link_item_bottles = 0; + } else if (!link_item_bottles) { + uint8 bottle_pos = 1; + if (!link_bottle_info[0]) { + bottle_pos++; + if (!link_bottle_info[1]) { + bottle_pos++; + if (!link_bottle_info[2]) + bottle_pos++; + } + } + link_item_bottles = bottle_pos; + } + + if (!Hud_DoWeHaveThisItem()) + Hud_EquipNextItem(); + + Hud_DrawSelectedYButtonItem(); + if (hud_cur_item == 16) { + Hud_DrawBottleMenu(Hud_GetPaletteMask(1)); + } + } + + timer_for_flashing_circle = 16; + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; + overworld_map_state++; +} + +void Hud_BringMenuDown() { // 8dde59 + BG3VOFS_copy2 -= 8; + if (BG3VOFS_copy2 == 0xff18) + overworld_map_state++; +} + +void Hud_ChooseNextMode() { // 8dde6e + uint8 or_all = 0; + for (int i = 0; i < 20; i++) + or_all |= (&link_item_bow)[i]; + + if (or_all != 0) { + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; + if (!Hud_DoWeHaveThisItem()) + Hud_EquipNextItem(); + + Hud_DrawSelectedYButtonItem(); + overworld_map_state = 4; + if (hud_cur_item == 16) + overworld_map_state = 10; + } else { + if (filtered_joypad_H) + overworld_map_state = 5; + } +} + +bool Hud_DoWeHaveThisItem() { // 8ddeb0 + return (&link_item_bow)[hud_cur_item - 1] != 0; +} + +void Hud_EquipPrevItem() { // 8dded9 + do { + Hud_GotoPrevItem(); + } while (!Hud_DoWeHaveThisItem()); +} + +void Hud_EquipNextItem() { // 8ddee2 + do { + Hud_GotoNextItem(); + } while (!Hud_DoWeHaveThisItem()); +} + +void Hud_EquipItemAbove() { // 8ddeeb + do { + Hud_GotoPrevItem(); + Hud_GotoPrevItem(); + Hud_GotoPrevItem(); + Hud_GotoPrevItem(); + Hud_GotoPrevItem(); + } while (!Hud_DoWeHaveThisItem()); +} + +void Hud_EquipItemBelow() { // 8ddf00 + do { + Hud_GotoNextItem(); + Hud_GotoNextItem(); + Hud_GotoNextItem(); + Hud_GotoNextItem(); + Hud_GotoNextItem(); + } while (!Hud_DoWeHaveThisItem()); +} + +void Hud_NormalMenu() { // 8ddf15 + timer_for_flashing_circle++; + if (!BYTE(joypad1H_last)) + BYTE(tmp1) = 0; + + if (filtered_joypad_H & 0x10) { + overworld_map_state = 5; + sound_effect_2 = 18; + return; + } + + if (!BYTE(tmp1)) { + uint16 old_item = hud_cur_item; + if (filtered_joypad_H & 8) { + Hud_EquipItemAbove(); + } else if (filtered_joypad_H & 4) { + Hud_EquipItemBelow(); + } else if (filtered_joypad_H & 2) { + Hud_EquipPrevItem(); + } else if (filtered_joypad_H & 1) { + Hud_EquipNextItem(); + } + BYTE(tmp1) = filtered_joypad_H; + if (hud_cur_item != old_item) { + timer_for_flashing_circle = 16; + sound_effect_2 = 32; + } + } + Hud_DrawYButtonItems(Hud_GetPaletteMask(1)); + Hud_DrawSelectedYButtonItem(); + if (hud_cur_item == 16) + overworld_map_state = 7; + + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; + //g_ram[0x15d0] = 0; +} + +void Hud_UpdateHud() { // 8ddfa9 + overworld_map_state++; + Hud_UpdateOnly(); + Hud_UpdateEquippedItem(); +} + +void Hud_UpdateEquippedItem() { // 8ddfaf + static const uint8 kHudItemToItem[21] = { 0, 3, 2, 14, 1, 10, 5, 6, 15, 16, 17, 9, 4, 8, 7, 12, 11, 18, 13, 19, 20 }; + assert(hud_cur_item < 21); + eq_selected_y_item = kHudItemToItem[hud_cur_item]; +} + +void Hud_CloseMenu() { // 8ddfba + BG3VOFS_copy2 += 8; + if (BG3VOFS_copy2) + return; + Hud_Rebuild(); + overworld_map_state = 0; + submodule_index = 0; + main_module_index = saved_module_for_menu; + if (submodule_index) + Hud_RestoreTorchBackground(); + if (eq_selected_y_item != 5 && eq_selected_y_item != 6) { + eq_debug_variable = 2; + link_debug_value_1 = 0; + } else { + assert(!link_debug_value_1); + eq_debug_variable = 0; + } +} + +void Hud_GotoBottleMenu() { // 8ddffb + byte_7E0205 = 0; + overworld_map_state++; +} + +void Hud_InitBottleMenu() { // 8de002 + int r = byte_7E0205; + for (int i = 21; i <= 30; i++) + uvram_screen.row[11 + r].col[i] = 0x207f; + + if (++byte_7E0205 == 19) { + overworld_map_state++; + byte_7E0205 = 17; + } + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; +} + +void Hud_ExpandBottleMenu() { // 8de08c + static const uint16 kBottleMenuTop[] = { 0x28FB, 0x28F9, 0x28F9, 0x28F9, 0x28F9, 0x28F9, 0x28F9, 0x28F9, 0x28F9, 0x68FB }; + static const uint16 kBottleMenuTop2[] = { 0x28FC, 0x24F5, 0x24F5, 0x24F5, 0x24F5, 0x24F5, 0x24F5, 0x24F5, 0x24F5, 0x68FC }; + static const uint16 kBottleMenuBottom[] = { 0xA8FB, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xA8F9, 0xE8FB }; + + int r = byte_7E0205; + for (int i = 0; i < 10; i++) + uvram_screen.row[11 + r].col[21 + i] = kBottleMenuTop[i]; + + for (int i = 0; i < 10; i++) + uvram_screen.row[12 + r].col[21 + i] = kBottleMenuTop2[i]; + + for (int i = 0; i < 10; i++) + uvram_screen.row[29].col[21 + i] = kBottleMenuBottom[i]; + + if (sign8(--byte_7E0205)) + overworld_map_state++; + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; +} + +void Hud_BottleMenu() { // 8de0df + timer_for_flashing_circle++; + if (filtered_joypad_H & 0x10) { + sound_effect_2 = 18; + overworld_map_state = 5; + } else if (filtered_joypad_H & 3) { + if (filtered_joypad_H & 2) { + Hud_EquipPrevItem(); + } else { + Hud_EquipNextItem(); + } + timer_for_flashing_circle = 16; + sound_effect_2 = 32; + Hud_DrawYButtonItems(Hud_GetPaletteMask(1)); + Hud_DrawSelectedYButtonItem(); + overworld_map_state++; + byte_7E0205 = 0; + return; + } + Hud_UpdateBottleMenu(); + if (filtered_joypad_H & 12) { + uint8 old_val = link_item_bottles - 1, val = old_val; + + if (filtered_joypad_H & 8) { + do { + val = (val - 1) & 3; + } while (!link_bottle_info[val]); + } else { + do { + val = (val + 1) & 3; + } while (!link_bottle_info[val]); + } + if (old_val != val) { + link_item_bottles = val + 1; + timer_for_flashing_circle = 16; + sound_effect_2 = 32; + } + } +} + +void Hud_UpdateBottleMenu() { // 8de17f + + for (int y = 12; y <= 28; y++) + for (int x = 0; x < 8; x++) + uvram_screen.row[y].col[22 + x] = 0x24f5; + + Hud_DrawItem(0x1372, kHudItemBottles[link_bottle_info[0]]); + Hud_DrawItem(0x1472, kHudItemBottles[link_bottle_info[1]]); + Hud_DrawItem(0x1572, kHudItemBottles[link_bottle_info[2]]); + Hud_DrawItem(0x1672, kHudItemBottles[link_bottle_info[3]]); + Hud_DrawItem(0x1408, kHudItemBottles[link_item_bottles ? link_bottle_info[link_item_bottles - 1] : 0]); + + uint16 *p = (uint16 *)&g_ram[kHudItemInVramPtr[hud_cur_item - 1]]; + uvram_screen.row[6].col[25] = p[0]; + uvram_screen.row[6].col[26] = p[1]; + uvram_screen.row[7].col[25] = p[32]; + uvram_screen.row[7].col[26] = p[33]; + + if (timer_for_flashing_circle & 0x10) { + int o = ((link_item_bottles - 1) * 0x100 + 0x88) / 2; + + uvram_screen.row[10].col[21 + o] = 0x3C61; + uvram_screen.row[10].col[22 + o] = 0x3C61 | 0x4000; + + uvram_screen.row[11].col[20 + o] = 0x3C70; + uvram_screen.row[11].col[23 + o] = 0x3C70 | 0x4000; + + uvram_screen.row[12].col[20 + o] = 0xBC70; + uvram_screen.row[12].col[23 + o] = 0xBC70 | 0x4000; + + uvram_screen.row[13].col[21 + o] = 0xBC61; + uvram_screen.row[13].col[22 + o] = 0xBC61 | 0x4000; + + uvram_screen.row[10].col[20 + o] = 0x3C60; + uvram_screen.row[10].col[23 + o] = 0x3C60 | 0x4000; + + uvram_screen.row[13].col[23 + o] = 0x3C60 | 0xC000; + uvram_screen.row[13].col[20 + o] = 0x3C60 | 0x8000; + } + + if (link_item_bottles) { + const uint16 *src = kHudBottlesGfx + (link_bottle_info[link_item_bottles - 1] - 1) * 16; + for (int i = 0; i < 8; i++) { + uvram_screen.row[8].col[22 + i] = src[i]; + uvram_screen.row[9].col[22 + i] = src[i + 8]; + } + } + + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; +} + +void Hud_EraseBottleMenu() { // 8de2fd + int r = byte_7E0205; + for (int i = 0; i < 10; i++) + uvram_screen.row[11 + r].col[21 + i] = 0x207f; + if (++byte_7E0205 == 19) + overworld_map_state++; + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; +} + +void Hud_RestoreNormalMenu() { // 8de346 + Hud_DrawProgressIcons(); + Hud_DrawMoonPearl(); + Hud_DrawEquipment(Hud_GetPaletteMask(1)); + Hud_DrawShield(); + Hud_DrawArmor(); + Hud_DrawMapAndBigKey(); + Hud_DrawCompass(); + + overworld_map_state = 4; + nmi_subroutine_index = 1; + BYTE(nmi_load_target_addr) = 0x22; +} + +void Hud_DrawItem(uint16 a, const uint16 *src) { // 8de372 + uint16 *dst = (uint16 *)&g_ram[a]; + dst[0] = src[0]; + dst[1] = src[1]; + dst[32] = src[2]; + dst[33] = src[3]; +} + +void Hud_SearchForEquippedItem() { // 8de399 + uint8 or_all = 0; + for (int i = 0; i < 20; i++) + or_all |= (&link_item_bow)[i]; + + if (or_all == 0) { + hud_cur_item = 0; + hud_cur_item_hi = 0; + hud_var1 = 0; + } else { + if (!hud_cur_item) + hud_cur_item = 1; + if (!Hud_DoWeHaveThisItem()) + Hud_EquipNextItem(); + } +} + +uint16 Hud_GetPaletteMask(uint8 what) { // 8de3c8 + return what == 0 ? 0xe3ff : 0xffff; +} + +void Hud_DrawYButtonItems(uint16 mask) { // 8de3d9 + uint16 t; + + t = 0x3CFB & mask; + uvram_screen.row[5].col[1] = t; + uvram_screen.row[19].col[1] = (t |= 0x8000); + uvram_screen.row[19].col[19] = (t |= 0x4000); + uvram_screen.row[5].col[19] = (t ^= 0x8000); + + for (int i = 6; i < 19; i++) { + uvram_screen.row[i].col[1] = (t = 0x3cfc & mask); + uvram_screen.row[i].col[19] = (t |= 0x4000); + } + + for (int i = 2; i < 19; i++) { + uvram_screen.row[5].col[i] = (t = 0x3CF9 & mask); + uvram_screen.row[19].col[i] = (t |= 0x8000); + } + + for (int y = 6; y < 19; y++) { + for (int x = 2; x < 19; x++) + uvram_screen.row[y].col[x] = 0x24F5; + } + uvram_screen.row[6].col[2] = 0x3CF0; + uvram_screen.row[7].col[2] = 0x3CF1; + uvram_screen.row[5].col[3] = 0x246E; + uvram_screen.row[5].col[4] = 0x246F; + + Hud_DrawItem(0x11c8, kHudItemBow[link_item_bow]); + Hud_DrawItem(0x11ce, kHudItemBoomerang[link_item_boomerang]); + Hud_DrawItem(0x11d4, kHudItemHookshot[link_item_hookshot]); + Hud_DrawItem(0x11da, kHudItemBombs[link_item_bombs ? 1 : 0]); + Hud_DrawItem(0x11e0, kHudItemMushroom[link_item_mushroom]); + Hud_DrawItem(0x1288, kHudItemFireRod[link_item_fire_rod]); + Hud_DrawItem(0x128e, kHudItemIceRod[link_item_ice_rod]); + Hud_DrawItem(0x1294, kHudItemBombos[link_item_bombos_medallion]); + Hud_DrawItem(0x129a, kHudItemEther[link_item_ether_medallion]); + Hud_DrawItem(0x12a0, kHudItemQuake[link_item_quake_medallion]); + Hud_DrawItem(0x1348, kHudItemTorch[link_item_torch]); + Hud_DrawItem(0x134e, kHudItemHammer[link_item_hammer]); + Hud_DrawItem(0x1354, kHudItemFlute[link_item_flute]); + Hud_DrawItem(0x135a, kHudItemBugNet[link_item_bug_net]); + Hud_DrawItem(0x1360, kHudItemBookMudora[link_item_book_of_mudora]); + Hud_DrawItem(0x1408, kHudItemBottles[link_item_bottles ? link_bottle_info[link_item_bottles - 1] : 0]); + Hud_DrawItem(0x140e, kHudItemCaneSomaria[link_item_cane_somaria]); + Hud_DrawItem(0x1414, kHudItemCaneByrna[link_item_cane_byrna]); + Hud_DrawItem(0x141a, kHudItemCape[link_item_cape]); + Hud_DrawItem(0x1420, kHudItemMirror[link_item_mirror]); +} + +void Hud_DrawUnknownBox(uint16 palmask) { // 8de647 + uint16 t; + + t = 0x3CFB & palmask; + uvram_screen.row[5].col[21] = t; + uvram_screen.row[10].col[21] = (t |= 0x8000); + uvram_screen.row[10].col[30] = (t |= 0x4000); + uvram_screen.row[5].col[30] = (t ^= 0x8000); + + t = 0x3CFC & palmask; + for (int i = 0; i < 4; i++) { + uvram_screen.row[6 + i].col[21] = t; + uvram_screen.row[6 + i].col[30] = t | 0x4000; + } + + t = 0x3CF9 & palmask; + for (int i = 0; i < 8; i++) { + uvram_screen.row[5].col[22 + i] = t; + uvram_screen.row[10].col[22 + i] = t | 0x8000; + } + + for (int i = 0; i < 8; i++) { + uvram_screen.row[6].col[22 + i] = 0x24F5; + uvram_screen.row[7].col[22 + i] = 0x24F5; + uvram_screen.row[8].col[22 + i] = 0x24F5; + uvram_screen.row[9].col[22 + i] = 0x24F5; + } +} + +void Hud_DrawAbilityText(uint16 palmask) { // 8de6b6 + for (int i = 0; i < 17; i++) { + uvram_screen.row[22].col[2 + i] = 0x24F5; + uvram_screen.row[23].col[2 + i] = 0x24F5; + uvram_screen.row[24].col[2 + i] = 0x24F5; + uvram_screen.row[25].col[2 + i] = 0x24F5; + uvram_screen.row[26].col[2 + i] = 0x24F5; + uvram_screen.row[27].col[2 + i] = 0x24F5; + uvram_screen.row[28].col[2 + i] = 0x24F5; + } + + uint8 flags = link_ability_flags; + const uint16 *src = kHudAbilityText; + uint16 *dst = &uvram_screen.row[22].col[4]; + for (int i = 0; i < 2; i++) { + for (int j = 0; j < 4; j++) { + if (flags & 0x80) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst[4] = src[4]; + dst[32 + 0] = src[5]; + dst[32 + 1] = src[6]; + dst[32 + 2] = src[7]; + dst[32 + 3] = src[8]; + dst[32 + 4] = src[9]; + } + src += 10; + dst += 5; + flags <<= 1; + } + dst += 2 * 32 - 5 * 4; + } + + uint16 t; + + t = 0x24FB & palmask; + uvram_screen.row[21].col[1] = t; + uvram_screen.row[29].col[1] = (t |= 0x8000); + uvram_screen.row[29].col[19] = (t |= 0x4000); + uvram_screen.row[21].col[19] = (t ^= 0x8000); + + t = 0x24FC & palmask; + for (int i = 0; i < 7; i++) { + uvram_screen.row[22 + i].col[1] = t; + uvram_screen.row[22 + i].col[19] = t | 0x4000; + } + + t = 0x24F9 & palmask; + for (int i = 0; i < 17; i++) { + uvram_screen.row[21].col[2 + i] = t; + uvram_screen.row[29].col[2 + i] = t | 0x8000; + } + + uvram_screen.row[22].col[2] = 0xA4F0; + uvram_screen.row[23].col[2] = 0x24F2; + uvram_screen.row[21].col[3] = 0x2482; + uvram_screen.row[21].col[4] = 0x2483; +} + +void Hud_DrawAbilityIcons() { // 8de7b7 + Hud_DrawItem(0x16D0, kHudItemGloves[link_item_gloves]); + Hud_DrawItem(0x16C8, kHudItemBoots[link_item_boots]); + Hud_DrawItem(0x16D8, kHudItemFlippers[link_item_flippers]); + if (link_item_gloves) + Hud_DrawGlovesText(link_item_gloves != 1); +} + +void Hud_DrawGlovesText(uint8 idx) { // 8de81a + const uint16 *src = kHudGlovesText + idx * 10; + uint16 *dst = &uvram_screen.row[22].col[4]; + memcpy(dst, src, sizeof(uint16) * 5); + memcpy(dst + 32, src + 5, sizeof(uint16) * 5); +} + +void Hud_DrawProgressIcons() { // 8de9c8 + if (sram_progress_indicator < 3) + Hud_DrawProgressIcons_Pendants(); + else + Hud_DrawProgressIcons_Crystals(); +} + +void Hud_DrawProgressIcons_Pendants() { // 8de9d3 + const uint16 *src = kProgressIconPendantsBg; + for (int y = 0; y < 9; y++) { + memcpy(&uvram_screen.row[11 + y].col[21], src, sizeof(uint16) * 10); + src += 10; + } + + Hud_DrawItem(0x13B2, kHudPendants0[(link_which_pendants >> 0) & 1]); + Hud_DrawItem(0x146E, kHudPendants1[(link_which_pendants >> 1) & 1]); + Hud_DrawItem(0x1476, kHudPendants2[(link_which_pendants >> 2) & 1]); +} + +void Hud_DrawProgressIcons_Crystals() { // 8dea62 + const uint16 *src = kProgressIconCrystalsBg; + for (int y = 0; y < 9; y++, src += 10) + memcpy(&uvram_screen.row[11 + y].col[21], src, sizeof(uint16) * 10); + + uint8 f = link_has_crystals; + if (f & 1) { + uvram_screen.row[14].col[24] = 0x2D44; + uvram_screen.row[14].col[25] = 0x2D45; + } + if (f & 2) { + uvram_screen.row[14].col[26] = 0x2D44; + uvram_screen.row[14].col[27] = 0x2D45; + } + if (f & 4) { + uvram_screen.row[16].col[23] = 0x2D44; + uvram_screen.row[16].col[24] = 0x2D45; + } + if (f & 8) { + uvram_screen.row[16].col[25] = 0x2D44; + uvram_screen.row[16].col[26] = 0x2D45; + } + if (f & 16) { + uvram_screen.row[16].col[27] = 0x2D44; + uvram_screen.row[16].col[28] = 0x2D45; + } + if (f & 32) { + uvram_screen.row[18].col[24] = 0x2D44; + uvram_screen.row[18].col[25] = 0x2D45; + } + if (f & 64) { + uvram_screen.row[18].col[26] = 0x2D44; + uvram_screen.row[18].col[27] = 0x2D45; + } +} + +void Hud_DrawSelectedYButtonItem() { // 8deb3a + uint16 *p = (uint16 *)&g_ram[kHudItemInVramPtr[hud_cur_item - 1]]; + uvram_screen.row[6].col[25] = p[0]; + uvram_screen.row[6].col[26] = p[1]; + uvram_screen.row[7].col[25] = p[32]; + uvram_screen.row[7].col[26] = p[33]; + + if (timer_for_flashing_circle & 0x10) { + p[-32] = 0x3C61; + p[-31] = 0x3C61 | 0x4000; + + p[-1] = 0x3C70; + p[2] = 0x3C70 | 0x4000; + + p[31] = 0xBC70; + p[34] = 0xBC70 | 0x4000; + + p[64] = 0xBC61; + p[65] = 0xBC61 | 0x4000; + + p[-33] = 0x3C60; + p[-30] = 0x3C60 | 0x4000; + + p[66] = 0x3C60 | 0xC000; + p[63] = 0x3C60 | 0x8000; + } + + const uint16 *src_p; + + if (hud_cur_item == 16 && link_item_bottles) { + src_p = &kHudBottlesItemText[(link_bottle_info[link_item_bottles - 1] - 1) * 16]; + } else if (hud_cur_item == 5 && link_item_mushroom != 1) { + src_p = &kHudMushroomItemText[(link_item_mushroom - 2) * 16]; + } else if (hud_cur_item == 20 && link_item_mirror != 1) { + src_p = &kHudMirrorItemText[(link_item_mirror - 2) * 16]; + } else if (hud_cur_item == 13 && link_item_flute != 1) { + src_p = &kHudFluteItemText[(link_item_flute - 2) * 16]; + } else if (hud_cur_item == 1 && link_item_bow != 1) { + src_p = &kHudBowItemText[(link_item_bow - 2) * 16]; + } else { + src_p = &kHudItemText[(hud_cur_item - 1) * 16]; + } + memcpy(&uvram_screen.row[8].col[22], src_p + 0, sizeof(uint16) * 8); + memcpy(&uvram_screen.row[9].col[22], src_p + 8, sizeof(uint16) * 8); +} + +void Hud_DrawMoonPearl() { // 8dece9 + Hud_DrawItem(0x16e0, kHudItemMoonPearl[link_item_moon_pearl]); +} + +void Hud_DrawEquipment(uint16 palmask) { // 8ded29 + uint16 t = palmask & 0x28FB; + uvram_screen.row[21].col[21] = t | 0x0000; + uvram_screen.row[29].col[21] = t | 0x8000; + uvram_screen.row[29].col[30] = t | 0xC000; + uvram_screen.row[21].col[30] = t | 0x4000; + + t = 0x28FC & palmask; + for (int i = 0; i < 7; i++) { + uvram_screen.row[22 + i].col[21] = t; + uvram_screen.row[22 + i].col[30] = t | 0x4000; + } + + t = 0x28F9 & palmask; + for (int i = 0; i < 8; i++) { + uvram_screen.row[21].col[22 + i] = t; + uvram_screen.row[29].col[22 + i] = t | 0x8000; + } + + for (int i = 0; i < 7; i++) { + for (int j = 0; j < 8; j++) + uvram_screen.row[22 + i].col[22 + j] = 0x24F5; + } + + // Draw dotted lines + t = 0x28D7 & palmask; + for (int i = 0; i < 8; i++) + uvram_screen.row[25].col[22 + i] = t; + + static const uint16 kHudEquipmentDungeonItemText[16] = { + 0x2479, 0x247a, 0x247b, 0x247c, 0x248c, 0x24f5, 0x24f5, 0x24f5, + 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x24f5, + }; + + for (int i = 0; i < 8; i++) { + uvram_screen.row[22].col[22 + i] = kHudEquipmentDungeonItemText[i + 0] & palmask; + uvram_screen.row[26].col[22 + i] = kHudEquipmentDungeonItemText[i + 8] & palmask; + } + if (cur_palace_index_x2 == 0xff) { + for (int i = 0; i < 8; i++) + uvram_screen.row[26].col[22 + i] = 0x24F5; + Hud_DrawItem(0x16f2, kHudItemHeartPieces[link_heart_pieces]); + } + Hud_DrawItem(0x15ec, kHudItemSword[link_sword_type == 0xff ? 0 : link_sword_type]); +} + +void Hud_DrawShield() { // 8dee21 + Hud_DrawItem(0x15f2, kHudItemShield[link_shield_type]); +} + +void Hud_DrawArmor() { // 8dee3c + Hud_DrawItem(0x15f8, kHudItemArmor[link_armor]); +} + +void Hud_DrawMapAndBigKey() { // 8dee57 + if (cur_palace_index_x2 != 0xff && + (link_bigkey << (cur_palace_index_x2 >> 1)) & 0x8000) { + Hud_DrawItem(0x16F8, kHudItemPalaceItem[CheckPalaceItemPosession() + 1]); + } + if (cur_palace_index_x2 != 0xff && + (link_dungeon_map << (cur_palace_index_x2 >> 1)) & 0x8000) { + Hud_DrawItem(0x16EC, kHudItemDungeonMap[1]); + } +} + +void Hud_DrawCompass() { // 8def39 + if (cur_palace_index_x2 != 0xff && + (link_compass << (cur_palace_index_x2 >> 1)) & 0x8000) { + Hud_DrawItem(0x16F2, kHudItemDungeonCompass[1]); + } +} + +void Hud_DrawBottleMenu(uint16 palmask) { // 8def67 + uint16 t = 0x28FB & palmask; + uvram_screen.row[11].col[21] = t; + uvram_screen.row[29].col[21] = t | 0x8000; + uvram_screen.row[29].col[30] = t | 0xC000; + uvram_screen.row[11].col[30] = t | 0x4000; + + t = 0x28FC & palmask; + for (int i = 0; i < 17; i++) { + uvram_screen.row[12 + i].col[21] = t; + uvram_screen.row[12 + i].col[30] = t | 0x4000; + } + t = 0x28F9 & palmask; + for (int i = 0; i < 8; i++) { + uvram_screen.row[11].col[22 + i] = t; + uvram_screen.row[29].col[22 + i] = t | 0x8000; + } + for (int y = 12; y <= 28; y++) + for (int x = 0; x < 8; x++) + uvram_screen.row[y].col[22 + x] = 0x24f5; + + Hud_DrawItem(0x1372, kHudItemBottles[link_bottle_info[0]]); + Hud_DrawItem(0x1472, kHudItemBottles[link_bottle_info[1]]); + Hud_DrawItem(0x1572, kHudItemBottles[link_bottle_info[2]]); + Hud_DrawItem(0x1672, kHudItemBottles[link_bottle_info[3]]); + Hud_DrawItem(0x1408, kHudItemBottles[link_bottle_info[link_item_bottles - 1]]); + + uint16 *p = (uint16 *)&g_ram[kHudItemInVramPtr[hud_cur_item - 1]]; + + uvram_screen.row[6].col[25] = p[0]; + uvram_screen.row[6].col[26] = p[1]; + uvram_screen.row[7].col[25] = p[32]; + uvram_screen.row[7].col[26] = p[33]; + + int o = ((link_item_bottles - 1) * 0x100 + 0x88) / 2; + + uvram_screen.row[10].col[21 + o] = 0x3C61; + uvram_screen.row[10].col[22 + o] = 0x3C61 | 0x4000; + + uvram_screen.row[11].col[20 + o] = 0x3C70; + uvram_screen.row[11].col[23 + o] = 0x3C70 | 0x4000; + + uvram_screen.row[12].col[20 + o] = 0xBC70; + uvram_screen.row[12].col[23 + o] = 0xBC70 | 0x4000; + + uvram_screen.row[13].col[21 + o] = 0xBC61; + uvram_screen.row[13].col[22 + o] = 0xBC61 | 0x4000; + + uvram_screen.row[10].col[20 + o] = 0x3C60; + uvram_screen.row[10].col[23 + o] = 0x3C60 | 0x4000; + + uvram_screen.row[13].col[23 + o] = 0x3C60 | 0xC000; + uvram_screen.row[13].col[20 + o] = 0x3C60 | 0x8000; + + timer_for_flashing_circle = 16; +} + +void Hud_IntToDecimal(unsigned int number, uint8 *out) { // 8df0f7 + out[0] = number / 100 + 0x90; + out[1] = (number %= 100) / 10 + 0x90; + out[2] = (number % 10) + 0x90; +} + +bool Hud_RefillHealth() { // 8df128 + if (link_health_current >= link_health_capacity) { + link_health_current = link_health_capacity; + link_hearts_filler = 0; + return (is_doing_heart_animation == 0); + } + link_hearts_filler = 160; + return false; +} + +void Hud_AnimateHeartRefill() { // 8df14f + if (--animate_heart_refill_countdown) + return; + uint16 n = ((uint16)((link_health_current & ~7) - 1) >> 3) << 1; + uint16 *p = hud_tile_indices_buffer + 0x34; + if (n >= 20) { + n -= 20; + p += 0x20; + } + n &= 0xff; + animate_heart_refill_countdown = 1; + + static const uint16 kAnimHeartPartial[4] = { 0x24A3, 0x24A4, 0x24A3, 0x24A0 }; + p[n >> 1] = kAnimHeartPartial[animate_heart_refill_countdown_subpos]; + + animate_heart_refill_countdown_subpos = (animate_heart_refill_countdown_subpos + 1) & 3; + if (!animate_heart_refill_countdown_subpos) { + Hud_Rebuild(); + is_doing_heart_animation = 0; + } +} + +bool Hud_RefillMagicPower() { // 8df1b3 + if (link_magic_power >= 0x80) + return true; + link_magic_filler = 0x80; + return false; +} + +void Hud_RestoreTorchBackground() { // 8dfa33 + if (!link_item_torch || !dung_want_lights_out || hdr_dungeon_dark_with_lantern || + dung_num_lit_torches) + return; + hdr_dungeon_dark_with_lantern = 1; + if (dung_hdr_bg2_properties != 2) + TS_copy = 1; +} + +void Hud_RebuildIndoor() { // 8dfa60 + overworld_fixed_color_plusminus = 0; + link_num_keys = 0xff; + Hud_Rebuild(); +} + +void Hud_Rebuild() { // 8dfa70 + memcpy(hud_tile_indices_buffer, kHudTilemap, 165 * sizeof(uint16)); + Hud_UpdateInternal(); + flag_update_hud_in_nmi++; +} + +void Hud_UpdateOnly() { // 8dfa85 + Hud_UpdateInternal(); + flag_update_hud_in_nmi++; +} + +void Hud_UpdateItemBox() { // 8dfafd + if (link_item_bow) { + if (link_item_bow >= 3) { + hud_tile_indices_buffer[15] = 0x2486; + hud_tile_indices_buffer[16] = 0x2487; + link_item_bow = link_num_arrows ? 4 : 3; + } else { + link_item_bow = link_num_arrows ? 2 : 1; + } + } + + if (!hud_cur_item) + return; + + uint8 item_val = (&link_item_bow)[hud_cur_item - 1]; + if (hud_cur_item == 4) + item_val = 1; + else if (hud_cur_item == 16) + item_val = link_bottle_info[item_val - 1]; + + const uint16 *p = kHudItemBoxGfxPtrs[hud_cur_item - 1] + item_val * 4; + + hud_tile_indices_buffer[37] = p[0]; + hud_tile_indices_buffer[38] = p[1]; + hud_tile_indices_buffer[37 + 32] = p[2]; + hud_tile_indices_buffer[38 + 32] = p[3]; +} + +void Hud_UpdateInternal() { // 8dfb91 + Hud_UpdateItemBox(); + Hud_Update_IgnoreItemBox(); +} + +void Hud_Update_IgnoreItemBox() { // 8dfb94 + static const uint16 kHudItemBoxTab1[] = { 0x24A2, 0x24A2, 0x24A2 }; + static const uint16 kHudItemBoxTab2[] = { 0x24A2, 0x24A1, 0x24A0 }; + + Hud_UpdateHearts(&hud_tile_indices_buffer[0x34], kHudItemBoxTab1, link_health_capacity); + Hud_UpdateHearts(&hud_tile_indices_buffer[0x34], kHudItemBoxTab2, (link_health_current + 3) & ~3); + + Hud_Update_IgnoreHealth(); +} + +void Hud_Update_IgnoreHealth() { // 8dfc09 + if (link_magic_consumption >= 1) { + hud_tile_indices_buffer[2] = 0x28F7; + hud_tile_indices_buffer[3] = 0x2851; + hud_tile_indices_buffer[4] = 0x28FA; + } + + const uint16 *src = kUpdateMagicPowerTilemap[(link_magic_power + 7) >> 3]; + hud_tile_indices_buffer[0x23] = src[0]; + hud_tile_indices_buffer[0x43] = src[1]; + hud_tile_indices_buffer[0x63] = src[2]; + hud_tile_indices_buffer[0x83] = src[3]; + + uint8 d[3]; + + Hud_IntToDecimal(link_rupees_actual, d); + hud_tile_indices_buffer[0x28] = 0x2400 | d[0]; + hud_tile_indices_buffer[0x29] = 0x2400 | d[1]; + hud_tile_indices_buffer[0x2A] = 0x2400 | d[2]; + + Hud_IntToDecimal(link_item_bombs, d); + hud_tile_indices_buffer[0x2C] = 0x2400 | d[1]; + hud_tile_indices_buffer[0x2D] = 0x2400 | d[2]; + + Hud_IntToDecimal(link_num_arrows, d); + hud_tile_indices_buffer[0x2F] = 0x2400 | d[1]; + hud_tile_indices_buffer[0x30] = 0x2400 | d[2]; + + d[2] = 0x7f; + if (link_num_keys != 0xff) + Hud_IntToDecimal(link_num_keys, d); + hud_tile_indices_buffer[0x32] = 0x2400 | d[2]; + if (hud_tile_indices_buffer[0x32] == 0x247f) + hud_tile_indices_buffer[0x12] = hud_tile_indices_buffer[0x32]; +} + +void Hud_UpdateHearts(uint16 *dst, const uint16 *src, int n) { // 8dfdab + int x = 0; + + while (n > 0) { + if (x >= 10) { + dst += 0x20; + x = 0; + } + dst[x] = src[n >= 5 ? 2 : 1]; + x++; + n -= 8; + } +} + diff --git a/hud.h b/hud.h new file mode 100644 index 00000000..4f219967 --- /dev/null +++ b/hud.h @@ -0,0 +1,72 @@ +#pragma once +#include "types.h" + + + + + + + + +extern const uint16 *const kHudItemBoxGfxPtrs[]; +void Hud_RefreshIcon(); +uint8 CheckPalaceItemPosession(); +void Hud_GotoPrevItem(); +void Hud_GotoNextItem(); +void Hud_FloorIndicator(); +void Hud_RemoveSuperBombIndicator(); +void Hud_SuperBombIndicator(); +void Hud_RefillLogic(); +void Hud_Module_Run(); +void Hud_ClearTileMap(); +void Hud_Init(); +void Hud_BringMenuDown(); +void Hud_ChooseNextMode(); +bool Hud_DoWeHaveThisItem(); +void Hud_EquipPrevItem(); +void Hud_EquipNextItem(); +void Hud_EquipItemAbove(); +void Hud_EquipItemBelow(); +void Hud_NormalMenu(); +void Hud_UpdateHud(); +void Hud_UpdateEquippedItem(); +void Hud_CloseMenu(); +void Hud_GotoBottleMenu(); +void Hud_InitBottleMenu(); +void Hud_ExpandBottleMenu(); +void Hud_BottleMenu(); +void Hud_UpdateBottleMenu(); +void Hud_EraseBottleMenu(); +void Hud_RestoreNormalMenu(); +void Hud_DrawItem(uint16 a, const uint16 *src); +void Hud_SearchForEquippedItem(); +uint16 Hud_GetPaletteMask(uint8 what); +void Hud_DrawYButtonItems(uint16 mask); +void Hud_DrawUnknownBox(uint16 palmask); +void Hud_DrawAbilityText(uint16 palmask); +void Hud_DrawAbilityIcons(); +void Hud_DrawGlovesText(uint8 idx); +void Hud_DrawProgressIcons(); +void Hud_DrawProgressIcons_Pendants(); +void Hud_DrawProgressIcons_Crystals(); +void Hud_DrawSelectedYButtonItem(); +void Hud_DrawMoonPearl(); +void Hud_DrawEquipment(uint16 palmask); +void Hud_DrawShield(); +void Hud_DrawArmor(); +void Hud_DrawMapAndBigKey(); +void Hud_DrawCompass(); +void Hud_DrawBottleMenu(uint16 palmask); +void Hud_IntToDecimal(unsigned int number, uint8 *out); +bool Hud_RefillHealth(); +void Hud_AnimateHeartRefill(); +bool Hud_RefillMagicPower(); +void Hud_RestoreTorchBackground(); +void Hud_RebuildIndoor(); +void Hud_Rebuild(); +void Hud_UpdateOnly(); +void Hud_UpdateItemBox(); +void Hud_UpdateInternal(); +void Hud_Update_IgnoreItemBox(); +void Hud_Update_IgnoreHealth(); +void Hud_UpdateHearts(uint16 *dst, const uint16 *src, int n); diff --git a/load_gfx.cpp b/load_gfx.cpp new file mode 100644 index 00000000..c160e7ef --- /dev/null +++ b/load_gfx.cpp @@ -0,0 +1,2163 @@ +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" +#include "overworld.h" +#include "load_gfx.h" +#include "player.h" +#include "tables/generated_images.h" +#include "tables/generated_font.h" +#include "tables/generated_palettes.h" +#include "sprite.h" + +static const uint16 kGlovesColor[2] = {0x52f6, 0x376}; +static const uint8 kGraphics_IncrementalVramUpload_Dst[16] = {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}; +static const uint8 kGraphics_IncrementalVramUpload_Src[16] = {0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e}; +static const uint16 kPaletteFilteringBits[64] = { + 0xffff, 0xffff, 0xfffe, 0xffff, 0x7fff, 0x7fff, 0x7fdf, 0xfbff, 0x7f7f, 0x7f7f, 0x7df7, 0xefbf, 0x7bdf, 0x7bdf, 0x77bb, 0xddef, + 0x7777, 0x7777, 0x6edd, 0xbb77, 0x6db7, 0x6db7, 0x5b6d, 0xb6db, 0x5b5b, 0x5b5b, 0x56b6, 0xad6b, 0x5555, 0xad6b, 0x5555, 0xaaab, + 0x5555, 0x5555, 0x2a55, 0x5555, 0x2a55, 0x2a55, 0x294a, 0x5295, 0x2525, 0x2525, 0x2492, 0x4925, 0x1249, 0x1249, 0x1122, 0x4489, + 0x1111, 0x1111, 0x844, 0x2211, 0x421, 0x421, 0x208, 0x1041, 0x101, 0x101, 0x20, 0x401, 1, 1, 0, 1, +}; +static const uint16 kPaletteFilter_Agahnim_Tab[3] = {0x160, 0x180, 0x1a0}; +static const uint8 kMainTilesets[37][8] = { + { 0, 1, 16, 6, 14, 31, 24, 15}, + { 0, 1, 16, 8, 14, 34, 27, 15}, + { 0, 1, 16, 6, 14, 31, 24, 15}, + { 0, 1, 19, 7, 14, 35, 28, 15}, + { 0, 1, 16, 7, 14, 33, 24, 15}, + { 0, 1, 16, 9, 14, 32, 25, 15}, + { 2, 3, 18, 11, 14, 33, 26, 15}, + { 0, 1, 17, 12, 14, 36, 27, 15}, + { 0, 1, 17, 8, 14, 34, 27, 15}, + { 0, 1, 17, 12, 14, 37, 26, 15}, + { 0, 1, 17, 12, 14, 38, 27, 15}, + { 0, 1, 20, 10, 14, 39, 29, 15}, + { 0, 1, 17, 10, 14, 40, 30, 15}, + { 2, 3, 18, 11, 14, 41, 22, 15}, + { 0, 1, 21, 13, 14, 42, 24, 15}, + { 0, 1, 16, 7, 14, 35, 28, 15}, + { 0, 1, 19, 7, 14, 4, 5, 15}, + { 0, 1, 19, 7, 14, 4, 5, 15}, + { 0, 1, 16, 9, 14, 32, 27, 15}, + { 0, 1, 16, 9, 14, 42, 23, 15}, + { 2, 3, 18, 11, 14, 33, 28, 15}, + { 0, 8, 17, 27, 34, 46, 93, 91}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + { 58, 59, 60, 61, 83, 77, 62, 91}, + { 66, 67, 68, 69, 32, 43, 63, 93}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + { 0, 8, 16, 24, 32, 43, 93, 91}, + {113, 114, 113, 114, 32, 43, 93, 91}, + { 58, 59, 60, 61, 83, 77, 62, 91}, + { 66, 67, 68, 69, 32, 43, 63, 89}, + { 0, 114, 113, 114, 32, 43, 93, 15}, + { 22, 57, 29, 23, 64, 65, 57, 30}, + { 0, 70, 57, 114, 64, 65, 57, 15}, +}; +static const uint8 kSpriteTilesets[144][4] = { + { 0, 73, 0, 0}, + {70, 73, 12, 29}, + {72, 73, 19, 29}, + {70, 73, 19, 14}, + {72, 73, 12, 17}, + {72, 73, 12, 16}, + {79, 73, 74, 80}, + {14, 73, 74, 17}, + {70, 73, 18, 0}, + { 0, 73, 0, 80}, + { 0, 73, 0, 17}, + {72, 73, 12, 0}, + { 0, 0, 55, 54}, + {72, 73, 76, 17}, + {93, 44, 12, 68}, + { 0, 0, 78, 0}, + {15, 0, 18, 16}, + { 0, 0, 0, 76}, + { 0, 13, 23, 0}, + {22, 13, 23, 27}, + {22, 13, 23, 20}, + {21, 13, 23, 21}, + {22, 13, 24, 25}, + {22, 13, 23, 25}, + {22, 13, 0, 0}, + {22, 13, 24, 27}, + {15, 73, 74, 17}, + {75, 42, 92, 21}, + {22, 73, 23, 29}, + { 0, 0, 0, 21}, + {22, 13, 23, 16}, + {22, 73, 18, 0}, + {22, 73, 12, 17}, + { 0, 0, 18, 16}, + {22, 13, 0, 17}, + {22, 73, 12, 0}, + {22, 13, 76, 17}, + {14, 13, 74, 17}, + {22, 26, 23, 27}, + {79, 52, 74, 80}, + {53, 77, 101, 54}, + {74, 52, 78, 0}, + {14, 52, 74, 17}, + {81, 52, 93, 89}, + {75, 73, 76, 17}, + {45, 0, 0, 0}, + {93, 0, 18, 89}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {71, 73, 43, 45}, + {70, 73, 28, 82}, + { 0, 73, 28, 82}, + {93, 73, 0, 82}, + {70, 73, 19, 82}, + {75, 77, 74, 90}, + {71, 73, 28, 82}, + {75, 77, 57, 54}, + {31, 44, 46, 82}, + {31, 44, 46, 29}, + {47, 44, 46, 82}, + {47, 44, 46, 49}, + {31, 30, 48, 82}, + {81, 73, 19, 0}, + {79, 73, 19, 80}, + {79, 77, 74, 80}, + {75, 73, 76, 43}, + {31, 32, 34, 83}, + {85, 61, 66, 67}, + {31, 30, 35, 82}, + {31, 30, 57, 58}, + {31, 30, 58, 62}, + {31, 30, 60, 61}, + {64, 30, 39, 63}, + {85, 26, 66, 67}, + {31, 30, 42, 82}, + {31, 30, 56, 82}, + {31, 32, 40, 82}, + {31, 32, 38, 82}, + {31, 44, 37, 82}, + {31, 32, 39, 82}, + {31, 30, 41, 82}, + {31, 44, 59, 82}, + {70, 73, 36, 82}, + {33, 65, 69, 51}, + {31, 44, 40, 49}, + {31, 13, 41, 82}, + {31, 30, 39, 82}, + {31, 32, 39, 83}, + {72, 73, 19, 82}, + {14, 30, 74, 80}, + {31, 32, 38, 83}, + {21, 0, 0, 0}, + {31, 0, 42, 82}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {50, 0, 0, 8}, + {93, 73, 0, 82}, + {85, 73, 66, 67}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, + {97, 86, 87, 80}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, + {97, 86, 87, 80}, + {97, 86, 99, 80}, + {97, 86, 87, 80}, + {97, 86, 51, 80}, + {97, 86, 87, 80}, + {97, 98, 99, 80}, + {97, 98, 99, 80}, +}; +static const uint8 kAuxTilesets[82][4] = { + { 6, 0, 31, 24}, + { 8, 0, 34, 27}, + { 6, 0, 31, 24}, + { 7, 0, 35, 28}, + { 7, 0, 33, 24}, + { 9, 0, 32, 25}, + { 11, 0, 33, 26}, + { 12, 0, 36, 25}, + { 8, 0, 34, 27}, + { 12, 0, 37, 27}, + { 12, 0, 38, 27}, + { 10, 0, 39, 29}, + { 10, 0, 40, 30}, + { 11, 0, 41, 22}, + { 13, 0, 42, 24}, + { 7, 0, 35, 28}, + { 7, 0, 4, 5}, + { 7, 0, 4, 5}, + { 9, 0, 32, 27}, + { 9, 0, 42, 23}, + { 11, 0, 33, 28}, + { 9, 0, 32, 25}, + { 11, 0, 33, 26}, + { 9, 0, 36, 27}, + { 8, 0, 34, 27}, + { 9, 0, 37, 27}, + { 9, 0, 38, 27}, + { 10, 0, 39, 29}, + { 9, 0, 40, 30}, + { 12, 0, 41, 22}, + { 13, 0, 42, 23}, + {114, 0, 43, 93}, + { 0, 0, 0, 0}, + { 0, 87, 76, 0}, + { 0, 86, 79, 0}, + { 0, 83, 77, 0}, + { 0, 82, 73, 0}, + { 0, 85, 74, 0}, + { 0, 83, 84, 0}, + { 0, 81, 78, 0}, + { 0, 0, 0, 0}, + { 0, 80, 75, 0}, + { 0, 83, 77, 0}, + { 0, 85, 84, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 71, 72, 0}, + { 0, 0, 0, 0}, + { 0, 87, 76, 0}, + { 0, 86, 79, 0}, + { 0, 83, 77, 0}, + { 0, 82, 73, 0}, + { 0, 85, 74, 0}, + { 0, 83, 84, 0}, + { 0, 81, 78, 0}, + { 0, 0, 0, 0}, + { 0, 80, 75, 0}, + { 0, 83, 0, 0}, + { 0, 53, 54, 0}, + { 0, 96, 52, 0}, + { 0, 43, 44, 0}, + { 0, 45, 46, 0}, + { 0, 47, 48, 0}, + { 0, 55, 56, 0}, + { 0, 51, 52, 0}, + { 0, 49, 50, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {114, 113, 114, 113}, + { 23, 64, 65, 57}, +}; +static const uint16 kTagalongWhich[14] = {0, 0x600, 0x300, 0x300, 0x300, 0, 0, 0x900, 0x600, 0x600, 0x900, 0x900, 0x600, 0x900}; +static const uint16 kDecodeAnimatedSpriteTile_Tab[57] = { + 0x9c0, 0x30, 0x60, 0x90, 0xc0, 0x300, 0x318, 0x330, 0x348, 0x360, 0x378, 0x390, 0x930, 0x3f0, 0x420, 0x450, + 0x468, 0x600, 0x630, 0x660, 0x690, 0x6c0, 0x6f0, 0x720, 0x750, 0x768, 0x900, 0x930, 0x960, 0x990, 0x9f0, 0, + 0xf0, 0xa20, 0xa50, 0x660, 0x600, 0x618, 0x630, 0x648, 0x678, 0x6d8, 0x6a8, 0x708, 0x738, 0x768, 0x960, 0x900, + 0x3c0, 0x990, 0x9a8, 0x9c0, 0x9d8, 0xa08, 0xa38, 0x600, 0x630, +}; +static const uint16 kSwordTypeToGfxOffs[5] = {0, 0, 0x120, 0x120, 0x120}; +static const uint16 kShieldTypeToGfxOffs[4] = {0x660, 0x660, 0x6f0, 0x900}; +static const int8 kOwBgPalInfo[93] = { + 0, -1, 7, 0, 1, 7, 0, 2, 7, 0, 3, 7, 0, 4, 7, 0, 5, 7, 0, 6, 7, 7, 6, 5, + 0, 8, 7, 0, 9, 7, 0, 10, 7, 0, 11, 7, 0, -1, 7, 0, -1, 7, 3, 4, 7, 4, 4, 3, + 16, -1, 6, 16, 1, 6, 16, 17, 6, 16, 3, 6, 16, 4, 6, 16, 5, 6, 16, 6, 6, 18, 19, 4, + 18, 5, 4, 16, 9, 6, 16, 11, 6, 16, 12, 6, 16, 13, 6, 16, 14, 6, 16, 15, 6, +}; +static const int8 kOwSprPalInfo[40] = { + -1, -1, 3, 10, 3, 6, 3, 1, 0, 2, 3, 14, 3, 2, 19, 1, 11, 12, 17, 1, 7, 5, 17, 0, + 9, 11, 15, 5, 3, 5, 3, 7, 15, 2, 10, 2, 5, 1, 12, 14, +}; +static const int8 kSpotlight_delta_size[4] = {-7, 7, 7, 7}; +static const uint8 kSpotlight_goal[4] = {0, 126, 35, 126}; +static const uint8 kConfigureSpotlightTable_Helper_Tab[129] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf9, 0xf8, 0xf8, + 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf3, 0xf3, 0xf2, 0xf1, 0xf1, 0xf0, 0xef, 0xee, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xdf, 0xde, + 0xdd, 0xdc, 0xdb, 0xda, 0xd8, 0xd7, 0xd6, 0xd5, 0xd3, 0xd2, 0xd0, 0xcf, 0xcd, 0xcc, 0xca, 0xc9, 0xc7, 0xc6, 0xc4, 0xc2, 0xc1, 0xbf, 0xbd, 0xbb, 0xb9, 0xb7, 0xb6, 0xb4, 0xb1, 0xaf, 0xad, 0xab, + 0xa9, 0xa7, 0xa4, 0xa2, 0x9f, 0x9d, 0x9a, 0x97, 0x95, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x82, 0x7f, 0x7b, 0x78, 0x74, 0x70, 0x6c, 0x67, 0x63, 0x5e, 0x59, 0x53, 0x4d, 0x46, 0x3f, 0x37, 0x2d, 0x1f, + 0, +}; +static const uint8 kGraphicsHalfSlotPacks[20] = { + 1, 1, 8, 8, 9, 9, 2, 2, 2, 2, 3, 3, 4, 4, 5, 5, + 8, 8, 8, 8, +}; +static const int8 kGraphicsLoadSp6[20] = { + 10, -1, 3, -1, 0, -1, -1, -1, 1, -1, 2, -1, 0, -1, -1, + -1, -1, -1, -1, -1, +}; +static const uint8 kMirrorWarp_LoadNext_NmiLoad[15] = {0, 14, 15, 16, 17, 0, 0, 0, 0, 0, 0, 18, 19, 20, 0}; +const uint16 *GetFontPtr() { + return kFontData; +} +static const uint8 *GetCompSpritePtr(int i) { + return kSprGfx[i]; +} + +void ApplyPaletteFilter_bounce() { + + const uint16 *load_ptr = kPaletteFilteringBits + (palette_filter_countdown >= 0x10); + + int mask = kUpperBitmasks[palette_filter_countdown & 0xf]; + int dt = darkening_or_lightening_screen ? 1 : -1; + int j = 0; + for (;;) { + uint16 c = main_palette_buffer[j], a = aux_palette_buffer[j]; + if (!(load_ptr[(a & 0x1f) * 2] & mask)) + c += dt; + if (!(load_ptr[(a & 0x3e0) >> 4] & mask)) + c += dt << 5; + if (!(load_ptr[(a & 0x7c00) >> 9] & mask)) + c += dt << 10; + main_palette_buffer[j] = c; + j++; + if (j == 1) + j = 0x20; + else if (j == 0xd8) + j = 0xe0; + else if (j == 0xf0) + break; + } + flag_update_cgram_in_nmi++; + if (!darkening_or_lightening_screen) { + if (++palette_filter_countdown != mosaic_target_level) + return; + } else { + if (palette_filter_countdown-- != mosaic_target_level) + return; + } + darkening_or_lightening_screen ^= 2; + palette_filter_countdown = 0; + subsubmodule_index++; +} + +void PaletteFilter_Range(int from, int to) { + const uint16 *load_ptr = kPaletteFilteringBits + (palette_filter_countdown >= 0x10); + int mask = kUpperBitmasks[palette_filter_countdown & 0xf]; + int dt = darkening_or_lightening_screen ? 1 : -1; + for (int j = from; j != to; j++) { + uint16 c = main_palette_buffer[j], a = aux_palette_buffer[j]; + if (!(load_ptr[(a & 0x1f) * 2] & mask)) + c += dt; + if (!(load_ptr[(a & 0x3e0) >> 4] & mask)) + c += dt << 5; + if (!(load_ptr[(a & 0x7c00) >> 9] & mask)) + c += dt << 10; + main_palette_buffer[j] = c; + } +} + +void PaletteFilter_IncrCountdown() { + if (++palette_filter_countdown == 0x1f) { + palette_filter_countdown = 0; + darkening_or_lightening_screen ^= 2; + if (darkening_or_lightening_screen) + WORD(link_actual_vel_y)++; // wtf? + } + flag_update_cgram_in_nmi++; +} + +uint8 *LoadItemAnimationGfxOne(uint8 *dst, int num, int r12, bool from_temp) { + static const uint8 kIntro_LoadGfx_Tab[10] = { 0, 11, 8, 38, 42, 45, 34, 3, 33, 46 }; + const uint8 *src = from_temp ? &g_ram[0x14000] : GetCompSpritePtr(0); + const uint8 *base_src = src; + src += kIntro_LoadGfx_Tab[r12] * 24; + Expand3To4High(dst, src, base_src, num); + Expand3To4High(dst + 0x20 * num, src + 0x180, base_src, num); + return dst + 0x40 * num; +} + +uint16 snes_divide(uint16 dividend, uint8 divisor) { + return divisor ? dividend / divisor : 0xffff; +} + +void EraseTileMaps_normal() { + EraseTileMaps(0x7f, 0x1ec); +} + +void DecompAndUpload2bpp(uint8 pack) { + Decomp_spr(&g_ram[0x14000], pack); + const uint8 *src = &g_ram[0x14000]; + for (int i = 0; i < 1024; i++, src += 2) + zelda_ppu_write_word(VMDATAL, WORD(src[0])); +} + +void RecoverPegGFXFromMapping() { + if (BYTE(orange_blue_barrier_state)) + Dungeon_UpdatePegGFXBuffer(0x180, 0x0); + else + Dungeon_UpdatePegGFXBuffer(0x0, 0x180); +} + +void LoadOverworldMapPalette() { + memcpy(main_palette_buffer, &kOverworldMapPaletteData[overworld_screen_index & 0x40 ? 0x80 : 0], 256); +} + +void EraseTileMaps_triforce() { // 808333 + EraseTileMaps(0xa9, 0x7f); +} + +void EraseTileMaps_dungeonmap() { // 80833f + EraseTileMaps(0x7f, 0x300); +} + +void EraseTileMaps(uint16 r2, uint16 r0) { // 808355 + uint16 *dst = g_zenv.vram; + for (int i = 0; i < 0x2000; i++) + dst[i] = r0; + + dst = g_zenv.vram + 0x6000; + for (int i = 0; i < 0x800; i++) + dst[i] = r2; +} + +void EnableForceBlank() { // 80893d + zelda_ppu_write(INIDISP, 0x80); + INIDISP_copy = 0x80; + zelda_snes_dummy_write(HDMAEN, 0); + HDMAEN_copy = 0; +} + +void LoadItemGFXIntoWRAM4BPPBuffer() { // 80d231 + uint8 *dst = &g_ram[0x9000 + 0x480]; + dst = LoadItemAnimationGfxOne(dst, 7, 0, false); // rod + dst = LoadItemAnimationGfxOne(dst, 7, 1, false); // hammer + dst = LoadItemAnimationGfxOne(dst, 3, 2, false); // bow + + Decomp_spr(&g_ram[0x14000], 95); + dst = LoadItemAnimationGfxOne(dst, 4, 3, true); // shovel + dst = LoadItemAnimationGfxOne(dst, 3, 4, true); // sleeping zzz + dst = LoadItemAnimationGfxOne(dst, 1, 5, true); // misc #2 + dst = LoadItemAnimationGfxOne(dst, 4, 6, false); // hookshot + + Decomp_spr(&g_ram[0x14000], 96); + dst = LoadItemAnimationGfxOne(dst, 14, 7, true); // bugnet + dst = LoadItemAnimationGfxOne(dst, 7, 8, true); // cane + + Decomp_spr(&g_ram[0x14000], 95); + dst = LoadItemAnimationGfxOne(dst, 2, 9, true); // book of mudora + Decomp_spr(&g_ram[0x14000], 84); + + dst = &g_ram[0xa480]; + Expand3To4High(dst, &g_ram[0x14000], g_ram, 8); + Expand3To4High(dst + 8 * 0x20, &g_ram[0x14180], g_ram, 8); + + // rupees + Decomp_spr(&g_ram[0x14000], 96); + dst = &g_ram[0xb280]; + Expand3To4High(dst, &g_ram[0x14000], g_ram, 3); + Expand3To4High(dst + 3 * 0x20, &g_ram[0x14180], g_ram, 3); + + LoadItemGFX_Auxiliary(); +} + +void DecompressSwordGraphics() { // 80d2c8 + Decomp_spr(&g_ram[0x14600], 0x5f); + Decomp_spr(&g_ram[0x14000], 0x5e); + const uint8 *src = &g_ram[0x14000] + kSwordTypeToGfxOffs[link_sword_type]; + Expand3To4High(&g_ram[0x9000 + 0], src, g_ram, 12); + Expand3To4High(&g_ram[0x9000 + 0x180], src + 0x180, g_ram, 12); +} + +void DecompressShieldGraphics() { // 80d308 + Decomp_spr(&g_ram[0x14600], 0x5f); + Decomp_spr(&g_ram[0x14000], 0x5e); + const uint8 *src = &g_ram[0x14000] + kShieldTypeToGfxOffs[link_shield_type]; + Expand3To4High(&g_ram[0x9000 + 0x300], src, g_ram, 6); + Expand3To4High(&g_ram[0x9000 + 0x3c0], src + 0x180, g_ram,6); +} + +void DecompressAnimatedDungeonTiles(uint8 a) { // 80d337 + Decomp_bg(&g_ram[0x14000], a); + Do3To4Low16Bit(&g_ram[0x9000 + 0x1680], &g_ram[0x14000], 48); + Decomp_bg(&g_ram[0x14000], 0x5c); + Do3To4Low16Bit(&g_ram[0x9000 + 0x1C80], &g_ram[0x14000], 48); + + for (int i = 0; i < 256; i++) { + uint8 *p = &g_ram[0x9000 + i * 2]; + uint16 x = WORD(p[0x1880]); + WORD(p[0x1880]) = WORD(p[0x1C80]); + WORD(p[0x1C80]) = WORD(p[0x1E80]); + WORD(p[0x1E80]) = WORD(p[0x1A80]); + WORD(p[0x1A80]) = x; + } + animated_tile_vram_addr = 0x3b00; +} + +void DecompressAnimatedOverworldTiles(uint8 a) { // 80d394 + Decomp_bg(&g_ram[0x14000], a); + Do3To4Low16Bit(&g_ram[0x9000 + 0x1680], &g_ram[0x14000], 64); + Decomp_bg(&g_ram[0x14000], a + 1); + Do3To4Low16Bit(&g_ram[0x9000 + 0x1E80], &g_ram[0x14000], 32); + animated_tile_vram_addr = 0x3c00; +} + +void LoadItemGFX_Auxiliary() { // 80d3c6 + Decomp_bg(&g_ram[0x14000], 0xf); + Do3To4Low16Bit(&g_ram[0x9000 + 0x2340], &g_ram[0x14000], 16); + + Decomp_spr(&g_ram[0x14000], 0x58); + Do3To4Low16Bit(&g_ram[0x9000 + 0x2540], &g_ram[0x14000], 32); + + Decomp_bg(&g_ram[0x14000], 0x5); + Do3To4Low16Bit(&g_ram[0x9000 + 0x2dc0], &g_ram[0x14480], 2); +} + +void LoadFollowerGraphics() { // 80d423 + uint8 yv = 0x64; + if (savegame_tagalong != 1) { + yv = 0x66; + if (savegame_tagalong >= 9) { + yv = 0x59; + if (savegame_tagalong >= 12) + yv = 0x58; + } + } + Decomp_spr(&g_ram[0x14600], yv); + Decomp_spr(&g_ram[0x14000], 0x65); + Do3To4Low16Bit(&g_ram[0x9000] + 0x2940, &g_ram[0x14000 + kTagalongWhich[savegame_tagalong]], 0x20); +} + +void WriteTo4BPPBuffer_at_7F4000(uint8 a) { // 80d4db + uint8 *src = &g_ram[0x14000] + kDecodeAnimatedSpriteTile_Tab[a]; + Expand3To4High(&g_ram[0x9000] + 0x2d40, src, g_ram, 2); + Expand3To4High(&g_ram[0x9000] + 0x2d40 + 0x40, src + 0x180, g_ram, 2); +} + +void DecodeAnimatedSpriteTile_variable(uint8 a) { // 80d4ed + uint8 y = (a == 0x23 || a >= 0x37) ? 0x5d : + (a == 0xc || a >= 0x24) ? 0x5c : 0x5b; + Decomp_spr(&g_ram[0x14600], y); + Decomp_spr(&g_ram[0x14000], 0x5a); + WriteTo4BPPBuffer_at_7F4000(a); +} + +void Expand3To4High(uint8 *dst, const uint8 *src, const uint8 *base, int num) { // 80d61c + do { + const uint8 *src2 = src + 0x10; + int n = 8; + do { + uint16 t = WORD(src[0]); + uint8 u = src2[0]; + WORD(dst[0]) = t; + WORD(dst[0x10]) = (t | (t >> 8) | u) << 8 | u; + src += 2, src2 += 1, dst += 2; + } while (--n); + dst += 16, src = src2; + if (!(src - base & 0x78)) + src += 0x180; + } while (--num); +} + +void LoadTransAuxGFX() { // 80d66e + uint8 *dst = &g_ram[0x6000]; + const uint8 *p = kAuxTilesets[aux_tile_theme_index]; + int len; + + if (p[0]) { + aux_bg_subset_0 = p[0]; + len = Decomp_bg(dst, aux_bg_subset_0); + assert(len == 0x600); + } + if (p[1]) { + aux_bg_subset_1 = p[1]; + len = Decomp_bg(dst + 0x600, aux_bg_subset_1); + assert(len == 0x600); + } + if (p[2]) { + aux_bg_subset_2 = p[2]; + len = Decomp_bg(dst + 0x600*2, aux_bg_subset_2); + assert(len == 0x600); + } + if (p[3]) { + aux_bg_subset_3 = p[3]; + len = Decomp_bg(dst + 0x600*3, aux_bg_subset_3); + assert(len == 0x600); + } + Gfx_LoadSpritesInner(dst + 0x600 * 4 ); +} + +void LoadTransAuxGFX_sprite() { // 80d6f9 + Gfx_LoadSpritesInner(&g_ram[0x7800]); +} + +void Gfx_LoadSpritesInner(uint8 *dst) { // 80d706 + const uint8 *p = kSpriteTilesets[sprite_graphics_index]; + int len; + + if (p[0]) + sprite_gfx_subset_0 = p[0]; + len = Decomp_spr(dst, sprite_gfx_subset_0); + assert(len == 0x600); + if (p[1]) + sprite_gfx_subset_1 = p[1]; + len = Decomp_spr(dst + 0x600, sprite_gfx_subset_1); + assert(len == 0x600); + if (p[2]) + sprite_gfx_subset_2 = p[2]; + len = Decomp_spr(dst + 0x600*2, sprite_gfx_subset_2); + assert(len == 0x600); + if (p[3]) + sprite_gfx_subset_3 = p[3]; + len = Decomp_spr(dst + 0x600*3, sprite_gfx_subset_3); + assert(len == 0x600); + incremental_counter_for_vram = 0; +} + +void ReloadPreviouslyLoadedSheets() { // 80d788 + Decomp_bg(&g_ram[0x6000], aux_bg_subset_0); + Decomp_bg(&g_ram[0x6600], aux_bg_subset_1); + Decomp_bg(&g_ram[0x6c00], aux_bg_subset_2); + Decomp_bg(&g_ram[0x7200], aux_bg_subset_3); + Decomp_spr(&g_ram[0x7800], sprite_gfx_subset_0); + Decomp_spr(&g_ram[0x7e00], sprite_gfx_subset_1); + Decomp_spr(&g_ram[0x8400], sprite_gfx_subset_2); + Decomp_spr(&g_ram[0x8a00], sprite_gfx_subset_3); + incremental_counter_for_vram = 0; +} + +void Attract_DecompressStoryGFX() { // 80d80e + Decomp_spr(&g_ram[0x14000], 0x67); + Decomp_spr(&g_ram[0x14800], 0x68); +} + +void AnimateMirrorWarp() { // 80d864 + int st = overworld_map_state++, tt; + nmi_subroutine_index = nmi_disable_core_updates = kMirrorWarp_LoadNext_NmiLoad[st]; + uint8 t, xt = overworld_screen_index & 0x40 ? 8 : 0; + switch (st) { + case 0: + if (++mirror_vars.ctr2 != 32) + overworld_map_state = 0; + else + SetTargetOverworldWarpToPyramid(); + break; + case 1: + AnimateMirrorWarp_DecompressNewTileSets(); + Decomp_bg(&g_ram[0x14000], kVariousPacks[xt]); + Decomp_bg(&g_ram[0x14600], kVariousPacks[xt + 1]); + Do3To4High16Bit(&g_ram[0x10000], &g_ram[0x14000], 64); + Do3To4Low16Bit(&g_ram[0x10800], &g_ram[0x14600], 64); + break; + case 2: + Decomp_bg(&g_ram[0x14000], kVariousPacks[xt + 2]); + Decomp_bg(&g_ram[0x14600], kVariousPacks[xt + 3]); + Do3To4Low16Bit(&g_ram[0x10000], &g_ram[0x14000], 64); + Do3To4High16Bit(&g_ram[0x10800], &g_ram[0x14600], 64); + break; + case 3: + Decomp_bg(&g_ram[0x14000], aux_bg_subset_1); + Decomp_bg(&g_ram[0x14600], aux_bg_subset_2); + Do3To4High16Bit(&g_ram[0x10000], &g_ram[0x14000], 128); + break; + case 4: + Decomp_bg(&g_ram[0x14000], kVariousPacks[xt + 4]); + Decomp_bg(&g_ram[0x14600], kVariousPacks[xt + 5]); + Do3To4Low16Bit(&g_ram[0x10000], &g_ram[0x14000], 128); + break; + case 5: + PreOverworld_LoadOverlays(); + if (BYTE(overworld_screen_index) == 27 || BYTE(overworld_screen_index) == 91) + TS_copy = 1; + submodule_index--; + nmi_subroutine_index = nmi_disable_core_updates = 12; + break; + case 6: + case 9: + nmi_subroutine_index = nmi_disable_core_updates = 13; + break; + case 7: + Overworld_DrawScreenAtCurrentMirrorPosition(); + nmi_disable_core_updates++; + break; + case 8: + MirrorWarp_LoadSpritesAndColors(); + nmi_subroutine_index = nmi_disable_core_updates = 12; + break; + case 10: + t = overworld_screen_index & 0xbf; + DecompressAnimatedOverworldTiles(t == 3 || t == 5 || t == 7 ? 0x58 : 0x5a); + break; + case 11: + t = overworld_screen_index; + TS_copy = (t == 0 || t == 0x70 || t == 0x40 || t == 0x5b || t == 3 || t == 5 || t == 7 || t == 0x43 || t == 0x45 || t == 0x47); + Do3To4High16Bit(&g_ram[0x10000], GetCompSpritePtr(kVariousPacks[xt + 6]), 64); + break; + case 12: + Decomp_spr(&g_ram[0x14000], sprite_gfx_subset_0); + Decomp_spr(&g_ram[0x14600], sprite_gfx_subset_1); + tt = WORD(sprite_gfx_subset_0); + if (tt == 0x52 || tt == 0x53 || tt == 0x5a || tt == 0x5b) + Do3To4High16Bit(&g_ram[0x10000], &g_ram[0x14000], 64); + else + Do3To4Low16Bit(&g_ram[0x10000], &g_ram[0x14000], 64); + Do3To4Low16Bit(&g_ram[0x10800], &g_ram[0x14600], 64); + break; + case 13: + Decomp_spr(&g_ram[0x14000], sprite_gfx_subset_2); + Decomp_spr(&g_ram[0x14600], sprite_gfx_subset_3); + Do3To4Low16Bit(&g_ram[0x10000], &g_ram[0x14000], 128); + HandleFollowersAfterMirroring(); + break; + case 14: + overworld_map_state = 14; + break; + } +} + +void AnimateMirrorWarp_DecompressNewTileSets() { // 80d8fe + const uint8 *mt = kMainTilesets[main_tile_theme_index]; + const uint8 *at = kAuxTilesets[aux_tile_theme_index]; + + aux_bg_subset_0 = at[0] ? at[0] : mt[3]; + aux_bg_subset_1 = at[1] ? at[1] : mt[4]; + aux_bg_subset_2 = at[2] ? at[2] : mt[5]; + aux_bg_subset_3 = at[3] ? at[3] : mt[6]; + + const uint8 *p = kSpriteTilesets[sprite_graphics_index]; + if (p[0]) sprite_gfx_subset_0 = p[0]; + if (p[1]) sprite_gfx_subset_1 = p[1]; + if (p[2]) sprite_gfx_subset_2 = p[2]; + if (p[3]) sprite_gfx_subset_3 = p[3]; +} + +void Graphics_IncrementalVRAMUpload() { // 80deff + if (incremental_counter_for_vram == 16) + return; + + nmi_update_tilemap_dst = kGraphics_IncrementalVramUpload_Dst[incremental_counter_for_vram]; + nmi_update_tilemap_src = kGraphics_IncrementalVramUpload_Src[incremental_counter_for_vram] << 8; + incremental_counter_for_vram++; +} + +void PrepTransAuxGfx() { // 80df1a + Do3To4High16Bit(&g_ram[0x10000], &g_ram[0x6000], 0x40); + if (aux_tile_theme_index >= 32) { + Do3To4High16Bit(&g_ram[0x10800], &g_ram[0x6600], 0x80); + Do3To4Low16Bit(&g_ram[0x11800], &g_ram[0x7200], 0x40); + } else { + Do3To4Low16Bit(&g_ram[0x10800], &g_ram[0x6600], 0xC0); + } +} + +void Do3To4High16Bit(uint8 *dst, const uint8 *src, int num) { // 80df4f + do { + const uint8 *src2 = src + 0x10; + int n = 8; + do { + uint16 t = WORD(src[0]); + uint8 u = src2[0]; + WORD(dst[0]) = t; + WORD(dst[0x10]) = (t | (t >> 8) | u) << 8 | u; + src += 2, src2 += 1, dst += 2; + } while (--n); + dst += 16, src = src2; + } while (--num); + +} + +void Do3To4Low16Bit(uint8 *dst, const uint8 *src, int num) { // 80dfb8 + do { + const uint8 *src2 = src + 0x10; + int n = 8; + do { + WORD(dst[0]) = WORD(src[0]); + WORD(dst[0x10]) = src2[0]; + src += 2, src2 += 1, dst += 2; + } while (--n); + dst += 16, src = src2; + } while (--num); +} + +void LoadNewSpriteGFXSet() { // 80e031 + Do3To4Low16Bit(&g_ram[0x10000], &g_ram[0x7800], 0xC0); + if (sprite_gfx_subset_3 == 0x52 || sprite_gfx_subset_3 == 0x53 || sprite_gfx_subset_3 == 0x5a || sprite_gfx_subset_3 == 0x5b) + Do3To4High16Bit(&g_ram[0x11800], &g_ram[0x8a00], 0x40); + else + Do3To4Low16Bit(&g_ram[0x11800], &g_ram[0x8a00], 0x40); +} + +void InitializeTilesets() { // 80e19b + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write_word(VMADDL, 0x4400); + LoadCommonSprites(); + const uint8 *p = kSpriteTilesets[sprite_graphics_index]; + if (p[0]) sprite_gfx_subset_0 = p[0]; + if (p[1]) sprite_gfx_subset_1 = p[1]; + if (p[2]) sprite_gfx_subset_2 = p[2]; + if (p[3]) sprite_gfx_subset_3 = p[3]; + + LoadSpriteGraphics(sprite_gfx_subset_0, &g_ram[0x7800]); + LoadSpriteGraphics(sprite_gfx_subset_1, &g_ram[0x7e00]); + LoadSpriteGraphics(sprite_gfx_subset_2, &g_ram[0x8400]); + LoadSpriteGraphics(sprite_gfx_subset_3, &g_ram[0x8a00]); + + zelda_ppu_write_word(VMADDL, 0x2000); + + const uint8 *mt = kMainTilesets[main_tile_theme_index]; + const uint8 *at = kAuxTilesets[aux_tile_theme_index]; + + aux_bg_subset_0 = at[0] ? at[0] : mt[3]; + aux_bg_subset_1 = at[1] ? at[1] : mt[4]; + aux_bg_subset_2 = at[2] ? at[2] : mt[5]; + aux_bg_subset_3 = at[3] ? at[3] : mt[6]; + + LoadBackgroundGraphics(mt[0], 7, &g_ram[0x14000]); + LoadBackgroundGraphics(mt[1], 6, &g_ram[0x14000]); + LoadBackgroundGraphics(mt[2], 5, &g_ram[0x14000]); + LoadBackgroundGraphics(aux_bg_subset_0, 4, &g_ram[0x6000]); + LoadBackgroundGraphics(aux_bg_subset_1, 3, &g_ram[0x6600]); + LoadBackgroundGraphics(aux_bg_subset_2, 2, &g_ram[0x6c00]); + LoadBackgroundGraphics(aux_bg_subset_3, 1, &g_ram[0x7200]); + LoadBackgroundGraphics(mt[7], 0, &g_ram[0x14000]); +} + +void LoadDefaultGraphics() { // 80e2d0 + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write_word(VMADDL, 0x4000); + const uint8 *src = GetCompSpritePtr(0); + + uint16 *tmp = (uint16 *)&g_ram[0xbf]; + int num = 64; + do { + for (int i = 7; i >= 0; i--, src += 2) { + zelda_ppu_write_word(VMDATAL, WORD(src[0])); + tmp[i] = src[0] | src[1]; + } + for (int i = 7; i >= 0; i--, src++) { + zelda_ppu_write_word(VMDATAL, src[0] | (src[0] | tmp[i]) << 8); + } + } while (--num); + + // Load 2bpp graphics used for hud + zelda_ppu_write_word(VMADDL, 0x7000); + DecompAndUpload2bpp(0x6a); + DecompAndUpload2bpp(0x6b); + DecompAndUpload2bpp(0x69); +} + +void Attract_LoadBG3GFX() { // 80e36d + // load 2bpp gfx for attract images + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write(VMADDL, 0); + zelda_ppu_write(VMADDH, 0x78); + DecompAndUpload2bpp(0x67); +} + +void LoadCommonSprites_2() { // 80e384 + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write(VMADDL, 0); + zelda_ppu_write(VMADDH, 0x44); + LoadCommonSprites(); +} + +void Graphics_LoadChrHalfSlot() { // 80e3fa + int k = load_chr_halfslot_even_odd; + if (k == 0) + return; + + int8 sp6 = kGraphicsLoadSp6[k - 1]; + if (sp6 >= 0) { + palette_sp6 = sp6; + if (k == 1) { + palette_sp6 = 10; + overworld_palette_aux_or_main = 0x200; + Palette_Load_SpriteEnvironment(); + flag_update_cgram_in_nmi++; + } else { + overworld_palette_aux_or_main = 0x200; + Palette_Load_SpriteEnvironment_Dungeon(); + flag_update_cgram_in_nmi++; + } + } + int tilebytes = 0x44; + int bank_offs = 0; + load_chr_halfslot_even_odd++; + + if (load_chr_halfslot_even_odd & 1) { + load_chr_halfslot_even_odd = 0; + if (k != 18) { + bank_offs = 0x300; + tilebytes = 0x46; + if (k == 2) + flag_custom_spell_anim_active = 0; + } + } + BYTE(nmi_load_target_addr) = tilebytes; + nmi_subroutine_index = 11; + + k = kGraphicsHalfSlotPacks[k - 1]; + if (k == 1) + k = misc_sprites_graphics_index; + + const uint8 *srcp = GetCompSpritePtr(k) + bank_offs; + uint8 sprdata[24]; + int num = 32; + uint8 *dst = &g_ram[0x11000]; + + do { + for (int i = 0; i < 24; i++) + sprdata[i] = *srcp++; + + uint8 *src = sprdata, *src2 = sprdata + 16; + int n = 8; + do { + uint16 t = WORD(src[0]); + uint8 u = src2[0]; + WORD(dst[0]) = t; + WORD(dst[16]) = (t | (t >> 8) | u) << 8 | u; + src += 2, src2 += 1, dst += 2; + } while (--n); + dst += 16; + } while (--num); +} + +void TransferFontToVRAM() { // 80e556 + zelda_ppu_write(OBSEL, 2); + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write_word(VMADDL, 0x7000); + const uint16 *src = GetFontPtr(); + for (int i = 0; i != 0x800; i++, src++) + zelda_ppu_write_word(VMDATAL, *src); +} + +void LoadSpriteGraphics(int gfx_pack, uint8 *decomp_addr) { // 80e583 + Decomp_spr(decomp_addr, gfx_pack); + + if (gfx_pack == 0x52 || gfx_pack == 0x53 || gfx_pack == 0x5a || gfx_pack == 0x5b || + gfx_pack == 0x5c || gfx_pack == 0x5e || gfx_pack == 0x5f) + Do3To4High(decomp_addr); + else + Do3To4Low(decomp_addr); +} + +void Do3To4High(const uint8 *decomp_addr) { // 80e5af + for (int j = 0; j < 64; j++) { + uint16 *t = (uint16 *)&dung_line_ptrs_row0; + for (int i = 7; i >= 0; i--, decomp_addr += 2) { + uint16 d = *(uint16 *)decomp_addr; + t[i] = (d | (d >> 8)) & 0xff; + zelda_ppu_write_word(VMDATAL, d); + } + for (int i = 7; i >= 0; i--, decomp_addr += 1) { + uint8 d = *decomp_addr; + zelda_ppu_write_word(VMDATAL, d | (t[i] | d) << 8); + } + } +} + +void LoadBackgroundGraphics(int gfx_pack, int slot, uint8 *decomp_addr) { // 80e609 + Decomp_bg(decomp_addr, gfx_pack); + if ((main_tile_theme_index >= 0x20) ? (slot == 7 || slot == 2 || slot == 3 || slot == 4) : (slot >= 4)) + Do3To4High(decomp_addr); + else + Do3To4Low(decomp_addr); +} + +void Do3To4Low(const uint8 *decomp_addr) { // 80e63c + for (int j = 0; j < 64; j++) { + for (int i = 0; i < 8; i++, decomp_addr += 2) + zelda_ppu_write_word(VMDATAL, *(uint16 *)decomp_addr); + for (int i = 0; i < 8; i++, decomp_addr += 1) + zelda_ppu_write_word(VMDATAL, *decomp_addr); + } +} + +void LoadCommonSprites() { // 80e6b7 + Do3To4High(GetCompSpritePtr(misc_sprites_graphics_index)); + if (main_module_index != 1) { + Do3To4Low(GetCompSpritePtr(6)); + Do3To4Low(GetCompSpritePtr(7)); + } else { + // select file + LoadSpriteGraphics(94, &g_ram[0x14000]); + LoadSpriteGraphics(95, &g_ram[0x14000]); + } +} + +int Decomp_spr(uint8 *dst, int gfx) { // 80e772 + return Decompress(dst, kSprGfx[gfx]); +} + +int Decomp_bg(uint8 *dst, int gfx) { // 80e78f + return Decompress(dst, kBgGfx[gfx]); +} + +int Decompress(uint8 *dst, const uint8 *src) { // 80e79e + uint8 *dst_org = dst; + int len; + for (;;) { + uint8 cmd = *src++; + if (cmd == 0xff) + return dst - dst_org; + if ((cmd & 0xe0) != 0xe0) { + len = (cmd & 0x1f) + 1; + cmd &= 0xe0; + } else { + len = *src++; + len += ((cmd & 3) << 8) + 1; + cmd = (cmd << 3) & 0xe0; + } + //printf("%d: %d,%d\n", (int)(dst - dst_org), cmd, len); + if (cmd == 0) { + do { + *dst++ = *src++; + } while (--len); + } else if (cmd & 0x80) { + uint32 offs = *src++; + offs |= *src++ << 8; + do { + *dst++ = dst_org[offs++]; + } while (--len); + } else if (!(cmd & 0x40)) { + uint8 v = *src++; + do { + *dst++ = v; + } while (--len); + } else if (!(cmd & 0x20)) { + uint8 lo = *src++; + uint8 hi = *src++; + do { + *dst++ = lo; + if (--len == 0) + break; + *dst++ = hi; + } while (--len); + } else { + // copy bytes with the byte incrementing by 1 in between + uint8 v = *src++; + do { + *dst++ = v; + } while (v++, --len); + } + } +} + +void ResetHUDPalettes4and5() { // 80eb29 + for (int i = 0; i < 8; i++) + main_palette_buffer[16 + i] = 0; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 2; + flag_update_cgram_in_nmi++; +} + +void PaletteFilterHistory() { // 80eb5e + PaletteFilter_Range(0x10, 0x18); + PaletteFilter_IncrCountdown(); +} + +void PaletteFilter_WishPonds() { // 80ebc5 + TS_copy = 2; + CGADSUB_copy = 0x30; + PaletteFilter_WishPonds_Inner(); +} + +void PaletteFilter_Crystal() { // 80ebcf + TS_copy = 1; + PaletteFilter_WishPonds_Inner(); +} + +void PaletteFilter_WishPonds_Inner() { // 80ebd3 + for (int i = 0; i < 8; i++) + main_palette_buffer[0xd0 + i] = 0; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 2; + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_RestoreSP5F() { // 80ebf2 + for (int i = 7; i >= 0; i--) + main_palette_buffer[208 + i] = aux_palette_buffer[208 + i]; + TS_copy = 0; + CGADSUB_copy = 32; + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_SP5F() { // 80ec0d + for (int i = 0; i != 2; i++) { + PaletteFilter_Range(208, 216); + PaletteFilter_IncrCountdown(); + if (palette_filter_countdown == 0) + break; + } +} + +void KholdstareShell_PaletteFiltering() { // 80ec79 + if (subsubmodule_index == 0) { + memcpy(main_palette_buffer + 0x40, aux_palette_buffer + 0x40, 16); + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + flag_update_cgram_in_nmi++; + subsubmodule_index = 1; + return; + } + for (int i = 0; i != 2; i++) { + PaletteFilter_Range(0x40, 0x48); + PaletteFilter_IncrCountdown(); + if (palette_filter_countdown == 0) { + TS_copy = 0; + break; + } + } +} + +void AgahnimWarpShadowFilter(int k) { // 80ecca + palette_filter_countdown = agahnim_pal_setting[k]; + darkening_or_lightening_screen = agahnim_pal_setting[k + 3]; + int t = kPaletteFilter_Agahnim_Tab[k] >> 1; + for (int i = 0; i < 2; i++) { + PaletteFilter_Range(t, t + 8); + if (++palette_filter_countdown == 0x1f) { + palette_filter_countdown = 0; + darkening_or_lightening_screen ^= 2; + break; + } + } + agahnim_pal_setting[k] = palette_filter_countdown; + agahnim_pal_setting[k + 3] = darkening_or_lightening_screen; + flag_update_cgram_in_nmi++; +} + +void Palette_FadeIntroOneStep() { // 80ed7c + PaletteFilter_RestoreAdditive(0x100, 0x1a0); + PaletteFilter_RestoreAdditive(0xc0, 0x100); + BYTE(palette_filter_countdown) -= 1; + flag_update_cgram_in_nmi++; +} + +void Palette_FadeIntro2() { // 80ed8f + PaletteFilter_RestoreAdditive(0x40, 0xc0); + PaletteFilter_RestoreAdditive(0x40, 0xc0); + BYTE(palette_filter_countdown) -= 1; + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_RestoreAdditive(int from, int to) { // 80edca + from >>= 1, to >>= 1; + do { + uint16 c = main_palette_buffer[from], cx = c; + uint16 d = aux_palette_buffer[from]; + if ((c & 0x1f) != (d & 0x1f)) + cx += 1; + if ((c & 0x3e0) != (d & 0x3e0)) + cx += 0x20; + if ((c & 0x7c00) != (d & 0x7c00)) + cx += 0x400; + main_palette_buffer[from] = cx; + } while (++from != to); +} + +void PaletteFilter_RestoreSubtractive(uint16 from, uint16 to) { // 80ee21 + from >>= 1, to >>= 1; + do { + uint16 c = main_palette_buffer[from], cx = c; + uint16 d = aux_palette_buffer[from]; + if ((c & 0x1f) != (d & 0x1f)) + cx -= 1; + if ((c & 0x3e0) != (d & 0x3e0)) + cx -= 0x20; + if ((c & 0x7c00) != (d & 0x7c00)) + cx -= 0x400; + main_palette_buffer[from] = cx; + } while (++from != to); +} + +void PaletteFilter_InitializeWhiteFilter() { // 80ee78 + for (int i = 0; i < 256; i++) + aux_palette_buffer[i] = 0x7fff; + main_palette_buffer[32] = main_palette_buffer[0]; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 2; + if (overworld_screen_index == 27) { + aux_palette_buffer[0] = aux_palette_buffer[32] = 0; + main_palette_buffer[0] = main_palette_buffer[32] = 0; + } + mirror_vars.ctr = 8; + mirror_vars.ctr2 = 0; +} + +void MirrorWarp_RunAnimationSubmodules() { // 80eee7 + if (--mirror_vars.ctr) { + AnimateMirrorWarp(); + return; + } + mirror_vars.ctr = 2; + PaletteFilter_BlindingWhite(); +} + +void PaletteFilter_BlindingWhite() { // 80eef1 + if (darkening_or_lightening_screen == 0xff) + return; + + if (darkening_or_lightening_screen == 2) { + PaletteFilter_RestoreAdditive(0x40, 0x1b0); + PaletteFilter_RestoreAdditive(0x1c0, 0x1e0); + } else { + PaletteFilter_RestoreSubtractive(0x40, 0x1b0); + PaletteFilter_RestoreSubtractive(0x1c0, 0x1e0); + } + PaletteFilter_StartBlindingWhite(); +} + +void PaletteFilter_StartBlindingWhite() { // 80ef27 + main_palette_buffer[0] = main_palette_buffer[32]; + if (!darkening_or_lightening_screen) { + if (++palette_filter_countdown == 66) { + darkening_or_lightening_screen = 0xff; + mirror_vars.ctr = 32; + } + } else { + if (++palette_filter_countdown == 31) { + darkening_or_lightening_screen ^= 2; + if (main_module_index != 21) + return; + zelda_snes_dummy_write(HDMAEN, 0); + HDMAEN_copy = 0; + for (int i = 0; i < 32 * 7; i++) + mode7_hdma_table[i] = 0x778; + HDMAEN_copy = 0xc0; + } + } + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_BlindingWhiteTriforce() { // 80ef8a + PaletteFilter_RestoreAdditive(0x40, 0x200); + PaletteFilter_StartBlindingWhite(); +} + +void PaletteFilter_WhirlpoolBlue() { // 80ef97 + if (frame_counter & 1) { + for (int i = 0x20; i != 0x100; i++) { + uint16 t = main_palette_buffer[i]; + if ((t & 0x7C00) != 0x7C00) + t += 0x400; + main_palette_buffer[i] = t; + } + main_palette_buffer[0] = main_palette_buffer[32]; + if (!(palette_filter_countdown & 1)) + mosaic_level += 16; + if (++palette_filter_countdown == 31) { + palette_filter_countdown = 0; + subsubmodule_index++; + mosaic_level = 0xf0; + } + } + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 3; + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_IsolateWhirlpoolBlue() { // 80f00c + for (int i = 0x20; i != 0x100; i++) { + uint16 t = main_palette_buffer[i]; + if (t & 0x3e0) + t -= 0x20; + if (t & 0x1f) + t -= 1; + main_palette_buffer[i] = t; + } + main_palette_buffer[0] = main_palette_buffer[32]; + if (++palette_filter_countdown == 31) { + palette_filter_countdown = 0; + subsubmodule_index++; + mosaic_level = 0xf0; + } + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 3; + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_WhirlpoolRestoreBlue() { // 80f04a + if (frame_counter & 1) { + for (int i = 0x20; i != 0x100; i++) { + uint16 u = aux_palette_buffer[i] & 0x7c00; + uint16 t = main_palette_buffer[i]; + if ((t & 0x7C00) != u) + t -= 0x400; + main_palette_buffer[i] = t; + } + main_palette_buffer[0] = main_palette_buffer[32]; + if (!(palette_filter_countdown & 1)) + mosaic_level -= 16; + if (++palette_filter_countdown == 31) { + palette_filter_countdown = 0; + subsubmodule_index++; + mosaic_level = 0; + } + } + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 3; + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_WhirlpoolRestoreRedGreen() { // 80f0c7 + for (int i = 0x20; i != 0x100; i++) { + uint16 u0 = aux_palette_buffer[i] & 0x3e0; + uint16 u1 = aux_palette_buffer[i] & 0x1f; + uint16 t = main_palette_buffer[i]; + if ((t & 0x3e0) != u0) + t += 0x20; + if ((t & 0x1f) != u1) + t += 1; + main_palette_buffer[i] = t; + } + main_palette_buffer[0] = main_palette_buffer[32]; + if (++palette_filter_countdown == 31) { + palette_filter_countdown = 0; + subsubmodule_index++; + } + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_RestoreBGSubstractiveStrict() { // 80f135 + if (darkening_or_lightening_screen == 255) + return; + PaletteFilter_RestoreSubtractive(0x40, 0x100); + if (++palette_filter_countdown == 0x20) { + darkening_or_lightening_screen = 255; + WORD(TS_copy) = 0; + } + flag_update_cgram_in_nmi++; +} + +void PaletteFilter_RestoreBGAdditiveStrict() { // 80f169 + PaletteFilter_RestoreAdditive(0x40, 0x100); + palette_filter_countdown++; + flag_update_cgram_in_nmi++; +} + +void Trinexx_FlashShellPalette_Red() { // 80f183 + if (!byte_7E04BE) { + for (int i = 0; i < 7; i++) { + uint16 v = main_palette_buffer[0x41 + i]; + main_palette_buffer[0x41 + i] = (v & 0xffe0) | ((v & 0x1f) + ((v & 0x1f) != 0x1f)); + } + flag_update_cgram_in_nmi++; + if (++byte_7E04C0 >= 12) { + byte_7E04C0 = byte_7E04BE = 0; + return; + } + byte_7E04BE = 3; + } + byte_7E04BE--; +} + +void Trinexx_UnflashShellPalette_Red() { // 80f1cf + if (!byte_7E04BE) { + for (int i = 0; i < 7; i++) { + uint16 u = aux_palette_buffer[0x41 + i]; + uint16 v = main_palette_buffer[0x41 + i]; + main_palette_buffer[0x41 + i] = (v & 0xffe0) | ((v & 0x1f) - ((v & 0x1f) != (u & 0x1f))); + } + flag_update_cgram_in_nmi++; + if (++byte_7E04C0 >= 12) { + byte_7E04C0 = byte_7E04BE = 0; + return; + } + byte_7E04BE = 3; + } + byte_7E04BE--; +} + +void Trinexx_FlashShellPalette_Blue() { // 80f207 + if (!byte_7E04BF) { + for (int i = 0; i < 7; i++) { + uint16 v = main_palette_buffer[0x41 + i]; + main_palette_buffer[0x41 + i] = (v & ~0x7c00) | (v & 0x7c00) + (((v & 0x7c00) != 0x7c00) << 10); + } + flag_update_cgram_in_nmi++; + if (++byte_7E04C1 >= 12) { + byte_7E04C1 = byte_7E04BF = 0; + return; + } + byte_7E04BF = 3; + } + byte_7E04BF--; + +} + +void Trinexx_UnflashShellPalette_Blue() { // 80f253 + if (!byte_7E04BF) { + for (int i = 0; i < 7; i++) { + uint16 u = aux_palette_buffer[0x41 + i]; + uint16 v = main_palette_buffer[0x41 + i]; + main_palette_buffer[0x41 + i] = (v & ~0x7c00) | (v & 0x7c00) - (((v & 0x7c00) != (u & 0x7c00)) << 10); + } + flag_update_cgram_in_nmi++; + if (++byte_7E04C1 >= 12) { + byte_7E04C1 = byte_7E04BF = 0; + return; + } + byte_7E04BF = 3; + } + byte_7E04BF--; +} + +void IrisSpotlight_close() { // 80f28b + SpotlightInternal(0x7e, 0); +} + +void Spotlight_open() { // 80f295 + SpotlightInternal(0, 2); +} + +void SpotlightInternal(uint8 x, uint8 y) { // 80f29d + spotlight_var1 = x; + spotlight_var2 = y; + + zelda_snes_dummy_write(HDMAEN, 0); + HdmaSetup(0xF2FB, 0xF2FB, 0x41, (uint8)WH0, (uint8)WH0, 0); + + W12SEL_copy = 0x33; + W34SEL_copy = 3; + WOBJSEL_copy = 0x33; + TMW_copy = TM_copy; + TSW_copy = TS_copy; + if (!player_is_indoors) { + COLDATA_copy0 = 0x20; + COLDATA_copy1 = 0x40; + COLDATA_copy2 = 0x80; + } + IrisSpotlight_ConfigureTable(); + HDMAEN_copy = 0x80; + INIDISP_copy = 0xf; +} + +void IrisSpotlight_ConfigureTable() { // 80f312 + uint16 r14 = link_y_coord - BG2VOFS_copy2 + 12; + spotlight_y_lower = r14 - spotlight_var1; + spotlight_y_upper = r14 + spotlight_var1; + spotlight_var3 = link_x_coord - BG2HOFS_copy2 + 8; + spotlight_var4 = spotlight_var1; + uint16 r6 = r14 * 2; + if (r6 < 224) + r6 = 224; + uint16 r10 = r6 - r14; + uint16 r4 = r14 - r10; + for(;;) { + uint16 r8 = 0xff; + if (r6 < spotlight_y_upper) { + uint8 t = spotlight_var4; + if (spotlight_var4) + spotlight_var4--; + r8 = IrisSpotlight_CalculateCircleValue(t); + } + if (r4 < 0xe0) + hdma_table[r4] = r8; + if (r6 < 0xe0) + hdma_table[r6] = r8; + if (r4 == r14) + break; + r4++, r6--; + } + + memcpy(mode7_hdma_table, hdma_table, 224 * sizeof(uint16)); + + spotlight_var1 += kSpotlight_delta_size[spotlight_var2 >> 1]; + + if (spotlight_var1 != kSpotlight_goal[spotlight_var2 >> 1]) + return; + + if (!spotlight_var2) { + INIDISP_copy = 0x80; + zelda_ppu_write(INIDISP, 0x80); + } else { + IrisSpotlight_ResetTable(); + } + subsubmodule_index = 0; + submodule_index = 0; + + if (main_module_index == 7 || main_module_index == 16) { + if (!player_is_indoors) + sound_effect_ambient = overworld_music[BYTE(overworld_screen_index)] >> 4; + if (buffer_for_playing_songs != 0xff) + music_control = buffer_for_playing_songs; + } + main_module_index = saved_module_for_menu; + if (main_module_index == 6) + Sprite_ResetAll(); +} + +void IrisSpotlight_ResetTable() { // 80f427 + for (int i = 0; i < 224; i++) + mode7_hdma_table[i] = 0xff00; +} + +uint16 IrisSpotlight_CalculateCircleValue(uint8 a) { // 80f4cc + uint8 t = snes_divide(a << 8, spotlight_var1) >> 1; + uint8 r10 = kConfigureSpotlightTable_Helper_Tab[t]; + uint16 p = 2 * (uint8)(r10 * (uint8)spotlight_var1 >> 8); + if (!r10) + return 0xff; + uint16 r2 = spotlight_var3 + p; + uint16 r0 = spotlight_var3 - p; + r0 = ((int16)r0 < 0) ? 0 : + r0 < 255 ? r0 : 255; + r2 = r2 < 255 ? r2 : 255; + r0 |= r2 << 8; + return r0 == 0xffff ? 0xff : r0; +} + +void AdjustWaterHDMAWindow() { // 80f649 + uint16 r10 = water_hdma_var1 - BG2VOFS_copy2; + spotlight_y_lower = r10 - water_hdma_var2; + spotlight_y_upper = r10 + water_hdma_var2; + AdjustWaterHDMAWindow_X(r10); +} + +void AdjustWaterHDMAWindow_X(uint16 r10) { // 80f660 + spotlight_var3 = water_hdma_var0 - BG2HOFS_copy2; + uint16 r12 = water_hdma_var3 ? water_hdma_var3 - 1 : 0; + uint16 r2 = spotlight_var3 + r12; + uint16 r0 = spotlight_var3 - r12; + + r0 = (r0 < 255) ? r0 : 255; + r2 = (r2 < 255) ? r2 : 255; + r12 = r0 | r2 << 8; + + uint16 r6 = r10 * 2; + if (r6 < 0xe0) + r6 = 0xe0; + uint16 r4 = 2 * r10 - r6; + uint16 a; + + do { + if (!sign16(r4)) { + if (!sign16(spotlight_y_lower) && r4 < spotlight_y_lower) + a = 0xff; + else + a = r12; + if (r4 < 224) + mode7_hdma_table[r4] = (a != 0xffff) ? a : 0xff; + } + if (r6 >= spotlight_y_upper) { + a = 0xff; + } else { + if (r6 >= 225 && word_7E0678) + word_7E0678--; + a = r12; + } + if (r6 < 224) + mode7_hdma_table[r6] = (a != 0xffff) ? a : 0xff; + } while (r6--, r10 != r4++); +} + +void FloodDam_PrepFloodHDMA() { // 80f734 + spotlight_y_lower = water_hdma_var1 - BG2VOFS_copy2; + spotlight_var3 = water_hdma_var0 - BG2HOFS_copy2; + uint16 r14 = water_hdma_var3 ^ 1; + uint16 r12 = (spotlight_var3 + r14) << 8 | (uint8)(spotlight_var3 - r14); + + int r4 = 0; + do { + mode7_hdma_table[r4] = 0xff00; + } while (++r4 != spotlight_y_upper); + + r12 = r14 - 7 + 8; + r12 = (spotlight_var3 + r12) << 8 | (uint8)(spotlight_var3 - r12); + uint16 r10 = (spotlight_y_upper + water_hdma_var2) ^ 1; + + do { + if (r4 >= r10) { + mode7_hdma_table[r4] = 0xff; + } else { + uint16 a = r4; + do { + a *= 2; + } while (a >= 448); + mode7_hdma_table[a >> 1] = r12 == 0xffff ? 0xff : r12; + } + } while (++r4 < 225); +} + +void ResetStarTileGraphics() { // 80fda4 + byte_7E04BC = 0; + Dungeon_RestoreStarTileChr(); +} + +void Dungeon_RestoreStarTileChr() { // 80fda7 + int xx = 0, yy = 32; + if (byte_7E04BC) + xx = 32, yy = 0; + uint16 *p = messaging_buf; + memcpy(p, g_ram + 0xbdc0 + xx, 32); + memcpy(p + 16, g_ram + 0xbdc0 + yy, 32); + nmi_subroutine_index = 0x18; +} + +void LinkZap_HandleMosaic() { // 81fed2 + int level = mosaic_level; + if (!mosaic_inc_or_dec) { + level += 0x10; + if (level == 0xc0) + mosaic_inc_or_dec = 1; + } else { + level -= 0x10; + if (level == 0) + mosaic_inc_or_dec = 0; + } + mosaic_level = level; + MOSAIC_copy = mosaic_level >> 1 | 3; + BGMODE_copy = 9; +} + +void Player_SetCustomMosaicLevel(uint8 a) { // 81fef0 + mosaic_inc_or_dec = 0; + mosaic_level = a; + MOSAIC_copy = mosaic_level >> 1 | 3; + BGMODE_copy = 9; +} + +void Module07_16_UpdatePegs_Step1() { // 829739 + if (BYTE(orange_blue_barrier_state)) + Dungeon_UpdatePegGFXBuffer(0x80, 0x100); + else + Dungeon_UpdatePegGFXBuffer(0x100, 0x80); +} + +void Module07_16_UpdatePegs_Step2() { // 82974d + if (BYTE(orange_blue_barrier_state)) + Dungeon_UpdatePegGFXBuffer(0x100, 0x80); + else + Dungeon_UpdatePegGFXBuffer(0x80, 0x100); +} + +void Dungeon_UpdatePegGFXBuffer(int x, int y) { // 829773 + uint16 *src = (uint16 *)&g_ram[0xb340]; + for (int i = 0; i < 64; i++) + messaging_buf[i] = src[(x >> 1) + i]; + for (int i = 0; i < 64; i++) + messaging_buf[64 + i] = src[(y >> 1) + i]; + nmi_subroutine_index = 23; +} + +void Dungeon_HandleTranslucencyAndPalette() { // 82a1e9 + if (overworld_palette_swap_flag) + Palette_RevertTranslucencySwap(); + + CGWSEL_copy = 2; + CGADSUB_copy = 0xb3; + + uint8 torch = dung_num_lit_torches; + if (!dung_want_lights_out) { + uint8 a = 0x20; + if ((a = 0x20, dung_hdr_bg2_properties != 0) && + (a = 0x32, dung_hdr_bg2_properties != 7) && + (a = 0x62, dung_hdr_bg2_properties != 4) && + (a = 0x20, dung_hdr_bg2_properties == 2)) { + Palette_AssertTranslucencySwap(); + if (BYTE(dungeon_room_index) == 13) { + agahnim_pal_setting[0] = 0; + agahnim_pal_setting[1] = 0; + agahnim_pal_setting[2] = 0; + agahnim_pal_setting[3] = 0; + agahnim_pal_setting[4] = 0; + agahnim_pal_setting[5] = 0; + Palette_LoadAgahnim(); + } + a = 0x70; + } + CGADSUB_copy = a; + torch = 3; + } + overworld_fixed_color_plusminus = kLitTorchesColorPlus[torch]; + palette_filter_countdown = 31; + mosaic_target_level = 0; + darkening_or_lightening_screen = 2; + overworld_palette_aux_or_main = 0; + Palette_Load_DungeonSet(); + Palette_Load_SpritePal0Left(); + Palette_Load_SpriteAux1(); + Palette_Load_SpriteAux2(); + subsubmodule_index += 1; +} + +void Overworld_LoadAllPalettes() { // 82c5b2 + memset(aux_palette_buffer + 0x180 / 2, 0, 128); + memset(main_palette_buffer, 0, 512); + + overworld_palette_mode = 5; + overworld_palette_aux1_bp2to4_hi = 3; + overworld_palette_aux2_bp5to7_hi = 3; + overworld_palette_aux3_bp7_lo = 0; + palette_sp6 = 5; + overworld_palette_sp0 = 11; + overworld_palette_swap_flag = 0; + overworld_palette_aux_or_main = 0; + Palette_BgAndFixedColor_Black(); + Palette_Load_SpritePal0Left(); + Palette_Load_SpriteMain(); + Palette_Load_OWBGMain(); + Palette_Load_OWBG1(); + Palette_Load_OWBG2(); + Palette_Load_OWBG3(); + Palette_Load_SpriteEnvironment_Dungeon(); + Palette_Load_HUD(); + + for (int i = 0; i < 8; i++) + main_palette_buffer[0x1b0 / 2 + i] = aux_palette_buffer[0x1d0 / 2 + i]; +} + +void Dungeon_LoadPalettes() { // 82c630 + overworld_palette_aux_or_main = 0; + Palette_BgAndFixedColor_Black(); + Palette_Load_SpritePal0Left(); + Palette_Load_SpriteMain(); + Palette_Load_SpriteAux1(); + Palette_Load_SpriteAux2(); + Palette_Load_Sword(); + Palette_Load_Shield(); + Palette_Load_SpriteEnvironment(); + Palette_Load_LinkArmorAndGloves(); + Palette_Load_HUD(); + Palette_Load_DungeonSet(); + Overworld_LoadPalettesInner(); +} + +void Overworld_LoadPalettesInner() { // 82c65f + overworld_pal_unk1 = dung_hdr_palette_1; + overworld_pal_unk2 = overworld_palette_aux3_bp7_lo; + overworld_pal_unk3 = byte_7E0AB7; + darkening_or_lightening_screen = 2; + palette_filter_countdown = 0; + WORD(mosaic_target_level) = 0; + Overworld_CopyPalettesToCache(); +} + +void OverworldLoadScreensPaletteSet() { // 82c692 + uint8 sc = overworld_screen_index & 0x3f; + uint8 x = (sc == 3 || sc == 5 || sc == 7) ? 2 : 0; + x += (overworld_screen_index & 0x40) ? 1 : 0; + Overworld_LoadAreaPalettesEx(x); +} + +void Overworld_LoadAreaPalettesEx(uint8 x) { // 82c6ad + overworld_palette_mode = x; + overworld_palette_aux_or_main &= 0xff; + Palette_Load_SpriteMain(); + Palette_Load_SpriteEnvironment(); + Palette_Load_SpriteAux1(); + Palette_Load_SpriteAux2(); + Palette_Load_Sword(); + Palette_Load_Shield(); + Palette_Load_LinkArmorAndGloves(); + overworld_palette_sp0 = (savegame_is_darkworld & 0x40) ? 3 : 1; + Palette_Load_SpritePal0Left(); + Palette_Load_HUD(); + Palette_Load_OWBGMain(); +} + +void SpecialOverworld_CopyPalettesToCache() { // 82c6eb + for (int i = 32; i < 32 * 8; i++) + main_palette_buffer[i] = 0; + for (int i = 0; i < 8; i++) { + main_palette_buffer[i] = aux_palette_buffer[i]; + main_palette_buffer[i + 0x8] = aux_palette_buffer[i + 0x8]; + main_palette_buffer[i + 0x10] = aux_palette_buffer[i + 0x10]; + main_palette_buffer[i + 0x18] = aux_palette_buffer[i + 0x18]; + main_palette_buffer[i + 0xd8] = aux_palette_buffer[i + 0xd8]; + main_palette_buffer[i + 0xe8] = aux_palette_buffer[i + 0xe8]; + main_palette_buffer[i + 0xf0] = aux_palette_buffer[i + 0xf0]; + main_palette_buffer[i + 0xf8] = aux_palette_buffer[i + 0xf8]; + } + MOSAIC_copy = 0xf7; + mosaic_level = 0xf7; + flag_update_cgram_in_nmi++; +} + +void Overworld_CopyPalettesToCache() { // 82c769 + memcpy(main_palette_buffer, aux_palette_buffer, 512); + flag_update_cgram_in_nmi += 1; +} + +void Overworld_LoadPalettes(uint8 bg, uint8 spr) { // 8ed5a8 + overworld_palette_aux_or_main = 0; + + const int8 *d = kOwBgPalInfo + bg * 3; + if (d[0] >= 0) + overworld_palette_aux1_bp2to4_hi = d[0]; + if (d[1] >= 0) + overworld_palette_aux2_bp5to7_hi = d[1]; + if (d[2] >= 0) + overworld_palette_aux3_bp7_lo = d[2]; + + d = kOwSprPalInfo + spr * 2; + if (d[0] >= 0) + sprite_aux1_palette = d[0]; + if (d[1] >= 0) + sprite_aux2_palette = d[1]; + Palette_Load_OWBG1(); + Palette_Load_OWBG2(); + Palette_Load_OWBG3(); + Palette_Load_SpriteAux1(); + Palette_Load_SpriteAux2(); +} + +void Palette_BgAndFixedColor_Black() { // 8ed5f4 + Palette_SetBgAndFixedColor(0); +} + +void Palette_SetBgAndFixedColor(uint16 color) { // 8ed5f9 + main_palette_buffer[0] = color; + main_palette_buffer[32] = color; + aux_palette_buffer[0] = color; + aux_palette_buffer[32] = color; + SetBackdropcolorBlack(); +} + +void SetBackdropcolorBlack() { // 8ed60b + COLDATA_copy0 = 0x20; + COLDATA_copy1 = 0x40; + COLDATA_copy2 = 0x80; +} + +void Palette_SetOwBgColor() { // 8ed618 + Palette_SetBgAndFixedColor(Palette_GetOwBgColor()); +} + +void Palette_SpecialOw() { // 8ed61d + uint16 c = Palette_GetOwBgColor(); + aux_palette_buffer[0] = c; + aux_palette_buffer[32] = c; + SetBackdropcolorBlack(); +} + +uint16 Palette_GetOwBgColor() { // 8ed622 + if (overworld_screen_index < 0x80) + return overworld_screen_index & 0x40 ? 0x2A32 : 0x2669; + if (dungeon_room_index == 0x180 || dungeon_room_index == 0x182 || dungeon_room_index == 0x183) + return 0x19C6; + return 0x2669; +} + +void Palette_AssertTranslucencySwap() { // 8ed657 + Palette_SetTranslucencySwap(true); +} + +void Palette_SetTranslucencySwap(bool v) { // 8ed65c + overworld_palette_swap_flag = v; + uint16 a, b; + for (int i = 0; i < 8; i++) { + a = aux_palette_buffer[i + 0x80]; + b = aux_palette_buffer[i + 0xf0]; + main_palette_buffer[i + 0xf0] = aux_palette_buffer[i + 0xf0] = a; + main_palette_buffer[i + 0x80] = aux_palette_buffer[i + 0x80] = b; + + a = aux_palette_buffer[i + 0x88]; + b = aux_palette_buffer[i + 0xf8]; + main_palette_buffer[i + 0xf8] = aux_palette_buffer[i + 0xf8] = a; + main_palette_buffer[i + 0x88] = aux_palette_buffer[i + 0x88] = b; + + a = aux_palette_buffer[i + 0xb8]; + b = aux_palette_buffer[i + 0xd8]; + main_palette_buffer[i + 0xd8] = aux_palette_buffer[i + 0xd8] = a; + main_palette_buffer[i + 0xb8] = aux_palette_buffer[i + 0xb8] = b; + } + flag_update_cgram_in_nmi++; +} + +void Palette_RevertTranslucencySwap() { // 8ed6bb + Palette_SetTranslucencySwap(false); +} + +void LoadActualGearPalettes() { // 8ed6c0 + LoadGearPalettes(link_sword_type, link_shield_type, link_armor); +} + +void Palette_ElectroThemedGear() { // 8ed6d1 + LoadGearPalettes(2, 2, 4); +} + +void LoadGearPalettes_bunny() { // 8ed6dd + LoadGearPalettes(link_sword_type, link_shield_type, 3); +} + +void LoadGearPalettes(uint8 sword, uint8 shield, uint8 armor) { // 8ed6e8 + const uint16 *src = kPalette_Sword + (sword && sword != 255 ? sword - 1 : 0) * 3; + Palette_LoadMultiple_Arbitrary(src, 0x1b2, 2); + + src = kPalette_Shield + (shield ? shield - 1 : 0) * 4; + Palette_LoadMultiple_Arbitrary(src, 0x1b8, 3); + + src = kPalette_ArmorAndGloves + armor * 15; + Palette_LoadMultiple_Arbitrary(src, 0x1e2, 14); + flag_update_cgram_in_nmi++; +} + +void LoadGearPalette(int dst, const uint16 *src, int n) { // 8ed741 + memcpy(&aux_palette_buffer[dst >> 1], src, sizeof(uint16) * n); + memcpy(&main_palette_buffer[dst >> 1], src, sizeof(uint16) * n); +} + +void Filter_Majorly_Whiten_Bg() { // 8ed757 + for (int i = 32; i < 128; i++) + main_palette_buffer[i] = Filter_Majorly_Whiten_Color(aux_palette_buffer[i]); + main_palette_buffer[0] = aux_palette_buffer[0] ? main_palette_buffer[32] : 0; +} + +uint16 Filter_Majorly_Whiten_Color(uint16 c) { // 8ed7fe + int r = (c & 0x1f) + 14; + if (r > 0x1f) r = 0x1f; + int g = (c & 0x3e0) + 0x1c0; + if (g > 0x3e0) g = 0x3e0; + int b = (c & 0x7c00) + 0x3800; + if (b > 0x7c00) b = 0x7c00; + return r | g | b; +} + +void Palette_Restore_BG_From_Flash() { // 8ed83a + for (int i = 32; i < 128; i++) + main_palette_buffer[i] = aux_palette_buffer[i]; + main_palette_buffer[0] = main_palette_buffer[32]; + Palette_Restore_Coldata(); +} + +void Palette_Restore_Coldata() { // 8ed8ae + if (!player_is_indoors) { + uint32 rgb; + switch (BYTE(overworld_screen_index)) { + case 3: case 5: case 7: + rgb = 0x8c4c26; + break; + case 0x43: case 0x45: case 0x47: + rgb = 0x874a26; + break; + case 0x5b: + rgb = 0x894f33; + break; + default: + rgb = 0x804020; + } + COLDATA_copy0 = (uint8)(rgb); + COLDATA_copy1 = (uint8)(rgb >> 8); + COLDATA_copy2 = (uint8)(rgb >> 16); + } +} + +void Palette_Restore_BG_And_HUD() { // 8ed8fb + memcpy(main_palette_buffer, aux_palette_buffer, 256); + flag_update_cgram_in_nmi++; + Palette_Restore_Coldata(); +} + +void Palette_Load_SpritePal0Left() { // 9bec77 + const uint16 *src = kPalette_SpriteAux3 + overworld_palette_sp0 * 7; + Palette_LoadSingle(src, overworld_palette_swap_flag ? 0x1e2 : 0x102, 6); +} + +void Palette_Load_SpriteMain() { // 9bec9e + const uint16 *src = kPalette_MainSpr + (overworld_screen_index & 0x40 ? 60 : 0); + Palette_LoadMultiple(src, 0x122, 14, 3); +} + +void Palette_Load_SpriteAux1() { // 9becc5 + const uint16 *src = kPalette_SpriteAux1 + (sprite_aux1_palette) * 7; + Palette_LoadSingle(src, 0x1A2, 6); +} + +void Palette_Load_SpriteAux2() { // 9bece4 + const uint16 *src = kPalette_SpriteAux1 + (sprite_aux2_palette) * 7; + Palette_LoadSingle(src, 0x1C2, 6); +} + +void Palette_Load_Sword() { // 9bed03 + const uint16 *src = kPalette_Sword + ((int8)link_sword_type > 0 ? link_sword_type - 1 : 0) * 3; // wtf: zelda reads offset 0xff + Palette_LoadMultiple_Arbitrary(src, 0x1b2, 2); + flag_update_cgram_in_nmi += 1; +} + +void Palette_Load_Shield() { // 9bed29 + const uint16 *src = kPalette_Shield + (link_shield_type ? link_shield_type - 1 : 0) * 4; + Palette_LoadMultiple_Arbitrary(src, 0x1b8, 3); + flag_update_cgram_in_nmi += 1; +} + +void Palette_Load_SpriteEnvironment() { // 9bed6e + if (player_is_indoors) + Palette_Load_SpriteEnvironment_Dungeon(); + else + Palette_MiscSprite_Outdoors(); +} + +void Palette_Load_SpriteEnvironment_Dungeon() { // 9bed72 + const uint16 *src = kPalette_MiscSprite_Indoors + palette_sp6 * 7; + Palette_LoadSingle(src, 0x1d2, 6); +} + +void Palette_MiscSprite_Outdoors() { // 9bed91 + int t = (overworld_screen_index & 0x40) ? 9 : 7; + const uint16 *src = kPalette_MiscSprite_Indoors + t * 7; + Palette_LoadSingle(src, overworld_palette_swap_flag ? 0x1f2 : 0x112, 6); + src = kPalette_MiscSprite_Indoors + (t - 1) * 7; + Palette_LoadSingle(src, 0x1d2, 6); +} + +void Palette_Load_DungeonMapSprite() { // 9beddd + Palette_LoadMultiple(kPalette_PalaceMapSpr, 0x182, 6, 2); +} + +void Palette_Load_LinkArmorAndGloves() { // 9bedf9 + const uint16 *src = kPalette_ArmorAndGloves + link_armor * 15; + Palette_LoadMultiple_Arbitrary(src, 0x1e2, 14); + Palette_UpdateGlovesColor(); +} + +void Palette_UpdateGlovesColor() { // 9bee1b + if (link_item_gloves) + main_palette_buffer[0xfd] = aux_palette_buffer[0xfd] = kGlovesColor[link_item_gloves - 1]; + flag_update_cgram_in_nmi += 1; +} + +void Palette_Load_DungeonMapBG() { // 9bee3a + Palette_LoadMultiple(kPalette_PalaceMapBg, 0x40, 15, 5); +} + +void Palette_Load_HUD() { // 9bee52 + const uint16 *src = kHudPalData + hud_palette * 32; + Palette_LoadMultiple(src, 0x0, 15, 1); +} + +void Palette_Load_DungeonSet() { // 9bee74 + const uint16 *src = kPalette_DungBgMain + (dung_hdr_palette_1 >> 1) * 90; + Palette_LoadMultiple(src, 0x42, 14, 5); + Palette_LoadSingle(src, overworld_palette_swap_flag ? 0x1f2 : 0x112, 6); +} + +void Palette_Load_OWBG3() { // 9beea8 + const uint16 *src = kPalette_OverworldBgAux3 + overworld_palette_aux3_bp7_lo * 7; + Palette_LoadSingle(src, 0xE2, 6); +} + +void Palette_Load_OWBGMain() { // 9beec7 + const uint16 *src = kPalette_OverworldBgMain + overworld_palette_mode * 35; + Palette_LoadMultiple(src, 0x42, 6, 4); +} + +void Palette_Load_OWBG1() { // 9beee8 + const uint16 *src = kPalette_OverworldBgAux12 + overworld_palette_aux1_bp2to4_hi * 21; + Palette_LoadMultiple(src, 0x52, 6, 2); +} + +void Palette_Load_OWBG2() { // 9bef0c + const uint16 *src = kPalette_OverworldBgAux12 + overworld_palette_aux2_bp5to7_hi * 21; + Palette_LoadMultiple(src, 0xB2, 6, 2); +} + +void Palette_LoadSingle(const uint16 *src, int dst, int x_ents) { // 9bef30 + memcpy(&aux_palette_buffer[(dst + overworld_palette_aux_or_main) >> 1], src, sizeof(uint16) * (x_ents + 1)); +} + +void Palette_LoadMultiple(const uint16 *src, int dst, int x_ents, int y_pals) { // 9bef4b + x_ents++; + do { + memcpy(&aux_palette_buffer[(dst + overworld_palette_aux_or_main) >> 1], src, sizeof(uint16) * x_ents); + src += x_ents; + dst += 32; + } while (--y_pals >= 0); +} + +void Palette_LoadMultiple_Arbitrary(const uint16 *src, int dst, int x_ents) { // 9bef7b + memcpy(&aux_palette_buffer[dst >> 1], src, sizeof(uint16) * (x_ents + 1)); + memcpy(&main_palette_buffer[dst >> 1], src, sizeof(uint16) * (x_ents + 1)); +} + +void Palette_LoadForFileSelect() { // 9bef96 + uint8 *src = g_zenv.sram; + for (int i = 0; i < 3; i++) { + Palette_LoadForFileSelect_Armor(i * 0x20, src[kSrmOffs_Armor], src[kSrmOffs_Gloves]); + Palette_LoadForFileSelect_Sword(i * 0x20, src[kSrmOffs_Sword]); + Palette_LoadForFileSelect_Shield(i * 0x20, src[kSrmOffs_Shield]); + src += 0x500; + } + for (int i = 0; i < 7; i++) { + aux_palette_buffer[0xe8 + i] = main_palette_buffer[0xe8 + i] = kPalette_MainSpr[7 + i]; + aux_palette_buffer[0xf8 + i] = main_palette_buffer[0xf8 + i] = kPalette_MainSpr[15 + 7 + i]; + } +} + +void Palette_LoadForFileSelect_Armor(int k, uint8 armor, uint8 gloves) { // 9bf032 + const uint16 *pal = kPalette_ArmorAndGloves + armor * 15; + for (int i = 0; i != 15; i++) + aux_palette_buffer[k + 0x81 + i] = main_palette_buffer[k + 0x81 + i] = pal[i]; + if (gloves) + aux_palette_buffer[k + 0x8d] = main_palette_buffer[k + 0x8d] = kGlovesColor[gloves - 1]; +} + +void Palette_LoadForFileSelect_Sword(int k, uint8 sword) { // 9bf072 + const uint16 *src = kPalette_Sword + (sword ? sword - 1 : 0) * 3; + for (int i = 0; i != 3; i++) + aux_palette_buffer[k + 0x99 + i] = main_palette_buffer[k + 0x99 + i] = src[i]; +} + +void Palette_LoadForFileSelect_Shield(int k, uint8 shield) { // 9bf09a + const uint16 *src = kPalette_Shield + (shield ? shield - 1 : 0) * 4; + for (int i = 0; i != 4; i++) + aux_palette_buffer[k + 0x9c + i] = main_palette_buffer[k + 0x9c + i] = src[i]; +} + +void Palette_LoadAgahnim() { // 9bf0c2 + const uint16 *src = kPalette_SpriteAux1 + 14 * 7; + Palette_LoadMultiple_Arbitrary(src, 0x162, 6); + Palette_LoadMultiple_Arbitrary(src, 0x182, 6); + Palette_LoadMultiple_Arbitrary(src, 0x1a2, 6); + src = kPalette_SpriteAux1 + 21 * 7; + Palette_LoadMultiple_Arbitrary(src, 0x1c2, 6); + flag_update_cgram_in_nmi++; +} + +void HandleScreenFlash() { // 9de9b6 + int j = intro_times_pal_flash; + if (!j || submodule_index != 0) + return; + if (!--intro_times_pal_flash) { + Palette_Restore_BG_And_HUD(); + return; + } + + if (j & 1) + Filter_Majorly_Whiten_Bg(); + else + Palette_Restore_BG_From_Flash(); + + flag_update_cgram_in_nmi++; +} + diff --git a/load_gfx.h b/load_gfx.h new file mode 100644 index 00000000..232c3123 --- /dev/null +++ b/load_gfx.h @@ -0,0 +1,162 @@ +#pragma once + +enum { + kSrmOffs_Gloves = 0x354, + kSrmOffs_Sword = 0x359, + kSrmOffs_Shield = 0x35a, + kSrmOffs_Armor = 0x35b, + kSrmOffs_DiedCounter = 0x405, + kSrmOffs_Name = 0x3d9, + kSrmOffs_Health = 0x36c, +}; + +const uint16 *GetFontPtr(); +void ApplyPaletteFilter_bounce(); +void PaletteFilter_Range(int from, int to); +void PaletteFilter_IncrCountdown(); +uint8 *LoadItemAnimationGfxOne(uint8 *dst, int num, int r12, bool from_temp); +uint16 snes_divide(uint16 dividend, uint8 divisor); +void EraseTileMaps_normal(); +void DecompAndUpload2bpp(uint8 pack); +void RecoverPegGFXFromMapping(); +void LoadOverworldMapPalette(); +void EraseTileMaps_triforce(); +void EraseTileMaps_dungeonmap(); +void EraseTileMaps(uint16 r2, uint16 r0); +void EnableForceBlank(); +void LoadItemGFXIntoWRAM4BPPBuffer(); +void DecompressSwordGraphics(); +void DecompressShieldGraphics(); +void DecompressAnimatedDungeonTiles(uint8 a); +void DecompressAnimatedOverworldTiles(uint8 a); +void LoadItemGFX_Auxiliary(); +void LoadFollowerGraphics(); +void WriteTo4BPPBuffer_at_7F4000(uint8 a); +void DecodeAnimatedSpriteTile_variable(uint8 a); +void Expand3To4High(uint8 *dst, const uint8 *src, const uint8 *base, int num); +void LoadTransAuxGFX(); +void LoadTransAuxGFX_sprite(); +void Gfx_LoadSpritesInner(uint8 *dst); +void ReloadPreviouslyLoadedSheets(); +void Attract_DecompressStoryGFX(); +void AnimateMirrorWarp(); +void AnimateMirrorWarp_DecompressNewTileSets(); +void Graphics_IncrementalVRAMUpload(); +void PrepTransAuxGfx(); +void Do3To4High16Bit(uint8 *dst, const uint8 *src, int num); +void Do3To4Low16Bit(uint8 *dst, const uint8 *src, int num); +void LoadNewSpriteGFXSet(); +void InitializeTilesets(); +void LoadDefaultGraphics(); +void Attract_LoadBG3GFX(); +void LoadCommonSprites_2(); +void Graphics_LoadChrHalfSlot(); +void TransferFontToVRAM(); +void LoadSpriteGraphics(int gfx_pack, uint8 *decomp_addr); +void Do3To4High(const uint8 *decomp_addr); +void LoadBackgroundGraphics(int gfx_pack, int slot, uint8 *decomp_addr); +void Do3To4Low(const uint8 *decomp_addr); +void LoadCommonSprites(); +int Decomp_spr(uint8 *dst, int gfx); +int Decomp_bg(uint8 *dst, int gfx); +int Decompress(uint8 *dst, const uint8 *src); +void ResetHUDPalettes4and5(); +void PaletteFilterHistory(); +void PaletteFilter_WishPonds(); +void PaletteFilter_Crystal(); +void PaletteFilter_WishPonds_Inner(); +void PaletteFilter_RestoreSP5F(); +void PaletteFilter_SP5F(); +void KholdstareShell_PaletteFiltering(); +void AgahnimWarpShadowFilter(int k); +void Palette_FadeIntroOneStep(); +void Palette_FadeIntro2(); +void PaletteFilter_RestoreAdditive(int from, int to); +void PaletteFilter_RestoreSubtractive(uint16 from, uint16 to); +void PaletteFilter_InitializeWhiteFilter(); +void MirrorWarp_RunAnimationSubmodules(); +void PaletteFilter_BlindingWhite(); +void PaletteFilter_StartBlindingWhite(); +void PaletteFilter_BlindingWhiteTriforce(); +void PaletteFilter_WhirlpoolBlue(); +void PaletteFilter_IsolateWhirlpoolBlue(); +void PaletteFilter_WhirlpoolRestoreBlue(); +void PaletteFilter_WhirlpoolRestoreRedGreen(); +void PaletteFilter_RestoreBGSubstractiveStrict(); +void PaletteFilter_RestoreBGAdditiveStrict(); +void Trinexx_FlashShellPalette_Red(); +void Trinexx_UnflashShellPalette_Red(); +void Trinexx_FlashShellPalette_Blue(); +void Trinexx_UnflashShellPalette_Blue(); +void IrisSpotlight_close(); +void Spotlight_open(); +void SpotlightInternal(uint8 x, uint8 y); +void IrisSpotlight_ConfigureTable(); +void IrisSpotlight_ResetTable(); +uint16 IrisSpotlight_CalculateCircleValue(uint8 a); +void AdjustWaterHDMAWindow(); +void AdjustWaterHDMAWindow_X(uint16 r10); +void FloodDam_PrepFloodHDMA(); +void ResetStarTileGraphics(); +void Dungeon_RestoreStarTileChr(); +void LinkZap_HandleMosaic(); +void Player_SetCustomMosaicLevel(uint8 a); +void Module07_16_UpdatePegs_Step1(); +void Module07_16_UpdatePegs_Step2(); +void Dungeon_UpdatePegGFXBuffer(int x, int y); +void Dungeon_HandleTranslucencyAndPalette(); +void Overworld_LoadAllPalettes(); +void Dungeon_LoadPalettes(); +void Overworld_LoadPalettesInner(); +void OverworldLoadScreensPaletteSet(); +void Overworld_LoadAreaPalettesEx(uint8 x); +void SpecialOverworld_CopyPalettesToCache(); +void Overworld_CopyPalettesToCache(); +void Overworld_LoadPalettes(uint8 bg, uint8 spr); +void Palette_BgAndFixedColor_Black(); +void Palette_SetBgAndFixedColor(uint16 color); +void SetBackdropcolorBlack(); +void Palette_SetOwBgColor(); +void Palette_SpecialOw(); +uint16 Palette_GetOwBgColor(); +void Palette_AssertTranslucencySwap(); +void Palette_SetTranslucencySwap(bool v); +void Palette_RevertTranslucencySwap(); +void LoadActualGearPalettes(); +void Palette_ElectroThemedGear(); +void LoadGearPalettes_bunny(); +void LoadGearPalettes(uint8 sword, uint8 shield, uint8 armor); +void LoadGearPalette(int dst, const uint16 *src, int n); +void Filter_Majorly_Whiten_Bg(); +uint16 Filter_Majorly_Whiten_Color(uint16 c); +void Palette_Restore_BG_From_Flash(); +void Palette_Restore_Coldata(); +void Palette_Restore_BG_And_HUD(); +void Palette_Load_SpritePal0Left(); +void Palette_Load_SpriteMain(); +void Palette_Load_SpriteAux1(); +void Palette_Load_SpriteAux2(); +void Palette_Load_Sword(); +void Palette_Load_Shield(); +void Palette_Load_SpriteEnvironment(); +void Palette_Load_SpriteEnvironment_Dungeon(); +void Palette_MiscSprite_Outdoors(); +void Palette_Load_DungeonMapSprite(); +void Palette_Load_LinkArmorAndGloves(); +void Palette_UpdateGlovesColor(); +void Palette_Load_DungeonMapBG(); +void Palette_Load_HUD(); +void Palette_Load_DungeonSet(); +void Palette_Load_OWBG3(); +void Palette_Load_OWBGMain(); +void Palette_Load_OWBG1(); +void Palette_Load_OWBG2(); +void Palette_LoadSingle(const uint16 *src, int dst, int x_ents); +void Palette_LoadMultiple(const uint16 *src, int dst, int x_ents, int y_pals); +void Palette_LoadMultiple_Arbitrary(const uint16 *src, int dst, int x_ents); +void Palette_LoadForFileSelect(); +void Palette_LoadForFileSelect_Armor(int k, uint8 armor, uint8 gloves); +void Palette_LoadForFileSelect_Sword(int k, uint8 sword); +void Palette_LoadForFileSelect_Shield(int k, uint8 shield); +void Palette_LoadAgahnim(); +void HandleScreenFlash(); diff --git a/main.cpp b/main.cpp new file mode 100644 index 00000000..1e62b95b --- /dev/null +++ b/main.cpp @@ -0,0 +1,342 @@ + +#include +#include +#include +#include +#include + +#include + +#include "snes/snes.h" +#include "tracing.h" + +#include "types.h" +#include "variables.h" + +#include "zelda_rtl.h" + +extern uint8 g_emulated_ram[0x20000]; +bool g_run_without_emu = false; + +void PatchRom(uint8_t *rom); +void SetSnes(Snes *snes); +void RunAudioPlayer(); +void CopyStateAfterSnapshotRestore(bool is_reset); +void SaveLoadSlot(int cmd, int which); +void PatchCommand(char cmd); +bool RunOneFrame(Snes *snes, int input_state, bool turbo); + +static uint8_t* readFile(char* name, size_t* length); +static bool loadRom(char* name, Snes* snes); +static bool checkExtention(const char* name, bool forZip); +static void playAudio(Snes *snes, SDL_AudioDeviceID device, int16_t* audioBuffer); +static void renderScreen(SDL_Renderer* renderer, SDL_Texture* texture); +static void handleInput(int keyCode, int modCode, bool pressed); + +int input1_current_state; + +void setButtonState(int button, bool pressed) { + // set key in constroller + if (pressed) { + input1_current_state |= 1 << button; + } else { + input1_current_state &= ~(1 << button); + } +} + + +#undef main +int main(int argc, char** argv) { + // set up SDL + if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0) { + printf("Failed to init SDL: %s\n", SDL_GetError()); + return 1; + } + SDL_Window* window = SDL_CreateWindow("Zelda3", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 512, 480, 0); + if(window == NULL) { + printf("Failed to create window: %s\n", SDL_GetError()); + return 1; + } + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + if(renderer == NULL) { + printf("Failed to create renderer: %s\n", SDL_GetError()); + return 1; + } + SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBX8888, SDL_TEXTUREACCESS_STREAMING, 512, 480); + if(texture == NULL) { + printf("Failed to create texture: %s\n", SDL_GetError()); + return 1; + } + SDL_AudioSpec want, have; + SDL_AudioDeviceID device; + SDL_memset(&want, 0, sizeof(want)); + want.freq = 44100; + want.format = AUDIO_S16; + want.channels = 2; + want.samples = 2048; + want.callback = NULL; // use queue + device = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0); + if(device == 0) { + printf("Failed to open audio device: %s\n", SDL_GetError()); + return 1; + } + int16_t* audioBuffer = (int16_t * )malloc(735 * 4); // *2 for stereo, *2 for sizeof(int16) + SDL_PauseAudioDevice(device, 0); + + Snes *snes = snes_init(g_emulated_ram), *snes_run = NULL; + if (argc >= 2 && !g_run_without_emu) { + // init snes, load rom + bool loaded = loadRom(argv[1], snes); + if (!loaded) { + puts("No rom loaded"); + return 1; + } + snes_run = snes; + } else { + snes_reset(snes, true); + } + SetSnes(snes); + ZeldaInitialize(); + bool hooks = true; + // sdl loop + bool running = true; + SDL_Event event; + uint32_t lastTick = SDL_GetTicks(); + uint32_t curTick = 0; + uint32_t delta = 0; + int numFrames = 0; + bool cpuNext = false; + bool spcNext = false; + int counter = 0; + bool paused = false; + bool turbo = true; + uint32_t frameCtr = 0; + + printf("%d\n", *(int *)snes->cart->ram); + + while(running) { + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_KEYDOWN: { + switch(event.key.keysym.sym) { + case SDLK_e: + if (snes) { + snes_reset(snes, event.key.keysym.sym == SDLK_e); + CopyStateAfterSnapshotRestore(true); + } + break; + case SDLK_p: paused ^= true; break; + case SDLK_w: + PatchCommand('w'); + break; + case SDLK_o: + PatchCommand('o'); + break; + case SDLK_k: + PatchCommand('k'); + break; + case SDLK_t: + turbo = !turbo; + break; + } + handleInput(event.key.keysym.sym, event.key.keysym.mod, true); + break; + } + case SDL_KEYUP: { + handleInput(event.key.keysym.sym, event.key.keysym.mod, false); + break; + } + case SDL_QUIT: { + running = false; + break; + } + } + } + + if (paused) { + SDL_Delay(16); + continue; + } + + bool is_turbo = RunOneFrame(snes_run, input1_current_state, (counter++ & 0x7f) != 0 && turbo); + + if (is_turbo) + continue; + + ZeldaDrawPpuFrame(); + + playAudio(snes_run, device, audioBuffer); + renderScreen(renderer, texture); + + SDL_RenderPresent(renderer); // vsyncs to 60 FPS + // if vsync isn't working, delay manually + curTick = SDL_GetTicks(); + + static const uint8 delays[3] = { 17, 17, 16 }; // 60 fps +#if 1 + lastTick += delays[frameCtr++ % 3]; + + if (lastTick > curTick) { + delta = lastTick - curTick; + if (delta > 500) { + lastTick = curTick - 500; + delta = 500; + } + SDL_Delay(delta); + } else if (curTick - lastTick > 500) { + lastTick = curTick; + } +#endif + } + // clean snes + snes_free(snes); + // clean sdl + SDL_PauseAudioDevice(device, 1); + SDL_CloseAudioDevice(device); + free(audioBuffer); + SDL_DestroyTexture(texture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} + +extern struct Ppu *GetPpuForRendering(); +extern struct Dsp *GetDspForRendering(); + +static void playAudio(Snes *snes, SDL_AudioDeviceID device, int16_t* audioBuffer) { + // generate enough samples + if (!kIsOrigEmu && snes) { + while (snes->apu->dsp->sampleOffset < 534) + apu_cycle(snes->apu); + snes->apu->dsp->sampleOffset = 0; + } + + dsp_getSamples(GetDspForRendering(), audioBuffer, 735); + if(SDL_GetQueuedAudioSize(device) <= 735 * 4 * 6) { + // don't queue audio if buffer is still filled + SDL_QueueAudio(device, audioBuffer, 735 * 4); + } else { + printf("Skipping audio!\n"); + } +} + +static void renderScreen(SDL_Renderer* renderer, SDL_Texture* texture) { + void* pixels = NULL; + int pitch = 0; + if(SDL_LockTexture(texture, NULL, &pixels, &pitch) != 0) { + printf("Failed to lock texture: %s\n", SDL_GetError()); + return; + } + + ppu_putPixels(GetPpuForRendering(), (uint8_t*) pixels); + SDL_UnlockTexture(texture); + SDL_RenderCopy(renderer, texture, NULL, NULL); +} + + +static void handleInput(int keyCode, int keyMod, bool pressed) { + switch(keyCode) { + case SDLK_z: setButtonState(0, pressed); break; + case SDLK_a: setButtonState(1, pressed); break; + case SDLK_RSHIFT: setButtonState(2, pressed); break; + case SDLK_RETURN: setButtonState(3, pressed); break; + case SDLK_UP: setButtonState(4, pressed); break; + case SDLK_DOWN: setButtonState(5, pressed); break; + case SDLK_LEFT: setButtonState(6, pressed); break; + case SDLK_RIGHT: setButtonState(7, pressed); break; + case SDLK_x: setButtonState(8, pressed); break; + case SDLK_s: setButtonState(9, pressed); break; + case SDLK_d: setButtonState(10, pressed); break; + case SDLK_c: setButtonState(11, pressed); break; + case SDLK_BACKSPACE: + case SDLK_1: + case SDLK_2: + case SDLK_3: + case SDLK_4: + case SDLK_5: + case SDLK_6: + case SDLK_7: + case SDLK_8: + case SDLK_9: + case SDLK_0: + case SDLK_MINUS: + case SDLK_EQUALS: + if (pressed) { + SaveLoadSlot( + (keyMod & KMOD_CTRL) != 0 ? kSaveLoad_Replay : kSaveLoad_Load, + 256 + (keyCode == SDLK_0 ? 9 : + keyCode == SDLK_MINUS ? 10 : + keyCode == SDLK_EQUALS ? 11 : + keyCode == SDLK_BACKSPACE ? 12 : + keyCode - SDLK_1)); + } + break; + + case SDLK_F1: + case SDLK_F2: + case SDLK_F3: + case SDLK_F4: + case SDLK_F5: + case SDLK_F6: + case SDLK_F7: + case SDLK_F8: + case SDLK_F9: + case SDLK_F10: + if (pressed) { + SaveLoadSlot( + (keyMod & KMOD_CTRL) != 0 ? kSaveLoad_Replay : + (keyMod & KMOD_SHIFT) != 0 ? kSaveLoad_Save : kSaveLoad_Load, + keyCode - SDLK_F1); + } + break; + } +} + +static bool checkExtention(const char* name, bool forZip) { + if(name == NULL) return false; + int length = strlen(name); + if(length < 4) return false; + if(forZip) { + if(strcmp(name + length - 4, ".zip") == 0) return true; + if(strcmp(name + length - 4, ".ZIP") == 0) return true; + } else { + if(strcmp(name + length - 4, ".smc") == 0) return true; + if(strcmp(name + length - 4, ".SMC") == 0) return true; + if(strcmp(name + length - 4, ".sfc") == 0) return true; + if(strcmp(name + length - 4, ".SFC") == 0) return true; + } + return false; +} + +static bool loadRom(char* name, Snes* snes) { + // zip library from https://github.com/kuba--/zip + size_t length = 0; + uint8_t* file = NULL; + file = readFile(name, &length); + if(file == NULL) { + puts("Failed to read file"); + return false; + } + + PatchRom(file); + + bool result = snes_loadRom(snes, file, length); + free(file); + return result; +} + +static uint8_t* readFile(char* name, size_t* length) { + FILE* f = fopen(name, "rb"); + if(f == NULL) { + return NULL; + } + fseek(f, 0, SEEK_END); + int size = ftell(f); + rewind(f); + uint8_t* buffer = (uint8_t *)malloc(size); + fread(buffer, size, 1, f); + fclose(f); + *length = size; + return buffer; +} diff --git a/messaging.cpp b/messaging.cpp new file mode 100644 index 00000000..a80a214f --- /dev/null +++ b/messaging.cpp @@ -0,0 +1,3071 @@ +#include "messaging.h" +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" +#include "dungeon.h" +#include "hud.h" +#include "load_gfx.h" +#include "dungeon.h" +#include "overworld.h" +#include "variables.h" +#include "ancilla.h" +#include "player.h" +#include "misc.h" +#include "sprite.h" +#include "player_oam.h" +#include "attract.h" +#include "nmi.h" +#include "tables/generated_dialogue.h" +#include "tables/generated_overworld_map.h" +#include "tables/generated_dungeon_map.h" + +static const int8 kDungMap_Tab0[14] = {-1, -1, -1, -1, -1, 2, 0, 10, 4, 8, -1, 6, 12, 14}; +static const uint16 kDungMap_Tab1[8] = {0x2108, 0x2109, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x211d}; +static const uint16 kDungMap_Tab2[8] = {0x2118, 0x2119, 0xa109, 0x211a, 0x211b, 0x211c, 0x2118, 0xa11d}; +static const uint8 kDungMap_Tab3[14] = {0x60, 0x84, 0, 0xb, 0x32, 0x21, 0x33, 0x21, 0x38, 0x21, 0x3a, 0x21, 0x7f, 0x20}; +static const uint8 kDungMap_Tab4[14] = {0x60, 0xa4, 0, 0xb, 0x42, 0x21, 0x43, 0x21, 0x49, 0x21, 0x4a, 0x21, 0x7f, 0x20}; +static const uint16 kDungMap_Tab8[7] = {0x1b28, 0x1b29, 0x1b2a, 0x1b2b, 0x1b2c, 0x1b2d, 0x1b2e}; +static const uint16 kDungMap_Tab6[21] = {0xaa10, 0x100, 0x1b2f, 0xc910, 0x300, 0x1b2f, 0x1b2e, 0xe510, 0xb00, 0x1b2f, 0x1b2e, 0x5b2f, 0x1b2f, 0x1b2e, 0x1b2e, 0x311, 0x100, 0x1b2f, 0x411, 0xc40, 0x1b2e}; +static const uint16 kDungMap_Tab5[14] = {0x21, 0x23, 0x20, 0x21, 0x70, 0x12, 0x11, 0x212, 2, 0x217, 0x160, 0x12, 0x113, 0x171}; +static const uint16 kDungMap_Tab7[9] = {0x1223, 0x1263, 0x12a3, 0x12e3, 0x1323, 0x11e3, 0x11a3, 0x1163, 0x1123}; +static const uint16 kDungMap_Tab9[8] = {0xf26, 0xf27, 0x4f27, 0x4f26, 0x8f26, 0x8f27, 0xcf27, 0xcf26}; +static const uint16 kDungMap_Tab10[4] = {0xe2, 0xf8, 0x3a2, 0x3b8}; +static const uint16 kDungMap_Tab11[4] = {0x1f19, 0x5f19, 0x9f19, 0xdf19}; +static const uint16 kDungMap_Tab12[2] = {0xe4, 0x3a4}; +static const uint16 kDungMap_Tab13[2] = {0x1f1a, 0x9f1a}; +static const uint16 kDungMap_Tab14[2] = {0x122, 0x138}; +static const uint16 kDungMap_Tab15[2] = {0x1f1b, 0x5f1b}; +static const uint16 kDungMap_Tab16[8] = {0x1f1e, 0x1f1f, 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25}; +static const uint16 kDungMap_Tab23[744] = { + 0xb61, 0x5361, 0x8b61, 0x8b62, 0xb60, 0xb63, 0x8b60, 0xb64, 0xb00, 0xb00, 0xb65, 0xb66, 0xb67, 0x4b67, 0x9367, 0xd367, 0xb60, 0x5360, 0x8b60, 0xcb60, 0xb6a, 0x4b6a, 0x4b6d, 0xb6d, 0x1368, 0x1369, 0xb00, 0xb00, 0xb6a, 0x136b, 0xb6c, 0xb6d, + 0x136e, 0x4b6e, 0xb00, 0xb00, 0x136f, 0xb00, 0xb00, 0xb00, 0x1340, 0xb00, 0xb78, 0x1744, 0x536d, 0x136d, 0x4b76, 0xb76, 0xb70, 0xb71, 0xb72, 0x8b71, 0xb75, 0xb76, 0x8b75, 0x8b76, 0xb00, 0xb53, 0xb00, 0xb55, 0x1354, 0x5354, 0xb00, 0xb00, + 0x4b53, 0xb00, 0xb56, 0xb57, 0xb00, 0xb59, 0xb00, 0x135e, 0x135a, 0x135b, 0x135f, 0x535f, 0xb5c, 0xb5d, 0x535e, 0xcb58, 0xb50, 0x4b50, 0x1352, 0x5352, 0xb00, 0xb40, 0x1345, 0xb46, 0x8b42, 0xb47, 0xb42, 0xb49, 0x1348, 0x5348, 0x174a, 0x574a, + 0x4b47, 0xcb42, 0x4b49, 0x4b42, 0xb00, 0xb4b, 0xb00, 0xb4d, 0xb4c, 0x4b4c, 0xb4e, 0x4b4e, 0xb51, 0xb44, 0xb00, 0xb00, 0xb4f, 0x4b4f, 0x934f, 0xd34f, 0xb00, 0xb00, 0xb00, 0xb40, 0xb00, 0xb41, 0xb00, 0xb42, 0xb00, 0xb00, 0xb43, 0xb43, + 0xb00, 0xb00, 0x9344, 0xb00, 0x1340, 0xb00, 0x1341, 0xb00, 0x1740, 0xb40, 0xb42, 0xb7d, 0x4b7a, 0xb7a, 0xb7e, 0x4b7e, 0xb40, 0x8b4d, 0x4bba, 0xb55, 0xb40, 0x8b55, 0x1378, 0xcb53, 0x4b76, 0x4b75, 0x13bb, 0x53bb, 0x4b7f, 0x4b42, 0xb83, 0x13bc, + 0xb00, 0xb00, 0xb79, 0xb00, 0xb6e, 0x4b7c, 0xb00, 0xb41, 0x1340, 0x8b55, 0xb42, 0xb7b, 0x8b42, 0x9344, 0x1341, 0xb00, 0xb53, 0x9344, 0x8b53, 0x9344, 0x8b42, 0x9344, 0xb42, 0x9344, 0x934d, 0xb00, 0x8b53, 0x9344, 0xb00, 0xb00, 0xb40, 0xb00, + 0xb41, 0xb00, 0x1384, 0xb00, 0xbb8, 0x13b9, 0x4b85, 0xcb7c, 0xb87, 0x13b0, 0x4b7b, 0x9344, 0xb00, 0xb00, 0xb40, 0xb00, 0xb91, 0x5391, 0xb9c, 0x4b9c, 0x8b42, 0x1392, 0xb93, 0x1394, 0xb95, 0xb96, 0x9395, 0x8b96, 0xb97, 0xb98, 0x8b97, 0x8b98, + 0x1799, 0x5799, 0x9799, 0xd799, 0x4b98, 0x4b97, 0xcb98, 0xcb97, 0x937b, 0xb00, 0xb7b, 0xb00, 0xba6, 0x4ba6, 0xcb7a, 0x8b7a, 0xb8e, 0x4b8e, 0x938e, 0xcb8e, 0x934d, 0xb8f, 0x1390, 0x5390, 0xb00, 0xb00, 0xb00, 0x8b48, 0xb00, 0x934e, 0xb00, 0x8b4d, + 0x8b72, 0x1346, 0xb45, 0xb46, 0x5744, 0x1744, 0xb00, 0xb00, 0x134d, 0xb00, 0x8b54, 0xb00, 0x1349, 0x1349, 0xb00, 0xb00, 0xb4b, 0x8b48, 0xb72, 0x4b72, 0xb00, 0xb74, 0xb00, 0xbb0, 0xb71, 0x1747, 0x17af, 0xb4b, 0xb6f, 0x1370, 0xb4b, 0xb00, + 0xb6b, 0x8b6c, 0x8b6b, 0xbad, 0xb73, 0xb00, 0x13ae, 0xb46, 0x176b, 0x576b, 0xb6a, 0x4b6a, 0x1368, 0x5368, 0x1369, 0x5369, 0x8b4e, 0xb00, 0x9354, 0xb00, 0xb00, 0xb00, 0xb00, 0x5377, 0xb00, 0x974d, 0xb00, 0x4b7b, 0xb40, 0x8b4d, 0xb51, 0xb8d, + 0x537a, 0x137a, 0x4b42, 0x8b40, 0xb00, 0xb00, 0xb00, 0xb00, 0xb00, 0xb00, 0xb40, 0xb00, 0xcb7a, 0x576e, 0xb00, 0xb00, 0xb6e, 0xb9f, 0xb00, 0x4ba5, 0x13a0, 0x13a1, 0xba2, 0xba3, 0xba4, 0xb00, 0xba5, 0xb00, 0xb40, 0x8b55, 0xb42, 0xcb87, + 0x8b95, 0xba7, 0x8b42, 0xbaf, 0x4b78, 0xb00, 0x4b78, 0xb00, 0x8b42, 0xb51, 0xb78, 0x8b51, 0xba8, 0xba9, 0xbac, 0x8ba9, 0xbaa, 0x17ab, 0x13b4, 0x8bab, 0x17b1, 0xb41, 0x4b44, 0x4b42, 0xb00, 0xbad, 0xb00, 0x13ae, 0x1340, 0xbb7, 0xb42, 0xbb6, + 0xb00, 0xb00, 0x139d, 0x139e, 0xb00, 0xb00, 0xb00, 0xb79, 0xb00, 0xb00, 0x8b42, 0xb86, 0xb42, 0x8b7b, 0x8b42, 0xb7b, 0xb87, 0x8b7b, 0x9387, 0xb7b, 0xb40, 0x13b3, 0x1378, 0xb8d, 0x8b42, 0xb88, 0x5378, 0xb40, 0x4b44, 0xd342, 0x97b5, 0x4b78, + 0x13b3, 0x8b55, 0x4b7b, 0xb8d, 0xb89, 0x138a, 0xb8b, 0xb8c, 0xb00, 0xb7c, 0xb00, 0xb00, 0xb00, 0x9348, 0xb00, 0xb56, 0xb00, 0xb00, 0xb88, 0xb00, 0xb00, 0xb48, 0xb00, 0xb00, 0xb00, 0x9348, 0x1786, 0xb65, 0xb00, 0xb00, 0xcb5a, 0xb00, + 0xb00, 0x5388, 0xb00, 0xb00, 0x4b5a, 0xb00, 0xb00, 0xb00, 0xb00, 0xcb5b, 0x13ab, 0xbac, 0xcb5a, 0xb00, 0x137e, 0xb00, 0xb00, 0x137e, 0xb00, 0xb00, 0xb00, 0x8b48, 0x1783, 0x1384, 0xb00, 0xb00, 0x1385, 0xb00, 0xb00, 0x537e, 0xb00, 0xb00, + 0xb00, 0x8b48, 0xb43, 0xcb43, 0xb00, 0xb00, 0x1379, 0x137a, 0xb5a, 0x137b, 0xb00, 0xb00, 0xb00, 0x8b48, 0x137f, 0x1380, 0xb00, 0xb00, 0x1381, 0x1382, 0xb00, 0xb48, 0xb00, 0xb00, 0xb00, 0xb00, 0x1387, 0x1377, 0x5746, 0xb47, 0x1349, 0xb48, + 0x1375, 0x4b42, 0x174a, 0x574a, 0xb43, 0x1344, 0xb45, 0x1746, 0x1742, 0x5742, 0x8b42, 0xcb42, 0x1375, 0x5375, 0x8b42, 0xcb42, 0x4b40, 0x1340, 0xb41, 0x4b41, 0x4b46, 0xb71, 0x1786, 0x8b71, 0x1347, 0xb4d, 0xb65, 0xb5b, 0xb00, 0xb00, 0x9348, 0xb00, + 0xb00, 0xb00, 0xb00, 0x8b48, 0x4b66, 0x8b65, 0x4b5b, 0xb65, 0x9365, 0xb66, 0xb63, 0x8b66, 0x4b51, 0xb5f, 0xcb76, 0xb60, 0xb64, 0x4b4f, 0x4b60, 0x8b76, 0x4b76, 0xb61, 0xd376, 0x1362, 0x4b61, 0xb76, 0xcb58, 0x8b51, 0xb00, 0xb00, 0x5746, 0xb5e, + 0xb00, 0xb00, 0xb5e, 0xb46, 0xb00, 0xb00, 0x8b48, 0xb00, 0xb4f, 0xb51, 0xcb76, 0x8b76, 0x5351, 0xb51, 0x8b4f, 0x8b51, 0x4b76, 0xb76, 0xcb51, 0x8b58, 0xb54, 0xb00, 0x8b66, 0xb00, 0x9348, 0x8b48, 0xb56, 0x4b45, 0xb00, 0xb57, 0xb00, 0xb59, + 0x4b50, 0xb58, 0xcb50, 0x8b50, 0x5758, 0x1751, 0xcb58, 0x8b51, 0xb56, 0x4b56, 0xb65, 0x5756, 0x9348, 0x8b48, 0xb4c, 0xb4b, 0xb4d, 0xb00, 0x8b54, 0xb00, 0xb4f, 0xb50, 0x8b4f, 0x8b50, 0x4b50, 0xb51, 0xcb58, 0x8b51, 0xb52, 0xb54, 0xb53, 0x9354, + 0x9748, 0x9748, 0x138d, 0x138e, 0x1391, 0x1392, 0x138c, 0x138f, 0x1393, 0x1390, 0x9393, 0x138f, 0x1394, 0x1395, 0x138e, 0x138c, 0x175d, 0x1399, 0x975d, 0x538f, 0x1397, 0x1398, 0x179a, 0x138c, 0x1399, 0x1766, 0x138f, 0xd75d, 0x538e, 0x538f, 0x1391, 0x1392, + 0x139b, 0x539b, 0x139c, 0x539c, 0x138f, 0x138e, 0x5392, 0x5391, 0x138a, 0x538a, 0x138b, 0x538b, 0xb00, 0xcb5b, 0xb00, 0x8b54, 0x4b74, 0x13a6, 0xb00, 0x4b48, 0x13a0, 0x13a1, 0x538e, 0x138e, 0xd38e, 0x53a3, 0x13a4, 0xb00, 0x97aa, 0xb00, 0x538e, 0x1399, + 0x13a4, 0xb00, 0x138e, 0xb00, 0xb00, 0x5393, 0xb00, 0x574e, 0x4b7d, 0xb00, 0x8b7d, 0x139f, 0x97aa, 0x13a4, 0x13a9, 0x53a9, 0x13a5, 0x13a6, 0x93a5, 0xd3a5, 0xd38e, 0x938e, 0x13a4, 0x13aa, 0xb00, 0x13a6, 0xb00, 0x8b5f, 0x139b, 0x13a6, 0x139c, 0x53a2, + 0xb00, 0xb00, 0x138c, 0xb00, 0x9394, 0x139e, 0xb00, 0xb00, +}; +static const uint16 kDungMap_Ptrs27[14] = {0xfc00, 0xfc08, 0xfc15, 0xfc21, 0xfc2b, 0xfc32, 0xfc3f, 0xfc4d, 0xfc5f, 0xfc68, 0xfc7d, 0xfc83, 0xfc8f, 0xfca0}; +static const uint16 kDungMap_Tab21[3] = {137, 167, 79}; +static const uint16 kDungMap_Tab22[3] = {169, 119, 190}; +static const uint16 kDungMap_Tab24[2] = {0x1f, 0x7f}; +static const uint16 kDungMap_Tab25[14] = {15, 15, 200, 51, 32, 6, 90, 144, 41, 222, 7, 172, 164, 13}; +static const int16 kDungMap_Tab28[14] = {-1, -1, 1, 1, 6, 0xff, 0xff, 0xff, 0xfe, 0xf9, 5, 0xff, 0xfd, 6}; +static PlayerHandlerFunc *const kDungMapInit[] = { + &Module0E_03_01_00_PrepMapGraphics, + &Module0E_03_01_01_DrawLEVEL, + &Module0E_03_01_02_DrawFloorsBackdrop, + &Module0E_03_01_03_DrawRooms, + &DungeonMap_DrawRoomMarkers, +}; +static const uint8 kDungMap_Tab38[4] = {0x39, 0x3b, 0x3d, 0x3b}; +static const int8 kDungMap_Tab29[4] = {-9, 8, -9, 8}; +static const int8 kDungMap_Tab30[4] = {-8, -8, 9, 9}; +static const uint8 kDungMap_Tab31[4] = {0xf1, 0xb1, 0x71, 0x31}; +static const uint8 kDungMap_Tab32[4] = {0xc, 0xc, 8, 0xa}; +static const uint8 kDungMap_Tab33[8] = {187, 171, 155, 139, 123, 107, 91, 75}; +static const uint8 kDungMap_Tab34[8] = {0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25}; +static const uint8 kDungMap_Tab35[2] = {0, 8}; +static const uint8 kDungMap_Tab36[4] = {0x37, 0x38, 0x38, 0x37}; +static const int16 kDungMap_Tab37[14] = { -1, -1, 0x808, 8, 0, 8, 0x808, 8, 0x808, 0x800, 0x404, 0x808, 8, 8 }; +static const int8 kDungMap_Tab39[2] = {-4, 4}; +static const int8 kDungMap_Tab40[2] = {4, -4}; +static const int16 kDungMap_Tab26[2] = {0x60, -0x60}; +static PlayerHandlerFunc *const kDungMapSubmodules[] = { + &DungMap_Backup, + &Module0E_03_01_DrawMap, + &DungMap_LightenUpMap, + &DungeonMap_HandleInputAndSprites, + &DungMap_4, + &DungMap_FadeMapToBlack, + &DungeonMap_RecoverGFX, + &ToggleStarTilesAndAdvance, + &DungMap_RestoreOld, +}; +static const uint16 kText_Positions[2] = {0x6125, 0x6244}; +static const uint16 kSrmOffsets[4] = {0, 0x500, 0xa00, 0xf00}; +static const uint8 kTextDictionary[] = { + 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, + 0x59, 0x59, + 0x51, 0x2c, 0x59, + 0x1a, 0x27, 0x1d, 0x59, + 0x1a, 0x2b, 0x1e, 0x59, + 0x1a, 0x25, 0x25, 0x59, + 0x1a, 0x22, 0x27, + 0x1a, 0x27, 0x1d, + 0x1a, 0x2d, 0x59, + 0x1a, 0x2c, 0x2d, + 0x1a, 0x27, + 0x1a, 0x2d, + 0x1b, 0x25, 0x1e, + 0x1b, 0x1a, + 0x1b, 0x1e, + 0x1b, 0x28, + 0x1c, 0x1a, 0x27, 0x59, + 0x1c, 0x21, 0x1e, + 0x1c, 0x28, 0x26, + 0x1c, 0x24, + 0x1d, 0x1e, 0x2c, + 0x1d, 0x22, + 0x1d, 0x28, + 0x1e, 0x27, 0x59, + 0x1e, 0x2b, 0x59, + 0x1e, 0x1a, 0x2b, + 0x1e, 0x27, 0x2d, + 0x1e, 0x1d, 0x59, + 0x1e, 0x27, + 0x1e, 0x2b, + 0x1e, 0x2f, + 0x1f, 0x28, 0x2b, + 0x1f, 0x2b, 0x28, + 0x20, 0x22, 0x2f, 0x1e, 0x59, + 0x20, 0x1e, 0x2d, + 0x20, 0x28, + 0x21, 0x1a, 0x2f, 0x1e, + 0x21, 0x1a, 0x2c, + 0x21, 0x1e, 0x2b, + 0x21, 0x22, + 0x21, 0x1a, + 0x22, 0x20, 0x21, 0x2d, 0x59, + 0x22, 0x27, 0x20, 0x59, + 0x22, 0x27, + 0x22, 0x2c, + 0x22, 0x2d, + 0x23, 0x2e, 0x2c, 0x2d, + 0x24, 0x27, 0x28, 0x30, + 0x25, 0x32, 0x59, + 0x25, 0x1a, + 0x25, 0x28, + 0x26, 0x1a, 0x27, + 0x26, 0x1a, + 0x26, 0x1e, + 0x26, 0x2e, + 0x27, 0x51, 0x2d, 0x59, + 0x27, 0x28, 0x27, + 0x27, 0x28, 0x2d, + 0x28, 0x29, 0x1e, 0x27, + 0x28, 0x2e, 0x27, 0x1d, + 0x28, 0x2e, 0x2d, 0x59, + 0x28, 0x1f, + 0x28, 0x27, + 0x28, 0x2b, + 0x29, 0x1e, 0x2b, + 0x29, 0x25, 0x1e, + 0x29, 0x28, 0x30, + 0x29, 0x2b, 0x28, + 0x2b, 0x1e, 0x59, + 0x2b, 0x1e, + 0x2c, 0x28, 0x26, 0x1e, + 0x2c, 0x1e, + 0x2c, 0x21, + 0x2c, 0x28, + 0x2c, 0x2d, + 0x2d, 0x1e, 0x2b, 0x59, + 0x2d, 0x21, 0x22, 0x27, + 0x2d, 0x1e, 0x2b, + 0x2d, 0x21, 0x1a, + 0x2d, 0x21, 0x1e, + 0x2d, 0x21, 0x22, + 0x2d, 0x28, + 0x2d, 0x2b, + 0x2e, 0x29, + 0x2f, 0x1e, 0x2b, + 0x30, 0x22, 0x2d, 0x21, + 0x30, 0x1a, + 0x30, 0x1e, + 0x30, 0x21, + 0x30, 0x22, + 0x32, 0x28, 0x2e, + 0x7, 0x1e, 0x2b, + 0x13, 0x21, 0x1a, + 0x13, 0x21, 0x1e, + 0x13, 0x21, 0x22, + 0x18, 0x28, 0x2e, +}; +static const uint16 kTextDictionary_Idx[] = { + 0, 4, 7, 9, 12, 16, 20, 24, 27, 30, 33, 36, 38, 40, 43, 45, 47, 49, 53, 56, 59, 61, 64, 66, 68, 71, 74, 77, 80, 83, 85, 87, 89, 92, 95, 100, 103, 105, 109, 112, 115, 117, 119, 124, 128, 130, 132, 134, 138, 142, 145, 147, 149, 152, 154, 156, 158, 162, 165, 168, 172, 176, 180, 182, 184, 186, 189, 192, 195, 198, 201, 203, 207, 209, 211, 213, 215, 219, 223, 226, 229, 232, 235, 237, 239, 241, 244, 248, 250, 252, 254, 256, 259, 262, 265, 268, 271, 274 +}; +static const int8 kText_InitializationData[32] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0x39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1c, 4, 0, 0, 0, 0, 0}; +static const uint16 kText_BorderTiles[9] = {0x28f3, 0x28f4, 0x68f3, 0x28c8, 0x387f, 0x68c8, 0xa8f3, 0xa8f4, 0xe8f3}; +static const uint8 kText_CommandLengths[25] = { + 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 1, 1, 1, 1, 1, +}; +static const uint8 kVWF_RenderCharacter_setMasks[8] = {0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1}; +static const uint16 kVWF_RenderCharacter_renderPos[3] = {0, 0x2a0, 0x540}; +static const uint16 kVWF_RenderCharacter_linePositions[3] = {0, 0x40, 0x80}; +static const uint8 kVWF_RenderCharacter_widths[99] = { + 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 7, 6, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 3, 5, 6, 3, 7, 6, 6, 6, 6, 5, 6, 6, 6, 7, 7, 7, 7, 6, 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 3, 7, + 6, 4, 4, 6, 8, 6, 6, 6, 6, 6, 8, 8, 8, 7, 7, 7, 7, 4, 8, 8, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 8, + 8, 8, 4, +}; +static const uint16 kVWF_RowPositions[3] = {0, 2, 4}; +static const uint16 kVWF_LinePositions[3] = {0, 40, 80}; +static const uint16 kVWF_Command7B[4] = {0x24b8, 0x24ba, 0x24bc, 0x24be}; +static const uint16 kVWF_Command7C[8] = {0x24b8, 0x24ba, 0x24bc, 0x24be, 0x24b8, 0x24ba, 0x24bc, 0x24be}; +static const uint16 kText_WaitDurations[16] = {31, 63, 94, 125, 156, 188, 219, 250, 281, 313, 344, 375, 406, 438, 469, 500}; +static PlayerHandlerFunc *const kText_Render[] = { + &RenderText_Draw_Border, + &RenderText_Draw_BorderIncremental, + &RenderText_Draw_CharacterTilemap, + &RenderText_Draw_MessageCharacters, + &RenderText_Draw_Finish, +}; +static PlayerHandlerFunc *const kMessaging_Text[] = { + &Text_Initialize, + &Text_Render, + &RenderText_PostDeathSaveOptions, +}; +static const uint16 kOverworldMapPaletteData[256] = { + 0, 0x94b, 0x1563, 0x1203, 0x2995, 0x5bdf, 0x2191, 0x2e37, 0x7c1f, 0x6f37, 0x7359, 0x777a, 0x7b9b, 0x7fbd, 0, 0, + 0, 0x100, 0, 0, 0x7b9b, 0x11b6, 0x1a9b, 0x5fff, 0x2995, 0x6e94, 0x76d6, 0x7f39, 0x7f7b, 0x7fbd, 0, 0, + 0, 0x100, 0x1d74, 0x67f9, 0x1ee9, 0x338e, 0x6144, 0x7e6a, 0xa44, 0x7c1f, 0x6144, 0x22eb, 0x3dca, 0x5ed2, 0x7fda, 0x316a, + 0, 0x100, 0x14cc, 0x1910, 0x2995, 0x3e3a, 0x1963, 0x15e3, 0x25f5, 0x2e37, 0x15e3, 0x22eb, 0x6144, 0x7e33, 0x5d99, 0x771d, + 0, 0xcec, 0x22eb, 0x2fb1, 0x1d70, 0x2e37, 0x25f5, 0x3e77, 0x473a, 0x6144, 0x7e6a, 0x15e3, 0x2e0b, 0x5354, 0x7fff, 0x16a6, + 0, 0x100, 0x15c5, 0x16a6, 0x1ee9, 0x2f4d, 0x25f5, 0x3e77, 0x473a, 0x5354, 0x15e3, 0x22eb, 0x2918, 0x4a1f, 0x3f7f, 0x7c1f, + 0, 0x100, 0x1563, 0x1203, 0x1ee9, 0x2fb0, 0x1d70, 0x2e37, 0x473a, 0x6144, 0x15e3, 0x22eb, 0x1d70, 0x2e37, 0x4f3f, 0x7fbd, + 0, 0, 0, 0, 0, 0, 0, 0x25f5, 0x316a, 0x5ed2, 0x7fff, 0x15e3, 0x473a, 0x2918, 0x771d, 0, + 0, 0x18c6, 0x948, 0x118a, 0x25cf, 0x57bf, 0x1971, 0x2a18, 0x7c1f, 0x52d8, 0x5af9, 0x5f1a, 0x633b, 0x6b5c, 0, 0, + 0, 0x18c6, 5, 0x45fc, 0x633b, 0x1dce, 0x3694, 0x4718, 0x25cf, 0x1d40, 0x34ea, 0x616f, 0x771b, 0x26d6, 0x2b18, 0x2f5a, + 0, 0x18c6, 0x2571, 0x63da, 0x2a32, 0x3a94, 0x1d40, 0x2580, 0x7c1f, 0x7c1f, 0xcc0, 0x1ecc, 0x3135, 0x1dce, 0x4718, 0x3694, + 0, 0x18c6, 0x14e7, 0x216c, 0x25d0, 0x3a75, 0x2169, 0x2e0e, 0x21d6, 0x2a18, 0x1971, 0x2a32, 0x1d40, 0x2580, 0x597a, 0x72fe, + 0, 0x18c6, 0x2a32, 0x3a94, 0x2171, 0x3238, 0x29f6, 0x4278, 0x4edb, 0x1d40, 0x35cd, 0x15ab, 0x198e, 0x3254, 0x731f, 0x1ed4, + 0, 0x18c6, 0x16a, 0x21ce, 0x2a32, 0x3a94, 0x29f6, 0x4278, 0x4edb, 0x1d40, 0x1971, 0x2a32, 0x496c, 0x5a10, 0x3b5f, 0x7c1f, + 0, 0x18c6, 0x948, 0x118a, 0x222e, 0x32f2, 0x1951, 0x2a18, 0x431b, 0x1d40, 0x1971, 0x2a32, 0x21d4, 0x2a18, 0x4b1f, 0x7b9d, + 0, 0x7c1f, 0x7c1f, 0x7c1f, 0x7c1f, 0x2e31, 0xe4, 0x2169, 0x2e0e, 0x42f1, 0x7c1f, 0x7c1f, 0x7c1f, 0x4a1d, 0x4e3f, 0x5a5f, +}; +static const uint8 kOverworldMap_tab1[333] = { + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, + 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd8, 0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0, 0xcf, 0xce, + 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0, 0xbf, 0xbe, 0xbd, + 0xbc, 0xbb, 0xba, 0xb9, 0xb8, 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0, 0xaf, 0xae, 0xad, + 0xac, 0xab, 0xaa, 0xa9, 0xa8, 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0, 0x9f, 0x9e, 0x9d, + 0x9c, 0x9b, 0x9b, 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 0x8f, 0x8e, + 0x8d, 0x8c, 0x8b, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x81, 0x80, + 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x72, + 0x71, 0x70, 0x6f, 0x6e, 0x6d, 0x6c, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0x67, 0x67, 0x66, 0x65, 0x64, + 0x63, 0x62, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x59, 0x58, 0x57, + 0x56, 0x55, 0x55, 0x54, 0x53, 0x52, 0x51, 0x51, 0x50, 0x4f, 0x4e, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, + 0x4a, 0x49, 0x48, 0x47, 0x47, 0x46, 0x45, 0x44, 0x44, 0x43, 0x42, 0x41, 0x41, 0x40, 0x3f, 0x3e, + 0x3e, 0x3d, 0x3c, 0x3c, 0x3b, 0x3a, 0x39, 0x39, 0x38, 0x37, 0x36, 0x36, 0x35, 0x34, 0x34, 0x33, + 0x32, 0x32, 0x31, 0x30, 0x2f, 0x2f, 0x2e, 0x2d, 0x2d, 0x2c, 0x2b, 0x2b, 0x2a, 0x29, 0x29, 0x28, + 0x27, 0x27, 0x26, 0x25, 0x25, 0x24, 0x23, 0x23, 0x22, 0x21, 0x21, 0x20, 0x1f, 0x1f, 0x1e, 0x1d, + 0x1d, 0x1c, 0x1c, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x17, 0x16, 0x15, 0x15, 0x14, 0x14, + 0x13, 0x12, 0x12, 0x11, 0x10, 0x10, 0xf, 0xf, 0xe, 0xe, 0xd, 0xc, 0xc, 0xb, 0xb, 0xa, + 9, 9, 8, 8, 7, 7, 6, 5, 5, 4, 4, 3, 3, 2, 1, 1, + 0, 0, 0, 0, 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0xfb, 0xfa, 0xf9, 0xf9, 0xf8, + 0xf7, 0xf7, 0xf6, 0xf5, 0xf4, 0xf4, 0xf3, 0xf2, 0xf2, 0xf1, 0xf0, 0xef, 0xee, 0xee, 0xed, 0xec, + 0xeb, 0xea, 0xe9, 0xe8, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0, +}; +static const uint8 kOverworldMapData[7] = {0x79, 0x6e, 0x6f, 0x6d, 0x7c, 0x6c, 0x7f}; +static const uint8 kBirdTravel_tab1[8] = {0x7f, 0x79, 0x6c, 0x6d, 0x6e, 0x6f, 0x7c, 0x7d}; +static const uint8 kBirdTravel_x_lo[8] = {0x80, 0xcf, 0x10, 0xb8, 0x30, 0x70, 0x70, 0xf0}; +static const uint8 kBirdTravel_x_hi[8] = {6, 0xc, 2, 8, 0xf, 0, 7, 0xe}; +static const uint8 kBirdTravel_y_lo[8] = {0x5b, 0x98, 0xc0, 0x20, 0x50, 0xb0, 0x30, 0x80}; +static const uint8 kBirdTravel_y_hi[8] = {3, 5, 7, 0xb, 0xb, 0xf, 0xf, 0xf}; +static const uint8 kPendantBitMask[3] = {4, 1, 2}; +static const uint8 kCrystalBitMask[7] = {2, 0x40, 8, 0x20, 1, 4, 0x10}; +static const uint16 kOwMapCrystal0_x[9] = {0x7ff, 0x2c0, 0xd00, 0xf31, 0x6d, 0x7e0, 0xf40, 0xf40, 0x8dc}; +static const uint16 kOwMapCrystal0_y[9] = {0x730, 0x6a0, 0x710, 0x620, 0x70, 0x640, 0x620, 0x620, 0x30}; +static const uint16 kOwMapCrystal1_x[9] = {0xff00, 0xff00, 0xff00, 0x8d0, 0xff00, 0xff00, 0xff00, 0x82, 0xff00}; +static const uint16 kOwMapCrystal1_y[9] = {0xff00, 0xff00, 0xff00, 0x80, 0xff00, 0xff00, 0xff00, 0xb0, 0xff00}; +static const uint16 kOwMapCrystal2_x[9] = {0xff00, 0xff00, 0xff00, 0x108, 0xff00, 0xff00, 0xff00, 0xf11, 0xff00}; +static const uint16 kOwMapCrystal2_y[9] = {0xff00, 0xff00, 0xff00, 0xd70, 0xff00, 0xff00, 0xff00, 0x103, 0xff00}; +static const uint16 kOwMapCrystal3_x[9] = {0xff00, 0xff00, 0xff00, 0x6d, 0xff00, 0xff00, 0xff00, 0x1d0, 0xff00}; +static const uint16 kOwMapCrystal3_y[9] = {0xff00, 0xff00, 0xff00, 0x70, 0xff00, 0xff00, 0xff00, 0x780, 0xff00}; +static const uint16 kOwMapCrystal4_x[9] = {0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0x100, 0xff00}; +static const uint16 kOwMapCrystal4_y[9] = {0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xca0, 0xff00}; +static const uint16 kOwMapCrystal5_x[9] = {0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xca0, 0xff00}; +static const uint16 kOwMapCrystal5_y[9] = {0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xda0, 0xff00}; +static const uint16 kOwMapCrystal6_x[9] = {0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0x759, 0xff00}; +static const uint16 kOwMapCrystal6_y[9] = {0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xff00, 0xed0, 0xff00}; +static const uint16 kOwMapCrystal0_tab[9] = {0, 0, 0, 0x6038, 0x6234, 0x6632, 0x6434, 0x6434, 0x6632}; +static const uint16 kOwMapCrystal1_tab[9] = {0, 0, 0, 0x6032, 0, 0, 0, 0x6434, 0}; +static const uint16 kOwMapCrystal2_tab[9] = {0, 0, 0, 0x6034, 0, 0, 0, 0x6434, 0}; +static const uint16 kOwMapCrystal3_tab[9] = {0, 0, 0, 0x6234, 0, 0, 0, 0x6434, 0}; +static const uint16 kOwMapCrystal4_tab[9] = {0, 0, 0, 0, 0, 0, 0, 0x6434, 0}; +static const uint16 kOwMapCrystal5_tab[9] = {0, 0, 0, 0, 0, 0, 0, 0x6434, 0}; +static const uint16 kOwMapCrystal6_tab[9] = {0, 0, 0, 0, 0, 0, 0, 0x6434, 0}; +static const uint8 kOwMap_tab2[4] = {0x68, 0x69, 0x78, 0x69}; +static const uint8 kOverworldMap_Table4[4] = {0x34, 0x74, 0xf4, 0xb4}; +static const uint8 kOverworldMap_Timer[2] = {33, 12}; +static const int16 kOverworldMap_Table3[8] = {0, 0, 1, 2, -1, -2, 1, 2}; +static const int16 kOverworldMap_Table2[6] = {0, 0, 224, 480, -72, -224}; +static PlayerHandlerFunc *const kMessagingSubmodules[12] = { + &Module_Messaging_0, + &Hud_Module_Run, + &RenderText, + &Module0E_03_DungeonMap, + &Module0E_04_RedPotion, + &Module0E_05_DesertPrayer, + &Module_Messaging_6, + &Messaging_OverworldMap, + &Module0E_08_GreenPotion, + &Module0E_09_BluePotion, + &Module0E_0A_FluteMenu, + &Module0E_0B_SaveMenu, +}; +static const uint8 kDeath_AnimCtr0[15] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 5}; +static const uint8 kDeath_AnimCtr1[15] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 0x62}; +static const uint8 kDeath_SprFlags[2] = {0x20, 0x10}; +static const uint8 kDeath_SprChar0[2] = {0xea, 0xec}; +static const uint8 kDeath_SprY0[3] = {0x7f, 0x8f, 0x9f}; +const uint8 kHealthAfterDeath[21] = { + 0x18, 0x18, 0x18, 0x18, 0x18, 0x20, 0x20, 0x28, 0x28, 0x30, 0x30, 0x38, 0x38, 0x38, 0x40, 0x40, + 0x40, 0x48, 0x48, 0x48, 0x50, +}; +static PlayerHandlerFunc *const kModule_Death[16] = { + &GameOver_AdvanceImmediately, + &Death_Func1, + &GameOver_DelayBeforeIris, + &GameOver_IrisWipe, + &Death_Func4, + &GameOver_SplatAndFade, + &Death_Func6, + &Animate_GAMEOVER_Letters_bounce, + &GameOver_Finalize_GAMEOVR, + &GameOver_SaveAndOrContinue, + &GameOver_InitializeRevivalFairy, + &RevivalFairy_Main_bounce, + &GameOver_RiseALittle, + &GameOver_Restore0D, + &GameOver_Restore0E, + &GameOver_ResituateLink, +}; +static const uint8 kLocationMenuStartPos[3] = {0, 1, 6}; +static void RunInterface(); +const uint8 *GetDungmapFloorLayout() { + return kDungMap_FloorLayout[cur_palace_index_x2 >> 1]; +} + +uint8 GetOtherDungmapInfo(int count) { + return kDungMap_Tiles[cur_palace_index_x2 >> 1][count]; +} + +void DungMap_4() { + BG2VOFS_copy2 += dungmap_var4; + dungmap_var5 -= dungmap_var4; + if (!--byte_7E0205) + overworld_map_state--; +} + +const uint8 *GetCurrentTextPtr() { + return kDialogueText + kDialogueOffs[dialogue_message_index]; +} + +void Module_Messaging_6() { + assert(0); +} + +void OverworldMap_SetupHdma() { + static const uint32 kOverworldMap_TableLow[2] = {0xabdcf, 0xabdd6}; + uint32 a = kOverworldMap_TableLow[overworld_map_flags]; + HdmaSetup(a, a, 0x42, (uint8)M7A, (uint8)M7D, 10); +} + +const uint8 *GetLightOverworldTilemap() { + return kLightOverworldTilemap; +} + +void SaveGameFile() { // 80894a + int offs = ((srm_var1 >> 1) - 1) * 0x500; + memcpy(g_zenv.sram + offs, save_dung_info, 0x500); + memcpy(g_zenv.sram + offs + 0xf00, save_dung_info, 0x500); + uint16 t = 0x5a5a; + for (int i = 0; i < 0x4fe; i += 2) + t -= *(uint16 *)((char *)save_dung_info + i); + word_7EF4FE = t; + WORD(g_zenv.sram[offs + 0x4fe]) = t; + WORD(g_zenv.sram[offs + 0x4fe + 0xf00]) = t; +} + +void TransferMode7Characters() { // 80e399 + uint16 *dst = g_zenv.vram; + const uint8 *src = kOverworldMapGfx; + for (int i = 0; i != 0x4000; i++) + HIBYTE(dst[i]) = src[i]; +} + +void Module0E_Interface() { // 80f800 + bool skip_run = false; + if (player_is_indoors) { + if (submodule_index == 3) { + skip_run = (overworld_map_state != 0 && overworld_map_state != 7); + } else { + Dungeon_PushBlock_Handler(); + } + } else { + skip_run = ((submodule_index == 7 || submodule_index == 10) && overworld_map_state); + } + if (!skip_run) { + Sprite_Main(); + LinkOam_Main(); + if (!player_is_indoors) + OverworldOverlay_HandleRain(); + Hud_RefillLogic(); + if (submodule_index != 2) + OrientLampLightCone(); + } + RunInterface(); + BG2HOFS_copy = BG2HOFS_copy2 + bg1_x_offset; + BG2VOFS_copy = BG2VOFS_copy2 + bg1_y_offset; + BG1HOFS_copy = BG1HOFS_copy2 + bg1_x_offset; + BG1VOFS_copy = BG1VOFS_copy2 + bg1_y_offset; +} + +void Module_Messaging_0() { // 80f875 + assert(0); +} + +static void RunInterface() { // 80f89a + kMessagingSubmodules[submodule_index](); +} + +void Module0E_05_DesertPrayer() { // 80f8b1 + switch (subsubmodule_index) { + case 0: ResetTransitionPropsAndAdvance_ResetInterface(); break; + case 1: ApplyPaletteFilter_bounce(); break; + case 2: + DesertPrayer_InitializeIrisHDMA(); + BYTE(palette_filter_countdown) = mosaic_target_level - 1; + mosaic_target_level = 0; + BYTE(darkening_or_lightening_screen) = 2; + break; + case 3: + ApplyPaletteFilter_bounce(); + // fall through + case 4: + DesertPrayer_BuildIrisHDMATable(); + break; + } +} + +void Module0E_04_RedPotion() { // 80f8fb + if (Hud_RefillHealth()) { + button_mask_b_y &= ~0x40; + flag_update_hud_in_nmi++; + submodule_index = 0; + main_module_index = saved_module_for_menu; + } +} + +void Module0E_08_GreenPotion() { // 80f911 + if (Hud_RefillMagicPower()) { + button_mask_b_y &= ~0x40; + flag_update_hud_in_nmi++; + submodule_index = 0; + main_module_index = saved_module_for_menu; + } +} + +void Module0E_09_BluePotion() { // 80f918 + if (Hud_RefillHealth()) + submodule_index = 8; + if (Hud_RefillMagicPower()) + submodule_index = 4; +} + +void Module0E_0B_SaveMenu() { // 80f9fa + // This is the continue / save and quit menu + if (!player_is_indoors) + Overworld_DwDeathMountainPaletteAnimation(); + RenderText(); + flag_update_hud_in_nmi = 0; + nmi_disable_core_updates = 0; + if (subsubmodule_index < 3) + subsubmodule_index++; + else + nmi_load_bg_from_vram = 0; + if (!submodule_index) { + subsubmodule_index = 0; + nmi_load_bg_from_vram = 1; + if (choice_in_multiselect_box) { + sound_effect_ambient = 15; + main_module_index = 23; + submodule_index = 1; + index_of_changable_dungeon_objs[0] = 0; + index_of_changable_dungeon_objs[1] = 0; + } else { + choice_in_multiselect_box = choice_in_multiselect_box_bak; + } + } +} + +void Module1B_SpawnSelect() { // 828586 + RenderText(); + if (submodule_index) + return; + nmi_load_bg_from_vram = 0; + EnableForceBlank(); + EraseTileMaps_normal(); + uint8 bak = which_starting_point; + which_starting_point = kLocationMenuStartPos[choice_in_multiselect_box]; + subsubmodule_index = 0; + LoadDungeonRoomRebuildHUD(); + which_starting_point = bak; +} + +void CleanUpAndPrepDesertPrayerHDMA() { // 82c7b8 + HdmaSetup(0, 0x2c80c, 0x41, 0, (uint8)WH0, 0); + + W12SEL_copy = 0x33; + W34SEL_copy = 3; + WOBJSEL_copy = 0x33; + TMW_copy = TM_copy; + TSW_copy = TS_copy; + HDMAEN_copy = 0x80; + memset(mode7_hdma_table, 0, 0x1e0); +} + +void DesertPrayer_InitializeIrisHDMA() { // 87ea06 + CleanUpAndPrepDesertPrayerHDMA(); + spotlight_var1 = 0x26; + BYTE(spotlight_var2) = 0; + DesertPrayer_BuildIrisHDMATable(); + subsubmodule_index++; +} + +void DesertPrayer_BuildIrisHDMATable() { // 87ea27 + uint16 r14 = link_y_coord - BG2VOFS_copy2 + 12; + spotlight_y_lower = r14 - spotlight_var1; + uint16 r4 = sign16(spotlight_y_lower) ? spotlight_y_lower : 0; + uint16 k; + spotlight_y_upper = spotlight_y_lower + spotlight_var1 * 2; + spotlight_var3 = link_x_coord - BG2HOFS_copy2 + 8; + spotlight_var4 = 1; + do { + uint16 r0 = 0x100, r2 = 0x100; + if (!(sign16(spotlight_y_lower) || (r4 >= spotlight_y_lower && r4 < spotlight_y_upper))) { + k = (r4 - 1); + } else if (spotlight_var1 < spotlight_var4) { + spotlight_var4 = 1; + spotlight_y_lower = 0; + r4 = spotlight_y_upper; + if (r4 >= 225) + break; + k = (r4 - 1); + } else { + Pair16U pair = DesertHDMA_CalculateIrisShapeLine(); + if (pair.a == 0) { + spotlight_y_lower = 0; + } else { + r2 = spotlight_var3 + pair.b; + r0 = spotlight_var3 - pair.b; + } + k = (r14 - BYTE(spotlight_var4) - 1); + } + uint8 t6 = (r0 < 256) ? r0 : (r0 < 512) ? 255 : 0; + uint8 t7 = (r2 < 256) ? r2 : 255; + uint16 r6 = t7 << 8 | t6; + if (k < 224) + mode7_hdma_table[k] = (r6 == 0xffff) ? 0xff : r6; + if (sign16(spotlight_y_lower) || (r4 >= spotlight_y_lower && r4 < spotlight_y_upper)) { + k = BYTE(spotlight_var4) - 2 + r14; + if (k < 224) + mode7_hdma_table[k] = (r6 == 0xffff) ? 0xff : r6; + spotlight_var4++; + } + r4++; + } while (sign16(r4) || r4 < 225); + + if (subsubmodule_index != 4) + return; + if (BYTE(spotlight_var2) != 1 && (filtered_joypad_H | filtered_joypad_L) & 0xc0) { + BYTE(spotlight_var2) = 1; + BYTE(spotlight_var1) >>= 1; + } + if (BYTE(spotlight_var2) && (BYTE(spotlight_var1) += 8) >= 0xc0) { + byte_7E02F0 ^= 1; + music_control = 0xf3; + sound_effect_ambient = 0; + flag_unk1 = 0; + some_animation_timer_steps = 0; + button_mask_b_y = 0; + link_state_bits = 0; + link_cant_change_direction &= ~1; + subsubmodule_index = 0; + submodule_index = 0; + main_module_index = saved_module_for_menu; + TMW_copy = 0; + TSW_copy = 0; + W12SEL_copy = 0; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + IrisSpotlight_ResetTable(); + } else { + static const uint8 kPrayingScene_Delays[5] = {22, 22, 22, 64, 1}; + if (sign8(--link_delay_timer_spin_attack)) { + int i = some_animation_timer_steps + 1; + if (i != 4) + some_animation_timer_steps = i; + link_delay_timer_spin_attack = kPrayingScene_Delays[i]; + } + } +} + +Pair16U DesertHDMA_CalculateIrisShapeLine() { // 87ecdc + static const uint8 kPrayingScene_Tab1[129] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, + 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf9, 0xf8, 0xf8, + 0xf7, 0xf7, 0xf6, 0xf6, 0xf5, 0xf5, 0xf4, 0xf3, 0xf3, 0xf2, 0xf1, 0xf1, 0xf0, 0xef, 0xee, 0xee, + 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xdf, 0xde, + 0xdd, 0xdc, 0xdb, 0xda, 0xd8, 0xd7, 0xd6, 0xd5, 0xd3, 0xd2, 0xd0, 0xcf, 0xcd, 0xcc, 0xca, 0xc9, + 0xc7, 0xc6, 0xc4, 0xc2, 0xc1, 0xbf, 0xbd, 0xbb, 0xb9, 0xb7, 0xb6, 0xb4, 0xb1, 0xaf, 0xad, 0xab, + 0xa9, 0xa7, 0xa4, 0xa2, 0x9f, 0x9d, 0x9a, 0x97, 0x95, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x82, 0x7f, + 0x7b, 0x78, 0x74, 0x70, 0x6c, 0x67, 0x63, 0x5e, 0x59, 0x53, 0x4d, 0x46, 0x3f, 0x37, 0x2d, 0x1f, + 0, + }; + static const uint8 kPrayingScene_Tab0[129] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, + 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf1, 0xf0, 0xee, 0xed, 0xeb, 0xe9, 0xe8, 0xe6, 0xe4, 0xe2, 0xdf, + 0xdd, 0xdb, 0xd8, 0xd6, 0xd3, 0xd0, 0xcd, 0xca, 0xc7, 0xc4, 0xc1, 0xbd, 0xb9, 0xb6, 0xb1, 0xad, + 0xa9, 0xa4, 0x9f, 0x9a, 0x95, 0x8f, 0x89, 0x82, 0x7b, 0x74, 0x6c, 0x63, 0x59, 0x4d, 0x3f, 0x2d, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + uint8 t = snes_divide(BYTE(spotlight_var4) << 8, BYTE(spotlight_var1)) >> 1; + uint8 r6 = BYTE(spotlight_var2) ? kPrayingScene_Tab1[t] : kPrayingScene_Tab0[t]; + uint16 r8 = r6 * BYTE(spotlight_var1) >> 8; + if (BYTE(spotlight_var2)) + r8 <<= 1; + Pair16U ret = { r6, r8 }; + return ret; +} + +void Animate_GAMEOVER_Letters() { // 88f4ca + switch (ancilla_type[0]) { + case 0: + submodule_index++; + break; + case 1: + GameOverText_SweepLeft(); + break; + case 2: + GameOverText_UnfurlRight(); + break; + case 3: + GameOverText_Draw(); + break; + } +} + +void GameOverText_SweepLeft() { // 88f4f6 + static const uint8 kGameOverText_Tab1[8] = {0x40, 0x50, 0x60, 0x70, 0x88, 0x98, 0xa8, 0x40}; + + int k = flag_for_boomerang_in_place; + cur_object_index = k; + ancilla_x_vel[k] = 0x80; + Ancilla_MoveX(k); + if (Ancilla_GetX(k) < kGameOverText_Tab1[k]) { + ancilla_x_lo[k] = kGameOverText_Tab1[k]; + flag_for_boomerang_in_place = ++k; + if (k == 8) { + flag_for_boomerang_in_place = 7; + ancilla_type[0]++; + hookshot_effect_index = 0; + sound_effect_2 = 38; + goto draw; + } + } + if (k == 7) { + int j = 6; + while (j != hookshot_effect_index) + ancilla_x_lo[j--] = ancilla_x_lo[k]; + if (Ancilla_GetX(k) < kGameOverText_Tab1[hookshot_effect_index]) + hookshot_effect_index--; + } +draw: + GameOverText_Draw(); +} + +void GameOverText_UnfurlRight() { // 88f56d + static const uint8 kGameOverText_Tab2[8] = {0x58, 0x60, 0x68, 0x70, 0x88, 0x90, 0x98, 0xa0}; + + int k = flag_for_boomerang_in_place, end; + cur_object_index = k; + ancilla_x_vel[k] = 0x60; + Ancilla_MoveX(k); + int j = hookshot_effect_index; + if (ancilla_x_lo[k] >= kGameOverText_Tab2[j]) { + ancilla_x_lo[j] = kGameOverText_Tab2[j]; + if (++hookshot_effect_index == 8) { + submodule_index++; + ancilla_type[0]++; + goto draw; + } + } + end = hookshot_effect_index - 1; + k = flag_for_boomerang_in_place; + j = k; + do { + ancilla_x_lo[j] = ancilla_x_lo[k]; + } while (--j != end); +draw: + GameOverText_Draw(); +} + +void Module12_GameOver() { // 89f290 + kModule_Death[submodule_index](); + if (submodule_index != 9) + LinkOam_Main(); +} + +void GameOver_AdvanceImmediately() { // 89f2a2 + submodule_index++; + Death_Func1(); +} + +void Death_Func1() { // 89f2a4 + music_unk1_death = music_unk1; + sound_effect_ambient_last_death = sound_effect_ambient_last; + music_control = 241; + sound_effect_ambient = 5; + overworld_map_state = 5; + byte_7E03F3 = 0; + byte_7E0322 = 0; + link_cape_mode = 0; + mapbak_bg1_x_offset = palette_filter_countdown; + mapbak_bg1_y_offset = darkening_or_lightening_screen; + memcpy(mapbak_palette, aux_palette_buffer, 256); + memset(aux_palette_buffer + 32, 0, 192); + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + bg1_x_offset = 0; + bg1_y_offset = 0; + mapbak_CGWSEL = WORD(CGWSEL_copy); + g_ram[0xc8] = 32; + hud_floor_changed_timer = 0; + Hud_FloorIndicator(); + flag_update_hud_in_nmi++; + sound_effect_ambient = 5; + submodule_index++; +} + +void GameOver_DelayBeforeIris() { // 89f33b + if (--g_ram[0xc8]) + return; + Death_InitializeGameOverLetters(); + IrisSpotlight_close(); + WOBJSEL_copy = 48; + W34SEL_copy = 0; + submodule_index++; +} + +void GameOver_IrisWipe() { // 89f350 + PaletteFilter_RestoreBGSubstractiveStrict(); + main_palette_buffer[0] = main_palette_buffer[32]; + uint8 bak = main_module_index; + IrisSpotlight_ConfigureTable(); + main_module_index = bak; + if (submodule_index) + return; + for (int i = 0; i < 16; i++) { + main_palette_buffer[0x20 + i] = 0x18; + main_palette_buffer[0x30 + i] = 0x18; + main_palette_buffer[0x40 + i] = 0x18; + main_palette_buffer[0x50 + i] = 0x18; + main_palette_buffer[0x60 + i] = 0x18; + main_palette_buffer[0x70 + i] = 0x18; + } + main_palette_buffer[0] = main_palette_buffer[32] = 0x18; + + IrisSpotlight_ResetTable(); + COLDATA_copy0 = 32; + COLDATA_copy1 = 64; + COLDATA_copy2 = 128; + W12SEL_copy = 0; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + submodule_index = 4; + flag_update_cgram_in_nmi++; + INIDISP_copy = 15; + TM_copy = 20; + TS_copy = 0; + CGADSUB_copy = 32; + g_ram[0xc8] = 64; + BYTE(palette_filter_countdown) = 0; + BYTE(darkening_or_lightening_screen) = 0; + Death_PrepFaint(); +} + +void GameOver_SplatAndFade() { // 89f3de + if (g_ram[0xc8]) { + g_ram[0xc8]--; + return; + } + PaletteFilter_RestoreBGSubstractiveStrict(); + main_palette_buffer[0] = main_palette_buffer[32]; + if (BYTE(darkening_or_lightening_screen) != 0xff) + return; + mosaic_level = 0; + mosaic_inc_or_dec = 0; + MOSAIC_copy = 3; + + for (int i = 0; i != 4; i++) { + if (link_bottle_info[i] == 6) { + link_bottle_info[i] = 2; + g_ram[0xc8] = 12; + load_chr_halfslot_even_odd = 15; + Graphics_LoadChrHalfSlot(); + load_chr_halfslot_even_odd = 0; + submodule_index = 10; + return; + } + } + index_of_changable_dungeon_objs[0] = 0; + index_of_changable_dungeon_objs[1] = 0; + nmi_subroutine_index = 22; + nmi_disable_core_updates = 22; + submodule_index++; +} + +void Death_Func6() { // 89f458 + g_ram[0xc8] = 12; + load_chr_halfslot_even_odd = 15; + Graphics_LoadChrHalfSlot(); + load_chr_halfslot_even_odd = 0; + palette_sp6 = 5; + overworld_palette_aux_or_main = 0x200; + Palette_Load_SpriteEnvironment_Dungeon(); + Palette_Load_SpriteMain(); + flag_update_cgram_in_nmi++; + submodule_index++; + Death_PlayerSwoon(); +} + +void Death_Func4() { // 89f47e + Death_PlayerSwoon(); +} + +void Animate_GAMEOVER_Letters_bounce() { // 89f483 + Animate_GAMEOVER_Letters(); +} + +void GameOver_Finalize_GAMEOVR() { // 89f488 + Animate_GAMEOVER_Letters(); + uint8 bak1 = main_module_index; + uint8 bak2 = submodule_index; + messaging_module = 2; + RenderText(); + submodule_index = bak2 + 1; + main_module_index = bak1; + g_ram[0xc8] = 2; + music_control = 11; +} + +void GameOver_SaveAndOrContinue() { // 89f4c1 + GameOver_AnimateChoiceFairy(); + if (ancilla_type) + Animate_GAMEOVER_Letters(); + + if (filtered_joypad_H & 0x20) + goto do_inc; + + if (!--g_ram[0xc8]) { + g_ram[0xc8] = 1; + if (joypad1H_last & 12) { + if (joypad1H_last & 4) { +do_inc: + if (++subsubmodule_index >= 3) + subsubmodule_index = 0; + } else { + if (sign8(--subsubmodule_index)) + subsubmodule_index = 2; + } + g_ram[0xc8] = 12; + sound_effect_2 = 32; + } + } + if (!((filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0)) + return; + sound_effect_1 = 44; + Death_Func15(); +} + +void Death_Func15() { // 89f50f + music_control = 0xf1; + if (player_is_indoors) + Dungeon_FlagRoomData_Quadrants(); + AdjustLinkBunnyStatus(); + if (sram_progress_indicator < 3) { + savegame_is_darkworld = 0; + if (!link_item_moon_pearl) + ForceNonbunnyStatus(); + } + if (dungeon_room_index == 0) + player_is_indoors = 0; + + ResetSomeThingsAfterDeath((uint8)dungeon_room_index); + if (savegame_tagalong == 6 || savegame_tagalong == 9 || savegame_tagalong == 10 || savegame_tagalong == 13) + savegame_tagalong = 0; + + death_var4 = link_health_current = kHealthAfterDeath[link_health_capacity >> 3]; + uint8 i = BYTE(cur_palace_index_x2); + if (i != 0xff) + link_keys_earned_per_dungeon[(i == 2 ? 0 : i) >> 1] = link_num_keys; + Sprite_ResetAll(); + if (death_var2 == 0xffff) + death_save_counter++; + death_var5++; + if (subsubmodule_index != 1) { + if (!player_is_indoors) + goto outdoors; + + if (savegame_tagalong != 1 && BYTE(cur_palace_index_x2) != 255) { + death_var4 = 0; + } else { + buffer_for_playing_songs = 0; + player_is_indoors = 0; + outdoors: + if (savegame_is_darkworld) + dungeon_room_index = 32; + } + + if (sram_progress_indicator) { + if (subsubmodule_index == 0) + SaveGameFile(); + main_module_index = 5; + submodule_index = 0; + nmi_load_bg_from_vram = 0; + } else { + uint8 slot = srm_var1; + int offs = kSrmOffsets[(slot >> 1) - 1]; + WORD(g_ram[0]) = offs; + death_var5 = 0; + CopySaveToWRAM(); + } + } else { + if (sram_progress_indicator) + SaveGameFile(); + TM_copy = 16; + player_is_indoors = 0; + Death_Func31(); + death_var4 = 0; + death_var5 = 0; + buffer_for_playing_songs = 0; + zelda_snes_dummy_write(NMITIMEN, 0); + zelda_snes_dummy_write(HDMAEN, 0); + BG1HOFS_copy2 = 0; + BG2HOFS_copy2 = 0; + BG3HOFS_copy2 = 0; + BG1VOFS_copy2 = 0; + BG2VOFS_copy2 = 0; + BG3VOFS_copy2 = 0; + BG1HOFS_copy = 0; + BG2HOFS_copy = 0; + BG1VOFS_copy = 0; + BG2VOFS_copy = 0; + memset(save_dung_info, 0, 256 * 5); + flag_which_music_type = 0; + LoadOverworldSongs(); + zelda_snes_dummy_write(NMITIMEN, 0x81); + } +} + +void GameOver_AnimateChoiceFairy() { // 89f67a + int spr = 0x14; + bytewise_extended_oam[spr] = 2; + oam_buf[spr].x = 0x34; + oam_buf[spr].y = kDeath_SprY0[subsubmodule_index]; + oam_buf[spr].charnum = kDeath_SprChar0[frame_counter >> 3 & 1]; + oam_buf[spr].flags = 0x78; +} + +void GameOver_InitializeRevivalFairy() { // 89f6a4 + ConfigureRevivalAncillae(); + link_hearts_filler = 56; + submodule_index += 1; + overworld_map_state = 0; +} + +void RevivalFairy_Main_bounce() { // 89f6b4 + RevivalFairy_Main(); +} + +void GameOver_RiseALittle() { // 89f6b9 + if (link_hearts_filler == 0) { + memcpy(aux_palette_buffer, mapbak_palette, 256); + memset(main_palette_buffer + 32, 0, 192); + main_palette_buffer[0] = 0; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 2; + WORD(CGWSEL_copy) = mapbak_CGWSEL; + submodule_index++; + } + RevivalFairy_Main(); + Hud_RefillLogic(); +} + +void GameOver_Restore0D() { // 89f71d + if (!is_doing_heart_animation) { + load_chr_halfslot_even_odd = 1; + Graphics_LoadChrHalfSlot(); + Dungeon_ApproachFixedColor_variable(overworld_fixed_color_plusminus); + submodule_index++; + } + RevivalFairy_Main(); + Hud_RefillLogic(); +} + +void GameOver_Restore0E() { // 89f735 + Graphics_LoadChrHalfSlot(); + TS_copy = mapbak_TS; + submodule_index++; +} + +void GameOver_ResituateLink() { // 89f742 + PaletteFilter_RestoreBGAdditiveStrict(); + main_palette_buffer[0] = main_palette_buffer[32]; + if (BYTE(palette_filter_countdown) != 32) + return; + if (!player_is_indoors) + Overworld_SetFixedColAndScroll(); + TS_copy = mapbak_TS; + main_module_index = saved_module_for_menu; + submodule_index = 0; + countdown_for_blink = 144; + music_control = music_unk1_death; + sound_effect_ambient = sound_effect_ambient_last_death; + palette_filter_countdown = mapbak_bg1_x_offset; + darkening_or_lightening_screen = mapbak_bg1_y_offset; +} + +void Module0E_0A_FluteMenu() { // 8ab730 + switch (overworld_map_state) { + case 0: + WorldMap_FadeOut(); + break; + case 1: + birdtravel_var1[0] = 0; + WorldMap_LoadLightWorldMap(); + break; + case 2: + WorldMap_LoadSpriteGFX(); + break; + case 3: + WorldMap_Brighten(); + break; + case 4: + g_ram[0xc8] = 0x10; + overworld_map_state++; + break; + case 5: + FluteMenu_HandleSelection(); + break; + case 6: + WorldMap_RestoreGraphics(); + break; + case 7: + FluteMenu_LoadSelectedScreen(); + break; + case 8: + Overworld_LoadOverlayAndMap(); + break; + case 9: + FluteMenu_FadeInAndQuack(); + break; + default: + assert(0); + } +} + +void FluteMenu_HandleSelection() { // 8ab78b + PointU8 pt; + + if (g_ram[0xc8] == 0) { + if ((joypad1L_last | joypad1H_last) & 0xc0) { + overworld_map_state++; + return; + } + } else { + g_ram[0xc8]--; + } + if (filtered_joypad_H & 10) { + birdtravel_var1[0]--; + sound_effect_2 = 32; + } + if (filtered_joypad_H & 5) { + birdtravel_var1[0]++; + sound_effect_2 = 32; + } + birdtravel_var1[0] = birdtravel_var1[0] & 7; + if (frame_counter & 0x10 && WorldMap_CalculateOamCoordinates(&pt)) + WorldMap_HandleSpriteBlink(16, 2, 0x3e, 0, pt.x - 4, pt.y - 4); + + uint16 ybak = link_y_coord_spexit; + uint16 xbak = link_x_coord_spexit; + for (int i = 7; i >= 0; i--) { + bird_travel_x_lo[i] = kBirdTravel_x_lo[i]; + bird_travel_x_hi[i] = kBirdTravel_x_hi[i]; + link_x_coord_spexit = kBirdTravel_x_hi[i] << 8 | kBirdTravel_x_lo[i]; + + bird_travel_y_lo[i] = kBirdTravel_y_lo[i]; + bird_travel_y_hi[i] = kBirdTravel_y_hi[i]; + link_y_coord_spexit = kBirdTravel_y_hi[i] << 8 | kBirdTravel_y_lo[i]; + + if (WorldMap_CalculateOamCoordinates(&pt)) + WorldMap_HandleSpriteBlink(i, 0, (i == birdtravel_var1[0]) ? 0x30 + (frame_counter & 6) : 0x32, kBirdTravel_tab1[i], pt.x, pt.y); + } + link_x_coord_spexit = xbak; + link_y_coord_spexit = ybak; +} + +void FluteMenu_LoadSelectedScreen() { // 8ab8c5 + save_ow_event_info[0x3b] &= ~0x20; + save_ow_event_info[0x7b] &= ~0x20; + save_dung_info[267] &= ~0x80; + save_dung_info[40] &= ~0x100; + FluteMenu_LoadTransport(); + FluteMenu_LoadSelectedScreenPalettes(); + uint8 t = overworld_screen_index & 0xbf; + DecompressAnimatedOverworldTiles((t == 3 || t == 5 || t == 7) ? 0x58 : 0x5a); + Overworld_SetFixedColAndScroll(); + overworld_palette_aux_or_main = 0; + hud_palette = 0; + InitializeTilesets(); + overworld_map_state++; + BYTE(dung_draw_width_indicator) = 0; + Overworld_LoadOverlays2(); + submodule_index--; + sound_effect_2 = 16; + uint8 m = overworld_music[BYTE(overworld_screen_index)]; + sound_effect_ambient = m >> 4; + music_control = (m & 0xf) != music_unk1 ? (m & 0xf) : 0xf3; +} + +void Overworld_LoadOverlayAndMap() { // 8ab948 + uint16 bak1 = WORD(main_module_index); + uint16 bak2 = WORD(overworld_map_state); + Overworld_LoadAndBuildScreen(); + WORD(overworld_map_state) = bak2 + 1; + WORD(main_module_index) = bak1; +} + +void FluteMenu_FadeInAndQuack() { // 8ab964 + if (++INIDISP_copy == 15) { + BirdTravel_Finish_Doit(); + } else { + Sprite_Main(); + } +} + +void BirdTravel_Finish_Doit() { // 8ab96c + overworld_map_state = 0; + subsubmodule_index = 0; + main_module_index = saved_module_for_menu; + submodule_index = 0; + HDMAEN_copy = mapbak_HDMAEN; + AddBirdTravelSomething(0x27, 4); + Sprite_Main(); +} + +void Messaging_OverworldMap() { // 8ab98b + switch (overworld_map_state) { + case 0: + WorldMap_FadeOut(); + break; + case 1: + WorldMap_LoadLightWorldMap(); + break; + case 2: + WorldMap_LoadDarkWorldMap(); + break; + case 3: + WorldMap_LoadSpriteGFX(); + break; + case 4: + WorldMap_Brighten(); + break; + case 5: + WorldMap_PlayerControl(); + break; + case 6: + WorldMap_RestoreGraphics(); + break; + case 7: + WorldMap_ExitMap(); + break; + } +} + +void WorldMap_FadeOut() { // 8ab9a3 + if (--INIDISP_copy) + return; + mapbak_HDMAEN = HDMAEN_copy; + EnableForceBlank(); + MOSAIC_copy = 3; + overworld_map_state++; + WORD(mapbak_TM) = WORD(TM_copy); + mapbak_BG1HOFS_copy2 = BG1HOFS_copy2; + mapbak_BG2HOFS_copy2 = BG2HOFS_copy2; + mapbak_BG1VOFS_copy2 = BG1VOFS_copy2; + mapbak_BG2VOFS_copy2 = BG2VOFS_copy2; + BG1HOFS_copy2 = BG2HOFS_copy2 = BG3HOFS_copy2 = 0; + BG1VOFS_copy2 = BG2VOFS_copy2 = BG3VOFS_copy2 = 0; + WORD(mapbak_CGWSEL) = WORD(CGWSEL_copy); + link_dma_graphics_index = 0x1fc; + if (BYTE(overworld_screen_index) < 0x80) { + link_y_coord_spexit = link_y_coord; + link_x_coord_spexit = link_x_coord; + } + if (sram_progress_indicator < 2) { + CGWSEL_copy = 0x80; + CGADSUB_copy = 0x61; + } + sound_effect_2 = 16; + sound_effect_ambient = 5; + music_control = 0xf2; + zelda_ppu_write(BGMODE, 7); + BGMODE_copy = 7; + zelda_ppu_write(M7SEL, 0x80); +} + +void WorldMap_LoadLightWorldMap() { // 8aba30 + WorldMap_FillTilemapWithEF(); + TM_copy = 0x11; + TS_copy = 0; + TransferMode7Characters(); + WorldMap_SetUpHDMA(); + LoadOverworldMapPalette(); + LoadActualGearPalettes(); + flag_update_cgram_in_nmi++; + nmi_subroutine_index = 7; + INIDISP_copy = 0; + nmi_disable_core_updates++; + overworld_map_state++; +} + +void WorldMap_LoadDarkWorldMap() { // 8aba7a + if (overworld_screen_index & 0x40) { + memcpy(&uvram, kDarkOverworldTilemap, 1024); + nmi_subroutine_index = 21; + } + overworld_map_state++; +} + +void WorldMap_LoadSpriteGFX() { // 8aba9a + load_chr_halfslot_even_odd = 0x10; + Graphics_LoadChrHalfSlot(); + load_chr_halfslot_even_odd = 0; + overworld_map_state++; +} + +void WorldMap_Brighten() { // 8abaaa + if (++INIDISP_copy == 15) + overworld_map_state++; +} + +void WorldMap_PlayerControl() { // 8abae6 + if (overworld_map_flags & 0x80) { + overworld_map_flags &= ~0x80; + OverworldMap_SetupHdma(); + } + + if (!overworld_map_flags && filtered_joypad_L & 0x40) { // X + overworld_map_state++; + return; + } + if (BYTE(dung_draw_width_indicator)) { + BYTE(dung_draw_width_indicator)--; + } else if (filtered_joypad_L & 0x70) { + sound_effect_2 = 36; + BYTE(dung_draw_width_indicator) = 8; + + int t = overworld_map_flags ^ 1; + overworld_map_flags = t | 0x80; + timer_for_mode7_zoom = kOverworldMap_Timer[t]; + if (timer_for_mode7_zoom == 12) { + BG1VOFS_copy2 = ((link_y_coord_spexit >> 4) - 0x48 & ~1); + M7Y_copy = BG1VOFS_copy2 + 0x100; + uint16 t0 = (link_x_coord_spexit >> 4) - 0x80; + uint16 t1 = (uint16)(5 * (sign16(t0) ? -t0 : t0)) >> 1; + uint16 t2 = sign16(t0) ? -t1 : t1; + BG1HOFS_copy2 = t2 + 0x80 & ~1; + } else { + BG1VOFS_copy2 = 200; + M7Y_copy = 200 + 256; + BG1HOFS_copy2 = 128; + } + } + + if (overworld_map_flags) { + int k = (joypad1H_last & 12) >> 1; + if (BG1VOFS_copy2 != kOverworldMap_Table2[k]) { + BG1VOFS_copy2 += kOverworldMap_Table3[k]; + M7Y_copy = BG1VOFS_copy2 + 0x100; + } + k = (joypad1H_last & 3) * 2 + 1; + if (BG1HOFS_copy2 != kOverworldMap_Table2[k]) + BG1HOFS_copy2 += kOverworldMap_Table3[k]; + } + WorldMap_HandleSprites(); +} + +void WorldMap_RestoreGraphics() { // 8abbd6 + if (--INIDISP_copy) + return; + EnableForceBlank(); + overworld_map_state++; + memcpy(main_palette_buffer, aux_palette_buffer, 512); + WORD(CGWSEL_copy) = WORD(mapbak_CGWSEL); + BG3HOFS_copy2 = BG3VOFS_copy2 = 0; + BG1HOFS_copy2 = mapbak_BG1HOFS_copy2; + BG2HOFS_copy2 = mapbak_BG2HOFS_copy2; + BG1VOFS_copy2 = mapbak_BG1VOFS_copy2; + BG2VOFS_copy2 = mapbak_BG2VOFS_copy2; + WORD(TM_copy) = WORD(mapbak_TM); + Attract_SetUpConclusionHDMA(); +} + +void Attract_SetUpConclusionHDMA() { // 8abc33 + HdmaSetup(0xABDDD, 0xABDDD, 0x42, (uint8)M7A, (uint8)M7D, 0); + HDMAEN_copy = 0x80; + zelda_ppu_write(BGMODE, 9); + BGMODE_copy = 9; + nmi_disable_core_updates = 0; +} + +void WorldMap_ExitMap() { // 8abc54 + overworld_palette_aux_or_main = 0; + hud_palette = 0; + InitializeTilesets(); + flag_update_cgram_in_nmi++; + BYTE(dung_draw_width_indicator) = 0; + overworld_map_state = 0; + subsubmodule_index = 0; + main_module_index = saved_module_for_menu; + submodule_index = 32; + vram_upload_offset = 0; + HDMAEN_copy = mapbak_HDMAEN; + sound_effect_ambient = overworld_music[BYTE(overworld_screen_index)] >> 4; + sound_effect_2 = 0x10; + music_control = 0xf3; +} + +void WorldMap_SetUpHDMA() { // 8abc96 + BG1HOFS_copy2 = 0x80; + BG1VOFS_copy2 = 0xc8; + M7Y_copy = 0x1c9; + M7X_copy = 0x100; + W12SEL_copy = 0; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + TMW_copy = 0; + TSW_copy = 0; + zelda_ppu_write(M7B, 0); + zelda_ppu_write(M7B, 0); + zelda_ppu_write(M7C, 0); + zelda_ppu_write(M7C, 0); + zelda_ppu_write(M7X, 0); + zelda_ppu_write(M7X, 1); + zelda_ppu_write(M7Y, 0); + zelda_ppu_write(M7Y, 1); + + if (main_module_index == 20) { + HdmaSetup(0xABDDD, 0xABDDD, 0x42, (uint8)M7A, (uint8)M7D, 0); + HDMAEN_copy = 0xc0; + } else if (submodule_index != 10) { + byte_7E0635 = 4; + timer_for_mode7_zoom = 12; + overworld_map_flags = 1; + BG1VOFS_copy2 = ((link_y_coord_spexit >> 4) - 0x48 & ~1); + M7Y_copy = BG1VOFS_copy2 + 0x100; + uint16 t0 = (link_x_coord_spexit >> 4) - 0x80; + uint16 t1 = (uint16)(5 * (sign16(t0) ? -t0 : t0)) >> 1; + uint16 t2 = sign16(t0) ? -t1 : t1; + BG1HOFS_copy2 = t2 + 0x80 & ~1; + OverworldMap_SetupHdma(); + HDMAEN_copy = 0xc0; + } else { + byte_7E0635 = 4; + timer_for_mode7_zoom = 33; + overworld_map_flags = 0; + HdmaSetup(0xABDCF, 0xABDCF, 0x42, (uint8)M7A, (uint8)M7D, 10); + HDMAEN_copy = 0xc0; + } +} + +void WorldMap_FillTilemapWithEF() { // 8abda5 + uint16 *dst = g_zenv.vram; + for (int i = 0; i != 0x4000; i++) + BYTE(dst[i]) = 0xef; +} + +void WorldMap_HandleSprites() { // 8abf66 + PointU8 pt; + + if (frame_counter & 0x10 && WorldMap_CalculateOamCoordinates(&pt)) + WorldMap_HandleSpriteBlink(0, 2, 0x3e, 0, pt.x - 4, pt.y - 4); + + uint16 ybak = link_y_coord_spexit; + uint16 xbak = link_x_coord_spexit; + + int k = 15; + if (BYTE(overworld_screen_index) < 0x40 && (bird_travel_x_lo[k] | bird_travel_x_hi[k] | bird_travel_y_lo[k] | bird_travel_y_hi[k])) { + if (!frame_counter) + birdtravel_var1[k]++; + link_x_coord_spexit = bird_travel_x_hi[k] << 8 | bird_travel_x_lo[k]; + link_y_coord_spexit = bird_travel_y_hi[k] << 8 | bird_travel_y_lo[k]; + if (WorldMap_CalculateOamCoordinates(&pt)) + WorldMap_HandleSpriteBlink(15, 2, kOverworldMap_Table4[frame_counter >> 1 & 3], 0x6a, pt.x, pt.y); + } + + if (save_ow_event_info[0x5b] & 0x20 || (((savegame_map_icons_indicator >= 6) ^ is_in_dark_world) & 1)) + goto out; + + k = savegame_map_icons_indicator; + uint16 x; + + if (!OverworldMap_CheckForPendant(0) && !OverworldMap_CheckForCrystal(0) && !sign16(kOwMapCrystal0_x[k])) { + link_x_coord_spexit = kOwMapCrystal0_x[k]; + link_y_coord_spexit = kOwMapCrystal0_y[k]; + uint8 t = kOwMapCrystal0_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal0; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal0_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(14, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal0:; + } + + if (!OverworldMap_CheckForPendant(1) && !OverworldMap_CheckForCrystal(1) && !sign16(kOwMapCrystal1_x[k])) { + link_x_coord_spexit = kOwMapCrystal1_x[k]; + link_y_coord_spexit = kOwMapCrystal1_y[k]; + uint8 t = kOwMapCrystal1_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal1; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal1_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(13, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal1:; + } + + if (!OverworldMap_CheckForPendant(2) && !OverworldMap_CheckForCrystal(2) && !sign16(kOwMapCrystal2_x[k])) { + link_x_coord_spexit = kOwMapCrystal2_x[k]; + link_y_coord_spexit = kOwMapCrystal2_y[k]; + uint8 t = kOwMapCrystal2_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal2; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal2_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(12, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal2:; + } + + if (!OverworldMap_CheckForCrystal(3) && !sign16(kOwMapCrystal3_x[k])) { + link_x_coord_spexit = kOwMapCrystal3_x[k]; + link_y_coord_spexit = kOwMapCrystal3_y[k]; + uint8 t = kOwMapCrystal3_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal3; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal3_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(11, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal3:; + } + + if (!OverworldMap_CheckForCrystal(4) && !sign16(kOwMapCrystal4_x[k])) { + link_x_coord_spexit = kOwMapCrystal4_x[k]; + link_y_coord_spexit = kOwMapCrystal4_y[k]; + uint8 t = kOwMapCrystal4_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal4; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal4_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(10, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal4:; + } + + if (!OverworldMap_CheckForCrystal(5) && !sign16(kOwMapCrystal5_x[k])) { + link_x_coord_spexit = kOwMapCrystal5_x[k]; + link_y_coord_spexit = kOwMapCrystal5_y[k]; + uint8 t = kOwMapCrystal5_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal5; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal5_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(9, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal5:; + } + + if (!OverworldMap_CheckForCrystal(6) && !sign16(kOwMapCrystal6_x[k])) { + link_x_coord_spexit = kOwMapCrystal6_x[k]; + link_y_coord_spexit = kOwMapCrystal6_y[k]; + uint8 t = kOwMapCrystal6_tab[k] >> 8; + if (t != 0) { + if (t != 100 && frame_counter & 0x10) + goto endif_crystal6; + link_x_coord_spexit -= 4, link_y_coord_spexit -= 4; + } + if (WorldMap_CalculateOamCoordinates(&pt)) { + uint16 info = kOwMapCrystal6_tab[k]; + uint8 ext = 2; + if (!(info >> 8)) + info = kOwMap_tab2[frame_counter >> 3 & 3] << 8 | 0x32, ext = 0; + WorldMap_HandleSpriteBlink(8, ext, (uint8)info, (uint8)(info >> 8), pt.x, pt.y); + } + endif_crystal6:; + } + +out: + link_x_coord_spexit = xbak; + link_y_coord_spexit = ybak; +} + +bool WorldMap_CalculateOamCoordinates(PointU8 *pt) { // 8ac39f + uint8 r14, r15; + + if (overworld_map_flags == 0) { + int j = -(link_y_coord_spexit >> 4) + M7Y_copy + (link_y_coord_spexit >> 3 & 1) - 0xc0; + uint8 t0 = kOverworldMap_tab1[j]; + r15 = 13 * t0 >> 4; + + uint8 at = link_x_coord_spexit >> 4; + bool below = at < 0x80; + at -= 0x80; + if (sign8(at)) at = ~at; + + uint8 t1 = ((r15 < 224 ? r15 : 0) * 0x54 >> 8) + 0xb2; + uint8 t2 = at * t1 >> 8; + uint8 t3 = (below) ? 0x80 - t2 : t2 + 0x80; + + pt->x = t3 - BG1HOFS_copy2 + 0x80; + pt->y = r15 + 12; + return true; + } else { + uint16 t0 = -(link_y_coord_spexit >> 4) + M7Y_copy - 0x80; + if (t0 >= 0x100) + return false; + uint16 t1 = t0 * 37 >> 4; + if (t1 >= 333) + return false; + r15 = kOverworldMap_tab1[t1]; + uint16 t2 = link_x_coord_spexit; + bool below = t2 < 0x7F8; + t2 -= 0x7f8; + if (sign16(t2)) + t2 = -t2; + uint8 t3 = r15 < 226 ? r15 : 0; + uint8 t4 = (t3 * 84 >> 8) + 178; // r0 + uint8 t5 = (uint8)t2 * t4 >> 8; // r1 + uint16 t6 = (uint8)(t2 >> 8) * t4 + t5; + uint16 t7 = (below) ? 0x800 - t6 : t6 + 0x800; + bool below2 = t7 < 0x800; + t7 -= 0x800; + uint16 t8 = below2 ? -t7 : t7; + uint8 t9 = (uint8)t8 * 45 >> 8; + uint16 t10 = ((t8 >> 8) * 45) + t9; + uint16 t11 = below2 ? 0x80 - t10 : t10 + 0x80; + r14 = t11 - BG1HOFS_copy2; + uint16 t12 = t11 - 0xFF80 - BG1HOFS_copy2; + if (t12 >= 0x100) + return false; + pt->x = r14 + 0x81; + pt->y = r15 + 16; + return true; + } +} + +void WorldMap_HandleSpriteBlink(int spr, uint8 r11_ext, uint8 r12_flags, uint8 r13_char, uint8 r14_x, uint8 r15_y) { // 8ac51c + if (!(frame_counter & 0x10) && r13_char == 100) { + assert(spr >= 8); + r13_char = kOverworldMapData[spr - 8]; + r12_flags = 0x32; + r11_ext = 0; + } else { + r14_x -= 4; + r15_y -= 4; + } + bytewise_extended_oam[spr] = r11_ext; + oam_buf[spr].x = r14_x; + oam_buf[spr].y = r15_y; + oam_buf[spr].charnum = r13_char; + oam_buf[spr].flags = r12_flags; +} + +bool OverworldMap_CheckForPendant(int k) { // 8ac5a9 + return (savegame_map_icons_indicator == 3) && (link_which_pendants & kPendantBitMask[k]) != 0; +} + +bool OverworldMap_CheckForCrystal(int k) { // 8ac5c6 + return (savegame_map_icons_indicator == 7) && (link_has_crystals & kCrystalBitMask[k]) != 0; +} + +void Module0E_03_DungeonMap() { // 8ae0b0 + kDungMapSubmodules[overworld_map_state](); +} + +void Module0E_03_01_DrawMap() { // 8ae0dc + kDungMapInit[dungmap_init_state](); +} + +void Module0E_03_01_00_PrepMapGraphics() { // 8ae0e4 + uint8 hdmaen_bak = HDMAEN_copy; + zelda_snes_dummy_write(HDMAEN, 0); + HDMAEN_copy = 0; + mapbak_main_tile_theme_index = main_tile_theme_index; + mapbak_sprite_graphics_index = sprite_graphics_index; + mapbak_aux_tile_theme_index = aux_tile_theme_index; + mapbak_TM = TM_copy; + mapbak_TS = TS_copy; + main_tile_theme_index = 32; + sprite_graphics_index = 0x80 | BYTE(cur_palace_index_x2) >> 1; + aux_tile_theme_index = 64; + TM_copy = 0x16; + TS_copy = 1; + EraseTileMaps_dungeonmap(); + InitializeTilesets(); + overworld_palette_aux_or_main = 0x200; + Palette_Load_DungeonMapBG(); + Palette_Load_DungeonMapSprite(); + hud_palette = 1; + Palette_Load_HUD(); + LoadActualGearPalettes(); + flag_update_cgram_in_nmi++; + dungmap_init_state++; + HDMAEN_copy = hdmaen_bak; + nmi_load_bg_from_vram = 9; + nmi_disable_core_updates = 9; +} + +void Module0E_03_01_01_DrawLEVEL() { // 8ae1a4 + // Display FLOOR instead of MAP + int i = kDungMap_Tab0[cur_palace_index_x2 >> 1] >> 1; + if (i >= 0) { + uint8 *dst = (uint8 *)&vram_upload_data[0]; + dst[32] = 0xff; + WORD(dst[14 ]) = kDungMap_Tab1[i]; + WORD(dst[14+16]) = kDungMap_Tab2[i]; + for (int i = 13; i >= 0; i--) { + dst[i] = kDungMap_Tab3[i]; + dst[i+16] = kDungMap_Tab4[i]; + } + nmi_load_bg_from_vram = 1; + } + dungmap_init_state++; +} + +void Module0E_03_01_02_DrawFloorsBackdrop() { // 8ae1f3 + int offs = 0; + uint16 t5 = kDungMap_Tab5[cur_palace_index_x2 >> 1]; + if (t5 & 0x100) { + for (int i = 0; i < 21; i++) + vram_upload_data[offs++] = kDungMap_Tab6[i]; + uint16 t = 0x1123; + for (int i = 0; i < 16; i++, t += 0x20, offs += 3) { + vram_upload_data[offs + 0] = swap16(t); + vram_upload_data[offs + 1] = 0xE40; + vram_upload_data[offs + 2] = 0x1B2E; + } + } + int t7 = kDungMap_Tab7[(uint8)t5 >= 0x50 ? (((uint8)t5 >> 4) - 4) : (t5 & 0xf) >= 5 ? (t5 & 0xf) : 0], t7_org = t7; + int j = 0; + do { + vram_upload_data[offs++] = swap16(t7); + vram_upload_data[offs++] = 0xe40; + vram_upload_data[offs++] = kDungMap_Tab8[j] + (t5 & 0x200 ? 0x400 : 0); + j += (j != 6); + } while (t7 += 0x20, t7 < 0x1360); + vram_upload_offset = offs * 2; + DungeonMap_BuildFloorListBoxes(t5, t7_org); + ((uint8 *)vram_upload_data)[vram_upload_offset] = 0xff; + dungmap_init_state++; + nmi_load_bg_from_vram = 1; +} + +void DungeonMap_BuildFloorListBoxes(uint8 t5, uint16 r14) { // 8ae2f5 + int n = (t5 & 0xf) + (t5 >> 4); + uint8 r12 = dung_cur_floor + (t5 & 0xf); + r14 -= 0x40 - 2; + r14 += (t5 & 0xf) * 0x40; + int offs = vram_upload_offset >> 1; + int i = 0; + do { + int x = 0; +loop2: + vram_upload_data[offs++] = swap16(r14); + vram_upload_data[offs++] = 0x700; + do { + vram_upload_data[offs++] = kDungMap_Tab9[x++]; + if (x == 4) { + r14 += 0x20; + goto loop2; + } + } while (x != 8); + + r14 -= 0x40 + 0x20; + } while (++i < n); + vram_upload_offset = offs * 2; +} + +void Module0E_03_01_03_DrawRooms() { // 8ae384 + dungmap_var2 = 0; + dungmap_idx = 0; + uint8 t = -(kDungMap_Tab5[cur_palace_index_x2 >> 1] & 0xf); + if (WORD(dung_cur_floor) != t) { + dungmap_cur_floor = dung_cur_floor; + } else { + dungmap_cur_floor = WORD(dung_cur_floor) + 1; + dungmap_idx += 2; + } + DungeonMap_DrawFloorNumbersByRoom(0, ~0x1000); + DungeonMap_DrawBorderForRooms(0, ~0x1000); + DungeonMap_DrawDungeonLayout(0); + BYTE(dungmap_cur_floor)--; + DungeonMap_DrawFloorNumbersByRoom(0x300, ~0x1000); + DungeonMap_DrawBorderForRooms(0x300, ~0x1000); + DungeonMap_DrawDungeonLayout(0x300); + dungmap_cur_floor++; + WORD(g_ram[6]) = 0; + WORD(g_ram[10]) = 0; + nmi_subroutine_index = 8; + BYTE(nmi_load_target_addr) = 0x22; + dungmap_init_state++; +} + +void DungeonMap_DrawBorderForRooms(uint16 pd, uint16 mask) { // 8ae449 + for (int i = 0; i != 4; i++) + messaging_buf[((kDungMap_Tab10[i] + pd) & 0xfff) >> 1] = kDungMap_Tab11[i] & mask; + for (int i = 0; i != 2; i++) { + int r4 = kDungMap_Tab12[i] + pd; + for (int j = 0; j != 20; j+=2) + messaging_buf[((r4 + j) & 0xfff) >> 1] = kDungMap_Tab13[i] & mask; + } + + for (int i = 0; i != 2; i++) { + int r4 = kDungMap_Tab14[i] + pd; + for (int j = 0; j != 0x280; j+=0x40) + messaging_buf[((r4 + j) & 0xfff) >> 1] = kDungMap_Tab15[i] & mask; + } +} + +void DungeonMap_DrawFloorNumbersByRoom(uint16 pd, uint16 r8) { // 8ae4f9 + uint16 p = 0xDE; + do { + int t = ((p + pd) & 0xfff) >> 1; + messaging_buf[t] = 0xf00; + messaging_buf[t+1] = 0xf00; + } while (p += 0x40, p != 0x39e); + int t = ((0x35e + pd) & 0xfff) >> 1; + uint16 q1 = (dungmap_cur_floor & 0x80) ? 0x1F1C : kDungMap_Tab16[dungmap_cur_floor & 0xf]; + uint16 q2 = (dungmap_cur_floor & 0x80) ? kDungMap_Tab16[(uint8)~dungmap_cur_floor] : 0x1F1D; + messaging_buf[t+0] = q1 & r8; + messaging_buf[t+1] = q2 & r8; +} + +void DungeonMap_DrawDungeonLayout(int pd) { // 8ae579 + for (int i = 0; i < 5; i++) + DungeonMap_DrawSingleRowOfRooms(i, ((292 + 128 * i + pd) & 0xfff) >> 1); +} + +void DungeonMap_DrawSingleRowOfRooms(int i, int arg_x) { // 8ae5bc + uint16 t5 = kDungMap_Tab5[cur_palace_index_x2 >> 1]; + int dungmask = kUpperBitmasks[cur_palace_index_x2 >> 1]; + + for (int j = 0; j < 5; j++, arg_x += 2) { + int r14 = (uint8)(dungmap_cur_floor + (t5 & 0xf)); + const uint8 *curp = GetDungmapFloorLayout(); + uint8 v = curp[r14 * 25 + i * 5 + j]; + uint16 yv, av; + if (v == 0xf) { + yv = 0x51; + } else { + r14 = save_dung_info[v] & 0xf; + int k = 0, count = 0; + for(; curp[k] != v; k++) + count += (curp[k] != 0xf); + yv = GetOtherDungmapInfo(count); + } + + uint16 r12 = kDungMap_Tab23[yv * 4 + 0], r12_org = r12; + if (r12 != 0xB00 && (r14 & 8) == 0) { + if (!(r12 & 0x1000)) { + r12 = 0x400; + } else if (link_dungeon_map & dungmask) { + av = (r12 & ~0x1c00) | 0xc00; + goto write_3; + } else { + r12 = 0; + } + } else { + r12 = 0; + } + av = ((link_dungeon_map & dungmask) || (r14 & 8)) ? r12 + r12_org : 0xb00; + write_3: + messaging_buf[arg_x] = av; + + r12 = kDungMap_Tab23[yv * 4 + 1], r12_org = r12; + if (r12 != 0xB00 && (r14 & 4) == 0) { + if (!(r12 & 0x1000)) { + r12 = 0x400; + } else if (link_dungeon_map & dungmask) { + av = (r12 & ~0x1c00) | 0xc00; + goto write_4; + } else { + r12 = 0; + } + } else { + r12 = 0; + } + av = ((link_dungeon_map & dungmask) || (r14 & 4)) ? r12 + r12_org : 0xb00; + write_4: + messaging_buf[arg_x + 1] = av; + + r12 = kDungMap_Tab23[yv * 4 + 2], r12_org = r12; + if (r12 != 0xB00 && (r14 & 2) == 0) { + if (!(r12 & 0x1000)) { + r12 = 0x400; + } else if (link_dungeon_map & dungmask) { + av = (r12 & ~0x1c00) | 0xc00; + goto write_5; + } else { + r12 = 0; + } + } else { + r12 = 0; + } + av = ((link_dungeon_map & dungmask) || (r14 & 2)) ? r12 + r12_org : 0xb00; + write_5: + messaging_buf[arg_x + 32] = av; + + r12 = kDungMap_Tab23[yv * 4 + 3], r12_org = r12; + if (r12 != 0xB00 && (r14 & 1) == 0) { + if (!(r12 & 0x1000)) { + r12 = 0x400; + } else if (link_dungeon_map & dungmask) { + av = (r12 & ~0x1c00) | 0xc00; + goto write_6; + } else { + r12 = 0; + } + } else { + r12 = 0; + } + av = ((link_dungeon_map & dungmask) || (r14 & 1)) ? r12 + r12_org : 0xb00; + write_6: + messaging_buf[arg_x + 33] = av; + } +} + +void DungeonMap_DrawRoomMarkers() { // 8ae823 + int dung = cur_palace_index_x2 >> 1; + uint8 t5 = (kDungMap_Tab5[dung] & 0xf); + uint8 floor1 = t5 + dung_cur_floor; + + uint16 room = dungeon_room_index; + for (int i = 0; i != 3; i++) { + if (room == kDungMap_Tab21[i]) + room = kDungMap_Tab22[i]; + } + const uint8 *roomp = GetDungmapFloorLayout(); + const uint8 *curp = &roomp[floor1 * 25]; + int i; + + uint8 xcoord = 0, ycoord = 0; + for(i = 0; i < 25 && *curp++ != (uint8)room; i++) { + if (xcoord < 64) + xcoord += 16; + else + xcoord = 0, ycoord += 16; + } + dungmap_var3 = xcoord + 0x90; + dungmap_var3 += (link_x_coord & 0x1e0) >> 5; + + dungmap_var6 = ycoord; + + dungmap_var5 = ycoord + kDungMap_Tab24[dungmap_idx >> 1]; + dungmap_var5 += (link_y_coord & 0x1e0) >> 5; + + uint8 floor2 = t5 + kDungMap_Tab28[dung]; + curp = &roomp[floor2 * 25]; + + dungmap_var8 = dungmap_var7 = 0x40; + + uint8 lookfor = kDungMap_Tab25[dung]; + for (int j = 24; j >= 0; j--) { + if (curp[j] != 0xf && curp[j] == lookfor) + break; + if ((int16)(dungmap_var7 -= 0x10) < 0) { + dungmap_var7 = 0x40; + BYTE(dungmap_var8) -= 0x10; + } + } + + int8 floor3 = dungmap_cur_floor - kDungMap_Tab28[dung]; + dungmap_var8 += 0x60 * floor3; + dungmap_var8 += kDungMap_Tab24[0]; + overworld_map_state++; + INIDISP_copy = 0; + dungmap_init_state = 0; +} + +void DungeonMap_HandleInputAndSprites() { // 8ae954 + DungeonMap_HandleInput(); + DungeonMap_DrawSprites(); +} + +void DungeonMap_HandleInput() { // 8ae95b + if (filtered_joypad_L & 0x40) { + overworld_map_state += 2; + dungmap_init_state = 0; + } else { + DungeonMap_HandleMovementInput(); + } +} + +void DungeonMap_HandleMovementInput() { // 8ae979 + DungeonMap_HandleFloorSelect(); + if (dungmap_var2) + DungeonMap_ScrollFloors(); +} + +void DungeonMap_HandleFloorSelect() { // 8ae986 + uint8 r2 = (kDungMap_Tab5[cur_palace_index_x2 >> 1] >> 4 & 0xf); + uint8 r3 = (kDungMap_Tab5[cur_palace_index_x2 >> 1] & 0xf); + uint8 yv = 7; + if (r2 + r3 < 3 || dungmap_var2 || !(joypad1H_last & 0xc)) + return; + dungmap_cur_floor &= 0xff; + uint16 r6 = WORD(g_ram[6]); + if (joypad1H_last & 8) { + if (r2 - 1 == dungmap_cur_floor) + return; + dungmap_cur_floor++; + r6 = (r6 - 0x300) & 0xfff; + } else { + if ((uint8)(-r3 + 1) == dungmap_cur_floor) + return; + dungmap_cur_floor -= 2; + r6 = (r6 + 0x600) & 0xfff; + } + DungeonMap_DrawFloorNumbersByRoom(r6, ~0x1000); + DungeonMap_DrawBorderForRooms(r6, ~0x1000); + DungeonMap_DrawDungeonLayout(r6); + dungmap_var2++; + WORD(g_ram[10]) = joypad1H_last; + int x = joypad1H_last >> 3 & 1; + dungmap_var4 = BG2VOFS_copy2 + kDungMap_Tab26[x]; + if (!x) { + r6 = (r6 - 0x300) & 0xfff; + dungmap_cur_floor++; + } + WORD(g_ram[6]) = r6; + nmi_subroutine_index = 8; +} + +void DungeonMap_ScrollFloors() { // 8aea7f + int x = WORD(g_ram[10]) >> 3 & 1; + dungmap_var5 += kDungMap_Tab39[x]; + dungmap_var8 += kDungMap_Tab39[x]; + BG2VOFS_copy2 += kDungMap_Tab40[x]; + if (BG2VOFS_copy2 == dungmap_var4) + dungmap_var2 = 0; +} + +void DungeonMap_DrawSprites() { // 8aeab2 + int dung = cur_palace_index_x2 >> 1; + uint8 r2 = (kDungMap_Tab5[dung] & 0xf); + uint8 floor = r2 + dung_cur_floor; + + int spr_pos = 0; + uint8 r14 = 0; + DungeonMap_DrawLinkPointing(spr_pos++, r2, floor); + do { + spr_pos = DungeonMap_DrawLocationMarker(spr_pos, r14); + r14 += 1; + } while (spr_pos != 9); + spr_pos = DungeonMap_DrawBlinkingIndicator(spr_pos); + spr_pos = DungeonMap_DrawBossIcon(spr_pos); + spr_pos = DungeonMap_DrawFloorNumberObjects(spr_pos); + DungeonMap_DrawFloorBlinker(); +} + +void DungeonMap_DrawLinkPointing(int spr_pos, uint8 r2, uint8 r3) { // 8aeaf0 + int dung = cur_palace_index_x2 >> 1; + uint8 t5 = kDungMap_Tab5[dung]; + if (4 - r2 >= 0) { + r3 += 4 - r2; + int8 a = (t5 >> 4) - 4; + if (a >= 0) + r3 -= a; + } + bytewise_extended_oam[spr_pos] = 2; + oam_buf[spr_pos].x = 0x19; + oam_buf[spr_pos].y = kDungMap_Tab33[r3] - 4; + oam_buf[spr_pos].charnum = 0; + oam_buf[spr_pos].flags = overworld_palette_swap_flag ? 0x30 : 0x3e; +} + +int DungeonMap_DrawBlinkingIndicator(int spr_pos) { // 8aeb50 + bytewise_extended_oam[spr_pos] = 0; + oam_buf[spr_pos].x = dungmap_var3 - 3; + oam_buf[spr_pos].y = ((dungmap_var5 < 256) ? dungmap_var5 : 0xf0) - 3; + oam_buf[spr_pos].charnum = 0x34; + oam_buf[spr_pos].flags = kDungMap_Tab38[frame_counter >> 2 & 3]; + return spr_pos + 1; +} + +int DungeonMap_DrawLocationMarker(int spr_pos, uint16 r14) { // 8aeba8 + for (int i = 3; i >= 0; i--, spr_pos++) { + bytewise_extended_oam[spr_pos] = 2; + oam_buf[spr_pos].x = kDungMap_Tab29[i] + (dungmap_var3 & 0xf0); + uint8 r15 = dungmap_var6 + kDungMap_Tab24[r14]; + oam_buf[spr_pos].y = r15 + kDungMap_Tab30[i]; + oam_buf[spr_pos].charnum = 0; + int fr = (frame_counter >> 2) & 1; + if ((dungmap_var5 + 1 & 0xf0) == ++r15 && dungmap_var5 < 256) + fr += 2; + oam_buf[spr_pos].flags = kDungMap_Tab32[fr] | kDungMap_Tab31[i]; + } + return spr_pos; +} + +int DungeonMap_DrawFloorNumberObjects(int spr_pos) { // 8aec0a + uint8 r2 = (kDungMap_Tab5[cur_palace_index_x2 >> 1] >> 4 & 0xf); + uint8 r3 = (kDungMap_Tab5[cur_palace_index_x2 >> 1] & 0xf); + uint8 yv = 7; + if (r2 + r3 != 8 && r2 < 4) { + yv = 6; + for (int i = 3; i != 0 && i != r2; i--) + yv--; + if (r3 >= 5) { + for (int i = 5; i != r3 && r3 != 8; i++) + yv++; + } + } + + uint8 r4 = kDungMap_Tab33[yv] + 1; + r2--; + r3 = -r3; + do { + bytewise_extended_oam[spr_pos+0] = 0; + bytewise_extended_oam[spr_pos+1] = 0; + oam_buf[spr_pos + 0].x = 0x30; + oam_buf[spr_pos + 1].x = 0x38; + oam_buf[spr_pos + 0].y = r4; + oam_buf[spr_pos + 1].y = r4; + r4 += 16; + oam_buf[spr_pos + 0].flags = 0x3d; + oam_buf[spr_pos + 1].flags = 0x3d; + oam_buf[spr_pos + 0].charnum = sign8(r2) ? 0x1c : kDungMap_Tab34[r2]; + oam_buf[spr_pos + 1].charnum = sign8(r2) ? kDungMap_Tab34[r2 ^ 0xff] : 0x1d; + } while (spr_pos += 2, r2-- != r3); + return spr_pos; +} + +void DungeonMap_DrawFloorBlinker() { // 8aeccf + uint8 floor = dungmap_cur_floor; + uint8 t5 = kDungMap_Tab5[cur_palace_index_x2 >> 1]; + uint8 flag = ((t5 >> 4 & 0xf) + (t5 & 0xf) != 1); + floor -= flag; + uint8 r0; + uint8 i = flag; + do { + r0 = floor + (t5 & 0xf); + int8 a = 4 - (t5 & 0xf); + if (a >= 0) { + r0 += a; + a = (t5 >> 4) - 4; + if (a >= 0) + r0 -= a; + } + floor += 1; + } while (i--); + if (!(frame_counter & 0x10)) + return; + uint8 y = kDungMap_Tab33[r0] - 4; + do { + uint8 x = 40; + int spr_pos = 0x40 + kDungMap_Tab35[flag]; + for (int i = 3; i >= 0; i--, spr_pos++) { + bytewise_extended_oam[spr_pos+0] = 0; + bytewise_extended_oam[spr_pos+4] = 0; + oam_buf[spr_pos + 0].x = x; + oam_buf[spr_pos + 4].x = x; + oam_buf[spr_pos + 0].y = y + flag * 16; + oam_buf[spr_pos + 4].y = y + flag * 16 + 8; + oam_buf[spr_pos + 0].charnum = kDungMap_Tab36[i]; + oam_buf[spr_pos + 4].charnum = kDungMap_Tab36[i]; + uint8 t = 0x3d | (i ? 0 : 0x40); + oam_buf[spr_pos + 0].flags = t; + oam_buf[spr_pos + 4].flags = t | 0x80; + x += 8; + } + } while (flag--); +} + +int DungeonMap_DrawBossIcon(int spr_pos) { // 8aede4 + int dung = cur_palace_index_x2 >> 1; + if (save_dung_info[kDungMap_Tab25[dung]] & 0x800 || !(link_compass & kUpperBitmasks[dung]) || kDungMap_Tab28[dung] < 0) + return spr_pos; + spr_pos = DungeonMap_DrawBossIconByFloor(spr_pos); + if ((frame_counter & 0xf) >= 10) + return spr_pos; + bytewise_extended_oam[spr_pos] = 0; + uint16 xy = kDungMap_Tab37[dung]; + oam_buf[spr_pos].x = (xy >> 8) + dungmap_var7 + 0x90; + oam_buf[spr_pos].y = (dungmap_var8 < 256) ? xy + dungmap_var8 : 0xf0; + oam_buf[spr_pos].charnum = 0x31; + oam_buf[spr_pos].flags = 0x33; + return spr_pos + 1; +} + +int DungeonMap_DrawBossIconByFloor(int spr_pos) { // 8aee95 + int dung = cur_palace_index_x2 >> 1; + uint8 t5 = kDungMap_Tab5[dung]; + uint8 r2 = t5 & 0xf; + uint8 r3 = r2 + kDungMap_Tab28[dung]; + if (4 - r2 >= 0) { + r3 += 4 - r2; + int8 a = (t5 >> 4) - 4; + if (a >= 0) + r3 -= a; + } + if ((frame_counter & 0xf) >= 10) + return spr_pos; + bytewise_extended_oam[spr_pos] = 0; + uint16 xy = kDungMap_Tab37[dung]; + oam_buf[spr_pos].x = 0x4C; + oam_buf[spr_pos].y = kDungMap_Tab33[r3]; + oam_buf[spr_pos].charnum = 0x31; + oam_buf[spr_pos].flags = 0x33; + return spr_pos + 1; +} + +void DungeonMap_RecoverGFX() { // 8aef19 + uint8 hdmaen_bak = HDMAEN_copy; + zelda_snes_dummy_write(HDMAEN, 0); + HDMAEN_copy = 0; + EraseTileMaps_normal(); + + TM_copy = mapbak_TM; + TS_copy = mapbak_TS; + main_tile_theme_index = mapbak_main_tile_theme_index; + sprite_graphics_index = mapbak_sprite_graphics_index; + aux_tile_theme_index = mapbak_aux_tile_theme_index; + InitializeTilesets(); + overworld_palette_aux_or_main = 0; + hud_palette = 0; + Hud_Rebuild(); + + overworld_screen_transition = 0; + dung_cur_quadrant_upload = 0; + do { + WaterFlood_BuildOneQuadrantForVRAM(); + NMI_UploadTilemap(); + Dungeon_PrepareNextRoomQuadrantUpload(); + NMI_UploadTilemap(); + } while (dung_cur_quadrant_upload != 0x10); + + nmi_subroutine_index = 0; + subsubmodule_index = 0; + HDMAEN_copy = hdmaen_bak; + + memcpy(main_palette_buffer, mapbak_palette, sizeof(uint16) * 256); + COLDATA_copy0 |= overworld_fixed_color_plusminus; + COLDATA_copy1 |= overworld_fixed_color_plusminus; + COLDATA_copy2 |= overworld_fixed_color_plusminus; + + sound_effect_2 = 16; + music_control = 0xf3; + RecoverPegGFXFromMapping(); + flag_update_cgram_in_nmi++; + overworld_map_state++; + INIDISP_copy = 0; + nmi_disable_core_updates = 0; +} + +void ToggleStarTilesAndAdvance() { // 8aefc9 + Dungeon_RestoreStarTileChr(); + overworld_map_state++; +} + +void Death_InitializeGameOverLetters() { // 8afe20 + flag_for_boomerang_in_place = 0; + for (int i = 0; i < 8; i++) { + ancilla_x_lo[i] = 0xb0; + ancilla_x_hi[i] = 0; + } + ancilla_type[0] = 1; + hookshot_effect_index = 6; +} + +void CopySaveToWRAM() { // 8ccfbb + int k = 0xf; + bird_travel_x_hi[k] = 0; + bird_travel_y_hi[k] = 0; + bird_travel_x_lo[k] = 0; + bird_travel_y_lo[k] = 0; + birdtravel_var1[k] = 0; + + memcpy(save_dung_info, &g_zenv.sram[WORD(g_ram[0])], 0x500); + + bg_tile_animation_countdown = 7; + word_7EC013 = 7; + word_7EC00F = 0; + word_7EC015 = 0; + word_7E0219 = 0x6040; + word_7E021D = 0x4841; + word_7E021F = 0x7f; + word_7E0221 = 0xffff; + + hud_var1 = 128; + main_module_index = 5; + submodule_index = 0; + which_entrance = 0; + nmi_disable_core_updates = 0; + hud_palette = 0; +} + +void RenderText() { // 8ec440 + kMessaging_Text[messaging_module](); +} + +void RenderText_PostDeathSaveOptions() { // 8ec455 + dialogue_message_index = 3; + Text_Initialize_initModuleStateLoop(); + text_msgbox_topleft = 0x61e8; + text_render_state = 2; + for (int i = 0; i < 5; i++) + Text_Render(); +} + +void Text_Initialize() { // 8ec483 + if (main_module_index == 20) + ResetHUDPalettes4and5(); + Attract_DecompressStoryGFX(); + Text_Initialize_initModuleStateLoop(); +} + +void Text_Initialize_initModuleStateLoop() { // 8ec493 + memcpy(&text_msgbox_topleft_copy, kText_InitializationData, 32); + Text_InitVwfState(); + RenderText_SetDefaultWindowPosition(); + text_tilemap_cur = 0x3980; + Text_LoadCharacterBuffer(); + RenderText_Draw_EmptyBuffer(); + dialogue_msg_dst_offs = 0; + nmi_subroutine_index = 2; + nmi_disable_core_updates = 2; +} + +void Text_InitVwfState() { // 8ec4c9 + vwf_curline = 0; + vwf_flag_next_line = 0; + vwf_var1 = 0; + vwf_line_ptr = 0; +} + +void Text_LoadCharacterBuffer() { // 8ec4e2 + const uint8 *src = GetCurrentTextPtr(), *src_org = src; + uint8 *dst = messaging_text_buffer; + dst[0] = dst[1] = 0x7f; + dialogue_msg_dst_offs = 0; + dialogue_msg_src_offs = 0; + for (;;) { + uint8 c = *src++; + if (!(c & 0x80)) { + switch (c) { + case 0x67 + 3: dst = Text_WritePlayerName(dst); break; + case 0x67 + 4: // RenderText_ExtendedCommand_SetWindowType + text_render_state = *src++; + break; + case 0x67 + 5: { // Text_WritePreloadedNumber + uint8 t = *src++; + uint8 v = byte_7E1CF2[t >> 1]; + *dst++ = 0x34 + ((t & 1) ? v >> 4 : v & 0xf); + break; + } + case 0x67 + 6: + text_msgbox_topleft = kText_Positions[*src++]; + break; + case 0x67 + 16: + text_tilemap_cur = ((0x387F & 0xe300) | 0x180) | (*src++ << 10) & 0x3c00; + break; + case 0x67 + 7: + case 0x67 + 17: + case 0x67 + 18: + case 0x67 + 19: + *dst++ = c; + *dst++ = *src++; + break; + case 0x7f: + dialogue_msg_dst_offs = dst - messaging_text_buffer; + dialogue_msg_src_offs = src - src_org - 1; + *dst = 0x7f; + return; // done + default: + *dst++ = c; + break; + } + } else { + // dictionary + c -= 0x88; + int idx = kTextDictionary_Idx[c], num = kTextDictionary_Idx[c + 1] - idx; + memcpy(dst, &kTextDictionary[idx], num); + dst += num; + } + } +} + +uint8 *Text_WritePlayerName(uint8 *p) { // 8ec5b3 + uint8 slot = srm_var1; + int offs = ((slot>>1) - 1) * 0x500; + for (int i = 0; i < 6; i++) { + uint8 *pp = &g_zenv.sram[0x3d9 + offs + i * 2]; + uint16 a = WORD(*pp); + p[i] = Text_FilterPlayerNameCharacters(a & 0xf | (a >> 1) & 0xf0); + } + int i = 6; + while (i && p[i - 1] == 0x59) + i--; + return p + i; +} + +uint8 Text_FilterPlayerNameCharacters(uint8 a) { // 8ec639 + if (a >= 0x5f) { + if (a >= 0x76) + a -= 0x42; + else if (a == 0x5f) + a = 8; + else if (a == 0x60) + a = 0x22; + else if (a == 0x61) + a = 0x3e; + } + return a; +} + +void Text_Render() { // 8ec8d9 + kText_Render[text_render_state](); +} + +void RenderText_Draw_Border() { // 8ec8ea + RenderText_DrawBorderInitialize(); + uint16 *d = RenderText_DrawBorderRow(vram_upload_data, 0); + for(int i = 0; i != 6; i++) + d = RenderText_DrawBorderRow(d, 6); + d = RenderText_DrawBorderRow(d, 12); + nmi_load_bg_from_vram = 1; + text_render_state = 2; +} + +void RenderText_Draw_BorderIncremental() { // 8ec919 + nmi_load_bg_from_vram = 1; + uint8 a = text_incremental_state; + uint16 *d = vram_upload_data; + if (a) + a = (a < 7) ? 1 : 2; + switch (a) { + case 0: + RenderText_DrawBorderInitialize(); + d = RenderText_DrawBorderRow(d, 0); + text_incremental_state++; + break; + case 1: + d = RenderText_DrawBorderRow(d, 6); + text_incremental_state++; + break; + case 2: + text_render_state = 2; + d = RenderText_DrawBorderRow(d, 12); + text_incremental_state++; + break; + } +} + +void RenderText_Draw_CharacterTilemap() { // 8ec97d + Text_BuildCharacterTilemap(); + text_render_state++; +} + +void RenderText_Draw_MessageCharacters() { // 8ec984 +restart: + if (dialogue_msg_src_offs >= 99) { + dialogue_msg_src_offs = 0; + text_next_position = 0; + } else if (dialogue_msg_src_offs >= 59 && dialogue_msg_src_offs < 80) { + dialogue_msg_src_offs = 0x50; + text_next_position = 0; + } else if (dialogue_msg_src_offs >= 19 && dialogue_msg_src_offs < 40) { + dialogue_msg_src_offs = 0x28; + text_next_position = 0; + } + if ((dialogue_msg_src_offs == 18 || dialogue_msg_src_offs == 58 || dialogue_msg_src_offs == 98) && (text_next_position & 7) >= 6) { + dialogue_msg_src_offs++; + goto restart; + } + int t = (messaging_text_buffer[dialogue_msg_dst_offs] & 0x7f) - 0x66; + if (t < 0) + t = 0; + switch (t) { + case 0: // RenderText_Draw_RenderCharacter + switch (vwf_line_mode < 2 ? vwf_line_mode : 2) { + case 0: // RenderText_Draw_RenderCharacter_All + RenderText_Draw_RenderCharacter_All(); + break; + case 1: // VWF_RenderSingle + VWF_RenderSingle(); + break; + default: + vwf_line_mode--; + break; + } + break; + case 1: // RenderText_Draw_NextImage + if (main_module_index == 20) { + PaletteFilterHistory(); + if (!BYTE(palette_filter_countdown)) + dialogue_msg_dst_offs++; + } else { + dialogue_msg_dst_offs++; + } + break; + case 2: // RenderText_Draw_Choose2LowOr3 + RenderText_Draw_Choose2LowOr3(); + break; + case 3: // RenderText_Draw_ChooseItem + RenderText_Draw_ChooseItem(); + break; + case 4: // + case 5: // + case 6: // + case 7: // + case 8: // RenderText_Draw_Ignore + byte_7E1CEA = messaging_text_buffer[dialogue_msg_dst_offs + 1]; + dialogue_msg_dst_offs += 2; + break; + case 9: // RenderText_Draw_Choose2HiOr3 + RenderText_Draw_Choose2HiOr3(); + break; + case 10: // + assert(0); + break; + case 11: // RenderText_Draw_Choose3 + RenderText_Draw_Choose3(); + break; + case 12: // RenderText_Draw_Choose1Or2 + RenderText_Draw_Choose1Or2(); + break; + case 13: // RenderText_Draw_Scroll + RenderText_Draw_Scroll(); + break; + case 14: // + case 15: // + case 16: // VWF_SetLine + dialogue_msg_src_offs = kVWF_LinePositions[(t + 2) & 3]; + vwf_curline = kVWF_RowPositions[(t + 2) & 3]; + vwf_flag_next_line = 1; + dialogue_msg_dst_offs++; + text_next_position = 0; + break; + case 17: // RenderText_Draw_SetColor + byte_7E1CDC &= ~0x1c; + byte_7E1CDC |= (messaging_text_buffer[dialogue_msg_dst_offs + 1] & 7) << 2; + dialogue_msg_dst_offs += 2; + break; + case 18: // RenderText_Draw_Wait + switch (joypad1L_last & 0x80 ? 1 : text_wait_countdown >= 2 ? 2 : text_wait_countdown) { + case 0: + text_wait_countdown = kText_WaitDurations[messaging_text_buffer[dialogue_msg_dst_offs + 1] & 0xf] - 1; + break; + case 1: + dialogue_msg_dst_offs += 2; + BYTE(text_wait_countdown) = 0; + break; + case 2: + text_wait_countdown--; + break; + } + break; + case 19: // RenderText_Draw_PlaySfx + sound_effect_2 = messaging_text_buffer[dialogue_msg_dst_offs + 1]; + dialogue_msg_dst_offs += 2; + break; + case 20: // RenderText_Draw_SetSpeed + vwf_line_speed = vwf_line_mode = messaging_text_buffer[dialogue_msg_dst_offs + 1]; + dialogue_msg_dst_offs += 2; + break; + case 21: // RenderText_Draw_Command7B + RenderText_Draw_Command7B(); + break; + case 22: // RenderText_Draw_ABunchOfSpaces + RenderText_Draw_ABunchOfSpaces(); + break; + case 23: // RenderText_Draw_EmptyBuffer + RenderText_Draw_EmptyBuffer(); + break; + case 24: // RenderText_Draw_PauseForInput + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + sound_effect_2 = 36; + } else { + if ((filtered_joypad_H | filtered_joypad_L) & 0xc0) { + dialogue_msg_dst_offs++; + text_wait_countdown2 = 28; + } + } + break; + case 25: // RenderText_Draw_Terminate + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + sound_effect_2 = 36; + } else { + if ((filtered_joypad_H | filtered_joypad_L)) { + text_render_state = 4; + text_wait_countdown2 = 28; + } + } + break; + } + nmi_subroutine_index = 2; + nmi_disable_core_updates = 2; +} + +void RenderText_Draw_Finish() { // 8eca35 + RenderText_DrawBorderInitialize(); + uint16 *d = vram_upload_data; + d[0] = swap16(text_msgbox_topleft_copy); + d[1] = 0x2E42; + d[2] = 0x387F; + d[3] = 0xffff; + nmi_load_bg_from_vram = 1; + messaging_module = 0; + submodule_index = 0; + main_module_index = saved_module_for_menu; +} + +void RenderText_Draw_RenderCharacter_All() { // 8eca99 + VWF_RenderSingle(); + if (dialogue_msg_src_offs != 19 && dialogue_msg_src_offs != 59 && dialogue_msg_src_offs != 99) + RenderText_Draw_MessageCharacters(); +} + +void VWF_RenderSingle() { // 8ecab8 + uint8 t = messaging_text_buffer[dialogue_msg_dst_offs]; + if (t != 0x59) + sound_effect_2 = 12; + VWF_RenderCharacter(); + vwf_line_mode = vwf_line_speed; +} + +void VWF_RenderCharacter() { // 8ecb5e + if (vwf_flag_next_line) { + vwf_line_ptr = kVWF_RenderCharacter_renderPos[vwf_curline>>1]; + vwf_var1 = kVWF_RenderCharacter_linePositions[vwf_curline>>1]; + vwf_flag_next_line = 0; + } + uint8 c = messaging_text_buffer[dialogue_msg_dst_offs]; + uint8 width = kVWF_RenderCharacter_widths[c]; + int i = vwf_var1++; + uint8 arrval = vwf_arr[i]; + vwf_arr[i + 1] = arrval + width; + uint16 r10 = (c & 0x70) * 2 + (c & 0xf); + uint16 r0 = arrval * 2; + const uint16 *const kTextBits = GetFontPtr(); + const uint16 *src2 = kTextBits + r10 * 8; + uint8 *mbuf = (uint8 *)messaging_buf; + for (int i = 0; i != 16; i += 2) { + uint16 r4 = *src2++; + int y = r0 + vwf_line_ptr; + int x = (y & 0xff0) + i; + y = (y >> 1) & 7; + uint8 r3 = width; + do { + if (r4 & 0x0080) + mbuf[x + 0] ^= kVWF_RenderCharacter_setMasks[y]; + else + mbuf[x + 0] &= ~kVWF_RenderCharacter_setMasks[y]; + if (r4 & 0x8000) + mbuf[x + 1] ^= kVWF_RenderCharacter_setMasks[y]; + else + mbuf[x + 1] &= ~kVWF_RenderCharacter_setMasks[y]; + r4 = (r4 & ~0x8080) << 1; + //r4 <<= 1; + } while (--r3 && ++y != 8); + x += 16; + if (r4 != 0) + WORD(mbuf[x + 0]) = r4; + } + uint16 r8 = vwf_line_ptr + 0x150; + const uint16 *src3 = kTextBits + (r10 + 16) * 8; + for (int i = 0; i != 16; i += 2) { + uint16 r4 = *src3++; + int y = r8 + r0; + int x = (y & 0xff0) + i; + y = (y >> 1) & 7; + uint8 r3 = width; + do { + if (r4 & 0x0080) + mbuf[x + 0] ^= kVWF_RenderCharacter_setMasks[y]; + else + mbuf[x + 0] &= ~kVWF_RenderCharacter_setMasks[y]; + if (r4 & 0x8000) + mbuf[x + 1] ^= kVWF_RenderCharacter_setMasks[y]; + else + mbuf[x + 1] &= ~kVWF_RenderCharacter_setMasks[y]; + //r4 <<= 1; + r4 = (r4 & ~0x8080) << 1; + } while (--r3 && ++y != 8); + x += 16; + if (r4 != 0) + WORD(mbuf[x + 0]) = r4; + } + dialogue_msg_dst_offs++; +} + +void RenderText_Draw_Choose2LowOr3() { // 8ecd1a + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + sound_effect_2 = 36; + } else if ((filtered_joypad_H | filtered_joypad_L) & 0xc0) { + sound_effect_1 = 43; + text_render_state = 4; + } else if (filtered_joypad_H & 12) { + int t = filtered_joypad_H & 8 ? 0 : 1; + if (choice_in_multiselect_box == t) + return; + choice_in_multiselect_box = t; + sound_effect_2 = 32; + dialogue_message_index = t + 1; + Text_LoadCharacterBuffer(); + text_next_position = 0; + dialogue_msg_dst_offs = 0; + Text_InitVwfState(); + } +} + +void RenderText_Draw_ChooseItem() { // 8ecd88 + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + RenderText_FindYItem_Next(); + } else if ((filtered_joypad_H | filtered_joypad_L) & 0xc0) { + text_render_state = 4; + } else { + if (filtered_joypad_H & 5) { + choice_in_multiselect_box++; + } else if (filtered_joypad_H & 10) { + choice_in_multiselect_box--; + RenderText_FindYItem_Previous(); + RenderText_Refresh(); + return; + } + RenderText_FindYItem_Next(); + RenderText_Refresh(); + } +} + +void RenderText_FindYItem_Previous() { // 8ecdc8 + for (;;) { + uint8 x = choice_in_multiselect_box; + if (sign8(x)) + choice_in_multiselect_box = x = 31; + if (x != 15 && ((&link_item_bow)[x] || x == 32 && (&link_item_bow)[x + 1])) + break; + choice_in_multiselect_box--; + } + RenderText_DrawSelectedYItem(); +} + +void RenderText_FindYItem_Next() { // 8ecded + for (;;) { + uint8 x = choice_in_multiselect_box; + if (x >= 32) + choice_in_multiselect_box = x = 0; + if (x != 15 && ((&link_item_bow)[x] || x == 32 && (&link_item_bow)[x + 1])) + break; + choice_in_multiselect_box++; + } + RenderText_DrawSelectedYItem(); +} + +void RenderText_DrawSelectedYItem() { // 8ece14 + int item = choice_in_multiselect_box; + const uint16 *p = kHudItemBoxGfxPtrs[item]; + p += ((item == 3 || item == 32) ? 1 : (&link_item_bow)[item]) * 4; + uint8 *vwf300 = &g_ram[0x1300]; + memcpy(vwf300 + 0xc2, p, 4); + memcpy(vwf300 + 0xec, p + 2, 4); +} + +void RenderText_Draw_Choose2HiOr3() { // 8ece83 + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + sound_effect_2 = 36; + } else if ((filtered_joypad_H | filtered_joypad_L) & 0xc0) { + sound_effect_1 = 43; + text_render_state = 4; + } else if (filtered_joypad_H & 12) { + int t = filtered_joypad_H & 8 ? 0 : 1; + if (choice_in_multiselect_box == t) + return; + choice_in_multiselect_box = t; + sound_effect_2 = 32; + dialogue_message_index = t + 11; + Text_LoadCharacterBuffer(); + text_next_position = 0; + dialogue_msg_dst_offs = 0; + Text_InitVwfState(); + } +} + +void RenderText_Draw_Choose3() { // 8ecef7 + uint8 y; + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + sound_effect_2 = 36; + } else if ((y = filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0) { + sound_effect_1 = 43; + text_render_state = 4; + } else if (y & 12) { + int choice = choice_in_multiselect_box; + if (y & 8) + choice = (choice == 0) ? 2 : choice - 1; + else + choice = (choice == 2) ? 0 : choice + 1; + choice_in_multiselect_box = choice; + sound_effect_2 = 32; + dialogue_message_index = choice + 6; + Text_LoadCharacterBuffer(); + text_next_position = 0; + dialogue_msg_dst_offs = 0; + Text_InitVwfState(); + } +} + +void RenderText_Draw_Choose1Or2() { // 8ecf72 + uint8 y; + if (text_wait_countdown2 != 0) { + if (--text_wait_countdown2 == 1) + sound_effect_2 = 36; + } else if ((y = filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0) { + sound_effect_1 = 43; + text_render_state = 4; + } else if (y & 12) { + int t = y & 8 ? 0 : 1; + if (choice_in_multiselect_box == t) + return; + choice_in_multiselect_box = t; + sound_effect_2 = 32; + dialogue_message_index = t + 9; + Text_LoadCharacterBuffer(); + text_next_position = 0; + dialogue_msg_dst_offs = 0; + Text_InitVwfState(); + } +} + +void RenderText_Draw_Scroll() { // 8ecfe2 + uint8 r2 = byte_7E1CEA; + do { + for (int i = 0; i < 0x7e0; i += 16) { + uint16 *p = (uint16 *)((uint8 *)messaging_buf + i); + p[0] = p[1]; + p[1] = p[2]; + p[2] = p[3]; + p[3] = p[4]; + p[4] = p[5]; + p[5] = p[6]; + p[6] = p[7]; + p[7] = p[168]; + } + uint16 *p = messaging_buf; + for (int i = 0x34f; i <= 0x3ef; i += 8) + p[i] = 0; + + if ((++byte_7E1CDF & 0xf) == 0) { + dialogue_msg_dst_offs++; + dialogue_msg_src_offs = 80; + vwf_curline = 4; + vwf_flag_next_line = 1; + text_next_position = 0; + break; + } + } while (r2--); +} + +void RenderText_Draw_Command7B() { // 8ed18d + int i = (messaging_text_buffer[dialogue_msg_dst_offs + 1] & 0x7f); + int j = dialogue_msg_src_offs; + WORD(g_ram[0x2D8 + j]) = kVWF_Command7B[i * 2 + 0]; + WORD(g_ram[0x300 + j]) = kVWF_Command7B[i * 2 + 1]; + dialogue_msg_src_offs = j + 2; + dialogue_msg_dst_offs += 2; + RenderText_Draw_MessageCharacters(); +} + +void RenderText_Draw_ABunchOfSpaces() { // 8ed1bd + int i = (messaging_text_buffer[dialogue_msg_dst_offs + 1] & 0x7f); + int j = dialogue_msg_src_offs; + WORD(g_ram[0x2D8 + j]) = kVWF_Command7C[i * 4 + 0]; + WORD(g_ram[0x300 + j]) = kVWF_Command7C[i * 4 + 1]; + WORD(g_ram[0x2DA + j]) = kVWF_Command7C[i * 4 + 2]; + WORD(g_ram[0x302 + j]) = kVWF_Command7C[i * 4 + 3]; + dialogue_msg_src_offs = j + 4; + dialogue_msg_dst_offs += 2; + RenderText_Draw_MessageCharacters(); +} + +void RenderText_Draw_EmptyBuffer() { // 8ed1f9 + memset(messaging_buf, 0, 0x7e0); + dialogue_msg_src_offs = 0; + dialogue_msg_dst_offs++; + text_next_position = 0; +} + +void RenderText_SetDefaultWindowPosition() { // 8ed280 + uint16 y = link_y_coord - BG2VOFS_copy2; + int flag = (y < 0x78); + text_msgbox_topleft = kText_Positions[flag]; +} + +void RenderText_DrawBorderInitialize() { // 8ed29c + text_msgbox_topleft_copy = text_msgbox_topleft; +} + +uint16 *RenderText_DrawBorderRow(uint16 *d, int y) { // 8ed2ab + y >>= 1; + *d++ = swap16(text_msgbox_topleft_copy); + text_msgbox_topleft_copy += 0x20; + *d++ = 0x2F00; + *d++ = kText_BorderTiles[y]; + for(int i = 0; i < 22; i++) + *d++ = kText_BorderTiles[y+1]; + *d++ = kText_BorderTiles[y+2]; + *d = 0xffff; + return d; +} + +void Text_BuildCharacterTilemap() { // 8ed2ec + uint16 *vwf300 = (uint16 *)&g_ram[0x1300]; + for (int i = 0; i < 126; i++) + vwf300[i] = text_tilemap_cur++; + RenderText_Refresh(); +} + +void RenderText_Refresh() { // 8ed307 + RenderText_DrawBorderInitialize(); + text_msgbox_topleft_copy += 0x21; + uint16 *d = vram_upload_data; + uint16 *s = (uint16 *)&g_ram[0x1300]; + for (int j = 0; j != 6; j++) { + *d++ = swap16(text_msgbox_topleft_copy); + text_msgbox_topleft_copy += 0x20; + *d++ = 0x2900; + for (int i = 0; i != 21; i++) + *d++ = *s++; + } + *d = 0xffff; + nmi_load_bg_from_vram = 1; +} + +void Text_GenerateMessagePointers() { // 8ed3eb + const uint8 *src = kDialogueText; + uint32 p = 0x1c8000; + uint8 *dst = kTextDialoguePointers; + for (int i = 0;; i++) { + if (i == 359) + p = 0xedf40; + WORD(dst[0]) = p; + dst[2] = p >> 16; + dst += 3; + + if (i == 397) + break; + + for (;;) { + int j = *src; + int len = (j >= 0x67 && j < 0x80) ? kText_CommandLengths[j - 0x67] : 1; + src += len; + p += len; + if (j == 0x7f) + break; + } + } +} + +void DungMap_LightenUpMap() { // 8ed940 + if (++INIDISP_copy == 0xf) + overworld_map_state++; +} + +void DungMap_Backup() { // 8ed94c + if (--INIDISP_copy) + return; + MOSAIC_copy = 3; + mapbak_HDMAEN = HDMAEN_copy; + EnableForceBlank(); + overworld_map_state++; + dungmap_init_state = 0; + COLDATA_copy0 = 0x20; + COLDATA_copy1 = 0x40; + COLDATA_copy2 = 0x80; + link_dma_graphics_index = 0x250; + memcpy(mapbak_palette, main_palette_buffer, sizeof(uint16) * 256); + mapbak_bg1_x_offset = bg1_x_offset; + mapbak_bg1_y_offset = bg1_y_offset; + bg1_x_offset = 0; + bg1_y_offset = 0; + mapbak_BG1HOFS_copy2 = BG1HOFS_copy2; + mapbak_BG2HOFS_copy2 = BG2HOFS_copy2; + mapbak_BG1VOFS_copy2 = BG1VOFS_copy2; + mapbak_BG2VOFS_copy2 = BG2VOFS_copy2; + BG1HOFS_copy2 = BG1VOFS_copy2 = 0; + BG2HOFS_copy2 = BG2VOFS_copy2 = 0; + BG3HOFS_copy2 = BG3VOFS_copy2 = 0; + mapbak_CGWSEL = WORD(CGWSEL_copy); + WORD(CGWSEL_copy) = 0x2002; + for (int i = 0; i < 2048; i++) + messaging_buf[i] = 0x300; + sound_effect_2 = 16; + music_control = 0xf2; +} + +void DungMap_FadeMapToBlack() { // 8eda37 + if (--INIDISP_copy) + return; + EnableForceBlank(); + overworld_map_state++; + WORD(CGWSEL_copy) = mapbak_CGWSEL; + BG1HOFS_copy2 = mapbak_BG1HOFS_copy2; + BG2HOFS_copy2 = mapbak_BG2HOFS_copy2; + BG1VOFS_copy2 = mapbak_BG1VOFS_copy2; + BG2VOFS_copy2 = mapbak_BG2VOFS_copy2; + BG3VOFS_copy2 = BG3HOFS_copy2 = 0; + bg1_x_offset = mapbak_bg1_x_offset; + bg1_y_offset = mapbak_bg1_y_offset; + flag_update_cgram_in_nmi++; +} + +void DungMap_RestoreOld() { // 8eda79 + OrientLampLightCone(); + if (++INIDISP_copy != 0xf) + return; + main_module_index = saved_module_for_menu; + submodule_index = 0; + overworld_map_state = 0; + subsubmodule_index = 0; + INIDISP_copy = 0xf; + HDMAEN_copy = mapbak_HDMAEN; +} + +void Death_PlayerSwoon() { // 8ff5e3 + int k = link_var30d; + if (sign8(--some_animation_timer)) { + k++; + if (k == 15) + return; + if (k == 14) + submodule_index++; + link_var30d = k; + some_animation_timer_steps = kDeath_AnimCtr0[k]; + some_animation_timer = kDeath_AnimCtr1[k]; + } + if (k != 13 || link_visibility_status == 12) + return; + uint8 y = link_y_coord + 16 - BG2VOFS_copy2; + uint8 x = link_x_coord + 7 - BG2HOFS_copy2; + + int spr = 0x74; + bytewise_extended_oam[spr] = 2; + oam_buf[spr].x = x; + oam_buf[spr].y = y; + oam_buf[spr].charnum = 0xaa; + oam_buf[spr].flags = kDeath_SprFlags[link_is_on_lower_level] | 2; +} + +void Death_PrepFaint() { // 8ffa6f + link_direction_facing = 2; + player_unk1 = 1; + link_var30d = 0; + some_animation_timer_steps = 0; + some_animation_timer = 5; + link_hearts_filler = 0; + link_health_current = 0; + Link_ResetProperties_C(); + player_on_somaria_platform = 0; + draw_water_ripples_or_grass = 0; + link_is_bunny_mirror = 0; + bitmask_of_dragstate = 0; + flag_is_ancilla_to_pick_up = 0; + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + link_give_damage = 0; + link_is_transforming = 0; + link_speed_setting = 0; + link_need_for_poof_for_transform = 0; + if (link_item_moon_pearl) + link_is_bunny = 0; + link_timer_tempbunny = 0; + sound_effect_1 = 0x27 | Link_CalculateSfxPan(); + for (int i = 0; i != 4; i++) { + if (link_bottle_info[i] == 6) + return; + } + index_of_changable_dungeon_objs[0] = index_of_changable_dungeon_objs[1] = 0; +} + diff --git a/messaging.h b/messaging.h new file mode 100644 index 00000000..cc7d1db4 --- /dev/null +++ b/messaging.h @@ -0,0 +1,139 @@ +#pragma once +#include "types.h" + +const uint8 *GetDungmapFloorLayout(); +uint8 GetOtherDungmapInfo(int count); +void DungMap_4(); +const uint8 *GetCurrentTextPtr(); +void Module_Messaging_6(); +void OverworldMap_SetupHdma(); +const uint8 *GetLightOverworldTilemap(); +void SaveGameFile(); +void TransferMode7Characters(); +void Module0E_Interface(); +void Module_Messaging_0(); +void Module0E_05_DesertPrayer(); +void Module0E_04_RedPotion(); +void Module0E_08_GreenPotion(); +void Module0E_09_BluePotion(); +void Module0E_0B_SaveMenu(); +void Module1B_SpawnSelect(); +void CleanUpAndPrepDesertPrayerHDMA(); +void DesertPrayer_InitializeIrisHDMA(); +void DesertPrayer_BuildIrisHDMATable(); +Pair16U DesertHDMA_CalculateIrisShapeLine(); +void Animate_GAMEOVER_Letters(); +void GameOverText_SweepLeft(); +void GameOverText_UnfurlRight(); +void Module12_GameOver(); +void GameOver_AdvanceImmediately(); +void Death_Func1(); +void GameOver_DelayBeforeIris(); +void GameOver_IrisWipe(); +void GameOver_SplatAndFade(); +void Death_Func6(); +void Death_Func4(); +void Animate_GAMEOVER_Letters_bounce(); +void GameOver_Finalize_GAMEOVR(); +void GameOver_SaveAndOrContinue(); +void Death_Func15(); +void GameOver_AnimateChoiceFairy(); +void GameOver_InitializeRevivalFairy(); +void RevivalFairy_Main_bounce(); +void GameOver_RiseALittle(); +void GameOver_Restore0D(); +void GameOver_Restore0E(); +void GameOver_ResituateLink(); +void Module0E_0A_FluteMenu(); +void FluteMenu_HandleSelection(); +void FluteMenu_LoadSelectedScreen(); +void Overworld_LoadOverlayAndMap(); +void FluteMenu_FadeInAndQuack(); +void BirdTravel_Finish_Doit(); +void Messaging_OverworldMap(); +void WorldMap_FadeOut(); +void WorldMap_LoadLightWorldMap(); +void WorldMap_LoadDarkWorldMap(); +void WorldMap_LoadSpriteGFX(); +void WorldMap_Brighten(); +void WorldMap_PlayerControl(); +void WorldMap_RestoreGraphics(); +void Attract_SetUpConclusionHDMA(); +void WorldMap_ExitMap(); +void WorldMap_SetUpHDMA(); +void WorldMap_FillTilemapWithEF(); +void WorldMap_HandleSprites(); +bool WorldMap_CalculateOamCoordinates(PointU8 *pt); +void WorldMap_HandleSpriteBlink(int spr, uint8 r11_ext, uint8 r12_flags, uint8 r13_char, uint8 r14_x, uint8 r15_y); +bool OverworldMap_CheckForPendant(int k); +bool OverworldMap_CheckForCrystal(int k); +void Module0E_03_DungeonMap(); +void Module0E_03_01_DrawMap(); +void Module0E_03_01_00_PrepMapGraphics(); +void Module0E_03_01_01_DrawLEVEL(); +void Module0E_03_01_02_DrawFloorsBackdrop(); +void DungeonMap_BuildFloorListBoxes(uint8 t5, uint16 r14); +void Module0E_03_01_03_DrawRooms(); +void DungeonMap_DrawBorderForRooms(uint16 pd, uint16 mask); +void DungeonMap_DrawFloorNumbersByRoom(uint16 pd, uint16 r8); +void DungeonMap_DrawDungeonLayout(int pd); +void DungeonMap_DrawSingleRowOfRooms(int i, int arg_x); +void DungeonMap_DrawRoomMarkers(); +void DungeonMap_HandleInputAndSprites(); +void DungeonMap_HandleInput(); +void DungeonMap_HandleMovementInput(); +void DungeonMap_HandleFloorSelect(); +void DungeonMap_ScrollFloors(); +void DungeonMap_DrawSprites(); +void DungeonMap_DrawLinkPointing(int spr_pos, uint8 r2, uint8 r3); +int DungeonMap_DrawBlinkingIndicator(int spr_pos); +int DungeonMap_DrawLocationMarker(int spr_pos, uint16 r14); +int DungeonMap_DrawFloorNumberObjects(int spr_pos); +void DungeonMap_DrawFloorBlinker(); +int DungeonMap_DrawBossIcon(int spr_pos); +int DungeonMap_DrawBossIconByFloor(int spr_pos); +void DungeonMap_RecoverGFX(); +void ToggleStarTilesAndAdvance(); +void Death_InitializeGameOverLetters(); +void CopySaveToWRAM(); +void RenderText(); +void RenderText_PostDeathSaveOptions(); +void Text_Initialize(); +void Text_Initialize_initModuleStateLoop(); +void Text_InitVwfState(); +void Text_LoadCharacterBuffer(); +uint8 *Text_WritePlayerName(uint8 *p); +uint8 Text_FilterPlayerNameCharacters(uint8 a); +void Text_Render(); +void RenderText_Draw_Border(); +void RenderText_Draw_BorderIncremental(); +void RenderText_Draw_CharacterTilemap(); +void RenderText_Draw_MessageCharacters(); +void RenderText_Draw_Finish(); +void RenderText_Draw_RenderCharacter_All(); +void VWF_RenderSingle(); +void VWF_RenderCharacter(); +void RenderText_Draw_Choose2LowOr3(); +void RenderText_Draw_ChooseItem(); +void RenderText_FindYItem_Previous(); +void RenderText_FindYItem_Next(); +void RenderText_DrawSelectedYItem(); +void RenderText_Draw_Choose2HiOr3(); +void RenderText_Draw_Choose3(); +void RenderText_Draw_Choose1Or2(); +void RenderText_Draw_Scroll(); +void RenderText_Draw_Command7B(); +void RenderText_Draw_ABunchOfSpaces(); +void RenderText_Draw_EmptyBuffer(); +void RenderText_SetDefaultWindowPosition(); +void RenderText_DrawBorderInitialize(); +uint16 *RenderText_DrawBorderRow(uint16 *d, int y); +void Text_BuildCharacterTilemap(); +void RenderText_Refresh(); +void Text_GenerateMessagePointers(); +void DungMap_LightenUpMap(); +void DungMap_Backup(); +void DungMap_FadeMapToBlack(); +void DungMap_RestoreOld(); +void Death_PlayerSwoon(); +void Death_PrepFaint(); diff --git a/misc.cpp b/misc.cpp new file mode 100644 index 00000000..a5927bb8 --- /dev/null +++ b/misc.cpp @@ -0,0 +1,962 @@ +#include "misc.h" +#include "variables.h" +#include "hud.h" +#include "dungeon.h" +#include "overworld.h" +#include "load_gfx.h" +#include "sprite.h" +#include "poly.h" +#include "ancilla.h" +#include "select_file.h" +#include "tile_detect.h" +#include "player.h" +#include "other_modules.h" +#include "player_oam.h" +#include "messaging.h" +#include "ending.h" +#include "attract.h" +#include "tables/generated_predefined_tiles.h" +#include "tables/generated_sound_banks.h" + +static void KillAgahnim_LoadMusic(); +static void KillAghanim_Init(); +static void KillAghanim_Func2(); +static void KillAghanim_Func3(); +static void KillAghanim_Func4(); +static void KillAghanim_Func5(); +static void KillAghanim_Func6(); +static void KillAghanim_Func7(); +static void KillAghanim_Func8(); +static void KillAghanim_Func12(); +static uint8 PlaySfx_SetPan(uint8 a); + +const uint8 kReceiveItem_Tab1[76] = { + 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, + 2, 2, 2, 0, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, +}; +static const int8 kReceiveItem_Tab2[76] = { + -5, -5, -5, -5, -5, -4, -4, -5, -5, -4, -4, -4, -2, -4, -4, -4, + -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -4, -5, -4, -4, -4, -4, -4, -4, -2, -4, -4, -4, -4, -4, + -4, -4, -4, -4, -2, -2, -2, -4, -4, -4, -4, -4, -4, -4, -4, -4, + -4, -4, -2, -2, -4, -2, -4, -4, -4, -5, -4, -4, +}; +static const uint8 kReceiveItem_Tab3[76] = { + 4, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 4, 5, 0, 0, 0, + 0, 0, 0, 4, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, +}; +const uint8 kReceiveItemGfx[76] = { + 6, 0x18, 0x18, 0x18, 0x2d, 0x20, 0x2e, 9, 9, 0xa, 8, 5, 0x10, 0xb, 0x2c, 0x1b, + 0x1a, 0x1c, 0x14, 0x19, 0xc, 7, 0x1d, 0x2f, 7, 0x15, 0x12, 0xd, 0xd, 0xe, 0x11, 0x17, + 0x28, 0x27, 4, 4, 0xf, 0x16, 3, 0x13, 1, 0x1e, 0x10, 0, 0, 0, 0, 0, + 0, 0x30, 0x22, 0x21, 0x24, 0x24, 0x24, 0x23, 0x23, 0x23, 0x29, 0x2a, 0x2c, 0x2b, 3, 3, + 0x34, 0x35, 0x31, 0x33, 2, 0x32, 0x36, 0x37, 0x2c, 6, 0xc, 0x38, +}; +const uint16 kMemoryLocationToGiveItemTo[76] = { + 0xf359, 0xf359, 0xf359, 0xf359, + 0xf35a, 0xf35a, 0xf35a, 0xf345, + 0xf346, 0xf34b, 0xf342, 0xf340, + 0xf341, 0xf344, 0xf35c, 0xf347, + 0xf348, 0xf349, 0xf34a, 0xf34c, + 0xf34c, 0xf350, 0xf35c, 0xf36b, + 0xf351, 0xf352, 0xf353, 0xf354, + 0xf354, 0xf34e, 0xf356, 0xf357, + 0xf37a, 0xf34d, 0xf35b, 0xf35b, + 0xf36f, 0xf364, 0xf36c, 0xf375, + 0xf375, 0xf344, 0xf341, 0xf35c, + 0xf35c, 0xf35c, 0xf36d, 0xf36e, + 0xf36e, 0xf375, 0xf366, 0xf368, + 0xf360, 0xf360, 0xf360, 0xf374, + 0xf374, 0xf374, 0xf340, 0xf340, + 0xf35c, 0xf35c, 0xf36c, 0xf36c, + 0xf360, 0xf360, 0xf372, 0xf376, + 0xf376, 0xf373, 0xf360, 0xf360, + 0xf35c, 0xf359, 0xf34c, 0xf355, +}; +static const int8 kValueToGiveItemTo[76] = { + 1, 2, 3, 4, + 1, 2, 3, 1, + 1, 1, 1, 1, + 1, 2, -1, 1, + 1, 1, 1, 1, + 2, 1, -1, -1, + 1, 1, 2, 1, + 2, 1, 1, 1, + -1, 1, -1, 2, + -1, -1, -1, -1, + -1, -1, 2, -1, + -1, -1, -1, -1, + -1, -1, -1, -1, + -1, -5, -20, -1, + -1, -1, 1, 3, + -1, -1, -1, -1, + -100, -50, -1, 1, + 10, -1, -1, -1, + -1, 1, 3, 1, +}; +static const uint8 kDungeon_DefaultAttr[384] = { + 1, 1, 1, 0, 2, 1, 2, 0, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 1, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 0, 0, + 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 0, 0, + 0, 0, 0, 0x2a, 1, 0x20, 1, 1, 4, 1, 1, 0x18, 1, 2, 0x1c, 1, + 0x28, 0x28, 0x2a, 0x2a, 1, 2, 1, 1, 4, 0, 0, 0, 0x28, 1, 0xa, 0, + 1, 1, 0xc, 0xc, 2, 2, 2, 2, 0x28, 0x2a, 0x20, 0x20, 0x20, 2, 8, 0, + 4, 4, 1, 1, 1, 2, 2, 2, 0, 0, 0x20, 0x20, 0, 2, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x18, 0x10, 0x10, 1, 1, 1, + 1, 1, 4, 4, 4, 4, 4, 4, 1, 2, 2, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x62, 0x62, + 0, 0, 0x24, 0x24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x62, 0x62, + 0x27, 2, 2, 2, 0x27, 0x27, 1, 0, 0, 0, 0, 0x24, 0, 0, 0, 0, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x10, 2, 1, 0, 0, 0, 0x24, 0, 0, 0, 0, + 0x27, 2, 2, 2, 0x27, 0x27, 0x27, 0x27, 2, 2, 2, 0x24, 0, 0, 0, 0, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x20, 2, 2, 1, 2, 2, 0x23, 2, 0, 0, 0, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x20, 2, 0x27, 2, 0x54, 0, 0, 0x27, 2, 2, 2, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 2, 0x27, 2, 0x54, 0, 0, 0x27, 2, 2, 2, + 0x27, 0x27, 0, 0x27, 0x60, 0x60, 1, 1, 1, 1, 2, 2, 0xd, 0, 0, 0x4b, + 0x67, 0x67, 0x67, 0x67, 0x66, 0x66, 0x66, 0x66, 0, 0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x27, 0x63, 0x27, 0x55, 0x55, 1, 0x44, 0, 1, 0x20, 2, 2, 0x1c, 0x3a, 0x3b, 0, + 0x27, 0x63, 0x27, 0x53, 0x53, 1, 0x44, 1, 0xd, 0, 0, 0, 9, 9, 9, 9, +}; +static PlayerHandlerFunc *const kModule_BossVictory[6] = { + &BossVictory_Heal, + &Dungeon_StartVictorySpin, + &Dungeon_RunVictorySpin, + &Dungeon_CloseVictorySpin, + &Dungeon_PrepExitWithSpotlight, + &Spotlight_ConfigureTableAndControl, +}; +static PlayerHandlerFunc *const kModule_KillAgahnim[13] = { + &KillAgahnim_LoadMusic, + &KillAghanim_Init, + &KillAghanim_Func2, + &KillAghanim_Func3, + &KillAghanim_Func4, + &KillAghanim_Func5, + &KillAghanim_Func6, + &KillAghanim_Func7, + &KillAghanim_Func8, + &BossVictory_Heal, + &Dungeon_StartVictorySpin, + &Dungeon_RunVictorySpin, + &KillAghanim_Func12, +}; +static PlayerHandlerFunc *const kMainRouting[28] = { + &Module00_Intro, + &Module01_FileSelect, + &Module02_CopyFile, + &Module03_KILLFile, + &Module04_NameFile, + &Module05_LoadFile, + &Module_PreDungeon, + &Module07_Dungeon, + &Module08_OverworldLoad, + &Module09_Overworld, + &Module08_OverworldLoad, + &Module09_Overworld, + &Module_Unknown0, + &Module_Unknown1, + &Module0E_Interface, + &Module0F_SpotlightClose, + &Module10_SpotlightOpen, + &Module11_DungeonFallingEntrance, + &Module12_GameOver, + &Module13_BossVictory_Pendant, + &Module14_Attract, + &Module15_MirrorWarpFromAga, + &Module16_BossVictory_Crystal, + &Module17_SaveAndQuit, + &Module18_GanonEmerges, + &Module19_TriforceRoom, + &Module1A_Credits, + &Module1B_SpawnSelect, +}; + +const uint16 *SrcPtr(uint16 src) { + return &kPredefinedTileData[src >> 1]; +} + +uint8 Ancilla_Sfx2_Near(uint8 a) { + return sound_effect_1 = PlaySfx_SetPan(a); +} + +void Ancilla_Sfx3_Near(uint8 a) { + sound_effect_2 = PlaySfx_SetPan(a); +} + +void LoadDungeonRoomRebuildHUD() { + mosaic_level = 0; + MOSAIC_copy = 7; + Hud_SearchForEquippedItem(); + Hud_Rebuild(); + Hud_UpdateEquippedItem(); + Module_PreDungeon(); +} + +void Module_Unknown0() { + assert(0); +} + +void Module_Unknown1() { + assert(0); +} + +static void KillAgahnim_LoadMusic() { + nmi_disable_core_updates = 0; + overworld_map_state++; + submodule_index++; + LoadOWMusicIfNeeded(); +} + +static void KillAghanim_Init() { + music_control = 8; + BYTE(overworld_screen_trans_dir_bits) = 8; + InitializeMirrorHDMA(); + overworld_map_state = 0; + PaletteFilter_InitializeWhiteFilter(); + Overworld_LoadGFXAndScreenSize(); + submodule_index++; + link_player_handler_state = kPlayerState_Mirror; + bg1_x_offset = 0; + bg1_y_offset = 0; + dung_savegame_state_bits = 0; + WORD(link_y_vel) = 0; + main_palette_buffer[0] = 0x7fff; + main_palette_buffer[32] = 0x7fff; + Ancilla_TerminateSelectInteractives(0); + Link_ResetProperties_A(); +} + +static void KillAghanim_Func2() { + HDMAEN_copy = 192; + MirrorWarp_BuildWavingHDMATable(); + submodule_index++; + subsubmodule_index = 0; +} + +static void KillAghanim_Func3() { + MirrorWarp_BuildWavingHDMATable(); + if (subsubmodule_index) { + subsubmodule_index = 0; + submodule_index++; + } +} + +static void KillAghanim_Func4() { + MirrorWarp_BuildDewavingHDMATable(); + if (subsubmodule_index) { + subsubmodule_index = 0; + submodule_index++; + } +} + +static void KillAghanim_Func5() { + HdmaSetup(0, 0xf2fb, 0x41, 0, (uint8)WH0, 0); + for (int i = 0; i < 224; i++) + mode7_hdma_table[i] = 0xff00; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + dialogue_message_index = 0x35; + Main_ShowTextMessage(); + ReloadPreviouslyLoadedSheets(); + Hud_RebuildIndoor(); + HDMAEN_copy = 0x80; + main_module_index = 21; + submodule_index = 6; + subsubmodule_index = 24; +} + +static void KillAghanim_Func6() { + if (!--subsubmodule_index) { + submodule_index++; + sound_effect_ambient = 9; + } +} + +static void KillAghanim_Func7() { + RenderText(); + if (!submodule_index) { + overworld_map_state = 0; + sound_effect_ambient = 5; + if (!link_item_moon_pearl) { + dialogue_message_index = 0x36; + Main_ShowTextMessage(); + sound_effect_ambient = 0; + main_module_index = 21; + submodule_index = 8; + } else { + submodule_index = 9; + } + } +} + +static void KillAghanim_Func8() { + RenderText(); + if (!submodule_index) { + subsubmodule_index = 32; + submodule_index = 12; + } +} + +static void KillAghanim_Func12() { + if (--subsubmodule_index) + return; + ResetAncillaAndCutscene(); + Overworld_SetSongList(); + save_ow_event_info[0x1b] |= 32; + BYTE(cur_palace_index_x2) = 255; + submodule_index = 0; + overworld_map_state = 0; + nmi_disable_core_updates = 0; + main_module_index = 9; + BYTE(BG1VOFS_copy2) = 0; + music_control = link_item_moon_pearl ? 9 : 4; + savegame_map_icons_indicator = 6; +} + +void Module_MainRouting() { // 8080b5 + kMainRouting[main_module_index](); +} + +void NMI_PrepareSprites() { // 8085fc + static const uint16 kLinkDmaSources1[303] = { + 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x9440, 0x8080, 0x8080, 0x8080, 0x9400, 0x8040, 0x80c0, 0x80c0, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, + 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8000, 0xa8c0, 0xa900, 0x8000, 0xa8c0, 0xa900, + 0x9100, 0x8080, 0x8080, 0x90c0, 0x8040, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x9a00, 0x9140, 0x9180, 0x8000, 0x9500, + 0x9480, 0x94c0, 0x94c0, 0x9ae0, 0x8080, 0x8080, 0x9a60, 0x80c0, 0x80c0, 0x9aa0, 0x8000, 0x8000, 0x9aa0, 0x8000, 0x8000, 0x8080, + 0x8080, 0x8100, 0x8100, 0x85c0, 0x8000, 0x8000, 0x85c0, 0x8000, 0x8000, 0xadc0, 0xadc0, 0xadc0, 0xadc0, 0xadc0, 0xad40, 0xad40, + 0xad40, 0xad40, 0xad40, 0xad80, 0xad80, 0xad80, 0xad80, 0xad80, 0xad80, 0x8040, 0x9400, 0x8040, 0x8000, 0x8080, 0x8080, 0x9440, + 0x8000, 0x8000, 0x8000, 0x8000, 0x8080, 0x8040, 0x8040, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xc440, 0x8140, 0x8140, + 0xca40, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8040, 0x85c0, 0x8040, 0x85c0, 0x8100, 0x80c0, 0x91c0, 0x8080, 0x8080, + 0x8040, 0x8040, 0x8000, 0x8000, 0x8000, 0x8000, 0x8080, 0x8080, 0x9100, 0xa0c0, 0xa100, 0xa100, 0xa1c0, 0xa400, 0xa440, 0xa1c0, + 0xa400, 0xa440, 0x8080, 0xc480, 0x8080, 0x8040, 0x8040, 0xca80, 0xca80, 0xca00, 0xc400, 0xca00, 0xc400, 0x81c0, 0x8080, 0x8080, + 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8040, 0x8000, 0xa8c0, 0xa900, + 0x8000, 0x8000, 0xa8c0, 0xa900, 0x8000, 0xa8c0, 0xa900, 0x8000, 0x8000, 0xa8c0, 0xa900, 0x8040, 0x8040, 0x8040, 0x8080, 0x8080, + 0x8040, 0x8040, 0x8040, 0x8040, 0x8000, 0x8000, 0x8000, 0x8000, 0xd080, 0x8080, 0x90c0, 0xd000, 0x9080, 0xd040, 0x9080, 0xd040, + 0xd080, 0xd080, 0xd080, 0xd080, 0xd080, 0xd000, 0xd000, 0xd000, 0xd000, 0xd000, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, 0xd040, + 0x8040, 0xd000, 0x85c0, 0x85c0, 0x85c0, 0xdc40, 0xdc40, 0xdc40, 0x85c0, 0x85c0, 0x85c0, 0xdc40, 0xdc40, 0xdc40, 0xe1c0, 0xd000, + 0x8000, 0xe400, 0xe400, 0xe440, 0x90c0, 0x90c0, 0xd000, 0x8000, 0x8000, 0xd040, 0x8000, 0x8000, 0xd040, 0xe400, 0xe400, 0xe400, + 0x9080, 0xa5c0, 0xac40, 0xe480, 0x8180, 0x90c0, 0x80c0, 0xe180, 0xd000, 0xe4c0, 0xe4c0, 0xe840, 0xe840, 0xe840, 0xe540, 0xe540, + 0xe540, 0xe900, 0xe900, 0xe900, 0xe900, 0x8080, 0x8080, 0x8000, 0xa9c0, 0x8080, 0x8140, 0x91c0, 0x8040, 0xa800, 0xa840, + }; + static const uint16 kLinkDmaSources2[303] = { + 0x8840, 0x8800, 0x8580, 0x8800, 0x8580, 0x84c0, 0x8500, 0x8540, 0x8500, 0x8540, 0x8400, 0x8440, 0x8480, 0x8400, 0x8440, 0x8480, + 0x9640, 0x8c40, 0x8c80, 0xad00, 0x9600, 0x8980, 0x8c00, 0xacc0, 0x8880, 0x88c0, 0x8900, 0x8940, 0x8880, 0x88c0, 0x8900, 0x8940, + 0xb0c0, 0xb100, 0xb140, 0xb100, 0xb140, 0xb000, 0xb040, 0xb080, 0xec80, 0xecc0, 0xb180, 0xd440, 0xb1c0, 0xb180, 0xd440, 0xb1c0, + 0x8c80, 0xad00, 0x95c0, 0x99c0, 0xb440, 0x9580, 0xb480, 0xb4c0, 0x9580, 0xb480, 0xb4c0, 0x9c20, 0x8000, 0x8000, 0x8000, 0x9700, + 0x9680, 0x96c0, 0x96c0, 0x9ce0, 0x8c80, 0xb540, 0x9c60, 0xb580, 0x8c00, 0x9ca0, 0x8900, 0xb500, 0x9ca0, 0x8900, 0xb500, 0x8c40, + 0xec40, 0x8c00, 0xec00, 0x8dc0, 0x9540, 0x89c0, 0x8dc0, 0x9540, 0x89c0, 0xb940, 0xb980, 0xb9c0, 0xb980, 0xb9c0, 0xb5c0, 0xb800, + 0xb840, 0xb800, 0xb840, 0xb880, 0xb8c0, 0xb900, 0xb880, 0xb8c0, 0xb900, 0x8980, 0x9600, 0xbcc0, 0x8400, 0xbc80, 0x8c40, 0x9640, + 0xa040, 0xa080, 0xa000, 0xbc40, 0xbd40, 0x8500, 0xbd00, 0xbd80, 0xbd80, 0x88c0, 0x8900, 0xe9c0, 0x8900, 0xc640, 0xc040, 0xc000, + 0xcc40, 0x8940, 0x88c0, 0x8900, 0xe9c0, 0x8900, 0x8940, 0x8d40, 0x8d80, 0x8d40, 0x8d80, 0xbd00, 0xb000, 0xb000, 0xa480, 0xa480, + 0xa480, 0xa480, 0xac00, 0xac00, 0xac00, 0xac00, 0xa140, 0xa180, 0xa180, 0xa4c0, 0xa4c0, 0xa500, 0x9d40, 0x9d80, 0x9dc0, 0x9d40, + 0x9d80, 0x9dc0, 0x8d00, 0xc680, 0xc180, 0xc140, 0x8c00, 0xcc80, 0xcc80, 0xcc00, 0xc600, 0xcc00, 0xc600, 0xbd00, 0x8580, 0x8800, + 0xc9c0, 0xccc0, 0xcdc0, 0xcd00, 0xcd40, 0xcd80, 0x8500, 0x8540, 0xc940, 0xc980, 0x8540, 0xc940, 0xc980, 0x8440, 0x8480, 0xc1c0, + 0xc900, 0xc580, 0xc5c0, 0xc8c0, 0x8440, 0x8480, 0xc1c0, 0xc900, 0xc580, 0xc5c0, 0xc8c0, 0xbd00, 0xacc0, 0xc040, 0xd540, 0xd580, + 0xd4c0, 0xd500, 0xd4c0, 0xd500, 0xd440, 0xd480, 0xd440, 0xd480, 0xd1c0, 0xd400, 0xd100, 0xd100, 0xd140, 0xd180, 0xd140, 0xd180, + 0xb0c0, 0xb100, 0xb140, 0xb100, 0xb140, 0xdd40, 0xdd80, 0xddc0, 0xdd80, 0xddc0, 0xdc80, 0xdcc0, 0xdd00, 0xdc80, 0xdcc0, 0xdd00, + 0xd100, 0xd100, 0xe000, 0xe040, 0xe080, 0xe0c0, 0xe100, 0xe140, 0xe000, 0xe040, 0xe080, 0xe0c0, 0xe100, 0xe140, 0x8000, 0xd0c0, + 0x8000, 0xb940, 0xb980, 0xb940, 0xdd40, 0xdd80, 0xdd40, 0xdc80, 0xdcc0, 0xc0c0, 0xdc80, 0xdcc0, 0xc0c0, 0xb9c0, 0xb980, 0xb9c0, + 0xa560, 0xa5a0, 0xac80, 0xed00, 0x8000, 0x8cc0, 0xbd00, 0xe380, 0xbdc0, 0xe500, 0xe500, 0xe880, 0xe8c0, 0xe8c0, 0xe800, 0xe5c0, + 0xe5c0, 0xe940, 0xe980, 0xe940, 0xe980, 0xbd40, 0x8c80, 0xa080, 0x8000, 0xa980, 0xbd00, 0xbdc0, 0xb400, 0xa880, 0xedc0, + }; + static const uint16 kLinkDmaSources3[27] = { + 0x9a40, 0x9e00, 0x9d20, 0x9f20, 0x9b20, 0xbc20, 0xbc20, 0xbe20, 0xbe20, 0xbe00, 0xbe00, 0xbe00, 0xbe00, 0xa540, 0xa540, 0xa540, + 0xa540, 0xbc00, 0xbc00, 0xbc00, 0xbc00, 0xa740, 0xa740, 0xa740, 0xa740, 0xe780, 0xe780, + }; + static const uint16 kLinkDmaSources4[8] = { 0x9000, 0x9020, 0x9060, 0x91e0, 0x90a0, 0x90c0, 0x9100, 0x9140 }; + static const uint16 kLinkDmaSources5[3] = { 0x9300, 0x9340, 0x9380 }; + static const uint16 kLinkDmaSources6[128] = { + 0x9480, 0x94c0, 0x94e0, 0x95c0, 0x9500, 0x9520, 0x9540, 0x9480, 0x9640, 0x9680, 0x96a0, 0x9780, 0x96c0, 0x96e0, 0x9700, 0x9480, + 0x9800, 0x9840, 0x98a0, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9ac0, 0x9b00, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, + 0x9bc0, 0x9c00, 0x9c40, 0x9c80, 0x9cc0, 0x9d00, 0x9d40, 0x9480, 0x9f40, 0x9f80, 0x9fc0, 0x9fe0, 0xa000, 0x9480, 0x9480, 0x9480, + 0xa100, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, + 0x98c0, 0x9900, 0x99c0, 0x99e0, 0x9a00, 0x9a20, 0x9a40, 0x9a60, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, + 0x9a80, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, + 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, + 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, 0x9480, + }; + static const uint16 kLinkDmaSources7[16] = { 0xe0, 0xe0, 0x60, 0x80, 0x1c0, 0xe0, 0x40, 0, 0x80, 0, 0x40, 0, 0, 0, 0, 0 }; + static const uint16 kLinkDmaCtrs0[6] = { 14, 4, 6, 16, 6, 8 }; + static const uint16 kLinkDmaSources9[15] = { 0, 0x20, 0x40, 0, 0x20, 0x40, 0, 0x40, 0x80, 0, 0x40, 0x80, 0xb340, 0xb400, 0xb4c0 }; + static const uint16 kLinkDmaSources8[4] = { 0xa480, 0xa4c0, 0xa500, 0xa540 }; + + for (int i = 0; i < 32; i++) { + extended_oam[i] = bytewise_extended_oam[3 + 4 * i] << 6 | + bytewise_extended_oam[2 + 4 * i] << 4 | + bytewise_extended_oam[1 + 4 * i] << 2 | + bytewise_extended_oam[0 + 4 * i] << 0; + } + + dma_source_addr_3 = kLinkDmaSources1[link_dma_graphics_index >> 1]; + dma_source_addr_0 = dma_source_addr_3 + 0x200; + dma_source_addr_4 = kLinkDmaSources2[link_dma_graphics_index >> 1]; + dma_source_addr_1 = dma_source_addr_4 + 0x200; + dma_source_addr_5 = kLinkDmaSources3[link_dma_var1 >> 1]; + dma_source_addr_2 = kLinkDmaSources3[link_dma_var2 >> 1]; + + + dma_source_addr_6 = kLinkDmaSources4[link_dma_var3 >> 1]; + dma_source_addr_11 = dma_source_addr_6 + 0x180; + + if (link_dma_var4 == 0x8b) { + dma_source_addr_7 = 0xe099; + } else { + dma_source_addr_7 = kLinkDmaSources5[link_dma_var4 >> 1]; + } + dma_source_addr_12 = dma_source_addr_7 + 0xc0; + + + int j = (link_dma_var5 & 0xf8) >> 3; + dma_source_addr_8 = kLinkDmaSources6[link_dma_var5]; + dma_source_addr_13 = dma_source_addr_8 + kLinkDmaSources7[j]; + dma_source_addr_10 = kLinkDmaSources8[pushedblocks_some_index & 3]; + dma_source_addr_15 = dma_source_addr_10 + 0x100; + + if (--bg_tile_animation_countdown == 0) { + bg_tile_animation_countdown = (BYTE(overlay_index) == 0xb5 || BYTE(overlay_index) == 0xbc) ? 0x17 : 9; + + uint16 t = word_7EC00F + 0x400; + if (t == 0xc00) + t = 0; + word_7EC00F = t; + animated_tile_data_src = 0xa680 + word_7EC00F; + } + + if (--word_7EC013 == 0) { + int t = word_7EC015 + 2; + if (t == 12) + t = 0; + word_7EC015 = t; + word_7EC013 = kLinkDmaCtrs0[t >> 1]; + dma_source_addr_9 = kLinkDmaSources9[t >> 1] + 0xb280; + dma_source_addr_14 = dma_source_addr_9 + 0x60; + } + + dma_source_addr_16 = 0xB940 + dma_var6 * 2; + dma_source_addr_18 = dma_source_addr_16 + 0x200; + + dma_source_addr_17 = 0xB940 + dma_var7 * 2; + dma_source_addr_19 = dma_source_addr_17 + 0x200; + + dma_source_addr_20 = 0xB540 + flag_travel_bird * 2; + dma_source_addr_21 = dma_source_addr_20 + 0x200; +} + +void Sound_LoadIntroSongBank() { // 808901 + LoadSongBank(kSoundBank_intro); +} + +void LoadOverworldSongs() { // 808913 + LoadSongBank(kSoundBank_intro); +} + +void LoadDungeonSongs() { // 808925 + LoadSongBank(kSoundBank_indoor); +} + +void LoadCreditsSongs() { // 808931 + LoadSongBank(kSoundBank_ending); +} + +void Dungeon_LightTorch() { // 81f3ec + if ((byte_7E0333 & 0xf0) != 0xc0) { + byte_7E0333 = 0; + return; + } + uint8 r8 = (uint8)dungeon_room_index == 0 ? 0x80 : 0xc0; + + int i = (byte_7E0333 & 0xf) + (dung_index_of_torches_start >> 1); + int opos = dung_object_pos_in_objdata[i]; + if (dung_object_tilemap_pos[i] & 0x8000) + return; + dung_object_tilemap_pos[i] |= 0x8000; + if (r8 == 0) + dung_torch_data[opos] = dung_object_tilemap_pos[i]; + + uint16 x = dung_object_tilemap_pos[i] & 0x3fff; + RoomDraw_AdjustTorchLightingChange(x, 0xeca, x); + + sound_effect_1 = 42 | CalculateSfxPan_Arbitrary((x & 0x7f) * 2); + + nmi_copy_packets_flag = 1; + if (dung_want_lights_out) { + if (dung_num_lit_torches++ < 3) { + TS_copy = 0; + overworld_fixed_color_plusminus = kLitTorchesColorPlus[dung_num_lit_torches]; + submodule_index = 10; + subsubmodule_index = 0; + } + } + + dung_torch_timers[byte_7E0333 & 0xf] = r8; + byte_7E0333 = 0; +} + +void RoomDraw_AdjustTorchLightingChange(uint16 x, uint16 y, uint16 r8) { // 81f746 + const uint16 *ptr = SrcPtr(y); + x >>= 1; + overworld_tileattr[x + 0] = ptr[0]; + overworld_tileattr[x + 64] = ptr[1]; + overworld_tileattr[x + 1] = ptr[2]; + overworld_tileattr[x + 65] = ptr[3]; + Dungeon_PrepOverlayDma_nextPrep(0, r8); +} + +int Dungeon_PrepOverlayDma_nextPrep(int dst, uint16 r8) { // 81f764 + uint16 r6 = 0x880 + ((r8 & 0x3f) >= 0x3a); + return Dungeon_PrepOverlayDma_watergate(dst, r8, r6, 4); +} + +int Dungeon_PrepOverlayDma_watergate(int dst, uint16 r8, uint16 r6, int loops) { // 81f77c + for (int k = 0; k < loops; k++) { + int x = r8 >> 1; + vram_upload_tile_buf[dst + 0] = ((r8 & 0x40) << 4) | ((r8 & 0x303f) >> 1) | ((r8 & 0xf80) >> 2); + vram_upload_tile_buf[dst + 1] = r6; + vram_upload_tile_buf[dst + 2] = overworld_tileattr[x + 0]; + if (!(r6 & 1)) { + vram_upload_tile_buf[dst + 3] = overworld_tileattr[x + 1]; + vram_upload_tile_buf[dst + 4] = overworld_tileattr[x + 2]; + vram_upload_tile_buf[dst + 5] = overworld_tileattr[x + 3]; + r8 += 128; + } else { + vram_upload_tile_buf[dst + 3] = overworld_tileattr[x + 64]; + vram_upload_tile_buf[dst + 4] = overworld_tileattr[x + 128]; + vram_upload_tile_buf[dst + 5] = overworld_tileattr[x + 192]; + r8 += 2; + } + dst += 6; + } + vram_upload_tile_buf[dst] = 0xffff; + return dst; +} + +void Module05_LoadFile() { // 828136 + EnableForceBlank(); + overworld_map_state = 0; + dung_unk6 = 0; + byte_7E02D4 = 0; + byte_7E02D7 = 0; + tagalong_var5 = 0; + byte_7E0379 = 0; + byte_7E03FD = 0; + EraseTileMaps_normal(); + zelda_ppu_write(OBSEL, 2); + LoadDefaultGraphics(); + Sprite_LoadGraphicsProperties(); + Init_LoadDefaultTileAttr(); + DecompressSwordGraphics(); + DecompressShieldGraphics(); + Link_Initialize(); + LoadFollowerGraphics(); + sprite_gfx_subset_0 = 70; + sprite_gfx_subset_1 = 70; + sprite_gfx_subset_2 = 70; + sprite_gfx_subset_3 = 70; + word_7E02CD = 0x200; + virq_trigger = 48; + if (savegame_is_darkworld) { + if (player_is_indoors) { + LoadDungeonRoomRebuildHUD(); + return; + } + Hud_SearchForEquippedItem(); + Hud_Rebuild(); + Hud_UpdateEquippedItem(); + death_var5 = 0; + dungeon_room_index = 32; + main_module_index = 8; + submodule_index = 0; + subsubmodule_index = 0; + death_var4 = 0; + } else { + if (mosaic_level || death_var5 != 0 && !death_var4 || sram_progress_indicator < 2 || which_starting_point == 5) { + LoadDungeonRoomRebuildHUD(); + return; + } + dialogue_message_index = (link_item_mirror == 2) ? 0x185 : 0x184; + Main_ShowTextMessage(); + Dungeon_LoadPalettes(); + INIDISP_copy = 15; + TM_copy = 4; + TS_copy = 0; + main_module_index = 27; + } +} + +void Module13_BossVictory_Pendant() { // 829c4a + kModule_BossVictory[submodule_index](); + Sprite_Main(); + LinkOam_Main(); +} + +void BossVictory_Heal() { // 829c59 + if (!Hud_RefillMagicPower()) + overworld_map_state++; + if (!Hud_RefillHealth()) + overworld_map_state++; + if (!overworld_map_state) { + button_mask_b_y &= ~0x40; + Dungeon_ResetTorchBackgroundAndPlayerInner(); + link_direction_facing = 2; + link_direction_last = 2 << 1; + flag_update_hud_in_nmi++; + submodule_index++; + subsubmodule_index = 16; + flag_is_link_immobilized++; + } + overworld_map_state = 0; + Hud_RefillLogic(); +} + +void Dungeon_StartVictorySpin() { // 829c93 + if (--subsubmodule_index) + return; + flag_is_link_immobilized = 0; + link_direction_facing = 2; + Link_AnimateVictorySpin(); + Ancilla_TerminateSelectInteractives(0); + AncillaAdd_VictorySpin(); + submodule_index++; +} + +void Dungeon_RunVictorySpin() { // 829cad + Link_Main(); + if (link_player_handler_state != 0) + return; + if (link_sword_type + 1 & 0xfe) + sound_effect_1 = 0x2C; + link_force_hold_sword_up = 1; + subsubmodule_index = 32; + submodule_index++; +} + +void Dungeon_CloseVictorySpin() { // 829cd1 + if (--subsubmodule_index) + return; + submodule_index++; + link_y_vel = 0; + link_x_vel = 0; + overworld_fixed_color_plusminus = 0; +} + +void Module15_MirrorWarpFromAga() { // 829cfc + kModule_KillAgahnim[submodule_index](); + if (submodule_index < 2 || submodule_index >= 5) { + Sprite_Main(); + LinkOam_Main(); + } +} + +void Module16_BossVictory_Crystal() { // 829e8a + switch (submodule_index) { + case 0: BossVictory_Heal(); break; + case 1: Dungeon_StartVictorySpin(); break; + case 2: Dungeon_RunVictorySpin(); break; + case 3: Dungeon_CloseVictorySpin(); break; + case 4: Module16_04_FadeAndEnd(); break; + } + Sprite_Main(); + LinkOam_Main(); +} + +void Module16_04_FadeAndEnd() { // 829e9a + if (--INIDISP_copy) + return; + bg1_x_offset = 0; + bg1_y_offset = 0; + link_y_vel = 0; + flag_is_link_immobilized = 0; + Palette_RevertTranslucencySwap(); + link_player_handler_state = kPlayerState_Ground; + link_receiveitem_index = 0; + link_pose_for_item = 0; + link_disable_sprite_damage = 0; + main_module_index = saved_module_for_menu; + submodule_index = 0; + subsubmodule_index = 0; + OpenSpotlight_Next2(); +} + +static uint8 PlaySfx_SetPan(uint8 a) { // 878036 + byte_7E0CF8 = a; + return a | Link_CalculateSfxPan(); +} + +void TriforceRoom_LinkApproachTriforce() { // 87f49c + uint8 y = link_y_coord; + if (y < 152) { + link_animation_steps = 0; + link_direction = 0; + link_direction_last = 0; + if (!--link_delay_timer_spin_attack) { + link_pose_for_item = 2; + subsubmodule_index++; + } + } else { + if (y < 169) + link_speed_setting = 0x14; + link_direction = 8; + link_direction_last = 8; + link_direction_facing = 0; + link_delay_timer_spin_attack = 64; + } +} + +void AncillaAdd_ItemReceipt(uint8 ain, uint8 yin, int chest_pos) { // 8985e8 + int ancilla = Ancilla_AddAncilla(ain, yin); + if (ancilla < 0) + return; + + flag_is_link_immobilized = (link_receiveitem_index == 0x20) ? 2 : 1; + uint8 t; + + int j = link_receiveitem_index; + if (j == 0) { + g_ram[kMemoryLocationToGiveItemTo[4]] = kValueToGiveItemTo[0]; + } + + uint8 v = kValueToGiveItemTo[j]; + uint8 *p = &g_ram[kMemoryLocationToGiveItemTo[j]]; + if (!sign8(v)) + *p = v; + + if (j == 0x1f) + link_is_bunny = 0; + else if (j == 0x4b || j == 0x1e) + link_ability_flags |= (j == 0x4b) ? 4 : 2; + + if (j == 0x1b || j == 0x1c) { + Palette_UpdateGlovesColor(); + } else if ((t = 4, j == 0x37) || (t = 1, j == 0x38) || (t = 2, j == 0x39)) { + *p |= t; + if ((*p & 7) == 7) + savegame_map_icons_indicator = 4; + overworld_map_state++; + } else if (j == 0x22) { + if (*p == 0) + *p = 1; + } else if (j == 0x25 || j == 0x32 || j == 0x33) { + WORD(*p) |= 0x8000 >> (BYTE(cur_palace_index_x2) >> 1); + } else if (j == 0x3e) { + if (link_state_bits & 0x80) + link_picking_throw_state = 2; + } else if (j == 0x20) { + overworld_map_state++; + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 7 || ancilla_type[i] == 0x2c) { + ancilla_type[i] = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + } + } + if (link_cape_mode) { + link_bunny_transform_timer = 32; + link_disable_sprite_damage = 0; + link_cape_mode = 0; + AncillaAdd_CapePoof(0x23, 4); + sound_effect_1 = 0x15 | Link_CalculateSfxPan(); + } + } else if (j == 0x29) { + if (link_item_mushroom != 2) { + *p = 1; + Hud_RefreshIcon(); + } + } else if ((t = 1, j == 0x24) || item_receipt_method != 2 && (j == 0x27 || (t = 3, j == 0x28) || (t = 10, j == 0x31))) { + *p += t; + if (*p > 99) + *p = 99; + Hud_RefreshIcon(); + } else if (j == 0x17) { + *p = (*p + 1) & 3; + sound_effect_2 = 0x2d | Link_CalculateSfxPan(); + } else if (j == 1) { + Overworld_SetSongList(); + } else { + ItemReceipt_GiveBottledItem(j); + } + + uint8 gfx = kReceiveItemGfx[j]; + if (gfx == 0xff) { + gfx = 0; + } else if (gfx == 0x20 || gfx == 0x2d || gfx == 0x2e) { + DecompressShieldGraphics(); + Palette_Load_Shield(); + } + DecodeAnimatedSpriteTile_variable(gfx); + + if ((gfx == 6 || gfx == 0x18) && j != 0) { + DecompressSwordGraphics(); + Palette_Load_Sword(); + } + + ancilla_item_to_link[ancilla] = j; + ancilla_arr1[ancilla] = 0; + + if (j == 1 && item_receipt_method != 2) { + ancilla_timer[ancilla] = 160; + submodule_index = 43; + BYTE(palette_filter_countdown) = 0; + AncillaAdd_MSCutscene(0x35, 4); + ancilla_arr3[ancilla] = 2; + } else { + ancilla_arr3[ancilla] = 9; + } + ancilla_arr4[ancilla] = 5; + ancilla_step[ancilla] = item_receipt_method; + + ancilla_aux_timer[ancilla] = + (j == 0x20 || j == 0x37 || j == 0x38 || j == 0x39) ? 0x68 : + (j == 0x26) ? 0x2 : (item_receipt_method ? 0x38 : 0x60); + + int x, y; + + if (item_receipt_method == 1) { + y = (chest_pos & 0x1f80) >> 4; + x = (chest_pos & 0x7e) << 2; + y += dung_loade_bgoffs_v_copy & ~0xff; + x += dung_loade_bgoffs_h_copy & ~0xff; + y += kReceiveItem_Tab2[j]; + x += kReceiveItem_Tab3[j]; + } else { + if (ancilla_step[ancilla] == 0 && j == 1) { + sound_effect_1 = Link_CalculateSfxPan() | 0x2c; + } else if (j == 0x20 || j == 0x37 || j == 0x38 || j == 0x39) { + music_control = Link_CalculateSfxPan() | 0x13; + } else if (j != 0x3e && j != 0x17) { + sound_effect_2 = Link_CalculateSfxPan() | 0xf; + } + int method = item_receipt_method == 3 ? 0 : item_receipt_method; + x = (method != 0) ? kReceiveItem_Tab3[j] : + (kReceiveItem_Tab1[j] == 0) ? 10 : (j == 0x20) ? 0 : 6; + x += link_x_coord; + y = method ? kReceiveItem_Tab2[j] : -14; + y += link_y_coord + ((method == 2) ? -8 : 0); + } + Ancilla_SetXY(ancilla, x, y); +} + +void ItemReceipt_GiveBottledItem(uint8 item) { // 89893e + static const uint8 kBottleList[7] = { 0x16, 0x2b, 0x2c, 0x2d, 0x3d, 0x3c, 0x48 }; + static const uint8 kPotionList[5] = { 0x2e, 0x2f, 0x30, 0xff, 0xe }; + int j; + if ((j = FindInByteArray(kBottleList, item, 7)) >= 0) { + for (int i = 0; i != 4; i++) { + if (link_bottle_info[i] < 2) { + link_bottle_info[i] = j + 2; + return; + } + } + } + if ((j = FindInByteArray(kPotionList, item, 5)) >= 0) { + for (int i = 0; i != 4; i++) { + if (link_bottle_info[i] == 2) { + link_bottle_info[i] = j + 3; + return; + } + } + } +} + +void Module17_SaveAndQuit() { // 89f79f + switch (submodule_index) { + case 0: + submodule_index++; + case 1: + if (!--INIDISP_copy) { + MOSAIC_copy = 15; + subsubmodule_index = 1; + Death_Func15(); + } + break; + } + Sprite_Main(); + LinkOam_Main(); +} + +void WallMaster_SendPlayerToLastEntrance() { // 8bffa8 + SaveDungeonKeys(); + Dungeon_FlagRoomData_Quadrants(); + Sprite_ResetAll(); + death_var4 = 0; + main_module_index = 17; + submodule_index = 0; + nmi_load_bg_from_vram = 0; + ResetSomeThingsAfterDeath(17); // wtf: argument? +} + +uint8 GetRandomNumber() { // 8dba71 + uint8 t = byte_7E0FA1 + frame_counter; + t = (t & 1) ? (t >> 1) : (t >> 1) ^ 0xb8; + byte_7E0FA1 = t; + return t; +} + +uint8 Link_CalculateSfxPan() { // 8dbb67 + return CalculateSfxPan(link_x_coord); +} + +void SpriteSfx_QueueSfx1WithPan(int k, uint8 a) { // 8dbb6e + if (sound_effect_ambient == 0) + sound_effect_ambient = a | Sprite_CalculateSfxPan(k); +} + +void SpriteSfx_QueueSfx2WithPan(int k, uint8 a) { // 8dbb7c + if (sound_effect_1 == 0) + sound_effect_1 = a | Sprite_CalculateSfxPan(k); +} + +void SpriteSfx_QueueSfx3WithPan(int k, uint8 a) { // 8dbb8a + if (sound_effect_2 == 0) + sound_effect_2 = a | Sprite_CalculateSfxPan(k); +} + +uint8 Sprite_CalculateSfxPan(int k) { // 8dbba1 + return CalculateSfxPan(Sprite_GetX(k)); +} + +uint8 CalculateSfxPan(uint16 x) { // 8dbba8 + static const uint8 kPanTable[] = { 0, 0x80, 0x40 }; + int o = 0; + x -= BG2HOFS_copy2 + 80; + if (x >= 80) + o = 1 + ((int16)x >= 0); + return kPanTable[o]; +} + +uint8 CalculateSfxPan_Arbitrary(uint8 a) { // 8dbbd0 + static const uint8 kTorchPans[] = { 0x80, 0x80, 0x80, 0, 0, 0x40, 0x40, 0x40 }; + return kTorchPans[((a - BG2HOFS_copy2) >> 5) & 7]; +} + +void Init_LoadDefaultTileAttr() { // 8e97d9 + memcpy(attributes_for_tile, kDungeon_DefaultAttr, 0x140); + memcpy(attributes_for_tile + 0x1c0, kDungeon_DefaultAttr + 0x140, 64); +} + +void Main_ShowTextMessage() { // 8ffdaa + if (main_module_index != 14) { + byte_7E0223 = 0; + messaging_module = 0; + submodule_index = 2; + saved_module_for_menu = main_module_index; + main_module_index = 14; + } +} + +uint8 HandleItemTileAction_Overworld(uint16 x, uint16 y) { // 9bbd7a + if (player_is_indoors) + return HandleItemTileAction_Dungeon(x, y); + else + return Overworld_ToolAndTileInteraction(x, y); +} + diff --git a/misc.h b/misc.h new file mode 100644 index 00000000..d71be056 --- /dev/null +++ b/misc.h @@ -0,0 +1,76 @@ +#include "types.h" +#include "variables.h" +#include "zelda_rtl.h" + +#pragma once + + + + + + + + + +static inline OamEnt *GetOamCurPtr() { + return (OamEnt *)&g_ram[oam_cur_ptr]; +} + +static inline int FindInByteArray(const uint8 *data, uint8 lookfor, size_t size) { + for (size_t i = size; i--;) + if (data[i] == lookfor) + return (int)i; + return -1; +} + +static inline int FindInWordArray(const uint16 *data, uint16 lookfor, size_t size) { + for (size_t i = size; i--;) + if (data[i] == lookfor) + return (int)i; + return -1; +} + + +extern const uint16 kMemoryLocationToGiveItemTo[76]; + +const uint16 *SrcPtr(uint16 src); +uint8 Ancilla_Sfx2_Near(uint8 a); +void Ancilla_Sfx3_Near(uint8 a); +void LoadDungeonRoomRebuildHUD(); +void Module_Unknown0(); +void Module_Unknown1(); +void Module_MainRouting(); +void NMI_PrepareSprites(); +void Sound_LoadIntroSongBank(); +void LoadOverworldSongs(); +void LoadDungeonSongs(); +void LoadCreditsSongs(); +void Dungeon_LightTorch(); +void RoomDraw_AdjustTorchLightingChange(uint16 x, uint16 y, uint16 r8); +int Dungeon_PrepOverlayDma_nextPrep(int dst, uint16 r8); +int Dungeon_PrepOverlayDma_watergate(int dst, uint16 r8, uint16 r6, int loops); +void Module05_LoadFile(); +void Module13_BossVictory_Pendant(); +void BossVictory_Heal(); +void Dungeon_StartVictorySpin(); +void Dungeon_RunVictorySpin(); +void Dungeon_CloseVictorySpin(); +void Module15_MirrorWarpFromAga(); +void Module16_BossVictory_Crystal(); +void Module16_04_FadeAndEnd(); +void TriforceRoom_LinkApproachTriforce(); +void AncillaAdd_ItemReceipt(uint8 ain, uint8 yin, int chest_pos); +void ItemReceipt_GiveBottledItem(uint8 item); +void Module17_SaveAndQuit(); +void WallMaster_SendPlayerToLastEntrance(); +uint8 GetRandomNumber(); +uint8 Link_CalculateSfxPan(); +void SpriteSfx_QueueSfx1WithPan(int k, uint8 a); +void SpriteSfx_QueueSfx2WithPan(int k, uint8 a); +void SpriteSfx_QueueSfx3WithPan(int k, uint8 a); +uint8 Sprite_CalculateSfxPan(int k); +uint8 CalculateSfxPan(uint16 x); +uint8 CalculateSfxPan_Arbitrary(uint8 a); +void Init_LoadDefaultTileAttr(); +void Main_ShowTextMessage(); +uint8 HandleItemTileAction_Overworld(uint16 x, uint16 y); diff --git a/nmi.cpp b/nmi.cpp new file mode 100644 index 00000000..1c6ed5f7 --- /dev/null +++ b/nmi.cpp @@ -0,0 +1,498 @@ +#include "nmi.h" +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" +#include "tables/generated_bg_tilemaps.h" +#include "tables/generated_link_graphics.h" +#include "messaging.h" +#include "snes/ppu.h" +static const uint8 kNmiVramAddrs[] = { + 0, 0, 4, 8, 12, 8, 12, 0, 4, 0, 8, 4, 12, 4, 12, 0, + 8, 16, 20, 24, 28, 24, 28, 16, 20, 16, 24, 20, 28, 20, 28, 16, + 24, 96, 104, +}; +static PlayerHandlerFunc *const kNmiSubroutines[25] = { + &NMI_UploadTilemap_doNothing, + &NMI_UploadTilemap, + &NMI_UploadBG3Text, + &NMI_UpdateOWScroll, + &NMI_UpdateSubscreenOverlay, + &NMI_UpdateBG1Wall, + &NMI_TileMapNothing, + &NMI_UpdateLoadLightWorldMap, + &NMI_UpdateBG2Left, + &NMI_UpdateBGChar3and4, + &NMI_UpdateBGChar5and6, + &NMI_UpdateBGCharHalf, + &NMI_UploadSubscreenOverlayLatter, + &NMI_UploadSubscreenOverlayFormer, + &NMI_UpdateBGChar0, + &NMI_UpdateBGChar1, + &NMI_UpdateBGChar2, + &NMI_UpdateBGChar3, + &NMI_UpdateObjChar0, + &NMI_UpdateObjChar2, + &NMI_UpdateObjChar3, + &NMI_UploadDarkWorldMap, + &NMI_UploadGameOverText, + &NMI_UpdatePegTiles, + &NMI_UpdateStarTiles, +}; +void NMI_UploadSubscreenOverlayFormer() { + NMI_HandleArbitraryTileMap(&g_ram[0x12000], 0, 0x40); +} + +void NMI_UploadSubscreenOverlayLatter() { + NMI_HandleArbitraryTileMap(&g_ram[0x13000], 0x40, 0x80); +} + +void CopyToVram(uint32 dstv, const uint8 *src, int len) { + memcpy(&g_zenv.vram[dstv], src, len); +} + +void CopyToVramVertical(uint32 dstv, const uint8 *src, int len) { + assert(!(len & 1)); + uint16 *dst = &g_zenv.vram[dstv]; + for (int i = 0, i_end = len >> 1; i < i_end; i++, dst += 32, src += 2) + *dst = WORD(*src); +} + +void CopyToVramLow(const uint8 *src, uint32 addr, int num) { + zelda_ppu_write(VMAIN, 0); + zelda_ppu_write_word(VMADDL, addr); + for (int i = 0; i < num; i++) { + zelda_ppu_write(VMDATAL, *src++); + } +} + +void Interrupt_NMI(uint16 joypad_input) { // 8080c9 + if (music_control == 0) { + if (zelda_apu_read(APUI00) == last_music_control) + zelda_apu_write(APUI00, 0); + } else if (music_control != last_music_control) { + last_music_control = music_control; + zelda_apu_write(APUI00, music_control); + if (music_control < 0xf2) + music_unk1 = music_control; + music_control = 0; + } + + if (sound_effect_ambient == 0) { + if (zelda_apu_read(APUI01) == sound_effect_ambient) + zelda_apu_write(APUI01, 0); + } else { + sound_effect_ambient_last = sound_effect_ambient; + zelda_apu_write(APUI01, sound_effect_ambient); + sound_effect_ambient = 0; + } + zelda_apu_write(APUI02, sound_effect_1); + zelda_apu_write(APUI03, sound_effect_2); + sound_effect_1 = 0; + sound_effect_2 = 0; + + zelda_ppu_write(INIDISP, 0x80); + zelda_snes_dummy_write(HDMAEN, 0); + if (!nmi_boolean) { + nmi_boolean = true; + NMI_DoUpdates(); + NMI_ReadJoypads(joypad_input); + } + + if (is_nmi_thread_active) { + NMI_SwitchThread(); + if (thread_other_stack != 0x1f31) + thread_other_stack = 0x1f31; + else + thread_other_stack = 0x1f2; + } else { + zelda_ppu_write(W12SEL, W12SEL_copy); + zelda_ppu_write(W34SEL, W34SEL_copy); + zelda_ppu_write(WOBJSEL, WOBJSEL_copy); + zelda_ppu_write(CGWSEL, CGWSEL_copy); + zelda_ppu_write(CGADSUB, CGADSUB_copy); + zelda_ppu_write(COLDATA, COLDATA_copy0); + zelda_ppu_write(COLDATA, COLDATA_copy1); + zelda_ppu_write(COLDATA, COLDATA_copy2); + zelda_ppu_write(TM, TM_copy); + zelda_ppu_write(TS, TS_copy); + zelda_ppu_write(TMW, TMW_copy); + zelda_ppu_write(TSW, TSW_copy); + zelda_ppu_write(BG1HOFS, BG1HOFS_copy); + zelda_ppu_write(BG1HOFS, BG1HOFS_copy >> 8); + zelda_ppu_write(BG1VOFS, BG1VOFS_copy); + zelda_ppu_write(BG1VOFS, BG1VOFS_copy >> 8); + zelda_ppu_write(BG2HOFS, BG2HOFS_copy); + zelda_ppu_write(BG2HOFS, BG2HOFS_copy >> 8); + zelda_ppu_write(BG2VOFS, BG2VOFS_copy); + zelda_ppu_write(BG2VOFS, BG2VOFS_copy >> 8); + zelda_ppu_write(BG3HOFS, BG3HOFS_copy2); + zelda_ppu_write(BG3HOFS, BG3HOFS_copy2 >> 8); + zelda_ppu_write(BG3VOFS, BG3VOFS_copy2); + zelda_ppu_write(BG3VOFS, BG3VOFS_copy2 >> 8); + zelda_ppu_write(MOSAIC, MOSAIC_copy); + zelda_ppu_write(BGMODE, BGMODE_copy); + if ((BGMODE_copy & 7) == 7) { + zelda_ppu_write(M7B, 0); + zelda_ppu_write(M7B, 0); + zelda_ppu_write(M7C, 0); + zelda_ppu_write(M7C, 0); + zelda_ppu_write(M7X, M7X_copy); + zelda_ppu_write(M7X, M7X_copy >> 8); + zelda_ppu_write(M7Y, M7Y_copy); + zelda_ppu_write(M7Y, M7Y_copy >> 8); + } + //if (irq_flag) { + // snes_dummy_read(g_snes, TIMEUP); + // snes_dummy_write(g_snes, VTIMEL, 0x80); + // snes_dummy_write(g_snes, VTIMEH, 0); + // snes_dummy_write(g_snes, HTIMEL, 0); + // snes_dummy_write(g_snes, HTIMEH, 0); + // snes_dummy_write(g_snes, NMITIMEN, 0xa1); + //} + zelda_ppu_write(INIDISP, INIDISP_copy); + zelda_snes_dummy_write(HDMAEN, HDMAEN_copy); + } +} + +void NMI_SwitchThread() { // 80822d + NMI_UpdateIRQGFX(); + //zelda_snes_dummy_write(VTIMEL, virq_trigger); + //zelda_snes_dummy_write(VTIMEH, 0); + //zelda_snes_dummy_write(NMITIMEN, 0xa1); + zelda_ppu_write(W12SEL, W12SEL_copy); + zelda_ppu_write(W34SEL, W34SEL_copy); + zelda_ppu_write(WOBJSEL, WOBJSEL_copy); + zelda_ppu_write(CGWSEL, CGWSEL_copy); + zelda_ppu_write(CGADSUB, CGADSUB_copy); + zelda_ppu_write(COLDATA, COLDATA_copy0); + zelda_ppu_write(COLDATA, COLDATA_copy1); + zelda_ppu_write(COLDATA, COLDATA_copy2); + zelda_ppu_write(TM, TM_copy); + zelda_ppu_write(TS, TS_copy); + zelda_ppu_write(TMW, TMW_copy); + zelda_ppu_write(TSW, TSW_copy); + zelda_ppu_write(BG1HOFS, BG1HOFS_copy); + zelda_ppu_write(BG1HOFS, BG1HOFS_copy >> 8); + zelda_ppu_write(BG1VOFS, BG1VOFS_copy); + zelda_ppu_write(BG1VOFS, BG1VOFS_copy >> 8); + zelda_ppu_write(BG2HOFS, BG2HOFS_copy); + zelda_ppu_write(BG2HOFS, BG2HOFS_copy >> 8); + zelda_ppu_write(BG2VOFS, BG2VOFS_copy); + zelda_ppu_write(BG2VOFS, BG2VOFS_copy >> 8); + zelda_ppu_write(BG3HOFS, BG3HOFS_copy2); + zelda_ppu_write(BG3HOFS, BG3HOFS_copy2 >> 8); + zelda_ppu_write(BG3VOFS, BG3VOFS_copy2); + zelda_ppu_write(BG3VOFS, BG3VOFS_copy2 >> 8); + zelda_ppu_write(INIDISP, INIDISP_copy); + zelda_snes_dummy_write(HDMAEN, HDMAEN_copy); +} + +void NMI_ReadJoypads(uint16 joypad_input) { // 8083d1 + uint16 both = joypad_input; + uint16 reversed = 0; + for (int i = 0; i < 16; i++, both >>= 1) + reversed = reversed * 2 + (both & 1); + uint8 r0 = reversed; + uint8 r1 = reversed >> 8; + + joypad1L_last = r0; + filtered_joypad_L = (r0 ^ joypad1L_last2) & r0; + joypad1L_last2 = r0; + + joypad1H_last = r1; + filtered_joypad_H = (r1 ^ joypad1H_last2) & r1; + joypad1H_last2 = r1; +} + +void NMI_DoUpdates() { // 8089e0 + if (!nmi_disable_core_updates) { + memcpy(&g_zenv.vram[0x4100], &kLinkGraphics[dma_source_addr_0 - 0x8000], 0x40); + memcpy(&g_zenv.vram[0x4120], &kLinkGraphics[dma_source_addr_1 - 0x8000], 0x40); + memcpy(&g_zenv.vram[0x4140], &kLinkGraphics[dma_source_addr_2 - 0x8000], 0x20); + + memcpy(&g_zenv.vram[0x4000], &kLinkGraphics[dma_source_addr_3 - 0x8000], 0x40); + memcpy(&g_zenv.vram[0x4020], &kLinkGraphics[dma_source_addr_4 - 0x8000], 0x40); + memcpy(&g_zenv.vram[0x4040], &kLinkGraphics[dma_source_addr_5 - 0x8000], 0x20); + + memcpy(&g_zenv.vram[0x4050], &g_ram[dma_source_addr_6], 0x40); + memcpy(&g_zenv.vram[0x4070], &g_ram[dma_source_addr_7], 0x40); + memcpy(&g_zenv.vram[0x4090], &g_ram[dma_source_addr_8], 0x40); + memcpy(&g_zenv.vram[0x40b0], &g_ram[dma_source_addr_9], 0x20); + memcpy(&g_zenv.vram[0x40c0], &g_ram[dma_source_addr_10], 0x40); + memcpy(&g_zenv.vram[0x4150], &g_ram[dma_source_addr_11], 0x40); + memcpy(&g_zenv.vram[0x4170], &g_ram[dma_source_addr_12], 0x40); + memcpy(&g_zenv.vram[0x4190], &g_ram[dma_source_addr_13], 0x40); + memcpy(&g_zenv.vram[0x41b0], &g_ram[dma_source_addr_14], 0x20); + memcpy(&g_zenv.vram[0x41c0], &g_ram[dma_source_addr_15], 0x40); + memcpy(&g_zenv.vram[0x4200], &g_ram[dma_source_addr_16], 0x40); + memcpy(&g_zenv.vram[0x4220], &g_ram[dma_source_addr_17], 0x40); + memcpy(&g_zenv.vram[0x4240], &g_ram[0xbd40], 0x40); + memcpy(&g_zenv.vram[0x4300], &g_ram[dma_source_addr_18], 0x40); + memcpy(&g_zenv.vram[0x4320], &g_ram[dma_source_addr_19], 0x40); + memcpy(&g_zenv.vram[0x4340], &g_ram[0xbd80], 0x40); + + if (BYTE(flag_travel_bird)) { + memcpy(&g_zenv.vram[0x40e0], &g_ram[dma_source_addr_20], 0x40); + memcpy(&g_zenv.vram[0x41e0], &g_ram[dma_source_addr_21], 0x40); + } + + memcpy(&g_zenv.vram[animated_tile_vram_addr], &g_ram[animated_tile_data_src], 0x400); + } + + if (flag_update_hud_in_nmi) { + memcpy(&g_zenv.vram[word_7E0219], hud_tile_indices_buffer, 0x14a); + } + + if (flag_update_cgram_in_nmi) { + memcpy(g_zenv.ppu->cgram, main_palette_buffer, 0x200); + } + + flag_update_hud_in_nmi = 0; + flag_update_cgram_in_nmi = 0; + + memcpy(g_zenv.ppu->oam, &g_ram[0x800], 0x200); + memcpy(g_zenv.ppu->highOam, &g_ram[0xa00], 0x20); + + if (nmi_load_bg_from_vram) { + const uint8 *p; + switch (nmi_load_bg_from_vram) { + case 1: p = g_ram + 0x1002; break; + case 2: p = g_ram + 0x1000; break; + case 3: p = kBgTilemap_0; break; + case 4: p = g_ram + 0x21b; break; + case 5: p = kBgTilemap_1; break; + case 6: p = kBgTilemap_2; break; + case 7: p = kBgTilemap_3; break; + case 8: p = kBgTilemap_4; break; + case 9: p = kBgTilemap_5; break; + default: assert(0); + } + HandleStripes14(p); + if (nmi_load_bg_from_vram == 1) + vram_upload_offset = 0; + nmi_load_bg_from_vram = 0; + } + + if (nmi_update_tilemap_dst) { + memcpy(&g_zenv.vram[nmi_update_tilemap_dst * 256], &g_ram[0x10000 + nmi_update_tilemap_src], 0x200); + nmi_update_tilemap_dst = 0; + } + + if (nmi_copy_packets_flag) { + uint8 *p = (uint8 *)uvram.t3.data; + do { + int dst = WORD(p[0]); + int vmain = p[2]; + int len = p[3]; + p += 4; + if (vmain == 0x80) { + // plain copy + memcpy(&g_zenv.vram[dst], p, len); + } else if (vmain == 0x81) { + // copy with other increment + assert((len & 1) == 0); + uint16 *dp = &g_zenv.vram[dst]; + for (int i = 0; i < len; i += 2, dp += 32) + *dp = WORD(p[i]); + } else { + assert(0); + } + p += len; + } while (WORD(p[0]) != 0xffff); + nmi_copy_packets_flag = 0; + nmi_disable_core_updates = 0; + } + + int idx = nmi_subroutine_index; + nmi_subroutine_index = 0; + kNmiSubroutines[idx](); +} + +void NMI_UploadTilemap() { // 808cb0 + memcpy(&g_zenv.vram[kNmiVramAddrs[BYTE(nmi_load_target_addr)] << 8], &g_ram[0x1000], 0x800); + + *(uint16 *)&g_ram[0x1000] = 0; + nmi_disable_core_updates = 0; +} + +void NMI_UploadTilemap_doNothing() { // 808ce3 +} + +void NMI_UploadBG3Text() { // 808ce4 + memcpy(&g_zenv.vram[0x7c00], &g_ram[0x10000], 0x7e0); + nmi_disable_core_updates = 0; +} + +void NMI_UpdateOWScroll() { // 808d13 + uint8 *src = (uint8 *)uvram.t3.data, *src_org = src; + int f = WORD(src[0]); + int step = (f & 0x8000) ? 32 : 1; + int len = f & 0x3fff; + src += 2; + do { + uint16 *dst = &g_zenv.vram[WORD(src[0])]; + src += 2; + for (int i = 0, i_end = len >> 1; i < i_end; i++, dst += step, src += 2) + *dst = WORD(*src); + } while (!(src[1] & 0x80)); + nmi_disable_core_updates = 0; +} + +void NMI_UpdateSubscreenOverlay() { // 808d62 + NMI_HandleArbitraryTileMap(&g_ram[0x12000], 0, 0x80); +} + +void NMI_HandleArbitraryTileMap(const uint8 *src, int i, int i_end) { // 808dae + uint16 *r10 = &word_7F4000; + do { + memcpy(&g_zenv.vram[r10[i >> 1]], src, 0x80); + src += 0x80; + } while ((i += 2) != i_end); + nmi_disable_core_updates = 0; +} + +void NMI_UpdateBG1Wall() { // 808e09 + // Secret Wall Right + CopyToVramVertical(nmi_load_target_addr, &g_ram[0xc880], 0x40); + CopyToVramVertical(nmi_load_target_addr + 0x800, &g_ram[0xc8c0], 0x40); +} + +void NMI_TileMapNothing() { // 808e4b +} + +void NMI_UpdateLoadLightWorldMap() { // 808e54 + static const uint16 kLightWorldTileMapDsts[4] = { 0, 0x20, 0x1000, 0x1020 }; + const uint8 *src = GetLightOverworldTilemap(); + for (int j = 0; j != 4; j++) { + int t = kLightWorldTileMapDsts[j]; + for (int i = 0x20; i; i--) { + CopyToVramLow(src, t, 0x20); + src += 32; + t += 0x80; + } + } +} + +void NMI_UpdateBG2Left() { // 808ea9 + CopyToVram(0, &g_ram[0x10000], 0x800); + CopyToVram(0x800, &g_ram[0x10800], 0x800); +} + +void NMI_UpdateBGChar3and4() { // 808ee7 + memcpy(&g_zenv.vram[0x2c00], &g_ram[0x10000], 0x1000); + nmi_disable_core_updates = 0; +} + +void NMI_UpdateBGChar5and6() { // 808f16 + memcpy(&g_zenv.vram[0x3400], &g_ram[0x11000], 0x1000); + nmi_disable_core_updates = 0; +} + +void NMI_UpdateBGCharHalf() { // 808f45 + memcpy(&g_zenv.vram[BYTE(nmi_load_target_addr) * 256], &g_ram[0x11000], 0x400); +} + +void NMI_UpdateBGChar0() { // 808f72 + NMI_RunTileMapUpdateDMA(0x2000); +} + +void NMI_UpdateBGChar1() { // 808f79 + NMI_RunTileMapUpdateDMA(0x2800); +} + +void NMI_UpdateBGChar2() { // 808f80 + NMI_RunTileMapUpdateDMA(0x3000); +} + +void NMI_UpdateBGChar3() { // 808f87 + NMI_RunTileMapUpdateDMA(0x3800); +} + +void NMI_UpdateObjChar0() { // 808f8e + CopyToVram(0x4400, &g_ram[0x10000], 0x800); + nmi_disable_core_updates = 0; +} + +void NMI_UpdateObjChar2() { // 808fbd + NMI_RunTileMapUpdateDMA(0x5000); +} + +void NMI_UpdateObjChar3() { // 808fc4 + NMI_RunTileMapUpdateDMA(0x5800); +} + +void NMI_RunTileMapUpdateDMA(int dst) { // 808fc9 + CopyToVram(dst, &g_ram[0x10000], 0x1000); + nmi_disable_core_updates = 0; +} + +void NMI_UploadDarkWorldMap() { // 808ff3 + static const uint16 kLightWorldTileMapSrcs[4] = { 0, 0x20, 0x1000, 0x1020 }; + const uint8 *src = g_ram + 0x1000; + int t = 0x810; + for (int i = 0x20; i; i--) { + CopyToVramLow(src, t, 0x20); + src += 32; + t += 0x80; + } +} + +void NMI_UploadGameOverText() { // 809038 + CopyToVram(0x7800, &g_ram[0x2000], 0x800); + CopyToVram(0x7d00, &g_ram[0x3400], 0x600); +} + +void NMI_UpdatePegTiles() { // 80908b + CopyToVram(0x3d00, &g_ram[0x10000], 0x100); +} + +void NMI_UpdateStarTiles() { // 8090b7 + CopyToVram(0x3ed0, &g_ram[0x10000], 0x40); +} + +void HandleStripes14(const uint8 *p) { // 8092a1 + while (!(p[0] & 0x80)) { + uint16 vmem_addr = swap16(WORD(p[0])); + uint8 vram_incr_amount = (p[2] & 0x80) >> 7; + uint8 is_memset = p[2] & 0x40; // Cpu BUS Address Step (0=Increment, 2=Decrement, 1/3=Fixed) (DMA only) + int len = (swap16(WORD(p[2])) & 0x3fff) + 1; + p += 4; + + if (vram_incr_amount == 0) { + uint16 *dst = &g_zenv.vram[vmem_addr]; + if (is_memset) { + uint16 v = p[0] | p[1] << 8; + len = (len + 1) >> 1; + for (int i = 0; i < len; i++) + dst[i] = v; + p += 2; + } else { + memcpy(dst, p, len); + p += len; + } + } else { + // increment vram by 32 instead of 1 + uint16 *dst = &g_zenv.vram[vmem_addr]; + if (is_memset) { + uint16 v = p[0] | p[1] << 8; + len = (len + 1) >> 1; + for (int i = 0; i < len; i++, dst += 32) + *dst = v; + p += 2; + } else { + assert((len & 1) == 0); + len >>= 1; + for (int i = 0; i < len; i++, dst += 32, p += 2) + WORD(*dst) = WORD(*p); + } + } + } +} + +void NMI_UpdateIRQGFX() { // 809347 + if (nmi_flag_update_polyhedral) { + memcpy(&g_zenv.vram[0x5800], &g_ram[0xe800], 0x800); + nmi_flag_update_polyhedral = 0; + } +} + diff --git a/nmi.h b/nmi.h new file mode 100644 index 00000000..1a5a2a91 --- /dev/null +++ b/nmi.h @@ -0,0 +1,39 @@ +#pragma once +#include "types.h" + +void NMI_UploadSubscreenOverlayFormer(); +void NMI_UploadSubscreenOverlayLatter(); +void CopyToVram(uint32 dstv, const uint8 *src, int len); +void CopyToVramVertical(uint32 dstv, const uint8 *src, int len); +void CopyToVramLow(const uint8 *src, uint32 addr, int num); +void Interrupt_NMI(uint16 joypad_input); +void NMI_SwitchThread(); +void NMI_ReadJoypads(uint16 joypad_input); +void NMI_DoUpdates(); +void NMI_UploadTilemap(); +void NMI_UploadTilemap_doNothing(); +void NMI_UploadBG3Text(); +void NMI_UpdateOWScroll(); +void NMI_UpdateSubscreenOverlay(); +void NMI_HandleArbitraryTileMap(const uint8 *src, int i, int i_end); +void NMI_UpdateBG1Wall(); +void NMI_TileMapNothing(); +void NMI_UpdateLoadLightWorldMap(); +void NMI_UpdateBG2Left(); +void NMI_UpdateBGChar3and4(); +void NMI_UpdateBGChar5and6(); +void NMI_UpdateBGCharHalf(); +void NMI_UpdateBGChar0(); +void NMI_UpdateBGChar1(); +void NMI_UpdateBGChar2(); +void NMI_UpdateBGChar3(); +void NMI_UpdateObjChar0(); +void NMI_UpdateObjChar2(); +void NMI_UpdateObjChar3(); +void NMI_RunTileMapUpdateDMA(int dst); +void NMI_UploadDarkWorldMap(); +void NMI_UploadGameOverText(); +void NMI_UpdatePegTiles(); +void NMI_UpdateStarTiles(); +void HandleStripes14(const uint8 *p); +void NMI_UpdateIRQGFX(); diff --git a/other/name_remap.txt b/other/name_remap.txt new file mode 100644 index 00000000..186d534f --- /dev/null +++ b/other/name_remap.txt @@ -0,0 +1,3157 @@ +Vector_RESET Interrupt_Reset +Vector_NMI Interrupt_NMI +Native_mode_IRQ Interrupt_IRQ +Vram_EraseTilemaps_Triforce EraseTileMaps_triforce +Vram_EraseTilemaps_PalaceMap EraseTileMaps_dungeonmap +Vram_EraseTilemaps_normal EraseTileMaps_normal +Vram_EraseTilemaps EraseTileMaps +Main_PrepSpritesForNmi NMI_PrepareSprites +UseImplicitRegIndexedLocalJumpTable JumpTableLocal +UseImplicitRegIndexedLongJumpTable JumpTableLong +Overworld_GetTileAttrAtLocation Overworld_GetTileAttributeAtLocation +Sound_LoadSongBank LoadSongBank +Sound_LoadLightWorldSongBank LoadOverworldSongs +Sound_LoadIndoorSongBank LoadDungeonSongs +Sound_LoadEndingSongBank LoadCreditsSongs +Main_SaveGameFile SaveGameFile +NMI_UploadBg3Text NMI_UploadBG3Text +NMI_UpdateScrollingOwMap NMI_UpdateOWScroll +NMI_UploadSubscreenOverlay NMI_UpdateSubscreenOverlay +NMI_UploadSubscreenOverlay_firstHalf NMI_UploadSubscreenOverlayFormer +NMI_UploadSubscreenOverlay_secondHalf NMI_UploadSubscreenOverlayLatter +NMI_UploadSubscreenOverlay_StartTransfers NMI_HandleArbitraryTileMap +NMI_UploadBg3Unknown NMI_UpdateBG1Wall +NMI_UploadBg3Unknown_doNothing NMI_TileMapNothing +NMI_LightWorldMode7Tilemap NMI_UpdateLoadLightWorldMap +NMI_UpdateLeftBg2Tilemaps NMI_UpdateBG2Left +NMI_UpdateBgChrSlots_3_to_4 NMI_UpdateBGChar3and4 +NMI_UpdateBgChrSlots_5_to_6 NMI_UpdateBGChar5and6 +NMI_UpdateChrHalfSlot NMI_UpdateBGCharHalf +NMI_UpdateChr_Bg0 NMI_UpdateBGChar0 +NMI_UpdateChr_Bg1 NMI_UpdateBGChar1 +NMI_UpdateChr_Bg2 NMI_UpdateBGChar2 +NMI_UpdateChr_Bg3 NMI_UpdateBGChar3 +NMI_UpdateChr_Spr0 NMI_UpdateObjChar0 +NMI_UpdateChr_Spr2 NMI_UpdateObjChar2 +NMI_UpdateChr_Spr3 NMI_UpdateObjChar3 +NMI_UpdateAny NMI_RunTileMapUpdateDMA +NMI_DarkWorldMode7Tilemap NMI_UploadDarkWorldMap +NMI_UpdateBg3ChrForDeathMode NMI_UploadGameOverText +NMI_UpdateBarrierTileChr NMI_UpdatePegTiles +UNUSED_sub_8090EB UNREACHABLE_0090EB +Dungeon_Upload_BG2 Dungeon_PrepareNextRoomQuadrantUpload +Dungeon_Upload_BG1_Outer WaterFlood_BuildOneQuadrantForVRAM +Dungeon_Upload_BG1 TileMapPrep_NotWaterOnTag +Dungeon_Upload_BG1_Water WaterFlood_BuildOneQuadrantForVRAM_not_triggered +NMI_LoadTilemapToVram HandleStripes14 +UpdatePolyhedralDma NMI_UpdateIRQGFX +LoadItemAnimationGfx LoadItemGFXIntoWRAM4BPPBuffer +DecompSwordGfx DecompressSwordGraphics +DecompShieldGfx DecompressShieldGraphics +DecompDungAnimatedTiles DecompressAnimatedDungeonTiles +DecompOwAnimatedTiles DecompressAnimatedOverworldTiles +IntroLoadGfx4 LoadItemGFX_Auxiliary +Tagalong_LoadGfx LoadFollowerGraphics +DecodeAnimatedSpriteTile WriteTo4BPPBuffer_at_7F4000 +Intro_LoadGfx_expand3To4bpp LoadItemGFX_sheet0 +SomeUnpackAnimatedTiles UNREACHABLE_00D5C5 +Do3To4Low_8Tiles Do3bppToWRAM4bpp_LeftPal +Expand3To4High_6 Do3bppToWRAM4bpp_RightPal +LoadTransAuxGfx LoadTransAuxGFX +Dungeon_LoadSpriteSets LoadTransAuxGFX_sprite +DecompAuxAndSprites ReloadPreviouslyLoadedSheets +Text_DecompressStoryGfx Attract_DecompressStoryGFX +MirrorWarp_LoadNext AnimateMirrorWarp +MirrorWarp_LoadNext_0 AnimateMirrorWarp_LoadPyramidIfAga +MirrorWarp_LoadNext_5 AnimateMirrorWarp_TriggerOverlayA_2 +MirrorWarp_LoadNext_7x AnimateMirrorWarp_DrawDestinationScreen +MirrorWarp_LoadNext_8x AnimateMirrorWarp_DoSpritesPalettes +MirrorWarp_LoadNext_6 AnimateMirrorWarp_TriggerOverlayB +MirrorWarp_LoadNext_14 AnimateMirrorWarp_TriggerBGChar0 +MirrorWarp_LoadNext_10 AnimateMirrorWarp_DecompressAnimatedTiles +LoadMainAuxTiles AnimateMirrorWarp_DecompressNewTileSets +MirrorWarp_LoadNext_2 AnimateMirrorWarp_DecompressBackgroundsA +MirrorWarp_LoadNext_3 AnimateMirrorWarp_DecompressBackgroundsB +MirrorWarp_LoadNext_4 AnimateMirrorWarp_DecompressBackgroundsC +MirrorWarp_LoadNext_11 AnimateMirrorWarp_LoadSubscreen +MirrorWarp_LoadNext_12 AnimateMirrorWarp_DecompressSpritesA +MirrorWarp_LoadNext_13 AnimateMirrorWarp_DecompressSpritesB +Graphics_IncrementalVramUpload Graphics_IncrementalVRAMUpload +LoadGfxFunc1 LoadNewSpriteGFXSet +InitTilesets InitializeTilesets +LoadDefaultGfx LoadDefaultGraphics +DecompAndDirectCopy DecompressAndCopyManually +Attract_InitGraphics_Helper1 Attract_LoadBG3GFX +Graphics_LoadCommonSpr LoadCommonSprites_2 +WriteMode7GraphicsData TransferMode7Characters +Graphics_MaybeLoadChrHalfSlot Graphics_LoadChrHalfSlot +LoadSelectScreenGfx LoadFileSelectGraphics +CopyFontToVram TransferFontToVRAM +LoadSpriteGfx LoadSpriteGraphics +Upload3To4High Do3To4High +LoadBgGfx LoadBackgroundGraphics +Upload3To4Low Do3To4Low +LoadCommonSprGfxToVram LoadCommonSprites +Decomp_spr_to_0x7f4600 Decompress_sprite_high +DecompSprOrBg Decompress +Decomp_get_next_byte Decompression_GetNextByte +PaletteFilter_doFiltering ApplyPaletteFilter +PaletteFilterUnused UNREACHABLE_00EA79 +Palette_ResetHud45ForText ResetHUDPalettes4and5 +Palette_Restore_SP5F PaletteFilter_RestoreSP5F +Palette_Filter_SP5F PaletteFilter_SP5F +KholdstareShell_PaletteFiltering_Code PaletteFilter_KholdstareShell_init +PaletteFilter_Agahnim AgahnimWarpShadowFilter +sub_80ED19 AgahnimWarpShadowFilter_filter_one +sub_80EDB1 PaletteFilter_Restore +RestorePaletteAdditive_FadeIn PaletteFilter_RestoreAdditive +RestorePaletteSubtractive PaletteFilter_RestoreSubtractive +Palette_InitWhiteFilter PaletteFilter_InitializeWhiteFilter +sub_80EEE0 MirrorWarp_GoToSubmodules +Palette_MirrorWarp_Step MirrorWarp_RunAnimationSubmodules +Palette_DarkenOrLighten_Step PaletteFilter_BlindingWhite +Palette_AnimCommon PaletteFilter_StartBlindingWhite +TriforceRoom_AnimPalette PaletteFilter_BlindingWhiteTriforce +WhirlpoolSaturateBlue PaletteFilter_WhirlpoolBlue +WhirlpoolIsolateBlue PaletteFilter_IsolateWhirlpoolBlue +WhirlpoolRestoreBlue PaletteFilter_WhirlpoolRestoreBlue +WhirlpoolRestoreRedGreen PaletteFilter_WhirlpoolRestoreRedGreen +sub_80F132 EXIT_00F12D +PaletteFilter_Restore_Strictly_Bg_Subtractive PaletteFilter_RestoreBGSubstractiveStrict +PaletteFilter_Restore_Strictly_Bg_Additive PaletteFilter_RestoreBGAdditiveStrict +PaletteFilter_IncreaseTrinexxRed Trinexx_FlashShellPalette_Red +PaletteFilter_RestoreTrinexxRed Trinexx_UnflashShellPalette_Red +PaletteFilter_IncreaseTrinexxBlue Trinexx_FlashShellPalette_Blue +PaletteFilter_RestoreTrinexxBlue Trinexx_UnflashShellPalette_Blue +Spotlight_close IrisSpotlight_close +ConfigureSpotlightTable IrisSpotlight_ConfigureTable +ResetSpotlightTable IrisSpotlight_ResetTable +ConfigureSpotlightTable_Helper IrisSpotlight_CalculateCircleValue +OrientLampBg OrientLampLightCone +Hdma_ConfigureWaterTable AdjustWaterHDMAWindow +Hdma_ConfigureWaterTable_Inner AdjustWaterHDMAWindow_X +Watergate_Helper FloodDam_PrepFloodHDMA +Module_Messaging Module0E_Interface +Messaging_Main RunInterface +Messaging_PrayingPlayer Module0E_05_DesertPrayer +PrayingPlayer_InitScene DesertPrayer_InitializeCutscene +PrayingPlayer_FadeInScene DesertPrayer_FadeScene +UNUSED_Module_Messaging_6 Module0E_06_Unused +Module_Messaging_4 Module0E_04_RedPotion +Module_Messaging_8 Module0E_08_GreenPotion +Module_Messaging_9 Module0E_09_BluePotion +PrepDungeonBossExit PrepareDungeonExitFromBossFight +Module_Messaging_11 Module0E_0B_SaveMenu +Overworld_LoadGfxProperties Sprite_LoadGraphicsProperties +Overworld_LoadGfxProperties_justLightWorld Sprite_LoadGraphicsProperties_light_world_only +Dungeon_InitStarTileChr ResetStarTileGraphics +Mirror_InitHdmaSettings InitializeMirrorHDMA +Overworld_InitMirrorWarp_HDMA MirrorWarp_BuildAndEnableHDMATable +Overworld_MirrorWarp_State3 MirrorWarp_BuildWavingHDMATable +Overworld_MirrorWarp_State4 MirrorWarp_BuildDewavingHDMATable +Dungeon_DrawObjects RoomDraw_DrawAllObjects +Dungeon_LoadDoor RoomData_DrawObject_Door +Dungeon_LoadType1Object RoomData_DrawObject +Dungeon_DrawFloors RoomDraw_DrawFloors +Dung_FillFloor RoomDraw_FloorChunks +Object_Draw_N_4x4 RoomDraw_A_Many32x32Blocks +Object_Draw_WallVert RoomDraw_Downwards4x2_1to15or26 +Object_Draw_WallHorz_LR RoomDraw_Rightwards2x4_1to15or26 +Object_Draw_WallVert_BothBg RoomDraw_Downwards4x2_1to16_BothBG +Object_Draw_WallHorz_LR_BothBgs RoomDraw_Rightwards2x4spaced4_1to16 +Object_Draw_67 RoomDraw_Downwards2x2_1to16 +Object_Draw_07 RoomDraw_Rightwards2x2_1to16 +Object_Draw_60 RoomDraw_Downwards2x2_1to15or32 +Object_Draw2x2s_AdvanceRight RoomDraw_Rightwards2x2_1to15or32 +Object_Draw_C0 RoomDraw_4x4BlocksIn4x4SuperSquare +Object_CeilingNW RoomDraw_DiagonalCeilingTopLeftA +Object_CeilingSW RoomDraw_DiagonalCeilingBottomLeftA +Object_CeilingNE RoomDraw_DiagonalCeilingTopRightA +Object_CeilingSE RoomDraw_DiagonalCeilingBottomRightA +Object_Draw_05 RoomDraw_Rightwards2x4spaced4_1to16_BothBG +Object_Draw_65 RoomDraw_DownwardsDecor4x2spaced4_1to16 +Object_Draw_09 RoomDraw_DiagonalAcute_1to16 +Object_Draw_0A RoomDraw_DiagonalGrave_1to16 +Object_Draw_15 RoomDraw_DiagonalAcute_1to16_BothBG +Object_Draw_16 RoomDraw_DiagonalGrave_1to16_BothBG +Object_Draw_C1 RoomDraw_ClosedChestPlatform +sub_818D47 RoomDraw_ChestPlatformHorizontalWallWithCorners +Object_Draw_21 RoomDraw_Rightwards1x2_1to16_plus2 +Object_Draw_Nx3 RoomDraw_1x3_rightwards +Object_Draw_C3 RoomDraw_3x3FloorIn4x4SuperSquare +Object_Draw_A4_Hole RoomDraw_BigHole4x4_1to16 +Object_Draw_A5 RoomDraw_DiagonalCeilingTopLeftB +Object_Draw_A6 RoomDraw_DiagonalCeilingBottomLeftB +Object_Draw_A7 RoomDraw_DiagonalCeilingTopRightB +Object_Draw_A8 RoomDraw_DiagonalCeilingBottomRightB +Object_DrawLongVertRail RoomDraw_DownwardsHasEdge1x1_1to16_plus23 +Object_DrawVertRail RoomDraw_DownwardsHasEdge1x1_1to16_plus3 +Object_Draw_5F RoomDraw_RightwardsHasEdge1x1_1to16_plus23 +Object_DrawHorzRailThin RoomDraw_RightwardsHasEdge1x1_1to16_plus3 +Object_Draw_88 RoomDraw_DownwardsBigRail3x1_1to16plus5 +Object_Draw_5D RoomDraw_RightwardsBigRail1x3_1to16plus5 +Object_DrawEdge_LR RoomDraw_RightwardsHasEdge1x1_1to16_plus2 +Object_DrawEdge_UD RoomDraw_DownwardsEdge1x1_1to16 +Object_Draw_DB RoomDraw_4x4FloorTwoIn4x4SuperSquare +Object_Draw_C4 RoomDraw_4x4FloorOneIn4x4SuperSquare +nullsub_5 RoomDraw_Nothing_D +Object_Draw_2F RoomDraw_RightwardsTopCorners1x2_1to16_plus13 +Object_Draw_30 RoomDraw_RightwardsBottomCorners1x2_1to16_plus13 +Object_Draw_6C RoomDraw_DownwardsLeftCorners2x1_1to16_plus12 +Object_Draw_6D RoomDraw_DownwardsRightCorners2x1_1to16_plus12 +Object_Draw_B0 RoomDraw_RightwardsEdge1x1_1to16plus7 +Object_Draw_8B RoomDraw_DownwardsEdge1x1_1to16plus7 +nullsub_2 RoomDraw_Nothing_A +Object_Draw_70 RoomDraw_DownwardsFloor4x4_1to16 +Object_RedCarpetFloor RoomDraw_Rightwards4x4_1to16 +Object_Draw_71 RoomDraw_Downwards1x1Solid_1to16_plus3 +Object_RedCarpetFloorTrim RoomDraw_Rightwards1x1Solid_1to16_plus3 +sub_81913F RoomDraw_DoorSwitcherer +nullsub_4 RoomDraw_Nothing_E +Object_MovingWallRight RoomDraw_MovingWallWest +Object_Draw_3x3 RoomDraw_ChestPlatformCorner +Object_MovingWallLeft RoomDraw_MovingWallEast +Object_MovingWall_IsEnabled RoomDraw_CheckIfWallIsMoved +Object_MovingWall_Func1 MovingWall_FillReplacementBuffer +Object_Draw_36 RoomDraw_RightwardsDecor4x4spaced2_1to16 +Object_Draw_73 RoomDraw_DownwardsDecor4x4spaced2_1to16 +Object_Draw_38 RoomDraw_RightwardsStatue2x3spaced2_1to16 +Object_Draw_5E RoomDraw_RightwardsBlock2x2spaced2_1to16 +Object_Draw_89 RoomDraw_DownwardsBlock2x2spaced2_1to16 +Object_Draw_75 RoomDraw_DownwardsPillar2x4spaced2_1to16 +Object_Draw_39 RoomDraw_RightwardsPillar2x4spaced4_1to16 +Object_DrawWallDecor RoomDraw_RightwardsDecor4x3spaced4_1to16 +Object_Draw_76 RoomDraw_DownwardsDecor3x4spaced4_1to16 +Object_Draw_3C RoomDraw_RightwardsDoubled2x2spaced2_1to16 +Object_Draw_DD RoomDraw_TableRock4x4_1to16 +Object_Draw_DE RoomDraw_Spike2x2In4x4SuperSquare +Object_Draw_78 RoomDraw_DownwardsDecor2x2spaced12_1to16 +Object_WallColumn RoomDraw_RightwardsDecor2x2spaced12_1to16 +Object_Draw_47 RoomDraw_Waterfall47 +Object_Draw_48 RoomDraw_Waterfall48 +Object_Draw_49 RoomDraw_RightwardsFloorTile4x2_1to16 +Object_Draw_4C RoomDraw_RightwardsBar4x3_1to16 +Object_Draw_4D RoomDraw_RightwardsShelf4x4_1to16 +Object_Draw_D8 RoomDraw_WaterOverlayA8x8_1to16 +Object_Draw_DA RoomDraw_WaterOverlayB8x8_1to16 +Object_Draw_50 RoomDraw_RightwardsLine1x1_1to16plus1 +Object_Draw_7C RoomDraw_DownwardsLine1x1_1to16plus1 +Object_Draw_WallTorches RoomDraw_RightwardsDecor4x2spaced8_1to16 +Object_Draw_7F RoomDraw_DownwardsDecor2x4spaced8_1to16 +nullsub_3 RoomDraw_Nothing_C +Object_Draw_81 RoomDraw_DownwardsDecor3x4spaced2_1to16 +Object_Draw_ChestPlatform RoomDraw_OpenChestPlatform +Object_Draw_8F RoomDraw_DownwardsBar2x5_1to16 +Object_Draw_B5 RoomDraw_Weird2x4_1_to_16 +Object_Draw4x4 RoomDraw_4x4 +Object_Draw_Nx4 RoomDraw_Object_Nx4 +Object_Draw4x4_BothBgs RoomDraw_4x4Corner_BothBG +Object_Draw3x4_BothBgs RoomDraw_WeirdCornerBottom_BothBG +Object_Draw4x3_BothBgs RoomDraw_WeirdCornerTop_BothBG +Object_LitTorch RoomDraw_LitTorch +Object_Draw_2x2 RoomDraw_Rightwards2x2 +Object_BigKeyLock RoomDraw_BigKeyLock +Object_Chest RoomDraw_Chest +Object_BigChest RoomDraw_BigChest +Object_Draw4x3_0 RoomDraw_TableRock4x3 +Object_Draw3x4 RoomDraw_SolidWallDecor3x4 +Object_OpenedBigChest RoomDraw_BigChest_opened +Object_OpenedBigChest_fake RoomDraw_OpenBigChest +Object_Draw3x8 RoomDraw_BigWallDecor +Object_Draw3x6 RoomDraw_Utility6x3 +Object_Draw7x8 RoomDraw_MagicBatAltar +Object_Draw8x6 RoomDraw_SmithyFurnace +Object_StarTile_on RoomDraw_EnabledStarSwitch +Object_Draw6x4 RoomDraw_VerticalTurtleRockPipe +Object_Draw4x6 RoomDraw_HorizontalTurtleRockPipe +Object_Rupees RoomDraw_RupeeFloor +Object_Draw5x4 RoomDraw_Bed4x5 +sub_819B18 UNREACHABLE_019B18 +Object_WaterLadder RoomDraw_WaterHopStairs_A +Object_DrawWallPaint RoomDraw_PortraitOfMario +Object_Draw6x3 RoomDraw_DrawRightwards3x6 +Object_SanctuaryMantle RoomDraw_SanctuaryWall +Object_Draw_3x2_0 RoomDraw_ChestPlatformVerticalWall +Object_Watergate RoomDraw_DamFloodGate +sub_819C3B RoomDraw_SomariaLine_increment_count +Object_PrisonBars RoomDraw_PrisonCell +Object_Draw_51 RoomDraw_RightwardsCannonHole4x3_1to16 +Object_Draw_85 RoomDraw_DownwardsCannonHole3x4_1to16 +Object_00_DrawWaterFace RoomDraw_EmptyWaterFace +Object_Draw_4x2 RoomDraw_TableBowl +Object_Draw_4xN RoomDraw_WaterHoldingObject +Object_KholdstareShell RoomDraw_KholdstareShell +Object_Draw8xN_BG2 RoomDraw_SomeBigDecors +Object_TrinexxShell RoomDraw_TrinexxShell +Object_LanternLayer RoomDraw_LampCones +Object_LanternLayer_Helper RoomDraw_SingleLampCone +Object_AgahnimAltar RoomDraw_AgahnimsAltar +Object_AgahnimRoomFrame RoomDraw_AgahnimsWindows +Object_FortuneTellerTemplate RoomDraw_FortuneTellerRoom +Object_55_WaterTroof RoomDraw_Utility3x5 +Object_Draw62 RoomDraw_VitreousGooGraphics +Object_EntireFloorIsPit RoomDraw_BG2MaskFull +Object_InterStaircase1 RoomDraw_AutoStairs_North_MultiLayer_A +sub_81A2C1 AutoStairsNorthMergedStart +Object_InterStaircase3 RoomDraw_AutoStairs_North_MergedLayer_A +Object_InterStaircase4 RoomDraw_AutoStairs_North_MergedLayer_B +Object_Stair RoomDraw_AutoStairs_South_MultiLayer_A +sub_81A36A South_MergedStairs_BecomeMultiC +Object_StairWetS RoomDraw_AutoStairs_South_MultiLayer_C +Object_33_StairsSubmerged RoomDraw_AutoStairs_South_MergedLayer +Object_InactiveWaterLadder RoomDraw_WaterHopStairs_B +Object_InterStaircase5 RoomDraw_InterRoomFatStairsUp +Object_InterStaircase6 RoomDraw_InterRoomFatStairsDown_A +Object_InterStaircase7 RoomDraw_InterRoomFatStairsDown_B +Object_WallUpNorthSpiralStaircase RoomDraw_SpiralStairsGoingUpUpper +Object_WallUpNorthSpiralStaircase2 RoomDraw_SpiralStairsGoingUpLower +Object_WallDownNorthSpiralStaircase RoomDraw_SpiralStairsGoingDownUpper +Object_WallDownNorthSpiralStaircase2 RoomDraw_SpiralStairsGoingDownLower +Object_1E_Staircase RoomDraw_StraightInterroomStairsGoingUpNorthUpper +Object_26_Staircase RoomDraw_StraightInterroomStairsGoingUpNorthLower +Object_27_Staircase RoomDraw_StraightInterroomStairsGoingDownNorthLower +sub_81A6B5 StraightInterroomStairsLowerMain +Object_28_Staircase RoomDraw_StraightInterroomStairsGoingUpSouthLower +Object_29_Staircase RoomDraw_StraightInterroomStairsGoingDownSouthLower +sub_81A767 StraightInterroomStairsLower_continue +Object_Draw6x3_Stuff RoomDraw_ArcheryGameTargetDoor +Object_Stacked4x4s RoomDraw_LightBeamOnFloor +Object_BlindLight RoomDraw_BigLightBeamOnFloor +Object_Triforce RoomDraw_GanonTriforceFloorDecor +Object_Draw10x20_With4x4 RoomDraw_VitreousGooDamage +Door_Up RoomDraw_Door_North +Door_Up_Draw_Types_Below_0x40 RoomDraw_NormalRangedDoors_North +Door_Up_PositionLessThan6 RoomDraw_OneSidedShutters_North +Door_Down RoomDraw_Door_South +Door_Down_Draw_Helper_2 RoomDraw_CheckIfLowerLayerDoors_Y +Door_Draw_Helper_4 RoomDraw_OneSidedShutters_South +Door_Left RoomDraw_Door_West +Door_Left_AddNormalDoor RoomDraw_NormalRangedDoors_West +Dung_PlotDoor_Nx4 RoomDraw_DrawUnreachableDoorSwitcher +Door_Right RoomDraw_Door_East +Door_Right_AddNormalDoor RoomDraw_NormalRangedDoors_East +Door_Right_Helper1 RoomDraw_OneSidedShutters_East +Draw_Tiles_R14x4 DrawUnusedDoorSwitchObject +Door_Up_SwordActivated RoomDraw_NorthCurtainDoor +Door_BlastWallUp_Helper3 ExplodingWallNotOpen +Door_BlastWallUp RoomDraw_Door_ExplodingWall +Door_BlastWallUp_Helper RoomDraw_ExplodingWallSegment +Door_BlastWallUp_Helper2 RoomDraw_ExplodingWallColumn +Door_Up_Draw_Types_Above_0x40 RoomDraw_HighRangeDoor_North +Door_Down_Draw_Types_Above_0x40 RoomDraw_OneSidedLowerShutters_South +Door_Left_AddDoorAbove0x40 RoomDraw_HighRangeDoor_West +Door_Right_AddDoorAbove0x40 RoomDraw_OneSidedLowerShutters_East +Door_Up_EntranceDoor_UNUSED RoomDraw_MakeDoorHighPriorityLowerLayer_North +Door_Helper_SetPriority RoomDraw_MakeDoorHighPriority_North +Door_Down_EntranceDoor_UNUSED RoomDraw_MakeDoorHighPriorityLowerLayer_South +Door_Helper_SetPriority2 RoomDraw_MakeDoorHighPriority_South +Door_Left_EntranceDoor_UNUSED RoomDraw_MakeDoorHighPriorityLowerLayer_West +Door_Helper_SetPriority3 RoomDraw_MakeDoorHighPriority_West +Door_Right_EntranceDoor_UNUSED RoomDraw_MakeDoorHighPriorityLowerLayer_East +Door_PrioritizeAligned RoomDraw_MakeDoorHighPriority_East +Door_AddPalaceToggleProperty RoomDraw_MarkDungeonToggleDoor +Door_AddFloorToggleProperty RoomDraw_MarkLayerToggleDoor +Object_Size_1_to_16 RoomDraw_GetObjectSize_1to16 +Object_Size_1_to_15_or_26 RoomDraw_GetObjectSize_1to15or26 +Object_Size_1_to_15_or_32 RoomDraw_GetObjectSize_1to15or32 +Door_Register RoomDraw_FlagDoorsAndGetFinalType +Object_CheckTileNotEqualTo RoomDraw_SmallRailCorner +Door_Prioritize7x4_Unreferenced UNREACHABLE_01B19E +Door_Prioritize4x7 RoomDraw_MakeDoorPartsHighPriority_Y +Door_Prioritize7x4 UNREACHABLE_01B1E1 +Door_Prioritize5x4 RoomDraw_MakeDoorPartsHighPriority_X +Object_Draw_4x2_N RoomDraw_Downwards4x2VariableSpacing +UNUSED_sub_81B254 UNREACHABLE_01B254 +UNUSED_sub_81B264 UNREACHABLE_01B264 +Object_Draw1x5 RoomDraw_DrawObject2x2and1 +sub_81B293 RoomDraw_DrawDiagonalGrave +sub_81B2A1 RoomDraw_DrawDiagonalAcute +Object_Draw_2x2_AdvanceDown RoomDraw_Object_2x2_downwards +Object_DrawInteriorEdge RoomDraw_LineOf8x8_advance_and_use_B2_for_count +Object_Draw1x4 RoomDraw_RightwardShelfEnd +Object_Draw1x3 RoomDraw_RightwardBarSegment +Object_2B_Staircase RoomDraw_WeirdGloveRequiredPot +sub_81B30B RoomDraw_WeirdUglyPot +Object_LargeLiftableBlock RoomDraw_BigGrayRock +Object_ReplacementTileHelper DrawBigGraySegment +Object_Draw_BC RoomDraw_RightwardsFakePots2x2_1to16 +Object_Draw_95 RoomDraw_DownwardsFakePots2x2_1to16 +Object_Pot RoomDraw_SinglePot +Object_BombableFloor RoomDraw_BombableFloor +Object_Draw_BD RoomDraw_RightwardsHammerPegs2x2_1to16 +Object_Draw_96 RoomDraw_DownwardsHammerPegs2x2_1to16 +Object_PegBlock RoomDraw_HammerPegSingle +Dungeon_LoadBlock DrawObjects_PushableBlock +Dungeon_LoadTorch DrawObjects_LightableTorch +Dungeon_CheckAdjacentRoomOpenedDoors Dungeon_CheckAdjacentRoomsForOpenDoors +Dungeon_ApplyOverlay_Far Dungeon_ApplyRoomOverlay +Dungeon_LoadAttrIncremental Dungeon_LoadAttribute_Selectable +Dungeon_LoadAttrTable Dungeon_LoadAttributeTable +Dungeon_LoadBasicAttr Dungeon_LoadBasicAttribute +Dungeon_LoadBasicAttr_full Dungeon_LoadBasicAttribute_full +Dungeon_LoadObjAttr Dungeon_LoadObjectAttribute +Dungeon_SetChestAttr Dungeon_SetChestAttributes +Dungeon_LoadDoorAttr Dungeon_LoadDoorAttribute +Dungeon_LoadSingleDoorAttr Dungeon_LoadSingleDoorAttribute +someExperimentalCrap ChangeDoorToSwitch +Dungeon_InitBarrierAttr Dungeon_InitializePegAttribute +Dungeon_ToggleBarrierAttr Dungeon_FlipCrystalPegAttribute +Dungeon_CheckStairsAndRunScripts Dungeon_HandleRoomTags +Dungeon_DetectStaircaseEasyOut RoomTag_DirtyExit +Dung_TagRoutine_0x29 RoomTag_NorthWestTrigger +Dung_TagRoutine_0x31 RoomTag_QuadrantTrigger +Dung_TagRoutine_0x32 RoomTag_RoomTrigger +Dung_TagRoutine_0x3F RoomTag_RekillableBoss +Dung_TagRoutine_0x14 RoomTag_RoomTrigger_BlockDoor +Dung_TagRoutine_0x15 RoomTag_PrizeTriggerDoorDoor +Dung_TagRoutine_0x16 RoomTag_SwitchTrigger_HoldDoor +Dung_TagRoutine_0x17 RoomTag_SwitchTrigger_ToggleDoor +Dung_DoorSwitch_Func2 PushPressurePlate +Dung_TagRoutine_0x33 RoomTag_TorchPuzzleDoor +Dung_TagRoutine_0x20 RoomTag_Switch_ExplodingWall +Dung_TagRoutine_0x28 RoomTag_PullSwitchExplodingWall +Dung_TagRoutine_0x25 RoomTag_GetHeartForPrize +Dung_TagRoutine_0x38 RoomTag_Agahnim +Dung_TagRoutine_0x3D RoomTag_GanonDoor +Dung_TagRoutine_0x26 RoomTag_KillRoomBlock +Dung_TagRoutine_0x3C RoomTag_PushBlockForChest +Dung_TagRoutine_0x27 RoomTag_TriggerChest +Dung_TagRoutine_Helper RoomTag_OperateChestReveal +Dung_TagRoutine_0x3E RoomTag_TorchPuzzleChest +Dung_TagRoutine_0x1C RoomTag_MovingWall_East +MovingWall_Func1 RoomTag_MovingWallShakeItUp +Dung_TagRoutine_0x1D RoomTag_MovingWall_West +Dung_TagRoutine_0x1F RoomTag_MovingWallTorchesCheck +MovingWall_Func2 MovingWall_MoveALittle +MovingWall_Func3 RoomTag_AdvanceGiganticWall +Dung_TagRoutine_0x18 RoomTag_WaterOff +Dung_TagRoutine_0x19 RoomTag_WaterOn +Dung_TagRoutine_0x1A_Watergate RoomTag_WaterGate +Dung_TagRoutine_0x21 RoomTag_Holes0 +Dung_TagRoutine_0x22 RoomTag_ChestHoles0 +Dung_TagRoutine_0x24 RoomTag_Holes2 +Object_WatergateChannelWater RoomTag_OperateWaterFlooring +Dung_DoorSwitch_Func1 RoomTag_MaybeCheckShutters +Dung_DoorSwitch_GetPos RoomTag_GetTilemapCoords +Dung_CheckStarTileSwitch RoomTag_CheckForPressedSwitch +Dungeon_ProcessTorchAndDoorInteractives Dungeon_ProcessTorchesAndDoors +Bomb_CheckForVulnerableTileObjects Bomb_CheckForDestructibles +Dung_AnimDoor DrawDoorOpening_Step1 +Dung_AnimTrapDoor DrawShutterDoorSteps +Dung_AnimDoorB DrawEyeWatchDoor +sub_81D365 IndexAndClearCurtainDoor +Dungeon_AnimateTrapDoors OperateShutterDoors +Dungeon_AnimateDestroyingWeakDoor OpenCrackedDoor +Dungeon_OpeningLockedDoor_Far UnlockKeyDoor_Main +Dungeon_LoadToggleDoorAttr Dungeon_LoadSingleDoorTileAttribute_from_wram_index +Dungeon_LoadDoorAttrInner Dungeon_LoadSingleDoorTileAttribute +Dungeon_OpeningLockedDoor_StairMaskLocked DrawCompletelyOpenDoor +Door_BlastWallExploding Dungeon_ClearAwayExplodingWall +Dungeon_QueryIfTileLiftable Dungeon_CheckForAndIDLiftableTile +PushBlock_Handler_Inner PushBlock_Main +Dungeon_EraseInteractive2x2 RoomDraw_16x16Single +PushBlock_StoppedMoving PushBlock_CheckForPit +Dungeon_GetInteractiveVramAddr RoomDraw_16x16SingleSingleTileStripe +Dungeon_RevealCoveredTiles Dungeon_LiftAndReplaceLiftable +Dungeon_CustomIndexedRevealCoveredTiles ThievesAttic_DrawLightenedHole +return0_loc_81DAB6 FAIL_01DAB4 +Dungeon_ToolAndTileInteraction HandleItemTileAction_Dungeon +Dungeon_GetUprootedTerrainSpawnCoords ManipBlock_Something +Dungeon_LoadSecret RevealPotItem +Dungeon_SpriteInducedTilemapUpdate Dungeon_UpdateTileMapWithCommonTile +Dungeon_ClearRupeeTile Dungeon_DeleteRupeeTile +Dungeon_OpenKeyedObject OpenChestForItem +Dungeon_OpenBigChest OpenBigChest +Dungeon_ShowMinigameChestMessage OpenMiniGameChestFail +Dungeon_OpenMiniGameChest OpenMiniGameChest +Dungeon_GetRupeeChestMinigamePrize_highStakes OpenMiniGameChest_HighStake +Dungeon_GetKeyedObjectRelativeVramAddr RoomTag_BuildChestStripes +Dungeon_TurnOffWater_Case0 IncrementallyDrainSwampPool +Dungeon_TurnOffWater_Case1 DeleteSwampPoolWaterOverlay +Dungeon_TurnOnOffWater_Func0 Dungeon_FloodSwampWater_PrepTileMap +Dungeon_TurnOnWaterLong Dungeon_FloodSwampWater +Dungeon_TurnOnWaterLong_Func4 Dungeon_FloodSwampWater_VomitWater +Dungeon_OnOffWater_Helper Dungeon_AdjustWaterVomit +Dungeon_TurnOnWaterLong_Func9 Dungeon_FloodSwampWater_SpillToFloor +Dungeon_TurnOnWater_Func11 Dungeon_FloodSwampWater_RiseInLevel +Watergate_Main Dungeon_FloodDam +sub_81F309 EXIT_01F307 +Watergate_Main_State4 FloodDam_Expand +Watergate_Main_State0 FloodDam_PrepTiles_init +Watergate_Main_State5 FloodDam_Fill +Dungeon_ExtinguishFirstTorch Ganon_ExtinguishTorch_adjust_translucency +Dungeon_ExtinguishSecondTorch Ganon_ExtinguishTorch +Dungeon_ElevateStaircasePriority SpiralStairs_MakeNearbyWallsHighPriority_Entering +Dungeon_DecreaseStaircasePriority SpiralStairs_MakeNearbyWallsLowPriority +Dungeon_OpenGanonDoor_Far RoomDraw_OpenTriforceDoor +UNUSED_sub_81F6B4 UNREACHABLE_01F6B2 +Dungeon_PrepOverlayDma RoomDraw_AdjustTorchLightingChange +Door_BlastWallExploding_CopyToVram ClearAndStripeExplodingWall +sub_81F908 UNREACHABLE_01F906 +Dungeon_DrawOverlay Dungeon_DrawRoomOverlay +Dung_AnimTrapDoor_Up GetDoorDrawDataIndex_North_clean_door_index +Dung_AnimDoor_Up DoorDoorStep1_North +Dung_AnimDoor_Up_Inner GetDoorDrawDataIndex_North +Dung_AnimDoorB_Up DrawDoorToTileMap_North +Dung_AnimTrapDoor_Down GetDoorDrawDataIndex_South_clean_door_index +Dung_AnimDoor_Down DoorDoorStep1_South +Dung_AnimDoor_Down_Inner GetDoorDrawDataIndex_South +Dung_AnimDoorB_Down DrawDoorToTileMap_South +Dung_AnimTrapDoor_Left GetDoorDrawDataIndex_West_clean_door_index +Dung_AnimDoor_Left DoorDoorStep1_West +Dung_AnimDoor_Left_Inner GetDoorDrawDataIndex_West +Dung_AnimDoorB_Left DrawDoorToTileMap_West +Dung_AnimTrapDoor_Right GetDoorDrawDataIndex_East_clean_door_index +Dung_AnimDoor_Right DoorDoorStep1_East +Dung_AnimDoor_Right_Inner GetDoorDrawDataIndex_East +Dung_AnimDoorB_Right DrawDoorToTileMap_East +sub_81FD3E ClearDoorCurtainsFromTileMap +Dung_AnimDoorB_Remap GetDoorGraphicsIndex +Door_BlastWallExploding_Helper3 ClearExplodingWallFromTileMap +Door_BlastWallExploding_Helper4 ClearExplodingWallFromTileMap_ClearOnePair +Dungeon_ApplyOverlayAttr Dungeon_DrawRoomOverlay_Apply +Dungeon_ApproachFixedColor ApplyGrayscaleFixed_Incremental +Player_SetElectrocutionMosaicLevel LinkZap_HandleMosaic +Player_LedgeJumpInducedLayerChange Dungeon_HandleLayerChange +Player_CacheStatePriorToHandler CacheCameraProperties +Link_CheckSwimCapability CheckAbilityToSwim +Overworld_PitDamage TakeDamageFromPit +Module_LoadFile Module05_LoadFile +Module_LoadGame_indoors LoadDungeonRoomRebuildHUD +Dungeon_InitAndCacheVars2 CacheRoomEntryProperties +Module_PreOverworld Module08_OverworldLoad +Overworld_LoadMusicIfNeeded LoadOWMusicIfNeeded +PreOverworld_LoadBunnyStuff AdjustLinkBunnyStatus +Player_RemoveBunny ForceNonbunnyStatus +Module_LocationMenu Module1B_SpawnSelect +EndingSequenceCode Credits_LoadScene_Overworld +EndingSequenceCode_0 Credits_LoadScene_Overworld_PrepGFX +EndingSequenceCode_1 Credits_LoadScene_Overworld_Overlay +EndingSequenceCode_2 Credits_LoadScene_Overworld_LoadMap +EndSequence1_Func1 Credits_OperateScrollingAndTileMap +Ending_Func7 Credits_LoadCoolBackground +Ending_CinemaSequencesIndoorsInit Credits_LoadScene_Dungeon +Module_Dungeon Module07_Dungeon +Dung_CheckTriggerInterRoomTrans Dungeon_TryScreenEdgeTransition +Dungeon_StartInterRoomTrans Dungeon_HandleEdgeTransitionMovement +Dungeon_Normal Module07_00_PlayerControl +Dungeon_IntraRoomTrans Module07_01_SubtileTransition +Dungeon_IntraRoomTransShutDoors DungeonTransition_Subtile_ResetShutters +Dungeon_IntraRoomTransInit DungeonTransition_Subtile_PrepTransition +Dungeon_IntraRoomTransFilter DungeonTransition_Subtile_ApplyFilter +Dungeon_IntraRoomTransOpenDoors DungeonTransition_Subtile_TriggerShutters +Dungeon_InterRoomTrans Module07_02_SupertileTransition +Dungeon_InterRoomTrans_State0 Module07_02_00_InitializeTransition +Dungeon_InterRoomTrans_State1 Module07_02_01_LoadNextRoom +Dung_UpdateLightsOutColor DungeonTransition_RunFiltering +Dungeon_InterRoomTrans_State2 Module07_02_FadedFilter +Dungeon_ApplyOverlay Module07_03_OverlayChange +Dungeon_OpeningLockedDoor Module07_04_UnlockDoor +Dungeon_Submodule_5_TriggerAnim Module07_05_ControlShutters +Dungeon_Submodule_6_UpFloorTrans Module07_06_FatInterRoomStairs +Dungeon_SpiralStaircase1 Module07_0E_01_HandleMusicAndResetProps +Dungeon_Teleport0 ResetTransitionPropsAndAdvance_ResetInterface +Dungeon_Staircase_Func1 ResetTransitionPropsAndAdvanceSubmodule +Dungeon_Staircase3 Dungeon_InitializeRoomFromSpecial +sub_828D01 DungeonTransition_FatStairs_RunFade +Dungeon_Staircase6 DungeonTransition_LoadSpriteGFX +Dungeon_HoleStaircase DungeonTransition_AdjustForFatStairScroll +sub_828D5F DungeonTransition_FatStairsEntryCache +Dungeon_InitAndCacheVars ResetThenCacheRoomEntryProperties +Dungeon_Staircase4 DungeonTransition_TriggerBGC34UpdateAndAdvance +Dungeon_Staircase5 DungeonTransition_TriggerBGC56UpdateAndAdvance +Dungeon_Submodule_7_DownFloorTrans Module07_07_FallingTransition +Dungeon_StraightStaircase0 Module07_07_00_HandleMusicAndResetRoom +Dungeon_StraightStaircase6 Module07_07_06_SyncBG1and2 +Dungeon_StraightStaircase15 Module07_07_0F_FallingFadeIn +Dungeon_SpiralStaircase7_Inner4 Dungeon_PlayBlipAndCacheQuadrantVisits +Dungeon_StraightStaircase16 Module07_07_10_LandLinkFromFalling +Dungeon_StraightStaircase17 Module07_07_11_CacheRoomAndSetMusic +Dungeon_Straight_StaircaseDown Module07_08_NorthIntraRoomStairs +Dungeon_Straight_StaircaseDown_State0 Module07_08_00_InitStairs +Dungeon_Straight_StaircaseDown_State1 Module07_08_01_ClimbStairs +Dungeon_Straight_Staircase Module07_10_SouthIntraRoomStairs +Dungeon_Straight_StaircaseUp_State0 Module07_10_00_InitStairs +Dungeon_Straight_StaircaseUp_State1 Module07_10_01_ClimbStairs +Dungeon_DestroyingWeakDoor Module07_09_OpenCrackedDoor +Dungeon_Submodule_A Module07_0A_ChangeBrightness +Dungeon_TurnOffWater Module07_0B_DrainSwampPool +Dungeon_TurnOnWater Module07_0C_FloodSwampWater +Dungeon_Watergate Module07_0D_FloodDam +Dungeon_SpiralStaircase Module07_0E_SpiralStairs +Dungeon_SpiralStaircase15 Dungeon_DoubleApplyAndIncrementGrayscale +Dungeon_SpiralStaircase2 Module07_0E_02_ApplyFilterIf +Dungeon_SpiralStaircase7 Dungeon_SyncBackgroundsFromSpiralStairs +Dungeon_SpiralStaircase16 Dungeon_AdvanceThenSetBossMusicUnorthodox +Dungeon_Staircase_MusicFunc1 Dungeon_SetBossMusicUnorthodox +Dungeon_SpiralStaircase0 Module07_0E_00_InitPriorityAndScreens +Dungeon_SpiralStaircase19 Module07_0E_13_SetRoomAndLayerAndCache +UsedForSpiralStaircase_Helper3 RepositionLinkAfterSpiralStairs +Dungeon_SpiralStaircase7_Inner SpiralStairs_MakeNearbyWallsHighPriority_Exiting +Dungeon_Submodule_F Module07_0F_LandingWipe +Dungeon_Submodule_F_State0 Module07_0F_00_InitSpotlight +Dungeon_Submodule_F_State1 Module07_0F_01_OperateSpotlight +Dungeon_StraightStairs Module07_11_StraightInterroomStairs +StraightStairs_0 Module07_11_00_PrepAndReset +StraightStairs_1 Module07_11_01_FadeOut +StraightStairs_2 Module07_11_02_LoadAndPrepRoom +StraightStairs_3 Module07_11_03_FilterAndLoadBGChars +StraightStairs_4 Module07_11_04_FilterDoBGAndResetSprites +StraightStairs_11 Module07_11_0B_PrepDestination +StraightStairs_9 Module07_11_09_LoadSpriteGraphics +StraightStairs_16 Module07_11_19_SetSongAndFilter +StraightStairs_17 Module07_11_11_KeepSliding +Dungeon_Submodule_14_FallGap Module07_14_RecoverFromFall +Dungeon_Submodule_14_FallGap_0 Module07_14_00_ScrollCamera +Overworld_Func2A_State1 RecoverPositionAfterDrowning +Dungeon_Teleport Module07_15_WarpPad +Dungeon_Teleport1 Module07_15_01_ApplyMosaicAndFilter +Dungeon_Teleport4 Module07_15_04_SyncRoomPropsAndBuildOverlay +Dungeon_Teleport13 Module07_15_0E_FadeInFromWarp +Dungeon_Teleport14 Module07_15_0F_FinalizeAndCacheEntry +Dungeon_Submodule_16 Module07_16_UpdatePegs +Dungeon_OrangeBlueBarrierUpload_A Module07_16_UpdatePegs_Step1 +Dungeon_OrangeBlueBarrierUpload_B Module07_16_UpdatePegs_Step2 +Dungeon_OrangeBlueBarrierUpload_C Module07_16_UpdatePegs_Step3 +Dungeon_OrangeBlueBarrierUpload Dungeon_UpdatePegGFXBuffer +sub_8297A9 Module07_16_UpdatePegs_FinishUp +Dungeon_OrangeBlueBarrierUpload_C RecoverPegGFXFromMapping +Dungeon_Submodule_17 Module07_17_PressurePlate +Dungeon_Crystal Module07_18_RescuedMaiden +Dungeon_Crystal0 PrepareForCrystalCutscene +Dungeon_Crystal1 BuildCrystalCutsceneTilemap +Dungeon_Crystal10 StartCrystalCutscene +Dungeon_Submodule_19 Module07_19_MirrorFade +Dungeon_OpenGanonDoor Module07_1A_RoomDraw_OpenTriforceDoor_bounce +UNUSED_Module_Unknown0 Module0C_Unused +UNUSED_sub_829922 Module0C_RunSubmodule +UNUSED_sub_82992E Module0C_RestoreModule +UNUSED_Module_Unknown1 Module0D_Unused +UNUSED_sub_829951 Module0D_RunSubmodule +UNUSED_sub_82995B Module0D_RestoreModule +Module_CloseSpotlight Module0F_SpotlightClose +CloseSpotlight_Init Dungeon_PrepExitWithSpotlight +OpenSpotlight_Next Spotlight_ConfigureTableAndControl +Module_OpenSpotlight Module10_SpotlightOpen +OpenSpotlight_Init Module10_00_OpenIris +Module_HoleToDungeon Module11_DungeonFallingEntrance +HoleToDungeon_FadeMusic Module_11_00_SetSongAndInit +HoleToDungeon_LoadDungeon Module11_02_LoadEntrance +HoleToDungeon_4 Module11_04_FadeAndLoadQuadrants +Module_BossVictory Module13_BossVictory_Pendant +Module_Victory_0 BossVictory_Heal +Module_Victory_1 Dungeon_StartVictorySpin +Module_Victory_2 Dungeon_RunVictorySpin +Module_Victory_3 Dungeon_CloseVictorySpin +Module_KillAgahnim Module15_MirrorWarpFromAga +Mirror_LoadMusic Module15_00_Initialize +Mirror_Init Module15_01_SetTheScene +Mirror_Func2 Module15_02_RunMirrorWarp_Part1 +Mirror_Func3 Module15_03_RunMirrorWarp_Part2 +MirrorWarp_LoadNext_0_Helper SetTargetOverworldWarpToPyramid +Mirror_Func30 ResetAncillaAndCutscene +Module_Victory Module16_BossVictory_Crystal +nullsub_16 EXIT_029D90 +Module_Victory_4 Module16_04_FadeAndEnd +Module_GanonEmerges Module18_GanonEmerges +Module_TriforceRoom Module19_TriforceRoom +TriforceRoom_Step0 Module19_00_ResetAndInit +TriforceRoom_Step1 Module19_01_MosaicAndPalette +TriforceRoom_Step2 Module19_02_LoadMusicAndScreen +TriforceRoom_Step3 Module19_03_PrepTileSetsPalette +TriforceRoom_Step4 Module19_04_LoadAndSongAndAdvance +TriforceRoom_Step5 Module19_05_WalkLinkIn +TriforceRoom_Step6 Module19_06_MosaicFadeIn +TriforceRoom_Step7 Module19_07_PrepMessage +TriforceRoom_Step9 Module19_09_TriforceSpeak +TriforceRoom_Step8_10 Module19_TriforceExpansionControl +TriforceRoom_Step11 Module19_0B_ApproachTriforce +TriforceRoom_Step12 Module19_0C_HoldTriforce +TriforceRoom_Step13 Module19_0D_FadeToWhite +TriforceRoom_Step14 Module19_0E_AdvanceToCredits +Dungeon_SaveRoomData Mirror_SaveRoomData +Dungeon_SaveRoomData_justKeys SaveDungeonKeys +Palette_Func1 Dungeon_HandleTranslucencyAndPalettes +UNUSED_sub_82A281 UnusedInterfacePaletteRecovery +HoleToDungeon_PaletteFilter PaletteFilter_bounce +PaletteFilter_doFiltering ApplyPaletteFilter_bounce +Palette_Func1 Dungeon_HandleTranslucencyAndPalette +sub_82A2B1 UNREACHABLE_02A1A8 +Dung_AdjustCoordsForNewRoom Dungeon_AdjustAfterSpiralStairs +Dungeon_AdjustCoordsForLinkedRoom Dungeon_AdjustForTeleportDoors +Module_Overworld Module09_Overworld +Overworld_DrawBadWeather OverworldOverlay_HandleRain +Overworld_Func0_Main Module09_00_PlayerControl +Overworld_CheckSwitchArea OverworldHandleTransitions +Overworld_LoadMapProperties Overworld_LoadGFXAndScreenSize +Overworld_Func0_Main_SpecialOverworld ScrollAndCheckForSOWExit +Overworld_LoadTransGfx Module09_LoadAuxGFX +Overworld_TransMapData Module09_LoadNewMapAndGFX +Overworld_Func6 Overworld_RunScrollTransition +Overworld_TransMapData2 Module09_LoadNewSprites +Overworld_TransMapData2_justScroll Overworld_StartScrollTransition +Overworld_Func7 Overworld_EaseOffScrollTransition +Overworld_FuncA_StepOutOfDoor Module09_0A_WalkFromExiting_FacingDown +Overworld_FuncB Module09_0B_WalkFromExiting_FacingUp +Overworld_Func9_DoorStuff Module09_09_OpenBigDoorFromExiting +DoorAnim_DoWork2 Overworld_DoMapUpdate32x32_B +sub_82AD63 UNREACHABLE_02AC62 +Overworld_FuncC Module09_0C_OpenBigDoor +DoorAnim_Func1 Overworld_DoMapUpdate32x32_conditional +DoorAnim_DoWork Overworld_DoMapUpdate32x32 +Overworld_FuncD Overworld_StartMosaicTransition +Overworld_FuncD_State2 OverworldMosaicTransition_HandleScreensAndLoadShroom +UNUSED_sub_82AEDD Module09_1D_02_FBlankAndEnterModule0A +UNUSED_sub_82AEF9 Module09_1E_02_FBlankAndLoadSPOW +Overworld_Func16 Module09_FadeBackInFromMosaic +Overworld_Func16_State0 OverworldMosaicTransition_RecoverDestinationPalettes +Overworld_State0_Helper OverworldMosaicTransition_LoadSpriteGraphicsAndSetMosaic +Overworld_Func16_State1 OverworldMosaicTransition_FilterAndLoadGraphics +Overworld_Func1C_State2 Module09_1C_02_HandleMusic +Overworld_LoadAmbientOverlayAndMapData Overworld_LoadAndBuildScreen +sub_82B1F4 Overworld_ReloadSubscreenOverlayAndAdvance +Overworld_MirrorWarp Module09_MirrorWarp +Overworld_MirrorWarp MirrorWarp_Main +Overworld_InitMirrorWarp MirrorWarp_Initialize +Overworld_FinishMirrorWarp MirrorWarp_FinalizeAndLoadDestination +MirrorWarp_LoadNext_5_Inner MirrorWarp_HandleCastlePyramidSubscreen +MirrorWarp_LoadNext_7 Overworld_DrawScreenAtCurrentMirrorPosition +MirrorWarp_LoadNext_8 MirrorWarp_LoadSpritesAndColors +Overworld_Func2E_Whirlpool Module09_2E_Whirlpool +Overworld_Whirlpool_Case1 Module09_2E_01_MoreBlue +Overworld_Whirlpool_Case3 Module09_2E_03_FindDestination +Overworld_Whirlpool_Case5 Module09_2E_05_LoadDestinationMap +Overworld_Whirlpool_Case7 Module09_2E_07_LoadAuxGraphics +Overworld_Whirlpool_Case8 Module09_2E_08_TriggerTilemapUpdate +Overworld_Whirlpool_Case9 Module09_2E_09_LoadPalettes +Overworld_Func2A Module09_2A_RecoverFromDrowning +Overworld_Func2A_State0 Module09_2A_00_ScrollToLand +Dungeon_SpiralStaircase7_Inner3 Dungeon_AdjustForRoomLayout +Dung_StartInterRoomTrans_RightPlus HandleEdgeTransitionMovementEast_RightBy8 +Dung_StartInterRoomTrans_LeftPlus HandleEdgeTransitionMovementWest_LeftBy8 +Dung_StartInterRoomTrans_DownPlus HandleEdgeTransitionMovementSouth_DownBy16 +Dung_StartInterRoomTrans_Down HandleEdgeTransitionMovementSouth +Dung_StartInterRoomTrans_Up HandleEdgeTransitionMovementNorth +Player_CrossQuadrantBoundary_Right AdjustQuadrantAndCamera_right +Player_UpdateQuadrantsVisited SetAndSaveVisitedQuadrantFlags +Player_CrossQuadrantBoundary_Left AdjustQuadrantAndCamera_left +Player_CrossQuadrantBoundary_Down AdjustQuadrantAndCamera_down +Player_CrossQuadrantBoundary_Up AdjustQuadrantAndCamera_up +Dungeon_SaveRoomQuadrantData Dungeon_FlagRoomData_Quadrants +RoomScrollVars_Add0x100 AdjustCameraBoundaries_DownOrRight1Quadrant +RoomScrollVars_Add0x200 AdjustCameraBoundaries_DownOrRight1Supertile +RoomScrollVars_Sub0x100 AdjustCameraBoundaries_UpOrLeft1Quadrant +RoomScrollVars_Sub0x200 AdjustCameraBoundaries_UpOrLeft1Supertile +Dung_UpdateCameraScrollBounds HandleEdgeTransition_AdjustCameraBoundaries +UpdateCompositeOfLayoutAndQuadrant Dungeon_AdjustQuadrant +Dungeon_HandleScreenScrolling Dungeon_HandleCamera +Overworld_Func1 Overworld_OperateCameraScroll +Overworld_Func2 OverworldCameraBoundaryCheck +Dung_CopyInLeftRightScrollTarget DungeonTransition_AdjustCamera_X +Dung_CopyInUpDownScrollTarget DungeonTransition_AdjustCamera_Y +Dungeon_InterRoomTrans_State8 DungeonTransition_ScrollRoom +StraightStairs_10 Module07_11_0A_ScrollCamera +return_loc_82BFFA OverworldScrollTransition_dirty_exit +Overworld_Func6B OverworldScrollTransition +Overworld_SetupSomeBounds Overworld_SetCameraBoundaries +Dungeon_IntraRoomTrans_State4 DungeonTransition_FindSubtileLanding +Dungeon_Staircase_Func2 SubtileTransitionCalculateLanding +Dungeon_Staircase_Func5 DungeonTransition_MoveLinkOutDoor +Dungeon_Staircase_Func3 CalculateTransitionLanding +Overworld_Func8 Overworld_FinalizeEntryOntoScreen +Overworld_ResetMosaic ConditionalMosaicControl +Intro_InitBgSettings Intro_InitializeBackgroundSettings +Attract_LoadDungeonRoom Dungeon_LoadAndDrawEntranceRoom +Attract_LoadDungeonGfxAndTiles Dungeon_SaveAndLoadLoadAllPalettes +Dungeon_LoadAndUploadRoom Dungeon_LoadAndDrawRoom +Intro_LoadPalettes Overworld_LoadAllPalettes +Overworld_LoadAreaPalettes OverworldLoadScreensPaletteSet +Palette_ZeroPalettesAndCopyFirst SpecialOverworld_CopyPalettesToCache +Overworld_CgramAuxToMain Overworld_CopyPalettesToCache +PrayingScene_ResetHDMA CleanUpAndPrepDesertPrayerHDMA +Dungeon_LoadStartingPoint Dungeon_LoadSpawnEntrance +Overworld_LoadExitData LoadOverworldFromDungeon +Overworld_LoadExitData_alternate Overworld_LoadNewScreenProperties +Overworld_SimpleExit LoadCachedEntranceProperties +Overworld_SaveSpecialAreaExitData LoadSpecialOverworld +Overworld_LoadSpecialAreaExitData LoadOverworldFromSpecialOverworld +BirdTravel_LoadTargetAreaData FluteMenu_LoadTransport +BirdTravel_LoadTargetAreaPalettes FluteMenu_LoadSelectedScreenPalettes +Whirlpool_LookUpAndLoadTargetArea FindPartnerWhirlpoolExit +PreOverworld_LoadLevelData Module08_02_LoadAndAdvance +Overworld_LoadMapData Overworld_DrawQuadrantsAndOverlays +Overworld_LoadMapData_justOverlays Overworld_HandleOverlaysAndBombDoors +Overworld_TransVertical TriggerAndFinishMapLoadStripe_Y +Overworld_TransHorizontal TriggerAndFinishMapLoadStripe_X +Overworld_LoadTransMapData SomeTileMapChange +Overworld_StartTransMapUpdate CreateInitialNewScreenMapToScroll +UNUSED_sub_82F04B UNREACHABLE_02EDAF +Overworld_LargeTransUp CreateInitialOWScreenView_Big_North +Overworld_LargeTransDown CreateInitialOWScreenView_Big_South +Overworld_LargeTransLeft CreateInitialOWScreenView_Big_West +Overworld_LargeTransRight CreateInitialOWScreenView_Big_East +Overworld_SmallTransUp CreateInitialOWScreenView_Small_North +Overworld_SmallTransDown CreateInitialOWScreenView_Small_South +Overworld_SmallTransLeft CreateInitialOWScreenView_Small_West +Overworld_SmallTransRight CreateInitialOWScreenView_Small_East +ScrollType2 OverworldTransitionScrollAndLoadMap +ScrollType2_Down BuildFullStripeDuringTransition_North +ScrollType2_Up BuildFullStripeDuringTransition_South +ScrollType2_Left BuildFullStripeDuringTransition_West +ScrollType2_Right BuildFullStripeDuringTransition_East +Overworld_ScrollMap OverworldHandleMapScroll +Overworld_TransError Overworld_ResetSubmodule +Overworld_ScrollRight MapScroll_East +Overworld_ScrollLeft MapScroll_West +Overworld_ScrollUp MapScroll_South +Overworld_ScrollUpAndSide MapScroll_SouthAndClear +Overworld_ScrollDown MapScroll_North +Overworld_ScrollDownAndSide MapScroll_NorthAndClear +Overworld_DoScrollDown CheckForNewlyLoadedMapAreas_North +Overworld_DoScrollUp CheckForNewlyLoadedMapAreas_South +Overworld_DoScrollLeft CheckForNewlyLoadedMapAreas_West +Overworld_DoScrollRight CheckForNewlyLoadedMapAreas_East +Overworld_DrawHorizontalStrip BufferAndBuildMap16Stripes_X +Overworld_DrawVerticalStrip BufferAndBuildMap16Stripes_Y +Overworld_LoadMap32 Overworld_DecompressAndDrawAllQuadrants +Overworld_LoadQuadrant16x16 Overworld_DecompressAndDrawOneQuadrant +InterlaceMap32_highBytes BlockMoveMap32Chunks_High +InterlaceMap32_lowBytes BlockMoveMap32Chunks_Low +Map32ToMap16 Overworld_ParseMap32Definition +LoadSubOverlayMap32 OverworldLoad_LoadSubOverlayMap32 +LoadSubscreenOverlay LoadOverworldOverlay +Map16ToMap8_subscreenOverlay BuildBGOverlayFromMap16 +Map16ToMap8_normalArea BuildOverworldMapFromMap16 +Map16ChunkToMap8 OverworldCopyMap16ToBuffer +Overworld_RestoreFailedWarpMap16 MirrorBonk_RecoverChangedTiles +LoadEnemyDamageData DecompressEnemyDamageSubclasses +Overworld_Decomp Decompress_bank02 +Sprite_HelmasaurFireballTrampoline Sprite_70_KingHelmasaurFireball_bounce +Sprite_WallCannon Sprite_66_WallCannonVerticalLeft +SpritePrep_ArcheryGameGuy SpritePrep_ArrowGame +Sprite_ArcheryGameGuy Sprite_65_ArcheryGame +ArcheryGameGuy_Main ArcheryGame_Host +ArcheryGameGuy_RunGame ArcheryGame_Host_ProctorGame +Sprite_GoodArcheryTarget Sprite_ArcheryGame_Octo +GoodArcheryTarget_DrawPrize ArcheryGame_DrawPrize +Sprite_DebirandoPit Sprite_63_DebirandoPit +Sprite_Debirando Sprite_64_Debirando +Debirando_UnderSand Debirando_Underground +Debirando_ShootFireball Debirando_Shoot +Sprite_MasterSword Sprite_62_MasterSword +Sprite_MasterLightFountain Sprite_MasterSword_LightFountain +Sprite_MasterLightWell Sprite_MasterSword_LightWell +MasterSword_DrawLightBall SpriteDraw_LightFountain +Sprite_MasterLightBeam Sprite_MasterSword_LightBeam +MasterLightBeam_SpawnAnotherBeam MasterSword_SpawnReplacementLightBeam +MasterSword_SpawnLightBeams MasterSword_SpawnLightBeam +MasterSword_SpawnPendant MasterSword_SpawnPendantProp +Sprite_MasterSwordPendant Sprite_MasterSword_Prop +MasterSwordPendant_DriftingAway MasterSword_Prop_Floating +MasterSwordPendant_Flashing MasterSword_Prop_Flashing +MasterSwordPendant_FlyAway MasterSword_Prop_FlyAwayNow +Sprite_SpikeRoller Sprite_5D_Roller_VerticalDownFirst +Sprite_Beamos Sprite_61_Beamos +Beamos_FireBeam Beamos_FireLaser +Beamos_DrawEyeball SpriteDraw_Beamos_Eyeball +Sprite_BeamosLaser Sprite_Beamos_Laser +BeamosLaser_PrepOamCoord Sprite_PrepOamCoord_wrapper +Sprite_BeamosLaserHit Sprite_Beamos_LaserHit +Sprite_Spark Sprite_5B_Spark_Clockwise +Sprite_LostWoodsBird Sprite_59_LostWoodsBird +sub_85944C LostWoodsBird_Ascend +Sprite_LostWoodsSquirrel Sprite_5A_LostWoodsSquirrel +Sprite_Crab Sprite_58_Crab +Sprite_DesertBarrier Sprite_57_DesertStatue +Sprite_ZoraAndFireball Sprite_55_Zora +Sprite_ZoraFireball Sprite_Fireball +Sprite_Zora Sprite_Zora_Main +Zora_ChooseSurfacingLocation Zora_Submerged +Zora_Surfacing Zora_Surface +Zora_Submerging Zora_Submerge +Sprite_ZoraKing Sprite_52_KingZora +ZoraKing_WaitingForPlayer KingZora_Idle +ZoraKing_RumblingGround KingZora_TheRumbling +ZoraKing_Surfacing KingZora_Surface +ZoraKing_Dialogue KingZora_Talking +ZoraKing_Submerge KingZora_Submerge +Sprite_SpawnSplashRingLong Sprite_Arrghus_SpawnSplash +Sprite_SpawnSplashRing Sprite_SpawnBigSplash +Sprite_WalkingZora Sprite_56_WalkingZora +WalkingZora_Waiting WalkingZora_Wait +WalkingZora_Surfacing WalkingZora_Surface +WalkingZora_Ambulating WalkingZora_Walking +WalkingZora_Depressed WalkingZora_Stunned +WalkingZora_DetermineShadowStatus WalkingZora_AdjustShadow +WalkingZora_DrawWaterRipple WalkingZora_DrawWaterRipples +Sprite_AutoIncDrawWaterRipple SpriteDraw_WaterRipple_WithOamAdjust +Sprite_DrawWaterRipple SpriteDraw_WaterRipple +Sprite_ArmosKnight Sprite_53_ArmosKnight +Lanmola_FinishInitialization SpritePrep_Lanmolas +Sprite_Lanmola Sprite_54_Lanmolas +Sprite_Lanmola_00 Sprite_Lanmolas_Hiding +Sprite_Lanmola_01 Sprite_Lanmolas_BurrowingUp +Sprite_Lanmola_02 Sprite_Lanmolas_LeapFromSand +Sprite_Lanmola_03 Sprite_Lanmolas_WiggleInAir +Sprite_Lanmola_04 Sprite_Lanmolas_BurrowDown +Sprite_SpawnFallingItem Ancilla_SpawnFallingPrize +Sprite_Lanmola_05 Sprite_Lanmolas_Exploding +Sprite_Rat Sprite_6D_Rat +Sprite_Rope Sprite_6E_Rope +Sprite_Keese Sprite_6F_Keese +Sprite_CannonBall Sprite_Cannonball +Sprite_CheckDamageBoth Sprite_CheckDamageToAndFromLink +Sprite_CannonTrooper_UNUSED Sprite_6B_Cannonball +sub_85AC34 CannonGuard_FaceLink +sub_85AC52 CannonGuard_Charge +sub_85ACF2 CannonGuard_Fire +sub_85AD12 CannonGuard_Recoil +sub_85AD28 CannonGuard_Recover +CannonTrooper_Draw_UNUSED SpriteDraw_CannonGuard +Sprite_WarpVortex Sprite_6C_MirrorPortal +Sprite_ChainBallTrooper Sprite_6A_BallNChain +FlailTrooper_ApproachPlayer BallNChain_Approach +FlailTrooper_UpdateGfx BallNChain_Animate +FlailTrooper_ShortHalting BallNChain_Steady +FlailTrooper_Attack BallNChain_SpinFlail +FlailTrooper_WindingDown BallNChain_SlowFlail +ChainBallTrooper_DrawHead SpriteDraw_BNCHead +ChainBallTrooper_DrawHeadEx SpriteDraw_GuardHead +FlailTrooper_DrawBody SpriteDraw_BNCBody +FlailTrooper_DrawBodyEx SpriteDraw_GuardBody +ChainBallTrooper_DrawWeapon SpriteDraw_BNCFlail +ChainBallTrooper_Nop NOP4 +SpriteActive2_MainLong SpriteModule_Active +Sprite_MetalBall Sprite_50_Cannonball +MetalBall_DrawLargerVariety SpriteDraw_BigCannonball +Sprite_Armos Sprite_51_ArmosStatue +Sprite_Bot Sprite_4E_Popo +Sprite_GerudoMan Sprite_4C_Geldman +GerudoMan_ReturnToOrigin Geldman_Hiding +GerudoMan_AwaitPlayer Geldman_WaitForLink +GerudoMan_Emerge Geldman_Ambush +GerudoMan_PursuePlayer Geldman_Chase +GerudoMan_Submerge Geldman_Retreat +Sprite_Toppo Sprite_4D_Toppo +Toppo_PickNextGrassPlot Toppo_Hiding +Toppo_ChillBeforeJump Toppo_RustleGrass +Toppo_WaitThenJump Toppo_PokingOut +Toppo_RiseAndFall Toppo_Leaping +Toppo_ChillAfterJump Toppo_Retreat +Toppo_FlusteredTrampoline Toppo_Flustered_bounce +Toppo_CheckLandingSiteForGrass Toppo_VerifyTile +Sprite_Recruit Sprite_4B_GreenKnifeGuard +Recruit_Moving GreenKnifeGuard_Moving +sub_85BD52 ZoraAndGuardAdvanceAnimation +Sprite_BombTrooper Sprite_4A_BombGuard +EnemyBomb_CheckDamageToSprite SpriteBomb_CheckDamageToSprite +EnemyBomb_ExplosionImminent SpriteBomb_ExplosionIncoming +BombTrooper_Main BombGuard +BombTrooper_SpawnAndThrowBomb BombGuard_CreateBomb +BombTrooper_DrawArm SpriteDraw_BombGuard_Arm +EnemyBomb_DrawExplosion SpriteDraw_SpriteBombExplosion +Sprite_Soldier Sprite_41_BlueGuard +Soldier_Probe Probe +Soldier_Main Guard_Main +Soldier_State0 Guard_Idle +Soldier_Func13 Guard_SetGlanceTo12 +Soldier_Func10 Guard_ShootProbeAndStuff +Soldier_State1 Guard_OnPatrol +Soldier_Func7 Guard_TickAndUpdateBody +Soldier_State2 Guard_Surveying +Soldier_State3 Guard_InPursuit +Soldier_Func11 Guard_SetTimerAndAssertTileHitBox +Soldier_State4 Guard_FallingToDeath +Sprite_ZeroVelocity Sprite_ZeroVelocity_XY +Soldier_Func6 Guard_TickTwiceAndUpdateBody +Probe_SetDirectionTowardsPlayer Guard_ApplySpeedInDirection +Sprite_SpawnProbeStaggered Sprite_Guard_SendOutProbe +Soldier_Draw Guard_HandleAllAnimation +Soldier_Draw1 Guard_AnimateHead +Soldier_Draw2 Guard_AnimateBody +Soldier_Draw3 Guard_AnimateWeapon +Sprite_PsychoSpearSoldier Sprite_45_UsainBolt +PsychoSpearSoldier_PlayChaseMusic BoltGuard_TriggerChaseTheme +Sprite_PsychoTrooper Sprite_44_BluesainBolt +SoldierThrowing_DrawWeapon_1 SpriteDraw_GuardSpear_Fresh +SoldierThrowing_DrawWeaponEx SpriteDraw_GuardSpear_PreserveOamOffset +SoldierThrowing_DrawWeapon_3 SpriteDraw_GuardSpear_Bolt +SoldierThrowing_DrawWeapon SpriteDraw_GuardSpear +Sprite_MoveIfNotTouchingWall Sprite_Guard_MoveIfNoTileCollision +Sprite_JavelinTrooper Sprite_48_RedJavelinGuard +Sprite_ArcherSoldier Sprite_46_BlueArcher +JavelinTrooper_Resting Archer_Hiding +JavelinTrooper_WalkingAround Archer_Walking +JavelinTrooper_LookingAround Archer_Scanning +JavelinTrooper_NoticedPlayer Archer_NoticeSenpai +JavelinTrooper_Agitated Archer_Agitated +JavelinTrooper_Attack Archer_Attack +JavelinTrooper_SpawnProjectile Guard_LaunchProjectile +Sprite_BushJavelinSoldier Sprite_49_RedBushGuard +Sprite_BushArcherSoldier Sprite_47_GreenBushGuard +Sprite_BushSoldierCommon Sprite_BushGuard_Main +Sprite_BushSoldierCommon_00 Sprite_BushGuard_Hiding +Sprite_BushSoldierCommon_01 Sprite_BushGuard_Emerging +BushSoldier_SpawnWeapon BushGuard_SpawnFoliage +Sprite_BushSoldierCommon_02 Sprite_BushGuard_Shoot +Sprite_BushSoldierCommon_03 Sprite_BushGuard_Retreating +ArcherSoldier_DrawWeapon SpriteDraw_Archer_Weapon +Sprite_TutorialEntitiesLong Sprite_TutorialGuardOrBarrier +Sprite_EvilBarrierTrampoline Sprite_BarrierBounce +Sprite_TutorialEntities Sprite_GuardOrBarrierTest +Sprite_PullSwitch Sprite_04_PullSwitch +BadPullSwitch_Main PullSwitch_FacingUp +BadPullSwitch_Inner PullSwitch_HandleUpPulling +GoodPullSwitch_Main PullSwitch_FacingDown +GoodPullSwitch_Inner PullSwitch_HandleDownPulling +SpritePrep_UncleAndSageLong SpritePrep_UncleAndPriest +SpritePrep_UncleAndSage UncleOrPriestPrepCheck +Sage_SpawnMantle Priest_SpawnMantle +Sprite_UncleAndSageLong Sprite_73_UncleAndPriest +Sprite_SageMantle Sprite_SanctuaryMantle +Sprite_SageMantle_Case0 Sprite_SanctuaryMantle_AttemptCutscene +Sprite_SageMantle_Case1 Sprite_SanctuaryMantle_InitializeSlide +Sprite_SageMantle_Case2 Sprite_SanctuaryMantle_SlideToTheRight +Sprite_MakeBodyTrackHeadDirection Sprite_TrackBodyToHead +Sprite_Sage Sprite_Priest +Sage_MortallyWounded Priest_Dying +Sage_DyingWords Priest_LyingOnGround +Sage_DeathFlash Priest_FinalWords +Sage_Terminate Priest_Die +Sage_State1 Priest_RunRescueCutscene +Sage_AtSanctuary Priest_Chillin +Uncle_AtHome Uncle_AtHouse +Uncle_TelepathicZeldaPlea Uncle_TriggerTelepathy +Uncle_WakeUpPlayer Uncle_AwakenLink +Uncle_TellPlayerToStay Uncle_DeclareCurfew +Uncle_LeavingHouse Uncle_Embark +Uncle_AttachZeldaTelepathTagalong Uncle_ApplyTelepathyFollower +Uncle_InSecretPassage Uncle_InPassage +Uncle_RemoveZeldaTelepathTagalong Uncle_LyingInDefeat +Uncle_GiveSwordAndShield Uncle_GrantEquipment +Sprite_DrawMultiple_Inner2 Sprite_DrawMultiple_prep_oam_deferred +Sprite_DrawMultiple_Inner1 Sprite_DrawMultiple_prep_oam +Sprite_QuarrelBrosLong Sprite_32_ArguingBros +Sprite_Oprhan1 Sprite_UNREACHABLE_05E052 +Orphan1_State1 UNREACHABLE_05E06B +Orphan1_State2 UNREACHABLE_05E0B6 +Sprite_ShowSolicitedMessageIfPlayerFacing Sprite_ShowSolicitedMessage +Sprite_ShowMessageFromPlayerContact Sprite_ShowMessageOnContact +Sprite_PullForRupeesLong Sprite_33_RupeePull +Sprite_GargoyleGrateLong Sprite_14_ThievesTownGrate +Sprite_YoungSnitchLadyLong Sprite_34_YoungSnitch +Sprite_InnKeeperLong Sprite_35_Innkeeper +Sprite_WitchLong Sprite_36_Witch +Witch_GrantCaneOfByrna Witch_GrantByrna +Witch_Main Witch_DiscussThings +Witch_PlayerHasNotMushroom Witch_DiscussMushroom +Witch_PlayerHasMushroom Witch_YouHaveShroom +Witch_PlayerHandsMushroomOver Witch_AcceptShroom +Sprite_ArrowTriggerLong Sprite_38_EyeStatue +ArrowTrigger_Unused UNREACHABLE_05E656 +Sprite2_TrendHorizSpeedToZero Sprite_Decelerate_X +Sprite2_TrendVertSpeedToZero Sprite_Decelerate_Y +SpritePrep_SnitchesLong SpritePrep_Snitch +Sprite_OldSnitchLadyLong Sprite_3D_OldSnitch +OldSnitchLady_Case0 Snitch_Meander +OldSnitchLady_Case1 Snitch_FreakOut +OldSnitchLady_Case2 Snitch_OpenDoor +OldSnitchLady_Case3 Snitch_SlamDoor +SpritePrep_RunningManLong SpritePrep_RunningBoy +Sprite_RunningManLong Sprite_74_RunningBoy +RunningMan_Chillin RunningBoy_Idle +RunningMan_AnimateAndRun RunningMan_Running +RunningMan_RunLeft RunningBoy_RunLeft +RunningMan_ResumeChillin RunningMan_Relax +RunningMan_WindingRunRight RunningBoy_RunRight +RunningMan_GotCaught RunningBoy_Caught +RunningMan_AnimateAndMakeDust RunningMan_AnimateAndDust +RunningMan_RunFullSpeed RunningMan_RunAway +Sprite_BottleVendorLong Sprite_75_BottleMerchant +BottleVendor_Base BottleVendor_Idle +BottleVendor_SellingBottle BottleVendor_OfferSale +BottleVendor_GiveBottle BottleVendor_GrantBottle +BottleVendor_BuyingFromPlayer BottleVendor_BuyingItem +BottleVendor_DispenseRewardToPlayer BottleVendor_PayOut +Zelda_TransitionFromTagalong Priest_SpawnRescuedPrincess +Sprite_Zelda Sprite_76_Zelda +Zelda_InPrison Zelda_InCell +Zelda_AwaitingRescue Zelda_WaitingInCell +Zelda_ApproachingPlayer Zelda_ApproachHero +Zelda_TheWizardIsBadMkay Zelda_DebaseAgahnim +Zelda_WaitUntilPlayerPaysAttention Zelda_VerifyAttentionSpan +Zelda_TransitionToTagalong Zelda_BecomeFollower +Zelda_WalkTowardsPriest Zelda_EnterSanctuary +Zelda_RespondToPriest Zelda_TalkHeadOff +Zelda_BeCarefulOutThere Zelda_WellWishes +Sprite_MushroomLong Sprite_E7_Mushroom +nullsub_10 SpritePrep_FakeMasterSword +Sprite_FakeSwordLong Sprite_E8_FakeMasterSword +SpritePrep_HeartContainerLong SpritePrep_HeartContainer +Sprite_HeartContainerLong Sprite_EA_HeartContainer +Sprite_HeartPieceLong Sprite_EB_HeartPiece +Sprite_ElderLong Sprite_16_Elder +Sahasrahla_Dialogue Sasha_Idle +Sahasrahla_MarkMap Sasha_GiveQuest +Sahasrahla_GrantBoots Sasha_GiveBoots +Sahasrahla_ShamelesslyPromoteIceRod Sasha_PromoteIceRod +Sprite_MedallionTabletLong Sprite_F2_MedallionTablet +MedallionTablet_SpawnDustCloud Sprite_SpawnDustCloud +MedallionTablet_WaitForMudoraReader MedallionTablet_WaitingToBeRead +MedallionTablet_Wait BombosTablet +MedallionTablet_WaitForEther EtherTablet +MedallionTablet_ExtendedDelay MedallionTablet_WasteTime +MedallionTablet_Crumbling MedallionTablet_Crumble +MedallionTablet_FinalAnimationState MedallionTablet_AmCrumbled +Sprite_ElderWifeLong Sprite_78_MrsSahasrahla +ElderWife_Initial MrsSahasrahla_Idle +ElderWife_TellLegend MrsSahasrahla_BabbleOn +ElderWife_LoopUntilPlayerNotDumb MrsSahasrahla_QuestionSanity +ElderWife_GoAwayFindTheOldMan MrsSahasrahla_FindMyHubby +SpritePrep_PotionShopLong SpritePrep_MagicShopAssistant +PotionShop_SpawnMagicPowder MagicShopAssistant_SpawnPowder +PotionShop_SpawnGreenPotion MagicShopAssistant_SpawnGreenCauldron +PotionShop_SpawnBluePotion MagicShopAssistant_SpawnBlueCauldron +PotionShop_SpawnRedPotion MagicShopAssistant_SpawnRedCauldron +Sprite_PotionShopLong Sprite_E9_MagicShopAssistant +Sprite_MagicPowderItem Sprite_BagOfPowder +Sprite_GreenPotionItem Sprite_GreenCauldron +Sprite_BluePotionItem Sprite_BlueCauldron +Sprite_RedPotionItem Sprite_RedCauldron +PotionItem_PlaySound PotionCauldron_GoBeep +WitchAssistant_CheckIfHaveAnyBottles PotionCauldron_CheckBottles +Sprite_WitchAssistant Sprite_MagicShopAssistant_Main +Sprite_DirectionToFacePlayer Sprite_DirectionToFaceLink +Sprite_IsToRightOfPlayer Sprite_IsRightOfLink +Sprite_IsBelowPlayer Sprite_IsBelowLink +Sprite_Move Sprite_MoveXY +Sprite_ShowMessageIfPlayerTouching Sprite_TutorialGuard_ShowMessageOnContact +Overworld_ReadSomeTileAttr Overworld_ReadTileAttribute +Sprite_MadBatterLong Sprite_3A_MagicBat +MadBatter_WaitForSummoning MagicBat_Dormant +MadBatter_RisingUp MagicBat_Ascend +MadBatter_PseudoAttackPlayer MagicBat_Attack +MadBatter_DoublePlayerMagicPower MagicBat_EnhanceMagic +MadBatter_LaterBitches MagicBat_Retreat +Sprite_DashItemLong Sprite_3B_BonkItem +Sprite_DashKey Sprite_BonkKey +DashKey_WaitForDashAttack BonkKey_Undisturbed +DashKey_GiveToPlayer BonkKey_GrantKey +Sprite_DashBookOfMudora Sprite_BookOfMudora +DashBookOfMudora_WaitForDashAttack BookOfMudora_WaitForBonk +DashItem_BeginFalling BonkItem_KnockedDown +DashItem_WaitTillTouchingGround BonkItem_Land +DashBookOfMudora_GiveToPlayer BookOfMudora_GrantLiterature +Sprite_DashTreetop Sprite_LumberjackTree +DashTreeTop_WaitForDashAttack LumberjackTree_WaitForBonk +DashTreeTop_SpawnLeaves LumberjackTree_ExplodeViolently +DashTreeTop_DancingLeaves LumberjackTree_DispersionOfLeaves +DashTreeTop_SpawnLeafCluster LumberjackTree_SpawnLeaves +Sprite_TroughBoyLong Sprite_3C_KidInKak +BottleVendor_DetectFish BottleMerchant_DetectFish +BottleVendor_SpawnFishRewards BottleMerchant_BuyFish +ApplyRumbleToSprites Prepare_ApplyRumbleToSprites +Sprite_SpawnThrowableTerrain_Internal Sprite_SpawnThrowableTerrain_silently +Utility_CheckIfHitBoxesOverlap CheckIfHitBoxesOverlap +Sprite_ExecuteSingle2 Sprite_TimersAndOam +Sprite_Get_16_bit_Coords Sprite_Get16BitCoords +SpriteFall_Main SpriteModule_Fall1 +SpriteBurn_Main SpriteModule_Burn_bounce +SpriteExplode_Main SpriteModule_Explode_bounce +SpriteDrown_Main SpriteModule_Drown +SpritePrep_Main SpriteModule_Initialize +SpritePrep_MovableMantle SpritePrep_Mantle +sub_86884A SpritePrep_MoveRight_8px +SpritePrep_MedallionTableTrampoline SpritePrep_MedallionTablet_bounce +SpritePrep_GoodSwitch SpritePrep_Switch +SpritePrep_OldSnitchLady SpritePrep_Snitch_bounce_1 +SpritePrep_DoNothing SpritePrep_DoNothingA +SpritePrep_Hokbok SpritePrep_Pokey +SpritePrep_Vitreolus SpritePrep_MiniVitreous +SpritePrep_EvilBarrier SpritePrep_AgahnimsBarrier +SpritePrep_GreatCatfish SpritePrep_Catfish +SpritePrep_ChattyAgahnim SpritePrep_CutsceneAgahnim +SpritePrep_Pikit SpritePrep_DoNothingC +SpritePrep_Moldorm SpritePrep_MiniMoldorm_bounce +SpritePrep_BombShopEntity SpritePrep_BombShoppe +SpritePrep_BullyAndBallGuy SpritePrep_BullyAndVictim +SpritePrep_ThiefChest SpritePrep_PurpleChest +SpritePrep_Dwarf SpritePrep_Smithy +SpritePrep_Babusu SpritePrep_Babasu +SpritePrep_LaserEyeTrampoline SpritePrep_LaserEye_bounce +SpritePrep_Bot SpritePrep_Popo2 +SpritePrep_MovableStatue SpritePrep_Statue +SpritePrep_PushSwitch SpritePrep_WaterLever +SpritePrep_Debirando SpritePrep_DebirandoPit +SpritePrep_Recruit SpritePrep_WeakGuard +SpritePrep_ArcheryGameGuyTrampoline SpritePrep_ArrowGame_bounce +SpritePrep_IgnoresProjectiles SpritePrep_IgnoreProjectiles +SpritePrep_FluteBoyAnimals SpritePrep_HauntedGroveAnimal +SpritePrep_FluteBoyOstrich SpritePrep_HauntedGroveOstritch +SpritePrep_DiggingGameGuyTrampoline SpritePrep_DiggingGameGuy_bounce +SpritePrep_GargoyleGrate SpritePrep_ThievesTownGrate +SpritePrep_PullForRupees SpritePrep_RupeePull +SpritePrep_ShopKeeper SpritePrep_Shopkeeper +SpritePrep_ShopKeeper_6_9_12 SpritePrep_NiceThief_WithGift +SpritePrep_ShopKeeper_10 SpritePrep_NiceThief_Desert +SpritePrep_ShopKeeper_11 SpritePrep_NiceThief_Ice +SpritePrep_StoryTeller_1 SpritePrep_Storyteller +SpritePrep_HumanMulti_1 SpritePrep_Adults +SpritePrep_Elder SpritePrep_Sage +SpritePrep_DashItem SpritePrep_BonkItem +SrpritePrep_Kiki SpritePrep_Kiki +SpritePrep_MiddleAgedMan SpritePrep_Locksmith +SpritePrep_BugNetKid SpritePrep_SickKid +SpritePrep_GanonHelpers SpritePrep_Tektite +SpritePrep_ChainChompTrampoline SpritePrep_Chainchomp_bounce +SpritePrep_BigFaerie SpritePrep_BigFairy +SpritePrep_ElderWife SpritePrep_MrsSahasrahla +SpritePrep_MadBatter SpritePrep_MagicBat +SpritePrep_Leever SpritePrep_FairyPond +SpritePrep_HoboEntities SpritePrep_Hobo +SpritePrep_RollerRightLeft SpritePrep_Roller_HorizontalRightFirst +SpritePrep_RollerDownUp SpritePrep_Roller_VerticalDownFirst +SpritePrep_Kodondo SpritePrep_Kodongo +SpritePrep_Bubble SpritePrep_Antifairy +SpritePrep_IceBallGenerator SpritePrep_FallingIce +SpritePrep_ZoraKing SpritePrep_KingZora +SpritePrep_DesertBarrier SpritePrep_DesertStatue +SpritePrep_Armos SpritePrep_DoNothingD +SpritePrep_Octorock SpritePrep_Octorok +SpritePrep_GiantMoldorm SpritePrep_Moldorm_bounce +SpritePrep_Lanmola SpritePrep_Lanmolas_bounce +SpritePrep_SpikeTrap SpritePrep_BigSpike +SpritePrep_ZoraAndFireball SpritePrep_SwimmingZora +SpritePrep_GerudoMan SpritePrep_Geldman +sub_868FCF SpritePrep_StandardGuard_indoors +SpritePrep_Soldier SpritePrep_StandardGuard +SpritePrep_FluteBoy SpritePrep_FluteKid +SpritePrep_MoveDownOneTile SpritePrep_MoveDown_8px +SpritePrep_HylianPlaque SpritePrep_PedestalPlaque +Sprite_IncrXYLow8 SpritePrep_MoveDown_8px_Right8px +SpritePrep_HardHatBeetle SpritePrep_HardhatBeetle +SpritePrep_Helmasaur SpritePrep_MiniHelmasaur +SpritePrep_Faerie SpritePrep_Fairy +SpritePrep_TenArrowRefill SpritePrep_Absorbable +SpritePrep_DashTriggeredSprite SpritePrep_OverworldBonkItem +SpritePrep_GoodBee SpritePrep_NiceBee +SpritePrep_DoNothing_2 SpritePrep_DoNothingG +SpritePrep_EyegoreTrampoline SpritePrep_Eyegore_bounce +SpritePrep_GuruguruBar SpritePrep_FireBar +SpritePrep_TrinexxComponents SpritePrep_Trinexx +sub_8691CC SpritePrep_FreeUpBossSegmentSlots +SpritePrep_SpikeBlock SpritePrep_Spike +SpritePrep_Stal SpritePrep_RockStal +SpritePrep_Terrorpin SpritePrep_Blob +SpritePrep_Arghus SpritePrep_Arrghus +SpritePrep_Arrgi SpritePrep_Arrghi +SpritePrep_BubbleGroupTrampoline SpritePrep_AntifairyCircle_bounce +SpritePrep_CrystalMaiden SpritePrep_DoNothingH +SpritePrep_LoadBigKeyGfx SpritePrep_BigKey_load_graphics +SpritePrep_Key SpritePrep_SmallKey +Sprite_GiantMoldormTrampoline Sprite_09_Moldorm_bounce +Sprite_RavenTrampoline Sprite_00_Raven_bounce +Sprite_VultureTrampoline Sprite_01_Vulture_bounce +Sprite_DeadRock Sprite_27_Deadrock +DeadRock_PickDirection Deadrock_Halted +DeadRock_Walk Deadrock_Walk +DeadRock_Petrified Deadrock_Stunned +Sprite_Sluggula Sprite_20_Sluggula +Sluggula_LayBomb Sluggula_DropBomb +Sprite_Poe Sprite_19_Poe +Poe_SelectVerticalDirection Poe_Halted +Poe_Roaming Poe_SpookAround +Sprite_Moldorm Sprite_18_MiniMoldorm +Moldorm_ConfigureNextState MiniMoldorm_Readjust +Moldorm_Meander MiniMoldorm_Meander +Moldorm_SeekPlayer MiniMoldorm_TargetLink +Sprite_Moblin Sprite_12_Moblin +Moblin_SelectDirection Moblin_Halted +Moblin_SpawnThrownSpear Moblin_MaterializeSpear +Sprite_SnapDragon Sprite_0E_Snapdragon +SnapDragon_Resting Snapdragon_Halted +SnapDragon_Attack Snapdragon_MoveAround +Sprite_Ropa Sprite_22_Ropa +Ropa_Stationary Ropa_Halted +Sprite_Hinox Sprite_11_Hinox +Hinox_SelectNextDirection Hinox_Halted +Hinox_FacePlayer Hinox_FaceLink +Hinox_SetRandomDirection Hinox_PickRandomDirection +Hinox_SetExplicitDirection Hinox_SetDirection +Sprite_BlueBari Sprite_23_RedBari +Sprite_Helmasaur Sprite_13_MiniHelmasaur +Sprite_HardHatBeetle Sprite_26_HardhatBeetle +Sprite_Bubble Sprite_15_Antifairy +Sprite_Chicken Sprite_0B_Cucco +Chicken_Calm Cucco_Calm +Chicken_IncrSubtype2_4 Cucco_AnimateFast +Chicken_FleeingPlayer Cucco_Flee +Chicken_DistressMarker Cucco_DrawPANIC +Sprite_DrawDistressMarker Sprite_DrawDistressSweat +Sprite_CustomTimedDrawDistressMarker Sprite_DrawDistress_custom +Chicken_Aloft Cucco_Carried +Chicken_Move_XYZ_AndCheckTileCollision Cucco_DoMovement_XYZ +Chicken_MoveCheckColl Cucco_DoMovement_XY +Chicken_SpawnAvengerChicken Cucco_SummonAvenger +Chicken_Sound BawkBawk +Sprite_MovableMantle Sprite_EE_CastleMantle_bounce +Sprite_CoveredRupeeCrab Sprite_17_Hoarder +Sprite_CoveredRupeeCrab_0 Sprite_Hoarder_Covered +Sprite_RupeeCrab Sprite_Hoarder_Frantic +Sprite_CheckIfLiftedPermissive Sprite_CheckIfLifted_permissive +Sprite_ThrowableScenery Sprite_EC_ThrownItem +ThrowableScenery_DrawLarge SpriteDraw_ThrownItem_Gigantic +Sprite_TransmuteToEnemyBomb Sprite_TransmuteToBomb +Sprite_StoryTeller_1 Sprite_28_DarkWorldHintNPC +Sprite_StoryTeller_1_Case0 Sprite_DarkWorldHintNPC_Bird +StoryTeller_Before DarkWorldHintNPC_Idle +StoryTeller_After DarkWorldHintNPC_RestoreHealth +StoryTeller_Case0_Inner HintBird_TellStory +Sprite_StoryTeller_1_Case1 Sprite_HamburgerHelper +Sprite_StoryTeller_1_Case2 Sprite_DarkWorldHintNPC_Octopus +Sprite_StoryTeller_Case2_Inner Sprite_HintOctopus_TellStory +Sprite_StoryTeller_1_Case3 Sprite_Broccoli +Sprite_StoryTeller_1_Case4 Sprite_Watto +Sprite_StoryTeller_Case4_Inner Sprite_Watto_TellStory +StoryTeller_CheckPay DarkWorldHintNPC_HandlePayment +Sprite_FluteBoy Sprite_2E_FluteKid +FluteBoy_Humanoid FluteKid_TheKid +FluteBoy_HumanForm FluteKid_Human +FluteBoy_Chillin FluteKid_Chillin +FltueBoy_PrepPhaseOut FluteKid_AboutToDisappear +FluteBoy_PhaseOut FluteKid_PhaseOut +FluteBoy_FullyPhasedOut FluteKid_HeDisappeared +Sprite_FluteAardvark Sprite_FluteKid_Stumpy +FluteAardvark_InitialStateFromFluteState Stumpy_Initialize +FluteAardvark_Supplicate Stumpy_Supplicate +FluteAardvark_ThanksButYouKeepIt Stumpy_ThanksButYouKeepIt +FluteAardvark_AlreadyArborated Stumpy_SorryButAmTree +FluteAardvark_ReactToSupplicationResponse Stumpy_WaitForConvo +FluteAardvark_GrantShovel Stumpy_GiveShovel +FluteAardvark_WaitForPlayerMusic Stumpy_WaitForMusic +FluteAardvark_Arborating Stumpy_BecomeTree +FluteAardvark_FullyArborated Stumpy_AmTree +FluteBoy_CheckIfPlayerTooClose FluteKid_CheckIfInRange +Sprite_FluteNote Sprite_FluteKid_Quaver +FluteBoy_SpawnFluteNote FluteKid_SpawnQuaver +Sprite_SmithyBros Sprite_1A_Smithy +ReturningSmithy_Main Smithy_Homecoming +ReturningSmithy_ApproachTheBench Smithy_Homecoming_Walk +ReturningSmithy_CopiouslyThankful Smithy_Homecoming_TYVM +SmithyFrog_Main Smithy_Frog +Smithy_ConversationStart Smithy_Smithing +Smithy_NearbyHammerUseListener Smithy_ListenForHammer +Smithy_ProvideTemperingChoice Smithy_WannaTemper +Smithy_HandleTemperingChoice Smithy_ForRealsies +Smithy_HandleTemperingCost Smithy_ItAintFreeKid +Smithy_TemperingSword Smithy_TemperInProgress +Smithy_GrantTemperedSword Smithy_GiveTemperedSword +Smithy_SpawnReturningSmithy Smithy_SpawnFriend +Smithy_SpawnOtherSmithy Smithy_SpawnDwarfPal +SmithySpark_Main Smithy_Spark +SmithyBros_SpawnSmithySpark Smithy_SpawnSpark +Sprite_EnemyArrow Sprite_1B_Arrow +Sprite_CrystalSwitch Sprite_1E_CrystalSwitch +Sprite_BugNetKid Sprite_1F_SickKid +BugNetKid_Resting SickKid_ISleep +BugNetKid_PerkUp SickKid_RealShit +BugNetKid_GrantBugNet SickKid_NothingButNet +BugNetKid_BackToResting SickKid_OutOfShaqMemes +Sprite_PushSwitch Sprite_21_WaterSwitch +PushSwitch_Case0 WaterSwitch_Untoggled +PushSwitch_Case1 WaterSwitch_ReleaseGate +Sprite_MiddleAgedMan Sprite_39_Locksmith +MiddleAgedMan_Chillin LockSmith_Chillin +MiddleAgedMan_TransitionToTagalong LockSmith_FollowLink +MiddleAgedMan_OfferChestOpening LockSmith_OfferService +MiddleAgedMan_ReactToSecretKeepingResponse LockSmith_RespondToAnswer +Sprite_HoboEntities Sprite_2B_Hobo +Sprite_Hobo Sprite_Hobo_Bum +Hobo_Sleeping Hobo_Sleep +Hobo_WakeUp Hobo_Awoken +Hobo_GrantBottle Hobo_GiveBottle +Hobo_SpawnHobo SpritePrep_Hobo_SpawnSmoke +Sprite_HoboBubble Sprite_Hobo_Bubble +Sprite_HoboFire Sprite_Hobo_Fire +Hobo_SpawnCampfire SpritePrep_Hobo_SpawnFire +Sprite_HoboSmoke Sprite_Hobo_Smoke +HoboFire_SpawnSmoke Hobo_SpawnSmoke +Sprite_UncleAndSageTrampoline Sprite_73_UncleAndPriest_bounce +SpritePrep_UncleAndSageTrampoline SpritePrep_UncleAndPriest_bounce +SpriteActive2_Trampoline SpriteModule_Active_bounce +SpritePrep_OldMountainManTrampoline SpritePrep_OldMan_bounce +Sprite_TutorialEntitiesTrampoline Sprite_TutorialGuardOrBarrier_bounce +Sprite_PullSwitch Sprite_PullSwitch_bounce +Sprite_SomariaPlatformTrampoline Sprite_SomariaPlatformAndPipe_bounce +Sprite_MedallionTabletTrampoline Sprite_F2_MedallionTablet_bounce +Sprite_QuarrelBrosTrampoline Sprite_32_ArguingBros_bounce +Sprite_PullForRupeesTrampoline Sprite_33_RupeePull_bounce +Sprite_GargoyleGrateTrampoline Sprite_14_ThievesTownGrate_bounce +Sprite_YoungSnitchLadyTrampoline Sprite_34_YoungSnitch_bounce +SpritePrep_YoungSnitchGirl SpritePrep_Snitch_bounce_2 +Sprite_InnKeeperTrampoline Sprite_35_Innkeeper_bounce +SpritePrep_InnKeeper SpritePrep_Snitch_bounce_3 +Sprite_WitchTrampoline Sprite_36_Witch_bounce +Sprite_WaterfallTrampoline Sprite_37_Waterfall_bounce +Sprite_ArrowTriggerTrampoline Sprite_38_EyeStatue_bounce +Sprite_MadBatterTrampoline Sprite_3A_MagicBat_bounce +Sprite_DashItemTrampoline Sprite_3B_BonkItem_bounce +Sprite_TroughBoyTrempoline Sprite_3C_KidInKak_bounce +Sprite_OldSnitchLadyTrampoline Sprite_3D_OldSnitch_bounce +Sprite_RunningManTrampoline Sprite_74_RunningBoy_bounce +SpritePrep_RunningManTrampoline SpritePrep_RunningBoy_bounce +Sprite_BottleVendorTrampoline Sprite_75_BottleMerchant_bounce +Sprite_ZeldaTrampoline Sprite_76_Zelda_bounce +SpritePrep_ZeldaTrampoline SpritePrep_Zelda_bounce +Sprite_ElderWifeTrampoline Sprite_78_MrsSahasrahla_bounce +Sprite_MushroomTrampoline Sprite_E7_Mushroom_bounce +SpritePrep_MushroomTrampoline SpritePrep_Mushroom_bounce +Sprite_FakeSwordTrampoline Sprite_E8_FakeMasterSword_bounce +SpritePrep_FakeSwordTrampolnie SpritePrep_FakeMasterSword_bounce +Sprite_ElderTrampoline Sprite_16_Elder_bounce +Sprite_PotionShopTrampoline Sprite_E9_MagicShopAssistant_bounce +SpritePrep_PotionShopTrampoline SpritePrep_MagicShopAssistant_bounce +Sprite_HeartContainerTrampoline Sprite_EA_HeartContainer_bounce +SpritePrep_HeartContainerTrampoline SpritePrep_HeartContainer_bounce +Sprite_HeartPieceTrampoline Sprite_EB_HeartPiece_bounce +SpritePrep_HeartPieceTrampoline SpritePrep_HeartPiece +FluteBoy_UnusedInvocation Sprite_2E_FluteKid_bounce +Sprite_UnusedTelepathTrampoline Sprite_2D_TelepathicTile_bounce +Sprite_HumanMulti_1_Trampoline Sprite_29_Adult_bounce +Sprite_SweepingLadyTrampoline Sprite_2A_SweepingLady_bounce +Sprite_LumberjacksTrampoline Sprite_2C_Lumberjacks_bounce +Sprite_FortuneTellerTrampoline Sprite_31_FortuneTeller_bounce +Sprite_MazeGameLadyTrampoline Sprite_2F_RaceGameLady_bounce +Sprite_MazeGameGuyTrampoline Sprite_30_RaceGameGuy_bounce +Sprite_TalkingTreeTrampoline Sprite_25_TalkingTree_bounce +Sprite_MovableStatue Sprite_1C_Statue +MovableStatue_CheckFullSwitchCovering Statue_CheckForSwitch +MovableStatue_MoveTouchingSprites Statue_BlockSprites +Sprite_WeathervaneTrigger Sprite_1D_FluteQuest +Sprite_WishPond Sprite_72_FairyPond +Sprite_HappinessPond_0 Sprite_FairyPond_WaitForLink +Sprite_HappinessPond_1 Sprite_LakeHyliaFairy_WaitForLink +Sprite_HappinessPond_2 Sprite_LakeHyliaFairy_BegForDonation +Sprite_HappinessPond_3 Sprite_LakeHyliaFairy_AcceptDonation +Sprite_HappinessPond_4 Sprite_LakeHyliaFairy_WaitForDonation +Sprite_HappinessPond_5 Sprite_LakeHyliaFairy_SpawnFairy +Sprite_HappinessPond_6 Sprite_LakeHyliaFairy_Greetings +Sprite_HappinessPond_7 Sprite_LakeHyliaFairy_OfferUpgrade +Sprite_HappinessPond_8 Sprite_LakeHyliaFairy_UpgradeBombs +Sprite_HappinessPond_9 Sprite_LakeHyliaFairy_RevertTranslucency +Sprite_HappinessPond_10 Sprite_LakeHyliaFairy_DeleteFairy +Sprite_HappinessPond_11 Sprite_LakeHyliaFairy_RestoreAndReset +Sprite_HappinessPond_12 Sprite_LakeHyliaFairy_UpgradeArrows +Sprite_HappinessPond_13 Sprite_LakeHyliaFairy_GiveDonationStatus +HappinessPond_GrantLuckStatus LakeHyliaFairy_GrantLuck +Sprite_WishPond2_0 Sprite_UpgradeFairy_WaitForLink +Sprite_WishPond2_1 Sprite_UpgradeFairy_OfferItemToss +Sprite_WishPond2_2 Sprite_UpgradeFairy_HandleItemToss +Sprite_WishPond2_3 Sprite_UpgradeFairy_SpawnFairy +Sprite_WishPond2_4 Sprite_UpgradeFairy_AskWhoDidThis +Sprite_WishPond2_5 Sprite_UpgradeFairy_HandleAnswer +Sprite_WishPond2_6 Sprite_UpgradeFairy_HandleUpgrade +Sprite_WishPond2_7 Sprite_UpgradeFairy_Retreat +Sprite_WishPond2_8 Sprite_UpgradeFairy_FixPalettes +Sprite_WishPond2_9 Sprite_UpgradeFairy_HandleItemReceipt +Sprite_WishPond2_10 Sprite_UpgradeFairy_FinalGoodBye +Sprite_WishPond2_11 Sprite_UpgradeFairy_YouLiar +Sprite_WishPond2_12 Sprite_UpgradeFairy_SecondChance +Sprite_WishPond2_13 Sprite_UpgradeFairy_DebaseLink +Sprite_Leever Sprite_71_Leever +Leever_UnderSand Leever_Underground +sub_86CBF5 UNREACHABLE_06CBFD +Leever_AttackPlayer Leever_Attack +Leever_Submerge Leever_Dig +Sprite_HeartRefill Sprite_D8_Heart +Sprite_ResetVelXYZ Sprite_ZeroVelocity_XYZ +Sprite_ReturnHandleDraggingByAncilla Sprite_HandleDraggingByAncilla +Sprite_Faerie Sprite_E3_Fairy +Faerie_Normal Fairy_Prancing +Faerie_HandleCapture Fairy_HandleCapture +Faerie_CheckForTemporaryUntouchability Fairy_CheckIfTouchable +Sprite_Key Sprite_E4_SmallKey +Sprite_ItemPickup Sprite_D9_GreenRupee +Sprite_CommonItemPickup Sprite_Absorbable_Main +ShieldPickup_AbsorptionByPlayer Absorb_Shield +BigKey_AbsorptionByPlayer Absorb_BigKey +Faerie_AbsorptionByPlayer Absorb_Fairy +sub_86D1AF Absorb_Heart +GreenRupee_AbsorptionByPlayer Absorb_Rupee +OneBombRefill_AbsorptionByPlayer Absorb_Bomb +SmallMagicRefill_AbsorptionByPlayer Absorb_SmallMagic +FiveArrowRefill_AbsorptionByPlayer Absorb_Arrows_5 +Sprite_DrawAbsorbableOrReturn SpriteDraw_AbsorbableTransient +Sprite_Octorock Sprite_08_Octorok +Octorock_Normal Octorok_ShootSingle +Octorock_FourShooter Octorok_Shoot4Ways +Octorock_SpitOutRock Octorok_FireLoogie +Sprite_Octostone Sprite_0C_OctorokStone +Octostone_DrawCrumbling SpriteDraw_OctorokStoneCrumbling +Sprite_Octoballoon Sprite_0F_Octoballoon +Octoballoon_ApplyRecoilToPlayer Octoballoon_RecoilLink +Octoballoon_SpawnTheSpawn Octoballoon_FormBabby +Sprite_Octospawn Sprite_10_OctoballoonBaby +Sprite_Buzzblob Sprite_0D_Buzzblob +Sprite_WallInducedSpeedInversion Sprite_BounceOffWall +Sprite_NegateVel Sprite_InvertSpeed_XY +Sprite_InvertVertSpeed Sprite_InvertSpeed_Y +Sprite_PrepAndDrawSingleLarge SpriteDraw_SingleLarge +Sprite_PrepAndDrawSingleSmall SpriteDraw_SingleSmall +Sprite_DrawShadow SpriteDraw_Shadow +Sprite_DrawShadowEx SpriteDraw_Shadow_custom +Sprite_DrawKey Sprite_DrawThinAndTall +Sprite_StalfosHead Sprite_02_StalfosHead +SpriteHeld_Main SpriteModule_Carried +SpriteHeld_ThrowQuery CarriedSprite_CheckForThrow +ThrownSprite_TileAndPeerInteraction ThrownSprite_TileAndSpriteInteraction +SpriteStunned_Main SpriteModule_Stunned +ThrownSprite_CheckDamageToPeers ThrownSprite_CheckDamageToSprites +ThrownSprite_CheckDamageToSinglePeer ThrownSprite_CheckDamageToSingleSprite +Sprite_NegateHalveSpeedEtc Sprite_ApplyRicochet +Sprite_Func20 ThrowableScenery_TransmuteIfValid +Sprite_Func21 ThrowableScenery_TransmuteToDebris +Sprite_Func2 Sprite_ScheduleForBreakage +Sprite_HalveVelocity Sprite_HalveSpeed_XY +Fish_SpawnLeapingFish Sprite_SpawnLeapingFish +SpriteStunned_Main_Func1_withRipple HandleFreezeAndStunTimer +SpritePoof_Main SpriteModule_Poof +Sprite_PrepOamCoordSafe Sprite_PrepOamCoord +sub_86E4A1 Sprite_CheckTileCollision_set_layer +j_Sprite_CheckTileCollisionSingleLayer Sprite_CheckTileCollision_check_just_one +Sprite_Func7 Sprite_CheckForTileInDirection_horizontal +Sprite_Func6 Sprite_CheckForTileInDirection_vertical +Sprite_Func9 SpriteFall_AdjustPosition +Sprite_Func10 Sprite_CheckTileInDirection +Sprite_Func5 Sprite_CheckTileProperty +Entity_GetTileAttr GetTileAttribute +Sprite_GetTileAttrLocal Sprite_GetTileAttribute +Entity_CheckSlopedTileCollisionLong Sprite_CheckSlopedTileCollision +Sprite_ProjectSpeedTowardsPlayer_return Sprite_ProjectSpeedTowardsLink_instantexit +Sprite_ProjectSpeedTowardsPlayer Sprite_ProjectSpeedTowardsLink +Sprite_ApplySpeedTowardsPlayer Sprite_ApplySpeedTowardsLink +Sprite_ProjectSpeedTowardsEntity Sprite_ProjectSpeedTowardsLocation +sub_86EA2A Sprite_ProjectSpeedTowardsLocation_fastexit +Sprite_IsToRightOfEntity Sprite_IsRightOfLocation +Sprite_IsBelowEntity Sprite_IsBelowLocation +Sprite_DirectionToFaceEntity Sprite_DirectionToFaceLocation +Sprite_Func1 Guard_ParrySwordAttacks +Sprite_Func13 Sprite_AttemptZapDamage +Sprite_CheckAncillaDamage Ancilla_CheckDamageToSprite +Sprite_CheckAncillaDamage2 Ancilla_CheckDamageToSprite_aggressive +Sprite_Func11 Ancilla_CheckDamageToSprite_preset +Sprite_Func14 Sprite_CalculateSwordDamage +Sprite_Func16 Sprite_ApplyCalculatedDamage +Sprite_Func17 AgahnimBalls_DamageAgahnim +Sprite_HitTimer24 Sprite_MiniMoldorm_Recoil +Sprite_CheckDamageToPlayer Sprite_CheckDamageToLink +Sprite_CheckDamageToPlayerSameLayer Sprite_CheckDamageToLink_same_layer +Sprite_CheckDamageToPlayerIgnoreLayer Sprite_CheckDamageToLink_ignore_layer +Sprite_CheckDamageToPlayer_CheckCoord Sprite_SetupHitBox00 +Sprite_CheckDamageFromPlayer Sprite_CheckDamageFromLink +Sprite_StaggeredCheckDamageToPlayerPlusRecoil Sprite_AttemptDamageToLinkWithCollisionCheck +Sprite_AttemptDamageToPlayerPlusRecoil Sprite_AttemptDamageToLinkPlusRecoil +sub_86F445 Sprite_RecoilLinkAndTHUMP +Player_SetupActionHitBoxLong SetupActionHitBox +Player_SetupActionHitBoxInner2 SetupActionHitBox_spinning +Player_SetupActionHitBoxInner SetupActionHitBox_dashing +Sprite_Func12 Sprite_DoHitBoxesFast +Sprite_ApplyRecoilToPlayer Sprite_ApplyRecoilToLink +Player_PlaceRepulseSpark Link_PlaceWeaponTink +Sprite_PlaceRupulseSpark Sprite_PlaceWeaponTink +GetPlayerHitBoxUnlessDisabled Link_SetupHitBox_conditional +GetPlayerHitBox Link_SetupHitBox +OAM_AllocateDeferToPlayer Oam_AllocateDeferToPlayer +SpriteDeath_Main SpriteModule_Die +SpriteDeath_Func1 Sprite_DoTheDeath +SpriteDeath_Func2 ForcePrizeDrop +SpriteDeath_Func3 PrepareEnemyDrop +SpriteDeath_DrawPerishingOverlay SpriteDeath_DrawPoof +SpriteCustomFall_Main SpriteModule_Fall2 +Sprite_DrawFall_Type0 SpriteDraw_FallingHelmaBeetle +Sprite_DrawFall_Type1 SpriteDraw_FallingHumanoid +sub_86FF6D UNREACHABLE_06FF73 +Player_Main Link_Main +Player_DoSfx1 PlaySfx_Set1 +Player_DoSfx2 PlaySfx_Set2 +Player_DoSfx3 PlaySfx_Set3 +GetPlayerRelativePan PlaySfx_SetPan +Player_Main_UnlessFrozen Link_ControlHandler +PlayerHandler_00_Ground LinkState_Default +PlayerHandler_00_Ground_2 HandleLink_From1D +Link_CheckRemoveTempbunny Link_HandleBunnyTransformation +PlayerHandler_1C_TempBunny LinkState_TemporaryBunny +Link_TempBunny_Func1 LinkState_Bunny_recache +PlayerHandler_18_StuckUnderRock LinkState_HoldingBigRock +Player_InitiateFirstEtherSpell EtherTablet_StartCutscene +PlayerHandler_19_ReceiveEther LinkState_ReceivingEther +Player_InitiateFirstBombosSpell BombosTablet_StartCutscene +PlayerHandler_1A_ReceiveBombos LinkState_ReceivingBombos +sub_87866D InitiateDesertCutscene +PlayerHandler_1B_OpenDesertPalace LinkState_ReadingDesertTablet +Player_CheckGravestoneOrSomariaBlock HandleSomariaAndGraves +PlayerHandler_02_RecoilMode LinkState_Recoil +Player_HandleIncapacitated Link_HandleRecoilAndTimer +PlayerHandler_05_TurtleRockPlatform_UNUSED LinkState_OnIce +Player_RecoilMode_Helper1 Link_HandleChangeInZVelocity +PlayerHandler_0B_FallingLedgeDown LinkHop_HoppingSouthOW +Player_Ledge_Handler1 LinkState_HandlingJump +Link_DoMoveXCoord_Outdoors_Helper3 LinkHop_FindTileToLandOnSouth +PlayerHandler_0C_FallingLedge LinkState_HoppingHorizontallyOW +Link_DoMoveXCoord_Outdoors_Helper2 Link_HoppingHorizontally_FindTile_Y +Player_RecoilMode_Helper2 Link_SetToDeepWater +PlayerHandler_0F_JumpLedgeMore_UNUSED LinkState_0F +Link_DoMoveXCoord_Outdoors_Helper1 Link_HoppingHorizontally_FindTile_X +PlayerHandler_0D_JumpDiagLedgeUp LinkState_HoppingDiagonallyUpOW +PlayerHandler_0E_JumpLedgeDown LinkState_HoppingDiagonallyDownOW +Link_Ledge_Func1 LinkHop_FindLandingSpotDiagonallyDown +Player_HandleIncapacitated_Helper1 Link_SplashUponLanding +PlayerHandler_11_StartDash LinkState_Dashing +PlayerHandler_12_OutOfDash LinkState_ExitingDash +Player_HaltDashAttack Link_CancelDash +Link_Move_Helper5 RepelDash +Link_MoveXY_Helper LinkApplyTileRebound +Player_RepelDashAttack Sprite_RepelDash +SetDirectionFromRecoil Flag67WithDirections +PlayerHandler_01_FallHole LinkState_Pits +DoSwordInteractionWithTiles_Helper2 HandleLayerOfDestination +Player_DecreaseHealthWithHole DungeonPitDoDamage +HoleToDungeon_Helper1 HandleDungeonLandingFromPit +PlayerHandler_04_Swimming_Inner Link_HandleSwimMovements +Link_Swim_Helper2 Link_FlagMaxAccels +Link_Swim_Helper3 Link_SetIceMaxAccel +Link_Swim_Helper4 Link_SetMomentum +Player_ResetSwimState Link_ResetSwimmingState +Link_ResetSomething1 Link_ResetStateAfterDamagingPit +Player_ResetSwimCollision ResetAllAcceleration +Link_Swim_Helper1 Link_HandleSwimAccels +Link_Swim_Helper5 Link_SetTheMaxAccel +PlayerHandler_07_Electrocution LinkState_Zapped +Link_SetInBed Link_TuckIntoBed +PlayerHandler_16_SleepInBed LinkState_Sleeping +PlayerHandler_16_SleepInBed_00 Link_SnoringInBed +PlayerHandler_16_SleepInBed_01 Link_SittingUpInBed +PlayerHandler_16_SleepInBed_02 Link_JumpingOutOfBed +Player_Sword Link_HandleSwordCooldown +Link_HandleYButtonItems Link_HandleYItem +Player_HandleActions Link_HandleAPress +Player_DoAction Link_APress_PerformBasic +Link_CheckFireBeam HandleSwordSfxAndBeam +Player_Sword_Inner Link_CheckForSwordSwing +Player_Sword_SpinAttackJerks HandleSwordControls +Player_SetAllowDirChangeEtc Link_ResetSwordAndItemUsage +Player_CalcSwordOamOffs CalculateSwordHitBox +Item_Rod_Shoot RodItem_CreateShot +Item_Rod_Shoot_2 RodItem_CreateIceShot +Item_Rod_Shoot_1_Outer RodItem_CreateFireShot +LinkItem_RemoveFromHand Link_ResetBoomerangYStuff +LinkItem_MagicPowder LinkItem_Powder +GanonEmerges_SpawnTravelBird CallForDuckIndoors +LinkItem_BookOfMudora LinkItem_Book +LinkItem_EtherMedallion LinkItem_Ether +PlayerHandler_08_Ether LinkState_UsingEther +PlayerHandler_09_Bombos LinkState_UsingBombos +PlayerHandler_0A_QuakeMedallion LinkState_UsingQuake +Link_SomethingThenSetSpinAttacking Link_ActivateSpinAttack +Link_SetSpinAttacking Link_AnimateVictorySpin +PlayerHandler_03_SpinAttack LinkState_SpinAttack +sub_87A8EC UNREACHABLE_07A8DC +PlayerHandler_14_MagicMirror LinkState_CrossingWorlds +Link_ActionBookMudora Link_PerformDesertPrayer +Player_AfterMirrorWarp HandleFollowersAfterMirroring +PlayerHandler_13_Hookshot LinkState_Hookshotting +Item_Cape_StopWithAnim Link_ForceUnequipCape +Player_TurnOffCapeMode Link_ForceUnequipCape_quietly +Link_SomethingCollideWithFloor HaltLinkWhenUsingItems +Player_CheckHandleCapeStuff_IfCarry Link_HandleCape_passive_LiftCheck +DoSwordInteractionWithTiles_Byrna SearchForByrnaSpark +LinkItem_BugCatchingNet LinkItem_Net +Link_CheckNewY_ButtonPress CheckYButtonPress +LinkItem_EvaluateMagicCost LinkCheckMagicCost +LinkItem_ReturnUnusedMagic Refund_Magic +Player_ResetSomeCrap Link_ItemReset_FromOverworldThings +Link_Lift Link_PerformThrow +Link_AfterAction1_Pickup Link_APress_LiftCarryThrow +Link_StartDash Link_PerformDash +nullsub_6 Link_APress_NothingB +Link_GrabWall Link_PerformGrab +Link_AfterAction3_GrabWall Link_APress_PullObject +Link_MovableStatue Link_PerformStatueDrag +Link_AfterAction6_MovableStatue Link_APress_StatueDrag +Link_PullForRupees Link_PerformRupeePull +PlayerHandler_1D_PullRupees LinkState_TreePull +Link_ReadSign Link_PerformRead +Link_Chest Link_PerformOpenChest +CheckAButtonPressedNow Link_CheckNewAPress +PlayerHandler_00_RelatedToABtn Link_HandleToss +sub_87B609 UNREACHABLE_07B5F2 +Player_LimitDirections Link_HandleDiagonalCollision +Player_DoTileInteractions Link_HandleCardinalCollision +Link_MoveCoord_YX RunSlopeCollisionChecks_VerticalFirst +Link_MoveCoord_XY RunSlopeCollisionChecks_HorizontalFirst +Player_CheckSetLowerLevelMoving CheckIfRoomNeedsDoubleLayerCheck +Player_SetUpperLevelCheckMoving CreateVelocityFromMovingBackground +Link_DoMoveYCoord StartMovementCollisionChecks_Y +Link_DoMoveYCoord_Indoors StartMovementCollisionChecks_Y_HandleIndoors +Player_DoMoveY_Entry2 HandlePushingBonkingSnaps_Y +Link_DoMoveYCoord_Outdoors StartMovementCollisionChecks_Y_HandleOutdoors +Link_CheckTriggerJumpLedge1 RunLedgeHopTimer +Link_Move_Helper4_CheckSmash Link_BonkAndSmash +AlignYCoordToTile Link_AddInVelocityYFalling +Link_MoveY_AdjustXForDoor CalculateSnapScratch_Y +Add_R0_To_X AddAbsoluteScratchToXCoord +Link_MoveY_Doorway_Helper3 ChangeAxisOfPerpendicularDoorMovement_Y +Link_SubtractVelFromY Link_AddInVelocityY +Link_SomeKindOfRecoil_Y Link_HopInOrOutOfWater_Y +Link_MoveY_RecoilOther Link_FindValidLandingTile_North +Link_JumpOffLedgeUpDown Link_FindValidLandingTile_DiagonalNorth +Link_DoMoveXCoord StartMovementCollisionChecks_X +Link_DoMoveXCoord_Indoors StartMovementCollisionChecks_X_HandleIndoors +Player_DoMoveX_Entry2 HandlePushingBonkingSnaps_X +Link_DoMoveXCoord_Outdoors StartMovementCollisionChecks_X_HandleOutdoors +AlignXCoordToTile SnapOnX +Link_DoMoveXCoord_Indoors_0 CalculateSnapScratch_X +Add_R0_to_Y AddAbsoluteScratchToYCoord +Link_DoMoveXCoord_Indoors_DoorWay ChangeAxisOfPerpendicularDoorMovement_X +Link_SomeKindOfRecoil_X Link_HopInOrOutOfWater_X +Link_AvoidJudderAgainstDiagWall Link_HandleDiagonalKickback +DetectTiles_MoveY TileDetect_Movement_Y +DetectTiles_MoveX TileDetect_Movement_X +DetectTiles_3_UpDown TileDetect_Movement_VerticalSlopes +DetectTiles_4_LeftRight TileDetect_Movement_HorizontalSlopes +Player_TileDetectNearby_Far TileDetect_BigArea +DetectTiles_5_UNUSED TileDetect_UnusedIce +DoSwordInteractionWithTiles TileDetect_MainHandler +DoSwordInteractionWithTiles_Helper4 Link_PermissionForSloshSounds +ChangableDungeonObj_Func1B PushBlock_AttemptToPushTheBlock +GetBestActionToPerformOnTile Link_HandleLiftables +Link_Move_Helper6 HandleNudging +Hookshot_CheckTileCollison Hookshot_CheckTileCollision +DetectTiles_7 HandleNudgingInADoor +DetectTiles_8 TileCheckForMirrorBonk +DetectTiles_9 TileDetect_SwordSwingDeepInDoor +TileDetect_Execute TileDetection_Execute +DoSwordInteractionWithTiles_Helper TileBehavior_HandleItemAndExecute +TileHandlerIndoor_01 TileBehavior_StandardCollision +TileHandlerIndoor_18 TileBehavior_SlopeOuter +TileHandlerIndoor_10 TileBehavior_Slope +TileHandlerIndoor_1D TileBehavior_NorthSingleLayerStairs +TileHandlerIndoor_1E TileBehavior_NorthSwapLayerStairs +TileHandlerIndoor_20 TileBehavior_Pit +TileHandlerIndoor_0C TileBehavior_OverlayMask_0C +TileHandlerIndoor_0E TileBehavior_GanonIce +TileHandlerIndoor_0F TileBehavior_PalaceIce +TileHandlerIndoor_C0 TileBehavior_LightableTorch +TileHandlerIndoor_08 TileBehavior_DeepWater +TileHandlerIndoor_0A TileBehavior_ShortWaterLadder +TileHandlerIndoor_1C TileBehavior_OverlayMask_1C +TileHandlerIndoor_90 TileBehavior_LayerToggleShutterDoor +TileHandlerIndoor_98 TileBehavior_LayerAndDungeonToggleShutterDoor +TileHandlerIndoor_A2 TileBehavior_DungeonToggleShutterDoor +TileHandlerIndoor_A0 TileBehavior_DungeonToggleManualDoor +TileHandlerIndoor_09 TileBehavior_ShallowWater +TileHandlerIndoor_70 TileBehavior_ManipulablyReplaced +TileHandlerOutdoors_0B TileBehavior_UnusedDeepWater +TileHandlerIndoor_58 TileBehavior_Chest +TileHandlerIndoor_3D TileBehavior_SouthSingleLayerStairs +TileHandlerIndoor_44 TileBehavior_Spike +TileHandlerIndoor_0D TileBehavior_SpikeFloor +TileHandlerIndoor_27 TileBehavior_Hookshottables +IsHookshotTile TileBehavior_FlagManipulable +TileHandlerIndoor_F0 TileBehavior_FlaggableDoor +TileHandlerIndoor_60 TileBehavior_RupeeTile +TileHandlerIndoor_67 TileBehavior_CrystalPeg_Up +TileHandlerIndoor_68 TileBehavior_Conveyor_Upwards +TileHandlerIndoor_69 TileBehavior_Conveyor_Downwards +TileHandlerIndoor_6A TileBehavior_Conveyor_Leftwards +TileHandlerIndoor_6B TileBehavior_Conveyor_Rightwards +TileHandlerIndoor_63 TileBehavior_MinigameChest +TileHandlerIndoor_8E TileBehavior_Entrance +TileHandlerOutdoors_00 TileBehavior_NothingOW +TileHandlerIndoor_40 TileBehavior_ThickGrass +TileHandlerIndoor_48 TileBehavior_DiggableGround +TileHandlerIndoor_50 TileBehavior_Liftable +TileHandlerIndoor_29 TileBehavior_Ledge_South +TileHandlerIndoor_28 TileBehavior_Ledge_North +TileHandlerIndoor_2A TileBehavior_Ledge_EastWest +TileHandlerIndoor_2C TileBehavior_Ledge_NorthDiagonal +TileHandlerIndoor_2D TileBehavior_Ledge_SouthDiagonal +TileHandlerOutdoors_4C TileBehavior_UnusedCornerType +TileHandlerOutdoors_4E TileBehavior_EasternRuinsCorner +TileHandlerIndoor_4B TileBehavior_Warp +TileHandlerOutdoors_42 TileBehavior_GraveStone +TileHandlerIndoor_46 TileBehavior_HylianPlaque +TileHandlerIndoor_57 TileBehavior_BonkRocks +ChangableDungeonObj_Func1C PushBlock_GetTargetTileFlag +Link_AvoidJudderAgainstDiagWall_Y FlagMovingIntoSlopes_Y +Link_AvoidJudderAgainstDiagWall_X FlagMovingIntoSlopes_X +Player_HandleIncapacitated_Inner Link_HandleRecoiling +Player_SomethingWithVelocity Link_HandleVelocity +Player_MovePosition1 LinkHop_FindArbitraryLandingSpot +Player_ApplyDragAndComputeVel Link_HandleVelocityAndSandDrag +Player_SomethingWithVelocity_IsSwimming HandleSwimStrokeAndSubpixels +Player_SomethingWithVelocity_IsTired Link_DashInPlace +Player_CheckApplyFloorVel Link_HandleMovingFloor +Player_ApplyFloorVel Link_ApplyMovingFloorVelocity +Player_MovingBelt Link_ApplyConveyor +Player_UpdateDirection_PushingBits4 Link_HandleMovingAnimation_SetFacingDown +Player_UpdateDirection Link_HandleMovingAnimation_FullLongEntry +Player_UpdateDirection_Part2 Link_HandleMovingAnimation_StartWithDash +Player_UpdateDirection_Swimming Link_HandleMovingAnimationSwimming +Player_UpdateDirection_Running Link_HandleMovingAnimation_Dash +Player_CheckDoorwayQuadrantMovement HandleIndoorCameraAndDoors +Player_CheckDoorwayMovement HandleDoorTransitions +Player_CheckCrossQuadrantBoundary ApplyLinksMovementToCamera +PrayingScene_InitHDMA DesertPrayer_InitializeIrisHDMA +PrayingScene_HDMAStuff DesertPrayer_BuildIrisHDMATable +PrayingScene_Func1 DesertHDMA_CalculateIrisShapeLine +InsertIntoChangableDungeonObj FindFreeMovingBlockSlot +ChangableDungeonObj_Func1 InitializePushBlock +ChangableDungeonObj_Func2 PushBlock_Slide +PushBlock_Handler_Step4 PushBlock_HandleFalling +ChangableDungeonObj_Func2C PushBlock_ApplyVelocity +ChangableDungeonObj_Func2B PushBlock_HandleCollision +Sprite_HandlePushedBlocks Sprite_Dungeon_DrawAllPushBlocks +Sprite_DrawOnePushedBlock Sprite_Dungeon_DrawSinglePushBlock +Init_Player Link_Initialize +Player_ResetState Link_ResetProperties_A +Player_ResetState2 Link_ResetProperties_B +Player_ResetState3 Link_ResetProperties_C +Player_UsedForSpiralStaircase HandleLinkOnSpiralStairs +UsedForSpiralStaircase2 SpiralStairs_FindLandingSpot +Link_ResetTimerForPushGetTired LinkResetPushTimer +sub_87F3FD UNREACHABLE_07F3D7 +Player_IsScreenTransitionBlocked Link_CheckForEdgeScreenTransition +Tagalong_CanWeDisplayMessage Follower_ValidateMessageFreedom +Player_ApproachTriforce TriforceRoom_LinkApproachTriforce +Sprite_CheckIfPlayerPreoccupied Sprite_CheckIfLinkIsBusy +Player_IsPipeEnterable Pipe_ValidateEntry +Player_OutdoorCacheStatePriorToHandler CacheCameraPropertiesIfOutdoors +Ancilla_DoSfx1_NearPlayer Ancilla_Sfx1_Near +Player_DoSfx2 Ancilla_Sfx2_Near +Player_DoSfx3 Ancilla_Sfx3_Near +Player_SetSfxPan Ancilla_Sfx_Near +Ancilla_DoSfx1 Ancilla_Sfx1_Pan +Ancilla_DoSfx2 Ancilla_Sfx2_Pan +Ancilla_DoSfx3 Ancilla_Sfx3_Pan +Ancilla_GetSfxPan Ancilla_Sfx_SetPan +Item_Rod_Shoot_1 AncillaAdd_FireRodShot +SomarianBlast_SpawnCentrifugalQuad SomariaBlock_SpawnBullets +Bomb_ProjectReflexiveSpeedOntoSprite Ancilla_ProjectReflexiveSpeedOntoSprite +Ancilla_ExecuteObjects Ancilla_ExecuteAll +Ancilla_ExecuteObject Ancilla_ExecuteOne +Ancilla_IceShotSparkle Ancilla13_IceRodSparkle +IceShotSparkle_Spawn AncillaAdd_IceRodSparkle +Ancilla_SomarianBlast Ancilla01_SomariaBullet +Ancilla_FireShot Ancilla02_FireRodShot +Ancilla_CheckTileCollisionStaggered Ancilla_CheckTileCollision_staggered +Ancilla_CheckTileCollisionOneFloorEx Ancilla_CheckTileCollision_targeted +Ancilla_BeamHit Ancilla04_BeamHit +Ancilla_CheckOneSpriteCollision Ancilla_CheckSpriteCollision_Single +Ancilla_IsToRightOfPlayer Ancilla_IsRightOfLink +Ancilla_IsBelowPlayer Ancilla_IsBelowLink +Ancilla_RepulseSpark Ancilla_WeaponTink +Ancilla_Boomerang Ancilla05_Boomerang +Boomerang_CheckForScreenEdgeReversal Boomerang_ScreenEdge +Boomerang_SelfTerminateIfOffscreen Boomerang_StopOffScreen +Ancilla_WallHit Ancilla06_WallHit +Ancilla_Bomb Ancilla07_Bomb +Ancilla_ConveyorBeltVelocityOverride Ancilla_ApplyConveyor +Ancilla_LiftableObjectLogic Ancilla_HandleLiftLogic +Ancilla_Liftable_Func4 Ancilla_LatchAltitudeAboveLink +Ancilla_Liftable_Func3 Ancilla_LatchLinkCoordinates +Ancilla_Liftable_Func2 Ancilla_LatchCarriedPosition +Ancilla_Adjust_Y_CoordByAltitude Ancilla_LatchYCoordToZ +Ancilla_RestoreY Ancilla_SetYFrom_DP72 +Bomb_GetSomeDistance Bomb_GetDisplacementFromLink +Ancilla_DoorDebris Ancilla08_DoorDebris +Ancilla_Arrow Ancilla09_Arrow +Ancilla_HaltedArrow Ancilla0A_ArrowInTheWall +Ancilla_IceShot Ancilla0B_IceRodShot +Ancilla_IceShotSpread Ancilla11_IceRodWallHit +Ancilla_BlastWallStuff Ancilla33_BlastWallExplosion +BlastWall_DrawExplosion AncillaDraw_BlastWallBlast +Bomb_DrawExplosion AncillaDraw_Explosion +Ancilla_JumpSplash Ancilla15_JumpSplash +Ancilla_HitStars Ancilla16_HitStars +Ancilla_ShovelDirt Ancilla17_ShovelDirt +Ancilla_BlastWallFireball Ancilla32_BlastWallFireball +Ancilla_EtherSpell Ancilla18_EtherSpell +EtherSpell_LightningDescends EtherSpell_HandleLightningStroke +EtherSpell_PulsingBlitzOrb EtherSpell_HandleOrbPulse +EtherSpell_RadialStates EtherSpell_HandleRadialSpin +EtherSpell_DrawBlitzBall AncillaDraw_EtherBlitzBall +EtherSpell_DrawSplittingBlitzSegment AncillaDraw_EtherBlitzSegment +EtherSpell_DrawBlitzSegments AncillaDraw_EtherBlitz +EtherSpell_DrawBlitzOrb AncillaDraw_EtherOrb +Bombos_StartAnim AncillaAdd_BombosSpell +Ancilla_BombosSpell Ancilla19_BombosSpell +Bombos_ExecuteFlameColumns BombosSpell_ControlFireColumns +BombosSpell_WrapUpFlameColumns BombosSpell_FinishFireColumns +BombosSpell_DrawFireColumn AncillaDraw_BombosFireColumn +BombosSpell_ExecuteBlasts BombosSpell_ControlBlasting +BombosSpell_DrawBlast AncillaDraw_BombosBlast +Ancilla_QuakeSpell Ancilla1C_QuakeSpell +QuakeSpell_ExecuteBolts QuakeSpell_ControlBolts +QuakeSpell_DrawFirstGroundBolts AncillaDraw_QuakeInitialBolts +QuakeSpell_SpreadGroundBolts QuakeSpell_SpreadBolts +Ancilla_MagicPowder Ancilla1A_PowderDust +MagicPowder_ApplySpriteDamage Powder_ApplyDamageToSprites +Ancilla_DashTremor Ancilla1D_ScreenShake +Ancilla_DashDust Ancilla1E_DashDust +Ancilla_Hookshot Ancilla1F_Hookshot +Ancilla_BedSpread Ancilla20_Blanket +Ancilla_SleepIcon Ancilla21_Snore +Ancilla_VictorySparkle Ancilla3B_SwordUpSparkle +Ancilla_SwordChargeSpark Ancilla3C_SpinAttackChargeSparkle +Ancilla_SwordCeremony Ancilla35_MasterSwordReceipt +Ancilla_ReceiveItem Ancilla22_ItemReceipt +Ancilla_WishPondItem Ancilla28_WishPondItem +Ancilla_HappinessPondRupees Ancilla42_HappinessPondRupees +HappinessPondRupees_ExecuteRupee HapinessPondRupees_ExecuteRupee +HappinessPondRupees_LoadRupeeeState HapinessPondRupees_GetState +HappinessPondRupees_StoreRupeeState HapinessPondRupees_SaveState +Ancilla_TransmuteToObjectSplash Ancilla_TransmuteToSplash +Ancilla_ObjectSplash Ancilla3D_ItemSplash +Ancilla_MilestoneItem Ancilla29_MilestoneItemReceipt +Ancilla_TransmuteToRisingCrystal ItemReceipt_TransmuteToRisingCrystal +Ancilla_AddSwordChargeSpark AncillaAdd_OccasionalSparkle +Ancilla_BreakTowerSeal Ancilla43_GanonsTowerCutscene +BreakTowerSeal_DrawCrystal AncillaDraw_GTCutsceneCrystal +BreakTowerSeal_ActivateSingleSparkle GTCutscene_ActivateSparkle +BreakTowerSeal_ExecuteSparkles GTCutscene_SparkleALot +Ancilla_Flute Ancilla36_Flute +Ancilla_WeathervaneExplosion Ancilla37_WeathervaneExplosion +WeathervaneExplosion_DrawWoodChunk AncillaDraw_WeathervaneExplosionWoodDebris +Ancilla_TravelBirdIntro Ancilla38_CutsceneDuck +Ancilla_MorphPoof Ancilla23_LinkPoof +Ancilla_DwarfPoof Ancilla40_DwarfPoof +Ancilla_BushPoof Ancilla3F_BushPoof +Ancilla_SwordSwingSparkle Ancilla26_SwordSwingSparkle +Ancilla_InitialSpinSpark Ancilla2A_SpinAttackSparkleA +InitialSpinSpark_TransmuteToNormalSpinSpark SpinAttackSparkleA_TransmuteToNextSpark +Ancilla_SpinSpark Ancilla2B_SpinAttackSparkleB +Sparkle_GetRadialProjectionCoords Sparkle_PrepOamFromRadial +SpinSpark_ExecuteClosingSpark SpinAttackSparkleB_Closer +Ancilla_InitialCaneSpark Ancilla30_ByrnaWindupSpark +CaneSpark_TransmuteInitialToNormal ByrnaWindupSpark_TransmuteToNormal +Ancilla_CaneSpark Ancilla31_ByrnaSpark +Ancilla_SwordFullChargeSpark Ancilla0D_SpinAttackFullChargeSpark +Ancilla_TravelBird Ancilla27_Duck +Item_CaneOfSomaria_Shoot AncillaAdd_SomariaBlock +SomarianBlock_CheckForTransitLine SomariaBlock_CheckForTransitTile +Ancilla_CheckSingleBasicSpriteCollision Ancilla_CheckBasicSpriteCollision_Single +Ancilla_SomarianBlock Ancilla2C_SomariaBlock +SomarianBlock_Func1 AncillaDraw_SomariaBlock +SomarianBlock_CheckCoveredTileTrigger SomariaBlock_CheckForSwitch +SomarianBlock_PlayerInteraction SomariaBlock_HandlePlayerInteraction +Ancilla_TransmuteToSomarianBlockFizzle SomariaBlock_FizzleAway +Ancilla_SomarianBlockFizzle Ancilla2D_SomariaBlockFizz +Ancilla_SomarianPlatformPoof Ancilla39_SomariaPlatformPoof +Ancilla_SomarianBlockDivide Ancilla2E_SomariaBlockFission +Ancilla_LampFlame Ancilla2F_LampFlame +Ancilla_WaterfallSplash Ancilla41_WaterfallSplash +Ancilla_Gravestone Ancilla24_Gravestone +Gravestone_RepelPlayerAdvance Gravestone_ActAsBarrier +Ancilla_SkullWoodsFire Ancilla34_SkullWoodsFire +Ancilla_SuperBombExplosion Ancilla3A_BigBombExplosion +Ancilla_RevivalFaerie RevivalFairy_Main +RevivalFaerie_Dust RevivalFairy_Dust +RevivalFaerie_MonitorPlayerRecovery RevivalFairy_MonitorHP +Ancilla_GameOverTextLong Animate_GAMEOVER_Letters +Ancilla_SetSfxPan_NearEntity Ancilla_SetPanRelativeCoordinates +Ancilla_Func1 AncillaAdd_AddAncilla_Bank08 +Ancilla_FindMatch UNREACHABLE_08F671 +Ancilla_SetSafeOam_XY Ancilla_SetOam_XY_safe +Ancilla_CheckPlayerCollision Ancilla_CheckLinkCollision +Hookshot_CheckChainLinkProximityToPlayer Hookshot_CheckProximityToLink +Ancilla_CheckIfEntranceTriggered Ancilla_CheckForEntranceTrigger +Ancilla_DrawShadow AncillaDraw_Shadow +Ancilla_AllocateOam_B_or_E Ancilla_AllocateOamFromRegion_B_or_E +Tagalong_GetCloseToPlayer Follower_MoveTowardsLink +Ancilla_CustomAllocateOam Ancilla_AllocateOamFromCustomRegion +Hookshot_IsCollisionCheckFutile Hookshot_ShouldIEvenBotherWithTiles +Ancilla_AllocateOam Ancilla_AllocateOamFromRegion_A_or_D_or_F +BeamHit_Get_Top_X_Bit BeamHit_GetTopXBit +AddShovelHitStars Ancilla_AddHitStars +AddLinksBedSpread AncillaAdd_Blanket +AddSleepInBedAncilla AncillaAdd_Snoring +Item_Bomb_Place AncillaAdd_Bomb +Item_Boomerang_Shoot AncillaAdd_Boomerang +AddReceivedItem AncillaAdd_ItemReceipt +GiveBottledItem ItemReceipt_GiveBottledItem +AddWishPondItem AncillaAdd_TossedPondItem +AddPendantOrCrystal AncillaAdd_FallingPrize +Item_Shovel_FoundFlute AncillaAdd_DugUpFlute +AddChargedSpinAttackSparkle AncillaAdd_ChargedSpinAttackSparkle +Item_Flute_DoAnim1 AncillaAdd_ExplodingWeatherVane +AddTravelBirdIntro AncillaAdd_CutsceneDuck +AddSomarianPlatformPoof AncillaAdd_SomariaPlatformPoof +AddSuperBombExplosion AncillaAdd_SuperBombExplosion +Ancilla_ConfigureRevivalObjects ConfigureRevivalAncillae +Item_CaneOfByrna_DoAnim AncillaAdd_CaneOfByrnaInitSpark +AddLampFlame AncillaAdd_LampFlame +AddShovelDirt AncillaAdd_ShovelDirt +AddSwordCeremony AncillaAdd_MSCutscene +AddDashingDust AncillaAdd_DashDust +AddDashingDust_notYetMoving AncillaAdd_DashDust_charging +AddBlastWallFireball AncillaAdd_BlastWallFireball +Item_Bow_Shoot AncillaAdd_Arrow +AddWarpTransformationCloud AncillaAdd_BunnyPoof +Cape_DoAnim AncillaAdd_CapePoof +AddDwarfTransformationCloud AncillaAdd_DwarfPoof +AddDisintegratingBushPoof AncillaAdd_BushPoof +Ether_StartAnim AncillaAdd_EtherSpell +AddVictorySpinEffect AncillaAdd_VictorySpin +AddMagicPowder AncillaAdd_MagicPowder +AddWallTapSpark AncillaAdd_WallTapSpark +AddLinksSleepZs AncillaAdd_SwordSwingSparkle +AddDashTremor AncillaAdd_DashTremor +AddBoomerangWallHit AncillaAdd_BoomerangWallClink +AddHookshotWallHit AncillaAdd_HookshotWallClink +Item_Flute_DoAnim2 AncillaAdd_Duck_take_off +Quake_StartAnim AncillaAdd_QuakeSpell +AddSpinAttackStartSparkle AncillaAdd_SpinAttackInitSpark +AddBlastWall AncillaAdd_BlastWall +AddSwordChargeSpark AncillaAdd_SwordChargeSparkle +AddSilverArrowSparkle AncillaAdd_SilverArrowSparkle +Item_Rod_Shoot_2 AncillaAdd_IceRodShot +AddTransitionSplash AncillaAdd_Splash +Link_MoveGravestone AncillaAdd_GraveStone +Item_Hookshot_Shoot AncillaAdd_Hookshot +AddWaterfallSplash AncillaAdd_WaterfallSplash +AddBreakTowerSeal AncillaAdd_GTCutscene +AddDoorDebris AncillaAdd_DoorDebris +ConsumingFire_TransmuteToSkullWoodsFire FireRodShot_BecomeSkullWoodsFire +AddAncilla Ancilla_AddAncilla +AddAncilla AncillaAdd_AddAncilla_Bank09 +Ancilla_HasAncillaOfType AncillaAdd_CheckForPresence +Ancilla_Arrow_Allocate AncillaAdd_ArrowFindSlot +Ancilla_CheckCollide_A Ancilla_CheckInitialTile_A +Tagalong_CheckBlindTriggerRegion Follower_CheckBlindTrigger +Tagalong_Init Follower_Initialize +Tagalong_SpawnFromSprite Sprite_BecomeFollower +Tagalong_Main Follower_Main +Tagalong_MainB Follower_NoTimedMessage +Tagalong_Func1 Follower_CheckGameMode +Tagalong_Type_Other Follower_BasicMover +Tagalong_Func2 Follower_NotFollowing +Tagalong_Type_2_4 Follower_OldMan +Tagalong_Type_3_11 Follower_OldManUnused +Tagalong_Draw3 Follower_DoLayers +Tagalong_CheckPlayerProximity Follower_CheckProximityToLink +Tagalong_HandleMessages Follower_HandleTrigger +Tagalong_DrawInner Follower_AnimateMovement_preserved +Tagalong_SetOam_XY FollowerDraw_CalculateOamCoords +Tagalong_CheckTextTriggerProximity Follower_CheckForTrigger +Tagalong_Disable Follower_Disable +Ancilla_GetCoords Ancilla_GetCoordinates +AddSomarianBlockDivide AncillaAdd_ExplodingSomariaBlock +GiveRupeeGift Ancilla_AddRupees +Ancilla_MotiveDashDust DashDust_Motive +Sprite_InitFromInfo Sprite_SetSpawnedCoordinates +Sprite_SpawnMadBatterBolts Sprite_MagicBat_SpawnLightning +Sprite_VerifyAllOnScreenDefeated Sprite_CheckIfScreenIsClear +Sprite_VerifyAllOnScreenDefeatedB Sprite_CheckIfRoomIsClear +Sprite_VerifyOverlordDefeated Sprite_CheckIfOverlordsClear +Sprite_ReinitWarpVortex Sprite_InitializeMirrorPortal +InitSpriteSlots Sprite_InitializeSlots +ZoraFireball_SpawnTailGarnish Fireball_SpawnTrailGarnish +Garnish_ArrghusSplash Garnish15_ArrghusSplash +Garnish_SpawnPyramidDebris GarnishSpawn_PyramidDebris +Garnish_PyramidDebris Garnish13_PyramidDebris +Garnish_Move_XY Garnish_MoveXY +Garnish_GanonBatFlameout Garnish11_WitheringGanonBatFlame +Garnish_GanonBatFlame Garnish10_GanonBatFlame +Garnish_TrinexxIce Garnish0C_TrinexxIceBreath +Garnish_RunningManDashDust Garnish14_KakKidDashDust +Garnish_CannonPoof Garnish0A_CannonSmoke +Garnish_LightningTrail Garnish09_LightningTrail +Garnish_BabusuFlash Garnish07_BabasuFlash +Garnish_Nebule Garnish08_KholdstareTrail +Garnish_ZoroDander Garnish06_ZoroTrail +Garnish_Sparkle Garnish12_Sparkle +Garnish_TrinexxLavaBubble Garnish0E_TrinexxFireBreath +Garnish_BlindLaserTrail Garnish0F_BlindLaserTrail +Garnish_LaserBeamTrail Garnish04_LaserTrail +Garnish_CrumbleTile Garnish03_FallingTile +Garnish_WinderTrail Garnish01_FireSnakeTail +Garnish_MothulaBeamTrail Garnish02_MothulaBeamTrail +Garnish_SetOamPropsAndLargeSize Garnish_FinalizeBigOamObject +Overlord_ArmosCoordinator Overlord19_ArmosCoordinator_bounce +Overlord_RedStalfosTrap Overlord18_InvisibleStalfos +Overlord_StalfosTrapTriggerWindow Overlord17_PotTrap +Overlord_ZoroFactory Overlord16_ZoroSpawner +Overlord_WizzrobeFactory Overlord15_WizzrobeSpawner +Overlord_FlyingTileFactory Overlord14_TileRoom +Overlord_SpawnFlyingTile TileRoom_SpawnTile +Overlord_PirogusuFactory Overlord10_PirogusuSpawner_left +Overlord_CrumbleTilePath Overlord0A_FallingSquare +CrumbleTilePath_SpawnCrumbleTileGarnish SpawnFallingTile +Overlord_WallMasterFactory Overlord09_WallmasterSpawner +Overlord_ZolFactory Overlord08_BlobSpawner +Overlord_MovingFloor Overlord07_MovingFloor +Overlord_StalfosFactory_Unused Overlord04_Unused +Sprite_PlayDropSfx Sprite_Overlord_PlayFallingSfx +Overlord_StalfosTrap Overlord05_FallingStalfos +Overlord_SnakeTrap Overlord06_BadSwitchSnake +Overlord_AllDirectionMetalBallFactory Overlord02_FullRoomCannons +Overlord_CascadeMetalBallFactory Overlord03_VerticalCannon +Overlord_SpawnMetalBall Overlord_SpawnCannonBall +Overlord_SpritePositionTarget Overlord01_PositionTarget +SpawnCrazyVillageSoldier Snitch_SpawnGuard +Overlord_CheckInRangeStatus Overlord_CheckIfActive +Sprite_SetDungeonSpriteDeathFlag Sprite_ManuallySetDeathFlagUW +Dungeon_LoadSprite Dungeon_LoadSingleSprite +Dungeon_LoadOverlord Dungeon_LoadSingleOverlord +Sprite_OverworldReloadAll Sprite_ReloadAll_Overworld +LoadOverworldSprites_A Overworld_LoadSprites +LoadOverworldSprites_B Sprite_ActivateAllProxima +Sprite_RangeBasedActivation Sprite_ProximityActivation +Sprite_RangeBasedActivation_Func1 Sprite_ActivateWhenProximal +Sprite_RangeBasedActivation_Func2 Sprite_ActivateWhenProximalBig +Sprite_RangeBasedActivation_Func3 Sprite_Overworld_ProximityMotivatedLoad +Overworld_LoadSpritesInBlk Overworld_LoadProximaSpriteIfAlive +Overworld_LoadSpriteOrOverlord Overworld_LoadSingleSprite +Overworld_LoadOverlord Overworld_LoadSingleOverlord +SpriteExplode_Main SpriteModule_Explode +Sprite_SchedulePeersForDeath Sprite_KillFriends +Garnish_ScatterDebris Garnish16_ThrownItemDebris +Sprite_SelfTerminate Sprite_KillSelf +Module_Death Module12_GameOver +Death_Func0 GameOver_AdvanceImmediately +Death_Func2 GameOver_DelayBeforeIris +Death_Func3 GameOver_IrisWipe +Death_Func5 GameOver_SplatAndFade +Death_Func7 Animate_GAMEOVER_Letters_bounce +Death_ShowSaveOptionsMenu GameOver_Finalize_GAMEOVR +Death_Func9 GameOver_SaveAndOrContinue +Death_AddSomeSprite GameOver_AnimateChoiceFairy +Death_Func10 GameOver_InitializeRevivalFairy +Death_Func11 RevivalFairy_Main_bounce +Death_Func12 GameOver_RiseALittle +Death_Func13 GameOver_Restore0D +Death_Func14 GameOver_Restore0E +Death_RestoreScreenPostRevival GameOver_ResituateLink +Module_Quit Module17_SaveAndQuit +Polyhedral_InitThread Polyhedral_InitializeThread +Polyhedral_Thread_Main Polyhedral_RunThread +Poly_LoadFromLut Polyhedral_SetShapePointer +Poly_GetSinCos Polyhedral_SetRotationMatrix +Poly_ComputeXY Polyhedral_OperateRotation +Poly_ComputeF Polyhedral_RotatePoint +Poly_DivideF2 Polyhedral_ProjectPoint +Poly_DrawAll Polyhedral_DrawPolyhedron +Poly_SetColor_Front Polyhedral_SetForegroundColor +Poly_Check_Ordering Polyhedral_CalculateCrossProduct +Poly_SetRasterColor Polyhedral_SetColorMask +Poly_ClearBuf Polyhedral_EmptyBitMapBuffer +Poly_Rasterize_Polygon Polyhedral_DrawFace +Poly_Rasterize_Line Polyhedral_FillLine +Poly_Raster_NextX0 Polyhedral_SetLeft +Poly_Raster_NextX1 Polyhedral_SetRight +Messaging_BirdTravel Module0E_0A_FluteMenu +BirdTravel_InitGfx FluteMenu_LoadMap +BirdTravel_InitCounter FluteMenu_AdvanceMode +BirdTravel_Main FluteMenu_HandleSelection +BirdTravel_LoadTargetArea FluteMenu_LoadSelectedScreen +BirdTravel_LoadAmbientOverlay Overworld_LoadOverlayAndMap +BirdTravel_Finish FluteMenu_FadeInAndQuack +OverworldMap_Backup WorldMap_FadeOut +OverworldMap_InitGfx WorldMap_LoadLightWorldMap +OverworldMap_DarkWorldTilemap WorldMap_LoadDarkWorldMap +OverworldMap_LoadSprGfx WorldMap_LoadSpriteGFX +OverworldMap_BrightenScreen WorldMap_Brighten +OverworldMap_Main WorldMap_PlayerControl +OverworldMap_PrepExit WorldMap_RestoreGraphics +OverworldMap_SetRegsForExit Attract_SetUpConclusionHDMA +OverworldMap_RestoreGfx WorldMap_ExitMap +ConfigureHdmaForMapMode WorldMap_SetUpHDMA +ClearMode7Tilemap WorldMap_FillTilemapWithEF +OverworldMap_AddSprites WorldMap_HandleSprites +OverworldMap_GetCoords WorldMap_CalculateOamCoordinates +OverworldMap_AddObj WorldMap_HandleSpriteBlink +Multiply_8bit WorldMap_MultiplyAxB +Shift_4_times WorldMap_ShiftNibblesRight +OverworldMap_SubtractXY4 WorldMapIcon_AdjustCoordinate +OverworldMap_CheckPendant OverworldMap_CheckForPendant +OverworldMap_CheckCrystal OverworldMap_CheckForCrystal +Messaging_DungMap Module0E_03_DungeonMap +DungMap_Init Module0E_03_01_DrawMap +DungMap_Init0_SetupGraphics Module0E_03_01_00_PrepMapGraphics +DungMap_Init1_OptionalGraphic Module0E_03_01_01_DrawLEVEL +DungMap_Init2 Module0E_03_01_02_DrawFloorsBackdrop +DungMap_Init2_Helper DungeonMap_BuildFloorListBoxes +DungMap_Init3 Module0E_03_01_03_DrawRooms +DungMap_Init3A DungeonMap_DrawBorderForRooms +DungMap_Init3B DungeonMap_DrawFloorNumbersByRoom +DungMap_Init3C DungeonMap_DrawDungeonLayout +DungMap_Init3D DungeonMap_DrawSingleRowOfRooms +DungMap_Init4 DungeonMap_DrawRoomMarkers +DungMap_State3 DungeonMap_HandleInputAndSprites +DungMap_Func1 DungeonMap_HandleInput +DungMap_Func3 DungeonMap_HandleMovementInput +DungMap_Func4 DungeonMap_HandleFloorSelect +DungMap_Func5 DungeonMap_ScrollFloors +DungMap_Func2 DungeonMap_DrawSprites +DungMap_DrawPlayerFloorIndicator DungeonMap_DrawLinkPointing +DungMap_Func6 DungeonMap_DrawBlinkingIndicator +DungMap_Func7 DungeonMap_DrawLocationMarker +DungMap_Func8 DungeonMap_DrawFloorNumberObjects +DungMap_Func9 DungeonMap_DrawFloorBlinker +DungMap_Func10 DungeonMap_DrawBossIcon +DungMap_DrawBossFloorIndicator DungeonMap_DrawBossIconByFloor +DungMap_State4 Module0E_03_04_UnusedCrazyScroll +DungMap_RestoreGraphics DungeonMap_RecoverGFX +DungMap_RestoreStarTileState ToggleStarTilesAndAdvance +Dungeon_Effect_Handler Dungeon_HandleLayerEffect +Effect_DoNothing LayerEffect_Nothing +Effect_MovingFloor LayerEffect_Scroll +Effect_MovingFloor2 LayerEffect_Trinexx +Effect_RedFlashes LayerEffect_Agahnim2 +Effect_TorchHiddenTiles LayerEffect_InvisibleFloor +Effect_TorchGanonRoom LayerEffect_Ganon +Effect_MovingWater LayerEffect_WaterRapids +Overworld_SetFixedColorsAndScroll Overworld_SetFixedColAndScroll +Player_ResetSomeStuff2 ResetSomeThingsAfterDeath +sub_8BFFEE ResetAncillaAndLink +Module_Intro Module00_Intro +Intro_InitWram Intro_Clear1kbBlocksOfWRAM +Intro_LoadTitleGraphics Intro_InitializeMemory_darken +Intro_ShowPlayerSelect FadeMusicAndResetSRAMMirror +Intro_InitGfxAndSprites Intro_InitializeTriforcePolyThread +Polyhedral_SetPalette LoadTriforceSpritePalette +Intro_TopAnimateObjs Intro_HandleAllTriforceAnimations +Intro_AnimObjs Scene_AnimateEverySprite +Intro_CheckRunStep Intro_AnimateTriforce +CopyIntroSprite0ToOam AnimateSceneSprite_DrawTriangle +Intro_SpriteType_A_1 EXIT_0CCA90 +Intro_SpriteType_A_2 InitializeSceneSprite_Copyright +Intro_SpriteType_B_2_NintendoCopy AnimateSceneSprite_Copyright +Intro_SpriteType_A_3 InitializeSceneSprite_Sparkle +Intro_SpriteType_B_3 AnimateSceneSprite_Sparkle +IntroSprite3_Periodic AnimateSceneSprite_DrawSparkle +CopyIntroSpritesToOam AnimateSceneSprite_AddObjectsToOamBuffer +Intro_MoveObjectWithVel AnimateSceneSprite_MoveTriangle +TriforceRoom_LoadSprites TriforceRoom_PrepGFXSlotForPoly +Ending_Func8 Credits_InitializePolyhedral +TriforceRoom_AnimObjs AdvancePolyhedral +TriforceRoom_HandlePoly_Case0 IntroPolyhedral_StartUp +TriforceRoom_HandlePoly_Case2 IntroPolyhedral_MoveRotate +TriforceRoom_HandlePoly_Case3 IntroPolyhedral_LockIntoPlace +Ending_Func10 Credits_AnimateTheTriangles +Ending_Func10_Inner CreditsTriangle_HandleRotation +Ending_Func10_Inner2 CreditsTriangle_ApplyRotation +Intro_SpriteType_A_456 InitializeSceneSprite_TriforceRoomTriangle +IntroSpriteTypeB_456_Helper AnimateTriforceRoomTriangle_HandleContracting +Intro_SpriteType_A_7 InitializeSceneSprite_CreditsTriangle +Intro_SpriteType_B_7 AnimateSceneSprite_CreditsTriangle +Module_SelectFile Module01_FileSelect +Module_SelectFile_1 FileSelect_ReInitSaveFlagsAndEraseTriforce +Module_EraseFile_0 FileSelect_EraseTriforce +Module_SelectFile_3 FileSelect_TriggerStripesAndAdvance +Module_SelectFile_4 FileSelect_TriggerNameStripesAndAdvance +Module_SelectFile_5 FileSelect_Main +sub_8CCEC7 FileSelect_SetUpNamesStripes +Death_RestoreFromSrm CopySaveToWRAM +Module_CopyFile Module02_CopyFile +Module_CopyFile_3 CopyFile_ChooseSelection +Module_CopyFile_4 CopyFile_ChooseTarget +Module_CopyFile_5 CopyFile_ConfirmSelection +sub_8CD0C6 FilePicker_DeleteHeaderStripe +sub_8CD13F CopyFile_SelectionAndBlinker +sub_8CD22D ReturnToFileSelect +sub_8CD27B CopyFile_TargetSelectionAndBlink +sub_8CD371 CopyFile_HandleConfirmation +sub_8CD3DC CopyFile_CopyData +Module_EraseFile Module03_KILLFile +Module_EraseFile_2 KILLFile_SetUp +Module_EraseFile_3 KILLFile_HandleSelection +Module_EraseFile_4 KILLFile_HandleConfirmation +sub_8CD4BA KILLFile_ChooseTarget +SelectFile_DrawFaerie FileSelect_DrawFairy +Module_NamePlayer Module04_NameFile +sub_8CD89C NameFile_EraseSave +sub_8CDA4D NameFile_DoTheNaming +sub_8CDC8C NameFile_CheckForScrollInputX +sub_8CDCBF NameFile_CheckForScrollInputY +sub_8CDD30 NameFile_DrawSelectedCharacter +Module_Attract Module14_Attract +Attract_SlowBrigthenSetFlag Attract_FadeInStep +Attract_SlowBrighten Attract_FadeInSequence +Attract_SlowFadeToBlank Attract_FadeOutSequence +Attract_PrepNextSequence Attract_LoadNewScene +Attract_PrepLegend AttractScene_PolkaDots +Attract_PrepMapZoom AttractScene_WorldMap +Attract_PrepThroneRoom AttractScene_ThroneRoom +Attract_PrepLast AttractScene_EndOfStory +Attract_RunSequence Attract_EnactStory +Attract_Legend AttractDramatize_PolkaDots +Attract_MapZoom AttractDramatize_WorldMap +Attract_ZeldaPrison AttractDramatize_Prison +Attract_AdvanceToNextSequence Dramaghanim_AdvanceStory +Attract_MaidenWarp AttractDramatize_AgahnimAltar +Attract_Exit Attract_SkipToFileSelect +Attract_LoadNextLegendGraphic Attract_BuildNextImageTileMap +Attract_AdjustMapZoom Attract_ControlMapZoom +Attract_InitGraphics_Helper3 Attract_BuildBackgrounds +sub_8CF879 Attract_TriggerBGDMA +Attract_DrawSpriteSet Attract_DrawPreloadedSprite +Atract_DrawZelda Attract_DrawZelda +sub_8CFA30 Attract_DrawKidnappedMaiden +Attract_SetupHdma Attract_SetUpWindowingHDMA +PlayerOam_Main LinkOam_Main +PlayerOam_GetHighestSetBit FindMostSignificantBit +PlayerOam_Main_SwordStuff_DoDma LinkOam_SetWeaponVRAMOffsets +PlayerOam_ShieldStuff LinkOam_SetEquipmentVRAMOffsets +PlayerOam_DrawTipOfBetterSword LinkOam_CalculateSwordSparklePosition +PlayerOam_DrawOam_Throwing LinkOam_UnusedWeaponSettings +PlayerOam_DrawOam_2 LinkOam_DrawDungeonFallShadow +PlayerOam_DrawGrassOrWater LinkOam_DrawFootObject +PlayerOam_Unused_0 UNREACHABLE_0DAFA6 +PlayerOam_GetRelativeHighBit LinkOam_CalculateXOffsetRelativeLink +Sprite_LoadProperties SpritePrep_LoadProperties +Sprite_LoadPalette SpritePrep_LoadPalette +Sprite_ResetProperties SpritePrep_ResetProperties +GetRandomInt GetRandomNumber +OAM_AllocateFromRegionA Oam_AllocateFromRegionA +OAM_AllocateFromRegionB Oam_AllocateFromRegionB +OAM_AllocateFromRegionC Oam_AllocateFromRegionC +OAM_AllocateFromRegionD Oam_AllocateFromRegionD +OAM_AllocateFromRegionE Oam_AllocateFromRegionE +OAM_AllocateFromRegionF Oam_AllocateFromRegionF +OAM_GetBufferPosition Oam_GetBufferPosition +Ancilla_GetPanFlag Ancilla_CalculateSfxPan +Sound_GetPanForPlayer Link_CalculateSfxPan +Sound_SetSfx1Pan SpriteSfx_QueueSfx1WithPan +Sound_SetSfx2Pan SpriteSfx_QueueSfx2WithPan +Sound_SetSfx3Pan SpriteSfx_QueueSfx3WithPan +Sound_AddSfxPan SpriteSfx_ApplyPanning +Sprite_GetSfxPan Sprite_CalculateSfxPan +Sound_GetPanForX CalculateSfxPan +LightTorch_GetSfxPan CalculateSfxPan_Arbitrary +sub_8DC217 SpriteDontDraw_Stalfos +Soldier_CheckTileSolidity Probe_CheckTileSolidity +Sprite_HumanMulti_1_Long Sprite_29_Adult +Sprite_BlindHideoutGuy Sprite_BlindsHutGuy +Sprite_FluteBoyFather Sprite_FluteDad +Sprite_SweepingLadyLong Sprite_2A_SweepingLady +Sprite_LumberjacksLong Sprite_2C_Lumberjacks +Lumberjacks_CheckProximity Lumberjack_CheckProximity +Sprite_UnusedTelepathLong Sprite_2D_TelepathicTile +Sprite_FortuneTellerLong Sprite_31_FortuneTeller +Sprite_DwarfSolidity Sprite_SmithyBlockade +FortuneTeller_Main FortuneTeller +LW_FortuneTeller_WaitForInquiry FortuneTeller_LightWorld_PrecognizantResponse +LW_FortuneTeller_AskIfPlayerWantsReading FortuneTeller_LightWorld_OfferReading +FortuneTeller_GiveReading FortuneTeller_PerformPseudoScience +FortuneTeller_PopulateNextMessageSlot FortuneTeller_PrepareNextMessage +LW_FortuneTeller_ShowCostMessage FortuneTeller_LightWorld_DemandPayment +LW_FortuneTeller_DeductPayment FortuneTeller_LightWorld_TakeMoney +DW_FortuneTeller_WaitForInquiry FortuneTeller_DarkWorld_PrecognizantResponse +DW_FortuneTeller_AskIfPlayerWantsReading FortuneTeller_DarkWorld_OfferReading +DW_FortuneTeller_ShowCostMessage FortuneTeller_DarkWorld_DemandPayment +sub_8DCA2D FortuneTeller_DemandPayment +DW_FortuneTeller_DeductPayment FortuneTeller_DarkWorld_TakeMoney +Dwarf_SpawnDwarfSolidity Smithy_SpawnDumbBarrierSprite +Sprite_MazeGameLadyLong Sprite_2F_RaceGameLady +MazeGameLady_Startup RaceGameLady_Idle +MazeGameLady_AccumulateTime RaceGameLady_TimeRun +MazeGameLady_PlayStartingNoise RaceGameLady_FireStarterPistol +Sprite_MazeGameGuyLong Sprite_30_RaceGameGuy +MazeGameGuy_ParseElapsedTime RaceGameGuy_VerifyRun +MazeGameGuy_CheckPlayerQualification RaceGameGuy_MakeModDecision +MazeGameGuy_SorryCantHaveIt RaceGameGuy_RejectRun +MazeGameGuy_YouCanHaveIt RaceGameGuy_IdleInDiscord +BomberPellet_DrawExplosion SpriteDraw_ZirroBomb +GoodBee_AttackOtherSprite PlayerBee_HoneInOnTarget +Pikit_DrawTongue SpriteDraw_Pikit_Tongue +Pikit_MultiplicationDelay Three_NOP +Pikit_DrawGrabbedItem SpriteDraw_Pikit_Loot +CheckPalaceItemPossession ItemMenu_CheckForDungeonPrize +Module_EndSequence Module1A_Credits +EndSequence_0 Credits_LoadNextScene_Overworld +EndSequence_2 Credits_LoadNextScene_Dungeon +EndSequence_ResetSprites Credits_PrepAndLoadSprites +EndSequence_1 Credits_ScrollScene_Overworld +EndSequence_3 Credits_ScrollScene_Dungeon +EndSequence_1_3_Common Credits_HandleSceneFade +Ending_InitSprites_6 Credits_LoadSprites_Zora +Ending_InitSprites_10 Credits_LoadSprites_Venus +EndSequence1_Case0 Credits_SpriteDraw_Castle +EndSequence1_Case4 Credits_SpriteDraw_Hera +EndSequence1_Case2 Credits_SpriteDraw_Kakariko1 +EndSequence1_Case5 Credits_SpriteDraw_House +EndSequence1_Case13 Credits_SpriteDraw_DeathMountain +EndSequence1_Case8 Credits_SpriteDraw_Lumberjacks +EndSequence1_Case10 Credits_SpriteDraw_Venus +EndSequence1_Case12 Credits_SpriteDraw_Kakariko2 +EndSequence_DrawShadow Credits_SpriteDraw_DrawShadow +Ending_Func2_0x30 Credits_SpriteDraw_AnimateRunningKidAndLocksmith +Ending_Func4_8 Credits_SpriteDraw_ActivateAndRunSprite_allocate8 +Ending_Func4 Credits_SpriteDraw_ActivateAndRunSprite +EndSequence_CallMainFunc_8 Credits_SpriteDraw_PreexistingSpriteDraw_eight +EndSequence_CallMainFunc Credits_SpriteDraw_PreexistingSpriteDraw +EndSequence_DrawStuff Credits_SpriteDraw_Single +EndSequence1_Case6 Credits_SpriteDraw_Zora +EndSequence1_Case11 Credits_SpriteDraw_Smithy +sub_8EA8C8 Credits_SpriteDraw_DrawSmithSpark +EndSequence1_Case3 Credits_SpriteDraw_Desert +EndSequence1_Case1 Credits_SpriteDraw_Sanctuary +EndSequence1_Case7 Credits_SpriteDraw_Witch +EndSequence1_Case9 Credits_SpriteDraw_Grove +EndSequence1_Case14 Credits_SpriteDraw_LostWoods +EndSequence_SetFlags2 Credits_SpriteDraw_SetShadowProp +Ending_Func3 Credits_SpriteDraw_AddSparkle +EndSequence1_Case15 Credits_SpriteDraw_Pedestal +Ending_Func6 Credits_SpriteDraw_WalkLinkAwayFromPedestal +Ending_Func5 Credits_SpriteDraw_MoveSquirrel +Ending_MoveSprite_Func1 Credits_SpriteDraw_CirclingBirds +EndSequence1_ScrollMap Credits_HandleCameraScrollControl +EndSequence1_ScrollMap_Inner Credits_SingleCameraScrollControl +Ending_Func11 Credits_FadeOutFixedCol +EndSequence_34 Credits_FadeColorAndBeginAnimating +Ending_DrawCredits Credits_AddNextAttribution +EndSequence0and2_CopyToVram Credits_AddEndingSequenceText +EndSequence_33 Credits_BrightenTriangles +EndSequence_35 Credits_StopCreditsScroll +EndSequence_36 Credits_FadeAndDisperseTriangles +EndSequence_37 Credits_FadeInTheEnd +EndSequence_38 Credits_HangForever +Messaging_Text RenderText +Text_PostDeathSaveOptions RenderText_PostDeathSaveOptions +Text_Command RenderText_ExtendedCommand +Text_IgnoreCommand RenderText_ExtendedCommand_IgnoreCommand +Text_IgnoreParamCommand RenderText_ExtendedCommand_IgnoreParameter +Text_SetWindowType RenderText_ExtendedCommand_SetWindowType +Text_SetWindowPos RenderText_ExtendedCommand_SetWindowPosition +Text_DrawBorder RenderText_Draw_Border +Text_DrawBorderIncremenal RenderText_Draw_BorderIncremental +Text_DrawFirstBorderRow RenderText_Draw_BorderIncremental_Top +Text_DrawMiddleBorderRow RenderText_Draw_BorderIncremental_Middle +Text_DrawBottomBorderRow RenderText_Draw_BorderIncremental_Bottom +Text_CharacterTilemap RenderText_Draw_CharacterTilemap +Text_MessageHandler RenderText_Draw_MessageCharacters +VWF_CharacterOrCommand RenderText_Draw_HandleNext +Text_Close RenderText_Draw_Finish +VWF_Render RenderText_Draw_RenderCharacter +VWF_RenderRecursive RenderText_Draw_RenderCharacter_All +sub_8ECCF9 RenderText_Draw_RenderCharacter_ReduceSpeed +VWF_NextPicture RenderText_Draw_NextImage +VWF_Select2Or3_Indented RenderText_Draw_Choose2LowOr3 +VWF_SelectItem RenderText_Draw_ChooseItem +VWF_SelectPrevItem RenderText_FindYItem_Previous +VWF_SelectNextItem RenderText_FindYItem_Next +VWF_ChangeItemTiles RenderText_DrawSelectedYItem +VWF_IgnoreCommand RenderText_Draw_Ignore +VWF_Choose3 RenderText_Draw_Choose3 +VWF_Choose1Or2 RenderText_Draw_Choose1Or2 +VWF_Scroll RenderText_Draw_Scroll +VWF_SetPalette RenderText_Draw_SetColor +VWF_Wait RenderText_Draw_Wait +VWF_WaitLoop_initCounter RenderText_Draw_Wait_Init +VWF_EndWait RenderText_Draw_Wait_End +VWF_PlaySound RenderText_Draw_PlaySfx +VWF_SetSpeed RenderText_Draw_SetSpeed +VWF_Command7B RenderText_Draw_Command7B +VWF_Command7C RenderText_Draw_ABunchOfSpaces +VWF_ClearBuffer RenderText_Draw_EmptyBuffer +VWF_WaitKey RenderText_Draw_PauseForInput +VWF_EndMessage RenderText_Draw_Terminate +Text_SetDefaultWindowPos RenderText_SetDefaultWindowPosition +Text_InitBorderOffsets RenderText_DrawBorderInitialize +Text_DrawBorderRow RenderText_DrawBorderRow +Text_DrawCharacterTilemap RenderText_Refresh +Sprite_WaterfallLong Sprite_37_Waterfall +Waterfall_Main Waterfall +Sprite_RetreatBat Sprite_BatCrash +RetreatBat_State0 BatCrash_Approach +RetreatBat_State1 BatCrash_Ascend +RetreatBat_State2 BatCrash_DiveBomb +RetreatBat_FinishUp BatCrash_StallTheInevitable +GanonEmerges_SpawnRetreatBat Sprite_SpawnBatCrashCutscene +RetreatBat_DrawSomethingElse BatCrash_DrawHardcodedGarbage +RetreatBat_SpawnPyramidDebris BatCrash_SpawnDebris +Cukeman_Unused UNREACHABLE_1AF9E6 +RunningMan_SpawnDashDustGarnish RunningBoy_SpawnDustGarnish +Sprite_MovableMantle Sprite_EE_CastleMantle +Mothula_Draw_0 SpriteDraw_Mothula +BottleVendor_PayForGoodBee BottleMerchant_BuyBee +Item_Hammer_SpawnWater SpawnHammerWaterSplash +Overworld_Hole Overworld_GetPitDestination +Overworld_Entrance Overworld_UseEntrance +ToolAndTileInteraction HandleItemTileAction_Overworld +Overworld_HammerSfx Overworld_PickHammerSfx +Overworld_LiftableTiles Overworld_HandleLiftableTiles +Overworld_HandleBigRock SmashRockPile_fromLift +Overworld_ApplyBombToTiles Overworld_BombTiles32x32 +Overworld_ApplyBombToTile Overworld_BombTile +Overworld_AlterGargoyleEntrance OpenGargoylesDomain +Overworld_CreatePyramidHole CreatePyramidHole +Overworld_RevealSecret_CheckPowder AdjustSecretForPowder +Overworld_DrawPersistentMap16 Overworld_DrawMap16_Persist +Overworld_DrawMap16_Alt Overworld_AlterTileHardcore +RemapTileAddrToVram Overworld_FindMap16VRAMAddress +Overworld_DrawWarpTile Overworld_CreateTRPortal +Overworld_PlayEntranceSequence Overworld_AnimateEntrance +DarkPalaceEntrance_Main Overworld_AnimateEntrance_PoD +Overworld_EntranceSequence_Func0_0 AnimateEntrance_PoD_step1 +Overworld_EntranceSequence_Func0_1 AnimateEntrance_PoD_step2 +Overworld_EntranceSequence_Func0_2 AnimateEntrance_PoD_step3 +Overworld_EntranceSequence_Func0_3 AnimateEntrance_PoD_step4 +Overworld_EntranceSequence_Func0_4 AnimateEntrance_PoD_step5 +Overworld_EntranceSequence_Func1 Overworld_AnimateEntrance_Skull +Overworld_EntranceSequence_Func1_0 AnimateEntrance_Skull_step1 +Overworld_EntranceSequence_Func1_1 AnimateEntrance_Skull_step2 +Overworld_EntranceSequence_Func1_2 AnimateEntrance_Skull_step3 +Overworld_EntranceSequence_Func1_3 AnimateEntrance_Skull_step4 +Overworld_EntranceSequence_Func1_4 AnimateEntrance_Skull_step5 +MiseryMireEntrance_Main Overworld_AnimateEntrance_Mire +MiseryMireEntrance_Main_Case0 AnimateEntrance_Mire_step1 +MiseryMireEntrance_Main_Case12 AnimateEntrance_Mire_step2 +MiseryMireEntrance_Main_Case3 AnimateEntrance_Mire_step3 +MiseryMireEntrance_Main_Case4 AnimateEntrance_Mire_step4 +MiseryMireEntrance_Main_Case5 AnimateEntrance_Mire_step5 +TurtleRockEntrance_Main Overworld_AnimateEntrance_TurtleRock +Overworld_EntranceSequence_Func3_0 AnimateEntrance_TurtleRock_step1 +Overworld_EntranceSequence_Func3_4 AnimateEntrance_TurtleRock_step5 +Overworld_EntranceSequence_Func3_5 AnimateEntrance_TurtleRock_step6 +Overworld_EntranceSequence_Func3_6 AnimateEntrance_TurtleRock_step7 +Overworld_EntranceSequence_Func3_7 AnimateEntrance_TurtleRock_step8 +EntranceSequence_Finish OverworldEntrance_PlayJingle +TurtleRockEntrance_Draw1 OverworldEntrance_DrawManyTR +GanonTowerEntrance_Main Overworld_AnimateEntrance_GanonsTower +Overworld_EntranceSequence_Func4_0 AnimateEntrance_GanonsTower_step01 +Overworld_EntranceSequence_Func4_2 AnimateEntrance_GanonsTower_step02 +EntranceSequence_Reset OverworldEntrance_AdvanceAndBoom +Overworld_EntranceSequence_Func4_3 AnimateEntrance_GanonsTower_step03 +Overworld_EntranceSequence_Func4_4 AnimateEntrance_GanonsTower_step04 +Overworld_EntranceSequence_Func4_5 AnimateEntrance_GanonsTower_step05 +Overworld_EntranceSequence_Func4_6 AnimateEntrance_GanonsTower_step06 +Overworld_EntranceSequence_Func4_7 AnimateEntrance_GanonsTower_step07 +Overworld_EntranceSequence_Func4_8 AnimateEntrance_GanonsTower_step08 +Overworld_EntranceSequence_Func4_9 AnimateEntrance_GanonsTower_step09 +Overworld_EntranceSequence_Func4_10 AnimateEntrance_GanonsTower_step10 +Overworld_EntranceSequence_Func4_11 AnimateEntrance_GanonsTower_step11 +Overworld_EntranceSequence_Func4_12 AnimateEntrance_GanonsTower_step12 +Palette_SpriteAux3 Palette_Load_SpritePal0Left +Palette_MainSpr Palette_Load_SpriteMain +Palette_SpriteAux1 Palette_Load_SpriteAux1 +Palette_SpriteAux2 Palette_Load_SpriteAux2 +Palette_Sword Palette_Load_Sword +Palette_Shield Palette_Load_Shield +Palette_Unused UNREACHABLE_1BED4F +Palette_MiscSprite Palette_Load_SpriteEnvironment +Palette_MiscSprite_Indoors Palette_Load_SpriteEnvironment_Dungeon +Palette_PalaceMapSpr Palette_Load_DungeonMapSprite +Palette_ArmorAndGloves Palette_Load_LinkArmorAndGloves +Palette_PalaceMapBg Palette_Load_DungeonMapBG +Palette_Hud Palette_Load_HUD +Palette_DungBgMain Palette_Load_DungeonSet +Palette_OverworldBgAux3 Palette_Load_OWBG3 +Palette_OverworldBgMain Palette_Load_OWBGMain +Palette_OverworldBgAux1 Palette_Load_OWBG1 +Palette_OverworldBgAux2 Palette_Load_OWBG2 +Palette_SingleLoad Palette_LoadSingle +Palette_MultiLoad Palette_LoadMultiple +Palette_ArbitraryLoad Palette_LoadMultiple_Arbitrary +Palette_SelectScreen Palette_LoadForFileSelect +Palette_SelectScreenArmor Palette_LoadForFileSelect_Armor +Palette_SelectScreenSword Palette_LoadForFileSelect_Sword +Palette_SelectScreenShield Palette_LoadForFileSelect_Shield +Palette_AgahnimClones Palette_LoadAgahnim +Sprite_ApplyConveyorAdjustment Sprite_ApplyConveyor +Ancilla_CreateDeflectedArrow Sprite_CreateDeflectedArrow +Sprite_Landmine Sprite_D4_Landmine +Sprite_Stal Sprite_D3_Stal +Sprite_Fish Sprite_D2_FloppingFish +Fish_Wriggle FloppingFish_WriggleInHands +Fish_PauseBeforeLeap FloppingFish_PrepareLeap +Sprite_SpawnSmallWaterSplash Sprite_FloppingFish_SpawnSplash +Fish_Leaping FloppingFish_Leap +Fish_PreliminaryDeepWaterCheck FloppingFish_CheckForWaterInit +Fish_FlopAround FloppingFish_Flop +sub_9D847E DontDrawFloppingFish +Sprite_ChimneyAndRabbitBeam Sprite_D1_BunnyBeam +Sprite_RabbitBeam Sprite_BunnyBeam +Sprite_Lynel Sprite_D0_Lynel +Lynel_TargetPlayer Lynel_TargetLink +Lynel_Attack Lynel_Fire +Trident_PlaySfx SwishEvery16Frames +Sprite_Trident Sprite_GanonTrident +Sprite_FlameTrailBat Sprite_FireBat_Trailer +FireBat_Common FireBat_Move +Sprite4_Load_16bit_AuxCoord Sprite_AdjustAuxCoords_bank1D +Sprite_FireBat Sprite_FireBat_Launched +FireBat_Func1 GetPositionRelativeToTheGreatOverlordGanon +FireBat_Case0 FireBat_PositionSelfAndAnimateAndPrepareForLaunch +FireBat_Case1 FireBat_PositionSelfAndAnimate +FireBat_Func2 FireBat_Animate +FireBat_Case2 FireBat_LaunchedFlying +Ganon_CheckEntityProximity Ganon_AttemptTridentCatch +Ganon_Initialize SpritePrep_Ganon_PrepareBattle +Ganon_Func5_Math Ganon_HandleFireBatCircle +MathDelay Six_NOP +Ganon_SpawnSomething Ganon_SpawnSpiralBat +Sprite_Ganon Sprite_D6_Ganon +Ganon_State19 Ganon_Phase4_Stunned +Ganon_State17 Ganon_Phase4_Attack +Ganon_ResetSomething Ganon_EnableInvincibility +Ganon_State15 Ganon_Phase3_SmashFloor +Ganon_State16 Ganon_Phase3_DropTiles +Ganon_SpawnOverlord Ganon_SpawnFallingTilesOverlord +Ganon_State12 Ganon_Phase3_FireBats +Ganon_Func1_5 Ganon_SpawnFireBat_trailing +Ganon_State14 Ganon_Phase3_SabotagePB +Ganon_State07 Ganon_Phase2_CircleOfBats +Ganon_State08 Ganon_Phase2_LaunchSpiralBats +Ganon_State09 Ganon_Phase2_Warp +Ganon_State11 Ganon_Phase2_MakePhaseDecision +Ganon_State00 Ganon_Phase1_IntroduceSelf +Ganon_State01 Ganon_Phase1_ThrowTrident +Ganon_Func2 Ganon_Phase1_AnimateTridentSpin +Ganon_State02 Ganon_Phase1_WaitForTrident +Ganon_State03 Ganon_Phase1_MakePhaseDecision +Ganon_SetGfx Ganon_HandleAnimation_Idle +Ganon_State04 Ganon_Phase1_Warp +Ganon_Func3 Ganon_SelectWarpLocation +Ganon_Func4 Ganon_ShakeHead +Ganon_State13 Ganon_Phase3_Warp +Ganon_State05_10_18 Ganon_LookAround +Ganon_State06 Ganon_Phase2_HoldTrident +Swamola_InitSegments SpritePrep_Swamola_InitializeSegments +Sprite_Swamola Sprite_CF_Swamola +Swamola_Ascending Swamola_Ascend +Sprite_AdjustVelTowards Sprite_Swamola_ApproachTargetVelocity +Swamola_WiggleTowardsTarget Swamola_Wiggle +Swamola_PursueTargetCoord Swamola_ProjectVelocityTowardsTarget +Swamola_Descending Swamola_Descend +Sprite_SwamolaRipples Sprite_Swamola_Ripples +Blind_SpawnFromMaidenTagalong Blind_SpawnFromMaiden +Blind_Initialize SpritePrep_Blind_PrepareBattle +Sprite_BlindHead Sprite_Blind_Head +Blind_SpawnExtraHead Blind_SpawnHead +Sprite_BlindEntities Sprite_CE_Blind +Sprite_Blind Sprite_Blind_Blind_Blind +Blind_BehindTheCurtain Blind_Undress +Blind_FireballReprisal Blind_FireballFlurry +BlindHead_SpawnFireball Blind_SpitFireball +Blind_BlindedByTheLight Blind_THELIGHT +Blind_SpawnPoof SpawnBossPoof +Blind_RetreatToBackWall Blind_EscapeLight +Blind_OscillateAlongWall Blind_Shimmy +Blind_SwitchWalls Blind_SwapSides +Blind_WhirlAround Blind_Spin +Blind_AnimateSetGfx Blind_AnimateRobes +TrinexxComponents_InitializeLong Trinexx_Initialize +TrinexxHead_Initialize Trinexx_Initialize_Rock +TrinexxPartA_Initialize Trinexx_Initialize_Fire +Trinexx_StoreCoords Trinexx_CachePosition +Sprite_TrinexxD Sprite_Trinexx_FinalPhase +Sprite_TrinexxD_Case0 Sprite_Trinexx_Phase2_SnekAlongWall +Trinexx_Unused Trinexx_CircleLink +Sprite_TrinexxD_Case1 Sprite_Trinexx_Phase2_SnekAfterLink +Sprite_TrinexxD_CheckDmg Sprite_Trinexx_CheckDamageToFlashingSegment +Sprite_Trinexx Sprite_CB_TrinexxRockHead +Sprite_Trinexx_State0 Trinexx_ChooseNextAction +Sprite_Trinexx_State1 Trinexx_MoveBody +Sprite_Trinexx_State2 Trinexx_PrepareLunge +Sprite_Trinexx_State3 Trinexx_LungeHead +Trinexx_Func3 Trinexx_WagTail +Trinexx_Func2 Trinexx_HandleShellCollision +Trinexx_Draw1 SpriteDraw_TrinexxRockHead +Trinexx_Draw2 SpriteDraw_TrinexxRockHeadAndBody +Sprite_Trinexx_CC Sprite_CC_TrinexxBreath_FireHead +Sprite_Trinexx_CD Sprite_CD_TrinexxBreath_IceHead +Sprite_TrinexxHead Sprite_Sidenexx +Sprite_CC_State4 Sidenexx_Stunned +Sprite_CC_State0 Sidenexx_Dormant +Sprite_CC_State1 Sidenexx_Think +Sprite_CC_State2 Sidenexx_Move +Sprite_CC_State3 Sidenexx_Breathe +Trinexx_Func5 Sidenexx_ExhaleDanger +Trinexx_Func4 Sidenexx_Explode +Sprite_CD_Alt Sprite_TrinexxBreath_ice +Sprite_CC_Alt Sprite_TrinexxBreath_fire +Sprite_CC_SpawnGarnish Sprite_TrinexxFire_AddFireGarnish +SpritePrep_ChainChomp SpritePrep_Chainchomp +Sprite_ChainChomp Sprite_CA_ChainChomp +ChainChomp_State0 ChainChomp_Idle +ChainChomp_State1 ChainChomp_Meander +ChainChomp_State2 ChainChomp_InvertLunge +ChainChomp_MulStuff ChainChomp_MoveChain +ChainChomp_CopyToHist ChainChomp_HandleLeash +Sprite_GanonHelpers Sprite_C9_Tektite +Tektite_Stationary Tektite_Idle +Tektite_Aloft Tektite_Midjump +Tektite_RepeatingHop Tektite_Bouncy +Sprite_BigFaerieOrCloud Sprite_C8_BigFairy +Sprite_FaerieCloud Sprite_FairyCloud +FaerieCloud_SeekPlayer FairyCloud_ApproachLink +FaerieCloud_AwaitFullPlayerHealth FairyCloud_WaitForHeal +FaerieCloud_FadeOut FairyCloud_Dissipate +Sprite_BigFaerie Sprite_BigFairy +BigFaerie_AwaitClosePlayer BigFairy_WaitForLink +BigFaerie_Dormant BigFairy_DoAbsolutelyNothing +Sprite_Hokbok Sprite_C7_Pokey +Hokbok_ResetBounceVelocity Pokey_ResetBounce +Hokbok_Moving Pokey_MoveFaster +Sprite_Medusa Sprite_C5_Medusa +sub_9DC845 Fireball_Configure +Sprite_FireballJunction Sprite_C6_4WayShooter +Sprite_Thief Sprite_C4_Thief +Thief_WatchPlayer Thief_Watching +Thief_ChasePlayer Thief_Chasing +Thief_StealShit Thief_Stealing +Thief_TrackDownBooty Thief_TargetBooty +Thief_AttemptBootyGrab Thief_GrabBooty +Thief_CheckPlayerCollision Thief_CheckCollisionWithLink +Thief_DislodgePlayerItems Thief_SpillItems +Sprite_Gibo Sprite_C3_Gibo +Gibo_ExpelNucleus Gibo_Mitosis +Gibo_DelayPursuit Gibo_Osmosis +Gibo_PursueNucleus Gibo_ConsumeDaughter +Sprite_Boulder Sprite_C2_Boulder +Sprite_DrawLargeShadow SpriteDraw_BigShadow +ChattyAgahnim_SpawnZeldaOnAltar CutsceneAgahnim_SpawnZeldaOnAltar +Sprite_ChattyAgahnim Sprite_C1_CutsceneAgahnim +ChattyAgahnim_Main CutsceneAgahnim_Agahnim +ChattyAgahnim_Problab CutsceneAgahnim_HelloMyNameIs +ChattyAgahnim_LevitateZelda CutsceneAgahnim_LightAsAFeatherStiffAsABoard +ChattyAgahnim_DoTelewarpSpell CutsceneAgahnim_BanishZelda +ChattyAgahnim_CompleteTelewarpSpell CutsceneAgahnim_MadeHerGoPoof +ChattyAgahnim_Epiblab CutsceneAgahnim_Brag +ChattyAgahnim_TeleportTowardCurtains CutsceneAgahnim_HideBehindCurtain +Sprite_SpawnAgahnimAfterImage Sprite_Agahnim_ApplyMotionBlur +ChattyAgahnim_LingerThenTerminate CutsceneAgahnim_ExistNoMore +ChattyAgahnim_DrawTelewarpSpell SpriteDraw_CutsceneAgahnimSpell +Sprite_AltarZelda Sprite_CutsceneAgahnim_Zelda +AltarZelda_DrawWarpEffect SpriteDraw_AltarZeldaWarp +Sprite_GiantMoldormLong Sprite_09_Moldorm +GiantMoldorm_StraightPath Moldorm_Move +GiantMoldorm_SpinningMeander Moldorm_Turn +GiantMoldorm_LungeAtPlayer Moldorm_Charge +GiantMoldorm_DrawHead SpriteDraw_Moldorm_Head +GiantMoldorm_DrawSegment_A SpriteDraw_Moldorm_SegmentA +GiantMoldorm_DrawSegment_B SpriteDraw_Moldorm_SegmentB +GiantMoldorm_DrawSegment_C SpriteDraw_Moldorm_SegmentC +GiantMoldorm_HandleTail Moldorm_HandleTail +GiantMoldorm_DrawTail SpriteDraw_Moldorm_Tail +GiantMoldorm_DrawEyeballs SpriteDraw_Moldorm_Eyeballs +GiantMoldorm_AwaitDeath Moldorm_Explode +Sprite_MakeBossDeathExplosion Sprite_MakeBossExplosion +Sprite_VultureLong Sprite_01_Vulture +Vulture_Dormant Vulture_Perched +Sprite_RavenLong Sprite_00_Raven +Raven_InWait Raven_Perched +Raven_Ascend Raven_Rise +Raven_SetSpriteDir Raven_SetFlip +Raven_FleePlayer Raven_Flee +Vitreous_SpawnSmallerEyesLong Vitreous_SpawnMinions +Sprite_GreatCatfish Sprite_C0_Catfish +Sprite_StandaloneItem Sprite_Catfish_QuakeMedallion +GreatCatfish_Main Catfish_BigFish +GreatCatfish_AwaitSpriteThrownInCircle Catfish_Sleep +GreatCatfish_RumbleBeforeEmergence Catfish_TheRumbling +GreatCatfish_Emerge Catfish_Surface +GreatCatfish_ConversateThenSubmerge Catfish_LeaveMeAlone +GreatCatfish_SpawnSurfacingSplash I_said_no_plop +GreatCatfish_SpawnQuakeMedallion Catfish_RegurgitateMedallion +Sprite_SpawnFlippersItem Sprite_Zora_RegurgitateFlippers +GreatCatfish_SpawnImmediatelyDrownedSprite Catfish_SpawnPlop +Sprite_WaterSplash Sprite_Catfish_SplashOfWater +Sprite_Lightning Sprite_BF_Lightning +Lightning_SpawnFulgurGarnish Lightning_SpawnGarnish +Sprite_Vitreous Sprite_BD_Vitreous +Vitreous_Dormant Vitreous_DunkedInGoo +Vitreous_SpewLightning Vitreous_Lightningening +Vitreous_PursuePlayer Vitreous_Bouncing +Vitreous_SelectVitreolusToActivate Vitreous_SetMinionsForth +Sprite_Vitreolus Sprite_BE_VitreousEye +Sprite_MoveXyz Sprite_MoveXYZ +Filter_MajorWhitenMain HandleScreenFlash +CacheSprite_ExecuteAll ExecuteCachedSprites +CacheSprite_ExecuteSingle UncacheAndExecuteSprite +ArmosCoordinatorLong Overlord19_ArmosCoordinator +ArmosCoordinator_AwaitKnightActivation ArmosCoordinator_WaitForWakeUp +ArmosCoordinator_AwaitKnightsUnderCoercion ArmosCoordinator_CirclePosition +ArmosCoordinator_OrderKnightsToBackWall ArmosCoordinator_LineUp +ArmosCoordinator_CascadeKnightsToFrontWall ArmosCoordinator_ForwardMarch +ArmosCoordinator_RadialContraction ArmosCoordinator_Pinch +ArmosCoordinator_RadialDilation ArmosCoordinator_Spread +ArmosCoordinator_TimedRotateThenTransition ArmosCoordinator_RotateKnights +ArmosCoordinator_AreAllActiveKnightsSubmissive ArmosCoordinator_CheckKnights +ArmosCoordinator_DisableKnights_XY_Coercion ArmosCoordinator_DisableCoercion +Sprite_HelmasaurFireballLong Sprite_70_KingHelmasaurFireball +Sprite_ArmosCrusherLong Sprite_RedArmosCrusher +ArmosCrusher_RetargetPlayer RedArmosCrusher_TargetLink +ArmosCrusher_ApproachTargetCoords RedArmosCrusher_Jump +ArmosCrusher_Hover RedArmosCrusher_Hover +ArmosCrusher_Crush RedArmosCrusher_Slam +Sprite_EvilBarrierLong Sprite_40_LightningGate +Moldorm_Initialize SpritePrep_MiniMoldorm +Sprite_DrawFourAroundOne SpriteDraw_Antfairy +ConvertVelocityToAngle Sprite_ConvertVelocityToAngle +Sprite_TalkingTreeLong Sprite_25_TalkingTree +TalkingTree_Type0 TalkingTree_Mouth +TalkingTree_Type0_State0 TalkingTree_IdleWithBomb +TalkingTree_Type0_State1 TalkingTree_DelayBomb +TalkingTree_Type0_State2 TalkingTree_SpitBomb +TalkingTree_Type0_State3 TalkingTree_IdleWithoutBomb +TalkingTree_Type1 TalkingTree_Eye +TalkingTree_SpawnEyes SpritePrep_TalkingTree_SpawnEyeball +PullForRupees_SpawnRupees RupeePull_SpawnPrize +Sprite_DiggingGameGuy Sprite_D5_DigGameGuy +DiggingGameGuy_Introduction DigGameGuy_Idle +DiggingGameGuy_DoYouWantToPlay DigGameGuy_OfferGame +DiggingGameGuy_MoveOuttaTheWay DigGameGuy_UnblockEntrance +DiggingGameGuy_StartMinigameTimer DigGameGuy_SetTimer +DiggingGameGuy_TerminateMinigame DigGameGuy_Proctor +Shovel_Helper DigGame_SpawnPrize +SpriteBurn_Main SpriteModule_Burn +Sprite_HelmasaurKing Sprite_92_HelmasaurKing +Sprite_HelmasaurKing_Case0 Sprite_HelmasaurKing_DecisionHome +Sprite_HelmasaurKing_Case1 Sprite_HelmasaurKing_WalkToLocation +HelmasaurKing_Func7 HelmasaurKing_HandleMovement +Sprite_HelmasaurKing_Case2 Sprite_HelmasaurKing_DecisionAway +Sprite_HelmasaurKing_Case3 Sprite_HelmasaurKing_WalkBackHome +HelmasaurKing_ReturnFunc6 HelmasaurKing_MaybeFireball +HelmasaurKing_Func3 HelmasaurKing_SwingTail +HelmasaurKing_Func5 HelmasaurKing_CheckMaskDamageFromHammer +HelmasaurKing_Func4 HelmasaurKing_AttemptDamage +HelmasaurKing_Func2 HelmasaurKing_ChipAwayAtMask +HelmasaurKing_Func1 HelmasaurKing_ExplodeMask +HelmasaurKing_SpawnMaskPart HelmasaurKing_SpawnMaskDebris +HelmasaurKing_SpawnFireball HelmasaurKing_SpitFireball +HelmasaurKing_DrawB SpriteDraw_KingHelmasaur_Eyes +HelmasaurKing_DrawC KingHelmasaurMask +HelmasaurKing_RepulseSpark KingHelmasaur_CheckBombDamage +HelmasaurKing_DrawD SpriteDraw_KingHelmasaur_Body +HelmasaurKing_DrawE SpriteDraw_KingHelmasaur_Legs +HelmasaurKing_DrawF SpriteDraw_KingHelmasaur_Mouth +HelmasaurKing_DrawA KingHelmasaur_OperateTail +Sprite3_DivisionDelay NOP8 +Sprite_MadBatterBoltLong Sprite3A_MagicBatLightning +Sprite_Pikit Sprite_AA_Pikit +Pikit_SetNextVelocity Pikit_PikNextMovement +Pikit_FinishJumpThenAttack Pikit_LandAndAttack +Pikit_AttemptItemGrab Pikit_Steal +Pikit_PrepThenDraw Pikit_PrepDraw +Sprite_Bomber Sprite_A8_GreenZirro +Bomber_Dodge Zirro_Dodge +Bomber_Hovering Zirro_Idle +Bomber_Moving Zirro_Move +Bomber_SpawnPellet Zirro_DropBomb +Sprite_Stalfos Sprite_A7_Stalfos +Stalfos_Visible Stalfos_Skellington +Sprite_Zazak Sprite_Zazak_Main +Zazak_WalkThenTrackHead StalfosZazak_Walk +Zazak_HaltAndPickNextDirection StalfosZazak_Wait +Zazak_ShootFirePhlegm StalfosZazak_Shoot +Stalfos_ThrowBoneAtPlayer Stalfos_ThrowBone +Sprite_KholdstareShell Sprite_A3_KholdstareShell +IceBallGenerator_SpawnSomething GenerateIceball +Sprite_Kholdstare Sprite_A2_Kholdstare +Kholdstare_Triplicate Kholdstare_Split +nullsub_14 Kholdstare_DoAbsolutelyNothing +Kholdstare_SpawnNebuleGarnish Kholdstare_SpawnPuffCloudGarnish +Sprite_IceBallGenerator Sprite_A4_FallingIce +IceBall_Quadruplicate IceBall_Split +Sprite_Freezor Sprite_A1_Freezor +Freezor_Stasis Freezor_Dormant +Freezor_Awakening Freezor_Waking +Freezor_Moving Freezor_Flailing +Freezor_Melting Freezor_ImMelllltiiiinnnnggggg +Sprite_FluteBoyOstrich Sprite_9E_HauntedGroveOstritch +FluteBoyOstrich_Chillin HauntedGroveOstritch_Idle +FluteBoyOstrich_RunAway HauntedGroveOstritch_Flee +Sprite_FluteBoyRabbit Sprite_9F_HauntedGroveRabbit +FluteBoyRabbit_Chillin HauntedGroveRabbit_Idle +FluteBoyRabbit_RunAway HauntedGroveRabbit_Flee +Sprite_FluteBoyBird Sprite_A0_HauntedGroveBird +FluteBoyBird_Chillin HauntedGroveBird_Idle +FluteBoyBird_Rising HauntedGroveBird_Ascending +FluteBoyBird_Falling HauntedGroveBird_Descending +FluteBoyBird_DrawBlink HauntedGroveBird_Blink +Sprite_Zoro Sprite_9C_Zoro +Zoro_Main Zoro +Babusu_Main Babasu +Babusu_Reset Babasu_Reset +Babusu_Hiding Babasu_Hidden +Babusu_TerrorSprinkles Babasu_Telegraph +Babusu_ScurryAcross Babasu_Dart +Sprite_WizzrobeAndBeam Sprite_9B_Wizzrobe +Wizzrobe_Cloaked Wizzrobe_Invisible +Wizzrobe_PhasingIn Wizzrobe_Appear +Wizzrobe_PhasingOut Wizzrobe_Disappear +Wizzrobe_SpawnBeam Wizzrobe_FireBeam +Sprite_Kyameron Sprite_9A_Kyameron +Kyameron_PuddleUp Kyameron_Puddle +Kyameron_Coagulate Kyameron_BuildUp +Kyameron_Disperse Kyameron_Dissipate +Sprite_SpawnSimpleSparkleGarnish_SlotRestricted Sprite_GarnishSpawn_Sparkle_limited +Sprite_SpawnSimpleSparkleGarnish Sprite_GarnishSpawn_Sparkle +Sprite_Pengator Sprite_99_Pengator +Pengator_FacePlayer Pengator_FaceLink +Pengator_SpeedUp Pengator_Accelerate +Pengator_Jump Pengator_Hop +Pengator_SlideAndSparkle Pengator_Slide +LaserBeam_SpawnGarnish LaserBeam_BuildUpGarnish +Sprite_LaserEye Sprite_95_LaserEyeLeft +LaserEye_MonitorFiringZone LaserEye_Reconnaissance +LaserEye_FiringBeam LaserEye_TangoLocked +LaserEye_SpawnBeam LaserEye_FireBeam +j_Sprite_FlyingTile Sprite_94_Tile_bounce +Sprite_Pirogusu Sprite_94_Pirogusu +Pirogusu_WriggleInHole Pirogusu_InHole +Pirogusu_Emerge Pirogusu_Crowning +Pirogusu_SplashIntoPlay Pirogusu_Plop +Sprite_SpawnSmallWaterSplash Sprite_SpawnSmallSplash +Pirogusu_Swim Pirogusu_Active +Pirogusu_SpawnSplashGarnish Pirogusu_SpawnSplash +Sprite_Bumper Sprite_93_Bumper +Sprite_StalfosKnight Sprite_91_StalfosKnight +StalfosKnight_WaitingForPlayer StalfosKnight_Hidden +StalfosKnight_Falling StalfosKnight_EnterBattle +StalfosKnight_Case2 StalfosKnight_Idle +StalfosKnight_Case3 StalfosKnight_ScanForOpponents +StalfosKnight_Case4 StalfosKnight_Squat +StalfosKnight_Case5 StalfosKnight_HopAround +StalfosKnight_Case6 StalfosKnight_Crumble +StalfosKnight_Case7 StalfosKnight_CelebrateStandingUp +StalfosKnight_DrawHead SpriteDraw_StalfosKnight_Head +Sprite_WallMaster Sprite_90_Wallmaster +WallMaster_Descend Wallmaster_Descend +sub_9EAF82 Wallmaster_Ascend +Sprite_Zol Sprite_8F_Blob +Zol_HidingUnseen Blob_Hidden +Zol_PoppingOut Blob_Peeking +Zol_Falling Blob_Falling +Zol_Active Blob_Active +Sprite_Terrorpin Sprite_8E_Terrorpin +Terrorpin_Upright Terrorpin_RightsideUp +Terrorpin_Overturned Terrorpin_UpsideDown +Terrorpin_CheckHammerHitNearby Terrorpin_CheckForHammer +Terrorpin_FormHammerHitBox Terrorpin_SetUpHammerHitBox +Sprite_Arrghus Sprite_8C_Arrghus +Arrghus_JumpWayUp Arrghus_JumpUp +Arrghus_SmooshFromAbove Arrghus_SmashDown +Arrghus_SwimFrantically Arrghus_PingPong +Arrghus_ApproachTargetSpeed Arrghus_Move +Arrghus_Decelerate Arrghus_MakeDecision +Arrghus_Case2 Arrghus_PuffAttack +Arrgi_Initialize Arrghus_HandlePuffs +Sprite_Arrgi Sprite_8D_Arrghi +Sprite_Gibdo Sprite_8B_Gibdo +Gibdo_ApproachTargetDirection Gibdo_Turn +Gibdo_CanMove Gibdo_Walk +Sprite_MothulaBeam Sprite_89_MothulaBeam +Sprite_FlyingTile Sprite_94_Tile +Sprite_SpikeBlock Sprite_8A_SpikeBlock +SpikeBlock_InduceTilemapUpdate SpikeBlock_UpdateTilemap +SpikeBlock_CheckStatueSpriteCollision SpikeBlock_CheckStatueCollision +Sprite_Mothula Sprite_88_Mothula +Mothula_Delay Modula_Dormant +Mothula_Ascend Modula_WakeUp +Mothula_FlyAbout Modula_ActLikeAMoth +Mothula_FireBeams Modula_FireBeams +Mothula_ActivateMovingSpikeBlock Mothula_HandleSpikes +Sprite_Kodondo Sprite_86_Kodongo +Kodondo_ChooseDirection Kodongo_MakeDecision +Kodondo_SetVel Kodongo_SetDirection +Kodondo_Move Kodongo_Move +Kodondo_BreatheFlame Kodongo_ShootFire +Kodondo_SpawnFlames Kodongo_SpawnFire +Sprite_Flame Sprite_87_KodongoFire +Sprite_YellowStalfos Sprite_85_YellowStalfos +YellowStalfos_FacePlayer YellowStalfos_TrackLink +YellowStalfos_PauseThenDetachHead YellowStalfos_DecapitateSelf +YellowStalfos_DelayBeforeAscending YellowStalfos_RegretDecapitatingSelf +YellowStalfos_Neutralized YellowStalfos_Collapsed +YellowStalfos_DetachHead YellowStalfos_EmancipateHead +Goriya_StayStill Mimic_Stationary +Sprite_Eyegore Sprite_83_GreenEyegore +Eyegore_WaitUntilPlayerNearby Eyegore_Dormant +Eyegore_OpeningEye Eyegore_WakingUp +Eyegore_ChasePlayer Eyegore_Chase +Eyegore_ClosingEye Eyegore_GoToSleep +SpritePrep_BubbleGroup SpritePrep_AntifairyCircle +Sprite_BubbleGroup Sprite_82_AntifairyCircle +Sprite_Hover Sprite_81_Hover +Hover_Stopped Hover_Idle +Hover_Moving Hover_Move +CrystalMaiden_Configure CrystalCutscene_Initialize +CrystalMaiden_SpawnAndConfigMaiden CrystalCutscene_SpawnMaiden +CrystalMaiden_InitPolyhedral CrystalCutscene_InitializePolyhedral +Sprite_CrystalMaiden Sprite_AB_CrystalMaiden +CrystalMaiden_Main CrystalMaiden_RunCutscene +CrystalMaiden_GenerateSparkles CrystalMaiden_WaitForCrystalGrowth +CrystalMaiden_FilterPalette CrystalMaiden_Emerge +CrystalMaiden_ShowMessage CrystalMaiden_GiveSpeech +CrystalMaiden_ReadingComprehensionExam CrystalMaiden_DoYouUnderstand +CrystalMaiden_MayTheWayOfTheHero CrystalMaiden_GoodLuckKid +CrystalMaiden_InitiateDungeonExit CrystalMaiden_KickOutOfDungeon +Sprite_SpikeTrap Sprite_7D_BigSpike +Sprite_GuruguruBar Sprite_7E_Firebar_Clockwise +GuruguruBar_Main Firebar_Main +Sprite_Winder Sprite_80_Firesnake +Winder_SpawnFireballGarnish Firesnake_SpawnFireball +Sprite_GreenStalfos Sprite_7C_GreenStalfos +Sprite_Agahnim Sprite_7A_Agahnim +Agahnim_State_0A Agahnim_SpinToPyramid +Agahnim_State_08 Agahnim_ExorciseGanon +Agahnim_State_09 Agahnim_UncloneSelf +Agahnim_State_06 Agahnim_HelloDarkWorld +Agahnim_State_07 Agahnim_CreateClones +Agahnim_State_00 Agahnim_ChooseFirstMove +Agahnim_State_01 Agahnim_HelloLightWorld +sub_9ED514 Agahnim_PrepareToEmerge +Agahnim_State_02 Agahnim_EmergeFromShadow +Agahnim_State_03 Agahnim_Attack +Agahnim_State_04 Agahnim_ChooseWarpSpot +Agahnim_Func1 Agahnim_PerformAttack +Agahnim_State_05 Agahnim_MoveTowardsWarp +nullsub_15 UNREACHABLE_1ED971 +Sprite_EnergyBall Sprite_7B_AgahnimBalls +SeekerEnergyBall_SplitIntoSixSmaller CreateSixBlueBalls +Sprite_DashBeeHive Sprite_79_Bee +DashBeeHive_WaitForDash Bee_DormantHive +DashBeeHive_SpawnBee SpawnBeeFromHive +SpawnBee_Init InitializeSpawnedBee +SpawnBee ReleaseBeeFromBottle +Bee_Normal Bee_Main +Bee_PutInbottle Bee_Captured +Sprite_GetEmptyBottleIndex Sprite_Find_EmptyBottle +Bee_DetermineInteractionStatus Bee_HandleInteractions +Sprite_GoodBee Sprite_B2_PlayerBee +GoodBee_WaitingForDash GoldBee_Dormant +GoodBee_SpawnTangibleVersion GoldBee_SpawnSelf +GoodBee_Activated PlayerBee_Main +Bee_SetAltitude Bee_HandleZ +GoodBee_ScanForTargetableSprites PlayerBee_FindTarget +Bee_Buzz Bee_Bzzt +Sprite_HylianPlaque Sprite_B3_PedestalPlaque +Sprite_ThiefChest Sprite_B4_PurpleChest +Sprite_BombShopEntity Sprite_B5_BombShop +Sprite_BombShopGuy Sprite_BombShop_Clerk +Sprite_BombShopBomb Sprite_BombShop_Bomb +Sprite_BombShopSuperBomb Sprite_BombShop_SuperBomb +Sprite_BombShopSnoutPuff Sprite_BombShop_Huff +BombShopGuy_SpawnSnoutPuff BombShop_ClerkExhalation +Sprite_Kiki Sprite_B6_Kiki +Kiki_Fleeing Kiki_Flee +Kiki_Type2 Kiki_OfferInitialService +Kiki_Type2_Case0 Kiki_OfferToFollow +Kiki_Type2_Case1 Kiki_OfferToFollowTransaction +Kiki_Type2_Case2 Kiki_MoveTowardsLink +Kiki_Type2_Case3 Kiki_WaitABit +Kiki_Type2_Case4 Kiki_EndIntroductionCutscene +Kiki_LyingInWait Kiki_Dormant +Kiki_Type1 Kiki_OfferEntranceService +Kiki_Type1_Case0 Kiki_OfferToOpenPOD +Kiki_Type1_Case1 Kiki_VerifyPurchase +Kiki_Type1_Case35 Kiki_DartHead +Kiki_Type1_Case246 Kiki_HopToSpot +Kiki_Type1_Case7 Kiki_WalkOnRoof +Kiki_Type1_Case8 Kiki_ReadyButtonPress +Kiki_Type1_Case9 Kiki_SlamButton +Kiki_InitiatePalaceOpeningProposal Kiki_RevertToSprite +Kiki_TransitionFromTagalong Kiki_SpawnHandlerMonke +Kiki_InitiateFirstBeggingSequence Kiki_SpawnHandler_A +Kiki_AbandonDamagedPlayer Kiki_SpawnHandler_B +Sprite_BlindMaiden Sprite_B7_BlindMaiden +SpritePrep_OldMountainManLong SpritePrep_OldMan +OldMountainMan_TransitionFromTagalong OldMan_RevertToSprite +OldMountainMan_FreezePlayer OldMan_EnableCutscene +Sprite_OldMountainMan Sprite_AD_OldMan +OldMountainMan_Lost OldMan_Lost +OldMountainMan_Supplicate OldMan_Lost_Wait +OldMountainMan_SwitchToTagalong OldMan_Lost_BecomeFollower +OldMountainMan_EnteringDomicile OldMan_Returning +OldMountainMan_GrantMagicMirror OldMan_Returning_GiveMirror +OldMountainMan_ShuffleAway OldMan_Returning_Move +OldMountainMan_ApproachDoor OldMan_Returning_EnterDoor +OldMountainMan_MadeItInside OldMan_Returning_FinishUp +OldMountainMan_SittingAtHome OldMan_Home +Sprite_DialogueTester Sprite_B8_DialogueTester +DialogueTester_IncrementMessageIndex DialogueTester_NextMessage +Sprite_BullyAndBallGuy Sprite_B9_BullyAndPinkBall +Sprite_BallGuy Sprite_PinkBall +BallGuy_Friction PinkBall_HandleDeceleration +BallGuy_DrawDistressMarker PinkBall_Distress +Bully_ChaseBallGuy Bully_ChaseVictim +Bully_KickBallGuy Bully_PuntVictim +Bully_Waiting Bully_Idle +BullyAndBallGuy_SpawnBully SpawnBully +BallGuy_Dialogue PinkBall_HandleMessage +Bully_Dialogue Bully_HandleMessage +Sprite_Whirlpool Sprite_BA_Whirlpool +Sprite_ShopKeeper Sprite_BB_Shopkeeper +ShopKeeper_Type0 Shopkeeper_StandardClerk +ShopKeeper_Type1 ChestGameGuy +ShopKeeper_Type1_Case0 ChestGameGuy_OfferGame +ShopKeeper_Type1_Case1 ChestGameGuy_HandlePayment +ShopKeeper_Type1_Case2 ChestGameGuy_ProctorGame +ShopKeeper_HandleThief NiceThief_Animate +ShopKeeper_Type2 NiceThiefWithGift +ShopKeeper_Type2_Case0 NiceThiefWithGift_WaitForInteraction +ShopKeeper_Type2_Case1 NiceThiefWithGift_GiveRupees +ShopKeeper_Type3 MiniChestGameGuy +ShopKeeper_Type3_Case0 MiniChestGameGuy_OfferGame +ShopKeeper_Type3_Case1 MiniChestGameGuy_VerifyPurchase +ShopKeeper_Type3_Case2 LesserChestGameGuy_AfterGameStart +ShopKeeper_Type4 LostWoodsChestGameGuy +ShopKeeper_Type4_Case0 LostWoodsChestGameGuy_OfferGame +ShopKeeper_Type4_Case1 LostWoodsChestGameGuy_VerifyPurchase +ShopKeeper_Type5_6 NiceThiefUnderRock +ShopKeeper_Type7 ShopItem_RedPotion150 +ShopKeeper_SpawnInventoryItem ShopKeeper_SpawnShopItem +ShopKeeper_Type8 ShopItem_FighterShield +ShopKeeper_Type9 ShopItem_FireShield +ShopKeeper_Func1 ShopItem_MakeShieldsDeflect +ShopKeeper_Type10 ShopItem_Heart +ShopKeeper_Type11 ShopItem_Arrows +ShopKeeper_Type12 ShopItem_Bombs +ShopKeeper_Type13 ShopItem_Bee +ShopKeeper_GiveItem ShopItem_HandleReceipt +ShopKeeper_PlaySound ShopItem_PlayBeep +ShopKeeper_CheckPlayerSolicitedDamage ShopItem_CheckForAPress +ShopKeeper_TryToGetPaid ShopItem_HandleCost +ShopKeeper_DrawItemWithPrice SpriteDraw_ShopItem +Sprite_PlayerCantPassThrough Sprite_BehaveAsBarrier +Player_HaltSpecialPlayerMovement Sprite_HaltAllMovement +Sprite_DashApple Sprite_AC_Apple +Apple_SpawnTangibleApple SpawnApple +Sprite_DrinkingGuy Sprite_BC_Drunkard +Pipe_LocateTransitTile Pipe_LocatePath +SomariaPlatform_LocateTransitTile SomariaPlatform_LocatePath +Sprite_SomariaPlatformLong Sprite_SomariaPlatformAndPipe +Sprite_SomariaPlatform_Case0 Sprite_SomariaPlatform_Spawn +Sprite_SomariaPlatform_Case1 Sprite_SomariaPlatformAndPipe_Main +SomariaPlatform_UpdateVel SomariaPlatformAndPipe_HandleMovement +SomariaPlatform_GetTileBelow SomariaPlatformAndPipe_CheckTile +SomariaPlatform_MoveX SomariaPlatform_HandleDragX +SomariaPlatform_MoveY SomariaPlatform_HandleDragY +SomariaPlatform_MoveXY SomariaPlatform_HandleDrag +nullsub_13 SomariaPlatform_HandleTile_DoNothing +SomariaPlatform_ZigZagRisingSlope SomariaPlatform_HandleTile_RisingSlope +SomariaPlatform_ZigZagFallingSlope SomariaPlatform_HandleTile_FallingSlope +SomariaPlatform_TransitTile SomariaPlatform_HandleTile_TJunctionDLR +SomariaPlatform_Tjunc_NoUp SomariaPlatform_HandleTile_TJunctionULR +SomariaPlatform_Tjunc_NoDown SomariaPlatform_HandleTile_TJunctionUDR +SomariaPlatform_Tjunc_NoLeft SomariaPlatform_HandleTile_TJunctionUDL +SomariaPlatform_Tjunc_NoRight SomariaPlatform_HandleTile_4WayJunction +SomariaPlatform_TransitTileNoBack SomariaPlatform_HandleTile_CrossOver +SomariaPlatform_TransitTileQuestion SomariaPlatform_HandleTile_Unknown +SomariaPlatform_Endpoint SomariaPlatform_HandleTile_Station +SomariaPlatform_UpdatePlayerDrag SomariaPlatform_DragLink +Sprite_Pipe Sprite_AE_Pipe_Down +Pipe_LocateTransitEndpoint Pipe_FindEndPoint +Pipe_WaitForPlayer Pipe_Idle +Pipe_DrawPlayerInward Pipe_DragLink +Pipe_DragPlayerAlong Pipe_MoveLink +Pipe_State5 Pipe_Reset +Pipe_SetPlayerDir Pipe_HandlePlayerMovement +Faerie_HandleMovementLong Fairy_HandleMovement +SpawnFairy ReleaseFairy +VWF_Select2Or3 RenderText_Draw_Choose2HiOr3 diff --git a/other/names.txt b/other/names.txt new file mode 100644 index 00000000..f46ae547 --- /dev/null +++ b/other/names.txt @@ -0,0 +1,8492 @@ +0x2100: INIDISP +0x2101: OBSEL +0x2102: OAMADDL +0x2103: OAMADDH +0x2104: OAMDATA +0x2105: BGMODE +0x2106: MOSAIC +0x2107: BG1SC +0x2108: BG2SC +0x2109: BG3SC +0x210a: BG4SC +0x210b: BG12NBA +0x210c: BG34NBA +0x210d: BG1HOFS +0x210e: BG1VOFS +0x210f: BG2HOFS +0x2110: BG2VOFS +0x2111: BG3HOFS +0x2112: BG3VOFS +0x2113: BG4HOFS +0x2114: BG4VOFS +0x2115: VMAIN +0x2116: VMADDL +0x2117: VMADDH +0x2118: VMDATAL +0x2119: VMDATAH +0x211a: M7SEL +0x211b: M7A +0x211c: M7B +0x211d: M7C +0x211e: M7D +0x211f: M7X +0x2120: M7Y +0x2121: CGADD +0x2122: CGDATA +0x2123: W12SEL +0x2124: W34SEL +0x2125: WOBJSEL +0x2126: WH0 +0x2127: WH1 +0x2128: WH2 +0x2129: WH3 +0x212a: WBGLOG +0x212b: WOBJLOG +0x212c: TM +0x212d: TS +0x212e: TMW +0x212f: TSW +0x2130: CGWSEL +0x2131: CGADSUB +0x2132: COLDATA +0x2133: SETINI +0x2134: MPYL +0x2135: MPYM +0x2136: MPYH +0x2137: SLHV +0x2138: RDOAM +0x2139: RDVRAML +0x213a: RDVRAMH +0x213b: RDCGRAM +0x213c: OPHCT +0x213d: OPVCT +0x213e: STAT77 +0x213f: STAT78 +0x2140: APUI00 +0x2141: APUI01 +0x2142: APUI02 +0x2143: APUI03 +0x2180: WMDATA +0x2181: WMADDL +0x2182: WMADDM +0x2183: WMADDH +0x4016: JOYA +0x4017: JOYB +0x4200: NMITIMEN +0x4201: WRIO +0x4202: WRMPYA +0x4203: WRMPYB +0x4204: WRDIVL +0x4205: WRDIVH +0x4206: WRDIVB +0x4207: HTIMEL +0x4208: HTIMEH +0x4209: VTIMEL +0x420a: VTIMEH +0x420b: MDMAEN +0x420c: HDMAEN +0x420d: MEMSEL +0x4210: RDNMI +0x4211: TIMEUP +0x4212: HVBJOY +0x4213: RDIO +0x4214: RDDIVL +0x4215: RDDIVH +0x4216: RDMPYL +0x4217: RDMPYH +0x4218: JOY1L +0x4219: JOY1H +0x421a: JOY2L +0x421b: JOY2H +0x421c: JOY3L +0x421d: JOY3H +0x421e: JOY4L +0x421f: JOY4H +0x4300: DMAP0 +0x4301: BBAD0 +0x4302: A1T0L +0x4303: A1T0H +0x4304: A1B0 +0x4305: DAS0L +0x4306: DAS0H +0x4307: DAS00 +0x4308: A2A0L +0x4309: A2A0H +0x430a: NTRL0 +0x430b: UNUSED0 +0x430f: MIRR0 +0x4310: DMAP1 +0x4311: BBAD1 +0x4312: A1T1L +0x4313: A1T1H +0x4314: A1B1 +0x4315: DAS1L +0x4316: DAS1H +0x4317: DAS10 +0x4318: A2A1L +0x4319: A2A1H +0x431a: NTRL1 +0x431b: UNUSED1 +0x431f: MIRR1 +0x4320: DMAP2 +0x4321: BBAD2 +0x4322: A1T2L +0x4323: A1T2H +0x4324: A1B2 +0x4325: DAS2L +0x4326: DAS2H +0x4327: DAS20 +0x4328: A2A2L +0x4329: A2A2H +0x432a: NTRL2 +0x432b: UNUSED2 +0x432f: MIRR2 +0x4330: DMAP3 +0x4331: BBAD3 +0x4332: A1T3L +0x4333: A1T3H +0x4334: A1B3 +0x4335: DAS3L +0x4336: DAS3H +0x4337: DAS30 +0x4338: A2A3L +0x4339: A2A3H +0x433a: NTRL3 +0x433b: UNUSED3 +0x433f: MIRR3 +0x4340: DMAP4 +0x4341: BBAD4 +0x4342: A1T4L +0x4343: A1T4H +0x4344: A1B4 +0x4345: DAS4L +0x4346: DAS4H +0x4347: DAS40 +0x4348: A2A4L +0x4349: A2A4H +0x434a: NTRL4 +0x434b: UNUSED4 +0x434f: MIRR4 +0x4350: DMAP5 +0x4351: BBAD5 +0x4352: A1T5L +0x4353: A1T5H +0x4354: A1B5 +0x4355: DAS5L +0x4356: DAS5H +0x4357: DAS50 +0x4358: A2A5L +0x4359: A2A5H +0x435a: NTRL5 +0x435b: UNUSED5 +0x435f: MIRR5 +0x4360: DMAP6 +0x4361: BBAD6 +0x4362: A1T6L +0x4363: A1T6H +0x4364: A1B6 +0x4365: DAS6L +0x4366: DAS6H +0x4367: DAS60 +0x4368: A2A6L +0x4369: A2A6H +0x436a: NTRL6 +0x436b: UNUSED6 +0x436f: MIRR6 +0x4370: DMAP7 +0x4371: BBAD7 +0x4372: A1T7L +0x4373: A1T7H +0x4374: A1B7 +0x4375: DAS7L +0x4376: DAS7H +0x4377: DAS70 +0x4378: A2A7L +0x4379: A2A7H +0x437a: NTRL7 +0x437b: UNUSED7 +0x437f: MIRR7 +0x7003e5: sram_slot1_tag +0x7008e5: sram_slot2_tag +0x700de5: sram_slot3_tag +0x7e0000: A0 +0x7e0001: A1 +0x7e0002: A2 +0x7e0003: A3 +0x7e0004: A4 +0x7e0005: A5 +0x7e0006: A6 +0x7e0007: A7 +0x7e0008: A8 +0x7e0009: A9 +0x7e000a: A10 +0x7e000b: A11 +0x7e000c: A12 +0x7e000d: A13 +0x7e000e: A14 +0x7e000f: A15 +0x7e0010: main_module_index +0x7e0011: submodule_index +0x7e0012: nmi_boolean +0x7e0013: INIDISP_copy +0x7e0014: nmi_load_bg_from_vram +0x7e0015: flag_update_cgram_in_nmi +0x7e0016: flag_update_hud_in_nmi +0x7e0017: nmi_subroutine_index +0x7e0018: nmi_copy_packets_flag +0x7e0019: nmi_update_tilemap_dst +0x7e001a: frame_counter +0x7e001b: player_is_indoors +0x7e001c: TM_copy +0x7e001d: TS_copy +0x7e001e: TMW_copy +0x7e001f: TSW_copy +0x7e0020: link_y_coord +0x7e0022: link_x_coord +0x7e0024: link_z_coord +0x7e0026: link_direction_last +0x7e0027: link_actual_vel_y +0x7e0028: link_actual_vel_x +0x7e0029: link_actual_vel_z +0x7e002a: link_subpixel_y +0x7e002b: link_subpixel_x +0x7e002c: link_subpixel_z +0x7e002d: link_counter_var1 +0x7e002e: link_animation_steps +0x7e002f: link_direction_facing +0x7e0030: link_y_vel +0x7e0031: link_x_vel +0x7e0032: link_y_coord_original +0x7e0038: tiledetect_diagonal_tile +0x7e003a: button_mask_b_y +0x7e003b: bitfield_for_a_button +0x7e003c: button_b_frames +0x7e003d: link_delay_timer_spin_attack +0x7e003e: link_y_coord_safe_return_lo +0x7e003f: link_x_coord_safe_return_lo +0x7e0040: link_y_coord_safe_return_hi +0x7e0041: link_x_coord_safe_return_hi +0x7e0042: link_direction_mask_a +0x7e0043: link_direction_mask_b +0x7e0044: player_oam_y_offset +0x7e0045: player_oam_x_offset +0x7e0046: link_incapacitated_timer +0x7e0047: set_when_damaging_enemies +0x7e0048: bitmask_of_dragstate +0x7e0049: force_move_any_direction +0x7e004b: link_visibility_status +0x7e004c: cape_decrement_counter +0x7e004d: link_auxiliary_state +0x7e004f: index_of_dashing_sfx +0x7e0050: link_cant_change_direction +0x7e0051: tiledetect_which_y_pos +0x7e0055: link_cape_mode +0x7e0056: link_is_bunny +0x7e0057: link_speed_modifier +0x7e0058: tiledetect_stair_tile +0x7e0059: tiledetect_pit_tile +0x7e005a: link_this_controls_sprite_oam +0x7e005b: player_near_pit_state +0x7e005d: link_player_handler_state +0x7e005e: link_speed_setting +0x7e005f: tiledetect_var2 +0x7e0061: gravestone_push_timeout +0x7e0062: tiledetect_var1 +0x7e0064: oam_priority_value +0x7e0066: link_last_direction_moved_towards +0x7e0067: link_direction +0x7e0068: link_y_page_movement_delta +0x7e0069: link_x_page_movement_delta +0x7e006a: link_num_orthogonal_directions +0x7e006b: link_moving_against_diag_tile +0x7e006c: is_standing_in_doorway +0x7e006d: moving_against_diag_deadlocked +0x7e006e: tiledetect_diag_state +0x7e0072: scratch_b +0x7e0073: scratch_a +0x7e0074: scratch_c +0x7e0075: scratch_d +0x7e0076: index_of_interacting_tile +0x7e0078: allow_scroll_z +0x7e0079: link_spin_attack_step_counter +0x7e007b: last_light_vs_dark_world +0x7e0084: map16_load_src_off +0x7e0086: map16_load_dst_off +0x7e0088: map16_load_var2 +0x7e008a: overworld_screen_index +0x7e008c: overlay_index +0x7e0090: oam_cur_ptr +0x7e0092: oam_ext_cur_ptr +0x7e0094: BGMODE_copy +0x7e0095: MOSAIC_copy +0x7e0096: W12SEL_copy +0x7e0097: W34SEL_copy +0x7e0098: WOBJSEL_copy +0x7e0099: CGWSEL_copy +0x7e009a: CGADSUB_copy +0x7e009b: HDMAEN_copy +0x7e009c: COLDATA_copy0 +0x7e009d: COLDATA_copy1 +0x7e009e: COLDATA_copy2 +0x7e00a0: dungeon_room_index +0x7e00a2: dungeon_room_index_prev +0x7e00a4: dung_cur_floor +0x7e00a6: quadrant_fullsize_x +0x7e00a7: quadrant_fullsize_y +0x7e00a8: composite_of_layout_and_quadrant +0x7e00a9: link_quadrant_x +0x7e00aa: link_quadrant_y +0x7e00ad: dung_hdr_collision_2 +0x7e00ae: dung_hdr_tag +0x7e00b0: subsubmodule_index +0x7e00b1: subsubmodule_index_PADDING +0x7e00b2: dung_draw_width_indicator +0x7e00b4: dung_draw_height_indicator +0x7e00b7: dung_load_ptr +0x7e00b9: dung_load_ptr_bank +0x7e00ba: dung_load_ptr_offs +0x7e00bd: tmp1 +0x7e00bf: dung_line_ptrs_row0 +0x7e00cb: dung_line_ptrs_row1 +0x7e00d7: dung_line_ptrs_row2 +0x7e00da: dung_line_ptrs_row3 +0x7e00dd: dung_line_ptrs_row4 +0x7e00e0: BG1HOFS_copy2 +0x7e00e2: BG2HOFS_copy2 +0x7e00e4: BG3HOFS_copy2 +0x7e00e6: BG1VOFS_copy2 +0x7e00e8: BG2VOFS_copy2 +0x7e00ea: BG3VOFS_copy2 +0x7e00ec: tilemap_location_calc_mask +0x7e00ee: link_is_on_lower_level +0x7e00ef: room_transitioning_flags +0x7e00f0: joypad1H_last +0x7e00f2: joypad1L_last +0x7e00f4: filtered_joypad_H +0x7e00f6: filtered_joypad_L +0x7e00f8: joypad1H_last2 +0x7e00fa: joypad1L_last2 +0x7e00fc: dung_unk2 +0x7e00ff: virq_trigger +0x7e0100: link_dma_graphics_index +0x7e0102: link_dma_var1 +0x7e0104: link_dma_var2 +0x7e0107: link_dma_var3 +0x7e0108: link_dma_var4 +0x7e0109: link_dma_var5 +0x7e010a: death_var5 +0x7e010c: saved_module_for_menu +0x7e010e: which_entrance +0x7e0110: dung_index_x3 +0x7e0112: flag_custom_spell_anim_active +0x7e0114: link_tile_below +0x7e0115: link_tile_below_PADDING +0x7e0116: nmi_load_target_addr +0x7e0118: nmi_update_tilemap_src +0x7e011a: bg1_x_offset +0x7e011c: bg1_y_offset +0x7e011e: BG2HOFS_copy +0x7e0120: BG1HOFS_copy +0x7e0122: BG2VOFS_copy +0x7e0124: BG1VOFS_copy +0x7e0126: transition_counter +0x7e0128: irq_flag +0x7e012a: is_nmi_thread_active +0x7e012c: music_control +0x7e012d: sound_effect_ambient +0x7e012e: sound_effect_1 +0x7e012f: sound_effect_2 +0x7e0130: music_unk1 +0x7e0131: sound_effect_ambient_last +0x7e0132: buffer_for_playing_songs +0x7e0133: last_music_control +0x7e0134: animated_tile_vram_addr +0x7e0136: flag_which_music_type +0x7e01fe: stk_return_addr +0x7e0200: overworld_map_state +0x7e0201: overworld_map_state_UNUSED +0x7e0202: hud_cur_item +0x7e0203: hud_cur_item_hi +0x7e0204: hud_var1 +0x7e0207: timer_for_flashing_circle +0x7e0208: animate_heart_refill_countdown +0x7e0209: animate_heart_refill_countdown_subpos +0x7e020a: is_doing_heart_animation +0x7e020b: link_debug_value_1 +0x7e020d: dungmap_init_state +0x7e020e: dungmap_cur_floor +0x7e0210: dungmap_var2 +0x7e0211: dungmap_idx +0x7e0213: dungmap_var4 +0x7e0215: dungmap_var3 +0x7e0217: dungmap_var5 +0x7e0280: ancilla_objprio +0x7e028a: ancilla_U +0x7e0294: ancilla_z_vel +0x7e029e: ancilla_z +0x7e02a8: ancilla_z_subpixel +0x7e02c0: tiledetect_inroom_staircase +0x7e02c3: pushedblocks_some_index +0x7e02c4: pushedblocks_maybe_timeout +0x7e02c6: link_recoilmode_timer +0x7e02c7: link_actual_vel_z_copy +0x7e02ca: fallhole_var2 +0x7e02cb: swimming_countdown +0x7e02cf: tagalong_var2 +0x7e02d0: tagalong_var3 +0x7e02d1: tagalong_var7 +0x7e02d2: timer_tagalong_reacquire +0x7e02d3: tagalong_var1 +0x7e02d6: tagalong_var4 +0x7e02d8: link_receiveitem_index +0x7e02d9: link_receiveitem_var1 +0x7e02da: link_pose_for_item +0x7e02db: link_triggered_by_whirlpool_sprite +0x7e02dc: link_x_coord_copy +0x7e02de: link_y_coord_copy +0x7e02e0: link_is_bunny_mirror +0x7e02e1: link_is_transforming +0x7e02e2: link_bunny_transform_timer +0x7e02e3: link_sword_delay_timer +0x7e02e4: flag_is_link_immobilized +0x7e02e5: tiledetect_chest +0x7e02e7: tiledetect_key_lock_gravestones +0x7e02e8: bitfield_spike_cactus_tiles +0x7e02e9: item_receipt_method +0x7e02ea: tiledetect_tile_type +0x7e02ec: flag_is_ancilla_to_pick_up +0x7e02ee: tiledetect_spike_floor_and_tile_triggers +0x7e02ef: bitmask_for_dashable_tiles +0x7e02f1: link_dash_ctr +0x7e02f2: tagalong_event_flags +0x7e02f4: flag_is_sprite_to_pick_up_cached +0x7e02f5: player_on_somaria_platform +0x7e02f6: tiledetect_misc_tiles +0x7e02f8: link_want_make_noise_when_dashed +0x7e02f9: tagalong_var5 +0x7e02fa: link_is_near_moveable_statue +0x7e0300: player_handler_timer +0x7e0301: link_item_in_hand +0x7e0302: fallhole_var1 +0x7e0303: eq_selected_y_item +0x7e0304: eq_selected_y_item_copy +0x7e0305: debug_var2 +0x7e0306: unused_2 +0x7e0307: eq_selected_rod +0x7e0308: link_state_bits +0x7e0309: link_picking_throw_state +0x7e030a: some_animation_timer_steps +0x7e030b: some_animation_timer +0x7e030d: link_var30d +0x7e030e: link_var30e +0x7e0310: dung_floor_y_vel +0x7e0312: dung_floor_x_vel +0x7e0314: flag_is_sprite_to_pick_up +0x7e0315: tile_coll_flag +0x7e0318: related_to_moving_floor_y +0x7e031a: related_to_moving_floor_x +0x7e031c: state_for_spin_attack +0x7e031d: step_counter_for_spin_attack +0x7e031e: link_spin_offsets +0x7e031f: countdown_for_blink +0x7e0320: tiledetect_moving_floor_tiles +0x7e0323: link_direction_facing_mirror +0x7e0326: swimcoll_var3 +0x7e032a: link_maybe_swim_faster +0x7e032b: swimcoll_var5 +0x7e032f: swimcoll_var1 +0x7e0334: swimcoll_var9 +0x7e0338: swimcoll_var11 +0x7e033c: swimcoll_var7 +0x7e0340: link_some_direction_bits +0x7e0341: tiledetect_deepwater +0x7e0343: tiledetect_normal_tiles +0x7e0345: link_is_in_deep_water +0x7e0346: link_palette_bits_of_oam +0x7e0348: tiledetect_icy_floor +0x7e034a: link_flag_moving +0x7e034b: eq_debug_variable +0x7e034c: tiledetect_water_staircase +0x7e034f: link_swim_hard_stroke +0x7e0350: link_debug_value_2 +0x7e0351: draw_water_ripples_or_grass +0x7e0352: sort_sprites_offset_into_oam_buffer +0x7e0354: value_computed_for_player_oam +0x7e0355: secondary_water_grass_timer +0x7e0356: primary_water_grass_timer +0x7e0357: tiledetect_thick_grass +0x7e0359: tiledetect_shallow_water +0x7e035b: tiledetect_destruction_aftermath +0x7e035d: oam_priority_value_2 +0x7e035f: flag_for_boomerang_in_place +0x7e0360: link_electrocute_on_touch +0x7e0362: link_actual_vel_z_mirror +0x7e0363: link_actual_vel_z_copy_mirror +0x7e0364: link_z_coord_mirror +0x7e0366: tiledetect_read_something +0x7e0368: interacting_with_liftable_tile_x1 +0x7e0369: interacting_with_liftable_tile_x1b +0x7e036a: interacting_with_liftable_tile_x2 +0x7e036b: player_unk1 +0x7e036c: tile_action_index +0x7e036d: tiledetect_vertical_ledge +0x7e036e: detection_of_ledge_tiles_horiz_uphoriz +0x7e036f: tiledetect_ledges_down_leftright +0x7e0370: detection_of_unknown_tile_types +0x7e0371: link_timer_push_get_tired +0x7e0372: link_is_running +0x7e0373: link_give_damage +0x7e0374: link_countdown_for_dash +0x7e0375: link_timer_jump_ledge +0x7e0376: link_grabbing_wall +0x7e0377: link_unk_master_sword +0x7e0378: countdown_timer_for_staircases +0x7e037a: link_position_mode +0x7e037b: link_disable_sprite_damage +0x7e037c: player_sleep_in_bed_state +0x7e037d: link_pose_during_opening +0x7e037e: related_to_hookshot +0x7e037f: cheatWalkThroughWalls +0x7e0380: ancilla_K +0x7e0385: ancilla_L +0x7e038a: ancilla_A +0x7e038f: ancilla_B +0x7e0394: ancilla_G +0x7e0399: boomerang_temp_y +0x7e039b: boomerang_temp_x +0x7e039d: hookshot_effect_index +0x7e039f: ancilla_arr3 +0x7e03a4: ancilla_arr1 +0x7e03a9: ancilla_S +0x7e03b1: ancilla_aux_timer +0x7e03b6: door_debris_x +0x7e03ba: door_debris_y +0x7e03be: door_debris_direction +0x7e03c0: ancilla_arr26 +0x7e03c2: ancilla_arr25 +0x7e03c4: ancilla_alloc_rotate +0x7e03c5: ancilla_H +0x7e03ca: ancilla_floor2 +0x7e03cf: boomerang_arr1 +0x7e03d2: ancilla_arr23 +0x7e03d5: ancilla_T +0x7e03db: ancilla_arr24 +0x7e03e1: ancilla_arr22 +0x7e03e4: ancilla_tile_attr +0x7e03e9: link_something_with_hookshot +0x7e03ea: ancilla_R +0x7e03ef: link_force_hold_sword_up +0x7e03f0: flute_countdown +0x7e03f1: tiledetect_var4 +0x7e03f4: dung_unk6 +0x7e03f5: link_timer_tempbunny +0x7e03f7: link_need_for_poof_for_transform +0x7e03f8: link_need_for_pullforrupees_sprite +0x7e03f9: hookshot_var1 +0x7e03fa: bit9_of_xcoord +0x7e0400: dung_door_opened +0x7e0402: dung_savegame_state_bits +0x7e0408: dung_quadrants_visited +0x7e040a: overworld_area_index +0x7e040c: cur_palace_index_x2 +0x7e040e: dung_layout_and_starting_quadrant +0x7e0410: overworld_screen_trans_dir_bits +0x7e0412: incremental_counter_for_vram +0x7e0414: dung_hdr_bg2_properties +0x7e0415: dung_hdr_bg2_properties_PADDING +0x7e0416: overworld_screen_trans_dir_bits2 +0x7e0418: overworld_screen_transition +0x7e0419: overworld_screen_transition_ALWAYSZERO +0x7e041a: dung_floor_move_flags +0x7e041c: dung_some_subpixel +0x7e041e: moving_wall_var2 +0x7e041f: moving_wall_var2_PADDING +0x7e0422: dung_floor_x_offs +0x7e0424: dung_floor_y_offs +0x7e0428: dung_hdr_collision_2_mirror +0x7e0429: dung_hdr_collision_2_mirror_PADDING +0x7e042a: moving_wall_var1 +0x7e042c: dung_misc_objs_index +0x7e042e: dung_index_of_torches +0x7e0430: dung_door_switch_triggered +0x7e0432: dung_num_star_shaped_switches +0x7e0436: invisible_door_dir_and_index_x2 +0x7e0438: dung_num_inter_room_upnorth_stairs +0x7e043a: dung_num_inter_room_southdown_stairs +0x7e043c: dung_num_inroom_upnorth_stairs +0x7e043e: dung_num_inroom_southdown_stairs +0x7e0440: dung_num_interpseudo_upnorth_stairs +0x7e0442: dung_num_inroom_upnorth_stairs_water +0x7e0444: dung_num_activated_water_ladders +0x7e0446: dung_num_water_ladders +0x7e0448: dung_some_stairs_unk4 +0x7e044a: kind_of_in_room_staircase +0x7e044e: dung_num_toggle_floor +0x7e0450: dung_num_toggle_palace +0x7e0452: dung_blastwall_flag_x +0x7e0453: dung_blastwall_flag_y +0x7e0454: dung_unk_blast_walls_2 +0x7e0456: dung_unk_blast_walls_3 +0x7e0458: hdr_dungeon_dark_with_lantern +0x7e0459: hdr_dungeon_dark_with_lantern_PADDING +0x7e045a: dung_num_lit_torches +0x7e045b: dung_num_lit_torches_PADDING +0x7e045c: dung_cur_quadrant_upload +0x7e045d: dung_cur_quadrant_upload_PADDING +0x7e0460: dung_cur_door_idx +0x7e0462: which_staircase_index +0x7e0463: which_staircase_index_PADDING +0x7e0464: staircase_var1 +0x7e0466: related_to_trapdoors_somehow +0x7e0468: dung_flag_trapdoors_down +0x7e046a: dung_floor_2_filler_tiles +0x7e046c: dung_hdr_collision +0x7e0470: watergate_var1 +0x7e0471: watergate_var1_PADDING +0x7e0472: watergate_pos +0x7e0474: push_block_direction +0x7e0476: link_is_on_lower_level_mirror +0x7e0478: dung_index_of_torches_start +0x7e047a: about_to_jump_off_ledge +0x7e047e: dung_num_wall_upnorth_spiral_stairs +0x7e0480: dung_num_wall_downnorth_spiral_stairs +0x7e0482: dung_num_wall_upnorth_spiral_stairs_2 +0x7e0484: dung_num_wall_downnorth_spiral_stairs_2 +0x7e048a: cur_staircase_plane +0x7e048e: dungeon_room_index2 +0x7e0490: dung_floor_1_filler_tiles +0x7e0494: move_overlay_ctr +0x7e0496: dung_num_chests_x2 +0x7e0498: dung_num_bigkey_locks_x2 +0x7e049a: dung_num_stairs_1 +0x7e049c: dung_num_stairs_2 +0x7e049e: dung_num_stairs_wet +0x7e04a0: hud_floor_changed_timer +0x7e04a2: dung_num_inter_room_upnorth_straight_stairs +0x7e04a4: dung_num_inter_room_upsouth_straight_stairs +0x7e04a6: dung_num_inter_room_downnorth_straight_stairs +0x7e04a8: dung_num_inter_room_downsouth_straight_stairs +0x7e04aa: death_var4 +0x7e04ac: num_memorized_tiles +0x7e04ae: dung_num_inroom_upsouth_stairs_water +0x7e04b0: dung_unk5 +0x7e04b4: super_bomb_indicator_unk2 +0x7e04b5: super_bomb_indicator_unk1 +0x7e04b8: big_key_door_message_triggered +0x7e04ba: dung_overlay_to_load +0x7e04c4: minigame_credits +0x7e04c6: trigger_special_entrance +0x7e04c7: flag_skip_call_tag_routines +0x7e04ca: link_lowlife_countdown_timer_beep +0x7e04f0: dung_torch_timers +0x7e0500: dung_replacement_tile_state +0x7e0520: dung_object_pos_in_objdata +0x7e0540: dung_object_tilemap_pos +0x7e0560: replacement_tilemap_UL +0x7e0580: replacement_tilemap_LL +0x7e05a0: replacement_tilemap_UR +0x7e05c0: replacement_tilemap_LR +0x7e05e0: pushedblocks_x_hi +0x7e05e4: pushedblocks_x_lo +0x7e05e8: pushedblocks_target +0x7e05ec: pushedblocks_y_hi +0x7e05f0: pushedblocks_y_lo +0x7e05f4: pushedblocks_subpixel +0x7e05f8: pushedblock_facing +0x7e05fc: index_of_changable_dungeon_objs +0x7e0600: room_scroll_vars0 +0x7e0608: room_scroll_vars1 +0x7e0610: up_down_scroll_target +0x7e0612: up_down_scroll_target_end +0x7e0614: left_right_scroll_target +0x7e0616: left_right_scroll_target_end +0x7e0618: camera_y_coord_scroll_low +0x7e061a: camera_y_coord_scroll_hi +0x7e061c: camera_x_coord_scroll_low +0x7e061e: camera_x_coord_scroll_hi +0x7e0620: BG1HOFS_subpixel +0x7e0622: BG1VOFS_subpixel +0x7e0624: overworld_unk1 +0x7e0626: overworld_unk1_neg +0x7e0628: overworld_unk3 +0x7e062a: overworld_unk3_neg +0x7e062c: dung_loade_bgoffs_h_copy +0x7e062e: dung_loade_bgoffs_v_copy +0x7e0630: selectfile_var8 +0x7e0636: overworld_map_flags +0x7e0637: timer_for_mode7_zoom +0x7e0638: M7X_copy +0x7e063a: M7Y_copy +0x7e063c: dung_hdr_hole_teleporter_plane +0x7e063d: dung_hdr_staircase_plane +0x7e0641: dung_flag_movable_block_was_pushed +0x7e0642: dung_flag_statechange_waterpuzzle +0x7e0646: dung_flag_somaria_block_switch +0x7e0647: mosaic_inc_or_dec +0x7e0670: spotlight_var3 +0x7e0674: spotlight_y_lower +0x7e0676: spotlight_y_upper +0x7e067a: spotlight_var4 +0x7e067c: spotlight_var1 +0x7e067e: spotlight_var2 +0x7e0680: water_hdma_var0 +0x7e0682: water_hdma_var1 +0x7e0684: water_hdma_var2 +0x7e0686: water_hdma_var3 +0x7e0688: water_hdma_var4 +0x7e068a: water_hdma_var5 +0x7e068c: dung_door_opened_incl_adjacent +0x7e068e: dung_cur_door_pos +0x7e0690: door_animation_step_indicator +0x7e0692: door_open_closed_counter +0x7e0694: dung_which_key_x2 +0x7e0696: ow_entrance_value +0x7e0698: big_rock_starting_address +0x7e069a: ow_countdown_transition +0x7e06a0: mirror_vars +0x7e06c0: dung_toggle_floor_pos +0x7e06d0: dung_toggle_palace_pos +0x7e06e0: dung_chest_locations +0x7e06ec: dung_stairs_table_2 +0x7e0700: current_area_of_player +0x7e0708: overworld_offset_base_y +0x7e070a: overworld_offset_mask_y +0x7e070c: overworld_offset_base_x +0x7e070e: overworld_offset_mask_x +0x7e0710: nmi_disable_core_updates +0x7e0711: nmi_disable_core_updates_UNUSED +0x7e0712: overworld_area_is_big +0x7e0714: overworld_area_is_big_backup +0x7e0716: overworld_right_bottom_bound_for_scroll +0x7e0720: vwf_flag_next_line +0x7e0722: vwf_curline +0x7e0724: vwf_var1 +0x7e0726: vwf_line_ptr +0x7e0800: oam_buf +0x7e0a00: extended_oam +0x7e0a20: bytewise_extended_oam +0x7e0aa1: main_tile_theme_index +0x7e0aa2: aux_tile_theme_index +0x7e0aa3: sprite_graphics_index +0x7e0aa4: misc_sprites_graphics_index +0x7e0aa6: unused_config_gfx +0x7e0aa8: overworld_palette_aux_or_main +0x7e0aaa: load_chr_halfslot_even_odd +0x7e0aac: overworld_palette_sp0 +0x7e0aad: sprite_aux1_palette +0x7e0aae: sprite_aux2_palette +0x7e0ab1: palette_sp6 +0x7e0ab2: hud_palette +0x7e0ab3: overworld_palette_mode +0x7e0ab4: overworld_palette_aux1_bp2to4_hi +0x7e0ab5: overworld_palette_aux2_bp5to7_hi +0x7e0ab6: dung_hdr_palette_1 +0x7e0ab8: overworld_palette_aux3_bp7_lo +0x7e0abd: overworld_palette_swap_flag +0x7e0abf: flag_overworld_area_did_change +0x7e0ac0: dma_source_addr_6 +0x7e0ac2: dma_source_addr_11 +0x7e0ac4: dma_source_addr_7 +0x7e0ac6: dma_source_addr_12 +0x7e0ac8: dma_source_addr_8 +0x7e0aca: dma_source_addr_13 +0x7e0acc: dma_source_addr_3 +0x7e0ace: dma_source_addr_0 +0x7e0ad0: dma_source_addr_4 +0x7e0ad2: dma_source_addr_1 +0x7e0ad4: dma_source_addr_5 +0x7e0ad6: dma_source_addr_2 +0x7e0ad8: dma_source_addr_10 +0x7e0ada: dma_source_addr_15 +0x7e0adc: animated_tile_data_src +0x7e0ae0: dma_source_addr_9 +0x7e0ae2: dma_source_addr_14 +0x7e0ae8: dma_var6 +0x7e0aea: dma_var7 +0x7e0aec: dma_source_addr_16 +0x7e0aee: dma_source_addr_18 +0x7e0af0: dma_source_addr_17 +0x7e0af2: dma_source_addr_19 +0x7e0af4: flag_travel_bird +0x7e0af6: dma_source_addr_20 +0x7e0af8: dma_source_addr_21 +0x7e0b00: overlord_type +0x7e0b08: overlord_x_lo +0x7e0b10: overlord_x_hi +0x7e0b18: overlord_y_lo +0x7e0b20: overlord_y_hi +0x7e0b28: overlord_gen1 +0x7e0b30: overlord_gen2 +0x7e0b38: overlord_gen3 +0x7e0b40: overlord_floor +0x7e0b48: overlord_offset_sprite_pos +0x7e0b58: sprite_stunned +0x7e0b68: repulsespark_floor_status +0x7e0b6a: sprite_limit_instance +0x7e0b6b: sprite_flags +0x7e0b7b: link_prevent_from_moving +0x7e0b7c: drag_player_x +0x7e0b7e: drag_player_y +0x7e0b80: dungeon_room_history +0x7e0b89: sprite_obj_prio +0x7e0b99: archery_game_arrows_left +0x7e0b9a: archery_game_out_of_arrows +0x7e0b9c: dung_secrets_unk1 +0x7e0ba0: sprite_ignore_projectile +0x7e0bb0: sprite_unk2 +0x7e0bc0: sprite_N +0x7e0be0: sprite_flags5 +0x7e0bf0: ancilla_arr4 +0x7e0bfa: ancilla_y_lo +0x7e0c04: ancilla_x_lo +0x7e0c0e: ancilla_y_hi +0x7e0c18: ancilla_x_hi +0x7e0c22: ancilla_y_vel +0x7e0c2c: ancilla_x_vel +0x7e0c36: ancilla_y_subpixel +0x7e0c40: ancilla_x_subpixel +0x7e0c4a: ancilla_type +0x7e0c54: ancilla_step +0x7e0c5e: ancilla_item_to_link +0x7e0c68: ancilla_timer +0x7e0c72: ancilla_dir +0x7e0c7c: ancilla_floor +0x7e0c86: ancilla_oam_idx +0x7e0c90: ancilla_numspr +0x7e0c9a: sprite_room +0x7e0caa: sprite_defl_bits +0x7e0cba: sprite_die_action +0x7e0cca: overlord_spawned_in_area +0x7e0cd2: sprite_bump_damage +0x7e0ce2: sprite_give_damage +0x7e0cf2: damage_type_determiner +0x7e0cf3: damage_type_determiner_PADDING +0x7e0cf4: activate_bomb_trap_overlord +0x7e0cf5: dungmap_var6 +0x7e0cf7: overworld_secret_subst_ctr +0x7e0cf9: item_drop_luck +0x7e0cfa: luck_kill_counter +0x7e0cfb: num_sprites_killed +0x7e0cfc: number_of_times_hurt_by_sprites +0x7e0cfd: rupee_sfx_sound_delay +0x7e0d00: sprite_y_lo +0x7e0d10: sprite_x_lo +0x7e0d20: sprite_y_hi +0x7e0d30: sprite_x_hi +0x7e0d40: sprite_y_vel +0x7e0d50: sprite_x_vel +0x7e0d60: sprite_y_subpixel +0x7e0d70: sprite_x_subpixel +0x7e0d80: sprite_spawned_flag +0x7e0d90: sprite_A +0x7e0da0: sprite_B +0x7e0db0: sprite_C +0x7e0dc0: sprite_graphics +0x7e0dd0: sprite_state +0x7e0de0: sprite_D +0x7e0df0: sprite_delay_main +0x7e0e00: sprite_delay_aux1 +0x7e0e10: sprite_delay_aux2 +0x7e0e20: sprite_type +0x7e0e30: sprite_subtype +0x7e0e40: sprite_flags2 +0x7e0e50: sprite_health +0x7e0e60: sprite_flags3 +0x7e0e70: sprite_wallcoll +0x7e0e80: sprite_subtype2 +0x7e0e90: sprite_E +0x7e0ea0: sprite_F +0x7e0eb0: sprite_head_dir +0x7e0ec0: sprite_anim_clock +0x7e0ed0: sprite_G +0x7e0ee0: sprite_delay_aux3 +0x7e0ef0: sprite_hit_timer +0x7e0f00: sprite_pause +0x7e0f10: sprite_delay_aux4 +0x7e0f20: sprite_floor +0x7e0f30: sprite_y_recoil +0x7e0f40: sprite_x_recoil +0x7e0f50: sprite_oam_flags +0x7e0f60: sprite_flags4 +0x7e0f70: sprite_z +0x7e0f80: sprite_z_vel +0x7e0f90: sprite_z_subpos +0x7e0fa0: cur_object_index +0x7e0fa5: sprite_tiletype +0x7e0fa8: dungmap_var7 +0x7e0faa: dungmap_var8 +0x7e0fac: repulsespark_timer +0x7e0fad: repulsespark_x_lo +0x7e0fae: repulsespark_y_lo +0x7e0faf: repulsespark_anim_delay +0x7e0fb3: sort_sprites_setting +0x7e0fb4: garnish_active +0x7e0fb7: spr_ranged_based_toggler +0x7e0fb8: sprcoll_x_size +0x7e0fba: sprcoll_y_size +0x7e0fbc: sprcoll_x_base +0x7e0fbe: sprcoll_y_base +0x7e0fc1: flag_unk1 +0x7e0fc2: link_x_coord_prev +0x7e0fc4: link_y_coord_prev +0x7e0fc7: prizes_arr1 +0x7e0fd7: debug_game_frozen +0x7e0fd8: cur_sprite_x +0x7e0fda: cur_sprite_y +0x7e0fdc: sprite_alert_flag +0x7e0fe0: oam_region_base +0x7e0fec: oam_alloc_arr1 +0x7e0ff9: intro_times_pal_flash +0x7e0ffa: alt_sprites_flag +0x7e0ffc: flag_block_link_menu +0x7e0fff: is_in_dark_world +0x7e1000: uvram +0x7e1980: door_type_and_slot +0x7e19a0: dung_door_tilemap_address +0x7e19c0: dung_door_direction +0x7e19e0: dung_exit_door_count +0x7e19e2: dung_exit_door_addresses +0x7e1a00: tagalong_y_lo +0x7e1a14: tagalong_y_hi +0x7e1a28: tagalong_x_lo +0x7e1a3c: tagalong_x_hi +0x7e1a50: tagalong_z +0x7e1a64: tagalong_layerbits +0x7e1ab0: bird_travel_x_lo +0x7e1ac0: bird_travel_x_hi +0x7e1ad0: bird_travel_y_lo +0x7e1ae0: bird_travel_y_hi +0x7e1af0: birdtravel_var1 +0x7e1b00: mode7_hdma_table +0x7e1cd0: text_msgbox_topleft_copy +0x7e1cd2: text_msgbox_topleft +0x7e1cd4: text_render_state +0x7e1cd5: vwf_line_mode +0x7e1cd6: vwf_line_speed +0x7e1cd7: text_incremental_state +0x7e1cd8: messaging_module +0x7e1cd9: dialogue_msg_dst_offs +0x7e1cdd: dialogue_msg_src_offs +0x7e1ce0: text_wait_countdown +0x7e1ce2: text_tilemap_cur +0x7e1ce6: text_next_position +0x7e1ce8: choice_in_multiselect_box +0x7e1ce9: text_wait_countdown2 +0x7e1cf0: dialogue_message_index +0x7e1cf4: choice_in_multiselect_box_bak +0x7e1d00: alt_sprite_state +0x7e1d10: alt_sprite_type +0x7e1d20: alt_sprite_x_lo +0x7e1d30: alt_sprite_x_hi +0x7e1d40: alt_sprite_y_lo +0x7e1d50: alt_sprite_y_hi +0x7e1d60: alt_sprite_graphics +0x7e1d70: alt_sprite_A +0x7e1d80: alt_sprite_head_dir +0x7e1d90: alt_sprite_oam_flags +0x7e1da0: alt_sprite_obj_prio +0x7e1db0: alt_sprite_D +0x7e1dc0: alt_sprite_flags2 +0x7e1dd0: alt_sprite_floor +0x7e1de0: alt_sprite_spawned_flag +0x7e1df0: alt_sprite_flags3 +0x7e1e00: intro_step_index +0x7e1e01: intro_step_timer +0x7e1e02: intro_want_double_ret +0x7e1e08: intro_sprite_alloc +0x7e1e0a: intro_frame_ctr +0x7e1e0c: triforce_ctr +0x7e1e10: intro_sprite_isinited +0x7e1e18: intro_sprite_subtype +0x7e1e20: intro_sprite_state +0x7e1e28: intro_x_subpixel +0x7e1e30: intro_x_lo +0x7e1e38: intro_x_hi +0x7e1e40: intro_y_subpixel +0x7e1e48: intro_y_lo +0x7e1e50: intro_y_hi +0x7e1e58: intro_x_vel +0x7e1e60: intro_y_vel +0x7e1f00: intro_did_run_step +0x7e1f01: poly_config_color_mode +0x7e1f02: poly_config1 +0x7e1f03: poly_which_model +0x7e1f04: poly_a +0x7e1f05: poly_b +0x7e1f06: poly_base_x +0x7e1f07: poly_base_y +0x7e1f08: poly_var1 +0x7e1f0a: thread_other_stack +0x7e1f0c: nmi_flag_update_polyhedral +0x7e1f3f: poly_config_num_vertex +0x7e1f40: poly_config_num_polys +0x7e1f41: poly_fromlut_ptr2 +0x7e1f43: poly_fromlut_ptr4 +0x7e1f45: poly_fromlut_z +0x7e1f46: poly_fromlut_y +0x7e1f47: poly_fromlut_x +0x7e1f48: poly_f0 +0x7e1f4a: poly_f1 +0x7e1f4c: poly_f2 +0x7e1f4e: poly_num_vertex_in_poly +0x7e1f4f: poly_raster_color_config +0x7e1f50: poly_sin_a +0x7e1f52: poly_cos_a +0x7e1f54: poly_sin_b +0x7e1f56: poly_cos_b +0x7e1f58: poly_e0 +0x7e1f5a: poly_e2 +0x7e1f5c: poly_e3 +0x7e1f5e: poly_e1 +0x7e1f60: poly_arr_x +0x7e1f88: poly_arr_y +0x7e1fb0: poly_tmp0 +0x7e1fb2: poly_tmp1 +0x7e1fb5: poly_raster_color0 +0x7e1fb7: poly_raster_color1 +0x7e1fb9: poly_raster_dst_ptr +0x7e1fbc: poly_tmp2 +0x7e1fbf: poly_arr_xy_coords_minus1 +0x7e1fc0: poly_xy_coords +0x7e1fe0: poly_total_num_steps +0x7e1fe1: poly_x0_cur +0x7e1fe2: poly_y0_cur +0x7e1fe3: poly_x0_target +0x7e1fe4: poly_y0_trig +0x7e1fe5: poly_x0_frac +0x7e1fe7: poly_x0_step +0x7e1fe9: poly_cur_vertex_idx0 +0x7e1fea: poly_x1_cur +0x7e1feb: poly_y1_cur +0x7e1fec: poly_x1_target +0x7e1fed: poly_y1_trig +0x7e1fee: poly_x1_frac +0x7e1ff0: poly_x1_step +0x7e1ff2: poly_cur_vertex_idx1 +0x7e1ffa: poly_raster_numfull +0x7e2000: dung_bg2 +0x7e4000: dung_bg1 +0x7e9000: animated_tiles +0x7ec000: dung_hdr_travel_destinations +0x7ec005: dung_want_lights_out +0x7ec006: dung_want_lights_out_copy +0x7ec007: palette_filter_countdown +0x7ec009: darkening_or_lightening_screen +0x7ec00b: mosaic_target_level +0x7ec00c: mosaic_target_level_PADDING +0x7ec00d: bg_tile_animation_countdown +0x7ec011: mosaic_level +0x7ec017: overworld_fixed_color_plusminus +0x7ec019: agahnim_pal_setting +0x7ec100: overworld_area_index_spexit +0x7ec102: TM_copy_spexit +0x7ec104: BG2VOFS_copy2_spexit +0x7ec106: BG2HOFS_copy2_spexit +0x7ec108: link_y_coord_spexit +0x7ec10a: link_x_coord_spexit +0x7ec10c: overworld_screen_index_spexit +0x7ec10e: map16_load_src_off_spexit +0x7ec110: camera_y_coord_scroll_low_spexit +0x7ec112: camera_x_coord_scroll_low_spexit +0x7ec114: room_scroll_vars_y_vofs1_spexit +0x7ec116: room_scroll_vars_y_hofs1_spexit +0x7ec118: room_scroll_vars_y_vofs2_spexit +0x7ec11a: room_scroll_vars_y_hofs2_spexit +0x7ec11c: up_down_scroll_target_spexit +0x7ec11e: up_down_scroll_target_end_spexit +0x7ec120: left_right_scroll_target_spexit +0x7ec122: left_right_scroll_target_end_spexit +0x7ec125: main_tile_theme_index_spexit +0x7ec126: aux_tile_theme_index_spexit +0x7ec127: sprite_graphics_index_spexit +0x7ec12a: overworld_unk1_spexit +0x7ec12c: overworld_unk1_neg_spexit +0x7ec12e: overworld_unk3_spexit +0x7ec130: overworld_unk3_neg_spexit +0x7ec140: overworld_area_index_exit +0x7ec142: TM_copy_exit +0x7ec144: BG2VOFS_copy2_exit +0x7ec146: BG2HOFS_copy2_exit +0x7ec148: link_y_coord_exit +0x7ec14a: link_x_coord_exit +0x7ec14c: overworld_screen_index_exit +0x7ec14e: map16_load_src_off_exit +0x7ec150: camera_y_coord_scroll_low_exit +0x7ec152: camera_x_coord_scroll_low_exit +0x7ec154: room_scroll_vars_y_vofs1_exit +0x7ec156: room_scroll_vars_y_hofs1_exit +0x7ec158: room_scroll_vars_y_vofs2_exit +0x7ec15a: room_scroll_vars_y_hofs2_exit +0x7ec15c: up_down_scroll_target_exit +0x7ec15e: up_down_scroll_target_end_exit +0x7ec160: left_right_scroll_target_exit +0x7ec162: left_right_scroll_target_end_exit +0x7ec165: main_tile_theme_index_exit +0x7ec166: aux_tile_theme_index_exit +0x7ec167: sprite_graphics_index_exit +0x7ec16a: overworld_unk1_exit +0x7ec16c: overworld_unk1_neg_exit +0x7ec16e: overworld_unk3_exit +0x7ec170: overworld_unk3_neg_exit +0x7ec172: orange_blue_barrier_state +0x7ec180: BG2HOFS_copy2_cached +0x7ec182: BG2VOFS_copy2_cached +0x7ec184: link_y_coord_cached +0x7ec186: link_x_coord_cached +0x7ec188: room_scroll_vars_y_vofs1_cached +0x7ec18a: room_scroll_vars_y_vofs2_cached +0x7ec18c: room_scroll_vars_x_vofs1_cached +0x7ec18e: room_scroll_vars_x_vofs2_cached +0x7ec190: up_down_scroll_target_cached +0x7ec192: up_down_scroll_target_end_cached +0x7ec194: left_right_scroll_target_cached +0x7ec196: left_right_scroll_target_end_cached +0x7ec198: camera_y_coord_scroll_low_cached +0x7ec19a: camera_x_coord_scroll_low_cached +0x7ec19c: quadrant_fullsize_x_cached +0x7ec19d: quadrant_fullsize_y_cached +0x7ec19e: link_quadrant_x_cached +0x7ec19f: link_quadrant_y_cached +0x7ec1a6: link_direction_facing_cached +0x7ec1a7: link_is_on_lower_level_cached +0x7ec1a8: link_is_on_lower_level_mirror_cached +0x7ec1a9: is_standing_in_doorway_cahed +0x7ec1aa: dung_cur_floor_cached +0x7ec200: mapbak_BG1HOFS_copy2 +0x7ec202: mapbak_BG2HOFS_copy2 +0x7ec204: mapbak_BG1VOFS_copy2 +0x7ec206: mapbak_BG2VOFS_copy2 +0x7ec208: dung_bg2_properties_backup +0x7ec20a: overworld_pal_unk1 +0x7ec20b: overworld_pal_unk2 +0x7ec20c: overworld_pal_unk3 +0x7ec20e: mapbak_main_tile_theme_index +0x7ec20f: mapbak_sprite_graphics_index +0x7ec210: mapbak_aux_tile_theme_index +0x7ec211: mapbak_TM +0x7ec212: mapbak_TS +0x7ec213: overworld_screen_index_prev +0x7ec215: map16_load_src_off_prev +0x7ec217: map16_load_var2_prev +0x7ec219: map16_load_dst_off_prev +0x7ec21b: overworld_screen_transition_prev +0x7ec21d: overworld_screen_trans_dir_bits_prev +0x7ec21f: overworld_screen_trans_dir_bits2_prev +0x7ec221: mapbak_bg1_x_offset +0x7ec223: mapbak_bg1_y_offset +0x7ec225: mapbak_CGWSEL +0x7ec227: music_unk1_death +0x7ec228: sound_effect_ambient_last_death +0x7ec229: mapbak_HDMAEN +0x7ec230: vwf_arr +0x7ec2f8: aux_bg_subset_0 +0x7ec2f9: aux_bg_subset_1 +0x7ec2fa: aux_bg_subset_2 +0x7ec2fb: aux_bg_subset_3 +0x7ec2fc: sprite_gfx_subset_0 +0x7ec2fd: sprite_gfx_subset_1 +0x7ec2fe: sprite_gfx_subset_2 +0x7ec2ff: sprite_gfx_subset_3 +0x7ec300: aux_palette_buffer +0x7ec500: main_palette_buffer +0x7ec700: hud_tile_indices_buffer +0x7ec880: moving_wall_arr1 +0x7ee800: polyhedral_buffer +0x7ef000: save_dung_info +0x7ef280: save_ow_event_info +0x7ef300: savegame_has_master_sword_flags +0x7ef340: link_item_bow +0x7ef341: link_item_boomerang +0x7ef342: link_item_hookshot +0x7ef343: link_item_bombs +0x7ef344: link_item_mushroom +0x7ef345: link_item_fire_rod +0x7ef346: link_item_ice_rod +0x7ef347: link_item_bombos_medallion +0x7ef348: link_item_ether_medallion +0x7ef349: link_item_quake_medallion +0x7ef34a: link_item_torch +0x7ef34b: link_item_hammer +0x7ef34c: link_item_flute +0x7ef34d: link_item_bug_net +0x7ef34e: link_item_book_of_mudora +0x7ef34f: link_item_bottles +0x7ef350: link_item_cane_somaria +0x7ef351: link_item_cane_byrna +0x7ef352: link_item_cape +0x7ef353: link_item_mirror +0x7ef354: link_item_gloves +0x7ef355: link_item_boots +0x7ef356: link_item_flippers +0x7ef357: link_item_moon_pearl +0x7ef359: link_sword_type +0x7ef35a: link_shield_type +0x7ef35b: link_armor +0x7ef35c: link_bottle_info +0x7ef360: link_rupees_goal +0x7ef362: link_rupees_actual +0x7ef364: link_compass +0x7ef366: link_bigkey +0x7ef368: link_dungeon_map +0x7ef36a: link_rupees_in_pond +0x7ef36b: link_heart_pieces +0x7ef36c: link_health_capacity +0x7ef36d: link_health_current +0x7ef36e: link_magic_power +0x7ef36f: link_num_keys +0x7ef370: link_bomb_upgrades +0x7ef371: link_arrow_upgrades +0x7ef372: link_hearts_filler +0x7ef373: link_magic_filler +0x7ef374: link_which_pendants +0x7ef375: link_bomb_filler +0x7ef376: link_arrow_filler +0x7ef377: link_num_arrows +0x7ef379: link_ability_flags +0x7ef37a: link_has_crystals +0x7ef37b: link_magic_consumption +0x7ef37c: link_keys_earned_per_dungeon +0x7ef3c5: sram_progress_indicator +0x7ef3c6: sram_progress_flags +0x7ef3c7: savegame_map_icons_indicator +0x7ef3c8: which_starting_point +0x7ef3c9: sram_progress_indicator_3 +0x7ef3ca: savegame_is_darkworld +0x7ef3cc: savegame_tagalong +0x7ef3cd: saved_tagalong_y +0x7ef3cf: saved_tagalong_x +0x7ef3d1: saved_tagalong_indoors +0x7ef3d2: saved_tagalong_floor +0x7ef3d3: super_bomb_going_off +0x7ef3e7: deaths_per_palace +0x7ef403: death_save_counter +0x7ef405: death_var2 +0x7ef580: pots_revealed_in_room +0x7ef800: memorized_tile_addr +0x7ef940: movable_block_datas +0x7efa00: memorized_tile_value +0x7efb40: dung_torch_data +0x7efcc0: overworld_sprite_gfx +0x7efd40: overworld_sprite_palettes +0x7efe00: attributes_for_tile +0x7f0000: skullwoodsfire_var0 +0x7f0008: skullwoodsfire_var5 +0x7f0010: skullwoodsfire_var4 +0x7f0011: blastwall_var4 +0x7f0018: skullwoodsfire_var9 +0x7f001a: skullwoodsfire_var11 +0x7f001c: blastwall_var7 +0x7f0020: skullwoodsfire_y_arr +0x7f0026: skullwoodsfire_var10 +0x7f0030: skullwoodsfire_x_arr +0x7f0036: skullwoodsfire_var12 +0x7f0040: blastwall_var12 +0x7f1200: messaging_text_buffer +0x7f2000: dung_bg2_attr_table +0x7f3000: dung_bg1_attr_table +0x7f4400: map16_decode_0 +0x7f4410: map16_decode_1 +0x7f4420: map16_decode_2 +0x7f4430: map16_decode_3 +0x7f4440: map16_decode_last +0x7f4442: map16_decode_tmp +0x7f5800: breaktowerseal_var3 +0x7f5808: breaktowerseal_var4 +0x7f580a: quake_var5 +0x7f580b: quake_var1 +0x7f580e: breaktowerseal_x +0x7f5810: breaktowerseal_y +0x7f5812: breaktowerseal_var5 +0x7f5817: breaktowerseal_base_sparkle_y_lo +0x7f581f: breaktowerseal_base_sparkle_y_hi +0x7f5827: breaktowerseal_base_sparkle_x_lo +0x7f582f: breaktowerseal_base_sparkle_x_hi +0x7f5837: breaktowerseal_sparkle_var1 +0x7f584f: breaktowerseal_sparkle_y_lo +0x7f5867: breaktowerseal_sparkle_y_hi +0x7f587f: breaktowerseal_sparkle_x_lo +0x7f5897: breaktowerseal_sparkle_x_hi +0x7f58af: breaktowerseal_sparkle_var2 +0x7f58e4: bombos_x_hi +0x7f5924: bombos_y_coord2 +0x7f592c: bombos_x_coord2 +0x7f5934: bombos_var4 +0x7f5935: bombos_arr3 +0x7f5945: bombos_arr4 +0x7f5955: bombos_y_coord +0x7f59d5: bombos_x_coord +0x7f5a55: bombos_var3 +0x7f5a56: bombos_var2 +0x7f5a57: bombos_var1 +0x7f5b00: overworld_music +0x7f5ba0: freeRam +0x7f6000: enemy_damage_data +0x7f7000: hdma_table +0x7f71c0: kTextDialoguePointers +0x7fdd80: mapbak_palette +0x7fdf80: sprite_where_in_room +0x7fef80: overworld_sprite_was_loaded +0x7ff800: garnish_type +0x7ff81e: garnish_y_lo +0x7ff83c: garnish_x_lo +0x7ff85a: garnish_y_hi +0x7ff878: garnish_x_hi +0x7ff896: garnish_y_vel +0x7ff8b4: garnish_x_vel +0x7ff8d2: garnish_y_subpixel +0x7ff8f0: garnish_x_subpixel +0x7ff90e: garnish_countdown +0x7ff92c: garnish_sprite +0x7ff94a: garnish_anim_5 +0x7ff968: garnish_floor +0x7ff9c2: sprite_I +0x7ff9fe: garnish_oam_flags +0x7ffa1c: sprite_unk3 +0x7ffa2c: sprite_unk4 +0x7ffa3c: sprite_unk5 +0x7ffa4c: sprite_unk1 +0x7ffa5c: swamola_x_lo +0x7ffa6c: alt_sprite_C +0x7ffa7c: alt_sprite_E +0x7ffa8c: alt_sprite_subtype2 +0x7ffa9c: alt_sprite_height_above_shadow +0x7ffaac: alt_sprite_delay_main +0x7ffacc: alt_sprite_I +0x7ffadc: alt_sprite_maybe_ignore_projectile +0x7ffb1c: swamola_x_hi +0x7ffbdc: swamola_y_lo +0x7ffc00: moldorm_x_lo +0x7ffc80: moldorm_x_hi_ +0x7ffc9c: swamola_y_hi +0x7ffd00: moldorm_y_lo +0x7ffd5c: swamola_target_x_lo +0x7ffd62: swamola_target_x_hi +0x7ffd68: swamola_target_y_lo +0x7ffd6e: swamola_target_y_hi +0x7ffd80: beamos_x_lo +0x7ffe00: beamos_x_hi +0x7ffe80: beamos_y_lo +0x7fff00: beamos_y_hi +0x808000: Interrupt_Reset +0x808061: mainrouting_low +0x80807d: mainrouting_high +0x808099: mainrouting_bank +0x8080b5: Module_MainRouting +0x8080c9: Interrupt_NMI +0x808100: volume_or_transfer_command +0x80822c: Native_mode_COP +0x80822d: NMI_SwitchThread +0x8082d8: Interrupt_IRQ +0x808333: EraseTileMaps_triforce +0x80833f: EraseTileMaps_dungeonmap +0x80834b: Vram_EraseTilemaps_normal +0x808355: EraseTileMaps +0x8083d1: NMI_ReadJoypads +0x8083f9: NMI_ReadJoypads_Joypad2 +0x80841e: ClearOamBuffer +0x80848c: kSrmOffsets +0x808494: kLinkDmaSources8 +0x80849c: kLinkDmaSources4 +0x8084ac: kLinkDmaSources5 +0x8084b2: kLinkDmaSources6 +0x8085b2: kLinkDmaSources7 +0x8085d2: kLinkDmaCtrs0 +0x8085de: kLinkDmaSources9 +0x8085fc: NMI_PrepareSprites +0x808781: JumpTableLocal +0x80879c: JumpTableLong +0x8087c0: Startup_InitializeMemory +0x80882e: Overworld_GetTileAttributeAtLocation +0x808888: LoadSongBank +0x808901: Sound_LoadIntroSongBank +0x808913: LoadOverworldSongs +0x808925: LoadDungeonSongs +0x808931: LoadCreditsSongs +0x80893d: EnableForceBlank +0x80894a: SaveGameFile +0x8089e0: NMI_DoUpdates +0x808c7e: kNmiSubroutines +0x808cb0: NMI_UploadTilemap +0x808ce3: NMI_UploadTilemap_doNothing +0x808ce4: NMI_UploadBG3Text +0x808d13: NMI_UpdateOWScroll +0x808d62: NMI_UpdateSubscreenOverlay +0x808d7c: NMI_UploadSubscreenOverlay_firstHalf +0x808d96: NMI_UploadSubscreenOverlay_secondHalf +0x808dae: NMI_HandleArbitraryTileMap +0x808e09: NMI_UpdateBG1Wall +0x808e4b: NMI_TileMapNothing +0x808e4c: kLightWorldTileMapSrcs +0x808e54: NMI_UpdateLoadLightWorldMap +0x808ea9: NMI_UpdateBG2Left +0x808ee7: NMI_UpdateBGChar3and4 +0x808f16: NMI_UpdateBGChar5and6 +0x808f45: NMI_UpdateBGCharHalf +0x808f72: NMI_UpdateBGChar0 +0x808f79: NMI_UpdateBGChar1 +0x808f80: NMI_UpdateBGChar2 +0x808f87: NMI_UpdateBGChar3 +0x808f8e: NMI_UpdateObjChar0 +0x808fbd: NMI_UpdateObjChar2 +0x808fc4: NMI_UpdateObjChar3 +0x808fc9: NMI_RunTileMapUpdateDMA +0x808ff3: NMI_UploadDarkWorldMap +0x809038: NMI_UploadGameOverText +0x80908b: NMI_UpdatePegTiles +0x8090b7: NMI_UpdateStarTiles +0x8090e3: NMI_UploadTilemap_Far +0x8090eb: UNREACHABLE_0090EB +0x80910f: kUploadBgSrcs +0x80912f: kUploadBgDsts +0x80913f: Dungeon_PrepareNextRoomQuadrantUpload +0x8091c4: WaterFlood_BuildOneQuadrantForVRAM +0x8091d3: TileMapPrep_NotWaterOnTag +0x809252: WaterFlood_BuildOneQuadrantForVRAM_not_triggered +0x8092a1: HandleStripes14 +0x809347: NMI_UpdateIRQGFX +0x80937a: nmi_load_vram_lo +0x80937b: kNmiLoadVramLo +0x809384: kNmiLoadVramHi +0x80938d: kNmiLoadVramBank +0x809396: kLinkDmaSources1 +0x8095f4: kLinkDmaSources2 +0x809852: kLinkDmaSources3 +0x809888: kNmiVramAddrs +0x8098c0: kUpperBitmasks +0x8098e0: kUpperBitmasksNOT +0x809900: kChestOpenMasks +0x80990c: kHolesDecreaseHealth +0x80997e: kDoorPositionToTilemapOffs_Up +0x809996: kDoorPositionToTilemapOffs_Down +0x8099ae: kDoorPositionToTilemapOffs_Left +0x8099c6: kDoorPositionToTilemapOffs_Right +0x8099de: kDoor_BlastWallUp_Dsts +0x8099ea: kDungLinkOffs1Y +0x8099f2: kDungLinkOffs1X +0x8099fa: kDungLinkOffs1Pos +0x809a02: kDoorTypeRemap +0x809a52: kTileAttrsByDoor +0x809aa2: kDungCheckDoorsLookup +0x809ad2: kDungCheckDoorsLookupOpposite +0x809b02: Dungeon_QuadrantOffsets +0x809b0a: kMovingWall_Sizes0 +0x809b12: kMovingWall_Sizes1 +0x809b1a: kMovingWall_Tab1 +0x809b2a: kMovingWall_Tab0 +0x809b3a: kTab_Plus2 +0x809b52: kPredefinedTileData +0x80cd9e: kDoorTypeSrcData +0x80ce06: kDoorTypeSrcData2 +0x80ce66: kDoorTypeSrcData3 +0x80cec6: kDoorTypeSrcData4 +0x80cf24: kDoorAnimUpSrc +0x80cf2c: kDoorAnimDownSrc +0x80cf34: kDoorAnimLeftSrc +0x80cf3c: kDoorAnimRightSrc +0x80cf80: graphics_data_bank +0x80cff3: graphics_sprite_bank +0x80d05f: graphics_data_hi +0x80d0d2: graphics_sprite_hi +0x80d13e: graphics_data_lo +0x80d1b1: graphics_sprite_lo +0x80d21d: kIntro_LoadGfx_Tab +0x80d231: LoadItemGFXIntoWRAM4BPPBuffer +0x80d2be: kSwordTypeToOffs +0x80d2c8: DecompressSwordGraphics +0x80d300: kShieldTypeToGfxOffs +0x80d308: DecompressShieldGraphics +0x80d337: DecompressAnimatedDungeonTiles +0x80d394: DecompressAnimatedOverworldTiles +0x80d3c6: LoadItemGFX_Auxiliary +0x80d407: kTagalongWhich +0x80d423: LoadFollowerGraphics +0x80d469: kDecodeAnimatedSpriteTile_Tab +0x80d4db: WriteTo4BPPBuffer_at_7F4000 +0x80d4ed: DecodeAnimatedSpriteTile_variable +0x80d537: LoadItemGFX_sheet0 +0x80d54e: LoadGfx_unpack_expandTo4bpp_from_0x7f4000 +0x80d553: LoadGfx_expandTo4bpp_from_0x7f4000 +0x80d561: LoadGfx_expandTo4bpp_inner +0x80d585: UNREACHABLE_00D5C5 +0x80d5cb: Do3bppToWRAM4bpp_LeftPal +0x80d5ce: Do3To4LowAnimated +0x80d619: Do3bppToWRAM4bpp_RightPal +0x80d61c: Expand3To4High +0x80d66e: LoadTransAuxGFX +0x80d6f9: LoadTransAuxGFX_sprite +0x80d706: Gfx_LoadSpritesInner +0x80d788: ReloadPreviouslyLoadedSheets +0x80d80e: Attract_DecompressStoryGFX +0x80d855: kMirrorWarp_LoadNext_NmiLoad +0x80d864: AnimateMirrorWarp +0x80d892: AnimateMirrorWarp_LoadPyramidIfAga +0x80d8a5: AnimateMirrorWarp_TriggerOverlayA_2 +0x80d8b3: AnimateMirrorWarp_DrawDestinationScreen +0x80d8bb: AnimateMirrorWarp_DoSpritesPalettes +0x80d8c7: AnimateMirrorWarp_TriggerOverlayB +0x80d8cf: AnimateMirrorWarp_TriggerBGChar0 +0x80d8d5: AnimateMirrorWarp_DecompressAnimatedTiles +0x80d8ee: kVariousPacks +0x80d8fe: AnimateMirrorWarp_DecompressNewTileSets +0x80d9b9: AnimateMirrorWarp_DecompressBackgroundsA +0x80d9f8: AnimateMirrorWarp_DecompressBackgroundsB +0x80da2c: AnimateMirrorWarp_DecompressBackgroundsC +0x80da63: AnimateMirrorWarp_LoadSubscreen +0x80dabb: AnimateMirrorWarp_DecompressSpritesA +0x80db1b: AnimateMirrorWarp_DecompressSpritesB +0x80db57: kSpriteTilesets +0x80dd97: kAuxTilesets +0x80dedf: kGraphics_IncrementalVramUpload_Dst +0x80deef: kGraphics_IncrementalVramUpload_Src +0x80deff: Graphics_IncrementalVRAMUpload +0x80df1a: PrepTransAuxGfx +0x80df4f: Do3To4High16Bit +0x80dfb8: Do3To4Low16Bit +0x80e031: LoadNewSpriteGFXSet +0x80e073: kMainTilesets +0x80e19b: InitializeTilesets +0x80e2d0: LoadDefaultGraphics +0x80e33b: DecompressAndCopyManually +0x80e36d: Attract_LoadBG3GFX +0x80e384: LoadCommonSprites_2 +0x80e399: TransferMode7Characters +0x80e3d2: kGraphicsHalfSlotPacks +0x80e3e5: kGraphicsLoadSp6 +0x80e3fa: Graphics_LoadChrHalfSlot +0x80e4e9: LoadFileSelectGraphics +0x80e556: TransferFontToVRAM +0x80e583: LoadSpriteGraphics +0x80e5af: Do3To4High +0x80e609: LoadBackgroundGraphics +0x80e60d: LoadBgGfx_toaddr +0x80e63c: Do3To4Low +0x80e6b7: LoadCommonSprites +0x80e75c: Decompress_sprite_high +0x80e766: Decomp_spr_to_0x7f4000 +0x80e772: Decomp_spr +0x80e783: Decomp_bg_to_7f4000 +0x80e78b: Decomp_bg_bank +0x80e78f: Decomp_bg +0x80e79e: Decompress +0x80e843: Decompression_GetNextByte +0x80e880: kPalIncr_R +0x80e884: kPalIncr_G +0x80e888: kPalIncr_B +0x80e88c: kPaletteFilteringBits +0x80e90c: PaletteFilter +0x80e914: ApplyPaletteFilter +0x80e9e4: FilterColors +0x80ea49: UNREACHABLE_00EA79 +0x80eace: FilterColorsEndpoint +0x80eb29: ResetHUDPalettes4and5 +0x80eb5e: PaletteFilterHistory +0x80ebc5: PaletteFilter_WishPonds +0x80ebcf: PaletteFilter_Crystal +0x80ebd3: PaletteFilter_WishPonds_Inner +0x80ebf2: PaletteFilter_RestoreSP5F +0x80ec0d: PaletteFilter_SP5F +0x80ec54: PaletteFilter_KholdstareShell_init +0x80ec79: KholdstareShell_PaletteFiltering +0x80ecc4: kPaletteFilter_Agahnim_Tab +0x80ecca: AgahnimWarpShadowFilter +0x80ed19: AgahnimWarpShadowFilter_filter_one +0x80ed7c: Palette_FadeIntroOneStep +0x80ed8f: Palette_FadeIntro2 +0x80edb1: PaletteFilter_Restore +0x80edca: PaletteFilter_RestoreAdditive +0x80ee21: PaletteFilter_RestoreSubtractive +0x80ee78: PaletteFilter_InitializeWhiteFilter +0x80eee0: MirrorWarp_GoToSubmodules +0x80eee7: MirrorWarp_RunAnimationSubmodules +0x80eef1: PaletteFilter_BlindingWhite +0x80ef27: PaletteFilter_StartBlindingWhite +0x80ef8a: PaletteFilter_BlindingWhiteTriforce +0x80ef97: PaletteFilter_WhirlpoolBlue +0x80f00c: PaletteFilter_IsolateWhirlpoolBlue +0x80f04a: PaletteFilter_WhirlpoolRestoreBlue +0x80f0c7: PaletteFilter_WhirlpoolRestoreRedGreen +0x80f132: EXIT_00F12D +0x80f135: PaletteFilter_RestoreBGSubstractiveStrict +0x80f169: PaletteFilter_RestoreBGAdditiveStrict +0x80f183: Trinexx_FlashShellPalette_Red +0x80f1cf: Trinexx_UnflashShellPalette_Red +0x80f207: Trinexx_FlashShellPalette_Blue +0x80f253: Trinexx_UnflashShellPalette_Blue +0x80f28b: IrisSpotlight_close +0x80f295: Spotlight_open +0x80f29d: SpotlightInternal +0x80f2fb: kSpotlightIndirectHdma +0x80f302: kSpotlight_delta_size +0x80f30a: kSpotlight_goal +0x80f312: IrisSpotlight_ConfigureTable +0x80f427: IrisSpotlight_ResetTable +0x80f44b: kConfigureSpotlightTable_Helper_Tab +0x80f4cc: IrisSpotlight_CalculateCircleValue +0x80f53e: kOrientLampBgTab0 +0x80f546: kOrientLampBgTab1 +0x80f54e: kOrientLampBgTab2 +0x80f556: kOrientLampBgTab3 +0x80f55e: kOrientLampBgTab4 +0x80f567: OrientLampLightCone +0x80f649: AdjustWaterHDMAWindow +0x80f660: AdjustWaterHDMAWindow_X +0x80f734: FloodDam_PrepFloodHDMA +0x80f800: Module0E_Interface +0x80f875: Module_Messaging_0 +0x80f876: Messaging_MainJumpTable_lo +0x80f882: Messaging_MainJumpTable_hi +0x80f88e: Messaging_MainJumpTable_bank +0x80f89a: RunInterface +0x80f8b1: Module0E_05_DesertPrayer +0x80f8c6: DesertPrayer_InitializeCutscene +0x80f8e0: DesertPrayer_FadeScene +0x80f8e9: Module0E_06_Unused +0x80f8fb: Module0E_04_RedPotion +0x80f911: Module0E_08_GreenPotion +0x80f918: Module0E_09_BluePotion +0x80f92d: kDungeonExit_From +0x80f939: kDungeonExit_To +0x80f945: PrepareDungeonExitFromBossFight +0x80f9dd: SavePalaceDeaths +0x80f9fa: Module0E_0B_SaveMenu +0x80fa41: kOverworldSpriteGfx +0x80fb41: kOverworldSpritePalettes +0x80fc41: Sprite_LoadGraphicsProperties +0x80fc62: Sprite_LoadGraphicsProperties_light_world_only +0x80fc9c: kOverworldAuxTileThemeIndexes +0x80fd1c: kOverworldBgPalettes +0x80fda4: ResetStarTileGraphics +0x80fda7: Dungeon_RestoreStarTileChr +0x80fdee: InitializeMirrorHDMA +0x80fe5e: MirrorWarp_BuildAndEnableHDMATable +0x80fe64: MirrorWarp_BuildWavingHDMATable +0x80ff2f: MirrorWarp_BuildDewavingHDMATable +0x80ffc0: snes_header +0x818000: kObjectSubtype1Params +0x818200: kObjectSubtype1Routines +0x8183f0: kObjectSubtype2Params +0x818470: kObjectSubtype2Routines +0x8184f0: kObjectSubtype3Params +0x8185f0: kObjectSubtype3Routines +0x8186f0: kDoorCallb +0x8186f8: kDungeon_DrawObjectOffsets_BG1 +0x818719: kDungeon_DrawObjectOffsets_BG2 +0x81873a: Dungeon_LoadRoom +0x8188e4: RoomDraw_DrawAllObjects +0x818916: RoomData_DrawObject_Door +0x81893c: RoomData_DrawObject +0x8189dc: RoomDraw_DrawFloors +0x818a1f: RoomDraw_FloorChunks +0x818a44: RoomDraw_A_Many32x32Blocks +0x818a89: RoomDraw_Downwards4x2_1to15or26 +0x818a92: RoomDraw_Rightwards2x4_1to15or26 +0x818aa4: RoomDraw_Downwards4x2_1to16_BothBG +0x818b0d: RoomDraw_Rightwards2x4spaced4_1to16 +0x818b74: RoomDraw_Downwards2x2_1to16 +0x818b79: RoomDraw_Rightwards2x2_1to16 +0x818b7e: RoomDraw_Downwards2x2_1to15or32 +0x818b89: RoomDraw_Rightwards2x2_1to15or32 +0x818b94: RoomDraw_4x4BlocksIn4x4SuperSquare +0x818be0: RoomDraw_DiagonalCeilingTopLeftA +0x818bf4: RoomDraw_DiagonalCeilingBottomLeftA +0x818c0e: RoomDraw_DiagonalCeilingTopRightA +0x818c22: RoomDraw_DiagonalCeilingBottomRightA +0x818c37: RoomDraw_Rightwards2x4spaced4_1to16_BothBG +0x818c4f: RoomDraw_DownwardsDecor4x2spaced4_1to16 +0x818c58: RoomDraw_DiagonalAcute_1to16 +0x818c61: RoomDraw_DiagonalGrave_1to16 +0x818c6a: RoomDraw_DiagonalAcute_1to16_BothBG +0x818cb9: RoomDraw_DiagonalGrave_1to16_BothBG +0x818cc7: RoomDraw_ClosedChestPlatform +0x818d47: RoomDraw_ChestPlatformHorizontalWallWithCorners +0x818d5d: RoomDraw_Rightwards1x2_1to16_plus2 +0x818d80: RoomDraw_1x3_rightwards +0x818d9e: RoomDraw_3x3FloorIn4x4SuperSquare +0x818ddc: RoomDraw_BigHole4x4_1to16 +0x818e67: RoomDraw_DiagonalCeilingTopLeftB +0x818e7b: RoomDraw_DiagonalCeilingBottomLeftB +0x818e95: RoomDraw_DiagonalCeilingTopRightB +0x818ea9: RoomDraw_DiagonalCeilingBottomRightB +0x818ebe: RoomDraw_DownwardsHasEdge1x1_1to16_plus23 +0x818ec3: RoomDraw_DownwardsHasEdge1x1_1to16_plus3 +0x818eeb: RoomDraw_RightwardsHasEdge1x1_1to16_plus23 +0x818ef0: RoomDraw_RightwardsHasEdge1x1_1to16_plus3 +0x818f0c: RoomDraw_DownwardsBigRail3x1_1to16plus5 +0x818f30: Object_Draw_2x3 +0x818f36: RoomDraw_RightwardsBigRail1x3_1to16plus5 +0x818f62: RoomDraw_RightwardsHasEdge1x1_1to16_plus2 +0x818f8a: RoomDraw_DownwardsEdge1x1_1to16 +0x818f9d: RoomDraw_4x4FloorTwoIn4x4SuperSquare +0x818fa2: RoomDraw_4x4FloorOneIn4x4SuperSquare +0x818fa5: Object_Draw4x4_Size1to4 +0x818fbc: RoomDraw_Nothing_D +0x818fbd: RoomDraw_RightwardsTopCorners1x2_1to16_plus13 +0x819001: RoomDraw_RightwardsBottomCorners1x2_1to16_plus13 +0x819045: RoomDraw_DownwardsLeftCorners2x1_1to16_plus12 +0x81908f: RoomDraw_DownwardsRightCorners2x1_1to16_plus12 +0x8190d9: RoomDraw_RightwardsEdge1x1_1to16plus7 +0x8190e2: RoomDraw_DownwardsEdge1x1_1to16plus7 +0x8190f8: RoomDraw_Nothing_A +0x8190f9: RoomDraw_DownwardsFloor4x4_1to16 +0x819111: RoomDraw_Rightwards4x4_1to16 +0x819120: RoomDraw_Downwards1x1Solid_1to16_plus3 +0x819136: RoomDraw_Rightwards1x1Solid_1to16_plus3 +0x81913f: RoomDraw_DoorSwitcherer +0x81918f: RoomDraw_Nothing_E +0x819190: RoomDraw_MovingWallWest +0x819216: RoomDraw_ChestPlatformCorner +0x81921c: RoomDraw_MovingWallEast +0x819298: RoomDraw_CheckIfWallIsMoved +0x8192d1: MovingWall_FillReplacementBuffer +0x8192fb: RoomDraw_RightwardsDecor4x4spaced2_1to16 +0x81930e: RoomDraw_DownwardsDecor4x4spaced2_1to16 +0x819323: RoomDraw_RightwardsStatue2x3spaced2_1to16 +0x819338: RoomDraw_RightwardsBlock2x2spaced2_1to16 +0x819347: RoomDraw_DownwardsBlock2x2spaced2_1to16 +0x819357: RoomDraw_DownwardsPillar2x4spaced2_1to16 +0x81936f: RoomDraw_RightwardsPillar2x4spaced4_1to16 +0x819387: RoomDraw_RightwardsDecor4x3spaced4_1to16 +0x81939f: RoomDraw_DownwardsDecor3x4spaced4_1to16 +0x8193b7: RoomDraw_RightwardsDoubled2x2spaced2_1to16 +0x8193dc: RoomDraw_TableRock4x4_1to16 +0x8193f7: Object_Table_Helper +0x8193ff: Object_Table_Helper_ +0x819429: RoomDraw_Spike2x2In4x4SuperSquare +0x819446: RoomDraw_DownwardsDecor2x2spaced12_1to16 +0x819456: RoomDraw_RightwardsDecor2x2spaced12_1to16 +0x819466: RoomDraw_Waterfall47 +0x819488: RoomDraw_Waterfall48 +0x8194b4: RoomDraw_RightwardsFloorTile4x2_1to16 +0x8194bd: RoomDraw_RightwardsBar4x3_1to16 +0x8194df: RoomDraw_RightwardsShelf4x4_1to16 +0x819501: RoomDraw_WaterOverlayA8x8_1to16 +0x8195a0: DrawWaterThing +0x8195ef: RoomDraw_WaterOverlayB8x8_1to16 +0x8196dc: RoomDraw_RightwardsLine1x1_1to16plus1 +0x8196e4: RoomDraw_DownwardsLine1x1_1to16plus1 +0x8196f9: RoomDraw_RightwardsDecor4x2spaced8_1to16 +0x819702: RoomDraw_DownwardsDecor2x4spaced8_1to16 +0x81971a: RoomDraw_Nothing_C +0x81971b: RoomDraw_DownwardsDecor3x4spaced2_1to16 +0x819733: RoomDraw_OpenChestPlatform +0x81975c: Object_Draw_ChestPlatform_Helper +0x8197b5: RoomDraw_DownwardsBar2x5_1to16 +0x8197dc: RoomDraw_Weird2x4_1_to_16 +0x8197ed: RoomDraw_4x4 +0x8197f0: RoomDraw_Object_Nx4 +0x819813: RoomDraw_4x4Corner_BothBG +0x819819: Object_DrawNx4_BothBgs +0x819854: RoomDraw_WeirdCornerBottom_BothBG +0x81985c: RoomDraw_WeirdCornerTop_BothBG +0x819892: RoomDraw_LitTorch +0x819895: RoomDraw_Rightwards2x2 +0x8198ae: RoomDraw_BigKeyLock +0x8198d0: RoomDraw_Chest +0x8199b8: Object_Chest_startsOpen +0x8199bb: RoomDraw_BigChest +0x8199e6: RoomDraw_TableRock4x3 +0x8199ec: RoomDraw_SolidWallDecor3x4 +0x8199f2: RoomDraw_BigChest_opened +0x819a00: RoomDraw_OpenBigChest +0x819a06: RoomDraw_BigWallDecor +0x819a0c: RoomDraw_Utility6x3 +0x819a12: RoomDraw_MagicBatAltar +0x819a66: RoomDraw_SmithyFurnace +0x819a6f: RoomDraw_EnabledStarSwitch +0x819a8d: Object_StarTile_off +0x819a90: RoomDraw_VerticalTurtleRockPipe +0x819aa3: RoomDraw_HorizontalTurtleRockPipe +0x819aa9: RoomDraw_RupeeFloor +0x819aee: RoomDraw_Bed4x5 +0x819b18: UNREACHABLE_019B18 +0x819b1e: RoomDraw_WaterHopStairs_A +0x819b48: RoomDraw_PortraitOfMario +0x819b50: RoomDraw_DrawRightwards3x6 +0x819b56: RoomDraw_SanctuaryWall +0x819bd9: RoomDraw_ChestPlatformVerticalWall +0x819bf8: RoomDraw_DamFloodGate +0x819c3b: RoomDraw_SomariaLine_increment_count +0x819c3e: Object_Draw1x1 +0x819c44: RoomDraw_PrisonCell +0x819cc6: RoomDraw_RightwardsCannonHole4x3_1to16 +0x819ceb: RoomDraw_DownwardsCannonHole3x4_1to16 +0x819d04: Object_Draw_3x2 +0x819d29: RoomDraw_EmptyWaterFace +0x819d5d: Object_01_DrawWaterFace +0x819d67: Object_Draw_4x7 +0x819d6c: RoomDraw_TableBowl +0x819d6f: RoomDraw_WaterHoldingObject +0x819d96: RoomDraw_KholdstareShell +0x819da2: RoomDraw_SomeBigDecors +0x819dd9: RoomDraw_TrinexxShell +0x819de5: RoomDraw_LampCones +0x819e06: RoomDraw_SingleLampCone +0x819e30: RoomDraw_AgahnimsAltar +0x819ea3: RoomDraw_AgahnimsWindows +0x81a095: RoomDraw_FortuneTellerRoom +0x81a194: RoomDraw_Utility3x5 +0x81a1d1: RoomDraw_VitreousGooGraphics +0x81a255: RoomDraw_BG2MaskFull +0x81a25d: RoomDraw_AutoStairs_North_MultiLayer_A +0x81a26d: Object_InterStaircase2 +0x81a2c1: AutoStairsNorthMergedStart +0x81a2c7: RoomDraw_AutoStairs_North_MergedLayer_A +0x81a2df: RoomDraw_AutoStairs_North_MergedLayer_B +0x81a30c: RoomDraw_AutoStairs_South_MultiLayer_A +0x81a31c: Object_Stair_Type2 +0x81a36a: South_MergedStairs_BecomeMultiC +0x81a36e: RoomDraw_AutoStairs_South_MultiLayer_C +0x81a380: RoomDraw_AutoStairs_South_MergedLayer +0x81a3ae: RoomDraw_WaterHopStairs_B +0x81a41b: RoomDraw_InterRoomFatStairsUp +0x81a458: RoomDraw_InterRoomFatStairsDown_A +0x81a486: RoomDraw_InterRoomFatStairsDown_B +0x81a4b4: RoomDraw_SpiralStairsGoingUpUpper +0x81a4f5: RoomDraw_SpiralStairsGoingUpLower +0x81a533: RoomDraw_SpiralStairsGoingDownUpper +0x81a563: Object_SpiralStaircase1 +0x81a584: RoomDraw_SpiralStairsGoingDownLower +0x81a5d2: RoomDraw_StraightInterroomStairsGoingUpNorthUpper +0x81a5f4: Object_1F_Staircase +0x81a607: Object_20_Staircase +0x81a626: Object_Staircase_Down_Down +0x81a664: RoomDraw_StraightInterroomStairsGoingUpNorthLower +0x81a695: RoomDraw_StraightInterroomStairsGoingDownNorthLower +0x81a6b5: StraightInterroomStairsLowerMain +0x81a71c: RoomDraw_StraightInterroomStairsGoingUpSouthLower +0x81a74a: RoomDraw_StraightInterroomStairsGoingDownSouthLower +0x81a767: StraightInterroomStairsLower_continue +0x81a7a3: RoomDraw_ArcheryGameTargetDoor +0x81a7b6: RoomDraw_LightBeamOnFloor +0x81a7d3: RoomDraw_BigLightBeamOnFloor +0x81a7dc: Object_Draw8x8 +0x81a7f0: RoomDraw_GanonTriforceFloorDecor +0x81a809: RoomDraw_VitreousGooDamage +0x81a81c: RoomDraw_Door_North +0x81a892: Door_Up_StairMaskLocked +0x81a8fa: Door_PrioritizeCurDoor +0x81a90f: RoomDraw_NormalRangedDoors_North +0x81a932: RoomDraw_OneSidedShutters_North +0x81a984: RoomDraw_Door_South +0x81aa66: RoomDraw_CheckIfLowerLayerDoors_Y +0x81aa80: RoomDraw_OneSidedShutters_South +0x81aad7: RoomDraw_Door_West +0x81ab1f: RoomDraw_NormalRangedDoors_West +0x81ab78: RoomDraw_DrawUnreachableDoorSwitcher +0x81ab99: RoomDraw_Door_East +0x81abc8: RoomDraw_NormalRangedDoors_East +0x81abe2: RoomDraw_OneSidedShutters_East +0x81ac1a: DrawUnusedDoorSwitchObject +0x81ac3b: RoomDraw_NorthCurtainDoor +0x81ac5b: ExplodingWallNotOpen +0x81ac70: RoomDraw_Door_ExplodingWall +0x81ace4: RoomDraw_ExplodingWallSegment +0x81ad25: RoomDraw_ExplodingWallColumn +0x81ad41: RoomDraw_HighRangeDoor_North +0x81add4: RoomDraw_OneSidedLowerShutters_South +0x81ae40: RoomDraw_HighRangeDoor_West +0x81aef0: RoomDraw_OneSidedLowerShutters_East +0x81af7f: RoomDraw_MakeDoorHighPriorityLowerLayer_North +0x81af8b: RoomDraw_MakeDoorHighPriority_North +0x81afc8: RoomDraw_MakeDoorHighPriorityLowerLayer_South +0x81afd4: RoomDraw_MakeDoorHighPriority_South +0x81b00d: RoomDraw_MakeDoorHighPriorityLowerLayer_West +0x81b017: RoomDraw_MakeDoorHighPriority_West +0x81b050: RoomDraw_MakeDoorHighPriorityLowerLayer_East +0x81b05c: RoomDraw_MakeDoorHighPriority_East +0x81b092: RoomDraw_MarkDungeonToggleDoor +0x81b09f: RoomDraw_MarkLayerToggleDoor +0x81b0ac: RoomDraw_GetObjectSize_1to16 +0x81b0af: Object_SizeAtoAplus15 +0x81b0be: RoomDraw_GetObjectSize_1to15or26 +0x81b0cc: RoomDraw_GetObjectSize_1to15or32 +0x81b0da: RoomDraw_FlagDoorsAndGetFinalType +0x81b18f: return_0 +0x81b191: RoomDraw_SmallRailCorner +0x81b19e: UNREACHABLE_01B19E +0x81b1a4: RoomDraw_MakeDoorPartsHighPriority_Y +0x81b1e1: UNREACHABLE_01B1E1 +0x81b1e7: RoomDraw_MakeDoorPartsHighPriority_X +0x81b220: RoomDraw_Downwards4x2VariableSpacing +0x81b254: UNREACHABLE_01B254 +0x81b264: UNREACHABLE_01B264 +0x81b279: RoomDraw_DrawObject2x2and1 +0x81b293: RoomDraw_DrawDiagonalGrave +0x81b2a1: RoomDraw_DrawDiagonalAcute +0x81b2af: RoomDraw_Object_2x2_downwards +0x81b2ca: RoomDraw_LineOf8x8_advance_and_use_B2_for_count +0x81b2ce: Object_FillOneRowOfWidth +0x81b2d0: Object_FillOneRowOfA +0x81b2e1: RoomDraw_RightwardShelfEnd +0x81b2f6: RoomDraw_RightwardBarSegment +0x81b306: RoomDraw_WeirdGloveRequiredPot +0x81b30b: RoomDraw_WeirdUglyPot +0x81b310: RoomDraw_BigGrayRock +0x81b33a: DrawBigGraySegment +0x81b376: RoomDraw_RightwardsFakePots2x2_1to16 +0x81b381: RoomDraw_DownwardsFakePots2x2_1to16 +0x81b395: RoomDraw_SinglePot +0x81b3e1: RoomDraw_BombableFloor +0x81b429: Object_BombableFloor_Helper +0x81b474: RoomDraw_RightwardsHammerPegs2x2_1to16 +0x81b47f: RoomDraw_DownwardsHammerPegs2x2_1to16 +0x81b493: RoomDraw_HammerPegSingle +0x81b4d6: DrawObjects_PushableBlock +0x81b509: DrawObjects_LightableTorch +0x81b560: kDungeonHeader_SpecialAdjustment +0x81b564: Dungeon_LoadHeader +0x81b759: Dungeon_CheckAdjacentRoomsForOpenDoors +0x81b7ef: Dungeon_LoadAdjacentRoomDoors +0x81b83e: Dungeon_ApplyRoomOverlay +0x81b8b4: Dungeon_LoadAttribute_Selectable +0x81b8bf: Dungeon_LoadAttributeTable +0x81b8e3: Dungeon_LoadBasicAttribute +0x81b8ec: Dungeon_LoadBasicAttr_partial +0x81b8f3: Dungeon_LoadBasicAttribute_full +0x81b967: Dungeon_LoadObjectAttribute +0x81bddb: Dungeon_SetChestAttributes +0x81be17: Dungeon_LoadDoorAttribute +0x81be35: Dungeon_LoadSingleDoorAttribute +0x81bfc1: Door_LoadBlastWallAttr +0x81c1ba: ChangeDoorToSwitch +0x81c21c: Dungeon_InitializePegAttribute +0x81c22a: Dungeon_FlipCrystalPegAttribute +0x81c27d: kDungeon_TagRoutines +0x81c2fd: Dungeon_HandleRoomTags +0x81c31f: kTeleportPitLevel1 +0x81c322: kTeleportPitLevel2 +0x81c325: RoomTag_DirtyExit +0x81c326: return_loc_81C326 +0x81c328: Dung_TagRoutine_0x00 +0x81c329: Dungeon_DetectStaircase +0x81c432: RoomTag_NorthWestTrigger +0x81c438: Dung_TagRoutine_0x2A +0x81c43e: Dung_TagRoutine_0x2B +0x81c444: Dung_TagRoutine_0x2C +0x81c44a: Dung_TagRoutine_0x2D +0x81c450: Dung_TagRoutine_0x2E +0x81c456: Dung_TagRoutine_0x2F +0x81c45c: Dung_TagRoutine_0x30 +0x81c461: RoomTag_QuadrantTrigger +0x81c49e: Dung_TagRoutine_TrapdoorsUp +0x81c4bf: RoomTag_RoomTrigger +0x81c4db: RoomTag_RekillableBoss +0x81c4e7: RoomTag_RoomTrigger_BlockDoor +0x81c508: RoomTag_PrizeTriggerDoorDoor +0x81c541: RoomTag_SwitchTrigger_HoldDoor +0x81c599: RoomTag_SwitchTrigger_ToggleDoor +0x81c5cf: PushPressurePlate +0x81c629: RoomTag_TorchPuzzleDoor +0x81c666: kBlastWall_Tab0 +0x81c670: kBlastWall_Tab1 +0x81c67a: RoomTag_Switch_ExplodingWall +0x81c685: RoomTag_PullSwitchExplodingWall +0x81c68c: Dung_TagRoutine_BlastWallStuff +0x81c6fc: kBossFinishedFallingItem +0x81c709: RoomTag_GetHeartForPrize +0x81c74e: RoomTag_Agahnim +0x81c767: RoomTag_GanonDoor +0x81c7a2: RoomTag_KillRoomBlock +0x81c7c2: RoomTag_PushBlockForChest +0x81c7cc: RoomTag_TriggerChest +0x81c7d8: RoomTag_OperateChestReveal +0x81c8ae: RoomTag_TorchPuzzleChest +0x81c8d4: RoomTag_MovingWall_East +0x81c961: kMovingWall_Xoff +0x81c965: kMovingWall_Yoff +0x81c969: RoomTag_MovingWallShakeItUp +0x81c98b: RoomTag_MovingWall_West +0x81ca17: RoomTag_MovingWallTorchesCheck +0x81ca66: MovingWall_MoveALittle +0x81ca75: RoomTag_AdvanceGiganticWall +0x81ca94: RoomTag_WaterOff +0x81cb1a: RoomTag_WaterOn +0x81cb49: RoomTag_WaterGate +0x81cbff: Dung_TagRoutine_0x1B +0x81cc00: RoomTag_Holes0 +0x81cc04: Dung_TagRoutine_0x23 +0x81cc08: Dung_TagRoutine_0x34 +0x81cc0c: Dung_TagRoutine_0x35 +0x81cc10: Dung_TagRoutine_0x36 +0x81cc14: Dung_TagRoutine_0x37 +0x81cc18: Dung_TagRoutine_0x39 +0x81cc1c: Dung_TagRoutine_0x3A +0x81cc1e: Dung_TagRoutine_Func2 +0x81cc5b: RoomTag_ChestHoles0 +0x81cc62: Dung_TagRoutine_0x3B +0x81cc89: RoomTag_Holes2 +0x81cc95: RoomTag_OperateWaterFlooring +0x81cd39: RoomTag_MaybeCheckShutters +0x81cda0: return_false_loc_81CDA0 +0x81cda5: RoomTag_GetTilemapCoords +0x81cdcc: RoomTag_CheckForPressedSwitch +0x81ce64: kSrcTiles1 +0x81ce6c: kOpenDoorPanning +0x81ce70: Dungeon_ProcessTorchesAndDoors +0x81d1f4: Bomb_CheckForDestructibles +0x81d2e8: DrawDoorOpening_Step1 +0x81d311: DrawShutterDoorSteps +0x81d33a: DrawEyeWatchDoor +0x81d365: IndexAndClearCurtainDoor +0x81d373: Door_BlastWallExploding_Draw +0x81d38f: OperateShutterDoors +0x81d469: OpenCrackedDoor +0x81d476: UnlockKeyDoor_Main +0x81d48d: step12 +0x81d510: Dungeon_LoadSingleDoorTileAttribute_from_wram_index +0x81d51c: Dungeon_LoadToggleDoorAttr_OtherEntry +0x81d51f: Dungeon_LoadSingleDoorTileAttribute +0x81d5aa: DrawCompletelyOpenDoor +0x81d6c1: Dungeon_ClearAwayExplodingWall +0x81d748: Dungeon_CheckForAndIDLiftableTile +0x81d7c0: kPushBlockMoveDistances +0x81d7c8: PushBlock_Main +0x81d81b: Dungeon_PushBlock_Handler +0x81d828: RoomDraw_16x16Single +0x81d87f: Dungeon_Store2x2Attr +0x81d8d4: PushBlock_CheckForPit +0x81d98e: RoomDraw_16x16SingleSingleTileStripe +0x81d9ba: kDungeon_QueryIfTileLiftable_y +0x81d9c2: kDungeon_QueryIfTileLiftable_x +0x81d9e2: kDungeon_QueryIfTileLiftable_rv +0x81d9ec: Dungeon_LiftAndReplaceLiftable +0x81da71: ThievesAttic_DrawLightenedHole +0x81dab6: FAIL_01DAB4 +0x81dabb: HandleItemTileAction_Dungeon +0x81db41: ManipBlock_Something +0x81db69: kDungeonSecretsPtrArray +0x81e6b2: RevealPotItem +0x81e795: kPrepSpriteInducedDma_Srcs +0x81e7a9: Dungeon_UpdateTileMapWithCommonTile +0x81e7df: Dungeon_PrepSpriteInducedDma +0x81e899: Dungeon_GetRelativeVramAddr_2 +0x81e8bd: Dungeon_DeleteRupeeTile +0x81e94a: Dungeon_GetRelativeVramAddr +0x81e96e: chestinfo +0x81eb66: OpenChestForItem +0x81ed05: OpenBigChest +0x81ed89: OpenMiniGameChestFail +0x81eda3: kDungeon_MinigameChestPrizes1 +0x81edab: OpenMiniGameChest +0x81eec5: Dungeon_OpenMiniGameChest_prizeExternallyDetermined +0x81eed7: kDungeon_RupeeChestMinigamePrizes +0x81eef7: OpenMiniGameChest_HighStake +0x81eeff: Dungeon_GetRupeeChestMinigamePrize_lowStakes +0x81ef0f: RoomTag_BuildChestStripes +0x81ef34: kTurnOffWater_Tab0 +0x81ef54: IncrementallyDrainSwampPool +0x81ef93: Dungeon_SetAttrForActivatedWaterOff +0x81efec: DeleteSwampPoolWaterOverlay +0x81f046: Dungeon_FloodSwampWater_PrepTileMap +0x81f063: kTurnOnWater_Tab2 +0x81f06b: kTurnOnWater_Tab1 +0x81f073: kTurnOnWater_Tab0 +0x81f093: Dungeon_FloodSwampWater +0x81f09b: Dungeon_FloodSwampWater_VomitWater +0x81f0c9: Dungeon_AdjustWaterVomit +0x81f16d: Dungeon_FloodSwampWater_SpillToFloor +0x81f18c: Dungeon_TurnOnWaterLong_Func10 +0x81f1e1: Dungeon_FloodSwampWater_RiseInLevel +0x81f237: Dungeon_SetAttrForActivatedWater +0x81f2e8: kWatergateSrcs1 +0x81f2f2: kWatergateFuncs +0x81f2fe: Dungeon_FloodDam +0x81f309: EXIT_01F307 +0x81f30c: FloodDam_Expand +0x81f3a7: FloodDam_PrepTiles_init +0x81f3aa: Watergate_Main_State1 +0x81f3bd: FloodDam_Fill +0x81f3db: Dungeon_LightTorchFail +0x81f3ec: Dungeon_LightTorch +0x81f3fd: Dungeon_LightTorch_notGanonRoom +0x81f496: Ganon_ExtinguishTorch_adjust_translucency +0x81f4a1: Ganon_ExtinguishTorch +0x81f4a6: Dungeon_ExtinguishTorch +0x81f528: SpiralStairs_MakeNearbyWallsHighPriority_Entering +0x81f585: SpiralStairs_MakeNearbyWallsLowPriority +0x81f5d1: kOpenGanonDoor_Tab +0x81f5da: RoomDraw_OpenTriforceDoor +0x81f6b4: UNREACHABLE_01F6B2 +0x81f746: RoomDraw_AdjustTorchLightingChange +0x81f762: Dungeon_PrepOverlayDma_nextPrep_Start +0x81f764: Dungeon_PrepOverlayDma_nextPrep +0x81f77c: Dungeon_PrepOverlayDma_watergate +0x81f7f1: kBlastWall_Tab2 +0x81f811: ClearAndStripeExplodingWall +0x81f908: UNREACHABLE_01F906 +0x81f967: Dungeon_DrawRoomOverlay +0x81f980: Dungeon_DrawOverlayOne +0x81fa4a: GetDoorDrawDataIndex_North_clean_door_index +0x81fa54: DoorDoorStep1_North +0x81faa0: GetDoorDrawDataIndex_North +0x81fad7: DrawDoorToTileMap_North +0x81fae3: Object_Draw_DoorUp_4x3 +0x81fb0b: GetDoorDrawDataIndex_South_clean_door_index +0x81fb15: DoorDoorStep1_South +0x81fb61: GetDoorDrawDataIndex_South +0x81fb8e: DrawDoorToTileMap_South +0x81fb9b: Object_Draw_DoorDown_4x3 +0x81fbc2: GetDoorDrawDataIndex_West_clean_door_index +0x81fbcc: DoorDoorStep1_West +0x81fc18: GetDoorDrawDataIndex_West +0x81fc45: DrawDoorToTileMap_West +0x81fc80: GetDoorDrawDataIndex_East_clean_door_index +0x81fc8a: DoorDoorStep1_East +0x81fcd6: GetDoorDrawDataIndex_East +0x81fd03: DrawDoorToTileMap_East +0x81fd3e: ClearDoorCurtainsFromTileMap +0x81fd79: GetDoorGraphicsIndex +0x81fd92: ClearExplodingWallFromTileMap +0x81fddb: ClearExplodingWallFromTileMap_ClearOnePair +0x81fe41: Dungeon_DrawRoomOverlay_Apply +0x81feb0: ApplyGrayscaleFixed_Incremental +0x81fec1: Dungeon_ApproachFixedColor_variable +0x81fed2: LinkZap_HandleMosaic +0x81fef0: Player_SetCustomMosaicLevel +0x81ff05: Dungeon_HandleLayerChange +0x81ff28: CacheCameraProperties +0x81ffb6: CheckAbilityToSwim +0x81ffd9: TakeDamageFromPit +0x828000: Intro_SetupScreen +0x828054: Intro_ValidateSram +0x828116: Intro_LoadTextPointersAndPalettes +0x82811e: kDungAnimatedTiles +0x828136: Module05_LoadFile +0x828208: Module_LoadGame_indoors +0x82821e: Module_PreDungeon +0x82838c: Module_PreDungeon_setAmbientSfx +0x8283b5: Dungeon_InitAndCacheVars2_ +0x8283b9: kModule_PreOverworld_Callb +0x8283bf: Module08_OverworldLoad +0x8283c7: PreOverworld_LoadProperties +0x82854c: LoadOWMusicIfNeeded +0x82856a: AdjustLinkBunnyStatus +0x828570: ForceNonbunnyStatus +0x828583: kLocationMenuStartPos +0x828586: Module1B_SpawnSelect +0x8285ba: Credits_LoadScene_Overworld +0x8285c2: kEnding_Tab1 +0x8285e2: kEnding_SpritePack +0x8285f3: kEnding_SpritePal +0x828604: Credits_LoadScene_Overworld_PrepGFX +0x828697: Credits_LoadScene_Overworld_Overlay +0x8286a5: Credits_LoadScene_Overworld_LoadMap +0x8286b3: Credits_OperateScrollingAndTileMap +0x8286c0: Credits_LoadCoolBackground +0x8286fd: Credits_LoadScene_Dungeon +0x82876c: kDungeonSubmodules +0x8287a2: Module07_Dungeon +0x82885e: Dungeon_TryScreenEdgeTransition +0x8288c1: kLimitDirectionOnOneAxis +0x8288c5: Dungeon_HandleEdgeTransitionMovement +0x8288de: Module07_00_PlayerControl +0x82894c: kSpiralTab1 +0x828954: kBossRooms +0x82896c: kDungeon_IntraRoomTransTable +0x82897c: Module07_01_SubtileTransition +0x828995: DungeonTransition_Subtile_ResetShutters +0x8289b6: DungeonTransition_Subtile_PrepTransition +0x8289d8: DungeonTransition_Subtile_ApplyFilter +0x8289f0: DungeonTransition_Subtile_TriggerShutters +0x828a26: Module07_02_SupertileTransition +0x828a4f: Module07_02_00_InitializeTransition +0x828a5b: Module07_02_01_LoadNextRoom +0x828a87: Dungeon_InterRoomTrans_State3 +0x828aa5: Dungeon_InterRoomTrans_State10 +0x828aaf: Dungeon_SpiralStaircase11 +0x828ab3: Dungeon_InterRoomTrans_notDarkRoom +0x828aba: Dungeon_InterRoomTrans_State9 +0x828ac4: Dungeon_SpiralStaircase12 +0x828ac8: Dungeon_InterRoomTrans_State4 +0x828acf: Dungeon_InterRoomTrans_State12 +0x828aed: Dungeon_Staircase14 +0x828aef: Dungeon_ResetTorchBackgroundAndPlayer +0x828b0c: Dungeon_ResetTorchBackgroundAndPlayerInner +0x828b2e: Dungeon_InterRoomTrans_State7 +0x828b67: DungeonTransition_RunFiltering +0x828b92: Module07_02_FadedFilter +0x828bae: Dungeon_InterRoomTrans_State15 +0x828bd7: Dungeon_PlayMusicIfDefeated +0x828c05: Module07_03_OverlayChange +0x828c0a: Module07_04_UnlockDoor +0x828c0f: Module07_05_ControlShutters +0x828c14: Module07_06_FatInterRoomStairs +0x828c78: Module07_0E_01_HandleMusicAndResetProps +0x828ca9: ResetTransitionPropsAndAdvance_ResetInterface +0x828cac: ResetTransitionPropsAndAdvanceSubmodule +0x828ce2: Dungeon_InitializeRoomFromSpecial +0x828d01: DungeonTransition_FatStairs_RunFade +0x828d10: DungeonTransition_LoadSpriteGFX +0x828d1b: DungeonTransition_AdjustForFatStairScroll +0x828d5f: DungeonTransition_FatStairsEntryCache +0x828d71: ResetThenCacheRoomEntryProperties +0x828d81: CacheRoomEntryProperties +0x828e0f: DungeonTransition_TriggerBGC34UpdateAndAdvance +0x828e1d: DungeonTransition_TriggerBGC56UpdateAndAdvance +0x828e27: Module07_07_FallingTransition +0x828e63: Module07_07_00_HandleMusicAndResetRoom +0x828e80: Module07_07_06_SyncBG1and2 +0x828ea1: Module07_07_0F_FallingFadeIn +0x828ec9: Dungeon_PlayBlipAndCacheQuadrantVisits +0x828ee0: Module07_07_10_LandLinkFromFalling +0x828efa: Module07_07_11_CacheRoomAndSetMusic +0x828f0c: Module07_08_NorthIntraRoomStairs +0x828f35: Module07_08_00_InitStairs +0x828f5f: Module07_08_01_ClimbStairs +0x828f88: Module07_10_SouthIntraRoomStairs +0x828fb1: Module07_10_00_InitStairs +0x828fe1: Module07_10_01_ClimbStairs +0x82900f: Module07_09_OpenCrackedDoor +0x829014: Module07_0A_ChangeBrightness +0x82902d: Module07_0B_DrainSwampPool +0x829032: Dungeon_TurnOffWater_ +0x82904a: Module07_0C_FloodSwampWater +0x82904f: Module07_0D_FloodDam +0x829054: Module07_0E_SpiralStairs +0x829094: Dungeon_DoubleApplyAndIncrementGrayscale +0x8290a1: Module07_0E_02_ApplyFilterIf +0x8290c7: Dungeon_SyncBackgroundsFromSpiralStairs +0x82915b: Dungeon_AdvanceThenSetBossMusicUnorthodox +0x829165: Dungeon_SetBossMusicUnorthodox +0x82919b: Dungeon_SpiralStaircase17 +0x8291b5: Dungeon_SpiralStaircase18 +0x8291c4: Module07_0E_00_InitPriorityAndScreens +0x8291dd: Module07_0E_13_SetRoomAndLayerAndCache +0x82920a: kSpiralStaircaseX +0x829212: kSpiralStaircaseY +0x82921a: RepositionLinkAfterSpiralStairs +0x8292b1: SpiralStairs_MakeNearbyWallsHighPriority_Exiting +0x82931d: Module07_0F_LandingWipe +0x82932d: Module07_0F_00_InitSpotlight +0x829334: Module07_0F_01_OperateSpotlight +0x829357: Module07_11_StraightInterroomStairs +0x8293bb: Module07_11_00_PrepAndReset +0x8293ed: Module07_11_01_FadeOut +0x829403: Module07_11_02_LoadAndPrepRoom +0x829422: Module07_11_03_FilterAndLoadBGChars +0x82942a: Module07_11_04_FilterDoBGAndResetSprites +0x82943b: Module07_11_0B_PrepDestination +0x8294e0: Module07_11_09_LoadSpriteGraphics +0x8294ed: Module07_11_19_SetSongAndFilter +0x829513: endif_1 +0x829518: Module07_11_11_KeepSliding +0x829520: Module07_14_RecoverFromFall +0x82952a: Module07_14_00_ScrollCamera +0x829583: RecoverPositionAfterDrowning +0x82967a: Module07_15_WarpPad +0x8296ac: Module07_15_01_ApplyMosaicAndFilter +0x8296ba: Module07_15_04_SyncRoomPropsAndBuildOverlay +0x8296ec: Module07_15_0E_FadeInFromWarp +0x82970f: Module07_15_0F_FinalizeAndCacheEntry +0x82972a: Module07_16_UpdatePegs +0x829739: Module07_16_UpdatePegs_Step1 +0x82974d: Module07_16_UpdatePegs_Step2 +0x829761: Module07_16_UpdatePegs_Step3 +0x829773: Dungeon_UpdatePegGFXBuffer +0x8297a9: Module07_16_UpdatePegs_FinishUp +0x8297b2: Dungeon_OrangeBlueBarrierUpload_C_ +0x8297c8: Module07_17_PressurePlate +0x8297fa: kCrystal_Tab0 +0x82980a: Module07_18_RescuedMaiden +0x829826: PrepareForCrystalCutscene +0x829888: BuildCrystalCutsceneTilemap +0x8298e7: StartCrystalCutscene +0x8298f7: Module07_19_MirrorFade +0x829916: Module07_1A_RoomDraw_OpenTriforceDoor_bounce +0x82991b: Module0C_Unused +0x829922: Module0C_RunSubmodule +0x82992e: Module0C_RestoreModule +0x829938: Module0D_Unused +0x829951: Module0D_RunSubmodule +0x82995b: Module0D_RestoreModule +0x82997e: kModule_CloseSpotlight_Funcs +0x829982: Module0F_SpotlightClose +0x8299ca: Dungeon_PrepExitWithSpotlight +0x829a19: Spotlight_ConfigureTableAndControl +0x829a37: OpenSpotlight_Next2 +0x829ad3: kModule_OpenSpotlight_Funcs +0x829ad7: Module10_SpotlightOpen +0x829ae6: Module10_00_OpenIris +0x829af9: Module11_DungeonFallingEntrance +0x829b01: Module_11_00_SetSongAndInit +0x829b1c: Module11_02_LoadEntrance +0x829bd7: Dungeon_LoadSongBankIfNeeded +0x829c0f: Module11_04_FadeAndLoadQuadrants +0x829c1c: HoleToDungeon_5 +0x829c3e: kModule_BossVictory +0x829c4a: Module13_BossVictory_Pendant +0x829c59: BossVictory_Heal +0x829c93: Dungeon_StartVictorySpin +0x829cad: Dungeon_RunVictorySpin +0x829cd1: Dungeon_CloseVictorySpin +0x829cfc: Module15_MirrorWarpFromAga +0x829d16: Module15_00_Initialize +0x829d22: Module15_01_SetTheScene +0x829d5d: Mirror_Func5 +0x829db6: Mirror_Func6 +0x829dc2: Mirror_Func7 +0x829df5: Mirror_Func8 +0x829e06: Module15_02_RunMirrorWarp_Part1 +0x829e0f: Module15_03_RunMirrorWarp_Part2 +0x829e15: Mirror_Func4 +0x829e22: Mirror_Func12 +0x829e5f: SetTargetOverworldWarpToPyramid +0x829e6e: ResetAncillaAndCutscene +0x829e8a: Module16_BossVictory_Crystal +0x829e99: EXIT_029D90 +0x829e9a: Module16_04_FadeAndEnd +0x829edc: Module18_GanonEmerges +0x829f2f: GanonEmerges_GetBirdForPursuit +0x829f42: GanonEmerges_PrepForPyramidLocation +0x829f5e: GanonEmerges_FadeOutDungeonScreen +0x829f76: GanonEmerges_LOadPyramidArea +0x829f8b: GanonEmerges_LoadAmbientOverlay +0x829f94: GanonEmerges_BrightenScreenThenSpawnBat +0x829fc0: GanonEmerges_DelayForBatSmashIntoPyramid +0x829fc1: GanonEmerges_DelayPlayerDropOff +0x829fc9: GanonEmerges_DropOffPlayerAtPyramid +0x829fce: kModule_TriforceRoom +0x829fec: Module19_TriforceRoom +0x82a021: Module19_00_ResetAndInit +0x82a02f: Module19_01_MosaicAndPalette +0x82a035: Module19_02_LoadMusicAndScreen +0x82a065: Module19_03_PrepTileSetsPalette +0x82a089: Module19_04_LoadAndSongAndAdvance +0x82a0cd: Module19_05_WalkLinkIn +0x82a0e4: Module19_06_MosaicFadeIn +0x82a100: Module19_07_PrepMessage +0x82a121: Module19_09_TriforceSpeak +0x82a137: Module19_TriforceExpansionControl +0x82a151: Module19_0B_ApproachTriforce +0x82a164: Module19_0C_HoldTriforce +0x82a173: Module19_0D_FadeToWhite +0x82a186: Module19_0E_AdvanceToCredits +0x82a1a4: kDungeonCrystalPendantBit +0x82a1b1: Mirror_SaveRoomData +0x82a1c7: SaveDungeonKeys +0x82a1e5: kLitTorchesColorPlus +0x82a1e9: Dungeon_HandleTranslucencyAndPalette +0x82a281: UnusedInterfacePaletteRecovery +0x82a29b: PaletteFilter_bounce +0x82a2a0: PaletteFilter_doFiltering_ +0x82a2a5: Dungeon_Teleport0_ +0x82a2a9: Palette_Func1_ +0x82a2ad: UNUSED_sub_82A2AD +0x82a2b1: UNREACHABLE_02A1A8 +0x82a2f0: Dungeon_AdjustAfterSpiralStairs +0x82a37c: Dungeon_AdjustForTeleportDoors +0x82a40d: kModule_Overworld_Submodules +0x82a46d: kOverworld_DrawBadWeather_X +0x82a471: kOverworld_DrawBadWeather_Y +0x82a475: Module09_Overworld +0x82a4cd: OverworldOverlay_HandleRain +0x82a53c: Module09_00_PlayerControl +0x82a5ec: kOverworldAreaHeads +0x82a62c: kSwitchAreaTab0 +0x82a634: kSwitchAreaTab1 +0x82a834: kSwitchAreaTab3 +0x82a83c: kOverworld_Func6B_Tab4 +0x82a844: kOverworld_IsSmaller +0x82a884: kOverworld_CoordMask +0x82a8c4: kOverworld_OffsetBaseY +0x82a944: kOverworld_OffsetBaseX +0x82a9c4: OverworldHandleTransitions +0x82ab08: Overworld_LoadGFXAndScreenSize +0x82ab7b: ScrollAndCheckForSOWExit +0x82ab88: Module09_LoadAuxGFX +0x82abbc: Overworld_FinishTransGfx +0x82abc6: Module09_LoadNewMapAndGFX +0x82abda: Overworld_RunScrollTransition +0x82abed: Module09_LoadNewSprites +0x82ac27: Overworld_StartScrollTransition +0x82ac3a: Overworld_EaseOffScrollTransition +0x82ac8f: Module09_0A_WalkFromExiting_FacingDown +0x82acc2: Module09_0B_WalkFromExiting_FacingUp +0x82acda: kDoorAnimTiles +0x82ad4a: Module09_09_OpenBigDoorFromExiting +0x82ad5c: Overworld_DoMapUpdate32x32_B +0x82ad63: UNREACHABLE_02AC62 +0x82ad6c: Module09_0C_OpenBigDoor +0x82ad7b: Overworld_DoMapUpdate32x32_conditional +0x82ad85: Overworld_DoMapUpdate32x32 +0x82ad87: DoorAnim_DoWork_ +0x82ae5a: DoorAnim_OnlyIncrement +0x82ae5e: Overworld_StartMosaicTransition +0x82ae6d: Overworld_FuncD_State0 +0x82ae86: OverworldMosaicTransition_HandleScreensAndLoadShroom +0x82aece: UNUSED_Overworld_Func1D +0x82aedd: Module09_1D_02_FBlankAndEnterModule0A +0x82aeea: UNUSED_Overworld_Func1E +0x82aef9: Module09_1E_02_FBlankAndLoadSPOW +0x82af0b: Overworld_LoadOverlays +0x82af19: PreOverworld_LoadOverlays +0x82af1e: Overworld_LoadOverlays2 +0x82b0d2: Module09_FadeBackInFromMosaic +0x82b0f3: OverworldMosaicTransition_RecoverDestinationPalettes +0x82b105: Overworld_Func16_State2 +0x82b150: Overworld_Func1C +0x82b171: OverworldMosaicTransition_LoadSpriteGraphicsAndSetMosaic +0x82b195: OverworldMosaicTransition_FilterAndLoadGraphics +0x82b19e: Module09_1C_02_HandleMusic +0x82b1bb: Overworld_Func22 +0x82b1c8: Overworld_Func18 +0x82b1df: Overworld_Func19 +0x82b1f0: Overworld_LoadAmbientOverlayAndMapData_ +0x82b1f4: Overworld_ReloadSubscreenOverlayAndAdvance +0x82b1fa: Module09_MirrorWarp +0x82b1ff: Overworld_MirrorWarp_ +0x82b217: MirrorWarp_Initialize +0x82b260: MirrorWarp_FinalizeAndLoadDestination +0x82b2d4: MirrorWarp_HandleCastlePyramidSubscreen +0x82b2e6: Overworld_DrawScreenAtCurrentMirrorPosition +0x82b334: MirrorWarp_LoadSpritesAndColors +0x82b40a: Overworld_Func2B +0x82b40e: Overworld_WeathervaneExplosion +0x82b40f: Module09_2E_Whirlpool +0x82b432: Overworld_Whirlpool_Case0 +0x82b44c: Module09_2E_01_MoreBlue +0x82b451: Overworld_Whirlpool_Case2 +0x82b456: Overworld_Whirlpool_Case11 +0x82b45f: Overworld_Whirlpool_Case10 +0x82b46e: Module09_2E_03_FindDestination +0x82b48a: Overworld_Whirlpool_Case4_6 +0x82b490: Module09_2E_05_LoadDestinationMap +0x82b49a: Module09_2E_07_LoadAuxGraphics +0x82b49f: Module09_2E_08_TriggerTilemapUpdate +0x82b4ae: Module09_2E_09_LoadPalettes +0x82b4ef: Overworld_Whirlpool_Case12 +0x82b521: Overworld_Func2F +0x82b528: Module09_2A_RecoverFromDrowning +0x82b532: Module09_2A_00_ScrollToLand +0x82b5ac: kLayoutQuadrantFlags +0x82b5cc: kQuadrantVisitingFlags +0x82b5dc: Dungeon_AdjustForRoomLayout +0x82b62e: HandleEdgeTransitionMovementEast_RightBy8 +0x82b63a: Dungeon_StartInterRoomTrans_Right +0x82b6cd: HandleEdgeTransitionMovementWest_LeftBy8 +0x82b6d9: HandleEdgeTransitionMovementWest_Left +0x82b76e: HandleEdgeTransitionMovementSouth_DownBy16 +0x82b77a: HandleEdgeTransitionMovementSouth +0x82b7ae: Dung_HandleExitToOverworld +0x82b81c: HandleEdgeTransitionMovementNorth +0x82b8bd: AdjustQuadrantAndCamera_right +0x82b8cb: SetAndSaveVisitedQuadrantFlags +0x82b8e5: SaveQuadrantsToSram +0x82b8f9: AdjustQuadrantAndCamera_left +0x82b909: AdjustQuadrantAndCamera_down +0x82b919: AdjustQuadrantAndCamera_up +0x82b929: Dungeon_FlagRoomData_Quadrants +0x82b947: Dung_SaveDataForCurrentRoom +0x82b968: AdjustCameraBoundaries_DownOrRight1Quadrant +0x82b981: AdjustCameraBoundaries_DownOrRight1Supertile +0x82b99a: AdjustCameraBoundaries_UpOrLeft1Quadrant +0x82b9b3: AdjustCameraBoundaries_UpOrLeft1Supertile +0x82b9cc: kCameraBoundsY +0x82b9d4: kCameraBoundsX +0x82b9dc: HandleEdgeTransition_AdjustCameraBoundaries +0x82ba27: Dungeon_AdjustQuadrant +0x82ba31: Dungeon_HandleCamera +0x82bb7b: MirrorBg1Bg2Offs +0x82bb88: kOverworld_Func2_Tab +0x82bb90: Overworld_OperateCameraScroll +0x82bd62: OverworldCameraBoundaryCheck +0x82bdc8: DungeonTransition_AdjustCamera_X +0x82bde2: DungeonTransition_AdjustCamera_Y +0x82bdf3: kStaircaseTab3 +0x82bdfb: kStaircaseTab4 +0x82be03: DungeonTransition_ScrollRoom +0x82be6d: kStaircaseTab5 +0x82be75: Module07_11_0A_ScrollCamera +0x82beba: kOverworld_Func6B_Tab1 +0x82beca: kOverworld_Func6B_Tab3 +0x82bee2: kOverworld_UpDownScrollTarget +0x82bf62: kOverworld_LeftRightScrollTarget +0x82bfe2: kOverworld_Size1 +0x82bfe6: kOverworld_Size2 +0x82bfea: kOverworld_UpDownScrollSize +0x82bfee: kOverworld_LeftRightScrollSize +0x82bff2: kOverworld_Func6B_Tab2 +0x82bffa: OverworldScrollTransition_dirty_exit +0x82c001: OverworldScrollTransition +0x82c0c3: Overworld_SetCameraBoundaries +0x82c0f8: kMult5tab +0x82c0fc: kStaircaseTab2 +0x82c110: DungeonTransition_FindSubtileLanding +0x82c12c: SubtileTransitionCalculateLanding +0x82c162: Dungeon_InterRoomTrans_State13 +0x82c170: Dungeon_IntraRoomTrans_State5 +0x82c191: DungeonTransition_MoveLinkOutDoor +0x82c1e5: CalculateTransitionLanding +0x82c23e: kOverworld_Func8_tab +0x82c242: Overworld_FinalizeEntryOntoScreen +0x82c2a4: Overworld_Func1F +0x82c2e4: ConditionalMosaicControl +0x82c2eb: Overworld_ResetMosaic_alwaysIncrease +0x82c303: kOwMusicSets +0x82c403: kOwMusicSets2 +0x82c463: Overworld_SetSongList +0x82c500: Intro_InitializeBackgroundSettings +0x82c533: Dungeon_LoadAndDrawEntranceRoom +0x82c546: Dungeon_SaveAndLoadLoadAllPalettes +0x82c57b: Dungeon_LoadAndDrawRoom +0x82c5b2: Overworld_LoadAllPalettes +0x82c630: Dungeon_LoadPalettes +0x82c65f: Overworld_LoadPalettesInner +0x82c68e: Overworld_LoadAreaPalettes_ +0x82c692: OverworldLoadScreensPaletteSet +0x82c6ad: Overworld_LoadAreaPalettesEx +0x82c6eb: SpecialOverworld_CopyPalettesToCache +0x82c769: Overworld_CopyPalettesToCache +0x82c7b8: CleanUpAndPrepDesertPrayerHDMA +0x82c80c: kHdmaTableForPrayingScene +0x82c813: kEntranceData_rooms +0x82c91d: kEntranceData_relativeCoords +0x82cd45: kEntranceData_scrollX +0x82ce4f: kEntranceData_scrollY +0x82cf59: kEntranceData_playerY +0x82d063: kEntranceData_playerX +0x82d16d: kEntranceData_cameraY +0x82d277: kEntranceData_cameraX +0x82d381: kEntranceData_blockset +0x82d406: kEntranceData_floor +0x82d48b: kEntranceData_palace +0x82d510: kEntranceData_doorwayOrientation +0x82d595: kEntranceData_startingBg +0x82d61a: kEntranceData_quadrant1 +0x82d69f: kEntranceData_quadrant2 +0x82d724: kEntranceData_doorSettings +0x82d82e: kEntranceData_musicTrack +0x82d8b3: Dungeon_LoadEntrance +0x82dadb: Dungeon_LoadEntrance_notExtendedRoom +0x82db6e: kStartingPoint_rooms +0x82db7c: kStartingPoint_relativeCoords +0x82dbb4: kStartingPoint_scrollX +0x82dbc2: kStartingPoint_scrollY +0x82dbd0: kStartingPoint_playerY +0x82dbde: kStartingPoint_playerX +0x82dbec: kStartingPoint_cameraY +0x82dbfa: kStartingPoint_cameraX +0x82dc08: kStartingPoint_blockset +0x82dc0f: kStartingPoint_floor +0x82dc16: kStartingPoint_palace +0x82dc1d: kStartingPoint_startingBg +0x82dc24: kStartingPoint_quadrant1 +0x82dc2b: kStartingPoint_quadrant2 +0x82dc32: kStartingPoint_doorSettings +0x82dc40: kStartingPoint_entrance +0x82dc4e: kStartingPoint_musicTrack +0x82dc55: Dungeon_LoadSpawnEntrance +0x82dd8a: kExitDataRooms +0x82de28: kExitData_ScreenIndex +0x82de77: kExitData_Map16LoadSrcOff +0x82df15: kExitData_ScrollY +0x82dfb3: kExitData_ScrollX +0x82e051: kExitData_YCoord +0x82e0ef: kExitData_XCoord +0x82e18d: kExitData_CameraY +0x82e22b: kExitData_CameraX +0x82e2c9: kExitData_Unk1 +0x82e318: kExitData_Unk3 +0x82e367: kExitData_NormalDoor +0x82e405: kExitData_FancyDoor +0x82e4a3: LoadOverworldFromDungeon +0x82e58b: Overworld_LoadNewScreenProperties +0x82e5d4: LoadCachedEntranceProperties +0x82e6e1: kSpExit_SizeY +0x82e701: kSpExit_Tab1 +0x82e721: kSpExit_Tab2 +0x82e741: kSpExit_Tab3 +0x82e761: kSpExit_Tab4 +0x82e781: kSpExit_Tab6 +0x82e7a1: kSpExit_Tab5 +0x82e7c1: kSpExit_Tab7 +0x82e7e1: kSpExit_SizeX +0x82e801: kSpExit_Dir +0x82e811: kSpExit_SprGfx +0x82e821: kSpExit_AuxGfx +0x82e831: kSpExit_PalBg +0x82e841: kSpExit_PalSpr +0x82e851: Overworld_EnterSpecialArea +0x82e9bc: LoadOverworldFromSpecialOverworld +0x82eae5: kBirdTravel_ScreenIndex +0x82eb07: kBirdTravel_Map16LoadSrcOff +0x82eb29: kBirdTravel_ScrollY +0x82eb4b: kBirdTravel_ScrollX +0x82eb6d: kBirdTravel_LinkYCoord +0x82eb8f: kBirdTravel_LinkXCoord +0x82ebb1: kBirdTravel_CameraYScroll +0x82ebd3: kBirdTravel_CameraXScroll +0x82ebf5: kBirdTravel_Unk1 +0x82ec17: kBirdTravel_Unk3 +0x82ec39: FluteMenu_LoadTransport +0x82ec47: Overworld_LoadBirdTravelPos +0x82ecdd: FluteMenu_LoadSelectedScreenPalettes +0x82ecf8: kWhirlpoolAreas +0x82ed08: FindPartnerWhirlpoolExit +0x82ed25: Overworld_LoadAmbientOverlay +0x82ed59: Overworld_LoadAndBuildScreen +0x82edb9: Module08_02_LoadAndAdvance +0x82edc5: kSecondaryOverlayPerOw +0x82eec5: Overworld_DrawQuadrantsAndOverlays +0x82ef29: Overworld_HandleOverlaysAndBombDoors +0x82ef7a: TriggerAndFinishMapLoadStripe_Y +0x82efb3: TriggerAndFinishMapLoadStripe_X +0x82efe8: SomeTileMapChange +0x82f00d: Overworld_LargeTransTable +0x82f01f: Overworld_SmallTransTable +0x82f031: CreateInitialNewScreenMapToScroll +0x82f04b: UNREACHABLE_02EDAF +0x82f06b: CreateInitialOWScreenView_Big_North +0x82f087: CreateInitialOWScreenView_Big_South +0x82f0c0: CreateInitialOWScreenView_Big_West +0x82f0dc: CreateInitialOWScreenView_Big_East +0x82f10f: CreateInitialOWScreenView_Small_North +0x82f141: CreateInitialOWScreenView_Small_South +0x82f185: CreateInitialOWScreenView_Small_West +0x82f1b7: CreateInitialOWScreenView_Small_East +0x82f20e: OverworldTransitionScrollAndLoadMap +0x82f218: BuildFullStripeDuringTransition_North +0x82f238: BuildFullStripeDuringTransition_South +0x82f241: BuildFullStripeDuringTransition_West +0x82f24a: BuildFullStripeDuringTransition_East +0x82f273: OverworldHandleMapScroll +0x82f2a2: Overworld_ResetSubmodule +0x82f2a5: MapScroll_East +0x82f2ac: MapScroll_West +0x82f2b3: MapScroll_South +0x82f2ba: MapScroll_SouthAndClear +0x82f2c8: MapScroll_North +0x82f2cf: MapScroll_NorthAndClear +0x82f2dd: CheckForNewlyLoadedMapAreas_North +0x82f311: CheckForNewlyLoadedMapAreas_South +0x82f345: CheckForNewlyLoadedMapAreas_West +0x82f37f: CheckForNewlyLoadedMapAreas_East +0x82f3b9: BufferAndBuildMap16Stripes_X +0x82f482: BufferAndBuildMap16Stripes_Y +0x82f54a: Overworld_DecompressAndDrawAllQuadrants +0x82f595: Overworld_DecompressAndDrawOneQuadrant +0x82f638: InterlaceMap32_highBytes +0x82f650: next +0x82f679: InterlaceMap32_lowBytes +0x82f691: Overworld_ParseMap32Definition +0x82f7cb: OverworldLoad_LoadSubOverlayMap32 +0x82f883: kOverworld_DrawStrip_Tab +0x82f889: kConstant0 +0x82f88b: kConstant32 +0x82f88d: kOverworldMapIsSmall +0x82f94d: kOverworld_Hibytes_Comp +0x82fb2d: kOverworld_Lobytes_Comp +0x82fd0d: LoadOverworldOverlay +0x82fd26: Map16ToMap8_subscreenOverlay +0x82fd37: BuildOverworldMapFromMap16 +0x82fd46: Map16ToMap8 +0x82fd87: OverworldCopyMap16ToBuffer +0x82fdf7: Map16ChunkToMap8_prepForUpload +0x82fe47: MirrorBonk_RecoverChangedTiles +0x82fe71: DecompressEnemyDamageSubclasses +0x82febb: Decompress_bank02 +0x82ff5f: OverworldDecomp_GetNextSourceOctet +0x838000: ov_tiledata_0 +0x83b400: ov_tiledata_1 +0x848000: ov_tiledata_2 +0x84b400: ov_tiledata_3 +0x84e800: kSinusLookupTable +0x84ea00: kHobo_Dmd +0x84ea60: Hobo_Draw +0x84ea81: Landmine_CheckDetonationFromHammer +0x84ea9d: EasterEgg_BageCode +0x84eb63: Bomb_ProjectSpeedTowardsPlayer +0x84ebaa: Bomb_ProjectReflexiveSpeedOntoSpriteLong +0x84ebb3: kWaterTurbulence_Dmd +0x84ebe5: Sprite_DrawLargeWaterTurbulence +0x84ef2f: kDungeonLayoutPtrs +0x84ef47: kDungeonLayoutPtrs_00 +0x84efaf: kDungeonLayoutPtrs_01 +0x84eff0: kDungeonLayoutPtrs_02 +0x84f04c: kDungeonLayoutPtrs_03 +0x84f0a8: kDungeonLayoutPtrs_04 +0x84f0ec: kDungeonLayoutPtrs_05 +0x84f148: kDungeonLayoutPtrs_06 +0x84f1a4: kDungeonLayoutPtrs_07 +0x84f1cd: kWatergateLayout +0x84f1de: kMovableBlockDataInit +0x84f36a: kTorchDataInit +0x84f48a: kTorchDataJunk +0x84f502: kDungeonHeaderPtrs +0x84f80a: baba_nk_84F80A +0x858000: kSparkleGarnish_Coord +0x858008: Sprite_SpawnSparkleGarnish +0x85807f: Sprite_70_KingHelmasaurFireball_bounce +0x858084: kWallCannon_Xvel +0x858086: kWallCannon_Yvel +0x858088: kWallCannon_Gfx +0x85808c: kWallCannon_OamFlags +0x858090: Sprite_66_WallCannonVerticalLeft +0x85815e: kWallCannon_Spawn_X +0x858162: kWallCannon_Spawn_XHi +0x858166: kWallCannon_Spawn_Y +0x85816a: kWallCannon_Spawn_YHi +0x85816e: kWallCannon_Spawn_Xvel +0x858172: kWallCannon_Spawn_Yvel +0x858176: kArcheryGameGuy_X +0x85817e: kArcheryGameGuy_Y +0x858186: kArcheryGameGuy_A +0x85818e: kArcheryGameGuy_Xvel +0x858190: kArcheryGameGuy_Flags4 +0x858192: SpritePrep_ArrowGame +0x8581ff: Sprite_65_ArcheryGame +0x858213: kArcheryGameGuy_Gfx +0x858217: ArcheryGame_Host +0x8582bf: ArcheryGameGuy_ShowMsg +0x8582d4: ArcheryGame_Host_ProctorGame +0x858381: kArcheryGame_NumSpr +0x858387: kArcheryGame_X +0x858399: kArcheryGame_Y +0x8583ab: kArcheryGame_Char +0x8583bd: kArcheryGame_Flags +0x8583ce: kArcheryGame_CashPrize +0x8583d9: Sprite_ArcheryGame_Octo +0x85844e: Sprite_BadArcheryTarget +0x858492: kArcheryTarget_X +0x8584af: kGoodArcheryTarget_X +0x8584b4: kGoodArcheryTarget_Y +0x8584b9: kGoodArcheryTarget_Draw_Char +0x8584be: kGoodArcheryTarget_Draw_Flags +0x8584c2: kGoodArcheryTarget_Draw_Char3 +0x8584c8: kGoodArcheryTarget_Draw_Char4 +0x8584cf: ArcheryGame_DrawPrize +0x858531: Sprite_63_DebirandoPit +0x8585de: DebirandoPit_Closed +0x8585f1: kDebirandoPit_OpeningGfx +0x8585f5: DebirandoPit_Opening +0x85860f: DebirandoPit_Open +0x858630: kDebirandoPit_ClosingGfx +0x858634: DebirandoPit_Closing +0x85864e: kDebirandoPit_Draw_X +0x85867e: kDebirandoPit_Draw_Y +0x8586ae: kDebirandoPit_Draw_Char +0x8586c6: kDebirandoPit_Draw_Flags +0x8586de: kDebirandoPit_Draw_Ext +0x8586e4: DebirandoPit_Draw +0x85874d: Sprite_64_Debirando +0x858762: Debirando_Underground +0x858773: kDebirando_Emerge_Gfx +0x858775: Debirando_Emerge +0x858792: Debirando_Shoot +0x8587c8: kDebirando_Submerge_Gfx +0x8587ca: Debirando_Submerge +0x8587e7: kDebirando_Draw_X +0x858807: kDebirando_Draw_Y +0x858827: kDebirando_Draw_Char +0x858837: kDebirando_Draw_Flags +0x858847: kDebirando_Draw_Ext +0x858857: Debirando_Draw +0x8588c5: Sprite_62_MasterSword +0x8588d6: MasterSword_Main +0x858908: MasterSword_ReadyAndWaiting +0x85894d: MasterSword_PendantsInTransit +0x858968: MasterSword_CrankUpLightShow +0x85899d: MasterSword_GrantToPlayer +0x8589c6: MasterSword_Terminate +0x8589ca: kMasterSword_Gfx1 +0x8589d3: kMasterSword_NumLightBeams +0x8589dc: Sprite_MasterSword_LightFountain +0x858a16: Sprite_MasterSword_LightWell +0x858a34: kMasterSword_LightBall_Dmd +0x858a94: SpriteDraw_LightFountain +0x858ab1: Sprite_DrawMultiple_ +0x858ab6: MasterSword_SpawnLightWell +0x858ad0: MasterSword_SpawnLightFountain +0x858aea: Sprite_MasterSword_LightBeam +0x858b08: kMasterSword_LightBeam_Xv0 +0x858b0a: kMasterSword_LightBeam_Xv1 +0x858b0c: kMasterSword_LightBeam_Xv2 +0x858b0e: kMasterSword_LightBeam_Xv3 +0x858b10: kMasterSword_LightBeam_Yv0 +0x858b12: kMasterSword_LightBeam_Yv1 +0x858b14: kMasterSword_LightBeam_Yv2 +0x858b16: kMasterSword_LightBeam_Yv3 +0x858b18: kMasterSword_LightBeam_Gfx0 +0x858b1a: kMasterSword_LightBeam_Gfx2 +0x858b1c: kMasterSword_LightBeam_Flags0 +0x858b1e: kMasterSword_LightBeam_Flags2 +0x858b20: MasterSword_SpawnReplacementLightBeam +0x858b62: MasterSword_SpawnLightBeam +0x858cd3: MasterSword_SpawnPendantProp +0x858d21: kMasterSword_Pendant_Xv +0x858d25: kMasterSword_Pendant_Yv +0x858d29: Sprite_MasterSword_Prop +0x858d40: MasterSword_Prop_Floating +0x858d57: MasterSword_Prop_Flashing +0x858d7a: MasterSword_Prop_FlyAwayNow +0x858d96: kMasterSword_Draw_X +0x858d9c: kMasterSword_Draw_Y +0x858da2: kMasterSword_Draw_Char +0x858da8: MasterSword_Draw +0x858dd8: kSpikeRoller_XYvel +0x858dde: Sprite_5D_Roller_VerticalDownFirst +0x858e21: kSpikeRoller_Draw_X +0x858e61: kSpikeRoller_Draw_Y +0x858ea1: kSpikeRoller_Draw_Char +0x858ec1: kSpikeRoller_Draw_Flags +0x858ee1: kSpikeRoller_Draw_Num +0x858ee3: SpikeRoller_Draw +0x858f54: Sprite_61_Beamos +0x858fc2: Beamos_FireLaser +0x859062: kBeamos_Draw_Y +0x859066: kBeamos_Draw_Char +0x859068: Beamos_Draw +0x8590d1: kBeamosEyeball_Draw_X +0x8590f1: kBeamosEyeball_Draw_Y +0x859111: kBeamosEyeball_Draw_Char +0x859131: kBeamosEyeball_Draw_Flags +0x859151: SpriteDraw_Beamos_Eyeball +0x8591b5: Sprite_Beamos_Laser +0x859257: Sprite_PrepOamCoord_wrapper +0x85925b: BeamosLaser_Draw +0x8592c6: kBeamosLaserHit_Draw_X +0x8592ce: kBeamosLaserHit_Draw_Y +0x8592d6: kBeamosLaserHit_Draw_Flags +0x8592da: Sprite_Beamos_LaserHit +0x859333: kSpark_OamFlags +0x859337: kSpark_directions +0x85933f: Sprite_5B_Spark_Clockwise +0x85940e: Sprite_59_LostWoodsBird +0x85944c: LostWoodsBird_Ascend +0x859468: Sprite_5A_LostWoodsSquirrel +0x8594af: kCrab_Xvel +0x8594b1: kCrab_Yvel +0x8594b5: Sprite_58_Crab +0x859500: kCrab_Draw_X +0x859508: kCrab_Draw_Char +0x85950c: kCrab_Draw_Flags +0x859510: Crab_Draw +0x85956d: Sprite_57_DesertStatue +0x8595fc: kDesertBarrier_Xv +0x8595fe: kDesertBarrier_Yv +0x859602: kDesertBarrier_NextD +0x859606: kDesertBarrier_Dmd +0x859626: DesertBarrier_Draw +0x85966a: kSprite_ZoraFireball_X +0x85966e: kSprite_ZoraFireball_Offs +0x859670: kSprite_ZoraFireball_XHi +0x859673: kSprite_ZoraFireball_Y +0x859675: kSprite_ZoraFireball_W +0x859677: kSprite_ZoraFireball_H +0x85967b: Sprite_55_Zora +0x859683: Sprite_Fireball +0x859725: Sprite_Zora_Main +0x85974a: kSprite_Zora_Surface_XY +0x85975a: Zora_Submerged +0x8597b5: kSprite_Zora_SurfacingGfx +0x8597c5: Zora_Surface +0x8597e9: kSprite_Zora_AttackGfx +0x8597f1: Zora_Attack +0x859818: kSprite_Zora_SubmergeGfx +0x859824: Zora_Submerge +0x85983f: kZora_Draw_X +0x859873: kZora_Draw_Y +0x8598a7: kZora_Draw_Char +0x8598c1: kZora_Draw_Flags +0x8598db: kZora_Draw_Ext +0x8598f5: Zora_Draw +0x85995b: Sprite_52_KingZora +0x85997a: KingZora_Idle +0x8599d5: kWalkingZora_Xdelta +0x8599d9: KingZora_TheRumbling +0x859a07: kZoraKing_Surfacing_Gfx +0x859a17: KingZora_Surface +0x859a3e: kZoraKing_Dialogue_Gfx +0x859a46: KingZora_Talking +0x859acf: kZoraKing_Submerge_Gfx +0x859ae4: KingZora_Submerge +0x859b08: kSpawnSplashRing_X +0x859b18: kSpawnSplashRing_Y +0x859b28: kSpawnSplashRing_Xvel +0x859b30: kSpawnSplashRing_Yvel +0x859b38: Sprite_Arrghus_SpawnSplash +0x859b40: Sprite_SpawnBigSplash +0x859bbb: kZoraKing_Draw_X0 +0x859bef: kZoraKing_Draw_Y0 +0x859c23: kZoraKing_Draw_Char0 +0x859c57: kZoraKing_Draw_Flags0 +0x859c8b: kZoraKing_Draw_X1 +0x859c93: kZoraKing_Draw_Y1 +0x859c9b: kZoraKing_Draw_Char1 +0x859ca3: kZoraKing_Draw_Flags1 +0x859cab: ZoraKing_Draw +0x859d4a: Sprite_56_WalkingZora +0x859d7f: WalkingZora_Wait +0x859d9c: WalkingZora_Surface +0x859dd6: WalkingZora_Walking +0x859e66: WalkingZora_Stunned +0x859edb: WalkingZora_AdjustShadow +0x859ef0: kWalkingZora_Draw_Char +0x859ef4: kWalkingZora_Draw_Flags +0x859ef8: kWalkingZora_Draw_Char2 +0x859f00: kWalkingZora_Draw_Flags2 +0x859f08: WalkingZora_Draw +0x859fac: kWaterRipple_Dmd +0x859fdc: kWaterRipple_Idx +0x859fe0: WalkingZora_DrawWaterRipples +0x859fe5: SpriteDraw_WaterRipple_WithOamAdjust +0x859ffa: SpriteDraw_WaterRipple +0x85a029: Sprite_AutoIncDrawWaterRipple_ +0x85a031: kArmosKnight_Gfx1 +0x85a036: Sprite_53_ArmosKnight +0x85a18f: ArmosKnight_ProjectSpeedTowardsTarget +0x85a1b4: kArmosKnight_Draw_X +0x85a1e4: kArmosKnight_Draw_Y +0x85a214: kArmosKnight_Draw_Char +0x85a22c: kArmosKnight_Draw_Flags +0x85a244: kArmosKnight_Draw_Ext +0x85a25c: kArmosKnight_SprOffs +0x85a274: ArmosKnight_Draw +0x85a377: kLanmola_InitDelay +0x85a37a: SpritePrep_Lanmolas +0x85a3a2: Sprite_54_Lanmolas +0x85a3bf: Sprite_Lanmolas_Hiding +0x85a3d6: kLanmola_RandB +0x85a3de: kLanmola_RandC +0x85a3e6: Sprite_Lanmolas_BurrowingUp +0x85a42f: kLanmola_ZVel +0x85a431: Sprite_Lanmolas_LeapFromSand +0x85a4cb: Sprite_Lanmolas_WiggleInAir +0x85a4f2: Sprite_Lanmolas_BurrowDown +0x85a515: kMult8 +0x85a51d: Ancilla_SpawnFallingPrize +0x85a529: Sprite_Lanmolas_Exploding +0x85a5da: kLanmola_Mult64 +0x85a5de: kLanmola_ObjOffs +0x85a5e0: kLanmola_ObjStep +0x85a5e2: kLanmola_Draw_Char1 +0x85a5f2: kLanmola_Draw_Char0 +0x85a602: kLanmola_Draw_Flags +0x85a612: kLanmola_Draw_X4 +0x85a61a: kLanmola_Draw_Y4 +0x85a622: kLanmola_Draw_Char4 +0x85a62a: kLanmola_Draw_Flags4 +0x85a632: kLanmola_Draw_Ext4 +0x85a63a: kLanmola_SprOffs +0x85a642: kLanmola_ExtSprOffs +0x85a64a: Lanmola_Draw +0x85a864: kLanmola_Draw_Char2 +0x85a86a: kLanmola_Draw_Flags2 +0x85a870: kLanmola_Draw_Idx2 +0x85a880: kSpriteRat_Tab0 +0x85a890: kSpriteRat_Tab1 +0x85a8a0: kSpriteRat_Tab2 +0x85a8a8: kSpriteRat_Tab4 +0x85a8b0: Sprite_6D_Rat +0x85a90b: kSpriteRat_Xvel +0x85a90f: kSpriteRat_Yvel +0x85a913: kSpriteRat_Tab3 +0x85a917: Rat_Moving +0x85a95b: kSpriteRope_Gfx +0x85a963: kSpriteRope_Flags +0x85a96b: kSpriteRope_Tab1 +0x85a973: Sprite_6E_Rope +0x85aa30: kSpriteRope_Xvel +0x85aa38: kSpriteRope_Yvel +0x85aa40: kSpriteRope_Tab0 +0x85aa44: Rope_Moving +0x85aa87: kSpriteKeese_Tab0 +0x85aa8b: Sprite_6F_Keese +0x85aae2: kSpriteKeese_Tab1 +0x85aae4: kSpriteKeese_Tab2 +0x85aaf4: kSpriteKeese_Tab3 +0x85ab04: Keese_Agitated +0x85ab54: Sprite_Cannonball +0x85ab93: Sprite_CheckDamageToAndFromLink +0x85ab9c: Sprite_SpawnPoofGarnish +0x85abe4: Sprite_6B_Cannonball +0x85ac34: CannonGuard_FaceLink +0x85ac52: CannonGuard_Charge +0x85ac7b: CannonTrooper_SpawnCannonBall_UNUSED +0x85acf2: CannonGuard_Fire +0x85ad12: CannonGuard_Recoil +0x85ad28: CannonGuard_Recover +0x85aef9: SpriteDraw_CannonGuard +0x85af71: kSprite_WarpVortex_Flags +0x85af75: Sprite_6C_MirrorPortal +0x85b019: kChainBallTrooper_Tab1 +0x85b01b: Sprite_6A_BallNChain +0x85b07d: BallNChain_Approach +0x85b0ab: BallNChain_Animate +0x85b0c7: kFlailTrooperGfx +0x85b0e7: BallNChain_Steady +0x85b0f8: kFlailTrooperAttackDir +0x85b0fc: BallNChain_SpinFlail +0x85b12e: BallNChain_SlowFlail +0x85b144: Sprite_ChainBallTrooper_Draw +0x85b156: kChainBallTrooperHead_Char +0x85b15a: kChainBallTrooperHead_Flags +0x85b15e: SpriteDraw_BNCHead +0x85b160: SpriteDraw_GuardHead +0x85b1a3: kFlailTrooperBody_X +0x85b233: kFlailTrooperBody_Y +0x85b2c3: kFlailTrooperBody_Char +0x85b30b: kFlailTrooperBody_Flags +0x85b353: kFlailTrooperBody_Ext +0x85b39b: kFlailTrooperBody_Num +0x85b3b3: kFlailTrooperBody_SprOffs +0x85b3cb: SpriteDraw_BNCBody +0x85b3cd: SpriteDraw_GuardBody +0x85b440: kFlailTrooperWeapon_Tab0 +0x85b460: kFlailTrooperWeapon_Tab1 +0x85b464: kFlailTrooperWeapon_Tab2 +0x85b468: SpriteDraw_BNCFlail +0x85b5ba: kFlailTrooperWeapon_Tab4 +0x85b5be: NOP4 +0x85b5c3: SpriteModule_Active +0x85b5cb: kSoldier_DirectionLockSettings +0x85b5cf: kSoldier_Gfx +0x85b5d3: SpriteActive2_Main +0x85b5e8: kSpriteActive2Trampoline +0x85b648: Sprite_50_Cannonball +0x85b688: kMetalBallLarge_X +0x85b690: kMetalBallLarge_Y +0x85b698: kMetalBallLarge_Char +0x85b6a0: kMetalBallLarge_Flags +0x85b6a4: SpriteDraw_BigCannonball +0x85b703: Sprite_51_ArmosStatue +0x85b7df: kArmos_Dmd +0x85b7ef: Armos_Draw +0x85b80a: Sprite_4E_Popo +0x85b88d: Sprite_CheckTileCollision +0x85b892: kBot_Gfx +0x85b896: kBot_OamFlags +0x85b89a: Bot_Draw +0x85b8b3: Sprite_4C_Geldman +0x85b8ea: Geldman_Hiding +0x85b90b: Geldman_WaitForLink +0x85b93f: Geldman_Ambush +0x85b95d: kGerudoMan_EmergeGfx +0x85b965: kGerudoMan_PursueGfx +0x85b967: kGerudoMan_SubmergeGfx +0x85b96c: Geldman_Chase +0x85b98f: Geldman_Retreat +0x85b9a6: kGerudoMan_Draw_X +0x85b9ca: kGerudoMan_Draw_Y +0x85b9ee: kGerudoMan_Draw_Char +0x85ba00: kGerudoMan_Draw_Flags +0x85ba12: kGerudoMan_Draw_Ext +0x85ba24: GerudoMan_Draw +0x85ba85: Sprite_4D_Toppo +0x85bab6: kToppo_XOffs +0x85babe: kToppo_YOffs +0x85bac6: Toppo_Hiding +0x85bb01: Toppo_RustleGrass +0x85bb1a: Toppo_PokingOut +0x85bb30: Toppo_Leaping +0x85bb53: Toppo_Retreat +0x85bb6d: Toppo_Flustered_bounce +0x85bb72: Toppo_VerifyTile +0x85bb96: kToppo_Draw_X +0x85bbb4: kToppo_Draw_Y +0x85bbd2: kToppo_Draw_Char +0x85bbe1: kToppo_Draw_Flags +0x85bbf0: kToppo_Draw_Ext +0x85bbff: Toppo_Draw +0x85bc8a: kSprite_Recruit_Xvel +0x85bc92: kSprite_Recruit_Yvel +0x85bc9a: kSprite_Recruit_Gfx +0x85bca2: Sprite_4B_GreenKnifeGuard +0x85bd16: kRecruit_Moving_HeadDir +0x85bd1e: GreenKnifeGuard_Moving +0x85bd52: ZoraAndGuardAdvanceAnimation +0x85bd5e: kRecruit_Draw_X +0x85bd6e: kRecruit_Draw_Char +0x85bd76: kRecruit_Draw_Flags +0x85bd7e: Recruit_Draw +0x85be0a: Sprite_4A_BombGuard +0x85be49: SpriteBomb_CheckDamageToSprite +0x85bed3: SpriteBomb_ExplosionIncoming +0x85bf51: BombGuard +0x85bfb1: kBombTrooperBomb_X +0x85bfb9: kBombTrooperBomb_Y +0x85bfc1: BombGuard_CreateBomb +0x85c03b: kBombTrooperBomb_Zvel +0x85c04b: BombTrooper_Draw +0x85c069: kBombTrooper_DrawArm_X +0x85c079: kBombTrooper_DrawArm_Y +0x85c089: SpriteDraw_BombGuard_Arm +0x85c0d3: kEnemyBombExplosion_X +0x85c0e3: kEnemyBombExplosion_Y +0x85c0f3: kEnemyBombExplosion_Char +0x85c103: kEnemyBombExplosion_Flags +0x85c113: SpriteDraw_SpriteBombExplosion +0x85c155: Sprite_41_BlueGuard +0x85c15d: Probe +0x85c227: Guard_Main +0x85c2d0: kSoldier_Delay +0x85c2d4: Guard_Idle +0x85c32b: Guard_SetGlanceTo12 +0x85c331: kSoldier_Xvel +0x85c335: kSoldier_Yvel +0x85c339: kSoldier_Gfx2 +0x85c359: kSoldierB_Xvel +0x85c361: kSoldierB_Yvel +0x85c369: kSoldierB_Xvel2 +0x85c371: kSoldierB_Yvel2 +0x85c379: kSoldierB_Dir +0x85c381: kSoldierB_Mask2 +0x85c389: kSoldierB_Mask +0x85c391: kSoldierB_NextB2 +0x85c399: kSoldierB_NextB +0x85c3a1: Guard_ShootProbeAndStuff +0x85c403: Guard_OnPatrol +0x85c454: Guard_TickAndUpdateBody +0x85c470: kSoldier_HeadDirs +0x85c490: Guard_Surveying +0x85c4c1: Guard_InPursuit +0x85c4d7: Guard_SetTimerAndAssertTileHitBox +0x85c4e8: Guard_FallingToDeath +0x85c4f9: Sprite_ZeroVelocity_ +0x85c500: Soldier_Func12 +0x85c535: Guard_TickTwiceAndUpdateBody +0x85c53c: kSoldier_SetTowardsVel +0x85c542: Guard_ApplySpeedInDirection +0x85c566: kAlways16 +0x85c56a: kAlways18 +0x85c56e: kSpawnProbe_Xvel +0x85c5ae: kSpawnProbe_Yvel +0x85c5ee: kSprite_SpawnProbeStaggered_Tab +0x85c5f2: Sprite_Guard_SendOutProbe +0x85c612: Sprite_SpawnProbeAlways +0x85c66e: Sprite_SpawnProbeAlways_ +0x85c676: Soldier_Draw_ +0x85c680: Guard_HandleAllAnimation +0x85c68c: Soldier_DrawShadow +0x85c69e: kSoldier_DrawShadow +0x85c6a2: kSoldier_Draw1_Char +0x85c6a6: kSoldier_Draw1_Flags +0x85c6aa: kSoldier_Draw1_Yd +0x85c6de: Guard_AnimateHead +0x85c6e0: Soldier_Draw1Ex +0x85c72d: kSoldier_Draw2_Xd +0x85c7fd: kSoldier_Draw2_Yd +0x85c8cd: kSoldier_Draw2_Char +0x85c935: kSoldier_Draw2_Flags +0x85c99d: kSoldier_Draw2_Ext +0x85ca05: kSoldier_Draw2_OamIdx +0x85ca09: Guard_AnimateBody +0x85ca10: Soldier_Draw2Ex +0x85cab8: kSoldier_Draw3_Xd +0x85caf0: kSoldier_Draw3_Yd +0x85cb28: kSoldier_Draw3_Char +0x85cb44: kSoldier_Draw3_Flags +0x85cb60: kSoldier_Draw3_OamIdx +0x85cb64: Guard_AnimateWeapon +0x85cbe0: Sprite_45_UsainBolt +0x85cc3c: BoltGuard_TriggerChaseTheme +0x85cc65: Sprite_44_BluesainBolt +0x85ccd5: PsychoTrooper_Draw +0x85cce8: kSolderThrowing_Draw_X +0x85cd08: kSolderThrowing_Draw_Y +0x85cd28: kSolderThrowing_Draw_Char +0x85cd38: kSolderThrowing_Draw_Flags +0x85cd48: SpriteDraw_GuardSpear_Fresh +0x85cd4a: SpriteDraw_GuardSpear_PreserveOamOffset +0x85cd4f: SpriteDraw_GuardSpear_Bolt +0x85cd54: SpriteDraw_GuardSpear +0x85cdd4: Sprite_Guard_MoveIfNoTileCollision +0x85cddd: kJavelinTrooper_Gfx +0x85cde1: Sprite_48_RedJavelinGuard +0x85cdff: Sprite_46_BlueArcher +0x85ce23: SoldierThrowing_Common +0x85ce74: Archer_Hiding +0x85ceaa: Archer_Walking +0x85cee2: agitated_jump_to +0x85cf13: Archer_Scanning +0x85cf44: Archer_NoticeSenpai +0x85cf61: kSolderThrowing_Xd +0x85cf71: kSolderThrowing_Yd +0x85cf81: kSolderThrowing_DirFlags +0x85cf85: Archer_Agitated +0x85d001: kJavelinTrooper_Tab2 +0x85d041: kSoldier_Tab1 +0x85d045: Archer_Attack +0x85d08b: kJavelinProjectile_X +0x85d09b: kJavelinProjectile_Y +0x85d0ab: kJavelinProjectile_Xvel +0x85d0b1: kJavelinProjectile_Yvel +0x85d0c1: kJavelinProjectile_Flags4 +0x85d0c5: Guard_LaunchProjectile +0x85d141: BushJavelinSoldier_Draw +0x85d192: JavelinTrooper_Draw +0x85d1ac: Sprite_49_RedBushGuard +0x85d1bf: Sprite_47_GreenBushGuard +0x85d1d3: Sprite_BushGuard_Main +0x85d1f5: Sprite_BushGuard_Hiding +0x85d203: kBushSoldier_Gfx +0x85d223: Sprite_BushGuard_Emerging +0x85d252: BushGuard_SpawnFoliage +0x85d277: Sprite_BushGuard_Shoot +0x85d2be: kBushSoldier_Gfx2 +0x85d2ce: Sprite_BushGuard_Retreating +0x85d2e9: kBushSoldierCommon_Y +0x85d305: kBushSoldierCommon_Char +0x85d313: kBushSoldierCommon_Flags +0x85d321: BushSoldierCommon_Draw +0x85d381: kArcherSoldier_WeaponOamOffs +0x85d384: kArcherSoldier_HeadOamOffs +0x85d388: kArcherSoldier_BodyOamOffs +0x85d38c: ArcherSoldier_Draw +0x85d3b0: kArcherSoldier_Draw_X +0x85d410: kArcherSoldier_Draw_Y +0x85d470: kArcherSoldier_Draw_Char +0x85d4a0: kArcherSoldier_Draw_Flags +0x85d4d0: kArcherSoldier_Tab1 +0x85d4d4: SpriteDraw_Archer_Weapon +0x85d53b: Sprite_TutorialGuardOrBarrier +0x85d543: Sprite_BarrierBounce +0x85d548: kSprite_TutorialEntities_Tab +0x85d54c: Sprite_GuardOrBarrierTest +0x85d5bf: kTutorialSoldier_X +0x85d5e7: kTutorialSoldier_Y +0x85d60f: kTutorialSoldier_Char +0x85d623: kTutorialSoldier_Flags +0x85d637: kTutorialSoldier_Ext +0x85d64b: TutorialSoldier_Draw +0x85d6bc: Sprite_04_PullSwitch +0x85d6d4: PullSwitch_FacingUp +0x85d72f: kBadPullSwitch_Tab1 +0x85d738: kBadPullSwitch_Tab0 +0x85d743: PullSwitch_HandleUpPulling +0x85d7ca: kBadPullDownSwitch_X +0x85d7d0: kBadPullDownSwitch_Y +0x85d7d6: kBadPullDownSwitch_Char +0x85d7dc: kBadPullDownSwitch_Flags +0x85d7e0: kBadPullDownSwitch_Ext +0x85d7e6: kBadPullSwitch_Tab5 +0x85d7ed: kBadPullSwitch_Tab4 +0x85d7f9: BadPullDownSwitch_Draw +0x85d856: kBadPullUpSwitch_Tab2 +0x85d858: BadPullUpSwitch_Draw +0x85d8b5: PullSwitch_FacingDown +0x85d921: kGoodPullSwitch_Tab1 +0x85d92c: kGoodPullSwitch_Tab0 +0x85d938: kGoodPullSwitch_YOffs +0x85d945: kGoodPullSwitch_Tab2 +0x85d953: GoodPullSwitch_Draw +0x85d999: PullSwitch_HandleDownPulling +0x85da29: SpritePrep_UncleAndPriest +0x85da31: kUncleAndSage_X +0x85da37: kUncleAndSage_Y +0x85da3d: UncleOrPriestPrepCheck +0x85db27: Priest_SpawnMantle +0x85db86: Sprite_73_UncleAndPriest +0x85db8e: Sprite_UncleAndSage +0x85db9b: Sprite_SanctuaryMantle +0x85dbd3: SageMantle_NoPlayerCollision +0x85dbe3: SageMantle_SlidingRight +0x85dc00: Sprite_SanctuaryMantle_AttemptCutscene +0x85dc39: Sprite_SanctuaryMantle_InitializeSlide +0x85dc52: Sprite_SanctuaryMantle_SlideToTheRight +0x85dc6a: kSageMantle_Dmd +0x85dc8a: SageMantle_Draw +0x85dca2: Sprite_TrackBodyToHead +0x85dce6: Sprite_Priest +0x85dd0a: Priest_Dying +0x85dd1f: Priest_LyingOnGround +0x85dd3f: Priest_FinalWords +0x85dd5f: Priest_Die +0x85dd63: Priest_RunRescueCutscene +0x85dde5: Priest_Chillin +0x85de24: kUncle_LeaveHouse_Xvel +0x85de28: kUncle_LeaveHouse_Yvel +0x85de2c: Sprite_Uncle +0x85de3e: Uncle_AtHouse +0x85de52: Uncle_TriggerTelepathy +0x85de72: Uncle_AwakenLink +0x85de9a: Uncle_DeclareCurfew +0x85deb0: kUncle_LeaveHouse_Delay +0x85deb2: kUncle_LeaveHouse_Dir +0x85deb4: Uncle_Embark +0x85def8: Uncle_ApplyTelepathyFollower +0x85df19: Uncle_InPassage +0x85df26: Uncle_LyingInDefeat +0x85df44: Uncle_GrantEquipment +0x85df6c: Sprite_DrawMultiple +0x85df70: Sprite_DrawMultiple_R6 +0x85df75: Sprite_DrawMultiplePlayerDeferred +0x85dfe5: Sprite_DrawMultiple_prep_oam_deferred +0x85dfe9: Sprite_DrawMultiple_prep_oam +0x85e00b: Sprite_32_ArguingBros +0x85e013: Sprite_QuarrelBros +0x85e052: Sprite_UNREACHABLE_05E052 +0x85e06b: UNREACHABLE_05E06B +0x85e0b6: UNREACHABLE_05E0B6 +0x85e0ff: kQuarrelBros_Dmd +0x85e17f: QuarrelBros_Draw +0x85e1a3: kShowMessageFacing_Tab0 +0x85e1a7: Sprite_ShowSolicitedMessage +0x85e1f0: Sprite_ShowMessageOnContact +0x85e219: Sprite_ShowMessageUnconditional +0x85e24d: Sprite_33_RupeePull +0x85e255: Sprite_PullForRupees +0x85e28c: Sprite_14_ThievesTownGrate +0x85e294: Sprite_GargoyleGrate +0x85e2ea: Sprite_34_YoungSnitch +0x85e2f2: Sprite_YoungSnitchLady +0x85e2ff: kYoungSnitchLady_Dmd +0x85e37f: YoungSnitchLady_Draw +0x85e3a7: Sprite_35_Innkeeper +0x85e3af: Sprite_InnKeeper +0x85e3cc: kInnKeeper_Dmd +0x85e3dc: InnKeeper_Draw +0x85e3f3: Sprite_36_Witch +0x85e3fb: Sprite_Witch +0x85e453: Witch_GrantByrna +0x85e460: Witch_DiscussThings +0x85e47c: Witch_DiscussMushroom +0x85e4a7: Witch_YouHaveShroom +0x85e4cf: Witch_AcceptShroom +0x85e509: kWitch_DrawDataA +0x85e549: kWitch_DrawDataB +0x85e555: kWitch_DrawDataC +0x85e55d: Witch_Draw +0x85e62b: Sprite_38_EyeStatue +0x85e633: Sprite_ArrowTrigger +0x85e656: UNREACHABLE_05E656 +0x85e657: Sprite_Decelerate_X +0x85e666: Sprite_Decelerate_Y +0x85e675: SpritePrep_Snitch +0x85e67d: SpritePrep_Snitches +0x85e69a: Sprite_3D_OldSnitch +0x85e6a2: kOldSnitchLady_Xvel +0x85e6a6: kOldSnitchLady_Yvel +0x85e6aa: Sprite_OldSnitchLady +0x85e706: Snitch_FacePlayer +0x85e716: kOldSnitchLady_Xd +0x85e71a: Snitch_Meander +0x85e78d: Snitch_FreakOut +0x85e831: Snitch_OpenDoor +0x85e887: Snitch_SlamDoor +0x85e88e: SpritePrep_RunningBoy +0x85e896: SpritePrep_RunningMan +0x85e8a2: Sprite_74_RunningBoy +0x85e8aa: kRunningMan_Xvel +0x85e8ae: kRunningMan_Yvel +0x85e8b2: Sprite_RunningMan +0x85e8f5: kRunningMan_Xvel2 +0x85e8f7: RunningBoy_Idle +0x85e938: RunningMan_Running +0x85e946: RunningBoy_RunLeft +0x85e965: RunningMan_Relax +0x85e96c: kRunningMan_A +0x85e96f: kRunningMan_Dir +0x85e973: RunningBoy_RunRight +0x85e998: RunningBoy_Caught +0x85e9ac: RunningMan_AnimateAndDust +0x85e9ba: RunningMan_RunAway +0x85e9cd: kRunningMan_Dmd +0x85ea4d: RunningMan_Draw +0x85ea71: Sprite_75_BottleMerchant +0x85ea79: Sprite_BottleVendor +0x85eabe: BottleVendor_SoldOut +0x85eac7: BottleVendor_Idle +0x85eaed: BottleVendor_OfferSale +0x85eb17: BottleVendor_GrantBottle +0x85eb40: BottleVendor_BuyingItem +0x85eb5d: BottleVendor_PayOut +0x85eb87: kBottleVendor_Dmd +0x85eba7: BottleVendor_Draw +0x85ebc7: SpritePrep_ZeldaLong +0x85ebcf: SpritePrep_Zelda +0x85ec4c: Priest_SpawnRescuedPrincess +0x85ec8e: kZelda_Xvel +0x85ec92: kZelda_Yvel +0x85ec96: Sprite_Zelda_ +0x85ec9e: Sprite_76_Zelda +0x85ecbf: Zelda_InCell +0x85ecd9: Zelda_WaitingInCell +0x85ecfa: Zelda_ApproachHero +0x85ed20: Zelda_DebaseAgahnim +0x85ed2c: Zelda_VerifyAttentionSpan +0x85ed43: Zelda_BecomeFollower +0x85ed69: Zelda_EnteringSanctuary +0x85ed76: kZelda_Delay0 +0x85ed7a: kZelda_Dir0 +0x85ed7e: Zelda_EnterSanctuary +0x85edc4: Zelda_TalkHeadOff +0x85edec: Zelda_WellWishes +0x85ee06: kZeldaMsgs +0x85ee0c: Zelda_AtSanctuary +0x85ee4b: SpritePrep_MushroomLong +0x85ee53: SpritePrep_Mushroom +0x85ee70: Sprite_E7_Mushroom +0x85ee78: Sprite_Mushroom +0x85eea6: SpritePrep_FakeMasterSword +0x85eea7: Sprite_E8_FakeMasterSword +0x85eeaf: Sprite_FakeSword +0x85eed6: kFakeSword_Dmd +0x85eee6: FakeSword_Draw +0x85eef9: kHeartPieceMsg +0x85ef01: SpritePrep_HeartContainer +0x85ef09: HeartUpdgrade_CheckIfAlreadyObtained +0x85ef3f: Sprite_EA_HeartContainer +0x85ef47: Sprite_HeartContainer +0x85efc6: HeartContainer_GrantFromSprite +0x85efdc: HeartContainer_Grant +0x85eff7: HeartUpgrade_SetOutdoorAcquiredFlag +0x85f006: kHeartUpgrade_IndoorAcquiredMasks +0x85f008: HeartUpgrade_SetIndoorAcquiredFlag +0x85f018: Sprite_EB_HeartPiece +0x85f020: Sprite_HeartPiece +0x85f0c3: HeartUpgrade_SetObtainedFlag +0x85f0cd: Sprite_16_Elder +0x85f0d5: Sprite_Elder +0x85f0ea: Sprite_Aginah +0x85f14d: Sprite_Sahasrahla +0x85f160: Sasha_Idle +0x85f1dc: out +0x85f1e9: Sasha_GiveQuest +0x85f1fb: Sasha_GiveBoots +0x85f20e: Sasha_PromoteIceRod +0x85f21a: kElder_Dmd +0x85f23a: Elder_Draw +0x85f25a: SpritePrep_MedallionTabletLong +0x85f262: SpritePrep_MedallionTablet +0x85f296: Sprite_F2_MedallionTablet +0x85f29e: Sprite_MedallionTablet +0x85f2a9: kDustCloud_Gfx +0x85f2b2: Sprite_DustCloud +0x85f2d6: Sprite_SpawnDustCloud +0x85f30c: MedallionTablet_Main +0x85f347: kMedallionTabletEtherMsg +0x85f34b: kMedallionTabletMsg +0x85f34f: MedallionTablet_WaitingToBeRead +0x85f355: BombosTablet +0x85f3c4: EtherTablet +0x85f42e: MedallionTablet_WasteTime +0x85f43c: MedallionTablet_Crumble +0x85f463: MedallionTablet_AmCrumbled +0x85f469: Sprite_78_MrsSahasrahla +0x85f471: Sprite_ElderWife +0x85f48a: MrsSahasrahla_Idle +0x85f4b5: MrsSahasrahla_BabbleOn +0x85f4c1: MrsSahasrahla_QuestionSanity +0x85f4db: MrsSahasrahla_FindMyHubby +0x85f4e5: kElderWife_Dmd +0x85f505: ElderWife_Draw +0x85f521: SpritePrep_MagicShopAssistant +0x85f529: SpritePrep_PotionShop +0x85f539: MagicShopAssistant_SpawnPowder +0x85f58e: MagicShopAssistant_SpawnGreenCauldron +0x85f5bf: MagicShopAssistant_SpawnBlueCauldron +0x85f5f0: MagicShopAssistant_SpawnRedCauldron +0x85f62b: Sprite_E9_MagicShopAssistant +0x85f633: Sprite_PotionShop +0x85f644: Sprite_BagOfPowder +0x85f66b: kMagicPowder_Dmd +0x85f67b: MagicPowderItem_Draw +0x85f68e: Sprite_GreenCauldron +0x85f700: kGreenPotionItem_Dmd +0x85f718: GreenPotionItem_Draw +0x85f72b: Sprite_BlueCauldron +0x85f79d: kBluePotionItem_Dmd +0x85f7bd: BluePotionItem_Draw +0x85f7d0: Sprite_RedCauldron +0x85f846: PotionCauldron_GoBeep +0x85f84d: kRedPotionItem_Dmd +0x85f86d: RedPotionItem_Draw +0x85f880: PotionCauldron_CheckBottles +0x85f893: Sprite_MagicShopAssistant_Main +0x85f8fb: kShopkeeper_Dmd +0x85f91b: Shopkeeper_Draw +0x85f93f: Sprite_DirectionToFacePlayer__ +0x85f944: Sprite_IsToRightOfPlayer_ +0x85f949: Sprite_IsBelowPlayer___ +0x85f94e: Sprite_ReturnIfInactive_ +0x85f955: Sprite_ReturnIfPaused_ +0x85f96b: kSprite2_ReturnIfRecoiling_Masks +0x85f971: Sprite_ReturnIfRecoiling_ +0x85f9ed: Sprite_Move_ +0x85f9f4: Sprite_MoveX__ +0x85fa00: Sprite2_MoveY +0x85fa2e: Sprite_MoveZ_ +0x85fa50: Sprite_PrepOamCoordOrDoubleRet__ +0x85fa59: Sprite_TutorialGuard_ShowMessageOnContact +0x85fa8e: Sprite_ShowMessageMinimal +0x85faa2: Overworld_ReadTileAttribute +0x85faca: Sprite_3A_MagicBat +0x85fad2: Sprite_MadBatter +0x85faff: MagicBat_Dormant +0x85fb3a: kMadBatter_RisingUp_XAccel +0x85fb3c: MagicBat_Ascend +0x85fb86: kMadBatter_PseudoAttack_OamFlags +0x85fb8e: MagicBat_Attack +0x85fbb9: MagicBat_EnhanceMagic +0x85fbe4: MagicBat_Retreat +0x85fbef: Sprite_3B_BonkItem +0x85fbf7: Sprite_DashItem +0x85fc04: Sprite_BonkKey +0x85fc4e: BonkKey_Undisturbed +0x85fc7e: BonkKey_GrantKey +0x85fc9e: Sprite_BookOfMudora +0x85fce8: BookOfMudora_WaitForBonk +0x85fd1b: BonkItem_KnockedDown +0x85fd2e: BonkItem_Land +0x85fd3a: BookOfMudora_GrantLiterature +0x85fd4d: Sprite_LumberjackTree +0x85fd98: LumberjackTree_WaitForBonk +0x85fdd0: LumberjackTree_ExplodeViolently +0x85fe0b: LumberjackTree_DispersionOfLeaves +0x85fe23: kDashTreeTop_CharFlags +0x85fe43: kDashTreeTop_X +0x85fe53: kDashTreeTop_Y +0x85fe63: kDashTreeTop_Char +0x85fe69: kDashTreeTop_Flags +0x85fe6f: DashTreeTop_Draw +0x85ff39: LumberjackTree_SpawnLeaves +0x85ff5e: Sprite_3C_KidInKak +0x85ff66: Sprite_TroughBoy +0x85ff9f: kTroughBoy_Dmd +0x85ffdf: TroughBoy_Draw +0x868000: BottleMerchant_DetectFish +0x868045: kBottleVendor_FishRewardXv +0x86804a: kBottleVendor_FishRewardYv +0x86804f: kBottleVendor_FishRewardType +0x868054: BottleMerchant_BuyFish +0x86809f: Boomerang_CheatWhenNoOnesLooking +0x8680e6: kApplyRumble_X +0x8680ea: kApplyRumble_Y +0x8680ee: kApplyRumble_Yhi +0x8680f0: kApplyRumble_Xhi +0x8680f4: kApplyRumble_WH +0x8680fa: Prepare_ApplyRumbleToSprites +0x86812d: Sprite_SpawnImmediatelySmashedTerrain +0x86814b: Sprite_SpawnThrowableTerrain +0x868156: Sprite_SpawnThrowableTerrain_silently +0x8681f4: kSpawnSecretItems +0x86820a: kSpawnSecretItem_SpawnFlag +0x868220: kSpawnSecretItem_XLo +0x868236: kSpawnSecretItem_IgnoreProj +0x86824c: kSpawnSecretItem_ZVel +0x868264: Sprite_SpawnSecret +0x868328: Sprite_Main +0x8683c2: EasterEgg_BageCodeTrampoline +0x8683c7: kOam_ResetRegionBases +0x8683d3: Oam_ResetRegionBases +0x8683e6: Utility_CheckIfHitBoxesOverlap_ +0x8683ea: Sprite_SetupHitBox_ +0x8683f2: Sprite_TimersAndOam +0x8684b9: kSpritePrios +0x8684bd: Sprite_Get_16_bit_Coords_ +0x8684c1: Sprite_Get16BitCoords +0x8684da: Sprite_ExecuteSingle_ +0x8684e2: Sprite_ExecuteSingle +0x86850f: SpritePrep_ThrowableScenery +0x868510: Sprite_inactiveSprite +0x868526: SpriteActive_Main_ +0x86852e: SpriteModule_Fall1 +0x868543: SpriteBurn_Main_ +0x868548: SpriteExplode_Main_ +0x86854d: kSpriteDrown_Dmd +0x86858d: kSpriteDrown_Oam_Flags +0x868591: kSpriteDrown_Oam_Char +0x86859c: SpriteModule_Drown +0x86864d: SpriteModule_Initialize +0x868841: SpritePrep_Mantle +0x86884a: SpritePrep_MoveRight_8px +0x868854: SpritePrep_MedallionTablet_bounce +0x868859: SpritePrep_Switch +0x86886d: SpritePrep_SwitchFacingUp +0x86886e: SpritePrep_Snitch_bounce_1 +0x868873: SpritePrep_DoNothingA +0x868874: kSpriteRat_BumpDamage +0x868876: kSpriteRat_Health +0x868878: SpritePrep_Rat +0x868888: kSpriteKeese_BumpDamage +0x86888a: kSpriteKeese_Health +0x86888c: kSpriteKeese_Flags5 +0x86888e: SpritePrep_Keese +0x8688a4: kSpriteRope_BumpDamage +0x8688a6: kSpriteRope_Health +0x8688a8: kSpriteRope_Flags5 +0x8688aa: SpritePrep_Rope +0x8688c0: SpritePrep_Swamola +0x8688c7: SpritePrep_Blind +0x8688cf: SpritePrep_Ganon +0x8688d7: kHokbok_InitXvel +0x8688db: kHokbok_InitYvel +0x8688df: SpritePrep_Pokey +0x8688fd: SpritePrep_MiniVitreous +0x868901: SpritePrep_Gibo +0x86890c: kSprite_Octoballoon_Delay +0x868910: SpritePrep_Octoballoon +0x86891b: SpritePrep_AgahnimsBarrier +0x86892c: SpritePrep_Catfish +0x86893b: SpritePrep_CutsceneAgahnim +0x86894d: SpritePrep_Vitreous +0x868963: kSpriteRaven_BumpDamage +0x868965: kSpriteRaven_Health +0x868967: kSpriteRaven_Flags5 +0x868969: SpritePrep_Raven +0x86897e: SpritePrep_Vulture +0x868991: SpritePrep_Poe +0x86899b: SpritePrep_DoNothingC +0x86899c: SpritePrep_BlindMaiden +0x8689d3: SpritePrep_MiniMoldorm_bounce +0x8689d8: SpritePrep_Bomber +0x8689df: SpritePrep_BombShoppe +0x868a51: SpritePrep_BullyAndVictim +0x868a59: SpritePrep_PurpleChest +0x868a79: SpritePrep_Smithy +0x868af0: SpritePrep_Babasu +0x868af3: SpritePrep_Zoro +0x868b03: SpritePrep_LaserEye_bounce +0x868b08: SpritePrep_Popo +0x868b0c: SpritePrep_Popo2 +0x868b12: SpritePrep_Statue +0x868b1c: SpritePrep_Bari +0x868b2e: SpritePrep_GreenStalfos +0x868b34: SpritePrep_WaterLever +0x868b3e: SpritePrep_FireDebirando +0x868b4a: SpritePrep_DebirandoPit +0x868b7f: kDebirando_OamFlags +0x868b81: SpritePrep_WeakGuard +0x868b93: SpritePrep_WallCannon +0x868ba2: SpritePrep_ArrowGame_bounce +0x868ba7: SpritePrep_IgnoreProjectiles +0x868bab: SpritePrep_HauntedGroveAnimal +0x868bb2: SpritePrep_HauntedGroveOstritch +0x868bbf: SpritePrep_DiggingGameGuy_bounce +0x868bc4: SpritePrep_ThievesTownGrate +0x868bcf: SpritePrep_RupeePull +0x868be4: kShopKeeperWhere +0x868bf1: SpritePrep_Shopkeeper +0x868c37: SpritePrep_ShopKeeper_0 +0x868c43: SpritePrep_ShopKeeper_1 +0x868c5c: SpritePrep_ShopKeeper_2 +0x868c60: SpritePrep_ShopKeeper_3 +0x868c67: SpritePrep_ShopKeeper_4 +0x868c72: SpritePrep_ShopKeeper_5_7_8 +0x868c8b: SpritePrep_NiceThief_WithGift +0x868c91: SpritePrep_NiceThief_Desert +0x868c95: SpritePrep_NiceThief_Ice +0x868c99: kStoryTellerRooms +0x868c9e: SpritePrep_Storyteller +0x868cbe: kHumanMultiTypes +0x868cc1: SpritePrep_Adults +0x868cd5: SpritePrep_Whirlpool +0x868cde: SpritePrep_Sage +0x868cf0: kDashItemMask +0x868cf2: SpritePrep_BonkItem +0x868d46: SpritePrep_Kiki +0x868d59: SpritePrep_Locksmith +0x868d7f: SpritePrep_SickKid +0x868d8e: kGanonHelpers_OamFlags +0x868d90: kGanonHelpers_Health +0x868d92: kGanonHelpers_BumpDamage +0x868d94: SpritePrep_Tektite +0x868dc1: SpritePrep_Chainchomp_bounce +0x868dc6: SpritePrep_BigFairy +0x868dd1: SpritePrep_MrsSahasrahla +0x868dda: SpritePrep_MagicBat +0x868de0: SpritePrep_FortuneTeller +0x868de7: kLeever_OamFlags +0x868de9: SpritePrep_FairyPond +0x868dfd: SpritePrep_Hobo +0x868e30: SpritePrep_MasterSword +0x868e42: SpritePrep_Roller_HorizontalRightFirst +0x868e46: SpritePrep_RollerLeftRight +0x868e4f: SpritePrep_Roller_VerticalDownFirst +0x868e53: SpritePrep_RollerUpDown +0x868e6b: SpritePrep_Kodongo +0x868e85: SpritePrep_Spark +0x868ec1: SpritePrep_LostWoodsBird +0x868ed2: SpritePrep_LostWoodsSquirrel +0x868ef0: kBubble_Xvel +0x868ef2: SpritePrep_Antifairy +0x868f08: SpritePrep_FallingIce +0x868f0f: SpritePrep_KingZora +0x868f1c: Sprite_ReturnIfBossFinished +0x868f3f: SpritePrep_ArmosKnight +0x868f4d: SpritePrep_DesertStatue +0x868f6c: SpritePrep_DoNothingD +0x868f6d: kOctorock_BumpDamage +0x868f6f: kOctorock_Health +0x868f71: SpritePrep_Octorok +0x868f8a: SpritePrep_Moldorm_bounce +0x868f95: SpritePrep_Lanmolas_bounce +0x868f9d: SpritePrep_BigSpike +0x868fa2: SpritePrep_SwimmingZora +0x868fa7: SpritePrep_Geldman +0x868fb0: SpritePrep_Kyameron +0x868fc9: SpritePrep_WalkingZora +0x868fcf: SpritePrep_StandardGuard_indoors +0x868fd6: SpritePrep_StandardGuard +0x869001: SpritePrep_TrooperAndArcherSoldier +0x86903b: kSpriteSoldier_Tab0 +0x869043: SpritePrep_TalkingTree +0x869064: SpritePrep_CrystalSwitch +0x869075: SpritePrep_FluteKid +0x8690cc: SpritePrep_MoveDown_8px +0x8690d5: SpritePrep_Zazakku +0x8690d6: SpritePrep_PedestalPlaque +0x8690e0: SpritePrep_Stalfos +0x8690f0: SpritePrep_KholdstareShell +0x8690fa: SpritePrep_Kholdstare +0x869107: SpritePrep_Bumper +0x86910a: SpritePrep_MoveDown_8px_Right8px +0x869116: kHardHatBeetle_OamFlags +0x869118: kHardHatBeetle_Health +0x86911a: kHardHatBeetle_A +0x86911c: kHardHatBeetle_State +0x86911e: kHardHatBeetle_Flags5 +0x869120: kHardHatBeetle_BumpDamage +0x869122: SpritePrep_HardhatBeetle +0x869151: SpritePrep_MiniHelmasaur +0x86915c: SpritePrep_Fairy +0x86916a: SpritePrep_Absorbable +0x86916e: SpritePrep_OverworldBonkItem +0x869174: SpritePrep_ShieldPickup +0x869175: SpritePrep_NiceBee +0x869193: kAgahnim_OamFlags +0x869195: SpritePrep_Agahnim +0x8691ae: SpritePrep_DoNothingG +0x8691af: SpritePrep_Eyegore_bounce +0x8691b4: SpritePrep_FireBar +0x8691ba: SpritePrep_Trinexx +0x8691c5: SpritePrep_HelmasaurKing +0x8691cc: SpritePrep_FreeUpBossSegmentSlots +0x8691d7: SpritePrep_Spike +0x8691dc: SpritePrep_RockStal +0x8691e8: SpritePrep_Blob +0x8691f1: SpritePrep_Arrghus +0x8691fa: SpritePrep_Arrghi +0x86922f: SpritePrep_Mothula +0x869248: SpritePrep_AntifairyCircle_bounce +0x86924d: SpritePrep_DoNothingH +0x86924e: SpritePrep_BigKey +0x869256: SpritePrep_BigKey_load_graphics +0x869262: SpritePrep_SmallKey +0x869267: SpritePrep_KeySetItemDrop +0x869271: SpriteActive_Main +0x869283: kSpriteActiveRoutines +0x869469: Sprite_09_Moldorm_bounce +0x86946e: Sprite_00_Raven_bounce +0x869473: Sprite_01_Vulture_bounce +0x869478: kDeadRock_Gfx +0x869481: kDeadRock_OamFlags +0x86948a: Sprite_27_Deadrock +0x869500: kDeadRock_Xvel +0x869502: kDeadRock_Yvel +0x869506: Deadrock_Halted +0x869559: Deadrock_Walk +0x86958f: Deadrock_Stunned +0x8695c9: kSluggula_Gfx +0x8695d1: kSluggula_OamFlags +0x8695d9: Sprite_20_Sluggula +0x869615: kMoblin_Xvel +0x86961b: Sluggula_Normal +0x86964f: Sluggula_BreakFromBombing +0x869673: Sluggula_DropBomb +0x869686: kPoe_OamFlags +0x869688: Sprite_19_Poe +0x869715: kPoe_Accel +0x869719: kPoe_XvelTarget +0x86971d: kPoe_ZvelTarget +0x86971f: Poe_Halted +0x86973f: kPoe_Yvel +0x869741: Poe_SpookAround +0x86977e: kPoe_Draw_X +0x869782: kPoe_Draw_Char +0x869786: Poe_Draw +0x8697d8: kMoldorm_Xvel +0x8697e8: kMoldorm_Yvel +0x8697f8: kMoldorm_NextDir +0x869808: Sprite_18_MiniMoldorm +0x869860: MiniMoldorm_Readjust +0x86988d: MiniMoldorm_Meander +0x8698b2: MiniMoldorm_TargetLink +0x8698e0: kMoblin_Gfx +0x8698e4: Sprite_12_Moblin +0x869903: kMoblin_Delay +0x869907: Moblin_Halted +0x869930: kMoblin_Dirs +0x869938: Moblin_Walk +0x8699a9: kMoblin_Gfx2 +0x8699b1: Moblin_ThrowSpear +0x8699d9: kMoblinSpear_X +0x8699dd: kMoblinSpear_Y +0x8699e5: kMoblinSpear_Xvel +0x8699e7: kMoblinSpear_Yvel +0x8699eb: Moblin_MaterializeSpear +0x869a30: kMoblin_Dmd +0x869bb0: kMoblin_ObjOffs +0x869bbc: kMoblin_HeadChar +0x869bc0: kMoblin_HeadFlags +0x869bc4: Moblin_Draw +0x869c20: kSnapDragon_Gfx +0x869c24: Sprite_0E_Snapdragon +0x869c4b: kSnapDragon_Xvel +0x869c53: kSnapDragon_Yvel +0x869c5b: kSnapDragon_Delay +0x869c5f: Snapdragon_Halted +0x869ca9: Snapdragon_MoveAround +0x869d02: kSnapDragon_Dmd +0x869e02: SnapDragon_Draw +0x869e1f: Sprite_22_Ropa +0x869e44: Ropa_Halted +0x869e5d: Ropa_Pounce +0x869e85: kRopa_Dmd +0x869ee5: Ropa_Draw +0x869f05: Sprite_11_Hinox +0x869f30: kHinox_Gfx +0x869f38: kHinox_BombX +0x869f3c: kChicken_Avenger +0x869f40: kHinox_BombY +0x869f44: kHinox_BombXvel +0x869f46: kHinox_BombYvel +0x869f4a: Hinox_ThrowBomb +0x869fb6: kHinox_Xvel +0x869fb8: kHinox_Yvel +0x869fbc: Hinox_Halted +0x869fe1: Hinox_FaceLink +0x869fef: kHinox_RandomDirs +0x869ff7: Hinox_PickRandomDirection +0x86a004: Hinox_SetDirection +0x86a025: kHinox_WalkGfx +0x86a029: Hinox_Walk +0x86a1ed: kHinoxNum +0x86a1f9: Hinox_Draw +0x86a213: kHeartRefill_AccelX +0x86a215: kBari_Xvel2 +0x86a225: kBari_Yvel2 +0x86a235: kRedBari_SplitX +0x86a237: kRedBari_SplitXvel +0x86a239: kBari_Xvel +0x86a23b: kBari_Gfx +0x86a23d: Sprite_23_RedBari +0x86a26f: Sprite_Biri +0x86a342: set_electrocute_delay +0x86a34e: RedBari_Split +0x86a39c: kRedBari_Dmd +0x86a3dc: RedBari_Draw +0x86a3f9: kHelmasaur_Gfx +0x86a401: kHelmasaur_OamFlags +0x86a409: Sprite_13_MiniHelmasaur +0x86a460: Sprite_26_HardhatBeetle +0x86a46d: HelmasaurHardHatBeetleCommon +0x86a4d2: kHardHatBeetle_Dmd +0x86a4f2: HardHatBeetle_Draw +0x86a50c: Sprite_15_Antifairy +0x86a5c0: kChicken_OamFlags +0x86a5c2: Sprite_0B_Cucco +0x86a67f: Cucco_Calm +0x86a6b1: Chicken_Hopping +0x86a6e2: Cucco_AnimateFast +0x86a6e5: Chicken_IncrSubtype2_3 +0x86a6fc: Cucco_Flee +0x86a727: Cucco_DrawPANIC +0x86a72f: Sprite_DrawDistressSweat +0x86a733: Sprite_DrawDistress_custom +0x86a78e: Cucco_Carried +0x86a7b8: Cucco_DoMovement_XYZ +0x86a7bb: Cucco_DoMovement_XY +0x86a7c3: kSpriteDistress_X +0x86a7cb: kSpriteDistress_Y +0x86a7d3: Cucco_SummonAvenger +0x86a84c: BawkBawk +0x86a853: Sprite_MovableMantle__ +0x86a858: kRupeeCoveredGrab_Gfx +0x86a85c: kRupeeCoveredGrab_Xvel +0x86a860: kRupeeCoveredGrab_Yvel +0x86a864: kRupeeCrab_Xvel +0x86a868: kRupeeCrab_Yvel +0x86a86c: Sprite_17_Hoarder +0x86a874: Sprite_Hoarder_Covered +0x86a91d: Sprite_Hoarder_Frantic +0x86aa04: kRupeeCrab_Gfx +0x86aa08: kRupeeCrab_OamFlags +0x86aa0c: Sprite_CheckIfLifted_permissive +0x86aa14: Sprite_CheckIfLiftedPermissiveWrapper +0x86aa18: kCoveredRupeeCrab_DrawY +0x86aa30: kCoveredRupeeCrab_DrawChar +0x86aa3c: kCoveredRupeeCrab_DrawFlags +0x86aa48: CoveredRupeeCrab_Draw +0x86aabe: kThrowableScenery_Char +0x86aaca: kThrowableScenery_Flags +0x86aae0: Sprite_EC_ThrownItem +0x86ab5a: kThrowableScenery_DrawLarge_X +0x86ab62: kThrowableScenery_DrawLarge_Y +0x86ab6a: kThrowableScenery_DrawLarge_Flags +0x86ab6e: kThrowableScenery_DrawLarge_X2 +0x86ab74: kThrowableScenery_DrawLarge_OamFlags +0x86ab76: SpriteDraw_ThrownItem_Gigantic +0x86ac31: kScatterDebris_X +0x86ac35: kScatterDebris_XHi +0x86ac39: kScatterDebris_Y +0x86ac3d: kScatterDebris_YHi +0x86ac41: ThrowableScenery_ScatterIntoDebris +0x86ad03: Entity_ApplyRumbleToSprites +0x86ad50: Sprite_TransmuteToBomb +0x86ad6f: Sprite_28_DarkWorldHintNPC +0x86ad9a: Sprite_DarkWorldHintNPC_Bird +0x86ada7: DarkWorldHintNPC_Idle +0x86adb5: DarkWorldHintNPC_RestoreHealth +0x86adbf: HintBird_TellStory +0x86ade1: Sprite_HamburgerHelper +0x86adee: Sprite_StoryTeller_Case1_Inner +0x86ae0a: Sprite_DarkWorldHintNPC_Octopus +0x86ae17: Sprite_HintOctopus_TellStory +0x86ae34: Sprite_Broccoli +0x86ae5b: Sprite_Watto +0x86ae8e: Sprite_Watto_TellStory +0x86aeab: DarkWorldHintNPC_HandlePayment +0x86aeca: kStoryTeller_Dmd +0x86af1a: StoryTeller_1_Draw +0x86af3b: Sprite_2E_FluteKid +0x86af46: FluteKid_TheKid +0x86af51: FluteKid_Human +0x86af93: FluteKid_Chillin +0x86afc1: FluteKid_AboutToDisappear +0x86aff2: FluteKid_PhaseOut +0x86b008: FluteKid_HeDisappeared +0x86b019: kFluteAardvark_Gfx +0x86b02d: kFluteAardvark_Delay +0x86b040: Sprite_FluteKid_Stumpy +0x86b05a: Stumpy_Initialize +0x86b06c: Stumpy_Supplicate +0x86b07a: FluteAardvark_GetMeMyDamnFlute +0x86b083: Stumpy_ThanksButYouKeepIt +0x86b098: Stumpy_SorryButAmTree +0x86b09e: Stumpy_WaitForConvo +0x86b0bb: Stumpy_GiveShovel +0x86b0ca: Stumpy_WaitForMusic +0x86b0e9: Stumpy_BecomeTree +0x86b11e: Stumpy_AmTree +0x86b12e: FluteKid_CheckIfInRange +0x86b171: kFluteNote_Xv +0x86b173: Sprite_FluteKid_Quaver +0x86b1a5: FluteKid_SpawnQuaver +0x86b1de: kSmithy_Gfx +0x86b1e6: kSmithy_B +0x86b1ee: Sprite_1A_Smithy +0x86b1fd: Smithy_Homecoming +0x86b20e: kReturningSmithy_Delay +0x86b210: kReturningSmithy_Dir +0x86b213: kReturningSmithy_Xvel +0x86b217: kReturningSmithy_Yvel +0x86b21b: Smithy_Homecoming_Walk +0x86b255: Smithy_Homecoming_TYVM +0x86b274: Smithy_Frog +0x86b2c0: kReturningSmithy_Dmd +0x86b300: kReturningSmithy_Dma +0x86b308: ReturningSmithy_Draw +0x86b331: kSmithyFrog_Dmd +0x86b339: SmithyFrog_Draw +0x86b34e: Smithy_Main +0x86b3e3: Smithy_Smithing +0x86b43d: Smithy_ListenForHammer +0x86b45f: Smithy_WannaTemper +0x86b47c: Smithy_ForRealsies +0x86b4ad: Smithy_ItAintFreeKid +0x86b50e: Smithy_TemperInProgress +0x86b548: Smithy_GiveTemperedSword +0x86b56a: Smithy_SpawnFriend +0x86b59d: Smithy_CopiouslyThankful +0x86b5a6: Smithy_SpawnDwarfPal +0x86b5d3: kSmithy_Draw +0x86b673: Smithy_Draw +0x86b696: kSmithySpark_Gfx +0x86b69d: kSmithySpark_Delay +0x86b6a3: Smithy_Spark +0x86b6cd: Smithy_SpawnSpark +0x86b6fc: kSmithySpark_Dmd +0x86b72c: SmithySpark_Draw +0x86b74a: kEnemyArrow_Xvel +0x86b74c: kEnemyArrow_Yvel +0x86b754: Sprite_1B_Arrow +0x86b7c3: kEnemyArrow_Dirs +0x86b807: kEnemyArrow_Draw_X +0x86b817: kEnemyArrow_Draw_Y +0x86b827: kEnemyArrow_Draw_Char +0x86b847: kEnemyArrow_Draw_Flags +0x86b867: EnemyArrow_Draw +0x86b8ce: kCrystalSwitchPal +0x86b8d0: Sprite_1E_CrystalSwitch +0x86b94c: Sprite_1F_SickKid +0x86b962: SickKid_ISleep +0x86b991: kBugNetKid_Gfx +0x86b999: kBugNetKid_Delay +0x86b9a0: SickKid_RealShit +0x86b9c6: SickKid_NothingButNet +0x86b9d8: SickKid_OutOfShaqMemes +0x86b9e6: kPushSwitch_Delay +0x86b9f0: kPushSwitch_Dir +0x86b9fa: Sprite_21_WaterSwitch +0x86ba10: WaterSwitch_Untoggled +0x86ba33: WaterSwitch_ReleaseGate +0x86ba62: kPushSwitch_Oam +0x86bb02: kPushSwitch_WH +0x86bb22: PushSwitch_Draw +0x86bcac: Sprite_39_Locksmith +0x86bcc9: LockSmith_Chillin +0x86bd01: LockSmith_FollowLink +0x86bd20: LockSmith_OfferService +0x86bd46: LockSmith_RespondToAnswer +0x86bd8a: MiddleAgedMan_PromiseReminder +0x86bd93: MiddleAgedMan_SilenceDueToOtherTagalong +0x86bd9c: kMiddleAgedMan_Dmd +0x86bdac: MiddleAgedMan_Draw +0x86bdc1: Sprite_2B_Hobo +0x86bdd0: Sprite_Hobo_Bum +0x86bdfa: Hobo_Sleep +0x86be2a: kHobo_Gfx +0x86be32: kHobo_Delay +0x86be39: Hobo_Awoken +0x86be5f: Hobo_GiveBottle +0x86be89: Hobo_BackToSleep +0x86be9d: SpritePrep_Hobo_SpawnSmoke +0x86beb4: Sprite_Hobo_Bubble +0x86beed: Hobo_SpawnBubble +0x86bf15: Sprite_Hobo_Fire +0x86bf4b: SpritePrep_Hobo_SpawnFire +0x86bf7d: kHoboSmoke_OamFlags +0x86bf81: Sprite_Hobo_Smoke +0x86bfaf: Hobo_SpawnSmoke +0x86bfe0: Sprite_73_UncleAndPriest_bounce +0x86bfe5: SpritePrep_UncleAndPriest_bounce +0x86bfea: SpriteModule_Active_bounce +0x86bfef: SpriteActive3_Trampoline +0x86bff4: SpriteActive4_Trampoline +0x86bff9: SpritePrep_OldMan_bounce +0x86bffe: Sprite_TutorialGuardOrBarrier_bounce +0x86c003: Sprite_PullSwitch_ +0x86c008: Sprite_SomariaPlatformAndPipe_bounce +0x86c00d: Sprite_F2_MedallionTablet_bounce +0x86c012: Sprite_32_ArguingBros_bounce +0x86c017: Sprite_33_RupeePull_bounce +0x86c01c: Sprite_14_ThievesTownGrate_bounce +0x86c021: Sprite_34_YoungSnitch_bounce +0x86c026: SpritePrep_Snitch_bounce_2 +0x86c02b: Sprite_35_Innkeeper_bounce +0x86c030: SpritePrep_Snitch_bounce_3 +0x86c035: Sprite_36_Witch_bounce +0x86c03a: Sprite_37_Waterfall_bounce +0x86c03f: Sprite_38_EyeStatue_bounce +0x86c044: Sprite_3A_MagicBat_bounce +0x86c049: Sprite_3B_BonkItem_bounce +0x86c04e: Sprite_3C_KidInKak_bounce +0x86c053: Sprite_3D_OldSnitch_bounce +0x86c058: Sprite_74_RunningBoy_bounce +0x86c05d: SpritePrep_RunningBoy_bounce +0x86c062: Sprite_75_BottleMerchant_bounce +0x86c067: Sprite_76_Zelda_bounce +0x86c06c: SpritePrep_Zelda_bounce +0x86c071: Sprite_78_MrsSahasrahla_bounce +0x86c076: Sprite_E7_Mushroom_bounce +0x86c07b: SpritePrep_Mushroom_bounce +0x86c080: Sprite_E8_FakeMasterSword_bounce +0x86c085: SpritePrep_FakeMasterSword_bounce +0x86c08a: Sprite_16_Elder_bounce +0x86c08f: Sprite_E9_MagicShopAssistant_bounce +0x86c094: SpritePrep_MagicShopAssistant_bounce +0x86c099: Sprite_EA_HeartContainer_bounce +0x86c09e: SpritePrep_HeartContainer_bounce +0x86c0a3: Sprite_EB_HeartPiece_bounce +0x86c0a8: SpritePrep_HeartPiece +0x86c0ad: Sprite_2E_FluteKid_bounce +0x86c0b2: Sprite_2D_TelepathicTile_bounce +0x86c0b7: Sprite_29_Adult_bounce +0x86c0bc: Sprite_2A_SweepingLady_bounce +0x86c0c1: Sprite_2C_Lumberjacks_bounce +0x86c0c6: Sprite_31_FortuneTeller_bounce +0x86c0cb: Sprite_2F_RaceGameLady_bounce +0x86c0d0: Sprite_30_RaceGameGuy_bounce +0x86c0d5: Sprite_25_TalkingTree_bounce +0x86c0da: kMovableStatue_Dir +0x86c0de: kMovableStatue_Joypad +0x86c0e2: kMovableStatue_Xvel +0x86c0e4: kMovableStatue_Yvel +0x86c0e8: Sprite_1C_Statue +0x86c172: else_1 +0x86c1f7: kMovableStatue_SwitchX +0x86c1fb: kMovableStatue_SwitchY +0x86c203: Statue_CheckForSwitch +0x86c24c: kMovableStatue_Dmd +0x86c264: MovableStatue_Draw +0x86c277: Statue_BlockSprites +0x86c2e5: Sprite_1D_FluteQuest +0x86c309: kWishPond_X +0x86c311: kWishPond_Y +0x86c319: Sprite_72_FairyPond +0x86c41d: Sprite_WishPond2 +0x86c44c: Sprite_HappinessPond +0x86c471: kWishPond2_Dmd +0x86c4b5: WishPond2_Draw +0x86c4fd: Sprite_FairyPond_WaitForLink +0x86c523: kHapinessPondCost +0x86c527: kHapinessPondCostHex +0x86c52b: Sprite_LakeHyliaFairy_WaitForLink +0x86c570: Sprite_LakeHyliaFairy_BegForDonation +0x86c59f: Sprite_LakeHyliaFairy_AcceptDonation +0x86c603: Sprite_LakeHyliaFairy_WaitForDonation +0x86c616: Sprite_LakeHyliaFairy_SpawnFairy +0x86c665: Sprite_LakeHyliaFairy_Greetings +0x86c691: Sprite_LakeHyliaFairy_OfferUpgrade +0x86c6a0: Sprite_LakeHyliaFairy_UpgradeBombs +0x86c6d2: Sprite_LakeHyliaFairy_RevertTranslucency +0x86c6e7: Sprite_LakeHyliaFairy_DeleteFairy +0x86c70e: Sprite_LakeHyliaFairy_RestoreAndReset +0x86c721: Sprite_LakeHyliaFairy_UpgradeArrows +0x86c763: Sprite_LakeHyliaFairy_GiveDonationStatus +0x86c76f: kHappinessPondLuckMsg +0x86c777: kHappinessPondLuck +0x86c77b: LakeHyliaFairy_GrantLuck +0x86c7a1: Sprite_UpgradeFairy_WaitForLink +0x86c7c6: Sprite_UpgradeFairy_OfferItemToss +0x86c7ed: Sprite_UpgradeFairy_HandleItemToss +0x86c83c: Sprite_UpgradeFairy_SpawnFairy +0x86c88b: Sprite_UpgradeFairy_AskWhoDidThis +0x86c8b7: Sprite_UpgradeFairy_HandleAnswer +0x86c8c6: Sprite_UpgradeFairy_HandleUpgrade +0x86c952: Sprite_UpgradeFairy_Retreat +0x86c97a: Sprite_UpgradeFairy_FixPalettes +0x86c9a1: Sprite_UpgradeFairy_HandleItemReceipt +0x86c9be: kWishPondMsgs +0x86c9c8: Sprite_UpgradeFairy_FinalGoodBye +0x86c9e5: Sprite_UpgradeFairy_YouLiar +0x86c9f1: Sprite_UpgradeFairy_SecondChance +0x86ca00: Sprite_UpgradeFairy_DebaseLink +0x86ca0e: kFaerieQueen_Draw_X +0x86ca26: kFaerieQueen_Draw_Y +0x86ca3e: kFaerieQueen_Draw_Char +0x86ca56: kFaerieQueen_Draw_Flags +0x86ca6e: kFaerieQueen_Draw_Ext +0x86ca86: kFaerieQueen_Dmd +0x86cb26: FaerieQueen_Draw +0x86cba2: Sprite_71_Leever +0x86cbd8: Leever_Underground +0x86cbf5: UNREACHABLE_06CBFD +0x86cc03: kLeever_EmergeGfx +0x86cc13: Leever_Emerge +0x86cc37: kLeever_AttackGfx +0x86cc3a: kLeever_AttackSpd +0x86cc3c: Leever_Attack +0x86cc7a: kLeever_SubmergeGfx +0x86cc8a: Leever_Dig +0x86ccaf: kLeever_Draw_X +0x86cd1f: kLeever_Draw_Y +0x86cd8f: kLeever_Draw_Char +0x86cdc7: kLeever_Draw_Flags +0x86cdff: kLeever_Draw_Ext +0x86ce37: kLeever_Draw_Num +0x86ce45: Leever_Draw +0x86cec0: Sprite_D8_Heart +0x86cf0a: HeartRefill_InitializeAscent +0x86cf20: HeartRefill_BeginDescending +0x86cf35: kHeartRefill_VelTarget +0x86cf37: HeartRefill_GlideGroundward +0x86cf5a: Sprite_ZeroVelocity_XYZ +0x86cf5d: Sprite_ZeroVelocity_XY +0x86cf64: Sprite_HandleDraggingByAncilla +0x86cf94: Sprite_E3_Fairy +0x86cfbb: Fairy_Prancing +0x86cfe4: Fairy_HandleCapture +0x86d011: Fairy_CheckIfTouchable +0x86d030: kAbsorbBigKey +0x86d032: Sprite_E4_SmallKey +0x86d04a: Sprite_D9_GreenRupee +0x86d051: Sprite_Absorbable_Main +0x86d0ed: Sprite_ReturnIfPhasingOut +0x86d116: Sprite_CheckAbsorptionByPlayer +0x86d125: Sprite_HandleAbsorptionByPlayer_ +0x86d12d: kAbsorptionSfx +0x86d13c: Sprite_HandleAbsorptionByPlayer +0x86d170: Absorb_Shield +0x86d178: Absorb_BigKey +0x86d1a5: Absorb_Fairy +0x86d1af: Absorb_Heart +0x86d1bb: kRupeesAbsorption +0x86d1be: Absorb_Rupee +0x86d1d5: kBombsAbsorption +0x86d1d8: Absorb_Bomb +0x86d1e8: Absorb_SmallMagic +0x86d1f8: Absorb_Arrows_5 +0x86d20d: kAbsorbable_Tab1 +0x86d21c: kAbsorbable_Tab2 +0x86d22f: SpriteDraw_AbsorbableTransient +0x86d232: Sprite_DrawAbsorbable_nontransient +0x86d28a: kNumberedAbsorbable_X +0x86d2ae: kOctorock_OamFlags +0x86d2b2: kNumberedAbsorbable_Y +0x86d2d6: kNumberedAbsorbable_Char +0x86d2e8: kNumberedAbsorbable_Ext +0x86d2fa: Sprite_DrawNumberedAbsorbable +0x86d363: kOctorock_Dir +0x86d367: kOctorock_Xvel +0x86d36b: kOctorock_Yvel +0x86d36f: kOctorock_Delays +0x86d377: Sprite_08_Octorok +0x86d451: kOctorock_Tab0 +0x86d465: kOctorock_Tab1 +0x86d46f: Octorok_ShootSingle +0x86d486: kOctorock_NextDir +0x86d48a: Octorok_Shoot4Ways +0x86d4b5: kOctorock_Spit_X +0x86d4bd: kOctorock_Spit_Y +0x86d4c5: kOctorock_Spit_Xvel +0x86d4c9: kOctorock_Spit_Yvel +0x86d4cd: Octorok_FireLoogie +0x86d514: kOctorock_Draw_X +0x86d526: kOctorock_Draw_Y +0x86d538: kOctorock_Draw_Char +0x86d541: kOctorock_Draw_Flags +0x86d54a: Octorock_Draw +0x86d5b9: Sprite_0C_OctorokStone +0x86d5f3: kOctostone_Draw_X +0x86d613: kOctostone_Draw_Y +0x86d633: kOctostone_Draw_Flags +0x86d643: SpriteDraw_OctorokStoneCrumbling +0x86d6a2: kSprite_Octoballoon_Z +0x86d6aa: Sprite_0F_Octoballoon +0x86d72b: Octoballoon_RecoilLink +0x86d73c: kOctoballoon_Draw_X +0x86d754: kOctoballoon_Draw_Y +0x86d76c: kOctoballoon_Draw_Char +0x86d778: kOctoballoon_Draw_Flags +0x86d784: Octoballoon_Draw +0x86d802: kOctoballoon_Spawn_Xv +0x86d808: kOctoballoon_Spawn_Yv +0x86d80e: Octoballoon_FormBabby +0x86d853: Sprite_10_OctoballoonBaby +0x86d88b: Sprite_CheckDamageBoth___ +0x86d892: kBuzzBlob_Gfx +0x86d896: kBuzzBlob_ObjPrio +0x86d89a: Sprite_0D_Buzzblob +0x86d8ee: kBuzzBlob_Xvel +0x86d8f6: kBuzzBlob_Yvel +0x86d8fe: kBuzzBlob_Delay +0x86d906: Buzzblob_SelectNewDirection +0x86d920: kBuzzBlob_DrawX +0x86d926: kBuzzBlob_DrawY +0x86d92c: kBuzzBlob_DrawChar +0x86d93e: kBuzzBlob_DrawFlags +0x86d950: kBuzzBlob_DrawExt +0x86d953: BuzzBlob_Draw +0x86d9c0: Sprite_BounceOffWall +0x86d9d5: Sprite_InvertSpeed_XY +0x86d9e2: Sprite_InvertSpeed_Y +0x86d9ec: Sprite_ReturnIfInactive +0x86d9f3: Sprite_ReturnIfPaused +0x86da09: kSprite_PrepAndDrawSingleLarge_Tab2 +0x86db04: kSprite_PrepAndDrawSingleLarge_Tab1 +0x86dbf0: Sprite_PrepAndDrawSingleLarge_ +0x86dbf8: Sprite_PrepAndDrawSingleSmall_ +0x86dc10: SpriteDraw_SingleLarge +0x86dc13: Sprite_PrepAndDrawSingleLargeNoPrep +0x86dc54: Sprite_DrawShadow_ +0x86dc5c: SpriteDraw_Shadow_custom +0x86dc64: SpriteDraw_Shadow +0x86dc66: Sprite_DrawShadowEx_ +0x86dcef: SpriteDraw_SingleSmall +0x86dd38: Sprite_DrawKey_ +0x86dd40: Sprite_DrawThinAndTall +0x86ddaf: kStalfosHead_OamFlags +0x86ddb3: kStalfosHead_Gfx +0x86ddb7: Sprite_02_StalfosHead +0x86de4d: kSpriteHeld_X +0x86de6d: kSpriteHeld_Z +0x86de7d: kSpriteHeld_ZForFrame +0x86de83: SpriteModule_Carried +0x86df61: kSpriteHeld_Throw_Xvel +0x86df65: kSpriteHeld_Throw_Yvel +0x86df69: kSpriteHeld_Throw_Zvel +0x86df6d: CarriedSprite_CheckForThrow +0x86dff2: ThrownSprite_TileAndPeerInteraction_ +0x86dffa: SpriteModule_Stunned +0x86e02a: ThrownSprite_TileAndSpriteInteraction +0x86e0ab: Sprite_Func8 +0x86e0f6: Sprite_Func22 +0x86e164: ThrowableScenery_InteractWithSpritesAndTiles +0x86e172: ThrownSprite_CheckDamageToSprites +0x86e1b2: ThrownSprite_CheckDamageToSingleSprite +0x86e229: Sprite_ApplyRicochet +0x86e22f: ThrowableScenery_TransmuteIfValid +0x86e239: ThrowableScenery_TransmuteToDebris +0x86e25a: Sprite_ScheduleForBreakage +0x86e26e: Sprite_HalveSpeed_XY +0x86e27d: kSprite_Func21_Sfx +0x86e286: Sprite_SpawnLeapingFish +0x86e2a7: kSparkleGarnish_XY +0x86e2ab: kSparkleGarnish_HighXY +0x86e2af: kSpriteStunned_Main_Func1_Masks +0x86e2b6: HandleFreezeAndStunTimer +0x86e2ba: SpriteStunned_Main_Func1 +0x86e343: kSpritePoof_X +0x86e353: kSpritePoof_Y +0x86e363: kSpritePoof_Char +0x86e373: kSpritePoof_Flags +0x86e383: kSpritePoof_Ext +0x86e393: SpriteModule_Poof +0x86e416: Sprite_PrepOamCoord +0x86e41a: Sprite_PrepOamCoordSafeWrapper +0x86e41e: Sprite_PrepOamCoordOrDoubleRet +0x86e496: Sprite_CheckTileCollision_ +0x86e4a1: Sprite_CheckTileCollision_set_layer +0x86e4a8: Sprite_CheckTileCollision_check_just_one +0x86e4ab: Sprite_CheckTileCollision2 +0x86e4db: Sprite_CheckTileCollisionSingleLayer +0x86e5b8: Sprite_CheckForTileInDirection_horizontal +0x86e5ee: Sprite_CheckForTileInDirection_vertical +0x86e624: SpriteFall_AdjustPosition +0x86e64b: kSprite_Func5_X +0x86e6b7: kSprite_Func5_Y +0x86e723: kSprite_Func7_Tab +0x86e72f: Sprite_CheckTileInDirection +0x86e73c: Sprite_CheckTileProperty +0x86e87b: GetTileAttribute +0x86e883: Sprite_GetTileAttribute +0x86e886: Entity_GetTileAttr_ +0x86e8d6: kSlopedTile +0x86e8f6: Sprite_CheckSlopedTileCollision +0x86e8fe: Entity_CheckSlopedTileCollision +0x86e92c: Sprite_MoveXY +0x86e932: Sprite_MoveX +0x86e93e: Sprite_MoveY +0x86e96c: Sprite_MoveZ +0x86e98e: Sprite_ProjectSpeedTowardsLink_instantexit +0x86e991: Sprite_ProjectSpeedTowardsLink +0x86ea04: Sprite_ApplySpeedTowardsLink +0x86ea12: Sprite_ApplySpeedTowardsPlayer_ +0x86ea1a: Sprite_ProjectSpeedTowardsPlayer_ +0x86ea22: Sprite_ProjectSpeedTowardsEntity_ +0x86ea2a: Sprite_ProjectSpeedTowardsLocation_fastexit +0x86ea2d: Sprite_ProjectSpeedTowardsLocation +0x86eaa0: Sprite_DirectionToFacePlayer_ +0x86eaa4: Sprite_DirectionToFaceLink +0x86eacd: Sprite_IsToRightOfPlayer__ +0x86ead1: Sprite_IsRightOfLink +0x86eae4: Sprite_IsBelowPlayer_ +0x86eae8: Sprite_IsBelowLink +0x86eb0a: Sprite_IsRightOfLocation +0x86eb1d: Sprite_IsBelowLocation +0x86eb30: Sprite_DirectionToFaceLocation +0x86eb5e: Guard_ParrySwordAttacks +0x86eb66: kSprite_Func1_Tab +0x86eb6e: kSprite_Func1_Tab2 +0x86eb76: Sprite_Func1_ +0x86ec02: Sprite_AttemptZapDamage +0x86ec5c: Medallion_CheckSpriteDamage +0x86ec7e: kAncilla_Damage +0x86ecb7: Ancilla_CheckDamageToSprite +0x86ecbd: Ancilla_CheckDamageToSprite_aggressive +0x86ece0: Ancilla_CheckDamageToSprite_preset +0x86ed25: Sprite_Func15 +0x86ed33: kSprite_Func14_Damage +0x86ed3f: Sprite_CalculateSwordDamage +0x86ed89: Sprite_ApplyCalculatedDamage +0x86edc5: AgahnimBalls_DamageAgahnim +0x86edcb: Sprite_Func18 +0x86eec8: Sprite_MiniMoldorm_Recoil +0x86ef5c: kHitTimer24StunValues +0x86efda: Sprite_Func3 +0x86f025: is_0f +0x86f0ac: Trinexx_ScheduleSideHeadForDeath +0x86f121: Sprite_CheckDamageToPlayer_ +0x86f129: Sprite_CheckDamageToPlayerSameLayer_ +0x86f131: Sprite_CheckDamageToPlayerIgnoreLayer_ +0x86f139: kSprite_ReturnIfLifted_Dirs +0x86f13d: kSpriteDamage_Tab2 +0x86f141: kSpriteDamage_Tab3 +0x86f145: Sprite_CheckDamageToLink +0x86f14a: Sprite_CheckDamageToPlayer_1 +0x86f154: Sprite_CheckDamageToLink_same_layer +0x86f15c: Sprite_CheckDamageToLink_ignore_layer +0x86f1f6: Sprite_SetupHitBox00 +0x86f228: Sprite_ReturnIfLifted +0x86f257: Sprite_ReturnIfLiftedPermissive +0x86f2aa: Sprite_CheckDamageFromPlayer_ +0x86f2b4: Sprite_CheckDamageFromLink +0x86f3ca: Sprite_AttemptDamageToLinkWithCollisionCheck +0x86f3db: Sprite_AttemptDamageToLinkPlusRecoil +0x86f41f: Sprite_AttemptDamageToPlayerPlusRecoil_ +0x86f427: kPlayerDamages +0x86f445: Sprite_RecoilLinkAndTHUMP +0x86f46d: kPlayer_SetupActionHitBox_Tab0 +0x86f4ae: kPlayer_SetupActionHitBox_Tab1 +0x86f4ef: kPlayer_SetupActionHitBox_Tab2 +0x86f530: kPlayer_SetupActionHitBox_Tab3 +0x86f571: kPlayer_SetupActionHitBox_Tab4 +0x86f57e: SetupActionHitBox +0x86f586: kPlayerActionBoxRun_YHi +0x86f588: kPlayerActionBoxRun_XLo +0x86f58c: kPlayerActionBoxRun_XHi +0x86f590: kPlayerActionBoxRun_YLo +0x86f594: SetupActionHitBox_spinning +0x86f5b7: SetupActionHitBox_dashing +0x86f5e0: Player_SetupActionHitBox +0x86f645: Sprite_DoHitBoxesFast +0x86f688: Sprite_ApplyRecoilToLink +0x86f69f: Link_PlaceWeaponTink +0x86f6ca: Sprite_PlaceWeaponTink +0x86f6d5: Sprite_PlaceRupulseSpark_2 +0x86f705: Link_SetupHitBox_conditional +0x86f70a: Link_SetupHitBox +0x86f72f: kSpriteHitbox_XLo +0x86f74f: kSpriteHitbox_XHi +0x86f76f: kSpriteHitbox_XSize +0x86f78f: kSpriteHitbox_YLo +0x86f7af: kSpriteHitbox_YHi +0x86f7cf: kSpriteHitbox_YSize +0x86f7ef: Sprite_SetupHitBox +0x86f836: CheckIfHitBoxesOverlap +0x86f864: OAM_AllocateDeferToPlayer_ +0x86f86c: Oam_AllocateDeferToPlayer +0x86f8a2: SpriteModule_Die +0x86f8c9: SpriteDeath_MainEx_true +0x86f917: SpriteDeath_Func1_ +0x86f91f: kPikitDropItems +0x86f923: Sprite_DoTheDeath +0x86f9bc: ForcePrizeDrop +0x86f9bd: SpriteDeath_Func2_argInA +0x86f9d1: PrepareEnemyDrop +0x86fa22: SpriteDeath_Func4_Tmp +0x86fa25: SpriteDeath_Func4 +0x86fa54: SpriteDeath_Func2_ +0x86fa5c: kPrizeMasks +0x86fa63: kPrizeZ +0x86fa72: kPrizeItems +0x86faaa: kPerishOverlay_X +0x86faca: kPerishOverlay_Y +0x86faea: kPerishOverlay_Char +0x86fb0a: kPerishOverlay_Flags +0x86fb2a: SpriteDeath_DrawPoof +0x86fb96: kSpriteFall_Tab1 +0x86fbb6: kSpriteFall_Tab2 +0x86fbd6: kSpriteFall_Tab3 +0x86fbe6: kSpriteFall_Tab4 +0x86fbea: SpriteModule_Fall2 +0x86fcb7: kSpriteDrawFall0Data +0x86fd17: SpriteDraw_FallingHelmaBeetle +0x86fd43: kSpriteDrawFall1_X +0x86fd7b: kSpriteDrawFall1_Y +0x86fdb3: kSpriteDrawFall1_Char +0x86fdeb: kSpriteDrawFall1_Flags +0x86fe23: kSpriteDrawFall1_Ext +0x86fe5b: SpriteDraw_FallingHumanoid +0x86feb4: Sprite_CorrectOamEntries_ +0x86febc: Sprite_CorrectOamEntries +0x86ff26: Sprite_GetScreenRelativeCoords +0x86ff49: Sprite_CheckIfOnScreenX +0x86ff56: Sprite_CheckIfOnScreenY +0x86ff6d: UNREACHABLE_06FF73 +0x86ff72: kSprite_ReturnIfRecoiling_Masks +0x86ff78: Sprite_ReturnIfRecoiling +0x878000: Link_Main +0x878021: PlaySfx_Set1 +0x878028: PlaySfx_Set2 +0x87802f: PlaySfx_Set3 +0x878036: PlaySfx_SetPan +0x878041: kPlayerHandlers +0x87807f: Link_ControlHandler +0x878109: LinkState_Default +0x878130: HandleLink_From1D +0x8781a0: PlayerHandler_00_Ground_3 +0x8782d8: return_false_loc_8782D8 +0x8782da: Link_HandleBunnyTransformation +0x878365: LinkState_TemporaryBunny +0x8783a1: PlayerHandler_17_Bunny +0x8783c7: LinkState_Bunny_recache +0x8783fa: Link_TempBunny_Func2 +0x878481: LinkState_HoldingBigRock +0x87855a: EtherTablet_StartCutscene +0x878570: LinkState_ReceivingEther +0x8785e5: BombosTablet_StartCutscene +0x8785fb: LinkState_ReceivingBombos +0x87866d: InitiateDesertCutscene +0x87867b: LinkState_ReadingDesertTablet +0x878689: HandleSomariaAndGraves +0x8786b5: LinkState_Recoil +0x878711: Link_HandleRecoilAndTimer +0x8787db: Player_HandleIncapacitated_MiddleEntry +0x878872: LinkState_OnIce +0x878926: Link_HandleChangeInZVelocity +0x878932: Player_ChangeZ +0x87894e: LinkHop_HoppingSouthOW +0x878a05: LinkState_HandlingJump +0x878ac9: kLink_DoMoveXCoord_Outdoors_Helper2_y +0x878acd: kLink_DoMoveXCoord_Outdoors_Helper2_y2 +0x878ad1: LinkHop_FindTileToLandOnSouth +0x878b74: LinkState_HoppingHorizontallyOW +0x878b8b: kLink_DoMoveXCoord_Outdoors_Helper2_z +0x878b93: kLink_DoMoveXCoord_Outdoors_Helper2_velx +0x878b9b: Link_HoppingHorizontally_FindTile_Y +0x878c44: Link_SetToDeepWater +0x878c69: LinkState_0F +0x878cef: kLink_DoMoveXCoord_Outdoors_Helper1_tab1 +0x878cf3: kLink_DoMoveXCoord_Outdoors_Helper1_tab2 +0x878cf7: kLink_DoMoveXCoord_Outdoors_Helper1_tab3 +0x878cfb: kLink_DoMoveXCoord_Outdoors_Helper1_velx +0x878d13: kLink_DoMoveXCoord_Outdoors_Helper1_velz +0x878d2b: Link_HoppingHorizontally_FindTile_X +0x878dc6: LinkState_HoppingDiagonallyUpOW +0x878dfd: kLedgeVelX +0x878e15: LinkState_HoppingDiagonallyDownOW +0x878e6d: kLink_Ledge_Func1_dx +0x878e71: kLink_Ledge_Func1_dy +0x878e75: kLink_Ledge_Func1_dy2 +0x878e79: kLink_Ledge_Func1_bits +0x878e7b: LinkHop_FindLandingSpotDiagonallyDown +0x878f1d: Link_SplashUponLanding +0x878f61: kDashTab2 +0x878f65: kDashTab1 +0x878f68: kTagalongArr1 +0x878f77: kTagalongArr2 +0x878f86: LinkState_Dashing +0x87915e: LinkState_ExitingDash +0x879195: Link_CancelDash +0x8791b9: Player_HaltDashAttack_ +0x8791bd: kDashTab6Y +0x8791c1: kDashTab6X +0x8791c5: kDashTabSw11Y +0x8791c9: kDashTabSw11X +0x8791cd: kDashTabSw7Y +0x8791dd: kDashTabSw7X +0x8791ed: kDashTabDir +0x8791f1: RepelDash +0x879222: LinkApplyTileRebound +0x879291: Sprite_RepelDash +0x8792a0: Flag67WithDirections +0x8792bf: kFallHoleDirs2 +0x8792c7: kFallHoleDirs +0x8792cf: kFallHolePitDirs +0x8792d3: LinkState_Pits +0x8794f1: HandleLayerOfDestination +0x879502: DungeonPitDoDamage +0x879520: HandleDungeonLandingFromPit +0x879635: kSwimmingTab1 +0x879639: swim_240 +0x87963b: PlayerHandler_04_Swimming +0x879715: Link_HandleSwimMovements +0x879785: Link_FlagMaxAccels +0x8797a6: Link_SetIceMaxAccel +0x8797c3: kSwimmingTab2 +0x8797c7: Link_SetMomentum +0x87983a: Link_ResetSwimmingState +0x87984b: Link_ResetStateAfterDamagingPit +0x879873: ResetAllAcceleration +0x879896: kSwimmingTab3 +0x8798a8: Link_HandleSwimAccels +0x879903: Link_SetTheMaxAccel +0x87996c: LinkState_Zapped +0x8799ac: PlayerHandler_15_HoldItem +0x8799ad: Link_ReceiveItem +0x879a2c: Link_TuckIntoBed +0x879a5a: LinkState_Sleeping +0x879a62: Link_SnoringInBed +0x879a71: Link_SittingUpInBed +0x879aa1: Link_JumpingOutOfBed +0x879ac2: Link_HandleSwordCooldown +0x879ae5: return_locret_879AE5 +0x879ae6: kLinkItemHandlers +0x879b0e: Link_HandleYItem +0x879ba2: kAbilityBitmasks +0x879baa: Link_HandleAPress +0x879c5f: Link_APress_PerformBasic +0x879c66: HandleSwordSfxAndBeam +0x879cbf: kSpinAttackDelays +0x879cd1: kFireBeamSounds +0x879cd9: Link_CheckForSwordSwing +0x879d72: HandleSwordControls +0x879d84: Link_ResetSwordAndItemUsage +0x879d9f: Player_Sword_SpinAttackJerks_HoldDown +0x879e63: CalculateSwordHitBox +0x879eec: kRodAnimDelays +0x879eef: LinkItem_Rod +0x879f5d: RodItem_CreateShot +0x879f66: RodItem_CreateIceShot +0x879f6f: RodItem_CreateFireShot +0x879f78: kHammerAnimDelays +0x879f7b: LinkItem_Hammer +0x87a003: kBowDelays +0x87a006: LinkItem_Bow +0x87a0bb: LinkItem_Boomerang +0x87a11f: Link_ResetBoomerangYStuff +0x87a138: LinkItem_Bombs +0x87a15b: LinkItem_Bottle +0x87a24d: LinkItem_Lamp +0x87a289: kMushroomTimer +0x87a293: LinkItem_Powder +0x87a313: LinkItem_ShovelAndFlute +0x87a320: kShovelAnimDelay +0x87a326: kShovelAnimDelay2 +0x87a32c: LinkItem_Shovel +0x87a3db: LinkItem_Flute +0x87a45f: CallForDuckIndoors +0x87a471: LinkItem_Book +0x87a494: LinkItem_Ether +0x87a4f7: kEtherAnimStates +0x87a503: kEtherAnimDelays +0x87a50f: LinkState_UsingEther +0x87a569: LinkItem_Bombos +0x87a5cf: kBombosAnimStates +0x87a5e3: kBombosAnimDelays +0x87a5f7: LinkState_UsingBombos +0x87a64b: LinkItem_Quake +0x87a6be: kQuakeAnimStates +0x87a6ca: kQuakeAnimDelays +0x87a6d6: LinkState_UsingQuake +0x87a77a: Link_ActivateSpinAttack +0x87a783: Link_AnimateVictorySpin +0x87a7b0: Link_SetSpinAttacking_ +0x87a7b8: kLinkSpinGraphiccsByDir +0x87a7f4: kLinkSpinDelays +0x87a800: kLinkSpinOffsetsByDir +0x87a804: LinkState_SpinAttack +0x87a8ec: UNREACHABLE_07A8DC +0x87a91a: LinkItem_Mirror +0x87a955: PlaySfx60 +0x87a95c: DoSwordInteractionWithTiles_Mirror +0x87a9b1: LinkState_CrossingWorlds +0x87aa6c: Link_PerformDesertPrayer +0x87aaa2: HandleFollowersAfterMirroring +0x87ab25: LinkItem_Hookshot +0x87ab6c: kHookshotArrA +0x87ab70: kHookshotArrB +0x87ab74: kHookshotArrC +0x87ab78: kHookshotArrD +0x87ab7c: LinkState_Hookshotting +0x87adbe: kCapeDepletionTimers +0x87adc1: LinkItem_Cape +0x87ae47: Link_ForceUnequipCape +0x87ae54: Link_ForceUnequipCape_quietly +0x87ae65: HaltLinkWhenUsingItems +0x87ae88: Link_HandleCape_passive_LiftCheck +0x87ae8f: Player_CheckHandleCapeStuff +0x87aec0: LinkItem_CaneOfSomaria +0x87af3b: kByrnaDelays +0x87af3e: LinkItem_CaneOfByrna +0x87afb5: SearchForByrnaSpark +0x87afcc: kBugNetTimers +0x87aff4: kMult10 +0x87aff8: LinkItem_Net +0x87b073: CheckYButtonPress +0x87b087: kLinkItem_MagicCosts +0x87b0a2: kLinkItem_MagicCostBaseIndices +0x87b0ab: LinkCheckMagicCost +0x87b0e9: Refund_Magic +0x87b107: Link_ItemReset_FromOverworldThings +0x87b11c: Link_PerformThrow +0x87b199: kLiftTab2 +0x87b1ad: kLink_Lift_tab +0x87b1b6: kLiftTab0 +0x87b1c0: kLiftTab1 +0x87b1ca: Link_APress_LiftCarryThrow +0x87b281: Link_PerformDash +0x87b2ed: Link_APress_NothingB +0x87b2ee: Link_PerformGrab +0x87b310: kGrabWallDirs +0x87b314: kGrabWall_AnimTimer +0x87b31b: kGrabWall_AnimSteps +0x87b322: Link_APress_PullObject +0x87b371: Link_PerformStatueDrag +0x87b389: Link_APress_StatueDrag +0x87b3e5: Link_PerformRupeePull +0x87b40c: nullsub_9 +0x87b40d: kGrabWall_AnimSteps2 +0x87b416: LinkState_TreePull +0x87b4f2: Link_PerformRead +0x87b527: nullsub_7 +0x87b528: kLink_ReceiveItemAlternates +0x87b574: Link_PerformOpenChest +0x87b5c0: Link_CheckNewAPress +0x87b5d6: Link_HandleToss +0x87b609: UNREACHABLE_07B5F2 +0x87b64b: kPlayer_LimitDirectionMask +0x87b64f: Link_HandleDiagonalCollision +0x87b660: Player_LimitDirections_Inner +0x87b7c7: Link_HandleCardinalCollision +0x87b956: RunSlopeCollisionChecks_VerticalFirst +0x87b969: RunSlopeCollisionChecks_HorizontalFirst +0x87b97c: CheckIfRoomNeedsDoubleLayerCheck +0x87b9b3: CreateVelocityFromMovingBackground +0x87b9f7: kLink_DoMoveXCoord_Indoors_dy +0x87b9ff: kLink_DoMoveXCoord_Indoors_dx +0x87ba0a: StartMovementCollisionChecks_Y +0x87ba35: StartMovementCollisionChecks_Y_HandleIndoors +0x87bd49: endif_24 +0x87bdb1: HandlePushingBonkingSnaps_Y +0x87bdc8: endif_3 +0x87beaf: StartMovementCollisionChecks_Y_HandleOutdoors +0x87c16d: RunLedgeHopTimer +0x87c189: Link_RestorePreviousCoords +0x87c1a1: Link_BonkAndSmash +0x87c1c3: Link_Move_Helper4_CheckSmash_Inner +0x87c1e4: Link_AddInVelocityYFalling +0x87c1ff: CalculateSnapScratch_Y +0x87c229: AddAbsoluteScratchToXCoord +0x87c23d: ChangeAxisOfPerpendicularDoorMovement_Y +0x87c29f: Link_AddInVelocityY +0x87c2ba: kRecoilVelY_Ydir +0x87c2bd: kRecoilVelZ_Ydir +0x87c2c3: Link_HopInOrOutOfWater_Y +0x87c30c: kLink_MoveY_RecoilOther_dy +0x87c32c: kLink_MoveY_RecoilOther_dz +0x87c34c: kLink_MoveY_RecoilOther_timer +0x87c36c: Link_FindValidLandingTile_North +0x87c409: kLink_JumpOffLedgeUpDown_dy +0x87c429: kLink_JumpOffLedgeUpDown_dx +0x87c449: kLink_JumpOffLedgeUpDown_dz +0x87c46d: Link_FindValidLandingTile_DiagonalNorth +0x87c4d4: StartMovementCollisionChecks_X +0x87c4ff: StartMovementCollisionChecks_X_HandleIndoors +0x87c7fc: HandlePushingBonkingSnaps_X +0x87c8e9: StartMovementCollisionChecks_X_HandleOutdoors +0x87cb84: SnapOnX +0x87cb9f: CalculateSnapScratch_X +0x87cbc9: AddAbsoluteScratchToYCoord +0x87cbdd: ChangeAxisOfPerpendicularDoorMovement_X +0x87cc33: kRecoilVelX +0x87cc36: kRecoilVelZ +0x87cc39: kRecoilIncapacitated +0x87cc3c: Link_HopInOrOutOfWater_X +0x87cc83: Link_AvoidJudderAgainstDiagWall_x0 +0x87cc8d: Link_AvoidJudderAgainstDiagWall_x1 +0x87cc97: Link_AvoidJudderAgainstDiagWall_y0 +0x87cca1: Link_AvoidJudderAgainstDiagWall_y1 +0x87ccab: Link_HandleDiagonalKickback +0x87cd7b: kDetectTiles_tab0 +0x87cd83: kDetectTiles_tab1 +0x87cd8b: kDetectTiles_tab2 +0x87cd93: kDetectTiles_tab3 +0x87cda3: kDetectTiles_tab4 +0x87cdab: kDetectTiles_tab5 +0x87cdb3: kDetectTiles_tab6 +0x87cdcb: TileDetect_Movement_Y +0x87ce2a: TileDetect_Movement_X +0x87ce85: TileDetect_Movement_VerticalSlopes +0x87cec9: TileDetect_Movement_HorizontalSlopes +0x87cf0a: TileDetect_BigArea +0x87cf12: Player_TileDetectNearby +0x87cf7e: TileDetect_UnusedIce +0x87cfcc: kDoSwordInteractionWithTiles_y +0x87d01c: kDoSwordInteractionWithTiles_x +0x87d06f: kDoSwordInteractionWithTiles_o +0x87d077: TileDetect_MainHandler +0x87d2c6: Link_PermissionForSloshSounds +0x87d2e4: kChangableDungeonObj_Func1B_y0 +0x87d2ec: kChangableDungeonObj_Func1B_y1 +0x87d2f4: kChangableDungeonObj_Func1B_x0 +0x87d2fc: kChangableDungeonObj_Func1B_x1 +0x87d304: PushBlock_AttemptToPushTheBlock +0x87d365: kGetBestActionToPerformOnTile_y +0x87d36d: kGetBestActionToPerformOnTile_x +0x87d375: kGetBestActionToPerformOnTile_a +0x87d37c: kGetBestActionToPerformOnTile_b +0x87d383: Link_HandleLiftables +0x87d445: kLink_Move_Helper6_tab0 +0x87d455: kLink_Move_Helper6_tab1 +0x87d465: kLink_Move_Helper6_tab2 +0x87d475: kLink_Move_Helper6_tab3 +0x87d485: HandleNudging +0x87d556: kHookShot_CheckColl_Y +0x87d566: kHookShot_CheckColl_X +0x87d576: Hookshot_CheckTileCollision +0x87d607: Hookshot_CheckSingleLayerTileCollision +0x87d657: kDetectTiles_7_Y +0x87d65f: kDetectTiles_7_X +0x87d667: HandleNudgingInADoor +0x87d6f4: TileCheckForMirrorBonk +0x87d72e: kDoorwayDetectY +0x87d736: kDoorwayDetectX +0x87d73e: TileDetect_SwordSwingDeepInDoor +0x87d798: TileDetect_ResetState +0x87d7d8: kTileHandlers_Indoors +0x87d9d8: TileDetection_Execute +0x87dc2e: TileDetect_ExecuteInner +0x87dc4a: TileBehavior_HandleItemAndExecute +0x87dc50: TileBehavior_StandardCollision +0x87dc5d: TileBehavior_SlopeOuter +0x87dc61: TileBehavior_Slope +0x87dc72: TileBehavior_NorthSingleLayerStairs +0x87dc7d: TileBehavior_NorthSwapLayerStairs +0x87dc86: TileHandlerIndoor_22 +0x87dc8b: TileBehavior_Pit +0x87dc98: TileBehavior_OverlayMask_0C +0x87dc9e: TileBehavior_GanonIce +0x87dca4: TileBehavior_PalaceIce +0x87dcae: TileBehavior_LightableTorch +0x87dcb6: TileBehavior_DeepWater +0x87dcbc: TileBehavior_ShortWaterLadder +0x87dcc2: TileBehavior_OverlayMask_1C +0x87dcc8: TileBehavior_LayerToggleShutterDoor +0x87dcd4: TileBehavior_LayerAndDungeonToggleShutterDoor +0x87dce0: TileBehavior_DungeonToggleShutterDoor +0x87dcea: TileHandlerIndoor_82 +0x87dd00: TileBehavior_DungeonToggleManualDoor +0x87dd0a: TileHandlerIndoor_80 +0x87dd1b: TileBehavior_ShallowWater +0x87dd41: TileBehavior_ManipulablyReplaced +0x87dd5c: TileBehavior_UnusedDeepWater +0x87dd6a: TileBehavior_Chest +0x87dd95: notBigKeyLock +0x87dd9d: TileBehavior_SouthSingleLayerStairs +0x87dda1: TileHandlerIndoor_3E +0x87ddb1: TileBehavior_Spike +0x87ddca: TileBehavior_SpikeFloor +0x87dde1: TileBehavior_Hookshottables +0x87dde5: TileBehavior_FlagManipulable +0x87ddeb: TileBehavior_FlaggableDoor +0x87ddf7: TileBehavior_RupeeTile +0x87de17: TileBehavior_CrystalPeg_Up +0x87de29: TileBehavior_Conveyor_Upwards +0x87de2d: TileBehavior_Conveyor_Downwards +0x87de35: TileBehavior_Conveyor_Leftwards +0x87de3a: TileBehavior_Conveyor_Rightwards +0x87de45: TileBehavior_MinigameChest +0x87de4f: TileBehavior_Entrance +0x87de5b: TileBehavior_NothingOW +0x87de61: TileBehavior_ThickGrass +0x87de67: TileBehavior_DiggableGround +0x87de7e: TileBehavior_Liftable +0x87dead: TileBehavior_Ledge_South +0x87debb: TileBehavior_Ledge_North +0x87dec5: TileBehavior_Ledge_EastWest +0x87decf: TileBehavior_Ledge_NorthDiagonal +0x87dedd: TileBehavior_Ledge_SouthDiagonal +0x87dee7: TileBehavior_UnusedCornerType +0x87def1: TileBehavior_EasternRuinsCorner +0x87deff: TileBehavior_Warp +0x87df09: TileBehavior_GraveStone +0x87df11: TileBehavior_HylianPlaque +0x87df19: TileBehavior_BonkRocks +0x87e026: PushBlock_GetTargetTileFlag +0x87e052: kAvoidJudder1 +0x87e072: kAvoidJudder2 +0x87e076: FlagMovingIntoSlopes_Y +0x87e112: FlagMovingIntoSlopes_X +0x87e1be: Link_HandleRecoiling +0x87e1d7: Player_HandleIncapacitated_Inner2 +0x87e227: kPlayer_SomethingWithVelocity_vel +0x87e245: Link_HandleVelocity +0x87e370: LinkHop_FindArbitraryLandingSpot +0x87e373: Player_MovePosition1_ +0x87e3dd: Player_ApplyDragAndComputeVel_ +0x87e3e0: Link_HandleVelocityAndSandDrag +0x87e402: return_loc_87E402 +0x87e406: kSwimmingTab4 +0x87e41e: kSwimmingTab5 +0x87e422: kSwimmingTab6 +0x87e42a: HandleSwimStrokeAndSubpixels +0x87e4d3: Player_SomethingWithVelocity_TiredOrSwim +0x87e545: Link_DashInPlace +0x87e595: Link_HandleMovingFloor +0x87e5cd: Link_ApplyMovingFloorVelocity +0x87e5e4: kMovePosDirFlag +0x87e5e8: kMovingBeltY +0x87e5ec: kMovingBeltX +0x87e5f0: Link_ApplyConveyor +0x87e671: kPlayer_UpdateDirection_tab +0x87e675: kPlayer_UpdateDirection_tab2 +0x87e685: kPlayer_UpdateDirection_tab3 +0x87e69d: Link_HandleMovingAnimation_SetFacingDown +0x87e6a6: Link_HandleMovingAnimation_FullLongEntry +0x87e6a9: Player_UpdateDirection_ +0x87e704: Link_HandleMovingAnimation_StartWithDash +0x87e707: Player_UpdateDirection_Part2_ +0x87e7fa: Link_HandleMovingAnimationSwimming +0x87e842: kDashTab4 +0x87e87a: kDashTab5 +0x87e881: kDashTab3 +0x87e88f: Link_HandleMovingAnimation_Dash +0x87e8f0: HandleIndoorCameraAndDoors +0x87e901: HandleDoorTransitions +0x87e9d3: ApplyLinksMovementToCamera +0x87ea06: DesertPrayer_InitializeIrisHDMA +0x87ea22: kPrayingScene_Delays +0x87ea27: DesertPrayer_BuildIrisHDMATable +0x87ebda: kPrayingScene_Tab1 +0x87ec5b: kPrayingScene_Tab0 +0x87ecdc: DesertHDMA_CalculateIrisShapeLine +0x87ed2c: FindFreeMovingBlockSlot +0x87ed3f: InitializePushBlock +0x87edb5: PushBlock_Slide +0x87edf9: PushBlock_HandleFalling +0x87ee31: kPushedBlockDirMask +0x87ee35: PushBlock_ApplyVelocity +0x87ef61: kPushBlockTab1 +0x87ef65: kPushBlockTab2 +0x87ef69: kPushBlock_E +0x87ef71: kPushBlock_A +0x87ef79: kPushBlock_B +0x87ef81: kPushBlock_F +0x87ef89: kPushBlock_C +0x87ef91: kPushBlock_D +0x87ef99: kLinkOtherPosPtrs +0x87efa1: kLinkOnePosPtrs +0x87efa9: kPushedBlockOtherPosPtrs +0x87efb1: kPushedBlockOnePosPtrs +0x87efb9: PushBlock_HandleCollision +0x87f0ac: Sprite_Dungeon_DrawAllPushBlocks +0x87f0cc: kPushedblock_Char +0x87f0d0: kPushedBlock_Tab1 +0x87f0d9: Sprite_Dungeon_DrawSinglePushBlock +0x87f13c: Link_Initialize +0x87f1a3: Link_ResetProperties_A +0x87f1e6: Link_ResetProperties_B +0x87f1fa: Link_ResetProperties_C +0x87f25a: UsedForStraightInterRoomStaircase +0x87f2c1: HandleLinkOnSpiralStairs +0x87f391: SpiralStairs_FindLandingSpot +0x87f3f3: LinkResetPushTimer +0x87f3fd: UNREACHABLE_07F3D7 +0x87f42f: Player_CheckDoorwayQuadrantMovement_Far +0x87f439: Link_CheckForEdgeScreenTransition +0x87f46f: Follower_ValidateMessageFreedom +0x87f49c: TriforceRoom_LinkApproachTriforce +0x87f4d0: Sprite_CheckIfLinkIsBusy +0x87f4f1: Pipe_ValidateEntry +0x87f514: CacheCameraPropertiesIfOutdoors +0x87f51d: kOverworld_SignText +0x87f61d: kDungeon_SignText +0x888000: Ancilla_Sfx1_Near +0x888007: Player_DoSfx2_ +0x88800e: Player_DoSfx3_ +0x888015: Player_SetSfxPan_ +0x888020: Ancilla_Sfx1_Pan +0x888027: Ancilla_Sfx2_Pan +0x88802e: Ancilla_Sfx3_Pan +0x888035: Ancilla_Sfx_SetPan +0x888040: kFireRod_X +0x888044: kFireRod_XHi +0x888048: kFireRod_Y +0x88804c: kFireRod_YHi +0x888050: kFireRod_Xvel2 +0x88805c: kFireRod_Yvel2 +0x888068: kFireRod_Xvel +0x88806c: kFireRod_Yvel +0x88806f: kAncilla_Pflags +0x8880b3: AncillaAdd_FireRodShot +0x88819f: kSpawnCentrifugalQuad_X +0x8881a3: kSpawnCentrifugalQuad_Y +0x8881a7: SomariaBlock_SpawnBullets +0x888242: Ancilla_Main +0x88824d: Ancilla_ProjectReflexiveSpeedOntoSprite +0x888287: Bomb_CheckSpriteDamage +0x88832b: Ancilla_ExecuteAll +0x88833c: Ancilla_ExecuteOne +0x888405: kIceShotSparkle_X +0x888415: kIceShotSparkle_Y +0x888425: kIceShotSparkle_Char +0x888435: Ancilla13_IceRodSparkle +0x8884c0: kIceShotSparkle_Yvel +0x8884c4: kIceShotSparkle_Xvel +0x8884c8: AncillaAdd_IceRodSparkle +0x888515: kSomarianBlast_Mask +0x88851b: Ancilla01_SomariaBullet +0x888562: kSomarianBlast_Draw_Char0 +0x88857a: kSomarianBlast_Draw_Char1 +0x888592: kSomarianBlast_Draw_Flags0 +0x8885aa: kSomarianBlast_Draw_Flags1 +0x8885c2: kSomarianBlast_Draw_X0 +0x8885da: kSomarianBlast_Draw_X1 +0x8885f2: kSomarianBlast_Draw_Y0 +0x88860a: kSomarianBlast_Draw_Y1 +0x888628: kAncilla_FloorFlags +0x88862a: Ancilla_ReturnIfOutsideBounds +0x88864e: kSomarianBlast_Flags +0x888650: SomarianBlast_Draw +0x8886d2: Ancilla02_FireRodShot +0x888759: kFireShot_Draw_X2 +0x888769: kFireShot_Draw_Y2 +0x888779: kFireShot_Draw_Char2 +0x88877c: FireShot_Draw +0x8887e9: kFireShot_Draw_Char +0x888853: kAncilla_TileColl0_Attrs +0x888953: kAncilla_CheckTileColl0_Y +0x888967: kAncilla_CheckTileColl0_X +0x88897b: Ancilla_CheckTileCollision_staggered +0x888981: Ancilla_CheckTileCollision +0x888a03: Ancilla_CheckTileCollisionOneFloor +0x888a26: Ancilla_CheckTileCollision_targeted +0x888ab9: Ancilla_SetSpriteAlert +0x888abf: kAncilla_TileColl_Attrs +0x888bbf: kAncilla_CheckTileColl_Y +0x888bc7: kAncilla_CheckTileColl_X +0x888bcf: Ancilla_CheckTileCollision_Class2 +0x888c43: Ancilla_CheckTileCollision_Class2_Inner +0x888cd9: kBeamHit_X +0x888ce9: kBeamHit_Y +0x888cf9: kBeamHit_Char +0x888d09: kBeamHit_Flags +0x888d19: Ancilla04_BeamHit +0x888d68: Ancilla_CheckSpriteCollision +0x888da2: Ancilla_CheckSpriteCollision_ +0x888daa: kAncilla_CheckSpriteColl_Dir +0x888dae: Ancilla_CheckSpriteCollision_Single +0x888e75: kAncilla_CheckSpriteColl_RecoilX +0x888e79: kAncilla_CheckSpriteColl_RecoilY +0x888e7d: kAncilla_HitBox_X +0x888e89: kAncilla_HitBox_W +0x888e95: kAncilla_HitBox_Y +0x888ea1: kAncilla_HitBox_H +0x888ead: Ancilla_SetupHitBox +0x888eed: Ancilla_ProjectSpeedTowardsPlayer +0x888f5c: Ancilla_IsRightOfLink +0x888f6f: Ancilla_IsBelowLink +0x888f82: kRepulseSpark_Char +0x888f85: kRepulseSpark_Flags +0x888f89: Ancilla_WeaponTink +0x889080: Ancilla_MoveX +0x88908b: Ancilla_MoveY +0x8890b7: Ancilla_MoveZ +0x8890dc: kBoomerang_Y0 +0x8890ec: kBoomerang_X0 +0x8890fc: Ancilla05_Boomerang +0x88923b: Ancilla_CheckTileCollision_ +0x889243: Ancilla_CheckTileCollision_Class2__ +0x88924b: Boomerang_ScreenEdge +0x8892ab: Boomerang_StopOffScreen +0x8892f5: Boomerang_Terminate +0x88931a: kBoomerang_Flags +0x889322: kBoomerang_Draw_XY +0x889332: kBoomerang_Draw_OamIdx +0x889336: kBoomerang_Draw_Tab0 +0x889338: Boomerang_Draw +0x8893e8: Ancilla06_WallHit +0x8893ff: Ancilla_SwordWallHit +0x88941f: kWallHit_Char +0x88943f: kWallHit_Flags +0x88945f: kWallHit_Y +0x88949f: kWallHit_X +0x8894df: WallHit_Draw +0x889543: kBomb_Tab0 +0x88954e: kBomb_Draw_Tab0 +0x88955a: Ancilla07_Bomb +0x8897b6: kAncilla_Belt_Yvel +0x8897ba: kAncilla_Belt_Xvel +0x8897be: Ancilla_ApplyConveyor +0x8897e2: kBomb_Dmg_Speed +0x8897f2: kBomb_Dmg_Zvel +0x889802: kBomb_Dmg_Delay +0x889812: kBomb_Dmg_ToLink +0x889815: Bomb_CheckSpriteAndPlayerDamage +0x889913: kAncilla_Func3_Y +0x88992b: kAncilla_Func3_X +0x889943: kAncilla_Liftable_Delay +0x889946: kAncilla_Func2_Y +0x889952: kAncilla_Liftable_Yvel +0x889956: kAncilla_Liftable_Xvel +0x889976: Ancilla_HandleLiftLogic +0x889a4f: Ancilla_LatchAltitudeAboveLink +0x889a6a: Ancilla_LatchLinkCoordinates +0x889a95: Ancilla_Liftable_Func5 +0x889bef: Ancilla_LatchCarriedPosition +0x889c3e: Ancilla_Liftable_Func6 +0x889c7f: Ancilla_LatchYCoordToZ +0x889cc3: Ancilla_SetYFrom_DP72 +0x889cce: Bomb_GetDisplacementFromLink +0x889d10: kBomb_DrawExplosion_CharFlags +0x889d7c: kBomb_DrawExplosion_XY +0x889e54: kBomb_DrawExplosion_Ext +0x889e8a: kBomb_Draw_Mult6 +0x889e93: kBomb_Draw_Tab2 +0x889e9e: Bomb_Draw +0x889fb6: Ancilla08_DoorDebris +0x889fd1: kDoorDebris_XY +0x88a051: kDoorDebris_CharFlags +0x88a091: DoorDebris_Draw +0x88a121: kArrow_Y +0x88a129: kArrow_X +0x88a131: Ancilla09_Arrow +0x88a24e: kArrow_Draw_CharFlags +0x88a2ae: kArrow_Draw_XY +0x88a36e: Arrow_Draw +0x88a45b: Ancilla0A_ArrowInTheWall +0x88a4da: Ancilla_ClearTypeField_ +0x88a4dd: Ancilla0B_IceRodShot +0x88a536: Ancilla11_IceRodWallHit +0x88a551: kIceShotSpread_CharFlags +0x88a561: kIceShotSpread_XY +0x88a571: IceShotSpread_Draw +0x88a60e: Ancilla33_BlastWallExplosion +0x88a752: glb_88A752 +0x88a756: AncillaDraw_BlastWallBlast +0x88a7ab: AncillaDraw_Explosion +0x88a80d: kAncilla_JumpSplash_Char +0x88a80f: Ancilla15_JumpSplash +0x88a8e3: kAncilla_HitStars_Char +0x88a8e5: Ancilla16_HitStars +0x88a997: kShovelDirt_XY +0x88a9a7: kShovelDirt_Char +0x88a9a9: Ancilla17_ShovelDirt +0x88aa32: kBlastWallFireball_Char +0x88aa35: Ancilla32_BlastWallFireball +0x88aaa0: Ancilla18_EtherSpell +0x88ab63: EtherSpell_HandleLightningStroke +0x88aba7: EtherSpell_HandleOrbPulse +0x88abef: EtherSpell_HandleRadialSpin +0x88aceb: kEther_BlitzBall_Char +0x88aced: AncillaDraw_EtherBlitzBall +0x88ad49: kEther_SpllittingBlitzSegment_Char +0x88ad69: kEther_SpllittingBlitzSegment_Flags +0x88ad89: kEther_SpllittingBlitzSegment_Y +0x88ada9: kEther_SpllittingBlitzSegment_X +0x88adc9: AncillaDraw_EtherBlitzSegment +0x88ae73: kEther_BlitzSegment_Char +0x88ae77: kEther_BlitzOrb_Char +0x88ae7f: kEther_BlitzOrb_Flags +0x88ae87: AncillaDraw_EtherBlitz +0x88aedd: AncillaDraw_EtherOrb +0x88af56: kBombos_YDelta +0x88af5e: kBombos_XDelta +0x88af66: AncillaAdd_BombosSpell +0x88b0ce: Ancilla19_BombosSpell +0x88b10a: BombosSpell_ControlFireColumns +0x88b236: BombosSpell_FinishFireColumns +0x88b289: kBombosSpell_FireColumn_Char +0x88b2b0: kBombosSpell_FireColumn_Flags +0x88b2d7: kBombosSpell_FireColumn_Y +0x88b325: kBombosSpell_FireColumn_X +0x88b373: AncillaDraw_BombosFireColumn +0x88b40d: BombosSpell_ControlBlasting +0x88b521: kBombosSpell_DrawBlast_Char +0x88b541: kBombosSpell_DrawBlast_Flags +0x88b561: kBombosSpell_DrawBlast_Y +0x88b5a1: kBombosSpell_DrawBlast_X +0x88b5e1: AncillaDraw_BombosBlast +0x88b66a: Ancilla1C_QuakeSpell +0x88b6f7: QuakeSpell_ShakeScreen +0x88b713: kQuake_Tab1 +0x88b718: QuakeSpell_ControlBolts +0x88b78e: kQuakeDrawGroundBolts_Tab +0x88b793: AncillaDraw_QuakeInitialBolts +0x88b84f: QuakeSpell_SpreadBolts +0x88b873: kQuakeDrawGroundBolts_Char +0x88b8f4: kMagicPowder_Tab0 +0x88b91c: kMagicPower_Mult10 +0x88b920: kMagicPowder_DrawY +0x88b9b8: kMagicPowder_DrawX +0x88ba50: kMagicPowder_Draw_Char +0x88ba64: kMagicPowder_Draw_Flags +0x88bab0: Ancilla1A_PowderDust +0x88baeb: Ancilla_MagicPowder_Draw +0x88bb58: Powder_ApplyDamageToSprites +0x88bbbc: Ancilla1D_ScreenShake +0x88bbf4: kDashDust_Draw_Y +0x88bc30: kDashDust_Draw_X +0x88bc6c: kDashDust_Draw_Char +0x88bc8a: kDashDust_Draw_X1 +0x88bc92: Ancilla1E_DashDust +0x88bd4c: kHookShot_Draw_Char +0x88bd58: kHookShot_Draw_Flags +0x88bd64: kHookShot_Move_Y +0x88bd6c: kHookShot_Move_X +0x88bd74: Ancilla1F_Hookshot +0x88c003: kBedSpread_Char +0x88c00b: kBedSpread_Flags +0x88c013: Ancilla20_Blanket +0x88c091: kBedSpread_Dma +0x88c094: Ancilla21_Snore +0x88c107: kAncilla_VictorySparkle_Y +0x88c127: kAncilla_VictorySparkle_X +0x88c147: kAncilla_VictorySparkle_Char +0x88c157: kAncilla_VictorySparkle_Flags +0x88c167: Ancilla3B_SwordUpSparkle +0x88c1e4: kSwordChargeSpark_Char +0x88c1e7: kSwordChargeSpark_Flags +0x88c1ea: Ancilla3C_SpinAttackChargeSparkle +0x88c22f: kSwordCeremony_Y +0x88c23f: kSwordCeremony_X +0x88c24f: kSwordCeremony_Char +0x88c257: kSwordCeremony_Flags +0x88c25f: Ancilla35_MasterSwordReceipt +0x88c38a: Ancilla22_ItemReceipt +0x88c690: Ancilla_ReceiveItem_Draw +0x88c6f2: Ancilla28_WishPondItem +0x88c760: WishPondItem_Draw +0x88c7de: Ancilla42_HappinessPondRupees +0x88c819: HapinessPondRupees_ExecuteRupee +0x88c8be: HapinessPondRupees_GetState +0x88c924: HapinessPondRupees_SaveState +0x88c987: kObjectSplash_Draw_Char +0x88c991: kObjectSplash_Draw_Flags +0x88c99b: kObjectSplash_Draw_Y +0x88c9af: kObjectSplash_Draw_X +0x88c9c3: kObjectSplash_Draw_Ext +0x88c9cd: Ancilla_TransmuteToSplash +0x88ca01: Ancilla3D_ItemSplash +0x88ca22: ObjectSplash_Draw +0x88ca8c: Ancilla29_MilestoneItemReceipt +0x88cbe4: ItemReceipt_TransmuteToRisingCrystal +0x88cbf2: Ancilla_RisingCrystal +0x88cc93: AncillaAdd_OccasionalSparkle +0x88cca0: Ancilla43_GanonsTowerCutscene +0x88ceaa: AncillaDraw_GTCutsceneCrystal +0x88cec7: GTCutscene_ActivateSparkle +0x88cf35: GTCutscene_SparkleALot +0x88cfa6: kFlute_Vels +0x88cfaa: Ancilla36_Flute +0x88d03d: Ancilla37_WeathervaneExplosion +0x88d186: kWeathervane_Explode_Char +0x88d188: AncillaDraw_WeathervaneExplosionWoodDebris +0x88d1d4: kTravelBirdIntro_Tab0 +0x88d1d6: kTravelBirdIntro_Tab1 +0x88d1d8: Ancilla38_CutsceneDuck +0x88d37a: kMorphPoof_Char +0x88d37d: kMorphPoof_Ext +0x88d380: kMorphPoof_Flags +0x88d38c: kMorphPoof_Y +0x88d3a4: kMorphPoof_X +0x88d3bc: Ancilla23_LinkPoof +0x88d3fd: MorphPoof_Draw +0x88d49a: Ancilla40_DwarfPoof +0x88d4b9: kBushPoof_Draw_Char +0x88d4c9: kBushPoof_Draw_Flags +0x88d4d9: kBushPoof_Draw_Y +0x88d4f9: kBushPoof_Draw_X +0x88d519: Ancilla3F_BushPoof +0x88d596: kSwordSwingSparkle_Char +0x88d5c6: kSwordSwingSparkle_Flags +0x88d5f6: kSwordSwingSparkle_Y +0x88d626: kSwordSwingSparkle_X +0x88d656: kSwordSwingSparkle_Mult12 +0x88d65a: Ancilla26_SwordSwingSparkle +0x88d704: kInitialSpinSpark_Timer +0x88d70a: kInitialSpinSpark_Char +0x88d726: kInitialSpinSpark_Flags +0x88d742: kInitialSpinSpark_Y +0x88d77a: kInitialSpinSpark_X +0x88d7b2: Ancilla2A_SpinAttackSparkleA +0x88d84d: kTransmuteSpinSpark_Arr +0x88d85d: kTransmuteSpinSpark_Y +0x88d865: kTransmuteSpinSpark_X +0x88d86d: SpinAttackSparkleA_TransmuteToNextSpark +0x88d8f6: kSpinSpark_Char +0x88d8fa: kSpinSpark_Char2 +0x88d8fd: Ancilla2B_SpinAttackSparkleB +0x88da17: Sparkle_PrepOamFromRadial +0x88da4c: SpinAttackSparkleB_Closer +0x88da84: kInitialCaneSpark_Draw_Char +0x88da94: kInitialCaneSpark_Draw_Flags +0x88daa4: kInitialCaneSpark_Draw_Y +0x88dac4: kInitialCaneSpark_Draw_X +0x88dae4: kInitialCaneSpark_Y +0x88db04: kInitialCaneSpark_X +0x88db24: Ancilla30_ByrnaWindupSpark +0x88dc0e: kCaneSpark_Transmute_Tab +0x88dc1e: kCaneSpark_Magic +0x88dc21: ByrnaWindupSpark_TransmuteToNormal +0x88dc70: Ancilla31_ByrnaSpark +0x88ddc5: Ancilla_SwordBeam +0x88ddca: Ancilla0D_SpinAttackFullChargeSpark +0x88ddd8: kTravelBird_Draw_Char +0x88dddb: kTravelBird_Draw_Flags +0x88ddde: kTravelBird_Draw_Y +0x88dde1: kTravelBird_Draw_X +0x88dde4: kTravelBird_DmaStuffs +0x88dde8: Ancilla27_Duck +0x88e068: kCaneOfSomaria_Y +0x88e070: kCaneOfSomaria_X +0x88e078: AncillaAdd_SomariaBlock +0x88e161: kSomariaTransitLine_Y +0x88e179: kSomariaTransitLine_X +0x88e191: SomariaBlock_CheckForTransitTile +0x88e1f9: Ancilla_CheckBasicSpriteCollision +0x88e23d: Ancilla_CheckBasicSpriteCollision_Single +0x88e2ca: Ancilla_SetupBasicHitBox +0x88e2f9: kSomarianBlock_Draw_Flags +0x88e305: kSomarianBlock_Draw_Y +0x88e31d: kSomarianBlock_Draw_X +0x88e335: kSomarianBlock_Coll_Y +0x88e34d: kSomarianBlock_Coll_X +0x88e365: Ancilla2C_SomariaBlock +0x88e5d8: Ancilla_ClearTypeField +0x88e61b: AncillaDraw_SomariaBlock +0x88e74c: kSomarianBlock_CheckCover_Y +0x88e754: kSomarianBlock_CheckCover_X +0x88e75c: SomariaBlock_CheckForSwitch +0x88e7c2: kSomarianBlock_Yvel +0x88e7d2: kSomarianBlock_Xvel +0x88e7e2: kSomarianBlock_Zvel +0x88e7e6: SomariaBlock_HandlePlayerInteraction +0x88e98e: kSomariaBlockFizzle_Y +0x88e99a: kSomariaBlockFizzle_X +0x88e9a6: kSomariaBlockFizzle_Char +0x88e9ac: kSomariaBlockFizzle_Flags +0x88e9b2: SomariaBlock_FizzleAway +0x88e9e8: Ancilla2D_SomariaBlockFizz +0x88ea7f: kSomarianPlatformPoof_Tab0 +0x88ea83: Ancilla39_SomariaPlatformPoof +0x88eb3e: Ancilla2E_SomariaBlockFission +0x88ebe3: kLampFlame_Draw_Char +0x88ebef: kLampFlame_Draw_Y +0x88ebfb: kLampFlame_Draw_Xhi +0x88ec07: kLampFlame_Draw_X +0x88ec13: Ancilla2F_LampFlame +0x88ec77: kWaterfallSplash_Char +0x88ec7f: kWaterfallSplash_Flags +0x88ec87: kWaterfallSplash_Ext +0x88ec8f: kWaterfallSplash_Y +0x88ec97: kWaterfallSplash_Yhi +0x88ec9f: kWaterfallSplash_X +0x88eca7: kWaterfallSplash_Xhi +0x88ecaf: Ancilla41_WaterfallSplash +0x88ed89: Gravestone_Move +0x88edf9: kAncilla_Gravestone_Char +0x88edfd: kAncilla_Gravestone_Flags +0x88ee01: Ancilla24_Gravestone +0x88ee57: Gravestone_ActAsBarrier +0x88eede: kSkullWoodsFire_Draw_Y +0x88eee2: kSkullWoodsFire_Draw_Yhi +0x88eee6: kSkullWoodsFire_Draw_Char +0x88eeea: kSkullWoodsFire_Draw_Ext +0x88eeee: kSkullWoodsFire_Draw2_Char +0x88ef06: kSkullWoodsFire_Draw2_Flags +0x88ef1e: kSkullWoodsFire_Draw2_Ext +0x88ef36: kSkullWoodsFire_Draw2_Y +0x88ef66: kSkullWoodsFire_Draw2_X +0x88ef9a: Ancilla34_SkullWoodsFire +0x88f169: kSuperBombExplode_Y +0x88f17b: kSuperBombExplode_X +0x88f18d: Ancilla3A_BigBombExplosion +0x88f27c: kAncilla_RevivalFaerie_Tab0 +0x88f27e: kAncilla_RevivalFaerie_Tab1 +0x88f283: RevivalFairy_Main +0x88f3cf: RevivalFairy_Dust +0x88f430: RevivalFairy_MonitorHP +0x88f4ca: Animate_GAMEOVER_Letters +0x88f4d8: Ancilla_GameOverText +0x88f4ee: kGameOverText_Tab1 +0x88f4f6: GameOverText_SweepLeft +0x88f565: kGameOverText_Tab2 +0x88f56d: GameOverText_UnfurlRight +0x88f5b4: kGameOverText_Chars +0x88f5c4: GameOverText_Draw +0x88f624: Ancilla_SetPanRelativeCoordinates +0x88f631: AncillaAdd_AddAncilla_Bank08 +0x88f65f: UNREACHABLE_08F671 +0x88f66d: kTagalongLayerBits +0x88f671: Ancilla_PrepOamCoord +0x88f6a4: Ancilla_PrepAdjustedOamCoord +0x88f6d9: Ancilla_PrepOamCoord_ +0x88f6e1: Ancilla_SetOam_XY +0x88f6fe: Ancilla_SetOam_XY_ +0x88f702: Ancilla_SetOam_XY_safe +0x88f72f: kAncilla_Coll_Yoffs +0x88f739: kAncilla_Coll_Xoffs +0x88f743: kAncilla_Coll_H +0x88f74d: kAncilla_Coll_W +0x88f757: kAncilla_Coll_LinkYoffs +0x88f761: kAncilla_Coll_LinkXoffs +0x88f76b: Ancilla_CheckLinkCollision +0x88f7dc: Hookshot_CheckProximityToLink +0x88f824: kEntranceTrigger_BaseY +0x88f82c: kEntranceTrigger_BaseX +0x88f834: kEntranceTrigger_SizeY +0x88f83c: kEntranceTrigger_SizeX +0x88f844: Ancilla_CheckForEntranceTrigger +0x88f87b: kAncilla_DrawShadow_Char +0x88f889: kAncilla_DrawShadow_Flags +0x88f897: AncillaDraw_Shadow +0x88f90a: Ancilla_AllocateOamFromRegion_B_or_E +0x88f91a: Follower_MoveTowardsLink +0x88f9ba: Ancilla_AllocateOamFromCustomRegion +0x88fa00: HitStars_UpdateOamBufferPosition +0x88fa2d: Hookshot_ShouldIEvenBotherWithTiles +0x88fadd: Ancilla_GetRadialProjection +0x88fb23: Ancilla_GetRadialProjection_ +0x88fb2b: Ancilla_AllocateOamFromRegion_A_or_D_or_F +0x88fb44: BeamHit_Unknown +0x88fba6: BeamHit_GetCoords +0x88fbc9: BeamHit_GetTopXBit +0x88fbd6: BeamHit_CheckOffscreen_Y +0x88feea: kQuake_GroundBoltsPtrs +0x88ff6a: kQuake_GroundBolts2Ptrs +0x898000: kShovelHitStars_XY +0x898018: kShovelHitStars_X2 +0x898024: Ancilla_AddHitStars +0x898091: AncillaAdd_Blanket +0x8980c3: Ancilla_SetXY_ +0x8980c8: AncillaAdd_Snoring +0x8980fd: return +0x8980ff: kBomb_Place_Y1 +0x898107: kBomb_Place_X1 +0x89810f: kBomb_Place_Y0 +0x898117: kBomb_Place_X0 +0x89811f: AncillaAdd_Bomb +0x8981b3: kBoomerang_Tab0 +0x8981b7: kBoomerang_Tab1 +0x8981b9: kBoomerang_Tab2 +0x8981bb: kBoomerang_Tab3 +0x8981bf: kBoomerang_Tab4 +0x8981c7: kBoomerang_Tab5 +0x8981cf: kBoomerang_Tab6 +0x8981df: kBoomerang_Tab7 +0x8981ef: kBoomerang_Tab8 +0x8981ff: kBoomerang_Tab9 +0x89820f: AncillaAdd_Boomerang +0x89836c: kReceiveItem_Tab2 +0x8983b8: kReceiveItem_Tab3 +0x898404: kReceiveItemGfx +0x898450: kReceiveItem_Tab1 +0x89849c: kWishPond2_OamFlags +0x8984e8: kMemoryLocationToGiveItemTo +0x898580: kValueToGiveItemTo +0x8985e8: AncillaAdd_ItemReceipt +0x898932: kBottleList +0x898939: kPotionList +0x89893e: ItemReceipt_GiveBottledItem +0x89899a: kWishPondItem_Y +0x8989e6: kWishPondItem_X +0x898a32: AncillaAdd_TossedPondItem +0x898aba: kHappinessPond_Zvel +0x898ac4: kHappinessPond_Yvel +0x898ace: kHappinessPond_Xvel +0x898ad8: kHappinessPond_Start +0x898adc: kHappinessPond_End +0x898ae0: AddHappinessPondRupees +0x898b90: kFallingItem_Type +0x898b97: kFallingItem_Z +0x898b9e: kFallingItem_Y +0x898bac: kFallingItem_X +0x898bba: kFallingItem_G +0x898bc1: AncillaAdd_FallingPrize +0x898c73: AncillaAdd_DugUpFlute +0x898cb1: AncillaAdd_ChargedSpinAttackSparkle +0x898cd5: kWeathervane_Tab4 +0x898ce1: kWeathervane_Tab5 +0x898ced: kWeathervane_Tab6 +0x898cf9: kWeathervane_Tab8 +0x898d05: kWeathervane_Tab10 +0x898d11: AncillaAdd_ExplodingWeatherVane +0x898d90: AncillaAdd_CutsceneDuck +0x898dd2: AncillaAdd_SomariaPlatformPoof +0x898df9: AncillaAdd_SuperBombExplosion +0x898e4e: ConfigureRevivalAncillae +0x898ee0: AncillaAdd_CaneOfByrnaInitSpark +0x898f0c: kLampFlame_Y +0x898f14: kLampFlame_X +0x898f1c: AncillaAdd_LampFlame +0x898f5b: AncillaAdd_ShovelDirt +0x898f7c: AncillaAdd_MSCutscene +0x898faa: kAddDashingDust_Y +0x898fb2: kAddDashingDust_X +0x898fba: AncillaAdd_DashDust +0x898fc1: AncillaAdd_DashDust_charging +0x899011: kBlastWall_XY +0x899031: AncillaAdd_BlastWallFireball +0x899088: kShootBow_Yvel +0x89908c: kShootBow_Xvel +0x899094: kShootBow_Y +0x89909c: kShootBow_X +0x8990a4: AncillaAdd_Arrow +0x899102: AncillaAdd_BunnyPoof +0x89912c: AncillaAdd_CapePoof +0x89915f: AncillaAdd_DwarfPoof +0x8991c3: AncillaAdd_BushPoof +0x8991fc: AncillaAdd_EtherSpell +0x8992ac: AncillaAdd_VictorySpin +0x8992d0: kMagicPower_Y1 +0x8992d8: kMagicPower_X1 +0x8992e0: kMagicPower_Y +0x8992e8: kMagicPower_X +0x8992f0: AncillaAdd_MagicPowder +0x899383: glb_899383 +0x899385: kWallTapSpark_Y +0x89938d: kWallTapSpark_X +0x899395: AncillaAdd_WallTapSpark +0x8993c2: AncillaAdd_SwordSwingSparkle +0x8993e9: kAddDashTremor_Dir +0x8993ed: kAddDashTremor_Y +0x8993f1: kAddDashTremor_Tab +0x8993f3: AncillaAdd_DashTremor +0x899448: kBoomerangWallHit_Y +0x899458: kBoomerangWallHit_X +0x899468: kBoomerangWallHit_Tab0 +0x899478: AncillaAdd_BoomerangWallClink +0x8994c6: AncillaAdd_HookshotWallClink +0x8994fe: AncillaAdd_Duck_take_off +0x89951d: AddBirdTravelSomething +0x899589: AncillaAdd_QuakeSpell +0x8995fb: kSpinAttackStartSparkle_Y +0x899603: kSpinAttackStartSparkle_X +0x89960b: AncillaAdd_SpinAttackInitSpark +0x89965a: kBlastWall_Tab5 +0x89967a: kBlastWall_Tab3 +0x899682: kBlastWall_Tab4 +0x89968a: kBombos_Sfx +0x899692: AncillaAdd_BlastWall +0x899757: AncillaAdd_SwordChargeSparkle +0x8997ce: kSilverArrowSparkle_Y +0x8997d6: kSilverArrowSparkle_X +0x8997de: AncillaAdd_SilverArrowSparkle +0x89984b: kIceRod_Y +0x899853: kIceRod_X +0x89985b: kIceRod_Yvel +0x89985f: kIceRod_Xvel +0x899863: AncillaAdd_IceRodShot +0x8998fc: AncillaAdd_Splash +0x89993a: kMoveGravestone_Y +0x89994a: kMoveGravestone_X +0x899968: kMoveGravestone_Y1 +0x899986: kMoveGravestone_X1 +0x8999a4: kMoveGravestone_Pos +0x8999c2: kMoveGravestone_Ctr +0x8999e0: kMoveGravestone_Idx +0x8999e9: AncillaAdd_GraveStone +0x899af8: kHookshot_Yvel +0x899afc: kHookshot_Xvel +0x899b00: kHookshot_Yd +0x899b08: kHookshot_Xd +0x899b10: AncillaAdd_Hookshot +0x899b68: AncillaAdd_WaterfallSplash +0x899b81: return_loc_899B81 +0x899b83: AncillaAdd_GTCutscene +0x899c38: AncillaAdd_DoorDebris +0x899c4f: FireRodShot_BecomeSkullWoodsFire +0x899ce2: Ancilla_AddAncilla +0x899d18: AddAncilla_ +0x899d20: AncillaAdd_CheckForPresence +0x899d2e: Ancilla_CheckIfAlreadyExistsLong +0x899d36: AncillaAdd_ArrowFindSlot +0x899da3: kAncilla_Yoffs_Hb +0x899dbb: kAncilla_Xoffs_Hb +0x899dd3: Ancilla_CheckInitialTile_A +0x899e24: kAncilla_InitialTileColl_Y +0x899e34: kAncilla_InitialTileColl_X +0x899e44: Ancilla_CheckInitialTileCollision_Class2 +0x899e90: Follower_CheckBlindTrigger +0x899ef8: kTagalongFlags +0x899efc: Follower_Initialize +0x899f39: Sprite_BecomeFollower +0x899f91: Tagalong_Main_ +0x899f99: kTagalongRoutines +0x899fb5: kTagalong_Tab0 +0x899fb8: kTagalong_Tab1 +0x899fbe: kTagalong_Msg +0x899fc4: Follower_Main +0x89a024: Tagalong_5_14 +0x89a02b: Follower_NoTimedMessage +0x89a0e1: Follower_CheckGameMode +0x89a197: Follower_BasicMover +0x89a2b2: Follower_NotFollowing +0x89a309: kTagalong_Tab4 +0x89a318: Follower_OldMan +0x89a410: kTagalong_Tab5 +0x89a41f: Follower_OldManUnused +0x89a450: Follower_DoLayers +0x89a48e: Follower_CheckProximityToLink +0x89a4c8: kTagalong_IndoorRooms +0x89a4d6: kTagalong_IndoorInfos +0x89a54e: kTagalong_OutdoorRooms +0x89a554: kTagalong_OutdoorInfos +0x89a586: kTagalong_IndoorOffsets +0x89a596: kTagalong_OutdoorOffsets +0x89a59e: Follower_HandleTrigger +0x89a6cd: kTagalongDmaAndFlags +0x89a6fd: kTagalongDraw_SprXY +0x89a8bd: kTagalongDraw_Offs +0x89a8d9: kTagalongDraw_SprInfo0 +0x89a8f1: kTagalongDraw_SprOffs0 +0x89a8f5: kTagalongDraw_SprOffs1 +0x89a8f9: kTagalongDraw_Pals +0x89a907: Tagalong_Draw +0x89a957: Tagalong_DrawInner_ +0x89a959: Follower_AnimateMovement_preserved +0x89abf9: FollowerDraw_CalculateOamCoords +0x89ac26: Follower_CheckForTrigger +0x89ac6b: Ancilla_TerminateSelectInteractives +0x89acf3: Follower_Disable +0x89ad06: Ancilla_SetXY +0x89ad1b: Ancilla_GetCoordinates +0x89ad30: AncillaAdd_ExplodingSomariaBlock +0x89ad6c: Ancilla_AddRupees +0x89adc7: Ancilla_TerminateSparkleObjects +0x89adf1: kMotiveDashDust_Draw_Char +0x89adf4: DashDust_Motive +0x89ae40: Sprite_SpawnSuperficialBombBlast +0x89ae64: Sprite_SetSpawnedCoordinates +0x89ae7e: Sprite_SpawnDummyDeathAnimation +0x89aea0: kSpawnMadderBolts_Xvel +0x89aea4: kSpawnMadderBolts_St2 +0x89aea8: Sprite_MagicBat_SpawnLightning +0x89af32: Sprite_CheckIfScreenIsClear +0x89af61: Sprite_CheckIfRoomIsClear +0x89af76: Sprite_CheckIfOverlordsClear +0x89af89: Sprite_InitializeMirrorPortal +0x89afd6: Sprite_InitializeSlots +0x89b020: Fireball_SpawnTrailGarnish +0x89b06e: Garnish_ExecuteUpperSlots_ +0x89b07f: Garnish_ExecuteLowerSlots_ +0x89b08c: Garnish_ExecuteUpperSlots +0x89b097: Garnish_ExecuteLowerSlots +0x89b0a0: kGarnish_OamMemSize +0x89b0b6: Garnish_ExecuteSingle +0x89b150: kArrghusSplash_X +0x89b158: kArrghusSplash_Y +0x89b160: kArrghusSplash_Char +0x89b168: kArrghusSplash_Flags +0x89b170: kArrghusSplash_Ext +0x89b178: Garnish15_ArrghusSplash +0x89b1bd: GarnishSpawn_PyramidDebris +0x89b216: Garnish13_PyramidDebris +0x89b252: Garnish_MoveXY +0x89b284: kGanonBatFlame_Char +0x89b28b: kGanonBatFlame_Flags +0x89b292: kGanonBatFlame_Idx +0x89b2b2: Garnish11_WitheringGanonBatFlame +0x89b306: Garnish10_GanonBatFlame +0x89b33f: kTrinexxIce_Char +0x89b34b: kTrinexxIce_Flags +0x89b34f: Garnish0C_TrinexxIceBreath +0x89b3b9: kRunningManDust_Char +0x89b3bc: Garnish14_KakKidDashDust +0x89b3c2: Garnish_WaterTrail +0x89b3e8: kGarnish_CannonPoof_Char +0x89b3ea: kGarnish_CannonPoof_Flags +0x89b3ee: Garnish0A_CannonSmoke +0x89b419: kLightningTrail_Char +0x89b421: kLightningTrail_Flags +0x89b429: Garnish09_LightningTrail +0x89b459: Garnish_CheckPlayerCollision +0x89b496: kBabusuFlash_Char +0x89b49a: kBabusuFlash_Flags +0x89b49e: Garnish07_BabasuFlash +0x89b4c0: kGarnish_Nebule_XY +0x89b4c3: kGarnish_Nebule_Char +0x89b4c6: Garnish08_KholdstareTrail +0x89b4fb: Garnish06_ZoroTrail +0x89b51c: kGarnishSparkle_Char +0x89b520: Garnish12_Sparkle +0x89b526: Garnish_SimpleSparkle +0x89b559: kTrinexxLavaBubble_Char +0x89b55d: Garnish0E_TrinexxFireBreath +0x89b58d: kBlindLaserTrail_Char +0x89b591: Garnish0F_BlindLaserTrail +0x89b5b9: kLaserBeamTrail_Char +0x89b5bb: Garnish04_LaserTrail +0x89b5de: Garnish_ReturnIfPrepFails +0x89b613: kCrumbleTile_Char +0x89b618: kCrumbleTile_Flags +0x89b61d: kCrumbleTile_Ext +0x89b622: kCrumbleTile_XY +0x89b627: Garnish03_FallingTile +0x89b6c0: Garnish01_FireSnakeTail +0x89b6e1: Garnish02_MothulaBeamTrail +0x89b70c: Garnish_FinalizeBigOamObject +0x89b714: Overlord_SpawnBoulder +0x89b773: Overlord_Main +0x89b77e: Overlord_ExecuteAll +0x89b793: Overlord_ExecuteSingle +0x89b7dc: Overlord19_ArmosCoordinator_bounce +0x89b7e1: kRedStalfosTrap_X +0x89b7e9: kRedStalfosTrap_Y +0x89b7f1: kRedStalfosTrap_Delay +0x89b7f5: Overlord18_InvisibleStalfos +0x89b884: Overlord17_PotTrap +0x89b8c1: kOverlordZoroFactory_X +0x89b8d1: Overlord16_ZoroSpawner +0x89b972: kOverlordWizzrobe_X +0x89b97a: kOverlordWizzrobe_Y +0x89b982: kOverlordWizzrobe_Delay +0x89b986: Overlord15_WizzrobeSpawner +0x89b9e8: Overlord14_TileRoom +0x89ba2a: kSpawnFlyingTile_X +0x89ba40: kSpawnFlyingTile_Y +0x89ba56: TileRoom_SpawnTile +0x89baac: Overlord10_PirogusuSpawner_left +0x89bac0: kOverlordPirogusu_A +0x89bac4: PirogusuFactory_Main +0x89bb24: kCrumbleTilePathData +0x89bb90: kCrumbleTilePath_X +0x89bb98: kCrumbleTilePath_Y +0x89bbb2: Overlord0A_FallingSquare +0x89bc31: SpawnFallingTile +0x89bc7b: Overlord09_WallmasterSpawner +0x89bcc3: Overlord08_BlobSpawner +0x89bd3f: Overlord07_MovingFloor +0x89bd8d: kOverlordZol_X +0x89bd91: kOverlordZol_U +0x89bd9d: Overlord04_Unused +0x89bdfd: Sprite_Overlord_PlayFallingSfx +0x89be07: kStalfosTrap_Trigger +0x89be0f: Overlord05_FallingStalfos +0x89be6d: kSnakeTrapOverlord_Tab1 +0x89be75: Overlord06_BadSwitchSnake +0x89bed9: kAllDirectionMetalBallFactory_Idx +0x89bee9: kAllDirectionMetalBallFactory_X +0x89bef9: kAllDirectionMetalBallFactory_Y +0x89bf09: Overlord02_FullRoomCannons +0x89bf5b: Overlord03_VerticalCannon +0x89bfaf: Overlord_SpawnCannonBall +0x89c016: kOverlordSpawnBall_Xvel +0x89c01a: kOverlordSpawnBall_Yvel +0x89c01e: Overlord01_PositionTarget +0x89c023: kCrazyVillageSoldier_X +0x89c029: kCrazyVillageSoldier_Y +0x89c02f: Snitch_SpawnGuard +0x89c088: kOverlordInRangeOffs +0x89c08d: Overlord_CheckIfActive +0x89c114: Dungeon_ResetSprites +0x89c176: Dungeon_CacheTransSprites +0x89c22f: Sprite_DisableAll +0x89c290: Dungeon_LoadSprites +0x89c2f5: Sprite_ManuallySetDeathFlagUW +0x89c327: Dungeon_LoadSingleSprite +0x89c3e8: Dungeon_LoadSingleOverlord +0x89c44e: Sprite_ResetAll +0x89c452: Sprite_ResetAll_noDisable +0x89c499: Sprite_ReloadAll_Overworld +0x89c49d: Sprite_OverworldReloadAll_justLoad +0x89c4ac: Overworld_LoadSprites +0x89c55e: Sprite_ActivateAllProxima +0x89c58f: Sprite_ProximityActivation +0x89c5bb: Sprite_ActivateWhenProximal +0x89c5fa: Sprite_ActivateWhenProximalBig +0x89c635: kOverworldAreaSprcollSizes +0x89c6f5: Sprite_Overworld_ProximityMotivatedLoad +0x89c739: Overworld_LoadProximaSpriteIfAlive +0x89c770: Overworld_LoadSingleSprite +0x89c80b: Overworld_LoadSingleOverlord +0x89c881: kOverworldSprites0 +0x89c901: kOverworldSprites2 +0x89ca21: kOverworldSprites3 +0x89cb41: kNoSprite +0x89ec9f: kSpriteExplode_Dmd +0x89ed9f: SpriteModule_Explode_bounce +0x89eda7: SpriteExplode_Execute +0x89ee4c: SpriteExplode_SpawnEA +0x89ef56: Sprite_KillFriends +0x89ef8b: kScatterDebris_Draw_X +0x89f00b: kScatterDebris_Draw_Y +0x89f04b: kScatterDebris_Draw_Char +0x89f08b: kScatterDebris_Draw_Flags +0x89f0cb: Garnish16_ThrownItemDebris +0x89f15c: kScatterDebris_Draw_X2 +0x89f174: kScatterDebris_Draw_Y2 +0x89f180: kScatterDebris_Draw_Char2 +0x89f18c: kScatterDebris_Draw_Flags2 +0x89f198: ScatterDebris_Draw +0x89f1f8: Sprite_KillSelf +0x89f270: kModule_Death +0x89f290: Module12_GameOver +0x89f2a2: GameOver_AdvanceImmediately +0x89f2a4: Death_Func1 +0x89f33b: GameOver_DelayBeforeIris +0x89f350: GameOver_IrisWipe +0x89f3de: GameOver_SplatAndFade +0x89f458: Death_Func6 +0x89f47e: Death_Func4 +0x89f483: Animate_GAMEOVER_Letters_bounce +0x89f488: GameOver_Finalize_GAMEOVR +0x89f4ac: kHealthAfterDeath +0x89f4c1: GameOver_SaveAndOrContinue +0x89f50f: Death_Func15 +0x89f675: kDeath_SprChar0 +0x89f677: kDeath_SprY0 +0x89f67a: GameOver_AnimateChoiceFairy +0x89f6a4: GameOver_InitializeRevivalFairy +0x89f6b4: RevivalFairy_Main_bounce +0x89f6b9: GameOver_RiseALittle +0x89f71d: GameOver_Restore0D +0x89f735: GameOver_Restore0E +0x89f742: GameOver_ResituateLink +0x89f79f: Module17_SaveAndQuit +0x89f7af: Quit_IndicateHaltedState +0x89f7de: Polyhedral_InitializeThread +0x89f810: kPolyThreadInit +0x89f81d: Polyhedral_RunThread +0x89f83d: Polyhedral_SetShapePointer +0x89f864: Polyhedral_SetRotationMatrix +0x89f8fb: Polyhedral_OperateRotation +0x89f931: Polyhedral_RotatePoint +0x89f9d6: Polyhedral_ProjectPoint +0x89fa4f: Polyhedral_DrawPolyhedron +0x89faca: Polyhedral_SetForegroundColor +0x89fad7: Poly_SetColor_ModeB +0x89fb24: Polyhedral_CalculateCrossProduct +0x89fb6d: kPolySinCos +0x89fcae: Polyhedral_SetColorMask +0x89fcc4: kPoly_RasterColors +0x89fd04: Polyhedral_EmptyBitMapBuffer +0x89fd1e: Polyhedral_DrawFace +0x89fdcf: Polyhedral_FillLine +0x89fe94: kPoly_LeftSideMask +0x89fea4: kPoly_RightSideMask +0x89feb4: Polyhedral_SetLeft +0x89ff1e: Polyhedral_SetRight +0x89ff8c: kPolyTable +0x89ff98: kPoly0_Vtx +0x89ffaa: kPoly0_Polys +0x89ffd2: kPoly1_Vtx +0x89ffe4: kPoly1_Polys +0x8a8047: room_85_objects +0x8ab730: Module0E_0A_FluteMenu +0x8ab74b: FluteMenu_LoadMap +0x8ab753: FluteMenu_AdvanceMode +0x8ab75b: kBirdTravel_tab1 +0x8ab763: kBirdTravel_x_lo +0x8ab76b: kBirdTravel_x_hi +0x8ab773: kBirdTravel_y_lo +0x8ab77b: kBirdTravel_y_hi +0x8ab78b: FluteMenu_HandleSelection +0x8ab8c5: FluteMenu_LoadSelectedScreen +0x8ab948: Overworld_LoadOverlayAndMap +0x8ab964: FluteMenu_FadeInAndQuack +0x8ab96c: BirdTravel_Finish_Doit +0x8ab98b: Messaging_OverworldMap +0x8ab9a3: WorldMap_FadeOut +0x8aba30: WorldMap_LoadLightWorldMap +0x8aba7a: WorldMap_LoadDarkWorldMap +0x8aba9a: WorldMap_LoadSpriteGFX +0x8abaaa: WorldMap_Brighten +0x8abac4: kOverworldMap_Timer +0x8abac6: kOverworldMap_Table3 +0x8abad6: kOverworldMap_Table2 +0x8abae2: kOverworldMap_TableLow +0x8abae6: WorldMap_PlayerControl +0x8abbd6: WorldMap_RestoreGraphics +0x8abc33: Attract_SetUpConclusionHDMA +0x8abc54: WorldMap_ExitMap +0x8abc96: WorldMap_SetUpHDMA +0x8abda5: WorldMap_FillTilemapWithEF +0x8abdcf: kMapModeHdma0 +0x8abdd6: kMapModeHdma1 +0x8abddd: kAttractIndirectHdmaTab +0x8abde4: kOwMapCrystal0_x +0x8abdf6: kOwMapCrystal0_y +0x8abe08: kOwMapCrystal1_x +0x8abe1a: kOwMapCrystal1_y +0x8abe2c: kOwMapCrystal2_x +0x8abe3e: kOwMapCrystal2_y +0x8abe50: kOwMapCrystal3_x +0x8abe62: kOwMapCrystal3_y +0x8abe74: kOwMapCrystal4_x +0x8abe86: kOwMapCrystal4_y +0x8abe98: kOwMapCrystal5_x +0x8abeaa: kOwMapCrystal5_y +0x8abebc: kOwMapCrystal6_x +0x8abece: kOwMapCrystal6_y +0x8abee0: kOwMapCrystal0_tab +0x8abef2: kOwMapCrystal1_tab +0x8abf04: kOwMapCrystal2_tab +0x8abf16: kOwMapCrystal3_tab +0x8abf28: kOwMapCrystal4_tab +0x8abf3a: kOwMapCrystal5_tab +0x8abf4c: kOwMapCrystal6_tab +0x8abf5e: kOwMap_tab2 +0x8abf62: kOverworldMap_Table4 +0x8abf66: WorldMap_HandleSprites +0x8ac39f: WorldMap_CalculateOamCoordinates +0x8ac50d: return_true_loc_8AC50D +0x8ac515: kOverworldMapData +0x8ac51c: WorldMap_HandleSpriteBlink +0x8ac56d: WorldMap_MultiplyAxB +0x8ac580: WorldMap_ShiftNibblesRight +0x8ac589: WorldMapIcon_AdjustCoordinate +0x8ac5a6: kPendantBitMask +0x8ac5a9: OverworldMap_CheckForPendant +0x8ac5bf: kCrystalBitMask +0x8ac5c6: OverworldMap_CheckForCrystal +0x8ac5da: kOverworldMap_tab1 +0x8ac727: kLightOverworldTilemap +0x8ad727: kDarkOverworldTilemap +0x8adb27: kOverworldMapPaletteData +0x8add27: kMapMode_Zooms1 +0x8adee7: kMapMode_Zooms2 +0x8ae0b0: Module0E_03_DungeonMap +0x8ae0d2: PalaceMap_InitJumpTable +0x8ae0dc: Module0E_03_01_DrawMap +0x8ae0e4: Module0E_03_01_00_PrepMapGraphics +0x8ae15a: kDungMap_Tab3 +0x8ae168: kDungMap_Tab4 +0x8ae176: kDungMap_Tab1 +0x8ae186: kDungMap_Tab2 +0x8ae196: kDungMap_Tab0 +0x8ae1a4: Module0E_03_01_01_DrawLEVEL +0x8ae1e1: kDungMap_Tab7 +0x8ae1f3: Module0E_03_01_02_DrawFloorsBackdrop +0x8ae2e5: kDungMap_Tab9 +0x8ae2f5: DungeonMap_BuildFloorListBoxes +0x8ae384: Module0E_03_01_03_DrawRooms +0x8ae429: kDungMap_Tab11 +0x8ae431: kDungMap_Tab10 +0x8ae439: kDungMap_Tab13 +0x8ae43d: kDungMap_Tab12 +0x8ae441: kDungMap_Tab15 +0x8ae445: kDungMap_Tab14 +0x8ae449: DungeonMap_DrawBorderForRooms +0x8ae4e9: kDungMap_Tab16 +0x8ae4f9: DungeonMap_DrawFloorNumbersByRoom +0x8ae56f: kDungMap_Tab17 +0x8ae579: DungeonMap_DrawDungeonLayout +0x8ae59a: kMult_5 +0x8ae5bc: DungeonMap_DrawSingleRowOfRooms +0x8ae7f3: kDungMap_Tab24 +0x8ae7f9: kDungMap_Tab21 +0x8ae7ff: kDungMap_Tab22 +0x8ae807: kDungMap_Tab25 +0x8ae823: DungeonMap_DrawRoomMarkers +0x8ae954: DungeonMap_HandleInputAndSprites +0x8ae95b: DungeonMap_HandleInput +0x8ae975: kDungMap_Tab26 +0x8ae979: DungeonMap_HandleMovementInput +0x8ae986: DungeonMap_HandleFloorSelect +0x8aea77: kDungMap_Tab40 +0x8aea7b: kDungMap_Tab39 +0x8aea7f: DungeonMap_ScrollFloors +0x8aeaaf: ret +0x8aeab2: DungeonMap_DrawSprites +0x8aeaf0: DungeonMap_DrawLinkPointing +0x8aeb48: kDungMap_Tab38 +0x8aeb50: DungeonMap_DrawBlinkingIndicator +0x8aeb8a: kDungMap_Tab29 +0x8aeb8e: kDungMap_Tab30 +0x8aeb92: kDungMap_Tab31 +0x8aeb96: kDungMap_Tab32 +0x8aeba8: DungeonMap_DrawLocationMarker +0x8aec0a: DungeonMap_DrawFloorNumberObjects +0x8aecbe: kDungMap_Tab33 +0x8aecc6: kDungMap_Tab34 +0x8aeccf: DungeonMap_DrawFloorBlinker +0x8aed4e: kDungMap_Tab35 +0x8aed50: kDungMap_Tab36 +0x8aede4: DungeonMap_DrawBossIcon +0x8aee5d: kDungMap_Tab37 +0x8aee79: kDungMap_Tab28 +0x8aee95: DungeonMap_DrawBossIconByFloor +0x8aeef6: Module0E_03_04_UnusedCrazyScroll +0x8aef19: DungeonMap_RecoverGFX +0x8aefc9: ToggleStarTilesAndAdvance +0x8aefd1: kDungMap_Tab8 +0x8aefdf: kDungMap_Tab6 +0x8af009: kDungMap_Tab23 +0x8af5d9: kDungMap_Tab5 +0x8af5f5: kDungMap_Mult25 +0x8af605: kDungMap_Ptrs19 +0x8af621: kDungMap_Size75 +0x8af66c: kDungMap_Size125 +0x8af6e9: kDungMap_Size50 +0x8af71b: kDungMap_Size75_0 +0x8af766: kDungMap_Size175 +0x8af815: kDungMap_Size75_1 +0x8af860: kDungMap_Size50_0 +0x8af892: kDungMap_Size75_2 +0x8af8dd: kDungMap_Size50_1 +0x8af90f: kDungMap_Size200 +0x8af9d7: kDungMap_Size150 +0x8afa6d: kDungMap_Size75_3 +0x8afab8: kDungMap_Size100 +0x8afb1c: kDungMap_Size200_0 +0x8afbe4: kDungMap_Ptrs27 +0x8afce0: kDungFloorIndicator_Gfx0 +0x8afcf6: kDungFloorIndicator_Gfx1 +0x8afd0c: Hud_FloorIndicator +0x8afd90: Hud_RemoveSuperBombIndicator +0x8afda8: Hud_SuperBombIndicator +0x8afe20: Death_InitializeGameOverLetters +0x8afe80: Dungeon_HandleLayerEffect +0x8afe87: LayerEffect_Nothing +0x8afe88: LayerEffect_Scroll +0x8afeee: LayerEffect_Trinexx +0x8aff0d: LayerEffect_Agahnim2 +0x8aff5d: LayerEffect_InvisibleFloor +0x8affa4: LayerEffect_Ganon +0x8affde: LayerEffect_WaterRapids +0x8bfe70: Overworld_SetFixedColAndScroll +0x8bffa8: WallMaster_SendPlayerToLastEntrance +0x8bffbf: ResetSomeThingsAfterDeath +0x8bffee: ResetAncillaAndLink +0x8cc120: Module00_Intro +0x8cc15d: Intro_Init +0x8cc170: Intro_Init_Continue +0x8cc1a0: Intro_Clear1kbBlocksOfWRAM +0x8cc1f5: Intro_InitializeMemory_darken +0x8cc25c: IntroZeldaFadein +0x8cc284: Intro_FadeInBg +0x8cc2ae: Intro_SwordComingDown +0x8cc2d4: Intro_WaitPlayer +0x8cc2f0: FadeMusicAndResetSRAMMirror +0x8cc33c: Intro_InitializeTriforcePolyThread +0x8cc36f: Intro_InitGfx_Helper +0x8cc3bd: LoadTriforceSpritePalette +0x8cc404: Intro_HandleAllTriforceAnimations +0x8cc412: Scene_AnimateEverySprite +0x8cc425: kPolyhedralPalette +0x8cc435: Intro_AnimateTriforce +0x8cc448: Intro_RunStep +0x8cc534: Intro_AnimOneObj +0x8cc572: kIntroSprite0_X +0x8cc578: kIntroSprite0_Y +0x8cc57e: Intro_SpriteType_A_0 +0x8cc5b1: Intro_SpriteType_B_0 +0x8cc5ca: kIntroSprite0_Xvel +0x8cc5cd: kIntroSprite0_Yvel +0x8cc5d0: kIntroSprite0_XLimit +0x8cc5d3: kIntroSprite0_YLimit +0x8cc60f: kIntroSprite0_Left_Ents +0x8cc68f: kIntroSprite0_Right_Ents +0x8cc70f: AnimateSceneSprite_DrawTriangle +0x8cc72f: kIntroTriforceOam_Left +0x8cc7af: kIntroTriforceOam_Right +0x8cc82f: Intro_CopySpriteType4ToOam +0x8cc84f: EXIT_0CCA90 +0x8cc850: InitializeSceneSprite_Copyright +0x8cc864: AnimateSceneSprite_Copyright +0x8cc868: kIntroSprite2_Ents +0x8cc8d0: CopyIntroSpritesToOam_Sprite2_NintendoCopy +0x8cc8e2: InitializeSceneSprite_Sparkle +0x8cc8fd: kIntroSprite3_X +0x8cc901: kIntroSprite3_Y +0x8cc905: kIntroSprite3_State +0x8cc90d: AnimateSceneSprite_Sparkle +0x8cc936: kIntroSprite3_Ents +0x8cc956: AnimateSceneSprite_DrawSparkle +0x8cc972: AnimateSceneSprite_AddObjectsToOamBuffer +0x8cc9f1: AnimateSceneSprite_MoveTriangle +0x8cca4c: Intro_MaybeDoubleRet +0x8cca54: TriforceRoom_PrepGFXSlotForPoly +0x8cca81: Credits_InitializePolyhedral +0x8ccab1: AdvancePolyhedral +0x8ccabc: TriforceRoom_HandlePoly +0x8ccad8: TriforceRoom_HandlePoly_Switch +0x8ccae9: IntroPolyhedral_StartUp +0x8ccafe: TriforceRoom_HandlePoly_Case1 +0x8ccb1f: IntroPolyhedral_MoveRotate +0x8ccb84: IntroPolyhedral_LockIntoPlace +0x8ccba1: TriforceRoom_HandlePoly_Case4 +0x8ccba2: Credits_AnimateTheTriangles +0x8ccbb0: CreditsTriangle_HandleRotation +0x8ccbc3: CreditsTriangle_ApplyRotation +0x8ccbd6: kIntroTriforce_X +0x8ccbdc: kIntroTriforce_Y +0x8ccbe2: kIntroTriforce_Xvel +0x8ccbe5: kIntroTriforce_Yvel +0x8ccbe8: InitializeSceneSprite_TriforceRoomTriangle +0x8ccc13: Intro_SpriteType_B_456 +0x8ccc2d: kTriforce_Xacc +0x8ccc30: kTriforce_Yacc +0x8ccc5d: kTriforce_MinusOnes +0x8ccc60: kTriforce_Ones +0x8ccc65: kTriforce_Xfinal +0x8ccc68: kTriforce_Yfinal +0x8ccc8c: kTriforce_Yfinal2 +0x8cccb0: AnimateTriforceRoomTriangle_HandleContracting +0x8ccd0d: kIntroSprite7_X +0x8ccd13: kIntroSprite7_Y +0x8ccd19: InitializeSceneSprite_CreditsTriangle +0x8ccd38: kIntroSprite7_XAcc +0x8ccd3b: kIntroSprite7_YAcc +0x8ccd3e: AnimateSceneSprite_CreditsTriangle +0x8ccd7d: Module01_FileSelect +0x8ccd9d: Module_SelectFile_0 +0x8ccdf2: FileSelect_ReInitSaveFlagsAndEraseTriforce +0x8ccdf9: FileSelect_EraseTriforce +0x8cce53: Module_EraseFile_1 +0x8ccea5: FileSelect_TriggerStripesAndAdvance +0x8cceb1: FileSelect_TriggerNameStripesAndAdvance +0x8ccebd: FileSelect_Main +0x8ccec7: FileSelect_SetUpNamesStripes +0x8ccfbb: CopySaveToWRAM +0x8cd053: Module02_CopyFile +0x8cd06e: Module_CopyFile_2 +0x8cd087: CopyFile_ChooseSelection +0x8cd0a2: CopyFile_ChooseTarget +0x8cd0b9: CopyFile_ConfirmSelection +0x8cd0c6: FilePicker_DeleteHeaderStripe +0x8cd13f: CopyFile_SelectionAndBlinker +0x8cd22d: ReturnToFileSelect +0x8cd27b: CopyFile_TargetSelectionAndBlink +0x8cd371: CopyFile_HandleConfirmation +0x8cd3dc: CopyFile_CopyData +0x8cd485: Module03_KILLFile +0x8cd49a: KILLFile_SetUp +0x8cd49f: KILLFile_HandleSelection +0x8cd4b1: KILLFile_HandleConfirmation +0x8cd4ba: KILLFile_ChooseTarget +0x8cd7a5: FileSelect_DrawFairy +0x8cd88a: Module04_NameFile +0x8cd89c: NameFile_EraseSave +0x8cda4d: NameFile_DoTheNaming +0x8cdc8c: NameFile_CheckForScrollInputX +0x8cdcbf: NameFile_CheckForScrollInputY +0x8cdd30: NameFile_DrawSelectedCharacter +0x8cdd6d: intro_zelda_bg_etc +0x8ced7a: kIntroLogo_X +0x8ced7e: kIntroLogo_Tile +0x8ced82: Intro_DisplayLogo +0x8cedad: Module14_Attract +0x8cede6: Attract_Fade +0x8cee0c: Attract_InitGraphics +0x8ceea6: Attract_FadeInStep +0x8ceeba: Attract_FadeInSequence +0x8ceecb: Attract_FadeOutSequence +0x8ceee2: IncrementAttractModeIndex +0x8ceee5: Attract_LoadNewScene +0x8ceef8: AttractScene_PolkaDots +0x8ceeff: AttractScene_WorldMap +0x8cef4e: AttractScene_ThroneRoom +0x8cefc0: Attract_PrepFinish +0x8cefe3: Attract_PrepZeldaPrison +0x8cf058: Attract_PrepMaidenWarp +0x8cf0dc: AttractScene_EndOfStory +0x8cf0e2: Death_Func31 +0x8cf115: Attract_EnactStory +0x8cf126: AttractDramatize_PolkaDots +0x8cf176: AttractDramatize_WorldMap +0x8cf1c8: Attract_ThroneRoom +0x8cf27a: AttractDramatize_Prison +0x8cf324: Dramaghanim_AdvanceStory +0x8cf423: AttractDramatize_AgahnimAltar +0x8cf700: Attract_SkipToFileSelect +0x8cf72e: Attract_LegendGraphics_pointers +0x8cf736: Attract_LegendGraphics_sizes +0x8cf73e: Attract_BuildNextImageTileMap +0x8cf766: Attract_ShowTimedTextMessage +0x8cf783: Attract_ControlMapZoom +0x8cf7e6: Attract_BuildBackgrounds +0x8cf879: Attract_TriggerBGDMA +0x8cf9b5: Attract_DrawPreloadedSprite +0x8cf9e8: Attract_DrawZelda +0x8cfa30: Attract_DrawKidnappedMaiden +0x8cfa87: kAttractDmaTable0 +0x8cfa94: kAttractDmaTable1 +0x8cfaa3: Attract_SetUpWindowingHDMA +0x8cfac2: kAttract_Legendgraphics_0 +0x8cfb5f: kAttract_Legendgraphics_1 +0x8cfc4c: kAttract_Legendgraphics_2 +0x8cfd13: kAttract_Legendgraphics_3 +0x8cfe1c: kIntroSword_Char +0x8cfe26: kIntroSword_X +0x8cfe30: kIntroSword_Y +0x8cfe45: Intro_SetupSwordAndIntroFlash +0x8cfe56: Intro_PeriodicSwordAndIntroFlash +0x8cff05: kSwordSparkle_Tab +0x8cff0c: kSwordSparkle_Char +0x8cff49: kIntroSwordSparkle_Char +0x8d8000: link_sprite_bodys +0x8d838c: kPlayerOam_Prio +0x8d839b: kSwordTiledata +0x8d8563: kShieldStuff_OamData +0x8d85cf: kLinkShadows_Chardata +0x8d85fb: kLinkDmaGraphicsIndices +0x8d89f9: kPlayerOam_Spr1Bank +0x8d8a75: kPlayerOam_Spr2Bank +0x8d8af1: kPlayerOam_Main_SwordStuff_array1 +0x8d8cf0: kPlayerOam_ShieldStuff_array1 +0x8d8eef: kDrawSword_y +0x8d90ee: kDrawSword_x +0x8d92ed: kPlayerOam_Spr1Y +0x8d9369: kPlayerOam_Spr1X +0x8d93e5: kPlayerOam_Spr2Y +0x8d9461: kPlayerOam_Spr2X +0x8d94dd: kShieldStuff_y +0x8d96dc: kShieldStuff_x +0x8d98db: kOffsToShadowGivenDir_Y +0x8d98e7: kOffsToShadowGivenDir_X +0x8d98f3: kSwordOamYOffs +0x8d9af2: kSwordOamXOffs +0x8d9cf1: kPlayerOamSpriteLocs +0x8d9ef0: kPlayerOamOtherOffs +0x8da030: kMultBy80 +0x8da038: kPlayerOam_Tab6 +0x8da070: kMultBy14 +0x8da078: kPlayerOam_Tab19A +0x8da084: kPlayerOam_Tab20A +0x8da090: kSwordStuff_oam_index_ptrs_0 +0x8da09c: kLinkBody_oam_index_0 +0x8da0a8: kShieldStuff_oam_index_ptrs_0 +0x8da0b4: kShadow_oam_indexes_0 +0x8da0c0: kPlayerOam_Tab19B +0x8da0cc: kPlayerOam_Tab20B +0x8da0d8: kSwordStuff_oam_index_ptrs_1 +0x8da0e4: kLinkBody_oam_index_1 +0x8da0f0: kShieldStuff_oam_index_ptrs_1 +0x8da0fc: kShadow_oam_indexes_1 +0x8da108: kPlayerOam_Ptr19 +0x8da10c: kPlayerOam_Ptr20 +0x8da110: kSwordStuff_oam_index_ptrs +0x8da114: kPlayerOam_Ptrs15 +0x8da118: kShieldStuff_oam_index_ptrs +0x8da11c: kPlayerOam_Ptrs16 +0x8da120: kPlayerOam_SortSpritesOffs +0x8da126: kPlayerOam_FloorOamPrio +0x8da12e: kPlayerOam_Rod +0x8da131: kPlayerOam_Tab1 +0x8da13a: kPlayerOam_Tab2 +0x8da142: kPlayerOam_Tab3 +0x8da148: kPlayerOam_Tab4 +0x8da150: kPlayerOam_Tab5 +0x8da15e: kPlayerOam_StairsOffsY +0x8da18e: LinkOam_Main +0x8daac3: FindMostSignificantBit +0x8daacc: kPlayerOam_Main_SwordStuff_array3 +0x8dab18: kPlayerOam_Main_SwordStuff_array4 +0x8dab22: kPlayerOam_Main_SwordStuff_array2 +0x8dab6e: LinkOam_SetWeaponVRAMOffsets +0x8dabca: kPlayerOam_ShieldStuff_array2 +0x8dabdc: kPlayerOam_ShieldStuff_array3 +0x8dabe6: LinkOam_SetEquipmentVRAMOffsets +0x8dac45: kSwordTipSomething +0x8dac8d: kSwordOamYOffs_Good +0x8dacb1: kSwordOamXOffs_Good +0x8dacd5: LinkOam_CalculateSwordSparklePosition +0x8dad82: kPlayerOam_DrawOam_Throwing_Tiles +0x8dad84: kPlayerOam_DrawOam_Throwing_State +0x8dad94: kPlayerOam_DrawOam_Throwing_X +0x8dada4: kPlayerOam_DrawOam_Throwing_Y +0x8dadb6: LinkOam_UnusedWeaponSettings +0x8dae38: kPlayerOam_DrawOam_2X +0x8dae3b: LinkOam_DrawDungeonFallShadow +0x8daeca: kNoGrassAnimArr +0x8daecd: kShieldTypeToOffs +0x8daed1: LinkOam_DrawFootObject +0x8dafa6: UNREACHABLE_0DAFA6 +0x8dafc0: LinkOam_CalculateXOffsetRelativeLink +0x8db080: kSpriteInit_Flags2 +0x8db173: kSpriteInit_Health +0x8db266: kSpriteInit_BumpDamage +0x8db359: kSpriteInit_Flags3 +0x8db44c: kSpriteInit_Flags4 +0x8db53f: kSpriteInit_Flags +0x8db632: kSpriteInit_Flags5 +0x8db725: kSpriteInit_DeflBits +0x8db818: SpritePrep_LoadProperties +0x8db85c: SpritePrep_LoadPalette +0x8db871: SpritePrep_ResetProperties +0x8db8f1: kEnemyDamages +0x8db971: kSprite_SimplifiedTileAttr +0x8dba71: GetRandomNumber +0x8dba80: Oam_AllocateFromRegionA +0x8dba84: Oam_AllocateFromRegionB +0x8dba88: Oam_AllocateFromRegionC +0x8dba8c: Oam_AllocateFromRegionD +0x8dba90: Oam_AllocateFromRegionE +0x8dba94: Oam_AllocateFromRegionF +0x8dba9e: kOamGetBufferPos_Tab0 +0x8dbaaa: kOamGetBufferPos_Tab1 +0x8dbb0a: Oam_GetBufferPosition +0x8dbb5b: kPanTable +0x8dbb5e: Ancilla_CalculateSfxPan +0x8dbb67: Link_CalculateSfxPan +0x8dbb6e: SpriteSfx_QueueSfx1WithPan +0x8dbb7c: SpriteSfx_QueueSfx2WithPan +0x8dbb8a: SpriteSfx_QueueSfx3WithPan +0x8dbb98: SpriteSfx_ApplyPanning +0x8dbba1: Sprite_CalculateSfxPan +0x8dbba8: CalculateSfxPan +0x8dbbd0: CalculateSfxPan_Arbitrary +0x8dbbe0: kBabusu_Dmd +0x8dbd20: Babusu_Draw +0x8dbd46: kWizzrobe_Dmd +0x8dbe06: Wizzrobe_Draw +0x8dbe28: kWizzbeam_Dmd +0x8dbe68: Wizzbeam_Draw +0x8dbe86: kFreezor_Dmd0 +0x8dbf66: kFreezor_Dmd1 +0x8dbfa6: Freezor_Draw +0x8dbfd6: kZazak_Dmd +0x8dc096: kZazak_Char +0x8dc09e: kZazak_Flags +0x8dc0a6: Zazak_Draw +0x8dc0f3: kStalfos_Dmd +0x8dc213: kStalfos_Char +0x8dc217: SpriteDontDraw_Stalfos +0x8dc21c: Stalfos_Draw +0x8dc26a: kStalfos_Flags +0x8dc26e: Probe_CheckTileSolidity +0x8dc2d1: Sprite_29_Adult +0x8dc2d9: Sprite_HumanMulti_1 +0x8dc2e6: Sprite_BlindsHutGuy +0x8dc308: Sprite_ThiefHideoutGuy +0x8dc343: Sprite_FluteDad +0x8dc3b1: kFluteBoyFather_Dmd +0x8dc3e1: FluteBoyFather_Draw +0x8dc401: kBlindHideoutGuy_Dmd +0x8dc481: BlindHideoutGuy_Draw +0x8dc4a5: Sprite_2A_SweepingLady +0x8dc4ad: Sprite_SweepingLady +0x8dc4cb: kSweepingLadyDmd +0x8dc4eb: SweepingLady_Draw +0x8dc50b: Sprite_2C_Lumberjacks +0x8dc513: kLumberJackMsg +0x8dc51b: Sprite_Lumberjacks +0x8dc57f: kLumberJacks_X +0x8dc583: kLumberJacks_Y +0x8dc587: kLumberJacks_W +0x8dc58b: kLumberJacks_H +0x8dc58f: Lumberjack_CheckProximity +0x8dc5b2: kLumberJacks_Dmd +0x8dc6ba: Lumberjacks_Draw +0x8dc6de: Sprite_2D_TelepathicTile +0x8dc6e6: Sprite_UnusedTelepath +0x8dc737: UnusedTelepath_Draw +0x8dc75a: Sprite_31_FortuneTeller +0x8dc762: Sprite_FortuneTeller +0x8dc76d: Sprite_SmithyBlockade +0x8dc783: FortuneTeller +0x8dc79a: FortuneTeller_LightWorld +0x8dc7b1: kFortuneTeller_Prices +0x8dc7b9: FortuneTeller_LightWorld_PrecognizantResponse +0x8dc7de: LW_FortuneTeller_NotEnoughRupees +0x8dc7e7: FortuneTeller_LightWorld_OfferReading +0x8dc7ff: LW_FortuneTeller_ReactToPlayerResponse +0x8dc829: kFortuneTeller_Readings +0x8dc849: FortuneTeller_PerformPseudoScience +0x8dc953: FortuneTeller_PrepareNextMessage +0x8dc960: FortuneTeller_LightWorld_DemandPayment +0x8dc976: FortuneTeller_LightWorld_TakeMoney +0x8dc996: FortuneTeller_DarkWorld +0x8dc9ad: FortuneTeller_DarkWorld_PrecognizantResponse +0x8dc9d2: DW_FortuneTeller_NotEnoughRupees +0x8dc9db: FortuneTeller_DarkWorld_OfferReading +0x8dc9f3: DW_FortuneTeller_ReactToPlayerResponse +0x8dca1d: FortuneTeller_DarkWorld_DemandPayment +0x8dca2d: FortuneTeller_DemandPayment +0x8dca81: FortuneTeller_DarkWorld_TakeMoney +0x8dcaa1: kFortuneTeller_Dmd +0x8dcb01: FortuneTeller_Draw +0x8dcb2a: Smithy_SpawnDumbBarrierSprite +0x8dcb54: Sprite_2F_RaceGameLady +0x8dcb5c: Sprite_MazeGameLady +0x8dcb7e: RaceGameLady_Idle +0x8dcbba: RaceGameLady_TimeRun +0x8dcbe0: RaceGameLady_FireStarterPistol +0x8dcbea: Sprite_30_RaceGameGuy +0x8dcbf2: Sprite_MazeGameGuy +0x8dcc2d: RaceGameGuy_VerifyRun +0x8dcca7: RaceGameGuy_MakeModDecision +0x8dccf4: RaceGameGuy_RejectRun +0x8dcd05: RaceGameGuy_IdleInDiscord +0x8dcd16: MazeGameGuy_NothingMoreToGive +0x8dcd27: kMazeGameGuy_Dmd +0x8dcda7: MazeGameGuy_Draw +0x8dcdcf: kCrystalMaiden_SpriteData +0x8dce4f: kCrystalMaiden_Dma +0x8dce5f: CrystalMaiden_Draw +0x8dce91: kPriest_Dmd +0x8dcf31: Priest_Draw +0x8dcf59: kFluteBoy_Dmd +0x8dcfd9: FluteBoy_Draw +0x8dd000: kFluteAardvark_Dmd +0x8dd040: FluteAardvark_Draw +0x8dd060: kDustCloud_Dmd +0x8dd120: DustCloud_Draw +0x8dd142: kMedallionTablet_Dmd +0x8dd1e2: MedallionTablet_Draw +0x8dd203: kUncleDraw_Table +0x8dd383: kUncleDraw_Dma3 +0x8dd38a: kUncleDraw_Dma4 +0x8dd391: Uncle_Draw +0x8dd3eb: kBugNetKid_Dmd +0x8dd47b: BugNetKid_Draw +0x8dd49f: Sprite_ReturnIfInactive_8D +0x8dd4bc: kBomber_Dmd +0x8dd56c: Bomber_Draw +0x8dd58e: kBomberPellet_Dmd +0x8dd606: SpriteDraw_ZirroBomb +0x8dd631: PlayerBee_HoneInOnTarget +0x8dd6a6: kPikit_Dmd +0x8dd6e6: Pikit_Draw +0x8dd73a: kPikit_Draw_Char +0x8dd742: kPikit_Draw_Flags +0x8dd74a: SpriteDraw_Pikit_Tongue +0x8dd80f: kPikit_TongueMult +0x8dd813: Three_NOP +0x8dd817: kPikit_DrawGrabbedItem_X +0x8dd82b: kPikit_DrawGrabbedItem_Y +0x8dd83f: kPikit_DrawGrabbedItem_Char +0x8dd853: kPikit_DrawGrabbedItem_Flags +0x8dd858: SpriteDraw_Pikit_Loot +0x8dd8af: kKholdstare_Dmd +0x8dd92f: kKholdstare_Draw_X +0x8dd94f: kKholdstare_Draw_Y +0x8dd96f: kKholdstare_Draw_Char +0x8dd97f: kKholdstare_Draw_Flags +0x8dd98f: Kholdstare_Draw +0x8dda06: Sprite_SpawnFireball +0x8dda79: kArcheryGameGuy_Draw_X +0x8dda88: kArcheryGameGuy_Draw_Y +0x8dda97: kArcheryGameGuy_Draw_Char +0x8ddaa6: kArcheryGameGuy_Draw_Flags +0x8ddab5: kArcheryGameGuy_Draw_Ext +0x8ddac4: ArcheryGameGuy_Draw +0x8ddb40: kMaxBombsForLevelHex +0x8ddb48: kMaxBombsForLevel +0x8ddb50: kMaxArrowsForLevelHex +0x8ddb58: kMaxArrowsForLevel +0x8ddb60: kMaxHealthForLevel +0x8ddb75: Hud_RefillLogic_Far +0x8ddb7f: Hud_RefreshIcon__ +0x8ddb92: Hud_RefillLogic +0x8ddd2a: Hud_Module_Run_Far +0x8ddd32: Hud_UpdateEquippedItemFar +0x8ddd36: Hud_Module_Run +0x8ddd5a: Hud_ClearTileMap +0x8dddab: Hud_Init +0x8dde59: Hud_BringMenuDown +0x8dde6e: Hud_ChooseNextMode +0x8ddeb0: Hud_DoWeHaveThisItem +0x8ddebd: Hud_GoToPrevItem +0x8ddecb: Hud_GoToNextItem +0x8dded9: Hud_EquipPrevItem +0x8ddee2: Hud_EquipNextItem +0x8ddeeb: Hud_EquipItemAbove +0x8ddf00: Hud_EquipItemBelow +0x8ddf15: Hud_NormalMenu +0x8ddfa9: Hud_UpdateHud +0x8ddfaf: Hud_UpdateEquippedItem +0x8ddfba: Hud_CloseMenu +0x8ddffb: Hud_GotoBottleMenu +0x8de002: Hud_InitBottleMenu +0x8de050: kBottleMenuTop +0x8de064: kBottleMenuTop2 +0x8de078: kBottleMenuBottom +0x8de08c: Hud_ExpandBottleMenu +0x8de0df: Hud_BottleMenu +0x8de17f: Hud_UpdateBottleMenu +0x8de2fd: Hud_EraseBottleMenu +0x8de346: Hud_RestoreNormalMenu +0x8de372: Hud_DrawItem +0x8de395: Hud_SearchForEquippedItem_Far +0x8de399: Hud_SearchForEquippedItem +0x8de3c8: Hud_GetPaletteMask +0x8de3d9: Hud_DrawYButtonItems +0x8de647: Hud_DrawUnknownBox +0x8de6b6: Hud_DrawAbilityText +0x8de7b7: Hud_DrawAbilityIcons +0x8de81a: Hud_DrawGlovesText +0x8de860: kProgressIconPendants +0x8de914: kProgressIconCrystals +0x8de9c8: Hud_DrawProgressIcons +0x8de9d3: Hud_DrawProgressIcons_Pendants +0x8dea62: Hud_DrawProgressIcons_Crystals +0x8deb3a: Hud_DrawSelectedYButtonItem +0x8dece9: Hud_DrawMoonPearl +0x8ded04: Hud_Nop +0x8ded09: kHudEquipmentDungeonItemText +0x8ded29: Hud_DrawEquipment +0x8dee21: Hud_DrawShield +0x8dee3c: Hud_DrawArmor +0x8dee57: Hud_DrawMapAndBigKey +0x8deeb6: ItemMenu_CheckForDungeonPrize +0x8deedc: CheckPalaceItemPossession_00 +0x8deee1: CheckPalaceItemPossession_02 +0x8deeee: CheckPalaceItemPossession_03 +0x8deef4: CheckPalaceItemPossession_05 +0x8deefa: CheckPalaceItemPossession_06 +0x8def00: CheckPalaceItemPossession_07 +0x8def06: CheckPalaceItemPossession_08 +0x8def0c: CheckPalaceItemPossession_09 +0x8def12: CheckPalaceItemPossession_10 +0x8def18: CheckPalaceItemPossession_11 +0x8def1f: CheckPalaceItemPossession_12 +0x8def2c: CheckPalaceItemPossession_13 +0x8def39: Hud_DrawCompass +0x8def67: Hud_DrawBottleMenu +0x8df0f7: Hud_IntToDecimal +0x8df128: Hud_RefillHealth +0x8df14f: Hud_AnimateHeartRefill +0x8df1b3: Hud_RefillMagicPower +0x8df1c9: kHudItemText +0x8df449: kHudBottlesItemText +0x8df549: kHudMushroomItemText +0x8df569: kHudFluteItemText +0x8df5a9: kHudMirrorItemText +0x8df5c9: kHudBowItemText +0x8df629: kHudItemBow +0x8df651: kHudItemBoomerang +0x8df669: kHudItemHookshot +0x8df679: kHudItemBombs +0x8df689: kHudItemMushroom +0x8df6a1: kHudItemFireRod +0x8df6b1: kHudItemIceRod +0x8df6c1: kHudItemBombos +0x8df6d1: kHudItemEther +0x8df6e1: kHudItemQuake +0x8df6f1: kHudItemTorch +0x8df701: kHudItemHammer +0x8df711: kHudItemFlute +0x8df731: kHudItemBugNet +0x8df741: kHudItemBookMudora +0x8df751: kHudItemBottles +0x8df799: kHudItemCaneSomaria +0x8df7a9: kHudItemCaneByrna +0x8df7b9: kHudItemCape +0x8df7c9: kHudItemMirror +0x8df7e9: kHudItemGloves +0x8df801: kHudItemBoots +0x8df811: kHudItemFlippers +0x8df821: kHudItemMoonPearl +0x8df839: kHudItemSword +0x8df861: kHudItemShield +0x8df881: kHudItemArmor +0x8df899: kHudItemDungeonCompass +0x8df8a9: kHudItemPalaceItem +0x8df8c1: kHudItemDungeonMap +0x8df8d1: kHudPendants0 +0x8df8e1: kHudPendants1 +0x8df8f1: kHudPendants2 +0x8df911: kHudItemHeartPieces +0x8df931: kHudGlovesText +0x8df959: kHudAbilityText +0x8df9fd: kHudItemBoxTab1 +0x8dfa03: kHudItemBoxTab2 +0x8dfa09: kAnimHeartPartial +0x8dfa15: kItemToHudItem +0x8dfa33: Hud_RestoreTorchBackground +0x8dfa58: Hud_RebuildFar +0x8dfa60: Hud_RebuildIndoor +0x8dfa68: HUD_RebuildIndoor_palace +0x8dfa6c: Hud_Rebuild_ +0x8dfa70: Hud_Rebuild +0x8dfa85: Hud_UpdateOnly +0x8dfa93: kHudItemBoxGfxPtrs +0x8dfad5: kHudItemInVramPtr +0x8dfafd: Hud_UpdateItemBox +0x8dfb91: Hud_UpdateInternal +0x8dfb94: Hud_Update_IgnoreItemBox +0x8dfc09: Hud_Update_IgnoreHealth +0x8dfcfa: Hud_SeemsUnused +0x8dfdab: Hud_UpdateHearts +0x8dfdd9: Hud_UpdateHearts_DrawHeart +0x8dfdef: kUpdateMagicPowerTilemap +0x8dfe77: kHudTilemap +0x8dffc1: new_random_gen +0x8dffd8: DoorAnim_DoWork2_Preserving +0x8e8000: kTextBits +0x8e9000: kDungAttrsForTile_Offs +0x8e902a: kDungAttrsForTile +0x8e942a: Dungeon_LoadCustomTileAttr +0x8e9459: kMap8DataToTileAttr +0x8e9659: kDungeon_DefaultAttr +0x8e97d9: Init_LoadDefaultTileAttr +0x8e986e: Module1A_Credits +0x8e9889: Credits_LoadNextScene_Overworld +0x8e9891: Credits_LoadNextScene_Dungeon +0x8e98b9: Credits_PrepAndLoadSprites +0x8e98d8: kEnding1_TargetScrollY +0x8e98f8: kEnding1_TargetScrollX +0x8e9918: kEnding1_Yvel +0x8e9938: kEnding1_Xvel +0x8e9958: Credits_ScrollScene_Overworld +0x8e99c5: Credits_ScrollScene_Dungeon +0x8e9a0a: kEnding1_3_Tab0 +0x8e9a2a: Credits_HandleSceneFade +0x8e9bca: kEndingSprites_Ptrs0 +0x8e9bea: kEndingSprites_Ptrs1 +0x8e9c0a: kEndingSprites_Num +0x8e9c1a: Credits_LoadSprites_Zora +0x8e9c27: Ending_InitSprites_2 +0x8e9c2f: Ending_InitSprites_3 +0x8e9c56: kInitSprite9_Delay +0x8e9c5b: Ending_InitSprites_9 +0x8e9c92: Ending_InitSprites_14 +0x8e9cb4: Ending_InitSprites_15 +0x8e9cca: Ending_InitSprites_7 +0x8e9cd1: Ending_InitSprites_12 +0x8e9cfe: Ending_InitSprites_0 +0x8e9d5c: Credits_LoadSprites_Venus +0x8e9d70: Ending_InitSprites_11 +0x8e9d84: Ending_InitSprites_1 +0x8e9df0: kEndSequence_Dmd15 +0x8e9e20: kEndSequence_Dmd16 +0x8e9e38: kEndSequence_Dmd17 +0x8e9e48: kEndSequence_Dmd11 +0x8e9e78: kEndSequence_Case0_Tab1 +0x8e9e84: kEndSequence_Case0_Tab0 +0x8e9e90: kEndSequence_Case0_OamFlags +0x8e9e9c: Credits_SpriteDraw_Castle +0x8e9ee1: kEndSequence_Dmd24 +0x8e9f01: kEndSequence_Dmd25 +0x8e9f21: kEndSequence_Dmd30 +0x8e9f29: kEnding_Case4_Tab1 +0x8e9f2b: kEnding_Case4_Tab0 +0x8e9f2d: kEnding_Case4_Ctr +0x8e9f31: kEnding_Case4_XYvel +0x8e9f3b: kEnding_Case4_DelayVel +0x8e9f53: Credits_SpriteDraw_Hera +0x8e9fc0: kEndSequence_Dmd20 +0x8e9ff0: kEndSequence_Dmd21 +0x8ea020: kEndSequence_Dmd19 +0x8ea060: kEndSequence_Dmd22 +0x8ea090: kEndSequence_Dmd23 +0x8ea0c0: kEndSequence_Dmd18 +0x8ea0d0: kEnding_Case2_Delay +0x8ea0d2: kEnding_Case2_Tab2 +0x8ea0d7: kEnding_Case2_Tab3 +0x8ea0de: kEnding_Case2_Tab0 +0x8ea0e0: kEnding_Case2_Tab1 +0x8ea0e2: Credits_SpriteDraw_Kakariko1 +0x8ea164: kEndSequence_Dmd4 +0x8ea194: kEndSequence_Dmd7 +0x8ea1a4: kEndSequence_Dmd5 +0x8ea1f4: kEndSequence_Dmd13 +0x8ea274: kEnding_Case5_Tab0 +0x8ea276: kEnding_Case5_Tab1 +0x8ea27a: kEnding_Case5_Tab2 +0x8ea27c: Credits_SpriteDraw_House +0x8ea2f8: kEndSequence_Dmd26 +0x8ea358: Credits_SpriteDraw_DeathMountain +0x8ea393: Credits_SpriteDraw_Lumberjacks +0x8ea3c7: Credits_SpriteDraw_Venus +0x8ea42d: kEndSequence_Dmd0 +0x8ea48d: kEndSequence_Dmd1 +0x8ea4bd: kEndSequence_Dmd2 +0x8ea53d: kEnding_Case12_Tab +0x8ea540: kEnding_Case12_Z +0x8ea54f: Credits_SpriteDraw_Kakariko2 +0x8ea5f8: Credits_SpriteDraw_DrawShadow +0x8ea5fd: EndSequence_DrawShadow2 +0x8ea60d: kEnding_Func2_Delay +0x8ea627: kEnding_Func2_Tab0 +0x8ea643: Credits_SpriteDraw_AnimateRunningKidAndLocksmith +0x8ea645: Ending_Func2 +0x8ea692: Credits_SpriteDraw_ActivateAndRunSprite_allocate8 +0x8ea694: Credits_SpriteDraw_ActivateAndRunSprite +0x8ea6b1: Credits_SpriteDraw_PreexistingSpriteDraw_eight +0x8ea6b3: Credits_SpriteDraw_PreexistingSpriteDraw +0x8ea703: Credits_SpriteDraw_Single +0x8ea73d: kEnding_Case6_SprType +0x8ea740: kEnding_Case6_OamSize +0x8ea743: kEnding_Case6_State +0x8ea746: kEnding_Case6_Gfx +0x8ea74c: Credits_SpriteDraw_Zora +0x8ea79a: kEndSequence_Dmd3 +0x8ea7fa: kEndSequence_Dmd31 +0x8ea802: Credits_SpriteDraw_Smithy +0x8ea888: kEndSequence_Dmd27 +0x8ea8b8: kEnding_Case11_Gfx +0x8ea8c8: Credits_SpriteDraw_DrawSmithSpark +0x8ea8e5: kEndSequence_Dmd28 +0x8ea925: kEndSequence_Dmd29 +0x8ea93d: kEnding_Case3_Gfx +0x8ea941: Credits_SpriteDraw_Desert +0x8ea995: kEndSequence_Dmd6 +0x8ea9ad: Credits_SpriteDraw_Sanctuary +0x8ea9d1: kEnding_Case7_Gfx +0x8ea9d3: Credits_SpriteDraw_Witch +0x8eaa53: kEndSequence_Dmd9 +0x8eaa73: kEndSequence_Dmd8 +0x8eaa7b: kEnding_Case8_Xvel +0x8eaa7d: kEnding_Case8_Delay1 +0x8eaa81: kEnding_Case8_Delay2 +0x8eaa86: kEnding_Case8_D +0x8eaa91: Credits_SpriteDraw_Grove +0x8eab45: kEndSequence_Dmd12 +0x8eabed: kEnding_Case14_Tab1 +0x8eabf0: kEnding_Case14_Tab0 +0x8eabf5: Credits_SpriteDraw_LostWoods +0x8eaca2: Credits_SpriteDraw_SetShadowProp +0x8eacab: kEndSequence_Dmd10 +0x8eaccb: kEnding_Case15_OamFlags +0x8eaccf: kEnding_Case15_Delay +0x8eacd7: kEnding_Func3_Delay +0x8eacdd: kEnding_Case15_X +0x8eace1: kEnding_Case15_Y +0x8eace5: Credits_SpriteDraw_AddSparkle +0x8ead22: Credits_SpriteDraw_Pedestal +0x8eadb7: kEndSequence_Dmd14_xx +0x8eadbf: kEndSequence_Dmd14 +0x8eade7: kEnding_Func6_Dma +0x8eadf7: Credits_SpriteDraw_WalkLinkAwayFromPedestal +0x8eae2d: kEnding_Func5_Xvel +0x8eae31: kEnding_Func5_Yvel +0x8eae35: Credits_SpriteDraw_MoveSquirrel +0x8eae5f: kEnding_MoveSprite_Func1_TargetX +0x8eae61: kEnding_MoveSprite_Func1_TargetY +0x8eae63: Credits_SpriteDraw_CirclingBirds +0x8eaea6: Credits_HandleCameraScrollControl +0x8eaff2: Credits_SingleCameraScrollControl +0x8eb038: kEnding_MapData +0x8eb178: kEnding_Credits_Text +0x8eb93d: kEnding_Credits_Offs +0x8ebc51: kEnding_Digits_ScrollY +0x8ebc6d: EndSequence_32 +0x8ebd53: kHdmaTableForEnding +0x8ebd66: Credits_FadeOutFixedCol +0x8ebd8b: Credits_FadeColorAndBeginAnimating +0x8ebe04: kEnding_Credits_DigitChar +0x8ebe08: kEnding_Func9_Tab2 +0x8ebe24: Credits_AddNextAttribution +0x8ebf4c: kEnding0_Data +0x8ec2e1: kEnding0_Offs +0x8ec303: Credits_AddEndingSequenceText +0x8ec37c: Credits_BrightenTriangles +0x8ec391: Credits_StopCreditsScroll +0x8ec3b8: Credits_FadeAndDisperseTriangles +0x8ec3d5: Credits_FadeInTheEnd +0x8ec3ea: kEndSequence37_Oams +0x8ec3fa: EndSequence_38_0 +0x8ec41a: Credits_HangForever +0x8ec440: RenderText +0x8ec448: Messaging_Text_Near +0x8ec455: RenderText_PostDeathSaveOptions +0x8ec483: Text_Initialize +0x8ec493: Text_Initialize_initModuleStateLoop +0x8ec4c9: Text_InitVwfState +0x8ec4e2: Text_LoadCharacterBuffer +0x8ec547: RenderText_ExtendedCommand +0x8ec581: RenderText_ExtendedCommand_IgnoreCommand +0x8ec598: RenderText_ExtendedCommand_IgnoreParameter +0x8ec5b3: Text_WritePlayerName +0x8ec639: Text_FilterPlayerNameCharacters +0x8ec657: RenderText_ExtendedCommand_SetWindowType +0x8ec667: Text_WritePreloadedNumber +0x8ec69c: RenderText_ExtendedCommand_SetWindowPosition +0x8ec6b6: Text_SetColor +0x8ec6da: Text_DictionarySequence +0x8ec703: Text_DictionaryPointers +0x8ec8d9: Text_Render +0x8ec8ea: RenderText_Draw_Border +0x8ec919: RenderText_Draw_BorderIncremental +0x8ec936: RenderText_Draw_BorderIncremental_Top +0x8ec94a: RenderText_Draw_BorderIncremental_Middle +0x8ec961: RenderText_Draw_BorderIncremental_Bottom +0x8ec97d: RenderText_Draw_CharacterTilemap +0x8ec984: RenderText_Draw_MessageCharacters +0x8ec9fd: RenderText_Draw_HandleNext +0x8eca35: RenderText_Draw_Finish +0x8eca6c: RenderText_Draw_RenderCharacter +0x8eca99: RenderText_Draw_RenderCharacter_All +0x8ecab8: VWF_RenderSingle +0x8ecadf: kVWF_RenderCharacter_widths +0x8ecb42: kVWF_RenderCharacter_setMasks +0x8ecb4a: kVWF_RenderCharacter_renderPos +0x8ecb50: kVWF_RenderCharacter_linePositions +0x8ecb56: kVWF_RenderCharacter_unsetMasks +0x8ecb5e: VWF_RenderCharacter +0x8eccf9: RenderText_Draw_RenderCharacter_ReduceSpeed +0x8eccfe: RenderText_Draw_NextImage +0x8ecd16: VWF_Select2Or3_Indented_messages +0x8ecd1a: RenderText_Draw_Choose2LowOr3 +0x8ecd88: RenderText_Draw_ChooseItem +0x8ecdc8: RenderText_FindYItem_Previous +0x8ecded: RenderText_FindYItem_Next +0x8ece14: RenderText_DrawSelectedYItem +0x8ece6b: RenderText_Draw_Ignore +0x8ece7f: VWF_Select2Or3_messages +0x8ece83: RenderText_Draw_Choose2HiOr3 +0x8ecef1: VWF_Crash +0x8ecef7: RenderText_Draw_Choose3 +0x8ecf6e: VWF_Choose1Or2_messages +0x8ecf72: RenderText_Draw_Choose1Or2 +0x8ecfe2: RenderText_Draw_Scroll +0x8ed0c3: kVWF_RowPositions +0x8ed0c9: VWF_SetLine +0x8ed0f2: RenderText_Draw_SetColor +0x8ed115: RenderText_Draw_Wait +0x8ed138: RenderText_Draw_Wait_Init +0x8ed14c: VWF_WaitLoop_decCounter +0x8ed154: RenderText_Draw_Wait_End +0x8ed162: RenderText_Draw_PlaySfx +0x8ed176: RenderText_Draw_SetSpeed +0x8ed18d: RenderText_Draw_Command7B +0x8ed1bd: RenderText_Draw_ABunchOfSpaces +0x8ed1f9: RenderText_Draw_EmptyBuffer +0x8ed230: RenderText_Draw_PauseForInput +0x8ed25b: RenderText_Draw_Terminate +0x8ed280: RenderText_SetDefaultWindowPosition +0x8ed29c: RenderText_DrawBorderInitialize +0x8ed2ab: RenderText_DrawBorderRow +0x8ed2ec: Text_BuildCharacterTilemap +0x8ed307: RenderText_Refresh +0x8ed35a: kText_InitializationData +0x8ed37f: kText_BorderTiles +0x8ed391: kText_Positions +0x8ed399: kVWF_LinePositions +0x8ed39f: kVWF_Command7C +0x8ed3a7: kVWF_Command7B +0x8ed3af: kText_WaitDurations +0x8ed3cf: Text_UnusedData +0x8ed3d2: kText_CommandLengths +0x8ed3eb: Text_GenerateMessagePointers +0x8ed460: kDungPalinfos +0x8ed504: kOwBgPalInfo +0x8ed580: kOwSprPalInfo +0x8ed5a8: Overworld_LoadPalettes +0x8ed5f4: Palette_BgAndFixedColor_Black +0x8ed5f9: Palette_SetBgAndFixedColor +0x8ed60b: SetBackdropcolorBlack +0x8ed618: Palette_SetOwBgColor +0x8ed61d: Palette_SpecialOw +0x8ed622: Palette_GetOwBgColor +0x8ed653: Palette_AssertTranslucencySwap_ForcePlayerToBg1 +0x8ed657: Palette_AssertTranslucencySwap +0x8ed65c: Palette_SetTranslucencySwap +0x8ed6b9: Palette_RevertTranslucencySwap_ForcePlayerBg2 +0x8ed6bb: Palette_RevertTranslucencySwap +0x8ed6c0: LoadActualGearPalettes +0x8ed6d1: Palette_ElectroThemedGear +0x8ed6dd: LoadGearPalettes_bunny +0x8ed6e8: LoadGearPalettes +0x8ed741: LoadGearPalette +0x8ed757: Filter_Majorly_Whiten_Bg +0x8ed7fe: Filter_Majorly_Whiten_Color +0x8ed83a: Palette_Restore_BG_From_Flash +0x8ed8ae: Palette_Restore_Coldata +0x8ed8fb: Palette_Restore_BG_And_HUD +0x8ed940: DungMap_LightenUpMap +0x8ed94c: DungMap_Backup +0x8eda37: DungMap_FadeMapToBlack +0x8eda79: DungMap_RestoreOld +0x8edd40: Overworld_Memorize_Map16_Change +0x8edd61: kLwTurtleRockPegPositions +0x8edd67: HandlePegPuzzles +0x8eddfc: GanonTowerEntrance_Func1 +0x8ede29: kSpecialSwitchArea_Map8 +0x8ede31: kSpecialSwitchArea_Screen +0x8ede39: kSpecialSwitchArea_Direction +0x8ede41: kSpecialSwitchArea_Exit +0x8ede49: Overworld_CheckSpecialSwitchArea +0x8ede9a: Overworld_GetMap16OfLink_Mult8 +0x8edece: kSpecialSwitchAreaB_Map8 +0x8eded4: kSpecialSwitchAreaB_Screen +0x8ededa: kSpecialSwitchAreaB_Direction +0x8edee0: WeirdAssPlaceForAnExit +0x8edee3: Overworld_Func0_Main_SpecialOverworldInner +0x8ef400: Palette_AnimGetMasterSword +0x8ef404: Palette_AnimGetMasterSword2 +0x8ef48c: Palette_AnimGetMasterSword3 +0x8ef4eb: kDwPaletteAnim +0x8ef531: kDwPaletteAnim2 +0x8ef582: Overworld_DwDeathMountainPaletteAnimation +0x8ef652: Overworld_LoadEventOverlay +0x8ef664: Overworld_EventOverlayFuncs +0x8f8000: map8_data +0x8ff540: Sprite_NullifyHookshotDrag +0x8ff577: Ancilla_AllocInit +0x8ff5c3: kDeath_AnimCtr0 +0x8ff5d2: kDeath_AnimCtr1 +0x8ff5e1: kDeath_SprFlags +0x8ff5e3: Death_PlayerSwoon +0x8ff64d: return_loc_8FF64D +0x8ff64f: kSwordBeam_Tab +0x8ff65f: kSwordBeam_Yvel +0x8ff663: kSwordBeam_Xvel +0x8ff667: kSwordBeam_S +0x8ff66b: kSwordBeam_Y +0x8ff66f: kSwordBeam_YHi +0x8ff673: kSwordBeam_X +0x8ff677: kSwordBeam_Xhi +0x8ff67b: AddSwordBeam +0x8ff74d: kSwordBeam_Char +0x8ff751: kSwordBeam_Char2 +0x8ff754: kSwordBeam_Yvel2 +0x8ff758: kSwordBeam_Yvel2Hi +0x8ff75c: kSwordBeam_Xvel2 +0x8ff760: kSwordBeam_Xvel2Hi +0x8ff764: Ancilla_SwordBeam_ +0x8ff8eb: kSwordFullChargeSpark_Y +0x8ff8f3: kSwordFullChargeSpark_X +0x8ff8fb: kSwordFullChargeSpark_Flags +0x8ff8ff: Ancilla_SwordFullChargeSpark_ +0x8ff961: kSwordChargeSparkle_Y +0x8ff969: kSwordChargeSparkle_X +0x8ff971: kSwordChargeSparkle_A +0x8ff975: kSwordChargeSparkle_B +0x8ff979: AncillaSpawn_SwordChargeSparkle +0x8ffa37: Ancilla_MoveX_ +0x8ffa43: Ancilla_MoveY_ +0x8ffa6f: Death_PrepFaint +0x8ffaea: ShopKeeper_RapidTerminateReceiveItem +0x8ffafe: DashTremor_TwiddleOffset +0x8ffb7a: kBombosBlasts_Tab +0x8ffbc2: kRadialProjection_Tab2 +0x8ffc02: kRadialProjection_Tab0 +0x8ffc42: kRadialProjection_Tab1 +0x8ffc82: kRadialProjection_Tab3 +0x8ffcc2: kSomarianBlockDivide_Y +0x8ffce2: kSomarianBlockDivide_X +0x8ffd02: kSomarianBlockDivide_Char +0x8ffd12: kSomarianBlockDivide_Flags +0x8ffd22: Link_CheckBunnyStatus +0x8ffd3c: Ancilla_TerminateWaterfallSplashes +0x8ffd52: Ancilla_TerminateIfOffscreen +0x8ffd86: Sprite_InitializeSecondaryItemMinigame +0x8ffdaa: Main_ShowTextMessage +0x8ffdc4: Sprite_SpawnSparkleAncilla +0x8ffdcf: Bomb_CheckUndersideSpriteStatus +0x9af500: kRetreatBat_Dmds +0x9af590: kRetreatBat_Xpos +0x9af598: kRetreatBat_Ypos +0x9af5a0: kRetreatBat_Delay +0x9af5a5: Sprite_37_Waterfall +0x9af5ad: Sprite_Waterfall +0x9af5b8: Waterfall +0x9af5d5: kRetreatBat_Bg1Y +0x9af5d9: Sprite_BatCrash +0x9af63d: BatCrash_Approach +0x9af684: BatCrash_Ascend +0x9af6c8: BatCrash_DiveBomb +0x9af6e9: BatCrash_StallTheInevitable +0x9af6f5: Sprite_SpawnBatCrashCutscene +0x9af730: kRetreatBat_Oams +0x9af750: BatCrash_DrawHardcodedGarbage +0x9af76d: kPyramidDebris_X +0x9af78b: kPyramidDebris_Y +0x9af7a9: kPyramidDebris_Xvel +0x9af7c7: kPyramidDebris_Yvel +0x9af7e5: BatCrash_SpawnDebris +0x9af81f: kRetreatBat_count +0x9af833: RetreatBat_Draw +0x9af85c: kDrinkingGuy_Dmd +0x9af88c: DrinkingGuy_Draw +0x9af8ac: kLadyDmd +0x9af92c: Lady_Draw +0x9af954: Sprite_ReturnIfInactive___ +0x9af971: kLanmolaShrapnel_Yvel +0x9af979: kLanmolaShrapnel_Xvel +0x9af981: Lanmola_SpawnShrapnel +0x9af9e6: UNREACHABLE_1AF9E6 +0x9afa0c: Sprite_Cukeman +0x9afa7e: kCukeman_Dmd +0x9afb0e: Cukeman_Draw +0x9afb2c: RunningBoy_SpawnDustGarnish +0x9afb7b: kSecretSubst_Tab0 +0x9afbbb: kSecretSubst_Tab2 +0x9afbcb: kSecretSubst_Tab1 +0x9afbdb: Overworld_SubstituteAlternateSecret +0x9afc31: Sprite_MovableMantle_ +0x9afc39: Sprite_EE_CastleMantle_bounce +0x9afc9b: kMovableMantle_X +0x9afca1: kMovableMantle_Y +0x9afca7: kMovableMantle_Char +0x9afcad: kMovableMantle_Flags +0x9afcb3: MovableMantle_Draw +0x9afced: kMothula_Dmd +0x9afdad: SpriteDraw_Mothula +0x9afdb5: Mothula_Draw +0x9afe48: kMothula_Draw_X +0x9afe7e: kBottleVendor_GoodBeeX +0x9afe83: kBottleVendor_GoodBeeY +0x9afe88: BottleMerchant_BuyBee +0x9afecf: Sprite_ChickenLady_ +0x9afed3: Sprite_ChickenLady +0x9aff00: SpritePrep_DiggingGameGuy +0x9aff2b: kItem_Hammer_SpawnWater_X +0x9aff33: kItem_Hammer_SpawnWater_Y +0x9aff3c: SpawnHammerWaterSplash +0x9bb800: kFallHole_Pos +0x9bb826: kFallHole_Area +0x9bb84c: kFallHole_Entrances +0x9bb860: Overworld_GetPitDestination +0x9bb8bf: kOverworld_Entrance_Tab0 +0x9bb917: kOverworld_Entrance_Tab1 +0x9bb96f: kOverworld_Entrance_Area +0x9bba71: kOverworld_Entrance_Pos +0x9bbb73: kOverworld_Entrance_Id +0x9bbbf4: Overworld_UseEntrance +0x9bbd7a: HandleItemTileAction_Overworld +0x9bbd82: Overworld_ToolAndTileInteraction +0x9bbf1e: Overworld_PickHammerSfx +0x9bbf4c: kBigRockTab1 +0x9bbf54: kBigRockTabY +0x9bbf5c: kBigRockTabX +0x9bbf64: Overworld_GetLinkMap16Coords +0x9bbf9d: Overworld_HandleLiftableTiles +0x9bc008: Overworld_LiftingSmallObj +0x9bc055: Overworld_SmashRockPile +0x9bc063: Overworld_SmashRockPile_downOneTile +0x9bc076: Overworld_SmashRockPile_normalCoords +0x9bc09f: SmashRockPile_fromLift +0x9bc0f8: Overworld_BombTiles32x32 +0x9bc155: Overworld_BombTile +0x9bc21d: Overworld_AlterWeathervane +0x9bc264: OpenGargoylesDomain +0x9bc2a7: CreatePyramidHole +0x9bc2f9: kSecretsForScreen +0x9bc8a4: Overworld_RevealSecret +0x9bc943: AdjustSecretForPowder +0x9bc952: Overworld_DrawWoodenDoor +0x9bc97c: Overworld_DrawMap16_Persist +0x9bc980: Overworld_DrawMap16 +0x9bc983: Overworld_DrawMap16_Anywhere +0x9bc9de: Overworld_AlterTileHardcore +0x9bca69: Overworld_FindMap16VRAMAddress +0x9bca9f: Overworld_CreateTRPortal +0x9bcaba: kOverworld_EntranceSequence +0x9bcac4: Overworld_AnimateEntrance +0x9bcade: Overworld_AnimateEntrance_PoD +0x9bcae5: AnimateEntrance_PoD_step1 +0x9bcb2b: AnimateEntrance_PoD_step2 +0x9bcb47: AnimateEntrance_PoD_step3 +0x9bcb6c: AnimateEntrance_PoD_step4 +0x9bcb91: AnimateEntrance_PoD_step5 +0x9bcba6: Overworld_AnimateEntrance_Skull +0x9bcbad: AnimateEntrance_Skull_step1 +0x9bcbee: AnimateEntrance_Skull_step2 +0x9bcc27: AnimateEntrance_Skull_step3 +0x9bcc4d: AnimateEntrance_Skull_step4 +0x9bcc8c: AnimateEntrance_Skull_step5 +0x9bccd4: Overworld_AnimateEntrance_Mire +0x9bccfa: kMiseryMireEntranceBits +0x9bcd14: AnimateEntrance_Mire_step1 +0x9bcd41: AnimateEntrance_Mire_step2 +0x9bcda9: AnimateEntrance_Mire_step3 +0x9bcdd7: AnimateEntrance_Mire_step4 +0x9bce05: AnimateEntrance_Mire_step5 +0x9bce28: Overworld_AnimateEntrance_TurtleRock +0x9bce48: AnimateEntrance_TurtleRock_step1 +0x9bce5e: Overworld_EntranceSequence_Func3_1 +0x9bce62: Overworld_EntranceSequence_Func3_2 +0x9bce66: Overworld_EntranceSequence_Func3_3 +0x9bce8a: AnimateEntrance_TurtleRock_step5 +0x9bceac: AnimateEntrance_TurtleRock_step6 +0x9bcef8: AnimateEntrance_TurtleRock_step7 +0x9bcf17: AnimateEntrance_TurtleRock_step8 +0x9bcf40: OverworldEntrance_PlayJingle +0x9bcf60: OverworldEntrance_DrawManyTR +0x9bcfd9: Overworld_AnimateEntrance_GanonsTower +0x9bcfe0: AnimateEntrance_GanonsTower_step01 +0x9bcff1: AnimateEntrance_GanonsTower_step02 +0x9bd00e: OverworldEntrance_AdvanceAndBoom +0x9bd01d: AnimateEntrance_GanonsTower_step03 +0x9bd062: AnimateEntrance_GanonsTower_step04 +0x9bd093: AnimateEntrance_GanonsTower_step05 +0x9bd0de: AnimateEntrance_GanonsTower_step06 +0x9bd107: AnimateEntrance_GanonsTower_step07 +0x9bd127: AnimateEntrance_GanonsTower_step08 +0x9bd14d: AnimateEntrance_GanonsTower_step09 +0x9bd16d: AnimateEntrance_GanonsTower_step10 +0x9bd19f: AnimateEntrance_GanonsTower_step11 +0x9bd1c0: AnimateEntrance_GanonsTower_step12 +0x9bd218: kPalette_MainSpr +0x9bd308: kPalette_ArmorAndGloves +0x9bd39e: kPalette_SpriteAux3 +0x9bd446: kPalette_MiscSprite_Indoors +0x9bd4e0: kPalette_SpriteAux1 +0x9bd630: kPalette_Sword +0x9bd648: kPalette_Shield +0x9bd660: kHudPalData +0x9bd70a: kPalette_PalaceMapSpr +0x9bd734: kPalette_DungBgMain +0x9be544: kPalette_PalaceMapBg +0x9be604: kPalette_OverworldBgAux3 +0x9be6c8: kPalette_OverworldBgMain +0x9be86c: kPalette_OverworldBgAux12 +0x9bebc6: kMult_14 +0x9bebd6: kMult_14b +0x9bec13: kMult_42 +0x9bec3b: kMult_70 +0x9bec47: kHudPaletteOffs +0x9bec4b: kMult_180 +0x9bec77: Palette_Load_SpritePal0Left +0x9bec9e: Palette_Load_SpriteMain +0x9becc5: Palette_Load_SpriteAux1 +0x9bece4: Palette_Load_SpriteAux2 +0x9bed03: Palette_Load_Sword +0x9bed29: Palette_Load_Shield +0x9bed4f: UNREACHABLE_1BED4F +0x9bed6e: Palette_Load_SpriteEnvironment +0x9bed72: Palette_Load_SpriteEnvironment_Dungeon +0x9bed91: Palette_MiscSprite_Outdoors +0x9beddd: Palette_Load_DungeonMapSprite +0x9bedf5: kGlovesColor +0x9bedf9: Palette_Load_LinkArmorAndGloves +0x9bee1b: Palette_UpdateGlovesColor +0x9bee3a: Palette_Load_DungeonMapBG +0x9bee52: Palette_Load_HUD +0x9bee74: Palette_Load_DungeonSet +0x9beea8: Palette_Load_OWBG3 +0x9beec7: Palette_Load_OWBGMain +0x9beee8: Palette_Load_OWBG1 +0x9bef0c: Palette_Load_OWBG2 +0x9bef30: Palette_LoadSingle +0x9bef4b: Palette_LoadMultiple +0x9bef7b: Palette_LoadMultiple_Arbitrary +0x9bef96: Palette_LoadForFileSelect +0x9bf032: Palette_LoadForFileSelect_Armor +0x9bf072: Palette_LoadForFileSelect_Sword +0x9bf09a: Palette_LoadForFileSelect_Shield +0x9bf0c2: Palette_LoadAgahnim +0x9bf110: kSomeTileAttr +0x9d8000: kFish_Tab2 +0x9d8010: Sprite_ApplyConveyor +0x9d8040: Sprite_CreateDeflectedArrow +0x9d808c: Sprite_Move_0x9d +0x9d8094: Sprite_CheckTileCollision____ +0x9d8099: Sprite_D4_Landmine +0x9d80bb: kLandMine_OamFlags +0x9d80bf: Landmine_Detonating +0x9d80fc: kLandmine_Dmd +0x9d810c: Landmine_Draw +0x9d8129: Sprite_D3_Stal +0x9d814f: Stal_Dormant +0x9d8198: kStal_Gfx +0x9d819d: Stal_Active +0x9d81dc: kStal_Dmd +0x9d820c: Stal_Draw +0x9d8235: Sprite_D2_FloppingFish +0x9d826c: FloppingFish_WriggleInHands +0x9d827e: FloppingFish_PrepareLeap +0x9d828b: Sprite_SpawnSmallWaterSplash_ +0x9d8290: kFish_Gfx2 +0x9d82a1: FloppingFish_Leap +0x9d830f: FloppingFish_CheckForWaterInit +0x9d8321: kFish_Xvel +0x9d8329: kFish_Yvel +0x9d8331: kFish_Tab1 +0x9d8333: kFish_Gfx +0x9d8336: FloppingFish_Flop +0x9d83b6: kFish_Dmd +0x9d8436: kFish_Dmd2 +0x9d847e: DontDrawFloppingFish +0x9d8483: Fish_Draw +0x9d84f1: kChimneySmoke_Dmd +0x9d8531: ChimneySmoke_Draw +0x9d8549: Sprite_DrawMultiple__ +0x9d8550: Sprite_ChimneySmoke +0x9d858b: Sprite_D1_BunnyBeam +0x9d858f: Sprite_Chimney +0x9d85e0: Sprite_BunnyBeam +0x9d85fa: kRabbitBeam_Gfx +0x9d8600: RabbitBeam_Active +0x9d866a: Sprite_D0_Lynel +0x9d868a: kLynel_Xtarget +0x9d8694: kLynel_Ytarget +0x9d8698: Lynel_TargetLink +0x9d86cd: kLynel_Gfx +0x9d86d5: Lynel_ApproachPlayer +0x9d873c: kLynel_AttackGfx +0x9d8740: Lynel_Fire +0x9d8778: kLynel_Dmd +0x9d8880: Lynel_Draw +0x9d88a1: Sprite_SpawnPhantomGanon +0x9d88bc: Sprite_PhantomGanon +0x9d8906: kGanonBat_Gfx +0x9d890a: kGanonBat_TargetXvel +0x9d890c: kGanonBat_TargetYvel +0x9d890e: Sprite_GanonBat +0x9d89bb: kGanonBat_Dmd +0x9d89eb: GanonBat_Draw +0x9d8a04: kPhantomGanon_Dmd +0x9d8a84: PhantomGanon_Draw +0x9d8aa9: SwishEvery16Frames +0x9d8ab6: Sprite_GanonTrident +0x9d8ae4: Sprite_ApproachTargetSpeed_ +0x9d8b07: kTrident_Xoffs +0x9d8b0b: Trident_AimForParentPosition +0x9d8b49: Sprite_FireBat_Trailer +0x9d8b52: Sprite_SpiralFireBat +0x9d8b90: FireBat_Move +0x9d8bbc: Sprite_AdjustAuxCoords_bank1D +0x9d8bd1: kFirebat_X +0x9d8bd3: kFirebat_Xhi +0x9d8bd5: kFirebat_Y +0x9d8bd7: Sprite_FireBat_Launched +0x9d8bee: GetPositionRelativeToTheGreatOverlordGanon +0x9d8c17: FireBat_PositionSelfAndAnimateAndPrepareForLaunch +0x9d8c2b: kFirebat_Gfx2 +0x9d8c34: kFirebat_Gfx +0x9d8c38: FireBat_PositionSelfAndAnimate +0x9d8c43: FireBat_Animate +0x9d8c55: FireBat_LaunchedFlying +0x9d8c90: kFirebat_Draw_X +0x9d8c94: kFirebat_Draw_Char +0x9d8c9b: kFirebat_Draw_Flags +0x9d8ca9: FireBat_Draw +0x9d8d06: Ganon_AttemptTridentCatch +0x9d8d29: SpritePrep_Ganon_PrepareBattle +0x9d8d50: kGanonMath_X +0x9d8d60: kGanonMath_Y +0x9d8d70: Ganon_HandleFireBatCircle +0x9d8e75: Six_NOP +0x9d8e7c: Ganon_SpawnSpiralBat +0x9d8eb4: Sprite_D6_Ganon +0x9d8ecb: kGanon_HeadDir0 +0x9d8ecd: kGanon_GfxB +0x9d8f8a: kGanon_Gfx19 +0x9d8f8c: Ganon_Phase4_Stunned +0x9d8fb8: kGanon_Gfx17b +0x9d8fba: kGanon_Gfx17 +0x9d8fbc: Ganon_Phase4_Attack +0x9d8ffa: Ganon_EnableInvincibility +0x9d9016: kGanon_Gfx15 +0x9d9018: Ganon_Phase3_SmashFloor +0x9d9042: kGanon_Gfx16 +0x9d9044: Ganon_Phase3_DropTiles +0x9d907f: Sprite_ShowMessageMinimal_ +0x9d90c4: kGanon_Ov_Type +0x9d90c8: kGanon_Ov_X +0x9d90cc: kGanon_Ov_Y +0x9d90d0: Ganon_SpawnFallingTilesOverlord +0x9d910d: kGanon_Gfx12 +0x9d9113: Ganon_Phase3_FireBats +0x9d9158: kGanon_Gfx16_Y +0x9d915c: Ganon_SpawnFireBat_trailing +0x9d9160: Ganon_Func1_3 +0x9d9162: Ganon_Func1 +0x9d91d5: Ganon_Phase3_SabotagePB +0x9d9203: Ganon_Phase2_CircleOfBats +0x9d9231: kGanon_Tab2 +0x9d9240: kGanon_Delay8 +0x9d9248: Ganon_Phase2_LaunchSpiralBats +0x9d928f: Ganon_Phase2_Warp +0x9d92aa: Ganon_Phase2_MakePhaseDecision +0x9d92ca: Ganon_Phase1_IntroduceSelf +0x9d92f7: kGanon_G_Func2 +0x9d9307: kGanon_GfxFunc2 +0x9d9317: kGanon_X1 +0x9d9319: kGanon_XHi1 +0x9d931b: kGanon_Y1 +0x9d931d: kGanon_YHi1 +0x9d931f: kGanon_Xvel1 +0x9d932f: kGanon_Yvel1 +0x9d933f: kGanon_Gfx1 +0x9d9354: Ganon_Phase1_ThrowTrident +0x9d93db: Ganon_Phase1_AnimateTridentSpin +0x9d93fb: kGanon_Gfx2_0 +0x9d93fd: Ganon_Phase1_WaitForTrident +0x9d9424: kGanon_G +0x9d9426: kGanon_Gfx +0x9d9428: Ganon_Phase1_MakePhaseDecision +0x9d9443: Ganon_HandleAnimation_Idle +0x9d9456: Ganon_Func2_ +0x9d945a: kGanon_HeadDir +0x9d946c: Ganon_Phase1_Warp +0x9d947f: Ganon_SelectWarpLocation +0x9d94ba: Ganon_ShakeHead +0x9d94c5: kGanon_NextX +0x9d94cd: kGanon_NextY +0x9d94d5: kGanon_NextSubtype +0x9d94f5: Ganon_Phase3_Warp +0x9d94fa: Ganon_LookAround +0x9d95ad: Ganon_Phase2_HoldTrident +0x9d95ce: kGanon_Draw_X +0x9d969a: kGanon_Draw_Y +0x9d9766: kGanon_Draw_Char +0x9d9832: kGanon_SprOffs +0x9d9843: kGanon_Draw_Flags +0x9d990f: kTrident_Dmd +0x9d9a9f: kTrident_Draw_X +0x9d9aa9: kTrident_Draw_Y +0x9d9ab3: kGanon_Draw_Char2 +0x9d9abf: kGanon_Draw_Flags2 +0x9d9acb: kGanon_Dmd +0x9d9adf: Ganon_Draw +0x9d9c1c: Trident_Draw +0x9d9c7a: kSwamola_Mult32 +0x9d9c80: SpritePrep_Swamola_InitializeSegments +0x9d9cb0: Sprite_CF_Swamola +0x9d9ced: kSwamola_Target_X +0x9d9cff: kSwamola_Target_Y +0x9d9d11: kSwamola_Target_Dir +0x9d9d19: Swamola_Emerge +0x9d9d67: Swamola_Ascend +0x9d9d80: Sprite_Swamola_ApproachTargetVelocity +0x9d9da3: kSwamola_Z_Accel +0x9d9da5: kSwamola_Z_Vel_Target +0x9d9da7: Swamola_Wiggle +0x9d9e13: Swamola_ProjectVelocityTowardsTarget +0x9d9e32: Swamola_Descend +0x9d9e62: Swamola_Submerge +0x9d9eaa: Swamola_SpawnRipples +0x9d9ece: Sprite_Swamola_Ripples +0x9d9edd: kSwamolaRipples_Dmd +0x9d9f1d: SwamolaRipples_Draw +0x9d9f3c: kSwamola_HistOffs +0x9d9f40: kSwamola_Gfx +0x9d9f50: kSwamola_Draw_OamFlags +0x9d9f60: kSwamola_Gfx2 +0x9d9f64: Swamola_Draw +0x9da03c: Blind_SpawnFromMaiden +0x9da081: SpritePrep_Blind_PrepareBattle +0x9da0b1: BlindLaser_SpawnTrailGarnish +0x9da110: kBlindHead_XvelLimit +0x9da112: kBlindHead_XposLimit +0x9da114: kBlindHead_YvelLimit +0x9da116: kBlindHead_YposLimit +0x9da118: Sprite_Blind_Head +0x9da1ed: Blind_SpawnHead +0x9da23c: kBlindLaser_Gfx +0x9da24c: kBlindLaser_OamFlags +0x9da25c: kBlind_Gfx0 +0x9da263: Sprite_CE_Blind +0x9da268: Sprite_BlindLaser +0x9da2d2: Sprite_Blind_Blind_Blind +0x9da3d4: kBlind_Gfx_BehindCurtain +0x9da3d8: Blind_Undress +0x9da40b: kBlind_Gfx_Rerobe +0x9da410: Blind_Rerobe +0x9da445: kBlindHead_SpawnFireball_Xvel +0x9da455: kBlindHead_SpawnFireball_Yvel +0x9da465: Blind_FireballFlurry +0x9da49d: Blind_SpitFireball +0x9da4c6: Blind_THELIGHT +0x9da4f9: SpawnBossPoof +0x9da53a: Blind_EscapeLight +0x9da567: kBlind_Oscillate_YVelTarget +0x9da569: kBlind_Oscillate_XVelTarget +0x9da56b: kBlind_Oscillate_XPosTarget +0x9da56d: Blind_Shimmy +0x9da604: kBlind_SwitchWall_YVelTarget +0x9da606: kBlind_SwitchWall_YPosTarget +0x9da608: Blind_SwapSides +0x9da647: Blind_Decelerate_X +0x9da665: kBlind_WhirlAround_Gfx +0x9da667: Blind_Spin +0x9da6a4: Blind_Decelerate_Y +0x9da6c0: Blind_CheckBumpDamage +0x9da6cf: kBlind_Gfx_Animate +0x9da6d7: kBlind_HeadDir +0x9da6e7: kBlind_Animate_Tab +0x9da6ef: Blind_Animate +0x9da729: Blind_AnimateRobes +0x9da745: kBlind_Laser_Xvel +0x9da755: kBlind_Laser_Yvel +0x9da765: Blind_SpawnLaser +0x9da7aa: kBlind_Dmd +0x9daaf2: kBlindPoof_Dmd +0x9dac2f: BlindPoof_Draw +0x9dac42: kBlind_OamIdx +0x9dac4c: kBlindHead_Draw_Char +0x9dac5c: kBlindHead_Draw_Flags +0x9dac6c: Blind_Draw +0x9dacc8: Blind_BumpDamageFromBody +0x9dad0e: Trinexx_Initialize +0x9dad16: TrinexxComponents_Initialize +0x9dad26: Trinexx_Initialize_Rock +0x9dad4f: Trinexx_RestoreXY +0x9dad67: Trinexx_Initialize_Fire +0x9dad70: TrinexxPartB_Initialize +0x9dad8c: Trinexx_CachePosition +0x9dada5: kSprite_TrinexxD_Gfx3 +0x9dadad: kSprite_TrinexxD_Gfx +0x9dadb5: Sprite_Trinexx_FinalPhase +0x9dae65: kSprite_TrinexxD_Xvel +0x9dae69: kSprite_TrinexxD_Yvel +0x9dae6d: Sprite_Trinexx_Phase2_SnekAlongWall +0x9daea8: Trinexx_CircleLink +0x9daef5: Sprite_Trinexx_Phase2_SnekAfterLink +0x9daf24: kTrinexxD_HistPos +0x9daf3c: kSprite_TrinexxD_Gfx2 +0x9daf54: kTrinexxD_OamOffs +0x9daf84: Sprite_TrinexxD_Draw +0x9db079: Sprite_Trinexx_CheckDamageToFlashingSegment +0x9db0ca: Sprite_CB_TrinexxRockHead +0x9db1b1: kTrinexx_X0 +0x9db1b9: kTrinexx_X0Hi +0x9db1c1: kTrinexx_Y0 +0x9db1c9: kTrinexx_Y0Hi +0x9db24a: kTrinexx_Tab0 +0x9db24e: kTrinexx_Tab1 +0x9db252: Trinexx_ChooseNextAction +0x9db2a1: Trinexx_MoveBody +0x9db34d: Sprite_Trinexx_State1_Inner +0x9db369: Trinexx_PrepareLunge +0x9db388: Trinexx_LungeHead +0x9db3b5: Trinexx_WagTail +0x9db3e6: Trinexx_HandleShellCollision +0x9db440: kTrinexx_Draw1_Dmd +0x9db560: SpriteDraw_TrinexxRockHead +0x9db587: SpriteDraw_TrinexxRockHeadAndBody +0x9db773: kTrinexx_Draw_X +0x9db7b9: kTrinexx_Draw_Y +0x9db7ff: kTrinexx_Draw_Char +0x9db804: kTrinexx_Mults +0x9db810: kTrinexx_Draw_Xoffs +0x9db820: kTrinexx_Draw_Yoffs +0x9db830: kTrinexxHead_Target0 +0x9db85d: kTrinexxHead_Target1 +0x9db88a: kTrinexxHead_Xoffs +0x9db88c: kTrinexxHead_B +0x9db897: Sprite_CC_TrinexxBreath_FireHead +0x9db89f: Sprite_CD_TrinexxBreath_IceHead +0x9db8a7: Sprite_Sidenexx +0x9db92b: Sidenexx_Stunned +0x9db986: Sidenexx_Dormant +0x9db9a6: Sidenexx_Think +0x9db9f2: Sidenexx_Move +0x9dba68: kTrinexxHead_FrameMask +0x9dba70: Sidenexx_Breathe +0x9dbae8: Sidenexx_ExhaleDanger +0x9dbafa: Trinexx_Func5_Inner +0x9dbb3f: Sidenexx_Explode +0x9dbb6d: kMult_9 +0x9dbb70: TrinexxHead_Draw +0x9dbc8c: TrinexxHead_FirstPart_X +0x9dbc91: TrinexxHead_FirstPart_Y +0x9dbc96: TrinexxHead_FirstPart_Char +0x9dbc9b: TrinexxHead_FirstPart_Flags +0x9dbca0: TrinexxHead_FirstPart_Draw +0x9dbd28: Sprite_TrinexxBreath_ice +0x9dbd44: Sprite_CC_CD_Common +0x9dbd65: Sprite_CD_SpawnGarnish +0x9dbdc6: Sprite_TrinexxBreath_fire +0x9dbdd6: Sprite_TrinexxFire_AddFireGarnish +0x9dbde8: Garnish_FlameTrail +0x9dbe3c: kChainChomp_Mult16 +0x9dbe44: SpritePrep_Chainchomp +0x9dbe7d: Sprite_CA_ChainChomp +0x9dbf0c: kChainChomp_Xvel +0x9dbf1c: kChainChomp_Yvel +0x9dbf2c: ChainChomp_Idle +0x9dbf95: ChainChomp_Meander +0x9dbfe5: ChainChomp_InvertLunge +0x9dc00c: ChainChomp_State3 +0x9dc020: kChainChomp_Muls +0x9dc02a: ChainChomp_MoveChain +0x9dc0f2: ChainChomp_HandleLeash +0x9dc172: kChainChomp_Gfx +0x9dc182: kChainChomp_OamFlags +0x9dc192: ChainChomp_Draw +0x9dc211: Sprite_CheckDamageBoth__ +0x9dc21a: SpriteActive4_MainLong +0x9dc222: SpriteActive4_Main +0x9dc26d: kTektite_Xvel +0x9dc271: kTektite_Yvel +0x9dc275: Sprite_C9_Tektite +0x9dc293: Sprite_Tektite +0x9dc2ce: kTektite_Dir +0x9dc2d2: Tektite_Idle +0x9dc388: Tektite_Midjump +0x9dc3a8: Tektite_Bouncy +0x9dc3c5: kTektite_Dmd +0x9dc3f5: Tektite_Draw +0x9dc414: Sprite_C8_BigFairy +0x9dc41c: Sprite_FairyCloud +0x9dc443: FairyCloud_ApproachLink +0x9dc489: FairyCloud_WaitForHeal +0x9dc49c: FairyCloud_Dissipate +0x9dc4bf: Sprite_BigFairy +0x9dc4f9: BigFairy_WaitForLink +0x9dc54f: BigFairy_DoAbsolutelyNothing +0x9dc550: kBigFaerie_Dmd +0x9dc5d0: BigFaerie_Draw +0x9dc5ee: kFaerieCloud_Draw_XY +0x9dc5fa: kFaerieCloud_Draw_XY_Hi +0x9dc606: kFaerieCloud_Draw_Idx +0x9dc616: FaerieCloud_Draw +0x9dc64f: Sprite_C7_Pokey +0x9dc69a: Hokbok_Main +0x9dc719: kHokbok_B +0x9dc721: Pokey_ResetBounce +0x9dc738: Pokey_MoveFaster +0x9dc751: Sprite_BounceFromTileCollision +0x9dc778: Sprite_BounceFromTileCollisionLong +0x9dc77d: Hokbok_Draw +0x9dc7eb: Sprite_C5_Medusa +0x9dc845: Fireball_Configure +0x9dc853: kFireballJunction_X +0x9dc85b: kFireballJunction_Y +0x9dc863: kFireballJunction_XYvel +0x9dc869: Sprite_C6_4WayShooter +0x9dc8cc: kThief_Gfx +0x9dc8d8: Sprite_C4_Thief +0x9dc90e: Thief_Loitering +0x9dc94c: Thief_Watching +0x9dc985: Thief_Chasing +0x9dc9df: Thief_Stealing +0x9dca24: Thief_ScanForBooty +0x9dca4c: Thief_TargetBooty +0x9dca9e: Thief_GrabBooty +0x9dcaf2: Thief_CheckCollisionWithLink +0x9dcb20: kThiefSpawn_Xvel +0x9dcb26: kThiefSpawn_Yvel +0x9dcb2c: kThiefSpawn_Items +0x9dcb30: Thief_SpillItems +0x9dcbd6: kThief_Dmd +0x9dcc96: kThief_DrawChar +0x9dcc9a: kThief_DrawFlags +0x9dcc9e: Thief_Draw +0x9dccdb: kGibo_OamFlags +0x9dccdf: kGibo_OamFlags2 +0x9dcce1: Sprite_C3_Gibo +0x9dcd12: Gibo_Main +0x9dcd62: kGibo_Xvel +0x9dcd6a: kGibo_Yvel +0x9dcd72: Gibo_Mitosis +0x9dcde2: Gibo_Osmosis +0x9dcdeb: Gibo_ConsumeDaughter +0x9dce5e: kGibo_Dmd +0x9dcf5e: Gibo_Draw +0x9dcfc3: kBoulder_Zvel +0x9dcfc5: kBoulder_Yvel +0x9dcfc7: kBoulder_Xvel +0x9dcfcb: Sprite_C2_Boulder +0x9dd02a: Boulder_OutdoorsMain +0x9dd088: kBoulder_Dmd +0x9dd108: kLargeShadow_Dmd +0x9dd180: kGanon_Mult24 +0x9dd185: Boulder_Draw +0x9dd1a8: SpriteDraw_BigShadow +0x9dd1af: Sprite_DrawLargeShadow2 +0x9dd1fd: CutsceneAgahnim_SpawnZeldaOnAltar +0x9dd234: Sprite_C1_CutsceneAgahnim +0x9dd23f: CutsceneAgahnim_Agahnim +0x9dd285: CutsceneAgahnim_HelloMyNameIs +0x9dd2a1: kChattyAgahnim_LevitateGfx +0x9dd2a5: CutsceneAgahnim_LightAsAFeatherStiffAsABoard +0x9dd2ef: CutsceneAgahnim_BanishZelda +0x9dd322: CutsceneAgahnim_MadeHerGoPoof +0x9dd34f: CutsceneAgahnim_Brag +0x9dd36b: CutsceneAgahnim_HideBehindCurtain +0x9dd392: Sprite_Agahnim_ApplyMotionBlur +0x9dd3b9: CutsceneAgahnim_ExistNoMore +0x9dd3d1: kChattyAgahnim_Dmd +0x9dd451: ChattyAgahnim_Draw +0x9dd48d: kChattyAgahnim_Telewarp_Data +0x9dd4fd: kChattyAgahnim_Telewarp_Data_Ext +0x9dd50b: kMult_4 +0x9dd516: SpriteDraw_CutsceneAgahnimSpell +0x9dd57d: Sprite_CutsceneAgahnim_Zelda +0x9dd581: kAltarZelda_Dmd +0x9dd5a1: AltarZelda_Main +0x9dd5d9: kAltarZelda_XOffs +0x9dd5e9: AltarZelda_DrawBody +0x9dd661: kAltarZelda_Warp_Dmd +0x9dd6b1: SpriteDraw_AltarZeldaWarp +0x9dd6d1: Sprite_InitializedSegmented +0x9dd6f6: Sprite_09_Moldorm +0x9dd6fe: kGiantMoldorm_Xvel +0x9dd71e: kGiantMoldorm_Yvel +0x9dd73e: kGiantMoldorm_NextDir +0x9dd74e: Sprite_GiantMoldorm +0x9dd7fe: Moldorm_Move +0x9dd82d: Moldorm_Turn +0x9dd852: Moldorm_Charge +0x9dd881: GiantMoldorm_Draw +0x9dd8f2: GiantMoldorm_IncrementalSegmentExplosion +0x9dd913: kGiantMoldorm_Head_Dmd +0x9dd993: SpriteDraw_Moldorm_Head +0x9dd9b8: kGiantMoldorm_SegA_Dmd +0x9dd9f8: SpriteDraw_Moldorm_SegmentA +0x9dda50: SpriteDraw_Moldorm_SegmentB +0x9dda5b: kGiantMoldorm_OamFlags +0x9dda5f: SpriteDraw_Moldorm_SegmentC +0x9ddaba: Moldorm_HandleTail +0x9ddb17: SpriteDraw_Moldorm_Tail +0x9ddb3e: kGiantMoldorm_Eye_X +0x9ddb5e: kGiantMoldorm_Eye_Y +0x9ddb7e: kGiantMoldorm_Eye_Char +0x9ddb8e: kGiantMoldorm_Eye_Flags +0x9ddb9e: SpriteDraw_Moldorm_Eyeballs +0x9ddc11: Moldorm_Explode +0x9ddc16: Sprite_ScheduleBossForDeath +0x9ddc23: nullsub_12 +0x9ddc2a: Sprite_MakeBossExplosion +0x9ddc30: Sprite_MakeBossDeathExplosion_NoSound +0x9ddc72: Sprite_01_Vulture +0x9ddc7a: Sprite_Vulture +0x9ddc9c: Vulture_Perched +0x9ddcb5: kVulture_Gfx +0x9ddcb9: Vulture_Circling +0x9ddd1e: kVulture_Dmd +0x9ddd5e: Vulture_Draw +0x9ddd7b: Sprite_00_Raven +0x9ddd85: Sprite_Raven +0x9dddac: kRaven_AscendTime +0x9dddae: Raven_Perched +0x9ddde5: Raven_Rise +0x9dde09: Raven_Attack +0x9dde5a: Raven_SetFlip +0x9dde66: Raven_Flee +0x9dde82: Vitreous_SpawnMinions +0x9dde8a: kVitreous_SpawnSmallerEyes_X +0x9ddea4: kVitreous_SpawnSmallerEyes_Y +0x9ddebe: kVitreous_SpawnSmallerEyes_Gfx +0x9ddecb: Vitreous_SpawnSmallerEyes +0x9ddf45: kStandaloneItem_Zvel +0x9ddf49: Sprite_C0_Catfish +0x9ddf54: Sprite_Catfish_QuakeMedallion +0x9ddfd1: Catfish_BigFish +0x9ddfe6: Catfish_Sleep +0x9de039: Catfish_TheRumbling +0x9de07c: kGreatCatfish_Emerge_Gfx +0x9de08c: Catfish_Surface +0x9de0bf: kGreatCatfish_Conversate_Gfx +0x9de0d3: Catfish_LeaveMeAlone +0x9de144: Sprite_SpawnBomb +0x9de164: I_said_no_plop +0x9de16c: Catfish_RegurgitateMedallion +0x9de1aa: Sprite_Zora_RegurgitateFlippers +0x9de1ed: Catfish_SpawnPlop +0x9de214: Sprite_SpawnWaterSplash_ +0x9de21c: Sprite_SpawnWaterSplash +0x9de240: kGreatCatfish_Dmd +0x9de320: GreatCatfish_Draw +0x9de33d: kWaterSplash_Dmd +0x9de37d: Sprite_Catfish_SplashOfWater +0x9de39d: kSpriteLightning_Gfx +0x9de3a5: kSpriteLightning_OamFlags +0x9de3ad: kSpriteLightning_Xoff +0x9de3ed: Sprite_BF_Lightning +0x9de475: Lightning_SpawnGarnish +0x9de4c8: Sprite_BD_Vitreous +0x9de4eb: Vitreous_DunkedInGoo +0x9de53d: kVitreous_Animate_Gfx +0x9de53f: kVitreous_AfromG +0x9de549: Vitreous_Lightningening +0x9de563: Vitreous_Animate +0x9de589: kVitreous_Xvel +0x9de58b: Vitreous_Bouncing +0x9de5ca: kVitreous_WhichToActivate +0x9de5da: Vitreous_SetMinionsForth +0x9de602: kAgahnim_Lighting_X +0x9de612: Sprite_SpawnLightning +0x9de656: kVitreous_Dmd +0x9de716: Vitreous_Draw +0x9de763: kSprite_Vitreolus_Dx +0x9de76b: kSprite_Vitreolus_Dy +0x9de773: Sprite_BE_VitreousEye +0x9de7c4: Vitreolus_TargetPlayerPosition +0x9de7d9: Vitreolus_PursueTargetPosition +0x9de82a: Vitreolus_ReturnToOrigin +0x9de893: Sprite_DirectionToFacePlayer___ +0x9de898: Sprite_IsToRightOfPlayer___ +0x9de89d: Sprite4_IsBelowPlayer +0x9de8a2: Sprite_ReturnIfInactive____ +0x9de8c5: Sprite_ReturnIfRecoiling__ +0x9de948: Sprite_MoveXyz___ +0x9de94b: Sprite_Move___ +0x9de952: Sprite4_MoveX +0x9de95d: Sprite_MoveY_ +0x9de98b: Sprite_MoveZ__ +0x9de9ad: Sprite_PrepOamCoordOrDoubleRet___ +0x9de9b6: HandleScreenFlash +0x9de9da: ExecuteCachedSprites +0x9dea00: UncacheAndExecuteSprite +0x9deb84: Sprite_SimulateSoldier +0x9debeb: Overlord19_ArmosCoordinator +0x9debf3: ArmosCoordinator_Main +0x9dec12: ArmosCoordinator_WaitForWakeUp +0x9dec34: ArmosCoordinator_CirclePosition +0x9dec42: kArmosCoordinator_BackWallX +0x9dec48: ArmosCoordinator_LineUp +0x9dec69: ArmosCoordinator_ForwardMarch +0x9dec96: ArmosCoordinator_Pinch +0x9decab: ArmosCoordinator_Spread +0x9decc0: kArmosCoordinator_Tab0 +0x9deccc: ArmosCoordinator_RotateKnights +0x9decd4: ArmosCoordinator_Rotate +0x9dedb8: ArmosCoordinator_CheckKnights +0x9dedcb: ArmosCoordinator_DisableCoercion +0x9dedd6: Sprite_70_KingHelmasaurFireball +0x9dedde: kHelmasaurFireball_Char +0x9dede1: kHelmasaurFireball_Flags +0x9dede3: Sprite_HelmasaurFireball +0x9dee72: HelmasaurFireball_PreMigrateDown +0x9dee85: HelmasaurFireball_MigrateDown +0x9dee9c: kHelmasaurFireball_Gfx +0x9deea0: HelmasaurFireball_DelayThenTriSplit +0x9deeb3: HelmasaurFireball_DelayThenQuadSplit +0x9deec9: HelamsaurFireball_Move +0x9deecd: kHelmasaurFireball_TriSplit_Xvel +0x9deed0: kHelmasaurFireball_TriSplit_Yvel +0x9deed3: HelmasaurFireball_TriSplit +0x9def2d: kHelmasaurFireball_TriSplit_Delay +0x9def35: kHelmasaurFireball_QuadSplit_Xvel +0x9def39: kHelmasaurFireball_QuadSplit_Yvel +0x9def3d: HelmasaurFireball_QuadSplit +0x9def76: Sprite_RedArmosCrusher +0x9def7e: Sprite_ArmosCrusher +0x9defac: RedArmosCrusher_TargetLink +0x9defe0: RedArmosCrusher_Jump +0x9df039: RedArmosCrusher_Hover +0x9df045: RedArmosCrusher_Slam +0x9df063: Sprite_40_LightningGate +0x9df06b: Sprite_EvilBarrier +0x9df0e1: kEvilBarrier_Dmd +0x9df249: EvilBarrier_Draw +0x9df277: SpritePrep_MiniMoldorm +0x9df2a5: kDrawFourAroundOne_Dmd +0x9df395: SpriteDraw_Antfairy +0x9df3d4: Toppo_Flustered +0x9df44d: kGoriya_Dmd +0x9df54d: kGoriya_Dmd2 +0x9df589: Goriya_Draw +0x9df5d4: kConvertVelocityToAngle_Tab0 +0x9df5f4: kConvertVelocityToAngle_Tab1 +0x9df614: Sprite_ConvertVelocityToAngle +0x9df65d: Sprite_SpawnDynamically +0x9df65f: Sprite_SpawnDynamicallyEx +0x9df6cf: kSprite_Func5_Tab3 +0x9df7cf: kMult_32 +0x9df7d3: kMoldorm_Draw_Char +0x9df7d6: kMoldorm_Draw_XY +0x9df7dc: kMoldorm_Draw_Ext +0x9df7df: kMoldorm_Draw_GetOffs +0x9df7e2: kMoldorm_Draw_X +0x9df802: kMoldorm_Draw_Y +0x9df822: Moldorm_Draw +0x9df943: Sprite_25_TalkingTree +0x9df94b: Sprite_TalkingTree +0x9df956: TalkingTree_Mouth +0x9df96e: TalkingTree_IdleWithBomb +0x9df99c: TalkingTree_DelayBomb +0x9df9b0: kTalkingTree_Gfx2 +0x9df9b4: TalkingTree_SpitBomb +0x9df9d2: kTalkingTree_Gfx +0x9df9da: kTalkingTree_Delay +0x9df9e2: TalkingTree_IdleWithoutBomb +0x9dfa01: kTalkingTree_Msgs2 +0x9dfa2b: kTalkingTree_Msgs +0x9dfa2f: kTalkingTree_Screens +0x9dfa4e: TalkingTree_SpawnBomb +0x9dfa7b: kTalkingTree_Dmd +0x9dfadb: TalkingTree_Draw +0x9dfafb: kTalkingTree_Type1_X +0x9dfafd: kTalkingTree_Type1_Xhi +0x9dfaff: kTalkingTree_Type1_X1 +0x9dfb0a: TalkingTree_Eye +0x9dfb86: kTalkingTree_SpawnX +0x9dfb8a: SpritePrep_TalkingTree_SpawnEyeball +0x9dfbcc: kSpawnRupees_Xvel +0x9dfbd0: kSpawnRupees_Yvel +0x9dfbd4: kSpawnRupees_Type +0x9dfbd7: RupeePull_SpawnPrize +0x9dfc38: Sprite_D5_DigGameGuy +0x9dfc5b: DigGameGuy_Idle +0x9dfc89: DigGameGuy_OfferGame +0x9dfce0: DigGameGuy_UnblockEntrance +0x9dfd0a: DigGameGuy_SetTimer +0x9dfd18: DigGameGuy_Proctor +0x9dfd42: DiggingGameGuy_ComeBackLater +0x9dfd4b: DigGame_SpawnPrize +0x9dfd5c: DiggingGameGuy_AttemptPrizeSpawn +0x9dfd82: kDiggingGameGuy_Xvel +0x9dfd84: kDiggingGameGuy_X +0x9dfd86: kDiggingGameGuy_Items +0x9dfd8a: DiggingGameGuy_GiveItem +0x9dfe03: kDiggingGameGuy_Dmd +0x9dfe4b: DiggingGameGuy_Draw +0x9dfe6e: kOldMountainMan_Dmd0 +0x9dfe7e: kOldMountainMan_Dmd1 +0x9dfefe: kOldMountainMan_Dma +0x9dff0e: OldMountainMan_Draw +0x9dff5b: SpriteModule_Burn_bounce +0x9dffbd: kSpriteFall_Char +0x9dffc5: SpriteFall_Draw +0x9e8000: HelmasaurKing_Initialize +0x9e8019: HelmasaurKing_Reinitialize +0x9e8039: Sprite_92_HelmasaurKing +0x9e810a: kHelmasaurKing_Tab1 +0x9e818c: kHelmasaurKing_Xvel0 +0x9e8194: kHelmasaurKing_Yvel0 +0x9e819c: Sprite_HelmasaurKing_DecisionHome +0x9e81d5: Sprite_HelmasaurKing_WalkToLocation +0x9e81e6: HelmasaurKing_HandleMovement +0x9e8200: HelmasaurKing_Func8 +0x9e8210: Sprite_HelmasaurKing_DecisionAway +0x9e8242: Sprite_HelmasaurKing_WalkBackHome +0x9e8253: HelmasaurKing_MaybeFireball +0x9e827c: kHelmasaur_Tab0 +0x9e829c: kMult_8 +0x9e82a0: HelmasaurKing_SwingTail +0x9e832b: kHelmasaurKing_Tab2 +0x9e8383: kPlus1Minus1 +0x9e8385: HelmasaurKing_CheckMaskDamageFromHammer +0x9e83eb: HelmasaurKing_AttemptDamage +0x9e841a: kHelmasaurKing_Mask_Y +0x9e842e: kHelmasaurKing_Mask_X +0x9e8442: kHelmasaurKing_Mask_Z +0x9e844c: kHelmasaurKing_Mask_Xvel +0x9e8456: kHelmasaurKing_Mask_Yvel +0x9e8460: kHelmasaurKing_Mask_Zvel +0x9e846a: kHelmasaurKing_Mask_OamFlags +0x9e8474: kHelmasaurKing_Mask_Gfx +0x9e847e: HelmasaurKing_ChipAwayAtMask +0x9e848c: HelmasaurKing_ExplodeMask +0x9e84aa: HelmasaurKing_SpawnMaskDebris +0x9e8517: HelmasaurKing_SpitFireball +0x9e853b: HelmasaurKing_Draw +0x9e855f: kHelmasaurKing_DrawB_X +0x9e8561: kHelmasaurKing_DrawB_Char +0x9e8569: kHelmasaurKing_DrawB_Flags +0x9e856b: SpriteDraw_KingHelmasaur_Eyes +0x9e85c6: kHelmasaurKing_DrawC_Dmd +0x9e8686: KingHelmasaurMask +0x9e86e5: KingHelmasaur_CheckBombDamage +0x9e874d: kHelmasaurKing_DrawD_Dmd +0x9e87e5: SpriteDraw_KingHelmasaur_Body +0x9e87f0: Sprite_DrawMultiple___ +0x9e87f5: kHelmasaurKing_DrawE_X +0x9e87f9: kHelmasaurKing_DrawE_Y +0x9e87fd: kHelmasaurKing_DrawE_Char +0x9e8801: kHelmasaurKing_DrawE_Flags +0x9e8805: SpriteDraw_KingHelmasaur_Legs +0x9e889c: kHelmasaurKing_DrawF_Y +0x9e88bc: SpriteDraw_KingHelmasaur_Mouth +0x9e88f0: kHelmasaurKing_DrawA_Mult +0x9e8910: kHelmasaurKing_DrawA_MultB +0x9e8920: KingHelmasaur_OperateTail +0x9e8a85: NOP8 +0x9e8a8e: Sprite3A_MagicBatLightning +0x9e8a96: Sprite_MadBatterBolt +0x9e8abb: kMadderBolt_X +0x9e8ac3: kMadderBolt_Y +0x9e8acb: MadBatterBolt_Active +0x9e8b11: SpriteActive3_MainLong +0x9e8b19: SpriteActive3_Main +0x9e8b2e: Sprite_CheckTileCollision__ +0x9e8bbf: Sprite_AA_Pikit +0x9e8bd8: kFluteBoyAnimal_Xvel +0x9e8bda: kZazak_Yvel +0x9e8bde: Pikit_PikNextMovement +0x9e8c25: Pikit_LandAndAttack +0x9e8c72: kPikit_Gfx +0x9e8c8a: kPikit_XyOffs +0x9e8cd2: kPikit_Tab0 +0x9e8cda: kPikit_Tab1 +0x9e8ce2: Pikit_Steal +0x9e8dca: Pikit_PrepDraw +0x9e8dd2: Sprite_A8_GreenZirro +0x9e8de7: BomberPellet_Falling +0x9e8e14: BomberPellet_Exploding +0x9e8e2d: kBomber_Gfx +0x9e8e31: Bomber_Main +0x9e8ed2: Zirro_Dodge +0x9e8ee4: kBomber_Xvel +0x9e8eec: kBomber_Yvel +0x9e8ef4: kBomber_Tab0 +0x9e8ef8: Zirro_Idle +0x9e8f36: Zirro_Move +0x9e8f71: kBomber_SpawnPellet_X +0x9e8f79: kBomber_SpawnPellet_Y +0x9e8f81: Zirro_DropBomb +0x9e8fdf: Sprite_StalfosBone +0x9e9000: kStalfosBone_Dmd +0x9e9040: StalfosBone_Draw +0x9e905c: kStalfos_Delay +0x9e9060: kStalfos_AnimState1 +0x9e9068: kStalfos_AnimState2 +0x9e906c: Sprite_A7_Stalfos +0x9e90b1: kStalfos_CheckDir +0x9e90b5: Stalfos_Skellington +0x9e919f: Sprite_Zazak_Main +0x9e922b: StalfosZazak_Walk +0x9e9254: kZazak_Dir2 +0x9e925c: StalfosZazak_Wait +0x9e92bd: Sprite_ZeroVelocity__ +0x9e92d2: StalfosZazak_Shoot +0x9e92e4: Sprite_SpawnFirePhlegm +0x9e9363: kSpawnFirePhlegm_Xvel +0x9e9365: kSpawnFirePhlegm_Yvel +0x9e9369: kSpawnFirePhlegm_X +0x9e9371: kSpawnFirePhlegm_Y +0x9e9379: Stalfos_ThrowBone +0x9e93c3: kFirePhlegm_Dmd +0x9e9443: FirePhlegm_Draw +0x9e9460: Sprite_A3_KholdstareShell +0x9e94a2: KholdstareShell_ShakeFromDamage +0x9e94c1: KholdstareShell_PhaseOut +0x9e94dd: GenerateIceball +0x9e9518: Sprite_A2_Kholdstare +0x9e956f: Kholdstare_Accelerate +0x9e95aa: Kholdstare_check_coll +0x9e95dd: kKholdstare_Target_Xvel +0x9e95e1: kKholdstare_Target_Yvel +0x9e95e5: Kholdstare_Decelerate +0x9e9646: kKholdstare_Triplicate_Tab0 +0x9e9649: kKholdstare_Triplicate_Tab1 +0x9e964c: Kholdstare_Split +0x9e9694: Kholdstare_DoAbsolutelyNothing +0x9e9695: kNebuleGarnish_XY +0x9e96a5: Kholdstare_SpawnPuffCloudGarnish +0x9e9710: Sprite_A4_FallingIce +0x9e9733: Sprite_IceBall +0x9e97bf: kIceBall_Quadruplicate_Xvel +0x9e97c7: kIceBall_Quadruplicate_Yvel +0x9e97cf: IceBall_Split +0x9e981d: Sprite_A1_Freezor +0x9e9859: Freezor_Dormant +0x9e9871: Freezor_Waking +0x9e98b8: kFreezor_Xvel +0x9e98ba: kFreezor_Yvel +0x9e98be: kFreezor_Moving_Gfx +0x9e98c2: kFreezor_Sparkle_X +0x9e98ca: kFreezor_Sparkle_Xhi +0x9e98d2: Freezor_Flailing +0x9e993e: kFreezor_Melting_Gfx +0x9e9942: Freezor_ImMelllltiiiinnnnggggg +0x9e995b: Sprite_9E_HauntedGroveOstritch +0x9e996c: HauntedGroveOstritch_Idle +0x9e998d: kFluteBoyOstrich_Gfx +0x9e9991: HauntedGroveOstritch_Flee +0x9e99cb: kFluteBoyOstrich_Dmd +0x9e9a4b: FluteBoyOstrich_Draw +0x9e9a6b: kFluteBoyAnimal_OamFlags +0x9e9a6d: Sprite_9F_HauntedGroveRabbit +0x9e9a8a: HauntedGroveRabbit_Idle +0x9e9aac: kFluteBoyAnimal_Gfx +0x9e9aaf: HauntedGroveRabbit_Flee +0x9e9aec: Sprite_A0_HauntedGroveBird +0x9e9b2c: HauntedGroveBird_Idle +0x9e9b61: HauntedGroveBird_Ascending +0x9e9b84: HauntedGroveBird_Descending +0x9e9b9a: kFluteBoyBird_X +0x9e9b9c: HauntedGroveBird_Blink +0x9e9bc8: Sprite_9C_Zoro +0x9e9bd0: Zoro +0x9e9c6b: Babasu +0x9e9c81: Babasu_Reset +0x9e9c8f: Babasu_Hidden +0x9e9c9d: kBabusu_Gfx +0x9e9ca3: kBabusu_DirGfx +0x9e9ca7: kBabusu_XyVel +0x9e9cad: Babasu_Telegraph +0x9e9ce8: kBabusu_Scurry_Gfx +0x9e9cec: Babasu_Dart +0x9e9d1b: Sprite_9B_Wizzrobe +0x9e9d46: Sprize_Wizzrobe +0x9e9d7a: kWizzrobe_Cloak_Gfx +0x9e9d7e: Wizzrobe_Invisible +0x9e9daa: Wizzrobe_Appear +0x9e9db8: kWizzrobe_Attack_Gfx +0x9e9dc0: kWizzrobe_Attack_DirGfx +0x9e9dc4: Wizzrobe_Attack +0x9e9df3: Wizzrobe_Disappear +0x9e9e0f: kWizzrobe_Beam_XYvel +0x9e9e15: Wizzrobe_FireBeam +0x9e9e7b: Sprite_9A_Kyameron +0x9e9ea5: Kyameron_Reset +0x9e9edb: Kyameron_Puddle +0x9e9f01: kKyameron_Coagulate_Gfx +0x9e9f09: kKyameron_Xvel +0x9e9f0d: kKyameron_Yvel +0x9e9f11: Kyameron_BuildUp +0x9e9f55: kKyameron_Moving_Gfx +0x9e9f59: Kyameron_Moving +0x9e9fe3: Kyameron_Dissipate +0x9ea001: Sprite_GarnishSpawn_Sparkle_limited +0x9ea007: Sprite_GarnishSpawn_Sparkle +0x9ea06c: kKyameron_Dmd +0x9ea14c: kKyameron_OamFlags +0x9ea158: Kyameron_Draw +0x9ea192: kPengator_Gfx +0x9ea196: Sprite_99_Pengator +0x9ea1ea: Pengator_FaceLink +0x9ea1f5: kPengator_XYVel +0x9ea1fb: Pengator_Accelerate +0x9ea240: kPengator_Jump +0x9ea244: Pengator_Hop +0x9ea261: kPengator_Garnish_Y +0x9ea269: kPengator_Garnish_X +0x9ea271: Pengator_Slide +0x9ea2b5: kPengator_Dmd0 +0x9ea3f5: kPengator_Dmd1 +0x9ea415: Pengator_Draw +0x9ea462: Sprite_LaserBeam +0x9ea488: LaserBeam_BuildUpGarnish +0x9ea4e7: SpritePrep_LaserEyeLong +0x9ea4f1: SpritePrep_LaserEye +0x9ea541: Sprite_95_LaserEyeLeft +0x9ea55a: kLaserEye_Dirs +0x9ea55e: LaserEye_Reconnaissance +0x9ea5b0: kLaserEye_SpawnXY +0x9ea5bc: kLaserEye_SpawnXYVel +0x9ea5c2: LaserEye_TangoLocked +0x9ea5d8: LaserEye_FireBeam +0x9ea648: kLaserEye_Dmd +0x9ea708: LaserEye_Draw +0x9ea73f: Sprite_94_Tile_bounce +0x9ea742: Sprite_94_Pirogusu +0x9ea764: kPirogusu_A0 +0x9ea768: Pirogusu_InHole +0x9ea782: kPirogusu_A1 +0x9ea78a: kPirogusu_XYvel +0x9ea790: Pirogusu_Crowning +0x9ea7ce: kPirogusu_A2 +0x9ea7d6: kPirogusu_XYvel2 +0x9ea7dc: Pirogusu_Plop +0x9ea820: Sprite_FloppingFish_SpawnSplash +0x9ea84c: kPirogusu_XYvel3 +0x9ea852: Pirogusu_Active +0x9ea893: kPirogusu_Tab0 +0x9ea897: Pirogusu_SpawnSplash +0x9ea903: kPirogusu_OamFlags +0x9ea91f: kPirogusu_Gfx +0x9ea93b: Pirogusu_Draw +0x9ea97f: kBumper_Vels +0x9ea982: Sprite_93_Bumper +0x9eaa4b: kBumper_Dmd +0x9eaa8b: Bumper_Draw +0x9eaaa7: Sprite_91_StalfosKnight +0x9eaaf4: StalfosKnight_Hidden +0x9eab27: StalfosKnight_EnterBattle +0x9eab46: StalfosKnight_SetToGround +0x9eab5a: kStalfosKnight_Case2_Gfx +0x9eab5c: StalfosKnight_Idle +0x9eab96: kStalfosKnight_Case2_Dir +0x9eaba6: StalfosKnight_ScanForOpponents +0x9eabd6: StalfosKnight_Squat +0x9eabf6: StalfosKnight_HopAround +0x9eac57: kStalfosKnight_Case6_C +0x9eac77: StalfosKnight_Crumble +0x9eacd6: kStalfosKnight_Case7_Gfx +0x9eacd8: StalfosKnight_CelebrateStandingUp +0x9eacec: kStalfosKnight_Dmd +0x9eae04: StalfosKnight_Draw +0x9eae46: kStalfosKnight_DrawHead_Char +0x9eae4a: kStalfosKnight_DrawHead_Flags +0x9eae4e: SpriteDraw_StalfosKnight_Head +0x9eaea4: Sprite_90_Wallmaster +0x9eaf2b: Wallmaster_Descend +0x9eaf59: WallMaster_GrabAttempt +0x9eaf82: Wallmaster_Ascend +0x9eafa4: kWallMaster_Dmd +0x9eafe4: WallMaster_Draw +0x9eb002: Sprite_8F_Blob +0x9eb055: Blob_Hidden +0x9eb09f: kZol_PoppingOutGfx +0x9eb0af: Blob_Peeking +0x9eb0d4: kZol_FallingGfx +0x9eb0d6: Blob_Falling +0x9eb142: kZol_FallingXvel +0x9eb144: Blob_Active +0x9eb1c1: kZol_OamFlags +0x9eb1c5: Zol_Draw +0x9eb214: kZol_Dmd +0x9eb254: Zol_DrawMultiple +0x9eb26f: Sprite_8E_Terrorpin +0x9eb297: kTerrorpin_Xvel +0x9eb29f: kTerrorpin_Yvel +0x9eb2a7: Terrorpin_RightsideUp +0x9eb30e: Terrorpin_UpsideDown +0x9eb39f: kTerrorpin_Oamflags +0x9eb3a1: kTerrorpin_Overturned_Xvel +0x9eb3a3: Terrorpin_CheckForHammer +0x9eb405: Terrorpin_SetUpHammerHitBox +0x9eb42a: kArrghus_Gfx +0x9eb433: Sprite_8C_Arrghus +0x9eb4ca: Arrghus_JumpUp +0x9eb4ef: Arrghus_SmashDown +0x9eb532: Arrghus_PingPong +0x9eb593: Arrghus_Move +0x9eb5c8: Arrghus_MakeDecision +0x9eb5ee: Arrghus_SetState3 +0x9eb61b: Sprite_ApproachTargetSpeed_0 +0x9eb63d: Arrghus_PuffAttack +0x9eb674: kArrgi_Tab0 +0x9eb68e: kArrgi_Tab1 +0x9eb6a8: kArrgi_Tab2 +0x9eb6b5: kArrgi_Tab3 +0x9eb6e9: Arrgi_Initialize_ +0x9eb818: kArrghus_Dmd +0x9eb840: Arrghus_Draw +0x9eb8b4: Arrghus_HandlePuffs +0x9eb8bc: kArrgi_Gfx +0x9eb8c4: Sprite_8D_Arrghi +0x9eb9a9: Sprite_8B_Gibdo +0x9eb9c0: kGibdo_DirTarget +0x9eb9c4: kGibdo_Gfx +0x9eb9cc: Gibdo_Turn +0x9eba00: kGibdo_XyVel +0x9eba0a: kGibdo_Gfx2 +0x9eba12: Gibdo_Walk +0x9eba60: kGibdo_Dmd +0x9ebb20: Gibdo_Draw +0x9ebb42: Sprite_89_MothulaBeam +0x9ebbb9: Sprite_94_Tile +0x9ebbdb: FlyingTile_EraseTilemapEntries +0x9ebc01: FlyingTile_CareenTowardsPlayer +0x9ebc4f: FlyingTile_RiseUp +0x9ebc8a: kFlyingTile_Dmd +0x9ebcca: FlyingTile_Draw +0x9ebce8: Sprite_8A_SpikeBlock +0x9ebd23: Sprite_TransientSpikeBlock +0x9ebd4d: TransientSpikeBlock_Activated +0x9ebd74: kSpikeBlock_XVelTarget +0x9ebd76: kSpikeBlock_YVelTarget +0x9ebd7a: kSpikeBlock_XVelDelta +0x9ebd7c: kSpikeBlock_YVelDelta +0x9ebd80: TransientSpikeBlock_InMotion +0x9ebdc8: kSpikeBlock_XVel +0x9ebdcc: kSpikeBlock_YVel +0x9ebdd0: TransientSpikeBlock_Retract +0x9ebe00: SpikeBlock_UpdateTilemap +0x9ebe19: SpikeBlock_CheckStatueCollision +0x9ebe7e: Sprite_88_Mothula +0x9ebe88: Mothula_Main +0x9ebed8: Modula_Dormant +0x9ebee1: Modula_WakeUp +0x9ebf09: kMothula_XYvel +0x9ebf13: Modula_ActLikeAMoth +0x9ebf9b: kMothula_FlapWingsGfx +0x9ebf9f: Mothula_FlapWings +0x9ebfb9: Modula_FireBeams +0x9ebfd9: kMothula_Beam_Xvel +0x9ebfdc: kMothula_Beam_Yvel +0x9ebfdf: Mothula_SpawnBeams +0x9ec02e: kMothula_Spike_XLo +0x9ec04c: kMothula_Spike_YLo +0x9ec06a: kMothula_Spike_Dir +0x9ec088: Mothula_HandleSpikes +0x9ec103: Sprite_86_Kodongo +0x9ec120: kKodondo_Xvel +0x9ec124: kKodondo_Yvel +0x9ec128: Kodongo_MakeDecision +0x9ec158: Kodongo_SetDirection +0x9ec168: kKodondo_Gfx +0x9ec170: kKodondo_OamFlags +0x9ec178: Kodongo_Move +0x9ec1ce: kKodondo_FlameGfx +0x9ec1d6: Kodongo_ShootFire +0x9ec205: kKodondo_Flame_X +0x9ec20d: kKodondo_Flame_Y +0x9ec215: kKodondo_Flame_Xvel +0x9ec219: kKodondo_Flame_Yvel +0x9ec223: Kodongo_SpawnFire +0x9ec267: Sprite_CheckDamageBoth____ +0x9ec26b: Sprite_CheckDamageToPlayer__ +0x9ec270: kFlame_OamFlags +0x9ec274: Sprite_87_KodongoFire +0x9ec2b4: kFlame_Gfx +0x9ec2d4: Flame_Halted +0x9ec2fc: kFlame_Dmd +0x9ec35c: Flame_Draw +0x9ec379: kYellowStalfos_ObjPrio +0x9ec37f: Sprite_85_YellowStalfos +0x9ec3fb: YellowStalfos_Descend +0x9ec431: YellowStalfos_TrackLink +0x9ec457: kYellowStalfos_Gfx +0x9ec477: kYellowStalfos_HeadX +0x9ec497: kYellowStalfos_HeadY +0x9ec4b7: YellowStalfos_DecapitateSelf +0x9ec4f7: kYellowStalfos_Gfx2 +0x9ec4fb: YellowStalfos_RegretDecapitatingSelf +0x9ec509: YellowStalfos_Animate +0x9ec515: YellowStalfos_Ascend +0x9ec53f: kYellowStalfos_NeutralizedGfx +0x9ec54f: kYellowStalfos_NeutralizedHeadY +0x9ec55f: YellowStalfos_Collapsed +0x9ec580: YellowStalfos_EmancipateHead +0x9ec5a5: kYellowStalfos_Dmd +0x9ec655: YellowStalfos_Draw +0x9ec692: kYellowStalfos_Head_Char +0x9ec696: kYellowStalfos_Head_Flags +0x9ec69a: YellowStalfos_DrawHead +0x9ec700: SpritePrep_Eyegore +0x9ec721: kGoriya_Xvel +0x9ec741: kGoriya_Yvel +0x9ec761: kGoriya_Dir +0x9ec781: kGoriya_Gfx +0x9ec791: Mimic_Stationary +0x9ec79b: Sprite_83_GreenEyegore +0x9ec839: Eyegore_Main +0x9ec864: kEyeGore_Opening_Delay +0x9ec868: Eyegore_Dormant +0x9ec88b: kEyeGore_Opening_Gfx +0x9ec893: Eyegore_WakingUp +0x9ec8bb: kEyeGore_Chasing_Gfx +0x9ec8cb: Eyegore_Chase +0x9ec92e: kEyeGore_Closing_Gfx +0x9ec936: Eyegore_GoToSleep +0x9ec94f: kEyeGore_Dmd +0x9ecacf: Eyegore_Draw +0x9ecaf4: kBubbleGroup_X +0x9ecafa: kBubbleGroup_Y +0x9ecb00: kBubbleGroup_Xvel +0x9ecb03: kBubbleGroup_A +0x9ecb06: kBubbleGroup_Yvel +0x9ecb09: kBubbleGroup_B +0x9ecb0c: SpritePrep_AntifairyCircle +0x9ecb93: kBubbleGroup_Vel +0x9ecb95: kBubbleGroup_VelTarget +0x9ecb97: Sprite_82_AntifairyCircle +0x9ecc02: Sprite_81_Hover +0x9ecc43: kHover_OamFlags +0x9ecc47: Hover_Idle +0x9ecc79: kHover_AccelX0 +0x9ecc7d: kHover_AccelY0 +0x9ecc81: kHover_AccelX1 +0x9ecc85: kHover_AccelY1 +0x9ecc89: Hover_Move +0x9eccd3: kCrystalMaiden_Pal +0x9ecce3: CrystalCutscene_Initialize +0x9ecd48: CrystalCutscene_SpawnMaiden +0x9ecdd9: CrystalCutscene_InitializePolyhedral +0x9ece03: Sprite_AB_CrystalMaiden +0x9ece39: CrystalMaiden_RunCutscene +0x9ece63: CrystalMaiden_DisableSubscreen +0x9ece69: CrystalMaiden_EnableSubscreen +0x9ece71: CrystalMaiden_WaitForCrystalGrowth +0x9ece93: CrystalMaiden_Emerge +0x9ecebc: kCrystalMaiden_Msgs +0x9ecece: CrystalMaiden_GiveSpeech +0x9ecf18: CrystalMaiden_DoYouUnderstand +0x9ecf24: CrystalMaiden_GoodLuckKid +0x9ecf3b: CrystalMaiden_KickOutOfDungeon +0x9ecf47: Sprite_7D_BigSpike +0x9ecf86: kSpikeTrap_Xvel +0x9ecf8a: kSpikeTrap_Xvel2 +0x9ecf8e: kSpikeTrap_Yvel +0x9ecf92: kSpikeTrap_Yvel2 +0x9ecf96: kSpikeTrap_Delay +0x9ecf9a: SpikeTrap_InMotion +0x9ecfdf: kSpikeTrap_Dmd +0x9ecfff: SpikeTrap_Draw +0x9ed012: kGuruguruBar_A +0x9ed016: kGuruguruBar_B +0x9ed01a: Sprite_7E_Firebar_Clockwise +0x9ed049: Firebar_Main +0x9ed1ca: kGuruguruBar_mults +0x9ed1cd: kWinder_OamFlags +0x9ed1d1: Sprite_80_Firesnake +0x9ed1fe: kWinder_Xvel +0x9ed202: kWinder_Yvel +0x9ed206: Winder_DefaultState +0x9ed239: Firesnake_SpawnFireball +0x9ed28d: kGreenStalfos_Dir +0x9ed291: kGreenStalfos_OamFlags +0x9ed295: kGreenStalfos_Gfx +0x9ed299: Sprite_7C_GreenStalfos +0x9ed310: kAgahnim_Dir +0x9ed329: kAgahnim_Gfx1 +0x9ed330: Sprite_7A_Agahnim +0x9ed36f: kAgahnim_Gfx3 +0x9ed376: Agahnim_SpinToPyramid +0x9ed3da: Agahnim_ExorciseGanon +0x9ed408: Agahnim_UncloneSelf +0x9ed45e: Agahnim_HelloDarkWorld +0x9ed47a: kAgahnim_Tab5 +0x9ed47c: Agahnim_CreateClones +0x9ed4a7: kAgahnim_Tab6 +0x9ed4ea: kAgahnim_StartState +0x9ed4ec: Agahnim_ChooseFirstMove +0x9ed4f6: Agahnim_HelloLightWorld +0x9ed514: Agahnim_PrepareToEmerge +0x9ed51f: kAgahnim_Gfx0 +0x9ed524: Agahnim_EmergeFromShadow +0x9ed540: kAgahnim_Tab0 +0x9ed550: kAgahnim_Tab1 +0x9ed560: kAgahnim_Tab2 +0x9ed566: Agahnim_Attack +0x9ed60b: kAgahnim_Gfx2 +0x9ed610: kAgahnim_Tab3 +0x9ed620: kAgahnim_Tab4 +0x9ed630: Agahnim_ChooseWarpSpot +0x9ed668: kAgahnim_X0 +0x9ed674: kAgahnim_Y0 +0x9ed67a: Agahnim_PerformAttack +0x9ed708: Agahnim_MoveTowardsWarp +0x9ed77f: kAgahnim_Draw_X0 +0x9ed7c7: kAgahnim_Draw_Y0 +0x9ed80f: kAgahnim_Draw_Char0 +0x9ed857: kAgahnim_Draw_Flags0 +0x9ed89f: kAgahnim_Draw_X1 +0x9ed8e7: kAgahnim_Draw_Y1 +0x9ed92f: kAgahnim_Draw_Char1 +0x9ed953: kAgahnim_Draw_Ext1 +0x9ed977: UNREACHABLE_1ED971 +0x9ed978: Agahnim_Draw +0x9eda42: Sprite_7B_AgahnimBalls +0x9edb44: kEnergyBall_Gfx +0x9edb54: EnergyBall_DrawTrail +0x9edb8a: kEnergyBall_SplitXVel +0x9edb90: kEnergyBall_SplitYVel +0x9edb96: CreateSixBlueBalls +0x9edbfe: kEnergyBall_Dmd +0x9edc3e: SeekerEnergyBall_Draw +0x9edc5b: Sprite_79_Bee +0x9edc68: Bee_DormantHive +0x9edc7b: kSpawnBee_InitVel +0x9edc83: kSpawnBee_XY +0x9edc8b: kSpawnBee_InitDelay +0x9edc8f: SpawnBeeFromHive +0x9edc9b: InitializeSpawnedBee +0x9edccf: ReleaseBeeFromBottle +0x9edd41: kBee_RandomMove +0x9edd45: Bee_Main +0x9eddf1: Bee_Captured +0x9ede2e: Sprite_Find_EmptyBottle +0x9ede44: Bee_HandleInteractions +0x9ede63: Sprite_B2_PlayerBee +0x9ede70: GoldBee_Dormant +0x9ede90: GoldBee_SpawnSelf +0x9eded0: kGoodBee_Tab0 +0x9eded2: PlayerBee_Main +0x9edf8a: Bee_HandleZ +0x9edfab: PlayerBee_FindTarget +0x9ee02e: Bee_Bzzt +0x9ee044: Sprite_B3_PedestalPlaque +0x9ee09f: HylianPlaque_Desert +0x9ee0dd: Sprite_B4_PurpleChest +0x9ee111: Sprite_B5_BombShop +0x9ee120: kBombShopGuy_Msg +0x9ee124: kBombShopGuy_Gfx +0x9ee12c: kBombShopGuy_Delay +0x9ee134: Sprite_BombShop_Clerk +0x9ee190: Sprite_BombShop_Bomb +0x9ee1df: Sprite_BombShop_SuperBomb +0x9ee216: kSnoutPutt_Dmd +0x9ee21a: Sprite_BombShop_Huff +0x9ee256: BombShop_ClerkExhalation +0x9ee296: kBombShopEntity_Dmd +0x9ee2c6: BombShopEntity_Draw +0x9ee2e9: kKiki_Xvel7 +0x9ee2eb: kKiki_Yvel7 +0x9ee2ef: Sprite_B6_Kiki +0x9ee2fe: Kiki_Flee +0x9ee3af: Kiki_OfferInitialService +0x9ee3e8: Kiki_OfferToFollow +0x9ee3f4: Kiki_OfferToFollowTransaction +0x9ee433: Kiki_MoveTowardsLink +0x9ee465: Kiki_WaitABit +0x9ee476: Kiki_EndIntroductionCutscene +0x9ee487: Kiki_Dormant +0x9ee4c9: Kiki_OfferEntranceService +0x9ee4fd: Kiki_OfferToOpenPOD +0x9ee509: Kiki_VerifyPurchase +0x9ee537: kKiki_Zvel +0x9ee539: Kiki_DartHead +0x9ee576: kKiki_Leave_Y +0x9ee57c: kKiki_Leave_X +0x9ee582: Kiki_HopToSpot +0x9ee5e9: kKiki_Tab7 +0x9ee5ec: kKiki_Delay7 +0x9ee5ee: Kiki_WalkOnRoof +0x9ee640: Kiki_ReadyButtonPress +0x9ee657: Kiki_SlamButton +0x9ee66b: Kiki_RevertToSprite +0x9ee67a: Kiki_SpawnHandlerMonke +0x9ee6c7: Kiki_SpawnHandler_A +0x9ee6d0: Kiki_SpawnHandler_B +0x9ee6e9: kKikiDma +0x9ee6f9: kKiki_Dmd1 +0x9ee7f9: kKiki_Dmd2 +0x9ee859: Kiki_Draw +0x9ee8b6: Sprite_B7_BlindMaiden +0x9ee8f1: SpritePrep_OldMan +0x9ee8f9: SpritePrep_OldMountainMan +0x9ee938: OldMan_RevertToSprite +0x9ee989: OldMan_EnableCutscene +0x9ee992: Sprite_AD_OldMan +0x9ee9a6: OldMan_Lost +0x9ee9b1: OldMan_Lost_Wait +0x9ee9d2: OldMan_Lost_BecomeFollower +0x9ee9ea: OldMan_Returning +0x9ee9fc: OldMan_Returning_GiveMirror +0x9eea28: OldMan_Returning_Move +0x9eea3f: OldMan_Returning_EnterDoor +0x9eeaa3: OldMan_Returning_FinishUp +0x9eeaad: kOldMountainManMsgs +0x9eeab3: OldMan_Home +0x9eeae7: Sprite_B8_DialogueTester +0x9eeb03: DialogueTester_Initialize +0x9eeb1c: DialogueTester_NextMessage +0x9eeb33: Sprite_B9_BullyAndPinkBall +0x9eeb40: Sprite_PinkBall +0x9eec31: BallGuy_UpsideDown +0x9eec4d: PinkBall_HandleDeceleration +0x9eec74: PinkBall_Distress +0x9eec7c: Sprite_Bully +0x9eecb2: Bully_ChaseVictim +0x9eed23: Bully_PuntVictim +0x9eed55: Bully_Idle +0x9eed5e: kBully_Dmd +0x9eed9e: Bully_Draw +0x9eedc2: BallGuy_PlayBounceNoise +0x9eedc9: SpawnBully +0x9eede8: PinkBall_HandleMessage +0x9eee25: Bully_HandleMessage +0x9eee56: kWhirlpool_OamFlags +0x9eee5a: Sprite_BA_Whirlpool +0x9eeeef: Sprite_BB_Shopkeeper +0x9eef12: Shopkeeper_StandardClerk +0x9eef90: ChestGameGuy +0x9eefbf: ChestGameGuy_OfferGame +0x9eefd5: ChestGameGuy_HandlePayment +0x9ef000: ChestGameGuy_ProctorGame +0x9ef017: NiceThief_Animate +0x9ef038: NiceThiefWithGift +0x9ef04f: NiceThiefWithGift_WaitForInteraction +0x9ef05d: NiceThiefWithGift_GiveRupees +0x9ef074: ShopKeeper_Type2_Case2 +0x9ef078: MiniChestGameGuy +0x9ef09c: MiniChestGameGuy_OfferGame +0x9ef0b2: MiniChestGameGuy_VerifyPurchase +0x9ef0e1: LesserChestGameGuy_AfterGameStart +0x9ef0f3: LostWoodsChestGameGuy +0x9ef10a: LostWoodsChestGameGuy_OfferGame +0x9ef120: LostWoodsChestGameGuy_VerifyPurchase +0x9ef14f: NiceThiefUnderRock +0x9ef16e: ShopItem_RedPotion150 +0x9ef1ad: kShopKeeper_ItemX +0x9ef1b3: ShopKeeper_SpawnShopItem +0x9ef1f2: ShopItem_FighterShield +0x9ef230: ShopItem_FireShield +0x9ef261: ShopItem_MakeShieldsDeflect +0x9ef27d: ShopItem_Heart +0x9ef2af: ShopItem_Arrows +0x9ef2f0: ShopItem_Bombs +0x9ef322: ShopItem_Bee +0x9ef358: kShopKeeper_GiveItemMsgs +0x9ef366: ShopItem_HandleReceipt +0x9ef38a: ShopItem_PlayBeep +0x9ef391: ShopItem_CheckForAPress +0x9ef39e: ShopItem_HandleCost +0x9ef3b6: kShopKeeper_ItemWithPrice_Dmd +0x9ef4ce: SpriteDraw_ShopItem +0x9ef4f3: Sprite_BehaveAsBarrier +0x9ef508: Sprite_HaltAllMovement +0x9ef515: Sprite_AC_Apple +0x9ef535: SpawnApple +0x9ef57c: Sprite_Apple +0x9ef603: Sprite_BC_Drunkard +0x9ef632: Pipe_LocatePath +0x9ef640: SomariaPlatform_LocatePath +0x9ef6a1: Sprite_SomariaPlatformAndPipe +0x9ef6a9: kSomariaPlatform_Xvel +0x9ef6b0: kSomariaPlatform_Yvel +0x9ef6b8: kSomariaPlatform_DragXhi +0x9ef6bd: kSomariaPlatform_DragX +0x9ef6c4: kSomariaPlatform_DragY +0x9ef6cc: kSomariaPlatform_DragYhi +0x9ef6d4: Sprite_SomariaPlatform +0x9ef6df: Sprite_SomariaPlatform_Spawn +0x9ef709: Sprite_SomariaPlatformAndPipe_Main +0x9ef7af: SomariaPlatformAndPipe_HandleMovement +0x9ef7c2: SomariaPlatformAndPipe_CheckTile +0x9ef7e0: kSomariaPlatform_Dmd +0x9ef860: SomariaPlatform_Draw +0x9ef87d: SomariaPlatform_HandleJunctions +0x9ef8ad: SomariaPlatform_HandleDragX +0x9ef8d7: SomariaPlatform_HandleDragY +0x9ef901: SomariaPlatform_HandleDrag +0x9ef908: SomariaPlatform_HandleTile_DoNothing +0x9ef909: SomariaPlatform_HandleTile_RisingSlope +0x9ef912: SomariaPlatform_HandleTile_FallingSlope +0x9ef91b: kSomariaPlatform_TransitDir +0x9ef91f: SomariaPlatform_HandleTile_TJunctionDLR +0x9ef942: kSomariaPlatform_Keys1 +0x9ef946: SomariaPlatform_HandleTile_TJunctionULR +0x9ef99f: kSomariaPlatform_Keys2 +0x9ef9a3: SomariaPlatform_HandleTile_TJunctionUDR +0x9ef9fe: kSomariaPlatform_Keys3 +0x9efa02: SomariaPlatform_HandleTile_TJunctionUDL +0x9efa5d: kSomariaPlatform_Keys4 +0x9efa61: SomariaPlatform_HandleTile_4WayJunction +0x9efabc: kSomariaPlatform_Keys5 +0x9efac0: SomariaPlatform_HandleTile_CrossOver +0x9efafb: kSomariaPlatform_Keys6 +0x9efaff: SomariaPlatform_HandleTile_Unknown +0x9efb34: SomariaPlatform_SetOnFlag +0x9efb3a: SomariaPlatform_HandleTile_Station +0x9efb49: SomariaPlatform_DragLink +0x9efb7e: Sprite_AE_Pipe_Down +0x9efb94: Pipe_FindEndPoint +0x9efbbe: Pipe_Idle +0x9efbf0: kPipe_Dirs +0x9efbf4: Pipe_DragLink +0x9efc13: Pipe_MoveLink +0x9efcd3: Pipe_Reset +0x9efcff: Pipe_HandlePlayerMovement +0x9efd14: Fairy_HandleMovement +0x9efd1c: Faerie_HandleMovement +0x9efe33: ReleaseFairy +0x9efe69: Sprite_DirectionToFacePlayer____ +0x9efe6e: Sprite_IsToRightOfPlayer____ +0x9efe73: Sprite_IsBelowPlayer_____ +0x9efe78: Sprite_ReturnIfInactive__ +0x9efe7f: Sprite_ReturnIfPaused__ +0x9efe9b: Sprite_ReturnIfRecoiling____ +0x9eff1e: Sprite_MoveXyz__ +0x9eff21: Sprite_Move__ +0x9eff28: Sprite_MoveX___ +0x9eff34: Sprite_MoveY_9E +0x9eff62: Sprite_MoveZ___ +0x9eff84: Sprite_PrepOamCoordOrDoubleRet____ +0x9eff8d: Sprite_DrawRippleIfInWater +0x9f8000: kDungObjectDataForRoom +0x9f83c0: kDungDoorPtrs +0x9fb97b: aB diff --git a/other/replace_in_files.py b/other/replace_in_files.py new file mode 100644 index 00000000..09560252 --- /dev/null +++ b/other/replace_in_files.py @@ -0,0 +1,28 @@ +import os, re, sys, glob + +repl = open(sys.argv[1],'r').read().splitlines() +repl = [a.split(' ') for a in repl] +repl_dict = dict(repl) + +c = re.compile('\\b(' + "|".join(a[0] for a in repl) + ')\\b') + +def replacer(m): + return repl_dict[m.group(0)] + +def replace_in_file(fname): + s = open(fname, 'r').read() + s_org = s + + s, num = c.subn(replacer, s) + print(num) + if num: + assert s != s_org + open(fname, 'w').write(s) + + + +for filename in glob.glob('*.cpp') + glob.glob('*.h'): + replace_in_file(filename) + + + diff --git a/other_modules.cpp b/other_modules.cpp new file mode 100644 index 00000000..be2891b4 --- /dev/null +++ b/other_modules.cpp @@ -0,0 +1,92 @@ +#include "zelda_rtl.h" +#include "variables.h" +#include "dungeon.h" +#include "ancilla.h" +#include "load_gfx.h" +#include "hud.h" +#include "sprite.h" +#include "messaging.h" +#include "player_oam.h" +#include "sprite_main.h" + +void Module18_GanonEmerges() { // 829edc + uint16 hofs2 = BG2HOFS_copy2; + uint16 vofs2 = BG2VOFS_copy2; + uint16 hofs1 = BG1HOFS_copy2; + uint16 vofs1 = BG1VOFS_copy2; + + BG2HOFS_copy2 = BG2HOFS_copy = hofs2 + bg1_x_offset; + BG2VOFS_copy2 = BG2VOFS_copy = vofs2 + bg1_y_offset; + BG1HOFS_copy2 = BG1HOFS_copy = hofs1 + bg1_x_offset; + BG1VOFS_copy2 = BG1VOFS_copy = vofs1 + bg1_y_offset; + Sprite_Main(); + BG1VOFS_copy2 = vofs1; + BG1HOFS_copy2 = hofs1; + BG2VOFS_copy2 = vofs2; + BG2HOFS_copy2 = hofs2; + + switch (overworld_map_state) { + case 0: // GetBirdForPursuit + Dungeon_HandleLayerEffect(); + CallForDuckIndoors(); + SaveDungeonKeys(); + overworld_map_state++; + flag_is_link_immobilized++; + break; + case 1: // PrepForPyramidLocation + Dungeon_HandleLayerEffect(); + if (submodule_index == 10) { + overworld_screen_index = 91; + player_is_indoors = 0; + main_module_index = 24; + submodule_index = 0; + overworld_map_state = 2; + } + break; + case 2: // FadeOutDungeonScreen + Dungeon_HandleLayerEffect(); + if (--INIDISP_copy) + break; + EnableForceBlank(); + overworld_map_state++; + Hud_RebuildIndoor(); + link_x_vel = link_y_vel = 0; + break; + case 3: // LOadPyramidArea + birdtravel_var1[0] = 8; + birdtravel_var1[1] = 0; + FluteMenu_LoadSelectedScreen(); + LoadOWMusicIfNeeded(); + music_control = 9; + break; + case 4: // LoadAmbientOverlay + Overworld_LoadOverlayAndMap(); + subsubmodule_index = 0; + break; + case 5: // BrightenScreenThenSpawnBat + if (++INIDISP_copy == 15) { + dung_savegame_state_bits = 0; + flag_unk1 = 0; + Sprite_SpawnBatCrashCutscene(); + link_direction_facing = 2; + saved_module_for_menu = 9; + player_is_indoors = 0; + overworld_map_state++; + subsubmodule_index = 128; + BYTE(cur_palace_index_x2) = 255; + } + break; + case 6: // DelayForBatSmashIntoPyramid + break; + case 7: // DelayPlayerDropOff + if (!--subsubmodule_index) + overworld_map_state++; + break; + case 8: // DropOffPlayerAtPyramid + BirdTravel_Finish_Doit(); + break; + } + + LinkOam_Main(); +} + diff --git a/other_modules.h b/other_modules.h new file mode 100644 index 00000000..97da4180 --- /dev/null +++ b/other_modules.h @@ -0,0 +1,4 @@ +#pragma once +#include "types.h" + +void Module18_GanonEmerges(); diff --git a/overlord.cpp b/overlord.cpp new file mode 100644 index 00000000..0c5a3aed --- /dev/null +++ b/overlord.cpp @@ -0,0 +1,653 @@ +#include "overlord.h" +#include "sprite.h" +#include "misc.h" +#include "sprite_main.h" + +uint16 Overlord_GetX(int k) { return (overlord_x_lo[k] | overlord_x_hi[k] << 8); } +uint16 Overlord_GetY(int k) { return (overlord_y_lo[k] | overlord_y_hi[k] << 8); } +static HandlerFuncK *const kOverlordFuncs[26] = { + &Overlord01_PositionTarget, + &Overlord02_FullRoomCannons, + &Overlord03_VerticalCannon, + &Overlord_StalfosFactory, + &Overlord05_FallingStalfos, + &Overlord06_BadSwitchSnake, + &Overlord07_MovingFloor, + &Overlord08_BlobSpawner, + &Overlord09_WallmasterSpawner, + &Overlord0A_FallingSquare, + &Overlord0A_FallingSquare, + &Overlord0A_FallingSquare, + &Overlord0A_FallingSquare, + &Overlord0A_FallingSquare, + &Overlord0A_FallingSquare, + &Overlord10_PirogusuSpawner_left, + &Overlord10_PirogusuSpawner_left, + &Overlord10_PirogusuSpawner_left, + &Overlord10_PirogusuSpawner_left, + &Overlord14_TileRoom, + &Overlord15_WizzrobeSpawner, + &Overlord16_ZoroSpawner, + &Overlord17_PotTrap, + &Overlord18_InvisibleStalfos, + &Overlord19_ArmosCoordinator_bounce, + &Overlord06_BadSwitchSnake, +}; +static inline uint8 ArmosMult(uint16 a, uint8 b); +static inline int8 ArmosSin(uint16 a, uint8 b); +void Overlord_StalfosFactory(int k) { + // unused + assert(0); +} + +void Overlord_SetX(int k, uint16 v) { + overlord_x_lo[k] = v; + overlord_x_hi[k] = v >> 8; +} + +void Overlord_SetY(int k, uint16 v) { + overlord_y_lo[k] = v; + overlord_y_hi[k] = v >> 8; +} + +static inline uint8 ArmosMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +static inline int8 ArmosSin(uint16 a, uint8 b) { + uint8 t = ArmosMult(kSinusLookupTable[a & 0xff], b); + return (a & 0x100) ? -t : t; +} + +void Overlord_SpawnBoulder() { // 89b714 + if (player_is_indoors || !byte_7E0FFD || (submodule_index | flag_unk1) || ++byte_7E0FFE & 63) + return; + + if (sign8((BG2VOFS_copy2 >> 8) - (sprcoll_y_base >> 8) - 2)) + return; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(0, 0xc2, &info); + if (j >= 0) { + Sprite_SetX(j, BG2HOFS_copy2 + (GetRandomNumber() & 127) + 64); + Sprite_SetY(j, BG2VOFS_copy2 - 0x30); + sprite_floor[j] = 0; + sprite_D[j] = 0; + sprite_z[j] = 0; + } +} + +void Overlord_Main() { // 89b773 + Overlord_ExecuteAll(); + Overlord_SpawnBoulder(); +} + +void Overlord_ExecuteAll() { // 89b77e + if (submodule_index | flag_unk1) + return; + for (int i = 7; i >= 0; i--) { + if (overlord_type[i]) + Overlord_ExecuteSingle(i); + } +} + +void Overlord_ExecuteSingle(int k) { // 89b793 + int j = overlord_type[k]; + Overlord_CheckIfActive(k); + kOverlordFuncs[j - 1](k); +} + +void Overlord19_ArmosCoordinator_bounce(int k) { // 89b7dc + static const uint8 kArmosCoordinator_BackWallX[6] = { 49, 77, 105, 131, 159, 187 }; + + if (overlord_gen2[k]) + overlord_gen2[k]--; + switch (overlord_gen1[k]) { + case 0: // wait for knight activation + if (sprite_A[0]) { + overlord_x_lo[k] = 120; + overlord_floor[k] = 255; + overlord_x_lo[2] = 64; + overlord_x_lo[0] = 192; + overlord_x_lo[1] = 1; + ArmosCoordinator_RotateKnights(k); + } + break; + case 1: // wait knight under coercion + if (ArmosCoordinator_CheckKnights()) { + overlord_gen1[k]++; + overlord_gen2[k] = 0xff; + } + break; + case 2: // timed rotate then transition + case 4: + ArmosCoordinator_RotateKnights(k); + break; + case 3: // radial contraction + if (--overlord_x_lo[2] == 32) { + overlord_gen1[k]++; + overlord_gen2[k] = 64; + } + ArmosCoordinator_Rotate(k); + break; + case 5: // radial dilation + if (++overlord_x_lo[2] == 64) { + overlord_gen1[k]++; + overlord_gen2[k] = 64; + } + ArmosCoordinator_Rotate(k); + break; + case 6: // order knights to back wall + if (overlord_gen2[k]) + return; + ArmosCoordinator_DisableCoercion(k); + for (int j = 5; j >= 0; j--) { + overlord_x_hi[j] = kArmosCoordinator_BackWallX[j]; + overlord_gen2[j] = 48; + } + overlord_gen1[k]++; + overlord_gen2[k] = 255; + break; + case 7: // cascade knights to front wall + if (overlord_gen2[k]) + return; + for (int j = 5; j >= 0; j--) { + if (++overlord_gen2[j] == 192) { + overlord_gen1[k] = 1; + overlord_floor[k] = -overlord_floor[k]; + ArmosCoordinator_DisableCoercion(k); + ArmosCoordinator_Rotate(k); + return; + } + } + break; + } +} + +void Overlord18_InvisibleStalfos(int k) { // 89b7f5 + static const int8 kRedStalfosTrap_X[4] = { 0, 0, -48, 48 }; + static const int8 kRedStalfosTrap_Y[4] = { -40, 56, 8, 8 }; + static const uint8 kRedStalfosTrap_Delay[4] = { 0x30, 0x50, 0x70, 0x90 }; + + uint16 x = (overlord_x_lo[k] | overlord_x_hi[k] << 8); + uint16 y = (overlord_y_lo[k] | overlord_y_hi[k] << 8); + if ((uint16)(x - link_x_coord + 24) >= 48 || (uint16)(y - link_y_coord + 24) >= 48) + return; + overlord_type[k] = 0; + tmp_counter = 3; + do { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xa7, &info, 12); + if (j < 0) + return; + Sprite_SetX(j, link_x_coord + kRedStalfosTrap_X[tmp_counter]); + Sprite_SetY(j, link_y_coord + kRedStalfosTrap_Y[tmp_counter]); + sprite_delay_main[j] = kRedStalfosTrap_Delay[tmp_counter]; + sprite_floor[j] = overlord_floor[k]; + sprite_E[j] = 1; + sprite_flags2[j] = 3; + sprite_D[j] = 2; + } while (!sign8(--tmp_counter)); +} + +void Overlord17_PotTrap(int k) { // 89b884 + uint16 x = (overlord_x_lo[k] | overlord_x_hi[k] << 8); + uint16 y = (overlord_y_lo[k] | overlord_y_hi[k] << 8); + if ((uint16)(x - link_x_coord + 32) < 64 && + (uint16)(y - link_y_coord + 32) < 64) { + overlord_type[k] = 0; + byte_7E0B9E++; + } +} + +void Overlord16_ZoroSpawner(int k) { // 89b8d1 + static const int8 kOverlordZoroFactory_X[8] = { -4, -2, 0, 2, 4, 6, 8, 12 }; + overlord_gen2[k]--; + uint16 x = Overlord_GetX(k) + 8; + uint16 y = Overlord_GetY(k) + 8; + if (GetTileAttribute(overlord_floor[k], &x, y) != 0x82) + return; + if (overlord_gen2[k] >= 0x18 || (overlord_gen2[k] & 3) != 0) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x9c, &info, 12); + if (j >= 0) { + Sprite_SetX(j, info.r5_overlord_x + kOverlordZoroFactory_X[GetRandomNumber() & 7] + 8); + sprite_y_lo[j] = info.r7_overlord_y + 8; + sprite_y_hi[j] = info.r7_overlord_y >> 8; + sprite_floor[j] = overlord_floor[k]; + sprite_flags4[j] = 1; + sprite_E[j] = 1; + sprite_ignore_projectile[j] = 1; + sprite_y_vel[j] = 16; + sprite_flags2[j] = 32; + sprite_oam_flags[j] = 13; + sprite_subtype2[j] = GetRandomNumber(); + sprite_delay_main[j] = 48; + sprite_bump_damage[j] = 3; + } +} + +void Overlord15_WizzrobeSpawner(int k) { // 89b986 + static const int8 kOverlordWizzrobe_X[4] = { 48, -48, 0, 0 }; + static const int8 kOverlordWizzrobe_Y[4] = { 16, 16, 64, -32 }; + static const uint8 kOverlordWizzrobe_Delay[4] = { 0, 16, 32, 48 }; + if (overlord_gen2[k] != 128) { + if (frame_counter & 1) + overlord_gen2[k]--; + return; + } + overlord_gen2[k] = 127; + for (int i = 3; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x9b, &info, 12); + if (j >= 0) { + Sprite_SetX(j, link_x_coord + kOverlordWizzrobe_X[i]); + Sprite_SetY(j, link_y_coord + kOverlordWizzrobe_Y[i]); + sprite_delay_main[j] = kOverlordWizzrobe_Delay[i]; + sprite_floor[j] = overlord_floor[k]; + sprite_B[j] = 1; + } + } + tmp_counter = 0xff; +} + +void Overlord14_TileRoom(int k) { // 89b9e8 + uint16 x = (overlord_x_lo[k] | overlord_x_hi[k] << 8) - BG2HOFS_copy2; + uint16 y = (overlord_y_lo[k] | overlord_y_hi[k] << 8) - BG2VOFS_copy2; + if (x & 0xff00 || y & 0xff00) + return; + if (--overlord_gen2[k] != 0x80) + return; + int j = TileRoom_SpawnTile(k); + if (j < 0) { + overlord_gen2[k] = 0x81; + return; + } + if (++overlord_gen1[k] != 22) + overlord_gen2[k] = 0xE0; + else + overlord_type[k] = 0; +} + +int TileRoom_SpawnTile(int k) { // 89ba56 + static const uint8 kSpawnFlyingTile_X[22] = { + 0x70, 0x80, 0x60, 0x90, 0x90, 0x60, 0x70, 0x80, 0x80, 0x70, 0x50, 0xa0, 0xa0, 0x50, 0x50, 0xa0, + 0xa0, 0x50, 0x70, 0x80, 0x80, 0x70, + }; + static const uint8 kSpawnFlyingTile_Y[22] = { + 0x80, 0x80, 0x70, 0x90, 0x70, 0x90, 0x60, 0xa0, 0x60, 0xa0, 0x60, 0xb0, 0x60, 0xb0, 0x80, 0x90, + 0x80, 0x90, 0x70, 0x90, 0x70, 0x90, + }; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x94, &info); + if (j < 0) + return j; + sprite_E[j] = 1; + int i = overlord_gen1[k]; + sprite_x_lo[j] = kSpawnFlyingTile_X[i]; + sprite_y_lo[j] = kSpawnFlyingTile_Y[i] - 8; + sprite_y_hi[j] = overlord_y_hi[k]; + sprite_x_hi[j] = overlord_x_hi[k]; + sprite_floor[j] = overlord_floor[k]; + sprite_health[j] = 4; + sprite_flags5[j] = 0; + sprite_health[j] = 0; + sprite_defl_bits[j] = 8; + sprite_flags2[j] = 4; + sprite_oam_flags[j] = 1; + sprite_bump_damage[j] = 4; + return j; +} + +void Overlord10_PirogusuSpawner_left(int k) { // 89baac + static const uint8 kOverlordPirogusu_A[4] = { 2, 3, 0, 1 }; + + tmp_counter = overlord_type[k] - 16; + if (overlord_gen2[k] != 128) { + overlord_gen2[k]--; + return; + } + overlord_gen2[k] = (GetRandomNumber() & 31) + 96; + int n = 0; + for (int i = 0; i != 16; i++) { + if (sprite_state[i] != 0 && sprite_type[i] == 0x10) + n++; + } + if (n >= 5) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x94, &info, 12); + if (j >= 0) { + Sprite_SetX(j, info.r5_overlord_x); + Sprite_SetY(j, info.r7_overlord_y); + sprite_floor[j] = overlord_floor[k]; + sprite_delay_main[j] = 32; + sprite_D[j] = tmp_counter; + sprite_A[j] = kOverlordPirogusu_A[tmp_counter]; + } +} + +void Overlord0A_FallingSquare(int k) { // 89bbb2 + static const uint8 kCrumbleTilePathData[108 + 1] = { + 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 1, + 3, 0, 3, 1, 3, 0, 3, 1, 3, 0, 3, 1, 3, 0, 3, 1, + 3, 0, 3, 1, 3, 0, 3, 1, 3, 0, 3, 1, 3, 0, 3, 1, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0xff + }; + static const uint8 kCrumbleTilePathOffs[7] = { + 0, 25, 66, 77, 87, 98, 108 + }; + static const int8 kCrumbleTilePath_X[4] = { 16, -16, 0, 0 }; + static const int8 kCrumbleTilePath_Y[4] = { 0, 0, 16, -16 }; + if (overlord_gen2[k]) { + if (overlord_gen3[k]) { + overlord_gen2[k]--; + return; + } + uint16 x = Overlord_GetX(k) - BG2HOFS_copy2; + uint16 y = Overlord_GetY(k) - BG2VOFS_copy2; + if (!(x & 0xff00 || y & 0xff00)) + overlord_gen3[k]++; + return; + } + + overlord_gen2[k] = 16; + SpawnFallingTile(k); + int j = overlord_type[k] - 10; + int i = overlord_gen1[k]++; + if (i == kCrumbleTilePathOffs[j + 1] - kCrumbleTilePathOffs[j]) { + overlord_type[k] = 0; + } + int t = kCrumbleTilePathData[kCrumbleTilePathOffs[j] + i]; + if (t == 0xff) { + Overlord_SetX(k, Overlord_GetX(k) + 0xc1a); + Overlord_SetY(k, Overlord_GetY(k) + 0xbb66); + } else { + Overlord_SetX(k, Overlord_GetX(k) + kCrumbleTilePath_X[t]); + Overlord_SetY(k, Overlord_GetY(k) + kCrumbleTilePath_Y[t]); + } +} + +void SpawnFallingTile(int k) { // 89bc31 + int j = GarnishAlloc(); + if (j >= 0) { + garnish_type[j] = 3; + garnish_x_hi[j] = overlord_x_hi[k]; + garnish_x_lo[j] = overlord_x_lo[k]; + sound_effect_1 = CalculateSfxPan_Arbitrary(garnish_x_lo[j]) | 0x1f; + int y = Overlord_GetY(k) + 16; + garnish_y_lo[j] = y; + garnish_y_hi[j] = y >> 8; + garnish_countdown[j] = 31; + garnish_active = 31; + } +} + +void Overlord09_WallmasterSpawner(int k) { // 89bc7b + if (overlord_gen2[k] != 128) { + if (!(frame_counter & 1)) + overlord_gen2[k]--; + return; + } + overlord_gen2[k] = 127; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x90, &info, 12); + if (j < 0) + return; + Sprite_SetX(j, link_x_coord); + Sprite_SetY(j, link_y_coord); + sprite_z[j] = 208; + SpriteSfx_QueueSfx2WithPan(j, 0x20); + sprite_floor[j] = link_is_on_lower_level; +} + +void Overlord08_BlobSpawner(int k) { // 89bcc3 + if (overlord_gen2[k]) { + overlord_gen2[k]--; + return; + } + overlord_gen2[k] = 0xa0; + int n = 0; + for (int i = 0; i != 16; i++) { + if (sprite_state[i] != 0 && sprite_type[i] == 0x8f) + n++; + } + if (n >= 5) + return; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x8f, &info, 12); + if (j >= 0) { + static const int8 kOverlordZol_X[4] = { 0, 0, -48, 48 }; + static const int8 kOverlordZol_Y[4] = { -40, 56, 8, 8 }; + int i = link_direction_facing >> 1; + Sprite_SetX(j, link_x_coord + kOverlordZol_X[i]); + Sprite_SetY(j, link_y_coord + kOverlordZol_Y[i]); + sprite_z[j] = 192; + sprite_floor[j] = link_is_on_lower_level; + sprite_ai_state[j] = 2; + sprite_E[j] = 2; + sprite_C[j] = 2; + sprite_head_dir[j] = GetRandomNumber() & 31 | 16; + } +} + +void Overlord07_MovingFloor(int k) { // 89bd3f + if (sprite_state[0] == 4) { + overlord_type[k] = 0; + BYTE(dung_floor_move_flags) = 1; + return; + } + if (!overlord_gen1[k]) { + if (++overlord_gen2[k] == 32) { + overlord_gen2[k] = 0; + BYTE(dung_floor_move_flags) = (GetRandomNumber() & (overlord_x_lo[k] ? 3 : 1)) * 2; + overlord_gen2[k] = (GetRandomNumber() & 127) + 128; + overlord_gen1[k]++; + } else { + BYTE(dung_floor_move_flags) = 1; + } + } else { + if (!--overlord_gen2[k]) + overlord_gen1[k] = 0; + } +} + +void Sprite_Overlord_PlayFallingSfx(int k) { // 89bdfd + SpriteSfx_QueueSfx2WithPan(k, 0x20); +} + +void Overlord05_FallingStalfos(int k) { // 89be0f + static const uint8 kStalfosTrap_Trigger[8] = { 255, 224, 192, 160, 128, 96, 64, 32 }; + + uint16 x = (overlord_x_lo[k] | overlord_x_hi[k] << 8) - BG2HOFS_copy2; + uint16 y = (overlord_y_lo[k] | overlord_y_hi[k] << 8) - BG2VOFS_copy2; + if (x & 0xff00 || y & 0xff00) + return; + if (overlord_gen1[k] == 0) { + if (byte_7E0B9E) + overlord_gen1[k]++; + return; + } + if (overlord_gen1[k]++ == kStalfosTrap_Trigger[k]) { + overlord_type[k] = 0; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x85, &info, 12); + if (j < 0) + return; + Sprite_SetX(j, info.r5_overlord_x); + Sprite_SetY(j, info.r7_overlord_y); + sprite_z[j] = 224; + sprite_floor[j] = overlord_floor[k]; + sprite_D[j] = 0; // zelda bug: unitialized + Sprite_Overlord_PlayFallingSfx(j); + } +} + +void Overlord06_BadSwitchSnake(int k) { // 89be75 + static const uint8 kSnakeTrapOverlord_Tab1[8] = { 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90 }; + + uint8 a = overlord_gen1[k]; + if (a == 0) { + if (activate_bomb_trap_overlord != 0) + overlord_gen1[k] = 1; + return; + } + overlord_gen1[k] = a + 1; + + if (a != kSnakeTrapOverlord_Tab1[k]) + return; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x6e, &info); + if (j < 0) + return; + Sprite_SetX(j, info.r5_overlord_x); + Sprite_SetY(j, info.r7_overlord_y); + + sprite_z[j] = 192; + sprite_E[j] = 192; + + sprite_flags3[j] |= 0x10; + sprite_floor[j] = overlord_floor[k]; + SpriteSfx_QueueSfx2WithPan(j, 0x20); + uint8 type = overlord_type[k]; + overlord_type[k] = 0; + if (type == 26) { + sprite_type[j] = 74; + Sprite_TransmuteToBomb(j); + sprite_delay_aux1[j] = 112; + } +} + +void Overlord02_FullRoomCannons(int k) { // 89bf09 + static const uint8 kAllDirectionMetalBallFactory_Idx[16] = { 2, 2, 2, 2, 1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 0, 0 }; + static const uint8 kAllDirectionMetalBallFactory_X[16] = { 64, 96, 144, 176, 240, 240, 240, 240, 176, 144, 96, 64, 0, 0, 0, 0 }; + static const uint8 kAllDirectionMetalBallFactory_Y[16] = { 16, 16, 16, 16, 64, 96, 160, 192, 240, 240, 240, 240, 192, 160, 96, 64 }; + uint16 x = (overlord_x_lo[k] | overlord_x_hi[k] << 8) - BG2HOFS_copy2; + uint16 y = (overlord_y_lo[k] | overlord_y_hi[k] << 8) - BG2VOFS_copy2; + if ((x | y) & 0xff00 || frame_counter & 0xf) + return; + + byte_7E0FB6 = 0; + int j = GetRandomNumber() & 15; + tmp_counter = kAllDirectionMetalBallFactory_Idx[j]; + overlord_x_lo[k] = kAllDirectionMetalBallFactory_X[j]; + overlord_x_hi[k] = byte_7E0FB0; + overlord_y_lo[k] = kAllDirectionMetalBallFactory_Y[j]; + overlord_y_hi[k] = byte_7E0FB1 + 1; + Overlord_SpawnCannonBall(k, 0); +} + +void Overlord03_VerticalCannon(int k) { // 89bf5b + uint16 x = (overlord_x_lo[k] | overlord_x_hi[k] << 8) - BG2HOFS_copy2; + if (x & 0xff00) { + overlord_gen2[k] = 255; + return; + } + if (!(frame_counter & 1) && overlord_gen2[k]) + overlord_gen2[k]--; + tmp_counter = 2; + byte_7E0FB6 = 0; + if (!sign8(--overlord_gen1[k])) + return; + overlord_gen1[k] = 56; + int xd; + if (!overlord_gen2[k]) { + overlord_gen2[k] = 160; + byte_7E0FB6 = 160; + xd = 8; + } else { + xd = (GetRandomNumber() & 2) * 8; + } + Overlord_SpawnCannonBall(k, xd); +} + +void Overlord_SpawnCannonBall(int k, int xd) { // 89bfaf + static const int8 kOverlordSpawnBall_Xvel[4] = { 24, -24, 0, 0 }; + static const int8 kOverlordSpawnBall_Yvel[4] = { 0, 0, 24, -24 }; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x50, &info); + if (j < 0) + return; + + Sprite_SetX(j, info.r5_overlord_x + xd); + Sprite_SetY(j, info.r7_overlord_y - 1); + + sprite_x_vel[j] = kOverlordSpawnBall_Xvel[tmp_counter]; + sprite_y_vel[j] = kOverlordSpawnBall_Yvel[tmp_counter]; + sprite_floor[j] = overlord_floor[k]; + if (byte_7E0FB6) { + sprite_ai_state[j] = byte_7E0FB6; + sprite_y_lo[j] = sprite_y_lo[j] + 8; + sprite_flags2[j] = 3; + sprite_flags4[j] = 9; + } + sprite_delay_aux2[j] = 64; + SpriteSfx_QueueSfx3WithPan(j, 0x7); +} + +void Overlord01_PositionTarget(int k) { // 89c01e + byte_7E0FDE = k; +} + +void Overlord_CheckIfActive(int k) { // 89c08d + static const int16 kOverlordInRangeOffs[2] = { 0x130, -0x40 }; + if (player_is_indoors) + return; + int j = frame_counter & 1; + uint16 x = BG2HOFS_copy2 + kOverlordInRangeOffs[j] - (overlord_x_lo[k] | overlord_x_hi[k] << 8); + uint16 y = BG2VOFS_copy2 + kOverlordInRangeOffs[j] - (overlord_y_lo[k] | overlord_y_hi[k] << 8); + if ((x >> 15) != j || (y >> 15) != j) { + overlord_type[k] = 0; + uint16 blk = overlord_offset_sprite_pos[k]; + if (blk != 0xffff) { + uint8 loadedmask = (0x80 >> (blk & 7)); + overworld_sprite_was_loaded[blk >> 3] &= ~loadedmask; + } + } +} + +void ArmosCoordinator_RotateKnights(int k) { // 9deccc + if (!overlord_gen2[k]) + overlord_gen1[k]++; + ArmosCoordinator_Rotate(k); +} + +void ArmosCoordinator_Rotate(int k) { // 9decd4 + static const uint16 kArmosCoordinator_Tab0[6] = { 0, 425, 340, 255, 170, 85 }; + + WORD(overlord_x_lo[0]) += (int8)overlord_floor[k]; + for (int i = 0; i != 6; i++) { + int t0 = WORD(overlord_x_lo[0]) + kArmosCoordinator_Tab0[i]; + uint8 size = overlord_x_lo[2]; + int tx = (overlord_x_lo[k] | overlord_x_hi[k] << 8) + ArmosSin(t0, size); + overlord_x_hi[i] = tx; + overlord_y_hi[i] = tx >> 8; + int ty = (overlord_y_lo[k] | overlord_y_hi[k] << 8) + ArmosSin(t0 + 0x80, size); + overlord_gen2[i] = ty; + overlord_floor[i] = ty >> 8; + } + tmp_counter = 6; +} + +bool ArmosCoordinator_CheckKnights() { // 9dedb8 + for (int j = 5; j >= 0; j--) { + if (sprite_state[j] && sprite_ai_state[j] == 0) + return false; + } + return true; +} + +void ArmosCoordinator_DisableCoercion(int k) { // 9dedcb + for (int j = 5; j >= 0; j--) + sprite_ai_state[j] = 0; +} + diff --git a/overlord.h b/overlord.h new file mode 100644 index 00000000..a0951397 --- /dev/null +++ b/overlord.h @@ -0,0 +1,37 @@ +#pragma once +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" + +void Overlord_StalfosFactory(int k); +void Overlord_SetX(int k, uint16 v); +void Overlord_SetY(int k, uint16 v); +void Overlord_SpawnBoulder(); +void Overlord_Main(); +void Overlord_ExecuteAll(); +void Overlord_ExecuteSingle(int k); +void Overlord19_ArmosCoordinator_bounce(int k); +void Overlord18_InvisibleStalfos(int k); +void Overlord17_PotTrap(int k); +void Overlord16_ZoroSpawner(int k); +void Overlord15_WizzrobeSpawner(int k); +void Overlord14_TileRoom(int k); +int TileRoom_SpawnTile(int k); +void Overlord10_PirogusuSpawner_left(int k); +void Overlord0A_FallingSquare(int k); +void SpawnFallingTile(int k); +void Overlord09_WallmasterSpawner(int k); +void Overlord08_BlobSpawner(int k); +void Overlord07_MovingFloor(int k); +void Sprite_Overlord_PlayFallingSfx(int k); +void Overlord05_FallingStalfos(int k); +void Overlord06_BadSwitchSnake(int k); +void Overlord02_FullRoomCannons(int k); +void Overlord03_VerticalCannon(int k); +void Overlord_SpawnCannonBall(int k, int xd); +void Overlord01_PositionTarget(int k); +void Overlord_CheckIfActive(int k); +void ArmosCoordinator_RotateKnights(int k); +void ArmosCoordinator_Rotate(int k); +bool ArmosCoordinator_CheckKnights(); +void ArmosCoordinator_DisableCoercion(int k); diff --git a/overworld.cpp b/overworld.cpp new file mode 100644 index 00000000..0a04f5de --- /dev/null +++ b/overworld.cpp @@ -0,0 +1,4082 @@ +#include "overworld.h" +#include "hud.h" +#include "load_gfx.h" +#include "dungeon.h" +#include "tagalong.h" +#include "sprite.h" +#include "ancilla.h" +#include "player.h" +#include "misc.h" +#include "messaging.h" +#include "player_oam.h" +#include "tables/generated_map32_to_map16.h" +#include "tables/generated_map16_to_map8.h" +#include "tables/generated_overworld_tables.h" +#include "tables/generated_overworld.h" +#include "tables/generated_enemy_damage_data.h" + +const uint16 kOverworld_OffsetBaseX[64] = { + 0, 0, 0x400, 0x600, 0x600, 0xa00, 0xa00, 0xe00, + 0, 0, 0x400, 0x600, 0x600, 0xa00, 0xa00, 0xe00, + 0, 0x200, 0x400, 0x600, 0x800, 0xa00, 0xc00, 0xe00, + 0, 0, 0x400, 0x600, 0x600, 0xa00, 0xc00, 0xc00, + 0, 0, 0x400, 0x600, 0x600, 0xa00, 0xc00, 0xc00, + 0, 0x200, 0x400, 0x600, 0x800, 0xa00, 0xc00, 0xe00, + 0, 0, 0x400, 0x600, 0x800, 0xa00, 0xa00, 0xe00, + 0, 0, 0x400, 0x600, 0x800, 0xa00, 0xa00, 0xe00, +}; +const uint16 kOverworld_OffsetBaseY[64] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x200, 0, 0, 0, 0, 0x200, + 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, + 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, + 0x600, 0x600, 0x800, 0x600, 0x600, 0x800, 0x600, 0x600, + 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, + 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, + 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, 0xc00, 0xc00, 0xe00, +}; +static const uint16 kOverworld_UpDownScrollTarget[64] = { + 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, + 0xff20, 0xff20, 0x120, 0xff20, 0xff20, 0xff20, 0xff20, 0x120, + 0x320, 0x320, 0x320, 0x320, 0x320, 0x320, 0x320, 0x320, + 0x520, 0x520, 0x520, 0x520, 0x520, 0x520, 0x520, 0x520, + 0x520, 0x520, 0x720, 0x520, 0x520, 0x720, 0x520, 0x520, + 0x920, 0x920, 0x920, 0x920, 0x920, 0x920, 0x920, 0x920, + 0xb20, 0xb20, 0xb20, 0xb20, 0xb20, 0xb20, 0xb20, 0xb20, + 0xb20, 0xb20, 0xd20, 0xd20, 0xd20, 0xb20, 0xb20, 0xd20, +}; +static const uint16 kOverworld_LeftRightScrollTarget[64] = { + 0xff00, 0xff00, 0x300, 0x500, 0x500, 0x900, 0x900, 0xd00, + 0xff00, 0xff00, 0x300, 0x500, 0x500, 0x900, 0x900, 0xd00, + 0xff00, 0x100, 0x300, 0x500, 0x700, 0x900, 0xb00, 0xd00, + 0xff00, 0xff00, 0x300, 0x500, 0x500, 0x900, 0xb00, 0xb00, + 0xff00, 0xff00, 0x300, 0x500, 0x500, 0x900, 0xb00, 0xb00, + 0xff00, 0x100, 0x300, 0x500, 0x700, 0x900, 0xb00, 0xd00, + 0xff00, 0xff00, 0x300, 0x500, 0x700, 0x900, 0x900, 0xd00, + 0xff00, 0xff00, 0x300, 0x500, 0x700, 0x900, 0x900, 0xd00, +}; +#if 0 +static const uint16 kSpExit_Top[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0x200, 0x200, 0, 0, 0, 0, 0, 0 }; +static const uint16 kSpExit_Bottom[16] = { 0x120, 0x20, 0x320, 0x20, 0, 0, 0x320, 0x320, 0x320, 0x220, 0, 0, 0, 0, 0x320, 0x320 }; +static const uint16 kSpExit_Left[16] = { 0, 0x100, 0x200, 0x600, 0x600, 0xa00, 0xc00, 0xc00, 0, 0x100, 0x200, 0x600, 0x600, 0xa00, 0xc00, 0xc00 }; +static const uint16 kSpExit_Right[16] = { 0, 0x100, 0x500, 0x600, 0x600, 0xa00, 0xc00, 0xc00, 0, 0x100, 0x400, 0x600, 0x600, 0xa00, 0xc00, 0xc00 }; +static const uint16 kSpExit_Tab4[16] = { 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0xff20, 0x120, 0xff20, 0xff20, 0xff20, 0xff20, 0x120 }; +static const int16 kSpExit_Tab6[16] = { -4, 0x100, 0x300, 0x100, 0x500, 0x900, 0xb00, 0xb00, -4, 0x100, 0x300, 0x500, 0x500, 0x900, 0xb00, 0xb00 }; +static const int16 kSpExit_Tab5[16] = { -0xe0, -0xe0, -0xe0, -0xe0, -0xe0, -0xe0, 0x400, 0x400, -0xe0, -0xe0, 0x120, -0xe0, -0xe0, -0xe0, 0x400, 0x400 }; +static const uint16 kSpExit_Tab7[16] = { 4, 0x104, 0x300, 0x100, 0x500, 0x900, 0xb00, 0xb00, 4, 0x104, 0x300, 0x100, 0x500, 0x900, 0xb00, 0xb00 }; +static const uint16 kSpExit_LeftEdgeOfMap[16] = { 0, 0, 0x200, 0x600, 0x600, 0xa00, 0xc00, 0xc00, 0, 0, 0x200, 0x600, 0x600, 0xa00, 0xc00, 0xc00 }; +static const uint8 kSpExit_Dir[16] = { 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static const uint8 kSpExit_SprGfx[16] = { 0xc, 0xc, 0xe, 0xe, 0xe, 0x10, 0x10, 0x10, 0xe, 0xe, 0xe, 0xe, 0x10, 0x10, 0x10, 0x10 }; +static const uint8 kSpExit_AuxGfx[16] = { 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f }; +static const uint8 kSpExit_PalBg[16] = { 0xa, 0xa, 0xa, 0xa, 2, 2, 2, 0xa, 2, 2, 0xa, 2, 2, 2, 2, 0xa }; +static const uint8 kSpExit_PalSpr[16] = { 1, 8, 8, 8, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 2 }; +#endif +#define turtlerock_ctr (g_ram[0xc8]) +#define ganonentrance_ctr (g_ram[0xc8]) +static PlayerHandlerFunc *const kOverworld_EntranceSequence[5] = { + &Overworld_AnimateEntrance_PoD, + &Overworld_AnimateEntrance_Skull, + &Overworld_AnimateEntrance_Mire, + &Overworld_AnimateEntrance_TurtleRock, + &Overworld_AnimateEntrance_GanonsTower, +}; +#ifndef map16_decode_0 +#define map16_decode_0 ((uint8*)(g_ram+0x14400)) +#define map16_decode_1 ((uint8*)(g_ram+0x14410)) +#define map16_decode_2 ((uint8*)(g_ram+0x14420)) +#define map16_decode_3 ((uint8*)(g_ram+0x14430)) +#define map16_decode_last (*(uint16*)(g_ram+0x14440)) +#define map16_decode_tmp (*(uint16*)(g_ram+0x14442)) +#endif +static const uint16 kSecondaryOverlayPerOw[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x1c0c, 0x1c0c, 0, 0, 0, 0, 0, 0, 0x1c0c, 0x1c0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x3b0, 0x180c, 0x180c, 0x288, 0, 0, 0, 0, 0, 0x180c, 0x180c, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ab6, 0x1ab6, 0, 0xe2e, 0xe2e, 0, 0, 0, + 0x1ab6, 0x1ab6, 0, 0xe2e, 0xe2e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3b0, 0, 0, 0x288, + 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define XY(x, y) ((y)*64+(x)) +// this alternate entry point is for scrolling OW area loads +// b/c drawing a door only applies to when you transition from a dungeon to the OW +// the exceptioon is OW areas 0x80 and above which are handled similar to entrances +static const uint16 kOverworld_DrawStrip_Tab[3] = { 0x3d0, 0x410, 0xf410 }; +static const uint16 kOverworld_Func2_Tab[4] = { 8, 4, 2, 1 }; +static const uint16 kOverworld_Entrance_Tab0[44] = { + 0xfe, 0xc5, 0xfe, 0x114, 0x115, 0x175, 0x156, 0xf5, 0xe2, 0x1ef, 0x119, 0xfe, 0x172, 0x177, 0x13f, 0x172, 0x112, 0x161, 0x172, 0x14c, 0x156, 0x1ef, 0xfe, 0xfe, 0xfe, 0x10b, 0x173, 0x143, 0x149, 0x175, 0x103, 0x100, + 0x1cc, 0x15e, 0x167, 0x128, 0x131, 0x112, 0x16d, 0x163, 0x173, 0xfe, 0x113, 0x177, +}; +static const uint16 kOverworld_Entrance_Tab1[44] = { + 0x14a, 0xc4, 0x14f, 0x115, 0x114, 0x174, 0x155, 0xf5, 0xee, 0x1eb, 0x118, 0x146, 0x171, 0x155, 0x137, 0x174, 0x173, 0x121, 0x164, 0x155, 0x157, 0x128, 0x114, 0x123, 0x113, 0x109, 0x118, 0x161, 0x149, 0x117, 0x174, 0x101, + 0x1cc, 0x131, 0x51, 0x14e, 0x131, 0x112, 0x17a, 0x163, 0x172, 0x1bd, 0x152, 0x167, +}; +static const uint16 kDwPaletteAnim[35] = { + 0x884, 0xcc7, 0x150a, 0x154d, 0x7ff6, 0x5944, 0x7ad1, + 0x884, 0xcc7, 0x150a, 0x154d, 0x5bff, 0x7ad1, 0x21af, + 0x1084, 0x48c0, 0x6186, 0x7e6d, 0x7fe0, 0x5944, 0x7e20, + 0x1084, 0x000e, 0x1059, 0x291f, 0x7fe0, 0x5944, 0x7e20, + 0x1084, 0x1508, 0x196c, 0x21af, 0x7ff6, 0x1d4c, 0x7ad1, +}; +static const uint16 kDwPaletteAnim2[40] = { + 0x7fff, 0x884, 0x1cc8, 0x1dce, 0x3694, 0x4718, 0x1d4a, 0x18ac, + 0x7fff, 0x1908, 0x2d2f, 0x3614, 0x4eda, 0x471f, 0x1d4a, 0x390f, + 0x7fff, 0x34cd, 0x5971, 0x5635, 0x7f1b, 0x7fff, 0x1d4a, 0x3d54, + 0x7fff, 0x1908, 0x2d2f, 0x3614, 0x4eda, 0x471f, 0x1d4a, 0x390f, + 0x7fff, 0x884, 0x52a, 0x21ef, 0x3ab5, 0x4b39, 0x1d4c, 0x18ac, +}; +static const uint16 kSpecialSwitchArea_Map8[4] = { 0x105, 0x1e4, 0xad, 0xb9 }; +static const uint16 kSpecialSwitchArea_Screen[4] = { 0, 45, 15, 129 }; +static const uint8 kSpecialSwitchArea_Direction[4] = { 8, 2, 8, 8 }; +static const uint16 kSpecialSwitchArea_Exit[4] = { 0x180, 0x181, 0x182, 0x189 }; +const uint8 kVariousPacks[16] = { + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x5b, 0x01, 0x5a, + 0x42, 0x43, 0x44, 0x45, 0x3f, 0x59, 0x0b, 0x5a +}; +static const uint16 kSpecialSwitchAreaB_Map8[3] = { 0x17c, 0x1e4, 0xad }; +static const uint16 kSpecialSwitchAreaB_Screen[3] = { 0x80, 0x80, 0x81 }; +static const uint16 kSpecialSwitchAreaB_Direction[3] = { 4, 1, 4 }; +static const int16 kSwitchAreaTab0[4] = { 0xf80, 0xf80, 0x3f, 0x3f }; +static const int16 kSwitchAreaTab1[256] = { + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x1060, 0x1060, 0x1060, 0x1060, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x1060, 0x1060, 0x60, 0x1060, 0x1060, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x1060, 0x1060, 0x60, + 0x80, 0x80, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x1080, 0x1080, 0x40, 0x1080, 0x1080, 0x1080, 0x1080, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x40, 0x80, 0x80, 0x40, 0x80, 0x80, + 0x1080, 0x1080, 0x40, 0x1080, 0x1080, 0x40, 0x1080, 0x1080, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x80, 0x80, 0x40, 0x40, 0x40, 0x80, 0x80, 0x40, 0x1080, 0x1080, 0x40, 0x40, 0x40, 0x1080, 0x1080, 0x40, + 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1840, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, + 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1840, 0x1800, 0x1800, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1840, 0x1800, 0x1800, 0x1800, 0x1800, 0x1840, 0x1800, + 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x2000, 0x2040, 0x1000, + 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, + 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, + 0x2000, 0x2040, 0x1000, 0x1000, 0x1000, 0x2000, 0x2040, 0x1000, 0x2000, 0x2040, 0x1000, 0x1000, 0x1000, 0x2000, 0x2040, 0x1000, +}; +static const int16 kSwitchAreaTab3[4] = { 2, -2, 16, -16 }; +// kOverworldAreaHeads[i] != i for subregions of a big area +static const uint8 kOverworldAreaHeads[64] = { + 0, 0, 2, 3, 3, 5, 5, 7, + 0, 0, 10, 3, 3, 5, 5, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 24, 26, 27, 27, 29, 30, 30, + 24, 24, 34, 27, 27, 37, 30, 30, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 48, 50, 51, 52, 53, 53, 55, + 48, 48, 58, 59, 60, 53, 53, 63, +}; +static const uint16 kOverworld_Size1[2] = { 0x11e, 0x31e }; +static const uint16 kOverworld_Size2[2] = { 0x100, 0x300 }; +static const uint16 kOverworld_UpDownScrollSize[2] = { 0x2e0, 0x4e0 }; +static const uint16 kOverworld_LeftRightScrollSize[2] = { 0x300, 0x500 }; +static const int16 kOverworld_Func6B_Tab1[4] = { -8, 8, -8, 8 }; +static const int16 kOverworld_Func6B_Tab2[4] = { 27, 27, 30, 30 }; +static const int16 kOverworld_Func6B_Tab3[4] = { -0x70, 0x70, -0x70, 0x70 }; +static const int16 kOverworld_Func6B_AreaDelta[4] = { -8, 8, -1, 1 }; +static const uint8 kOverworld_Func8_tab[4] = { 0xe0, 8, 0xe0, 0x10 }; +static const uint16 kDoorAnimTiles[56] = { + 0xda8, 0xda9, 0xdaa, 0xdab, + 0xdac, 0xdad, 0xdae, 0xdaf, + 0xdb0, 0xdb1, 0xdb2, 0xdb3, + 0xdb6, 0xdb7, 0xdb8, 0xdb9, + 0xdba, 0xdbb, 0xdbc, 0xdbd, + 0xdcd, 0xdce, 0xdcf, 0xdd0, + 0xdd3, 0xdd4, 0xdd5, 0xdd6, + 0xdd7, 0xdd8, 0xdd9, 0xdda, + 0xdd1, 0xdd2, 0xdd3, 0xdd4, + 0xdd1, 0xdd2, 0xdd7, 0xdd8, + 0x918, 0x919, 0x91a, 0x91b, + 0xddb, 0xddc, 0xddd, 0xdde, + 0xdd1, 0xdd2, 0xddb, 0xddc, + 0xe21, 0xe22, 0xe23, 0xe24, +}; +static PlayerHandlerFunc *const kOverworldSubmodules[48] = { + &Module09_00_PlayerControl, + &Module09_LoadAuxGFX, + &Overworld_FinishTransGfx, + &Module09_LoadNewMapAndGFX, + &Module09_LoadNewSprites, + &Overworld_StartScrollTransition, + &Overworld_RunScrollTransition, + &Overworld_EaseOffScrollTransition, + &Overworld_FinalizeEntryOntoScreen, + &Module09_09_OpenBigDoorFromExiting, + &Module09_0A_WalkFromExiting_FacingDown, + &Module09_0B_WalkFromExiting_FacingUp, + &Module09_0C_OpenBigDoor, + &Overworld_StartMosaicTransition, + &PreOverworld_LoadOverlays, + &Module09_LoadAuxGFX, + &Overworld_FinishTransGfx, + &Module09_LoadNewMapAndGFX, + &Module09_LoadNewSprites, + &Overworld_StartScrollTransition, + &Overworld_RunScrollTransition, + &Overworld_EaseOffScrollTransition, + &Module09_FadeBackInFromMosaic, + &Overworld_StartMosaicTransition, + &Overworld_Func18, + &Overworld_Func19, + &Module09_LoadAuxGFX, + &Overworld_FinishTransGfx, + &Overworld_Func1C, + &Overworld_Func1D, + &Overworld_Func1E, + &Overworld_Func1F, + &Overworld_LoadOverlays2, + &Overworld_LoadAmbientOverlay, + &Overworld_Func22, + &Module09_MirrorWarp, + &Overworld_StartMosaicTransition, + &Overworld_LoadOverlays, + &Module09_LoadAuxGFX, + &Overworld_FinishTransGfx, + &Overworld_LoadAndBuildScreen, + &Module09_FadeBackInFromMosaic, + &Module09_2A_RecoverFromDrowning, + &Overworld_Func2B, + &Module09_MirrorWarp, + &Overworld_WeathervaneExplosion, + &Module09_2E_Whirlpool, + &Overworld_Func2F, +}; +static PlayerHandlerFunc *const kModule_PreOverworld[3] = { + &PreOverworld_LoadProperties, + &PreOverworld_LoadOverlays, + &Module08_02_LoadAndAdvance, +}; +const uint8 *GetMap8toTileAttr() { + return kMap8DataToTileAttr; +} + +const uint16 *GetMap16toMap8Table() { + return kMap16ToMap8; +} + +bool LookupInOwEntranceTab(uint16 r0, uint16 r2) { + for (int i = countof(kOverworld_Entrance_Tab0) - 1; i >= 0; i--) { + if (r0 == kOverworld_Entrance_Tab0[i] && r2 == kOverworld_Entrance_Tab1[i]) + return true; + } + return false; +} + +int LookupInOwEntranceTab2(uint16 pos) { + for (int i = 128; i >= 0; i--) { + if (pos == kOverworld_Entrance_Pos[i] && overworld_area_index == kOverworld_Entrance_Area[i]) + return i; + } + return -1; +} + +bool CanEnterWithTagalong(int e) { + uint8 t = savegame_tagalong; + return t == 0 || t == 5 || t == 14 || t == 1 || (t == 7 || t == 8) && e >= 59; +} + +int DirToEnum(int dir) { + int xx = 3; + while (!(dir & 1)) + xx--, dir >>= 1; + return xx; +} + +void Overworld_ResetMosaicDown() { + if (palette_filter_countdown & 1) + mosaic_level -= 0x10; + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 7; +} + +void Overworld_Func1D() { + assert(0); +} + +void Overworld_Func1E() { + assert(0); +} + +uint16 Overworld_GetSignText(int area) { + return kOverworld_SignText[area]; +} + +const uint8 *GetOverworldSpritePtr(int area) { + int base = (sram_progress_indicator == 3) ? 2 : + (sram_progress_indicator == 2) ? 1 : 0; + return kOverworldSprites + kOverworldSpriteOffs[area + base * 144]; +} + +uint8 GetOverworldBgPalette(int idx) { + return kOverworldBgPalettes[idx]; +} + +void Sprite_LoadGraphicsProperties() { // 80fc41 + memcpy(overworld_sprite_gfx + 64, kOverworldSpriteGfx + 0xc0, 64); + memcpy(overworld_sprite_palettes + 64, kOverworldSpritePalettes + 0xc0, 64); + Sprite_LoadGraphicsProperties_light_world_only(); +} + +void Sprite_LoadGraphicsProperties_light_world_only() { // 80fc62 + int i = sram_progress_indicator < 2 ? 0 : + sram_progress_indicator != 3 ? 1 : 2; + memcpy(overworld_sprite_gfx, kOverworldSpriteGfx + i * 64, 64); + memcpy(overworld_sprite_palettes, kOverworldSpritePalettes + i * 64, 64); +} + +void InitializeMirrorHDMA() { // 80fdee + HDMAEN_copy = 0; + + mirror_vars.var0 = 0; + mirror_vars.var6 = 0; + mirror_vars.var5 = 0; + mirror_vars.var7 = 0; + mirror_vars.var8 = 0; + + mirror_vars.var10 = mirror_vars.var11 = 8; + mirror_vars.var9 = 21; + mirror_vars.var1[0] = -0x200; + mirror_vars.var1[1] = 0x200; + mirror_vars.var3[0] = -0x40; + mirror_vars.var3[1] = 0x40; + + HdmaSetup(0xF2FB, 0xF2FB, 0x42, (uint8)BG1HOFS, (uint8)BG2HOFS, 0); + + uint16 v = BG2HOFS_copy2; + for (int i = 0; i < 32 * 7; i++) + mode7_hdma_table[i] = v; + HDMAEN_copy = 0xc0; +} + +void MirrorWarp_BuildWavingHDMATable() { // 80fe64 + MirrorWarp_RunAnimationSubmodules(); + if (frame_counter & 1) + return; + + int x = 0x1a0 / 2, y = 0x1b0 / 2; + do { + mode7_hdma_table[y] = mode7_hdma_table[y + 2] = mode7_hdma_table[y + 4] = mode7_hdma_table[y + 6] = mode7_hdma_table[x]; + x -= 8, y -= 8; + } while (y != 0); + int i = mirror_vars.var0 >> 1; + int t = mirror_vars.var6 + mirror_vars.var3[i]; + if (!sign16(t - mirror_vars.var1[i] ^ mirror_vars.var1[i])) { + t = mirror_vars.var1[i]; + mirror_vars.var5 = 0; + mirror_vars.var7 = 0; + mirror_vars.var0 ^= 2; + } + mirror_vars.var6 = t; + t += mirror_vars.var7; + mirror_vars.var7 = t & 0xff; + if (sign16(t)) + t |= 0xff; + else + t &= ~0xff; + t = mirror_vars.var5 + swap16(t); + mirror_vars.var5 = t; + if (palette_filter_countdown >= 0x30 && !(t & ~7)) { + mirror_vars.var1[0] = -0x100; + mirror_vars.var1[1] = 0x100; + subsubmodule_index++; + t = 0; + } + mode7_hdma_table[0] = mode7_hdma_table[2] = mode7_hdma_table[4] = mode7_hdma_table[6] = t + BG2HOFS_copy2; +} + +void MirrorWarp_BuildDewavingHDMATable() { // 80ff2f + MirrorWarp_RunAnimationSubmodules(); + if (frame_counter & 1) + return; + int x = 0x1a0 / 2, y = 0x1b0 / 2; + do { + mode7_hdma_table[y] = mode7_hdma_table[y + 2] = mode7_hdma_table[y + 4] = mode7_hdma_table[y + 6] = mode7_hdma_table[x]; + x -= 8, y -= 8; + } while (y != 0); + + uint16 t = mode7_hdma_table[0xc0] | mode7_hdma_table[0xc8] | mode7_hdma_table[0xd0] | mode7_hdma_table[0xd8]; + if (t == BG2HOFS_copy2) { + HDMAEN_copy = 0; + subsubmodule_index++; + Overworld_SetFixedColAndScroll(); + if ((overworld_screen_index & 0x3f) != 0x1b) { + BG1HOFS_copy2 = BG1HOFS_copy = BG2HOFS_copy = BG2HOFS_copy2; + BG1VOFS_copy2 = BG1VOFS_copy = BG2VOFS_copy = BG2VOFS_copy2; + } + } +} + +void TakeDamageFromPit() { // 81ffd9 + link_visibility_status = 12; + submodule_index = player_is_indoors ? 20 : 42; + link_health_current -= 8; + if (link_health_current >= 0xa8) + link_health_current = 0; +} + +void Module08_OverworldLoad() { // 8283bf + kModule_PreOverworld[submodule_index](); +} + +void PreOverworld_LoadProperties() { // 8283c7 + CGWSEL_copy = 0x82; + dung_unk6 = 0; + AdjustLinkBunnyStatus(); + if (main_module_index == 8) + LoadOverworldFromDungeon(); + else + LoadOverworldFromSpecialOverworld(); + Overworld_SetSongList(); + link_num_keys = 0xff; + Hud_RefillLogic(); + + uint8 sc = overworld_screen_index, dr = dungeon_room_index; + uint8 ow_anim_tiles = 0x58; + uint8 xt = 2; + + if (sc == 3 || sc == 5 || sc == 7) { + xt = 2; + } else if (sc == 0x43 || sc == 0x45 || sc == 0x47) { + xt = 9; + } else if (ow_anim_tiles = 0x5a, sc >= 0x40) { + goto dark; + } else if (dr == 0xe3 || dr == 0x18 || dr == 0x2f || dr == 0x1f && sc == 0x18) { + xt = sram_progress_indicator < 3 ? 7 : 2; + } else { + xt = savegame_has_master_sword_flags & 0x40 ? 2 : 5; + if (dr != 0 && dr != 0xe1) { +dark: + xt = 0xf3; + if (buffer_for_playing_songs == 0xf2) + goto setsong; + xt = sram_progress_indicator < 2 ? 3 : 2; + } + } + if (savegame_is_darkworld) { + xt = sc == 0x40 || sc == 0x43 || sc == 0x45 || sc == 0x47 ? 13 : 9; + if (!link_item_moon_pearl) + xt = 4; + } +setsong: + buffer_for_playing_songs = xt; + DecompressAnimatedOverworldTiles(ow_anim_tiles); + InitializeTilesets(); + OverworldLoadScreensPaletteSet(); + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + Palette_SetOwBgColor(); + if (main_module_index == 8) { + Overworld_LoadPalettesInner(); + } else { + SpecialOverworld_CopyPalettesToCache(); + } + Overworld_SetFixedColAndScroll(); + overworld_fixed_color_plusminus = 0; + Follower_Initialize(); + + if (!(BYTE(overworld_screen_index) & 0x3f)) + DecodeAnimatedSpriteTile_variable(0x1e); + saved_module_for_menu = 9; + Sprite_ReloadAll_Overworld(); + if (!(overworld_screen_index & 0x40)) + Sprite_InitializeMirrorPortal(); + sound_effect_ambient = sram_progress_indicator < 2 ? 1 : 5; + if (savegame_tagalong == 6) + savegame_tagalong = 0; + + is_standing_in_doorway = 0; + button_mask_b_y = 0; + button_b_frames = 0; + link_cant_change_direction = 0; + link_speed_setting = 0; + draw_water_ripples_or_grass = 0; + Dungeon_ResetTorchBackgroundAndPlayerInner(); + if (!link_item_moon_pearl && savegame_is_darkworld) { + link_is_bunny = link_is_bunny_mirror = 1; + link_player_handler_state = kPlayerState_PermaBunny; + LoadGearPalettes_bunny(); + } + BGMODE_copy = 9; + dung_want_lights_out = 0; + dung_hdr_collision = 0; + link_is_on_lower_level = 0; + link_is_on_lower_level_mirror = 0; + submodule_index++; + flag_update_hud_in_nmi++; + dung_savegame_state_bits = 0; + LoadOWMusicIfNeeded(); +} + +void AdjustLinkBunnyStatus() { // 82856a + if (link_item_moon_pearl) + ForceNonbunnyStatus(); +} + +void ForceNonbunnyStatus() { // 828570 + link_player_handler_state = kPlayerState_Ground; + link_timer_tempbunny = 0; + link_need_for_poof_for_transform = 0; + link_is_bunny = 0; + link_is_bunny_mirror = 0; +} + +void RecoverPositionAfterDrowning() { // 829583 + link_x_coord = link_x_coord_cached; + link_y_coord = link_y_coord_cached; + ow_scroll_vars0.ystart = room_scroll_vars_y_vofs1_cached; + ow_scroll_vars0.xstart = room_scroll_vars_y_vofs2_cached; + ow_scroll_vars1.ystart = room_scroll_vars_x_vofs1_cached; + ow_scroll_vars1.xstart = room_scroll_vars_x_vofs2_cached; + + up_down_scroll_target = up_down_scroll_target_cached; + up_down_scroll_target_end = up_down_scroll_target_end_cached; + left_right_scroll_target = left_right_scroll_target_cached; + left_right_scroll_target_end = left_right_scroll_target_end_cached; + + if (player_is_indoors) { + camera_y_coord_scroll_low = camera_y_coord_scroll_low_cached; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low + 2; + camera_x_coord_scroll_low = camera_x_coord_scroll_low_cached; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low + 2; + } + WORD(quadrant_fullsize_x) = WORD(quadrant_fullsize_x_cached); + WORD(link_quadrant_x) = WORD(link_quadrant_x_cached); + if (!player_is_indoors) { + camera_y_coord_scroll_hi = camera_y_coord_scroll_low - 2; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low - 2; + } + + link_direction_facing = link_direction_facing_cached; + link_is_on_lower_level = link_is_on_lower_level_cached; + link_is_on_lower_level_mirror = link_is_on_lower_level_mirror_cached; + is_standing_in_doorway = is_standing_in_doorway_cahed; + dung_cur_floor = dung_cur_floor_cached; + link_visibility_status = 0; + countdown_for_blink = 0x90; + Dungeon_PlayBlipAndCacheQuadrantVisits(); + link_disable_sprite_damage = 0; + Link_ResetStateAfterDamagingPit(); + tagalong_var5 = 0; + Follower_Initialize(); + dung_flag_statechange_waterpuzzle = 0; + overworld_map_state = 0; + subsubmodule_index = 0; + overworld_screen_transition = 0; + submodule_index = 0; + if (!link_health_current) { + mapbak_TM = TM_copy; + mapbak_TS = TS_copy; + saved_module_for_menu = main_module_index; + main_module_index = 18; + submodule_index = 1; + countdown_for_blink = 0; + } +} + +void Module0F_SpotlightClose() { // 829982 + static const uint8 kTab[4] = { 8, 4, 2, 1 }; + Sprite_Main(); + if (submodule_index == 0) + Dungeon_PrepExitWithSpotlight(); + else + Spotlight_ConfigureTableAndControl(); + + if (!player_is_indoors) { + if (BYTE(overworld_screen_index) == 0xf) + draw_water_ripples_or_grass = 1; + link_speed_setting = 6; + Link_HandleVelocity(); + link_x_vel = link_y_vel = 0; + } + + int i = link_direction_facing >> 1; + if (!player_is_indoors) + i = (which_entrance == 0x43) ? 1 : 0; + + link_direction = link_direction_last = kTab[i]; + Link_HandleMovingAnimation_FullLongEntry(); + LinkOam_Main(); +} + +void Dungeon_PrepExitWithSpotlight() { // 8299ca + is_nmi_thread_active = 0; + nmi_flag_update_polyhedral = 0; + if (!player_is_indoors) { + Ancilla_TerminateWaterfallSplashes(); + link_y_coord_exit = link_y_coord; + } + uint8 m = GetEntranceMusicTrack(which_entrance); + if (m != 3 || (m = sram_progress_indicator) >= 2) { + if (m != 0xf2) + m = 0xf1; + else if (music_unk1 == 0xc) + m = 7; + music_control = m; + } + hud_floor_changed_timer = 0; + Hud_FloorIndicator(); + flag_update_hud_in_nmi++; + IrisSpotlight_close(); + submodule_index++; +} + +void Spotlight_ConfigureTableAndControl() { // 829a19 + IrisSpotlight_ConfigureTable(); + is_nmi_thread_active = 0; + nmi_flag_update_polyhedral = 0; + if (submodule_index) + return; + if (main_module_index == 6) + link_y_coord = link_y_coord_exit; + OpenSpotlight_Next2(); +} + +void OpenSpotlight_Next2() { // 829a37 + if (main_module_index != 9) { + EnableForceBlank(); + Link_ItemReset_FromOverworldThings(); + } + + if (main_module_index == 9) { + if (dungeon_room_index != 0x20) + submodule_index = link_direction_facing ? 0xa : 0xb; + + ow_countdown_transition = 16; + if ((BYTE(ow_entrance_value) | BYTE(big_rock_starting_address)) && HIBYTE(big_rock_starting_address)) { // wtf + BYTE(door_open_closed_counter) = (big_rock_starting_address & 0x8000) ? 0x18 : 0; + big_rock_starting_address &= 0x7fff; + BYTE(door_animation_step_indicator) = 0; + submodule_index = 9; + subsubmodule_index = 0; + sound_effect_2 = 21; + } + } + W12SEL_copy = 0; + W34SEL_copy = 0; + WOBJSEL_copy = 0; + TMW_copy = 0; + TSW_copy = 0; + link_force_hold_sword_up = 0; + + uint8 sc = overworld_screen_index; + if (sc == 3 || sc == 5 || sc == 7) { + COLDATA_copy0 = 0x26; + COLDATA_copy1 = 0x4c; + COLDATA_copy2 = 0x8c; + } else if (sc == 0x43 || sc == 0x45 || sc == 0x47) { + COLDATA_copy0 = 0x26; + COLDATA_copy1 = 0x4a; + COLDATA_copy2 = 0x87; + } +} + +void Module10_SpotlightOpen() { // 829ad7 + Sprite_Main(); + if (submodule_index == 0) + Module10_00_OpenIris(); + else + Spotlight_ConfigureTableAndControl(); + LinkOam_Main(); +} + +void Module10_00_OpenIris() { // 829ae6 + Spotlight_open(); + submodule_index++; +} + +void SetTargetOverworldWarpToPyramid() { // 829e5f + if (main_module_index != 21) + return; + LoadOverworldFromDungeon(); + DecompressAnimatedOverworldTiles(0x5a); + ResetAncillaAndCutscene(); +} + +void ResetAncillaAndCutscene() { // 829e6e + Ancilla_TerminateSelectInteractives(0); + link_disable_sprite_damage = 0; + button_b_frames = 0; + button_mask_b_y = 0; + link_force_hold_sword_up = 0; + flag_is_link_immobilized = 0; +} + +void Module09_Overworld() { // 82a475 + kOverworldSubmodules[submodule_index](); + + int bg2x = BG2HOFS_copy2; + int bg2y = BG2VOFS_copy2; + int bg1x = BG1HOFS_copy2; + int bg1y = BG1VOFS_copy2; + + BG2HOFS_copy2 = BG2HOFS_copy = bg2x + bg1_x_offset; + BG2VOFS_copy2 = BG2VOFS_copy = bg2y + bg1_y_offset; + BG1HOFS_copy2 = BG1HOFS_copy = bg1x + bg1_x_offset; + BG1VOFS_copy2 = BG1VOFS_copy = bg1y + bg1_y_offset; + + Sprite_Main(); + + BG2HOFS_copy2 = bg2x; + BG2VOFS_copy2 = bg2y; + BG1HOFS_copy2 = bg1x; + BG1VOFS_copy2 = bg1y; + + LinkOam_Main(); + Hud_RefillLogic(); + OverworldOverlay_HandleRain(); +} + +void OverworldOverlay_HandleRain() { // 82a4cd + static const uint8 kOverworld_DrawBadWeather_X[4] = { 1, 0, 1, 0 }; + static const uint8 kOverworld_DrawBadWeather_Y[4] = { 0, 17, 0, 17 }; + if (BYTE(overworld_screen_index) != 0x70 && sram_progress_indicator >= 2 || (save_ow_event_info[0x70] & 0x20)) + return; + if (frame_counter == 3 || frame_counter == 88) { + CGADSUB_copy = 0x32; + } else if (frame_counter == 5 || frame_counter == 44 || frame_counter == 90) { + CGADSUB_copy = 0x72; + } else if (frame_counter == 36) { + sound_effect_1 = 54; + CGADSUB_copy = 0x32; + } + if (frame_counter & 3) + return; + int i = (move_overlay_ctr + 1) & 3; + move_overlay_ctr = i; + BG1HOFS_copy2 += kOverworld_DrawBadWeather_X[i] << 8; + BG1VOFS_copy2 += kOverworld_DrawBadWeather_Y[i] << 8; +} + +void Module09_00_PlayerControl() { // 82a53c + if (!(flag_custom_spell_anim_active | flag_is_link_immobilized | flag_block_link_menu | trigger_special_entrance)) { + if (filtered_joypad_H & 0x10) { + overworld_map_state = 0; + submodule_index = 1; + saved_module_for_menu = main_module_index; + main_module_index = 14; + return; + } + if (filtered_joypad_L & 0x40) { + overworld_map_state = 0; + submodule_index = 7; + saved_module_for_menu = main_module_index; + main_module_index = 14; + return; + } + if (joypad1H_last & 0x20) { + choice_in_multiselect_box_bak = choice_in_multiselect_box; + dialogue_message_index = 0x186; + int bak = main_module_index; + Main_ShowTextMessage(); + main_module_index = bak; + subsubmodule_index = 0; + submodule_index = 11; + saved_module_for_menu = main_module_index; + main_module_index = 14; + return; + } + } + if (trigger_special_entrance) + Overworld_AnimateEntrance(); + Link_Main(); + if (super_bomb_indicator_unk2 != 0xff) + Hud_SuperBombIndicator(); + current_area_of_player = (link_y_coord & 0x1e00) >> 5 | (link_x_coord & 0x1e00) >> 8; + Graphics_LoadChrHalfSlot(); + Overworld_OperateCameraScroll(); + if (main_module_index != 11) { + Overworld_UseEntrance(); + Overworld_DwDeathMountainPaletteAnimation(); + OverworldHandleTransitions(); + } else { + ScrollAndCheckForSOWExit(); + } +} + +void OverworldHandleTransitions() { // 82a9c4 + if (BYTE(overworld_screen_trans_dir_bits2)) + OverworldHandleMapScroll(); + int dir; + uint16 x, y, t; + if (link_y_vel != 0) { + dir = link_direction & 12; + t = link_y_coord - kOverworld_OffsetBaseY[BYTE(current_area_of_player) >> 1]; + if ((y = 6, x = 8, t < 4) || (y = 4, x = 4, t >= overworld_right_bottom_bound_for_scroll)) + goto compare; + } + if (link_x_vel != 0) { + dir = link_direction & 3; + t = link_x_coord - kOverworld_OffsetBaseX[BYTE(current_area_of_player) >> 1]; + if ((y = 2, x = 2, t < 6) || (y = 0, x = 1, t >= (uint16)(overworld_right_bottom_bound_for_scroll + 4))) { +compare: + if (x == dir && !Link_CheckForEdgeScreenTransition()) + goto after; + } + } + Overworld_CheckSpecialSwitchArea(); + return; +after: + y >>= 1; + Dungeon_ResetTorchBackgroundAndPlayerInner(); + map16_load_src_off &= kSwitchAreaTab0[y]; + uint16 pushed = current_area_of_player + kSwitchAreaTab3[y]; + map16_load_src_off += kSwitchAreaTab1[(y * 128 | pushed) >> 1]; + + uint8 old_screen = overworld_screen_index; + if (old_screen == 0x2a) + sound_effect_ambient = 0x80; + + uint8 new_area = kOverworldAreaHeads[pushed >> 1] | savegame_is_darkworld; + BYTE(overworld_screen_index) = new_area; + BYTE(overworld_area_index) = new_area; + if (!savegame_is_darkworld || link_item_moon_pearl) { + uint8 music = overworld_music[new_area]; + if ((music & 0xf0) == 0) + sound_effect_ambient = 5; + if ((music & 0xf) != music_unk1) + music_control = 0xf1; + } + Overworld_LoadGFXAndScreenSize(); + submodule_index = 1; + BYTE(overworld_screen_trans_dir_bits) = dir; + BYTE(overworld_screen_trans_dir_bits2) = dir; + byte_7E069C = overworld_screen_transition = DirToEnum(dir); + BYTE(ow_entrance_value) = 0; + BYTE(big_rock_starting_address) = 0; + transition_counter = 0; + + if (!(old_screen & 0x3f) || !(overworld_screen_index & 0xbf)) { + subsubmodule_index = 0; + submodule_index = 13; + MOSAIC_copy = 0; + mosaic_level = 0; + } else { + uint8 sc = overworld_screen_index; + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + Overworld_CopyPalettesToCache(); + } +} + +void Overworld_LoadGFXAndScreenSize() { // 82ab08 + int i = BYTE(overworld_screen_index); + incremental_counter_for_vram = 0; + sprite_graphics_index = overworld_sprite_gfx[i]; + aux_tile_theme_index = kOverworldAuxTileThemeIndexes[i]; + + overworld_area_is_big_backup = overworld_area_is_big; + BYTE(overworld_area_is_big) = kOverworldMapIsSmall[i & 0x3f] ? 0 : 0x20; + ((uint8 *)&overworld_right_bottom_bound_for_scroll)[1] = kOverworldMapIsSmall[i & 0x3f] ? 1 : 3; + main_tile_theme_index = overworld_screen_index & 0x40 ? 0x21 : 0x20; + misc_sprites_graphics_index = kVariousPacks[6 + (overworld_screen_index & 0x40 ? 8 : 0)]; + + int j = overworld_screen_index & 0xbf; + overworld_offset_base_y = kOverworld_OffsetBaseY[j]; + overworld_offset_base_x = kOverworld_OffsetBaseX[j] >> 3; + + int m = overworld_area_is_big ? 0x3f0 : 0x1f0; + overworld_offset_mask_y = m; + overworld_offset_mask_x = m >> 3; +} + +void ScrollAndCheckForSOWExit() { // 82ab7b + if (BYTE(overworld_screen_trans_dir_bits2)) + OverworldHandleMapScroll(); + + const uint16 *map8 = Overworld_GetMap16OfLink_Mult8(); + int a = map8[0] & 0x1ff; + for (int i = 2; i >= 0; i--) { + if (kSpecialSwitchAreaB_Map8[i] == a && kSpecialSwitchAreaB_Screen[i] == overworld_screen_index) { + link_direction = kSpecialSwitchAreaB_Direction[i]; + byte_7E069C = overworld_screen_transition = DirToEnum(link_direction); + submodule_index = 36; + subsubmodule_index = 0; + BYTE(dungeon_room_index) = 0; + break; + } + } +} + +void Module09_LoadAuxGFX() { // 82ab88 + save_ow_event_info[0x3b] &= ~0x20; + save_ow_event_info[0x7b] &= ~0x20; + save_dung_info[267] &= ~0x80; + save_dung_info[40] &= ~0x100; + LoadTransAuxGFX(); + PrepTransAuxGfx(); + nmi_disable_core_updates = nmi_subroutine_index = 9; + submodule_index++; +} + +void Overworld_FinishTransGfx() { // 82abbc + nmi_disable_core_updates = nmi_subroutine_index = 10; + submodule_index++; +} + +void Module09_LoadNewMapAndGFX() { // 82abc6 + word_7E04C8 = 0; + SomeTileMapChange(); + nmi_disable_core_updates++; + CreateInitialNewScreenMapToScroll(); + LoadNewSpriteGFXSet(); +} + +void Overworld_RunScrollTransition() { // 82abda + Link_HandleMovingAnimation_FullLongEntry(); + Graphics_IncrementalVRAMUpload(); + uint8 rv = OverworldScrollTransition(); + if (!(rv & 0xf)) { + BYTE(overworld_screen_trans_dir_bits2) = BYTE(overworld_screen_trans_dir_bits); + OverworldTransitionScrollAndLoadMap(); + BYTE(overworld_screen_trans_dir_bits2) = 0; + } +} + +void Module09_LoadNewSprites() { // 82abed + if (overworld_screen_transition == 1) { + BG2VOFS_copy2 += 2; + link_y_coord += 2; + } + Sprite_OverworldReloadAll_justLoad(); + num_memorized_tiles = 0; + if (sram_progress_indicator >= 2 && submodule_index != 18) + Overworld_SetFixedColAndScroll(); + Overworld_StartScrollTransition(); +} + +void Overworld_StartScrollTransition() { // 82ac27 + submodule_index++; + if (BYTE(overworld_screen_trans_dir_bits) >= 4) { + BYTE(overworld_screen_trans_dir_bits2) = BYTE(overworld_screen_trans_dir_bits); + OverworldTransitionScrollAndLoadMap(); + BYTE(overworld_screen_trans_dir_bits2) = 0; + } +} + +void Overworld_EaseOffScrollTransition() { // 82ac3a + if (kOverworldMapIsSmall[BYTE(overworld_screen_index)]) { + BYTE(overworld_screen_trans_dir_bits2) = BYTE(overworld_screen_trans_dir_bits); + OverworldTransitionScrollAndLoadMap(); + BYTE(overworld_screen_trans_dir_bits2) = 0; + } + if (++subsubmodule_index < 8) + return; + if ((BYTE(overworld_screen_trans_dir_bits) == 8 || BYTE(overworld_screen_trans_dir_bits) == 2) && subsubmodule_index < 9) + return; + + subsubmodule_index = 0; + BYTE(overworld_screen_trans_dir_bits) = 0; + + if (kOverworldMapIsSmall[BYTE(overworld_screen_index)]) { + map16_load_src_off = orange_blue_barrier_state; + map16_load_dst_off = word_7EC174; + map16_load_var2 = word_7EC176; + } + submodule_index++; + Follower_Disable(); +} + +void Module09_0A_WalkFromExiting_FacingDown() { // 82ac8f + link_direction_last = 4; + Link_HandleMovingAnimation_FullLongEntry(); + link_y_coord += 1; + if (--ow_countdown_transition) + return; + submodule_index = 0; + link_y_coord += 3; + link_y_vel = 3; + Overworld_OperateCameraScroll(); + if (BYTE(overworld_screen_trans_dir_bits2)) + OverworldHandleMapScroll(); +} + +void Module09_0B_WalkFromExiting_FacingUp() { // 82acc2 + Link_HandleMovingAnimation_FullLongEntry(); + link_y_coord -= 1; + if (--ow_countdown_transition) + return; + submodule_index = 0; +} + +void Module09_09_OpenBigDoorFromExiting() { // 82ad4a + if (BYTE(door_animation_step_indicator) != 3) { + Overworld_DoMapUpdate32x32_conditional(); + return; + } + ow_countdown_transition = 36; + BYTE(overworld_screen_trans_dir_bits2) = 0; + submodule_index++; +} + +void Overworld_DoMapUpdate32x32_B() { // 82ad5c + Overworld_DoMapUpdate32x32(); + BYTE(door_open_closed_counter) = 0; +} + +void Module09_0C_OpenBigDoor() { // 82ad6c + if (BYTE(door_animation_step_indicator) != 3) { + Overworld_DoMapUpdate32x32_conditional(); + return; + } + submodule_index = 0; + subsubmodule_index = 0; + BYTE(overworld_screen_trans_dir_bits2) = 0; +} + +void Overworld_DoMapUpdate32x32_conditional() { // 82ad7b + if (door_open_closed_counter & 7) + BYTE(door_open_closed_counter)++; + else + Overworld_DoMapUpdate32x32(); +} + +void Overworld_DoMapUpdate32x32() { // 82ad85 + int i = num_memorized_tiles >> 1; + int j = door_open_closed_counter >> 1; + uint16 pos, tile; + + memorized_tile_addr[i] = pos = big_rock_starting_address; + memorized_tile_value[i] = tile = kDoorAnimTiles[j + 0]; + Overworld_DrawMap16_Persist(pos, tile); + + memorized_tile_addr[i + 1] = pos = big_rock_starting_address + 2; + memorized_tile_value[i + 1] = tile = kDoorAnimTiles[j + 1]; + Overworld_DrawMap16_Persist(pos, tile); + + memorized_tile_addr[i + 2] = pos = big_rock_starting_address + 0x80; + memorized_tile_value[i + 2] = tile = kDoorAnimTiles[j + 2]; + Overworld_DrawMap16_Persist(pos, tile); + + memorized_tile_addr[i + 3] = pos = big_rock_starting_address + 0x82; + memorized_tile_value[i + 3] = tile = kDoorAnimTiles[j + 3]; + Overworld_DrawMap16_Persist(pos, tile); + vram_upload_data[vram_upload_offset >> 1] = 0xffff; + num_memorized_tiles += 8; + door_animation_step_indicator += (door_open_closed_counter == 32) ? 2 : 1; + nmi_load_bg_from_vram = 1; + BYTE(door_open_closed_counter)++; +} + +void Overworld_StartMosaicTransition() { // 82ae5e + ConditionalMosaicControl(); + switch (subsubmodule_index) { + case 0: + if (BYTE(overworld_screen_index) != 0x80) { + if ((overworld_music[BYTE(overworld_screen_index)] & 0xf) != music_unk1) + music_control = 0xf1; + } + ResetTransitionPropsAndAdvance_ResetInterface(); + break; + case 1: + ApplyPaletteFilter_bounce(); + break; + default: + INIDISP_copy = 0x80; + subsubmodule_index = 0; + if (!(overworld_screen_index & 0x3f)) + DecodeAnimatedSpriteTile_variable(0x1e); + if (BYTE(overworld_area_index) != 0 && main_module_index != 11) { + TM_copy = 0x16; + TS_copy = 1; + CGWSEL_copy = 0x82; + CGADSUB_copy = 0x20; + submodule_index++; + return; + } + if (submodule_index == 36) { + LoadOverworldFromSpecialOverworld(); + if (!(overworld_screen_index & 0x3f)) + DecodeAnimatedSpriteTile_variable(0x1e); + } + submodule_index++; + break; + } +} + +void Overworld_LoadOverlays() { // 82af0b + Sprite_InitializeSlots(); + Sprite_ReloadAll_Overworld(); + link_state_bits = 0; + link_picking_throw_state = 0; + sound_effect_ambient = 5; + Overworld_LoadOverlays2(); + +} + +void PreOverworld_LoadOverlays() { // 82af19 + sound_effect_ambient = 5; + Overworld_LoadOverlays2(); +} + +void Overworld_LoadOverlays2() { // 82af1e + uint16 xv; + + overworld_screen_index_prev = overworld_screen_index; + map16_load_src_off_prev = map16_load_src_off; + map16_load_var2_prev = map16_load_var2; + map16_load_dst_off_prev = map16_load_dst_off; + overworld_screen_transition_prev = overworld_screen_transition; + overworld_screen_trans_dir_bits_prev = overworld_screen_trans_dir_bits; + overworld_screen_trans_dir_bits2_prev = overworld_screen_trans_dir_bits2; + + overlay_index = 0; + BG1VOFS_subpixel = 0; + BG1HOFS_subpixel = 0; + + int si = overworld_screen_index; + if (si >= 0x80) { + xv = 0x97; + if (dungeon_room_index == 0x180) { + if (save_ow_event_info[0x80] & 0x40) + goto getout; // master sword retrieved? + goto load_overlay; + } + if ((xv = 0x94, dungeon_room_index == 0x181) || + (xv = 0x93, dungeon_room_index == 0x189)) + goto load_overlay; + + if (dungeon_room_index == 0x182 || dungeon_room_index == 0x183) + sound_effect_ambient = 1; // zora falls +getout: + TS_copy = 0; + submodule_index++; + return; + } + + if ((si & 0x3f) == 0) { + xv = (!(si & 0x40) && save_ow_event_info[0x80] & 0x40) ? 0x9e : 0x9d; // forest + goto load_overlay; + } + + if ((xv = 0x95, si == 0x3 || si == 0x5 || si == 0x7) || + (xv = 0x9c, si == 0x43 || si == 0x45 || si == 0x47)) + goto load_overlay; + if (si == 0x70) { + if (!(save_ow_event_info[0x70] & 0x20)) + xv = 0x9f; // rain + } else { + xv = (sram_progress_indicator < 2) ? 0x9f : 0x96; + } +load_overlay: + map16_load_src_off = 0x390; + overlay_index = overworld_screen_index = xv; + map16_load_var2 = (map16_load_src_off - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (map16_load_src_off - 0x10 & 0x3e) >> 1; + overworld_screen_transition = 0; + overworld_screen_trans_dir_bits = 0; + overworld_screen_trans_dir_bits2 = 0; + CGWSEL_copy = 0x82; + TM_copy = 0x16; + TS_copy = 1; + sound_effect_ambient = overworld_music[BYTE(overworld_screen_index)] >> 4; + + if (xv == 0x97 || xv == 0x94 || xv == 0x93 || xv == 0x9d || xv == 0x9e || xv == 0x9f) + CGADSUB_copy = 0x72; + else if (xv == 0x95 || xv == 0x9c || BYTE(overworld_screen_index_prev) == 0x5b || + BYTE(overworld_screen_index_prev) == 0x1b && (submodule_index == 35 || submodule_index == 44)) + CGADSUB_copy = 0x20; + else + TS_copy = 0, CGADSUB_copy = 0x20; + + LoadOverworldOverlay(); + if (BYTE(overlay_index) == 0x94) + BG1VOFS_copy2 |= 0x100; + + overworld_screen_index = overworld_screen_index_prev; + map16_load_src_off = map16_load_src_off_prev; + map16_load_var2 = map16_load_var2_prev; + map16_load_dst_off = map16_load_dst_off_prev; + overworld_screen_transition = overworld_screen_transition_prev; + overworld_screen_trans_dir_bits = overworld_screen_trans_dir_bits_prev; + overworld_screen_trans_dir_bits2 = overworld_screen_trans_dir_bits2_prev; +} + +void Module09_FadeBackInFromMosaic() { // 82b0d2 + Overworld_ResetMosaicDown(); + switch (subsubmodule_index) { + case 0: { + uint8 sc = overworld_screen_index; + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + OverworldMosaicTransition_LoadSpriteGraphicsAndSetMosaic(); + break; + } + case 1: + Graphics_IncrementalVRAMUpload(); + ApplyPaletteFilter_bounce(); + break; + default: + last_music_control = music_unk1; + if (BYTE(overworld_screen_index) != 0x80 && BYTE(overworld_screen_index) != 0x2a) { + uint8 m = overworld_music[BYTE(overworld_screen_index)]; + sound_effect_ambient = (m >> 4) ? (m >> 4) : 5; + if ((m & 0xf) != music_unk1) + music_control = (m & 0xf); + } + submodule_index = 8; + subsubmodule_index = 0; + if (main_module_index == 11) { + main_module_index = 9; + submodule_index = 31; + ow_countdown_transition = 12; + } + } +} + +void Overworld_Func1C() { // 82b150 + Overworld_ResetMosaicDown(); + switch (subsubmodule_index) { + case 0: + OverworldMosaicTransition_LoadSpriteGraphicsAndSetMosaic(); + break; + case 1: + Graphics_IncrementalVRAMUpload(); + ApplyPaletteFilter_bounce(); + break; + default: + if (BYTE(overworld_screen_index) < 0x80) + music_control = (overworld_screen_index & 0x3f) ? 2 : 5; + submodule_index = 8; + subsubmodule_index = 0; + break; + } +} + +void OverworldMosaicTransition_LoadSpriteGraphicsAndSetMosaic() { // 82b171 + LoadNewSpriteGFXSet(); + INIDISP_copy = 0xf; + HDMAEN_copy = 0x80; + BYTE(palette_filter_countdown) = mosaic_target_level - 1; + mosaic_target_level = 0; + BYTE(darkening_or_lightening_screen) = 2; + subsubmodule_index++; +} + +void Overworld_Func22() { // 82b1bb + if (++INIDISP_copy == 15) { + submodule_index = 0; + subsubmodule_index = 0; + } +} + +void Overworld_Func18() { // 82b1c8 + link_maybe_swim_faster = 0; + uint8 m = main_module_index; + uint8 sub = submodule_index; + Overworld_EnterSpecialArea(); + Overworld_LoadOverlays(); + submodule_index = sub + 1; + main_module_index = m; +} + +void Overworld_Func19() { // 82b1df + uint8 m = main_module_index; + uint8 sub = submodule_index; + Module08_02_LoadAndAdvance(); + submodule_index = sub + 1; + main_module_index = m; +} + +void Module09_MirrorWarp() { // 82b1fa + nmi_disable_core_updates++; + switch (subsubmodule_index) { + case 0: + if (BYTE(overworld_screen_index) >= 0x80) { + submodule_index = 0; + subsubmodule_index = 0; + overworld_map_state = 0; + return; + } + music_control = 8; + flag_overworld_area_did_change = 8; + countdown_for_blink = 0x90; + InitializeMirrorHDMA(); + savegame_is_darkworld ^= 0x40; + word_7E04C8 = 0; + BYTE(overworld_screen_index) = BYTE(overworld_area_index) = (overworld_screen_index & 0x3f) | savegame_is_darkworld; + overworld_map_state = 0; + PaletteFilter_InitializeWhiteFilter(); + Overworld_LoadGFXAndScreenSize(); + subsubmodule_index++; + break; + case 1: + subsubmodule_index++; + HDMAEN_copy = 0xc0; + case 2: + MirrorWarp_BuildWavingHDMATable(); + break; + case 3: + MirrorWarp_BuildDewavingHDMATable(); + break; + default: + MirrorWarp_FinalizeAndLoadDestination(); + break; + } +} + +void MirrorWarp_FinalizeAndLoadDestination() { // 82b260 + HdmaSetup(0, 0xf2fb, 0x41, 0, (uint8)WH0, 0); + IrisSpotlight_ResetTable(); + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + ReloadPreviouslyLoadedSheets(); + Overworld_SetSongList(); + HDMAEN_copy = 0x80; + uint8 m = overworld_music[BYTE(overworld_screen_index)]; + music_control = m & 0xf; + sound_effect_ambient = m >> 4; + if (BYTE(overworld_screen_index) >= 0x40 && !link_item_moon_pearl) + music_control = 4; + + saved_module_for_menu = submodule_index; + submodule_index = 0; + subsubmodule_index = 0; + overworld_map_state = 0; + nmi_disable_core_updates = 0; +} + +void Overworld_DrawScreenAtCurrentMirrorPosition() { // 82b2e6 + uint16 bak1 = map16_load_src_off; + uint16 bak2 = map16_load_dst_off; + uint16 bak3 = map16_load_var2; + if (kOverworldMapIsSmall[BYTE(overworld_screen_index)]) { + map16_load_src_off = 0x390; + map16_load_var2 = (0x390 - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (0x390 - 0x10 & 0x3e) >> 1; + } + Overworld_DrawQuadrantsAndOverlays(); + if (submodule_index == 44) + MirrorBonk_RecoverChangedTiles(); + map16_load_var2 = bak3; + map16_load_dst_off = bak2; + map16_load_src_off = bak1; +} + +void MirrorWarp_LoadSpritesAndColors() { // 82b334 + countdown_for_blink = 0x90; + uint16 bak1 = map16_load_src_off; + uint16 bak2 = map16_load_dst_off; + uint16 bak3 = map16_load_var2; + if (kOverworldMapIsSmall[BYTE(overworld_screen_index)]) { + map16_load_src_off = 0x390; + map16_load_var2 = (0x390 - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (0x390 - 0x10 & 0x3e) >> 1; + } + Map16ToMap8(&g_ram[0x2000], 0); + map16_load_var2 = bak3; + map16_load_dst_off = bak2; + map16_load_src_off = bak1; + OverworldLoadScreensPaletteSet(); + uint8 sc = overworld_screen_index; + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + Palette_SpecialOw(); + Overworld_SetFixedColAndScroll(); + if (BYTE(overworld_screen_index) == 0x1b || BYTE(overworld_screen_index) == 0x5b) + TS_copy = 1; + for (int i = 0; i < 16 * 6; i++) + main_palette_buffer[32 + i] = 0x7fff; + main_palette_buffer[0] = 0x7fff; + if (overworld_screen_index == 0x5b) { + main_palette_buffer[0] = 0; + main_palette_buffer[32] = 0; + } + Sprite_ResetAll(); + Sprite_ReloadAll_Overworld(); + Link_ItemReset_FromOverworldThings(); + Dungeon_ResetTorchBackgroundAndPlayerInner(); + link_player_handler_state = kPlayerState_Mirror; + if (!(overworld_screen_index & 0x40)) + Sprite_InitializeMirrorPortal(); +} + +void Overworld_Func2B() { // 82b40a + Palette_AnimGetMasterSword(); +} + +void Overworld_WeathervaneExplosion() { // 82b40e + // empty +} + +void Module09_2E_Whirlpool() { // 82b40f + // this is called when entering the whirlpool + nmi_disable_core_updates++; + switch (subsubmodule_index) { + case 0: + sound_effect_1 = 0x34; + sound_effect_ambient = 5; + overworld_map_state = 0; + palette_filter_countdown = 0; + subsubmodule_index++; + break; + case 1: + PaletteFilter_WhirlpoolBlue(); + break; + case 2: + PaletteFilter_IsolateWhirlpoolBlue(); + break; + case 3: + COLDATA_copy2 = 0x9f; + overworld_palette_aux_or_main = 0; + hud_palette = 0; + FindPartnerWhirlpoolExit(); + BYTE(dung_draw_width_indicator) = 0; + Overworld_LoadOverlays2(); + submodule_index--; + nmi_subroutine_index = 12; + flag_update_cgram_in_nmi = 0; + COLDATA_copy2 = 0x80; + INIDISP_copy = 0xf; + nmi_disable_core_updates++; + subsubmodule_index++; + break; + case 4: case 6: + nmi_subroutine_index = 13; + nmi_disable_core_updates++; + subsubmodule_index++; + break; + case 5: + Overworld_LoadOverlayAndMap(); + nmi_subroutine_index = 12; + INIDISP_copy = 0xf; + nmi_disable_core_updates++; + subsubmodule_index++; + break; + case 7: + Module09_LoadAuxGFX(); + submodule_index--; + subsubmodule_index++; + break; + case 8: + Overworld_FinishTransGfx(); + INIDISP_copy = 0xf; + nmi_disable_core_updates++; + submodule_index--; + subsubmodule_index++; + break; + case 9: { + overworld_palette_aux_or_main = 0; + Palette_Load_SpriteMain(); + Palette_Load_SpriteEnvironment(); + Palette_Load_SpritePal0Left(); + Palette_Load_HUD(); + Palette_Load_OWBGMain(); + uint8 sc = overworld_screen_index; + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + Palette_SetOwBgColor(); + Overworld_SetFixedColAndScroll(); + LoadNewSpriteGFXSet(); + COLDATA_copy2 = 0x80; + INIDISP_copy = 0xf; + nmi_disable_core_updates++; + subsubmodule_index++; + break; + } + case 10: + PaletteFilter_WhirlpoolRestoreRedGreen(); + if (BYTE(palette_filter_countdown)) + PaletteFilter_WhirlpoolRestoreRedGreen(); + break; + case 11: + Graphics_IncrementalVRAMUpload(); + PaletteFilter_WhirlpoolRestoreBlue(); + break; + case 12: + countdown_for_blink = 144; + ReloadPreviouslyLoadedSheets(); + HDMAEN_copy = 0x80; + sound_effect_ambient = overworld_music[BYTE(overworld_screen_index)] >> 4; + music_control = savegame_is_darkworld ? 9 : 2; + submodule_index = 0; + subsubmodule_index = 0; + overworld_map_state = 0; + nmi_disable_core_updates = 0; + break; + } +} + +void Overworld_Func2F() { // 82b521 + dung_bg2[0x720 / 2] = 0x212; + Overworld_Memorize_Map16_Change(0x720, 0x212); + Overworld_DrawMap16(0x720, 0x212); + nmi_load_bg_from_vram = 1; + submodule_index = 0; +} + +void Module09_2A_RecoverFromDrowning() { // 82b528 + // this is called for example when entering water without swim capability + switch (subsubmodule_index) { + case 0: Module09_2A_00_ScrollToLand(); break; + default: RecoverPositionAfterDrowning(); break; + } +} + +void Module09_2A_00_ScrollToLand() { // 82b532 + uint16 x = link_x_coord, xd = 0; + if (x != link_x_coord_cached) { + int16 d = (x > link_x_coord_cached) ? -1 : 1; + ((x += d) != link_x_coord_cached) && (x += d); + xd = x - link_x_coord; + link_x_coord = x; + } + uint16 y = link_y_coord, yd = 0; + if (y != link_y_coord_cached) { + int16 d = (y > link_y_coord_cached) ? -1 : 1; + ((y += d) != link_y_coord_cached) && (y += d); + yd = y - link_y_coord; + link_y_coord = y; + } + link_y_vel = yd; + link_x_vel = xd; + if (y == link_y_coord_cached && x == link_x_coord_cached) { + subsubmodule_index++; + link_incapacitated_timer = 0; + set_when_damaging_enemies = 0; + } + Overworld_OperateCameraScroll(); + if (BYTE(overworld_screen_trans_dir_bits2)) + OverworldHandleMapScroll(); +} + +void Overworld_OperateCameraScroll() { // 82bb90 + int z = (allow_scroll_z && link_z_coord != 0xffff) ? link_z_coord : 0; + uint16 y = link_y_coord - z + 12; + + if (link_y_vel != 0) { + int vy = sign8(link_y_vel) ? -1 : 1; + int av = sign8(link_y_vel) ? (link_y_vel ^ 0xff) + 1 : link_y_vel; + uint16 r4 = 0, subp; + do { + if (sign8(link_y_vel)) { + if (y <= camera_y_coord_scroll_low) + r4 += OverworldCameraBoundaryCheck(6, 0, vy, 0); + } else { + if (y >= camera_y_coord_scroll_hi) + r4 += OverworldCameraBoundaryCheck(6, 2, vy, 0); + } + } while (--av); + WORD(byte_7E069E[0]) = r4; + uint8 oi = BYTE(overlay_index); + if (oi != 0x97 && oi != 0x9d && r4 != 0) { + if (oi == 0xb5 || oi == 0xbe) { + subp = (r4 & 3) << 14; + r4 >>= 2; + if (r4 >= 0x3000) + r4 |= 0xf000; + } else { + subp = (r4 & 1) << 15; + r4 >>= 1; + if (r4 >= 0x7000) + r4 |= 0xf000; + } + uint32 tmp = BG1VOFS_subpixel | BG1VOFS_copy2 << 16; + tmp += subp | r4 << 16; + BG1VOFS_subpixel = (uint16)(tmp); + BG1VOFS_copy2 = (uint16)(tmp >> 16); + if ((overworld_screen_index & 0x3f) == 0x1b) { + if (BG1VOFS_copy2 <= 0x600) + BG1VOFS_copy2 = 0x600; + else if (BG1VOFS_copy2 >= 0x6c0) + BG1VOFS_copy2 = 0x6c0; + } + } + } + + uint16 x = link_x_coord + 8; + if (link_x_vel != 0) { + int vx = sign8(link_x_vel) ? -1 : 1; + int ax = sign8(link_x_vel) ? (link_x_vel ^ 0xff) + 1 : link_x_vel; + uint16 r4 = 0, subp; + do { + if (sign8(link_x_vel)) { + if (x <= camera_x_coord_scroll_low) + r4 += OverworldCameraBoundaryCheck(0, 4, vx, 4); + } else { + if (x >= camera_x_coord_scroll_hi) + r4 += OverworldCameraBoundaryCheck(0, 6, vx, 4); + } + } while (--ax); + WORD(byte_7E069E[1]) = r4; + uint8 oi = BYTE(overlay_index); + if (oi != 0x97 && oi != 0x9d && r4 != 0) { + if (oi == 0x95 || oi == 0x9e) { + subp = (r4 & 3) << 14; + r4 >>= 2; + if (r4 >= 0x3000) + r4 |= 0xf000; + } else { + subp = (r4 & 1) << 15; + r4 >>= 1; + if (r4 >= 0x7000) + r4 |= 0xf000; + } + uint32 tmp = BG1HOFS_subpixel | BG1HOFS_copy2 << 16; + tmp += subp | r4 << 16; + BG1HOFS_subpixel = (uint16)(tmp), BG1HOFS_copy2 = (uint16)(tmp >> 16); + } + } + if (BYTE(overworld_screen_index) != 0x47) { + if (BYTE(overlay_index) == 0x9c) { + uint32 tmp = BG1VOFS_subpixel | BG1VOFS_copy2 << 16; + tmp -= 0x2000; + BG1VOFS_subpixel = (uint16)(tmp), BG1VOFS_copy2 = (uint16)(tmp >> 16) + WORD(byte_7E069E[0]); + BG1HOFS_copy2 = BG2HOFS_copy2; + } else if (BYTE(overlay_index) == 0x97 || BYTE(overlay_index) == 0x9d) { + uint32 tmp = BG1VOFS_subpixel | BG1VOFS_copy2 << 16; + tmp += 0x2000; + BG1VOFS_subpixel = (uint16)(tmp), BG1VOFS_copy2 = (uint16)(tmp >> 16); + tmp = BG1HOFS_subpixel | BG1HOFS_copy2 << 16; + tmp += 0x2000; + BG1HOFS_subpixel = (uint16)(tmp), BG1HOFS_copy2 = (uint16)(tmp >> 16); + } + } + + if (dungeon_room_index == 0x181) { + BG1VOFS_copy2 = BG2VOFS_copy2 | 0x100; + BG1HOFS_copy2 = BG2HOFS_copy2; + } +} + +int OverworldCameraBoundaryCheck(int xa, int ya, int vd, int r8) { // 82bd62 + ya >>= 1, r8 >>= 1; + + uint16 *xp = (xa ? &BG2VOFS_copy2 : &BG2HOFS_copy2); + uint16 *yp = &(&ow_scroll_vars0.ystart)[ya]; + if (*xp == *yp) { + (&overworld_unk1)[ya] = 0; + (&overworld_unk1)[ya ^ 1] = 0; + return 0; + } + *xp += vd; + + int tt = vd + (&camera_y_coord_scroll_hi)[r8]; + (&camera_y_coord_scroll_hi)[r8] = tt; + (&camera_y_coord_scroll_low)[r8] = tt + 2; + uint16 *op = (&overworld_unk1) + ya; + if (!sign16(++(*op) - 0x10)) { + (*op) -= 0x10; + overworld_screen_trans_dir_bits2 |= kOverworld_Func2_Tab[ya]; + } + (&overworld_unk1)[ya ^ 1] = -(&overworld_unk1)[ya]; + return vd; +} + +int OverworldScrollTransition() { // 82c001 + transition_counter++; + int y = overworld_screen_transition; + int d = kOverworld_Func6B_Tab1[y], rv; + if (y < 2) { + byte_7E069E[0] = d; + rv = (BG2VOFS_copy2 += d); + if (BYTE(overworld_screen_index) != 0x1b && BYTE(overworld_screen_index) != 0x5b) + BG1VOFS_copy2 = BG2VOFS_copy2; + if (transition_counter >= kOverworld_Func6B_Tab2[y]) + link_y_coord += d; + if (rv != (&up_down_scroll_target)[y]) + return rv; + if (y == 0) + BG2VOFS_copy2 -= 2; + link_y_coord &= ~7; + camera_y_coord_scroll_hi = link_y_coord + kOverworld_Func6B_Tab3[y] + 11; + camera_y_coord_scroll_low = camera_y_coord_scroll_hi + 2; + overworld_unk1 = overworld_unk1_neg = 0; + } else { + byte_7E069E[1] = d; + rv = (BG2HOFS_copy2 += d); + if (BYTE(overworld_screen_index) != 0x1b && BYTE(overworld_screen_index) != 0x5b) + BG1HOFS_copy2 = BG2HOFS_copy2; + if (transition_counter >= kOverworld_Func6B_Tab2[y]) + link_x_coord += d; + if (rv != (&up_down_scroll_target)[y]) + return rv; + link_x_coord &= ~7; + camera_x_coord_scroll_hi = link_x_coord + kOverworld_Func6B_Tab3[y] + 11; + camera_x_coord_scroll_low = camera_x_coord_scroll_hi + 2; + overworld_unk3 = overworld_unk3_neg = 0; + } + Overworld_SetCameraBoundaries(overworld_area_is_big != 0, (current_area_of_player >> 1) + kOverworld_Func6B_AreaDelta[y]); + + flag_overworld_area_did_change = 1; + submodule_index += 1; + subsubmodule_index = 0; + transition_counter = 0; + Sprite_InitializeSlots(); + return rv; +} + +void Overworld_SetCameraBoundaries(int big, int area) { // 82c0c3 + ow_scroll_vars0.ystart = kOverworld_OffsetBaseY[area]; + ow_scroll_vars0.yend = ow_scroll_vars0.ystart + kOverworld_Size1[big]; + ow_scroll_vars0.xstart = kOverworld_OffsetBaseX[area]; + ow_scroll_vars0.xend = ow_scroll_vars0.xstart + kOverworld_Size2[big]; + up_down_scroll_target = kOverworld_UpDownScrollTarget[area]; + up_down_scroll_target_end = up_down_scroll_target + kOverworld_UpDownScrollSize[big]; + left_right_scroll_target = kOverworld_LeftRightScrollTarget[area]; + left_right_scroll_target_end = left_right_scroll_target + kOverworld_LeftRightScrollSize[big]; +} + +void Overworld_FinalizeEntryOntoScreen() { // 82c242 + Link_HandleMovingAnimation_FullLongEntry(); + int d = (byte_7E069C & 1) ? 2 : -2; + if (byte_7E069C & 2) + link_x_coord = (d += link_x_coord); + else + link_y_coord = (d += link_y_coord); + if ((d & 0xfe) == kOverworld_Func8_tab[byte_7E069C]) { + submodule_index = 0; + subsubmodule_index = 0; + uint8 m = overworld_music[BYTE(overworld_screen_index)]; + sound_effect_ambient = m >> 4; + if (music_unk1 == 0xf1) + music_control = m & 0xf; + } + Overworld_OperateCameraScroll(); + if (BYTE(overworld_screen_trans_dir_bits2)) + OverworldHandleMapScroll(); +} + +void Overworld_Func1F() { // 82c2a4 + Link_HandleMovingAnimation_FullLongEntry(); + int8 vel = byte_7E069C & 1 ? 1 : -1; + if (byte_7E069C & 2) { + link_x_coord += vel; + link_x_vel = vel; + } else { + link_y_coord += vel; + link_y_vel = vel; + } + if (!--ow_countdown_transition) { + main_module_index = 9; + subsubmodule_index = submodule_index = 0; + } + Overworld_OperateCameraScroll(); +} + +void ConditionalMosaicControl() { // 82c2e4 + if (palette_filter_countdown & 1) + mosaic_level += 0x10; + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 7; +} + +void Overworld_ResetMosaic_alwaysIncrease() { // 82c2eb + mosaic_level += 0x10; + BGMODE_copy = 9; + MOSAIC_copy = mosaic_level | 7; +} + +void Overworld_SetSongList() { // 82c463 + uint8 r0 = 2, y = 0xc0; + if (sram_progress_indicator < 3) { + y = 0x80; + if (link_sword_type < 2) { + r0 = 5; + y = 0x40; + if (sram_progress_indicator < 2) + y = 0; + } + } + memcpy(overworld_music, &kOwMusicSets[y], 64); + memcpy(overworld_music + 64, kOwMusicSets2, 96); + overworld_music[128] = r0; +} + +void LoadOverworldFromDungeon() { // 82e4a3 + player_is_indoors = 0; + hdr_dungeon_dark_with_lantern = 0; + WORD(overworld_fixed_color_plusminus) = 0; + cur_palace_index_x2 = 0xff; + num_memorized_tiles = 0; + + if (dungeon_room_index != 0x104 && dungeon_room_index < 0x180 && dungeon_room_index >= 0x100) { + LoadCachedEntranceProperties(); + } else { + + int k = 79; + do k--; while (kExitDataRooms[k] != dungeon_room_index); + BG1VOFS_copy2 = BG2VOFS_copy2 = BG1VOFS_copy = BG2VOFS_copy = kExitData_ScrollY[k]; + BG1HOFS_copy2 = BG2HOFS_copy2 = BG1HOFS_copy = BG2HOFS_copy = kExitData_ScrollX[k]; + link_y_coord = kExitData_YCoord[k]; + link_x_coord = kExitData_XCoord[k]; + map16_load_src_off = kExitData_Map16LoadSrcOff[k]; + map16_load_var2 = (map16_load_src_off - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (map16_load_src_off - 0x10 & 0x3e) >> 1; + camera_y_coord_scroll_low = kExitData_CameraYScroll[k]; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low - 2; + camera_x_coord_scroll_low = kExitData_CameraXScroll[k]; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low - 2; + WORD(link_direction_facing) = 2; + ow_entrance_value = kExitData_NormalDoor[k]; + big_rock_starting_address = kExitData_FancyDoor[k]; + overworld_area_index = overworld_screen_index = kExitData_ScreenIndex[k]; + overworld_unk1 = kExitData_Unk1[k]; + overworld_unk3 = kExitData_Unk3[k]; + overworld_unk1_neg = -overworld_unk1; + overworld_unk3_neg = -overworld_unk3; + } + Overworld_LoadNewScreenProperties(); +} + +void Overworld_LoadNewScreenProperties() { // 82e58b + tilemap_location_calc_mask = ~7; + Overworld_LoadGFXAndScreenSize(); + BYTE(overworld_right_bottom_bound_for_scroll) = 0xe4; + overworld_area_is_big &= 0xff; + Overworld_SetCameraBoundaries(overworld_area_is_big != 0, overworld_screen_index & 0x3f); + link_quadrant_x = 0; + link_quadrant_y = 2; + quadrant_fullsize_x = 2; + quadrant_fullsize_y = 2; + player_oam_x_offset = player_oam_y_offset = 0x80; + link_direction_mask_a = link_direction_mask_b = 0xf; + BYTE(link_z_coord) = 0xff; + link_actual_vel_z = 0xff; +} + +void LoadCachedEntranceProperties() { // 82e5d4 + overworld_area_index = overworld_area_index_exit; + WORD(TM_copy) = WORD(TM_copy_exit); + BG2VOFS_copy2 = BG2VOFS_copy = BG1VOFS_copy2 = BG1VOFS_copy = BG2VOFS_copy2_exit; + BG2HOFS_copy2 = BG2HOFS_copy = BG1HOFS_copy2 = BG1HOFS_copy = BG2HOFS_copy2_exit; + link_x_coord = link_x_coord_exit; + link_y_coord = link_y_coord_exit; + if (dungeon_room_index < 0x124) + link_y_coord -= 0x10; + WORD(link_direction_facing) = 2; + if (ow_entrance_value == 0xffff) { + link_y_coord += 0x20; + WORD(link_direction_facing) = 0; + } + overworld_screen_index = overworld_screen_index_exit; + map16_load_src_off = map16_load_src_off_exit; + map16_load_var2 = (map16_load_src_off - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (map16_load_src_off - 0x10 & 0x3e) >> 1; + camera_y_coord_scroll_low = camera_y_coord_scroll_low_exit; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low - 2; + camera_x_coord_scroll_low = camera_x_coord_scroll_low_exit; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low - 2; + ow_scroll_vars0 = ow_scroll_vars0_exit; + up_down_scroll_target = up_down_scroll_target_exit; + up_down_scroll_target_end = up_down_scroll_target_end_exit; + left_right_scroll_target = left_right_scroll_target_exit; + left_right_scroll_target_end = left_right_scroll_target_end_exit; + overworld_unk1 = overworld_unk1_exit; + overworld_unk1_neg = overworld_unk1_neg_exit; + overworld_unk3 = overworld_unk3_exit; + overworld_unk3_neg = overworld_unk3_neg_exit; + byte_7E0AA0 = byte_7EC164; + main_tile_theme_index = main_tile_theme_index_exit; + aux_tile_theme_index = aux_tile_theme_index_exit; + sprite_graphics_index = sprite_graphics_index_exit; + +} + +void Overworld_EnterSpecialArea() { // 82e851 + num_memorized_tiles = 0; + overworld_area_index_spexit = overworld_area_index; + WORD(TM_copy_spexit) = WORD(TM_copy); + BG2VOFS_copy2_spexit = BG2VOFS_copy2; + BG2HOFS_copy2_spexit = BG2HOFS_copy2; + + link_x_coord_spexit = link_x_coord; + link_y_coord_spexit = link_y_coord; + + camera_y_coord_scroll_low_spexit = camera_y_coord_scroll_low; + camera_x_coord_scroll_low_spexit = camera_x_coord_scroll_low; + overworld_screen_index_spexit = overworld_screen_index; + map16_load_src_off_spexit = map16_load_src_off; + room_scroll_vars0_ystart_spexit = ow_scroll_vars0.ystart; + room_scroll_vars0_yend_spexit = ow_scroll_vars0.yend; + room_scroll_vars0_xstart_spexit = ow_scroll_vars0.xstart; + room_scroll_vars0_xend_spexit = ow_scroll_vars0.xend; + + up_down_scroll_target_spexit = up_down_scroll_target; + up_down_scroll_target_end_spexit = up_down_scroll_target_end; + left_right_scroll_target_spexit = left_right_scroll_target; + left_right_scroll_target_end_spexit = left_right_scroll_target_end; + overworld_unk1_spexit = overworld_unk1; + overworld_unk1_neg_spexit = overworld_unk1_neg; + overworld_unk3_spexit = overworld_unk3; + overworld_unk3_neg_spexit = overworld_unk3_neg; + byte_7EC124 = byte_7E0AA0; + main_tile_theme_index_spexit = main_tile_theme_index; + aux_tile_theme_index_spexit = aux_tile_theme_index; + sprite_graphics_index_spexit = sprite_graphics_index; + LoadOverworldFromDungeon(); + if (dungeon_room_index == 0x1010) + dungeon_room_index = 0x182; + + uint8 roombak = dungeon_room_index; + int i = (BYTE(dungeon_room_index) -= 0x80); + link_direction_facing = kSpExit_Dir[i]; + incremental_counter_for_vram = 0; + sprite_graphics_index = kSpExit_SprGfx[i]; + aux_tile_theme_index = kSpExit_AuxGfx[i]; + Overworld_LoadPalettes(kSpExit_PalBg[i], kSpExit_PalSpr[i]); + + int j = dungeon_room_index & 0x3f; + overworld_offset_base_y = kSpExit_Top[j]; + overworld_offset_base_x = kSpExit_LeftEdgeOfMap[j] >> 3; + overworld_offset_mask_y = 0x3f0; + overworld_offset_mask_x = 0x3f0 >> 3; + + int k = dungeon_room_index & 0x7f; + ow_scroll_vars0.ystart = kSpExit_Top[k]; + ow_scroll_vars0.yend = kSpExit_Bottom[k]; + ow_scroll_vars0.xstart = kSpExit_Left[k]; + ow_scroll_vars0.xend = kSpExit_Right[k]; + up_down_scroll_target = kSpExit_Tab4[k]; + up_down_scroll_target_end = kSpExit_Tab5[k]; + left_right_scroll_target = kSpExit_Tab6[k]; + left_right_scroll_target_end = kSpExit_Tab7[k]; + + BYTE(dungeon_room_index) = roombak; + Palette_SpecialOw(); +} + +void LoadOverworldFromSpecialOverworld() { // 82e9bc + num_memorized_tiles = 0; + overworld_area_index = overworld_area_index_spexit; + WORD(TM_copy) = WORD(TM_copy_spexit); + BG2VOFS_copy2 = BG2VOFS_copy = BG1VOFS_copy2 = BG1VOFS_copy = BG2VOFS_copy2_spexit; + BG2HOFS_copy2 = BG2HOFS_copy = BG1HOFS_copy2 = BG1HOFS_copy = BG2HOFS_copy2_spexit; + link_x_coord = link_x_coord_spexit; + link_y_coord = link_y_coord_spexit; + overworld_screen_index = overworld_screen_index_spexit; + map16_load_src_off = map16_load_src_off_spexit; + map16_load_var2 = (map16_load_src_off - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (map16_load_src_off - 0x10 & 0x3e) >> 1; + camera_y_coord_scroll_low = camera_y_coord_scroll_low_spexit; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low - 2; + camera_x_coord_scroll_low = camera_x_coord_scroll_low_spexit; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low - 2; + ow_scroll_vars0.ystart = room_scroll_vars0_ystart_spexit; + ow_scroll_vars0.yend = room_scroll_vars0_yend_spexit; + ow_scroll_vars0.xstart = room_scroll_vars0_xstart_spexit; + ow_scroll_vars0.xend = room_scroll_vars0_xend_spexit; + up_down_scroll_target = up_down_scroll_target_spexit; + up_down_scroll_target_end = up_down_scroll_target_end_spexit; + left_right_scroll_target = left_right_scroll_target_spexit; + left_right_scroll_target_end = left_right_scroll_target_end_spexit; + overworld_unk1 = overworld_unk1_spexit; + overworld_unk1_neg = overworld_unk1_neg_spexit; + overworld_unk3 = overworld_unk3_spexit; + overworld_unk3_neg = overworld_unk3_neg_spexit; + byte_7E0AA0 = byte_7EC124; + main_tile_theme_index = main_tile_theme_index_spexit; + aux_tile_theme_index = aux_tile_theme_index_spexit; + sprite_graphics_index = sprite_graphics_index_spexit; + uint8 sc = overworld_screen_index; + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + Palette_SpecialOw(); + link_quadrant_x = 0; + link_quadrant_y = 2; + quadrant_fullsize_x = 2; + quadrant_fullsize_y = 2; + player_oam_x_offset = player_oam_y_offset = 0x80; + link_direction_mask_a = link_direction_mask_b = 0xf; + BYTE(link_z_coord) = 0xff; + link_actual_vel_z = 0xff; + Link_ResetSwimmingState(); + Overworld_LoadGFXAndScreenSize(); + BYTE(overworld_right_bottom_bound_for_scroll) = 228; + overworld_area_is_big &= 0xff; +} + +void FluteMenu_LoadTransport() { // 82ec39 + num_memorized_tiles = 0; + int k = birdtravel_var1[0]; + WORD(birdtravel_var1[0]) <<= 1; + Overworld_LoadBirdTravelPos(k); +} + +void Overworld_LoadBirdTravelPos(int k) { // 82ec47 + BG1VOFS_copy2 = BG2VOFS_copy2 = BG1VOFS_copy = BG2VOFS_copy = kBirdTravel_ScrollY[k]; + BG1HOFS_copy2 = BG2HOFS_copy2 = BG1HOFS_copy = BG2HOFS_copy = kBirdTravel_ScrollX[k]; + link_y_coord = kBirdTravel_LinkYCoord[k]; + link_x_coord = kBirdTravel_LinkXCoord[k]; + overworld_unk1 = kBirdTravel_Unk1[k]; + overworld_unk3 = kBirdTravel_Unk3[k]; + overworld_unk1_neg = -overworld_unk1; + overworld_unk3_neg = -overworld_unk3; + overworld_area_index = overworld_screen_index = kBirdTravel_ScreenIndex[k]; + + map16_load_src_off = kBirdTravel_Map16LoadSrcOff[k]; + map16_load_var2 = (map16_load_src_off - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (map16_load_src_off - 0x10 & 0x3e) >> 1; + camera_y_coord_scroll_low = kBirdTravel_CameraYScroll[k]; + camera_y_coord_scroll_hi = camera_y_coord_scroll_low - 2; + camera_x_coord_scroll_low = kBirdTravel_CameraXScroll[k]; + camera_x_coord_scroll_hi = camera_x_coord_scroll_low - 2; + ow_entrance_value = 0; + big_rock_starting_address = 0; + Overworld_LoadNewScreenProperties(); + Sprite_ResetAll(); + Sprite_ReloadAll_Overworld(); + is_standing_in_doorway = 0; + Dungeon_ResetTorchBackgroundAndPlayerInner(); +} + +void FluteMenu_LoadSelectedScreenPalettes() { // 82ecdd + OverworldLoadScreensPaletteSet(); + uint8 sc = overworld_screen_index; + Overworld_LoadPalettes(kOverworldBgPalettes[sc], overworld_sprite_palettes[sc]); + Palette_SetOwBgColor(); + Overworld_LoadPalettesInner(); +} + +void FindPartnerWhirlpoolExit() { // 82ed08 + int j = FindInWordArray(kWhirlpoolAreas, overworld_screen_index, countof(kWhirlpoolAreas)); + if (j >= 0) { + num_memorized_tiles = 0; + Overworld_LoadBirdTravelPos(j + 9); + } +} + +void Overworld_LoadAmbientOverlay(bool load_map_data) { // 82ed25 + uint16 bak1 = map16_load_src_off; + uint16 bak2 = map16_load_dst_off; + uint16 bak3 = map16_load_var2; + + if (kOverworldMapIsSmall[BYTE(overworld_screen_index)]) { + map16_load_src_off = 0x390; + map16_load_var2 = (0x390 - 0x400 & 0xf80) >> 7; + map16_load_dst_off = (0x390 - 0x10 & 0x3e) >> 1; + } + + if (load_map_data) + Overworld_DrawQuadrantsAndOverlays(); + + Map16ToMap8(&g_ram[0x2000], 0); + map16_load_var2 = bak3; + map16_load_dst_off = bak2; + map16_load_src_off = bak1; + + nmi_subroutine_index = 4; + nmi_disable_core_updates = 4; + submodule_index++; + INIDISP_copy = 0; +} + +void Overworld_LoadAmbientOverlay() { // 82ed24 + Overworld_LoadAmbientOverlay(false); +} + +void Overworld_LoadAndBuildScreen() { // 82ed59 + Overworld_LoadAmbientOverlay(true); +} + +void Module08_02_LoadAndAdvance() { // 82edb9 + Overworld_LoadAndBuildScreen(); + main_module_index = 16; + submodule_index = 0; + subsubmodule_index = 0; +} + +void Overworld_DrawQuadrantsAndOverlays() { // 82eec5 + Overworld_DecompressAndDrawAllQuadrants(); + for (int i = 0; i < 16 * 4; i++) + dung_bg1[i] = 0xdc4; + uint16 pos = ow_entrance_value; + if (pos != 0 && pos != 0xffff) { + if (pos < 0x8000) { + dung_bg2[pos >> 1] = 0xDA4; + Overworld_Memorize_Map16_Change(pos, 0xda4); + dung_bg2[(pos + 2) >> 1] = 0xda6; + Overworld_Memorize_Map16_Change(pos + 2, 0xda6); + } else { + pos &= 0x1fff; + dung_bg2[pos >> 1] = 0xdb4; + Overworld_Memorize_Map16_Change(pos, 0xdb4); + dung_bg2[(pos + 2) >> 1] = 0xdb5; + Overworld_Memorize_Map16_Change(pos + 2, 0xdb5); + } + ow_entrance_value = 0; + } + Overworld_HandleOverlaysAndBombDoors(); +} + +void Overworld_HandleOverlaysAndBombDoors() { // 82ef29 + if (overworld_screen_index == 0x33) + dung_bg2[340] = 0x20f; + else if (overworld_screen_index == 0x2f) + dung_bg2[1497] = 0x20f; + if (BYTE(overworld_screen_index) < 0x80 && save_ow_event_info[BYTE(overworld_screen_index)] & 0x20) + Overworld_LoadEventOverlay(); + if (save_ow_event_info[BYTE(overworld_screen_index)] & 2) { + int pos = kSecondaryOverlayPerOw[overworld_screen_index] >> 1; + dung_bg2[pos + 0] = 0xdb4; + dung_bg2[pos + 1] = 0xdb5; + } +} + +void TriggerAndFinishMapLoadStripe_Y(int n) { // 82ef7a + BYTE(overworld_screen_trans_dir_bits2) = 8; + nmi_subroutine_index = 3; + uint16 *dst = uvram.t3.data; + *dst++ = 0x80; + do { + dst = BufferAndBuildMap16Stripes_Y(dst); + map16_load_src_off -= 0x80; + map16_load_var2 = (map16_load_var2 - 1) & 0x1f; + } while (--n); + *dst = 0xffff; +} + +void TriggerAndFinishMapLoadStripe_X(int n) { // 82efb3 + BYTE(overworld_screen_trans_dir_bits2) = 2; + nmi_subroutine_index = 3; + uint16 *dst = uvram.t3.data; + *dst++ = 0x8040; + do { + dst = BufferAndBuildMap16Stripes_X(dst); + map16_load_src_off -= 2; + map16_load_dst_off = (map16_load_dst_off - 1) & 0x1f; + } while (--n); + *dst = 0xffff; +} + +void SomeTileMapChange() { // 82efe8 + Overworld_DecompressAndDrawAllQuadrants(); + for (int i = 0; i < 64; i++) + dung_bg1[i] = 0xdc4; + Overworld_HandleOverlaysAndBombDoors(); + submodule_index++; +} + +void CreateInitialNewScreenMapToScroll() { // 82f031 + if (!kOverworldMapIsSmall[BYTE(overworld_screen_index)]) { + switch (BYTE(overworld_screen_trans_dir_bits2)) { + case 1: CreateInitialOWScreenView_Big_East(); break; + case 2: CreateInitialOWScreenView_Big_West(); break; + case 4: CreateInitialOWScreenView_Big_South(); break; + case 8: CreateInitialOWScreenView_Big_North(); break; + default: + assert(0); + submodule_index = 0; + } + } else { + switch (BYTE(overworld_screen_trans_dir_bits2)) { + case 1: CreateInitialOWScreenView_Small_East(); break; + case 2: CreateInitialOWScreenView_Small_West(); break; + case 4: CreateInitialOWScreenView_Small_South(); break; + case 8: CreateInitialOWScreenView_Small_North(); break; + default: + assert(0); + submodule_index = 0; + } + } +} + +void CreateInitialOWScreenView_Big_North() { // 82f06b + map16_load_src_off += 0x380; + map16_load_var2 = 31; + TriggerAndFinishMapLoadStripe_Y(7); +} + +void CreateInitialOWScreenView_Big_South() { // 82f087 + uint16 pos = map16_load_src_off; + while (pos >= 0x80) + pos -= 0x80; + map16_load_src_off = pos + 0x780; + map16_load_var2 = 7; + TriggerAndFinishMapLoadStripe_Y(8); + map16_load_var2 = (map16_load_var2 + 9) & 0x1f; + map16_load_src_off -= 0xB80; +} + +void CreateInitialOWScreenView_Big_West() { // 82f0c0 + map16_load_src_off += 14; + map16_load_dst_off = 31; + TriggerAndFinishMapLoadStripe_X(7); +} + +void CreateInitialOWScreenView_Big_East() { // 82f0dc + map16_load_src_off = map16_load_src_off - 0x60 + 0x1e; + map16_load_dst_off = 7; + TriggerAndFinishMapLoadStripe_X(8); + map16_load_dst_off = (map16_load_dst_off + 9) & 0x1f; + map16_load_src_off -= 0x2e; +} + +void CreateInitialOWScreenView_Small_North() { // 82f10f + orange_blue_barrier_state = map16_load_src_off - 0x700; + word_7EC174 = map16_load_dst_off; + word_7EC176 = 10; + map16_load_src_off = 0x1390; + map16_load_dst_off = 0; + map16_load_var2 = 31; + TriggerAndFinishMapLoadStripe_Y(7); +} + +void CreateInitialOWScreenView_Small_South() { // 82f141 + orange_blue_barrier_state = BYTE(map16_load_src_off); + word_7EC174 = map16_load_dst_off; + word_7EC176 = 24; + map16_load_src_off = 0x790; + map16_load_dst_off = 0; + map16_load_var2 = 7; + TriggerAndFinishMapLoadStripe_Y(8); + map16_load_var2 = (map16_load_var2 + 9) & 0x1f; + map16_load_src_off -= 0xB80; +} + +void CreateInitialOWScreenView_Small_West() { // 82f185 + orange_blue_barrier_state = map16_load_src_off - 0x20; + word_7EC174 = 8; + word_7EC176 = map16_load_var2; + map16_load_src_off = 0x44e; + map16_load_var2 = 0; + map16_load_dst_off = 31; + TriggerAndFinishMapLoadStripe_X(7); +} + +void CreateInitialOWScreenView_Small_East() { // 82f1b7 + orange_blue_barrier_state = map16_load_src_off - 0x60; + word_7EC174 = 0x18; + word_7EC176 = map16_load_var2; + map16_load_src_off = 0x41e; + map16_load_var2 = 0; + map16_load_dst_off = 7; + TriggerAndFinishMapLoadStripe_X(8); + map16_load_dst_off = (map16_load_dst_off + 9) & 0x1f; + map16_load_src_off -= 0x2e; +} + +void OverworldTransitionScrollAndLoadMap() { // 82f20e + uint16 *dst = uvram.t3.data; + switch (BYTE(overworld_screen_trans_dir_bits2)) { + case 1: dst = BuildFullStripeDuringTransition_East(dst); break; + case 2: dst = BuildFullStripeDuringTransition_West(dst); break; + case 4: dst = BuildFullStripeDuringTransition_South(dst); break; + case 8: dst = BuildFullStripeDuringTransition_North(dst); break; + default: + assert(0); + submodule_index = 0; + } + dst[0] = dst[1] = 0xffff; + if (dst != uvram.t3.data) + nmi_subroutine_index = 3; +} + +uint16 *BuildFullStripeDuringTransition_North(uint16 *dst) { // 82f218 + *dst++ = 0x80; + dst = BufferAndBuildMap16Stripes_Y(dst); + map16_load_src_off -= 0x80; + map16_load_var2 = (map16_load_var2 - 1) & 0x1f; + return dst; +} + +uint16 *BuildFullStripeDuringTransition_South(uint16 *dst) { // 82f238 + *dst++ = 0x80; + dst = BufferAndBuildMap16Stripes_Y(dst); + map16_load_src_off += 0x80; + map16_load_var2 = (map16_load_var2 + 1) & 0x1f; + return dst; +} + +uint16 *BuildFullStripeDuringTransition_West(uint16 *dst) { // 82f241 + *dst++ = 0x8040; + dst = BufferAndBuildMap16Stripes_X(dst); + map16_load_src_off -= 2; + map16_load_dst_off = (map16_load_dst_off - 1) & 0x1f; + return dst; +} + +uint16 *BuildFullStripeDuringTransition_East(uint16 *dst) { // 82f24a + *dst++ = 0x8040; + dst = BufferAndBuildMap16Stripes_X(dst); + map16_load_src_off += 2; + map16_load_dst_off = (map16_load_dst_off + 1) & 0x1f; + return dst; +} + +void OverworldHandleMapScroll() { // 82f273 + uint16 *dst = uvram.t3.data; + switch (BYTE(overworld_screen_trans_dir_bits2)) { + case 1: + dst = CheckForNewlyLoadedMapAreas_East(dst); + BYTE(overworld_screen_trans_dir_bits2) = 0; + break; + case 2: + dst = CheckForNewlyLoadedMapAreas_West(dst); + BYTE(overworld_screen_trans_dir_bits2) = 0; + break; + case 4: + dst = CheckForNewlyLoadedMapAreas_South(dst); + BYTE(overworld_screen_trans_dir_bits2) = 0; + break; + case 5: + case 6: + dst = CheckForNewlyLoadedMapAreas_South(dst); + BYTE(overworld_screen_trans_dir_bits2) &= 3; + break; + case 8: + dst = CheckForNewlyLoadedMapAreas_North(dst); + BYTE(overworld_screen_trans_dir_bits2) = 0; + break; + case 9: + case 10: + dst = CheckForNewlyLoadedMapAreas_North(dst); + BYTE(overworld_screen_trans_dir_bits2) &= 3; + break; + default: + assert(0); + submodule_index = 0; + } + dst[0] = dst[1] = 0xffff; + if (dst != uvram.t3.data) + nmi_subroutine_index = 3; + overworld_screen_transition = overworld_screen_trans_dir_bits2; +} + +uint16 *CheckForNewlyLoadedMapAreas_North(uint16 *dst) { // 82f2dd + if (sign16(map16_load_src_off - 0x80)) + return dst; + if (!kOverworldMapIsSmall[overworld_screen_index]) { + *dst++ = 0x80; + dst = BufferAndBuildMap16Stripes_Y(dst); + } + map16_load_src_off -= 0x80; + map16_load_var2 = (map16_load_var2 - 1) & 0x1f; + return dst; +} + +uint16 *CheckForNewlyLoadedMapAreas_South(uint16 *dst) { // 82f311 + if (map16_load_src_off >= 0x1800) + return dst; + if (!kOverworldMapIsSmall[overworld_screen_index]) { + *dst++ = 0x80; + dst = BufferAndBuildMap16Stripes_Y(dst); + } + map16_load_src_off += 0x80; + map16_load_var2 = (map16_load_var2 + 1) & 0x1f; + return dst; +} + +uint16 *CheckForNewlyLoadedMapAreas_West(uint16 *dst) { // 82f345 + uint16 pos = map16_load_src_off; + while (pos >= 0x80) + pos -= 0x80; + if (pos == 0) + return dst; + if (!kOverworldMapIsSmall[overworld_screen_index]) { + *dst++ = 0x8040; + dst = BufferAndBuildMap16Stripes_X(dst); + } + map16_load_src_off -= 2; + map16_load_dst_off = (map16_load_dst_off - 1) & 0x1f; + return dst; +} + +uint16 *CheckForNewlyLoadedMapAreas_East(uint16 *dst) { // 82f37f + uint16 pos = map16_load_src_off; + while (pos >= 0x80) + pos -= 0x80; + if (pos >= 0x60) + return dst; + if (!kOverworldMapIsSmall[overworld_screen_index]) { + *dst++ = 0x8040; + dst = BufferAndBuildMap16Stripes_X(dst); + } + map16_load_src_off += 2; + map16_load_dst_off = (map16_load_dst_off + 1) & 0x1f; + return dst; +} + +uint16 *BufferAndBuildMap16Stripes_X(uint16 *dst) { // 82f3b9 + uint16 pos = map16_load_src_off - kOverworld_DrawStrip_Tab[overworld_screen_trans_dir_bits2 >> 1 & 1]; + int d = map16_load_var2; + uint16 *tmp = dung_replacement_tile_state; + for (int i = 0; i < 32; i++) { + tmp[d] = (pos >= 0x2000) ? 0 : dung_bg2[pos >> 1]; + d = (d + 1) & 0x1f, pos += 128; + } + const uint16 *map8 = GetMap16toMap8Table(); + uint16 r0 = 0, of = map16_load_dst_off; + if (of >= 0x10) + of &= 0xf, r0 = 0x400; + r0 += of * 2; + for (int i = 0; i < 2; i++, r0 += 0x800) { + dst[0] = r0; + dst[33] = r0 + 1; + dst++; + for (int j = 0; j < 16; j++) { + int k = *tmp++; + assert(k < 0xea8); + const uint16 *s = map8 + k * 4; + dst[0] = s[0]; + dst[33] = s[1]; + dst[1] = s[2]; + dst[34] = s[3]; + dst += 2; + } + dst += 33; + } + return dst; +} + +uint16 *BufferAndBuildMap16Stripes_Y(uint16 *dst) { // 82f482 + uint16 pos = map16_load_src_off - kOverworld_DrawStrip_Tab[1 + (overworld_screen_trans_dir_bits2 >> 2 & 1)]; + int d = map16_load_dst_off; + uint16 *tmp = dung_replacement_tile_state; + for (int i = 0; i < 32; i++) { + tmp[d] = (pos >= 0x2000) ? 0 : dung_bg2[pos >> 1]; // fixed bug warning. can go negative + pos += 2; + d = (d + 1) & 0x1f; + } + const uint16 *map8 = GetMap16toMap8Table(); + uint16 r0 = 0, of = map16_load_var2; + if (of >= 0x10) + of &= 0xf, r0 = 0x800; + r0 += of * 64; + for (int i = 0; i < 2; i++, r0 += 0x400) { + *dst++ = r0; + for (int j = 0; j < 16; j++) { + int k = *tmp++; + assert(k < 0xea8); + const uint16 *s = map8 + k * 4; + dst[0] = s[0]; + dst[32] = s[2]; + dst[1] = s[1]; + dst[33] = s[3]; + dst += 2; + } + dst += 32; + } + return dst; +} + +void Overworld_DecompressAndDrawAllQuadrants() { // 82f54a + int si = overworld_screen_index; + Overworld_DecompressAndDrawOneQuadrant((uint16 *)&g_ram[0x2000], si + 0); + Overworld_DecompressAndDrawOneQuadrant((uint16 *)&g_ram[0x2040], si + 1); + Overworld_DecompressAndDrawOneQuadrant((uint16 *)&g_ram[0x3000], si + 8); + Overworld_DecompressAndDrawOneQuadrant((uint16 *)&g_ram[0x3040], si + 9); +} + +void Overworld_DecompressAndDrawOneQuadrant(uint16 *dst, int screen) { // 82f595 + int rv; + rv = Decompress_bank02(&g_ram[0x14400], kOverworld_Hibytes_Comp[screen]); + for (int i = 0; i < 256; i++) + g_ram[0x14001 + i * 2] = g_ram[0x14400 + i]; + + rv = Decompress_bank02(&g_ram[0x14400], kOverworld_Lobytes_Comp[screen]); + for (int i = 0; i < 256; i++) + g_ram[0x14000 + i * 2] = g_ram[0x14400 + i]; + + map16_decode_last = 0xffff; + + uint16 *src = (uint16 *)&g_ram[0x14000]; + for (int j = 0; j < 16; j++) { + for (int i = 0; i < 16; i++) { + Overworld_ParseMap32Definition(dst, *src++ * 2); + dst += 2; + } + dst += 96; + } +} + +void Overworld_ParseMap32Definition(uint16 *dst, uint16 input) { // 82f691 + uint16 a = input & ~7; + if (a != map16_decode_last) { + map16_decode_last = a; + map16_decode_tmp = a >> 1; + int x = (a >> 1) + (a >> 2); + const uint8 *ov; + ov = kMap32ToMap16_0 + x; + map16_decode_0[0] = ov[0]; + map16_decode_0[2] = ov[1]; + map16_decode_0[4] = ov[2]; + map16_decode_0[6] = ov[3]; + map16_decode_0[1] = ov[4] >> 4; + map16_decode_0[3] = ov[4] & 0xf; + map16_decode_0[5] = ov[5] >> 4; + map16_decode_0[7] = ov[5] & 0xf; + ov = kMap32ToMap16_1 + x; + map16_decode_1[0] = ov[0]; + map16_decode_1[2] = ov[1]; + map16_decode_1[4] = ov[2]; + map16_decode_1[6] = ov[3]; + map16_decode_1[1] = ov[4] >> 4; + map16_decode_1[3] = ov[4] & 0xf; + map16_decode_1[5] = ov[5] >> 4; + map16_decode_1[7] = ov[5] & 0xf; + ov = kMap32ToMap16_2 + x; + map16_decode_2[0] = ov[0]; + map16_decode_2[2] = ov[1]; + map16_decode_2[4] = ov[2]; + map16_decode_2[6] = ov[3]; + map16_decode_2[1] = ov[4] >> 4; + map16_decode_2[3] = ov[4] & 0xf; + map16_decode_2[5] = ov[5] >> 4; + map16_decode_2[7] = ov[5] & 0xf; + ov = kMap32ToMap16_3 + x; + map16_decode_3[0] = ov[0]; + map16_decode_3[2] = ov[1]; + map16_decode_3[4] = ov[2]; + map16_decode_3[6] = ov[3]; + map16_decode_3[1] = ov[4] >> 4; + map16_decode_3[3] = ov[4] & 0xf; + map16_decode_3[5] = ov[5] >> 4; + map16_decode_3[7] = ov[5] & 0xf; + } + dst[0] = WORD(map16_decode_0[input & 7]); + dst[64] = WORD(map16_decode_2[input & 7]); + dst[1] = WORD(map16_decode_1[input & 7]); + dst[65] = WORD(map16_decode_3[input & 7]); +} + +void OverworldLoad_LoadSubOverlayMap32() { // 82f7cb + int si = overworld_screen_index; + Overworld_DecompressAndDrawOneQuadrant((uint16 *)&g_ram[0x4000], si); +} + +void LoadOverworldOverlay() { // 82fd0d + OverworldLoad_LoadSubOverlayMap32(); + Map16ToMap8(&g_ram[0x4000], 0x1000); + nmi_subroutine_index = nmi_disable_core_updates = 4; + submodule_index++; +} + +void Map16ToMap8(const uint8 *src, int r20) { // 82fd46 + map16_load_src_off += 0x1000; + int n = 32; + int r14 = 0; + uint16 *r10 = &word_7F4000; + do { + OverworldCopyMap16ToBuffer(src, r20, r14, r10); + r14 += 0x100, r10 += 2; + map16_load_src_off -= 0x80; + map16_load_var2 = (map16_load_var2 - 1) & 0x1f; + } while (--n); +} + +void OverworldCopyMap16ToBuffer(const uint8 *src, uint16 r20, int r14, uint16 *r10) { // 82fd87 + const uint16 *map8 = GetMap16toMap8Table(); + + int yr = map16_load_src_off - 0x410 & 0x1fff; + int xr = map16_load_dst_off; + uint16 *tmp = (uint16 *)(g_ram + 0x500); + int n = 32; + do { + WORD(tmp[xr]) = WORD(src[yr]); + xr = (xr + 1) & 0x1f; + yr = (yr + 2) & 0x1fff; + } while (--n); + + uint16 r0 = 0, of = map16_load_var2; + if (of >= 0x10) + of &= 0xf, r0 = 0x800; + r0 += of * 64; + + for (int i = 0; i < 2; i++, r0 += 0x400, r14 += 0x40) { + *r10++ = r0 | r20; + for (int j = 0; j < 16; j++, r14 += 4) { + const uint16 *m = map8 + 4 * *tmp++; + WORD(dung_bg2_attr_table[r14]) = WORD(m[0]); + WORD(dung_bg2_attr_table[r14 + 64]) = WORD(m[2]); + WORD(dung_bg2_attr_table[r14 + 2]) = WORD(m[1]); + WORD(dung_bg2_attr_table[r14 + 66]) = WORD(m[3]); + } + } + +} + +void MirrorBonk_RecoverChangedTiles() { // 82fe47 + for (int i = 0, i_end = num_memorized_tiles >> 1; i != i_end; i++) { + uint16 pos = memorized_tile_addr[i]; + dung_bg2[pos >> 1] = memorized_tile_value[i]; + } +} + +void DecompressEnemyDamageSubclasses() { // 82fe71 + uint8 *tmp = &g_ram[0x14000]; + memcpy(tmp, kEnemyDamageData, sizeof(kEnemyDamageData)); + for (int i = 0; i < 0x1000; i += 2) { + uint8 t = *tmp++; + enemy_damage_data[i + 0] = t >> 4; + enemy_damage_data[i + 1] = t & 0xf; + } +} + +int Decompress_bank02(uint8 *dst, const uint8 *src) { // 82febb + uint8 *dst_org = dst; + int len; + for (;;) { + uint8 cmd = *src++; + if (cmd == 0xff) + return dst - dst_org; + if ((cmd & 0xe0) != 0xe0) { + len = (cmd & 0x1f) + 1; + cmd &= 0xe0; + } else { + len = *src++; + len += ((cmd & 3) << 8) + 1; + cmd = (cmd << 3) & 0xe0; + } + //printf("%d: %d,%d\n", (int)(dst - dst_org), cmd, len); + if (cmd == 0) { + do { + *dst++ = *src++; + } while (--len); + } else if (cmd & 0x80) { + uint32 offs = *src++ << 8; + offs |= *src++; + do { + *dst++ = dst_org[offs++]; + } while (--len); + } else if (!(cmd & 0x40)) { + uint8 v = *src++; + do { + *dst++ = v; + } while (--len); + } else if (!(cmd & 0x20)) { + uint8 lo = *src++; + uint8 hi = *src++; + do { + *dst++ = lo; + if (--len == 0) + break; + *dst++ = hi; + } while (--len); + } else { + // copy bytes with the byte incrementing by 1 in between + uint8 v = *src++; + do { + *dst++ = v; + } while (v++, --len); + } + } +} + +uint8 Overworld_ReadTileAttribute(uint16 x, uint16 y) { // 85faa2 + int t = ((x - overworld_offset_base_x) & overworld_offset_mask_x); + t |= ((y - overworld_offset_base_y) & overworld_offset_mask_y) << 3; + return kSomeTileAttr[dung_bg2[t >> 1]]; +} + +void Overworld_SetFixedColAndScroll() { // 8bfe70 + TS_copy = 0; + uint16 p = 0x19C6; + uint16 si = overworld_screen_index; + if (si == 0x80) { + if (dungeon_room_index == 0x181) { + TS_copy = 1; + p = si & 0x40 ? 0x2A32 : 0x2669; + } + } else if (si != 0x81) { + p = 0; + if (si != 0x5b && (si & 0xbf) != 3 && (si & 0xbf) != 5 && (si & 0xbf) != 7) + p = si & 0x40 ? 0x2A32 : 0x2669; + } + main_palette_buffer[0] = p; + aux_palette_buffer[0] = p; + main_palette_buffer[32] = p; + aux_palette_buffer[32] = p; + + COLDATA_copy0 = 0x20; + COLDATA_copy1 = 0x40; + COLDATA_copy2 = 0x80; + + uint32 cv; + + if (si != 0 && si != 0x40 && si != 0x5b) { + if (si == 0x70) + goto getout; + cv = 0x8c4c26; + if (si != 3 && si != 5 && si != 7) { + cv = 0x874a26; + if (si != 0x43 && si != 0x45) { + flag_update_cgram_in_nmi += 1; + return; + } + } + COLDATA_copy0 = (uint8)(cv); + COLDATA_copy1 = (uint8)(cv >> 8); + COLDATA_copy2 = (uint8)(cv >> 16); + } + + if (submodule_index != 4) { + BG1VOFS_copy2 = BG2VOFS_copy2; + BG1HOFS_copy2 = BG2HOFS_copy2; + if ((si & 0x3f) == 0x1b) { + int16 y = (int16)(BG2HOFS_copy2 - 0x778) >> 1; + BG1HOFS_copy2 = BG2HOFS_copy2 - y; + uint16 a = BG1VOFS_copy2; + if (a >= 0x6C0) { + a = (a - 0x600) & 0x3ff; + BG1VOFS_copy2 = (a < 0x180) ? (a >> 1) | 0x600 : 0x6c0; + } else { + BG1VOFS_copy2 = (a & 0xff) >> 1 | 0x600; + } + } + } else { + if ((si & 0x3f) == 0x1b) { + BG1HOFS_copy2 = (BYTE(overworld_screen_trans_dir_bits) != 8) ? 0x838 : BG2HOFS_copy2; + BG1VOFS_copy2 = 0x6c0; + } + } +getout: + TS_copy = 1; + flag_update_cgram_in_nmi++; +} + +void Overworld_Memorize_Map16_Change(uint16 pos, uint16 value) { // 8edd40 + if (value == 0xdc5 || value == 0xdc9) + return; + + int x = num_memorized_tiles; + memorized_tile_value[x >> 1] = value; + memorized_tile_addr[x >> 1] = pos; + num_memorized_tiles = x + 2; +} + +void HandlePegPuzzles(uint16 pos) { // 8edd67 + static const uint16 kLwTurtleRockPegPositions[3] = { 0x826, 0x5a0, 0x81a }; + + if (overworld_screen_index == 7) { + if (save_ow_event_info[7] & 0x20) + return; + if (word_7E04C8 != 0xffff && kLwTurtleRockPegPositions[word_7E04C8 >> 1] == pos) { + WORD(sound_effect_1) = 0x2d00; + word_7E04C8 += 2; + if (word_7E04C8 == 6) { + WORD(sound_effect_1) = 0x1b00; + save_ow_event_info[7] |= 0x20; + submodule_index = 47; + } + } else { + WORD(sound_effect_1) = 0x3c; + word_7E04C8 = 0xffff; + } + } else if (overworld_screen_index == 98) { + if (++word_7E04C8 == 22) { + save_ow_event_info[0x62] |= 0x20; + sound_effect_2 = 27; + door_open_closed_counter = 0x50; + big_rock_starting_address = 0xd20; + Overworld_DoMapUpdate32x32_B(); + } + } + //assert(0); +} + +void GanonTowerEntrance_Func1() { // 8eddfc + if (!subsubmodule_index) { + sound_effect_1 = 0x2e; + Palette_AnimGetMasterSword2(); + } else { + PaletteFilter_BlindingWhite(); + if (darkening_or_lightening_screen == 255) { + palette_filter_countdown = 255; + subsubmodule_index++; + } else { + Palette_AnimGetMasterSword3(); + } + } +} + +void Overworld_CheckSpecialSwitchArea() { // 8ede49 + const uint16 *map8 = Overworld_GetMap16OfLink_Mult8(); + int a = map8[0] & 0x1ff; + for (int i = 3; i >= 0; i--) { + if (kSpecialSwitchArea_Map8[i] == a && kSpecialSwitchArea_Screen[i] == overworld_screen_index) { + dungeon_room_index = kSpecialSwitchArea_Exit[i]; + BYTE(overworld_screen_trans_dir_bits) = BYTE(overworld_screen_trans_dir_bits2) = link_direction = kSpecialSwitchArea_Direction[i]; + WORD(byte_7E069C) = WORD(overworld_screen_transition) = DirToEnum(link_direction); + submodule_index = 23; + main_module_index = 11; + break; + } + } +} + +const uint16 *Overworld_GetMap16OfLink_Mult8() { // 8ede9a + const uint16 *map8 = GetMap16toMap8Table(); + uint16 xc = (link_x_coord + 8) >> 3, yc = link_y_coord + 12; + uint16 pos = ((yc - overworld_offset_base_y) & overworld_offset_mask_y) * 8 + + ((xc - overworld_offset_base_x) & overworld_offset_mask_x); + return map8 + dung_bg2[pos >> 1] * 4; +} + +void Palette_AnimGetMasterSword() { // 8ef400 + if (subsubmodule_index == 0) { + Palette_AnimGetMasterSword2(); + } else { + PaletteFilter_BlindingWhite(); + if (darkening_or_lightening_screen == 0xff) { + for (int i = 0; i < 8; i++) + main_palette_buffer[0x58 + i] = aux_palette_buffer[0x58 + i] = 0; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 0; + submodule_index = 0; + } else { + Palette_AnimGetMasterSword3(); + } + } +} + +void Palette_AnimGetMasterSword2() { // 8ef404 + memcpy(mapbak_palette, aux_palette_buffer, 512); + for (int i = 0; i < 256; i++) + aux_palette_buffer[i] = 0x7fff; + main_palette_buffer[32] = main_palette_buffer[0]; + palette_filter_countdown = 0; + darkening_or_lightening_screen = 2; + subsubmodule_index++; +} + +void Palette_AnimGetMasterSword3() { // 8ef48c + if (darkening_or_lightening_screen != 0 || palette_filter_countdown != 31) + return; + memcpy(aux_palette_buffer, mapbak_palette, 512); + TS_copy = 0; +} + +void Overworld_DwDeathMountainPaletteAnimation() { // 8ef582 + if (trigger_special_entrance) + return; + uint8 sc = overworld_screen_index; + if (sc != 0x43 && sc != 0x45 && sc != 0x47) + return; + uint8 fc = frame_counter; + if (fc == 5 || fc == 44 || fc == 90) { + for (int i = 1; i < 8; i++) { + main_palette_buffer[0x30 + i] = aux_palette_buffer[0x30 + i]; + main_palette_buffer[0x38 + i] = aux_palette_buffer[0x38 + i]; + main_palette_buffer[0x48 + i] = aux_palette_buffer[0x48 + i]; + main_palette_buffer[0x70 + i] = aux_palette_buffer[0x70 + i]; + main_palette_buffer[0x78 + i] = aux_palette_buffer[0x78 + i]; + } + } else if (fc == 3 || fc == 36 || fc == 88) { + if (fc == 36) + sound_effect_1 = 54; + for (int i = 1; i < 8; i++) { + main_palette_buffer[0x30 + i] = kDwPaletteAnim[i - 1 + 0]; + main_palette_buffer[0x38 + i] = kDwPaletteAnim[i - 1 + 7]; + main_palette_buffer[0x48 + i] = kDwPaletteAnim[i - 1 + 14]; + main_palette_buffer[0x70 + i] = kDwPaletteAnim[i - 1 + 21]; + main_palette_buffer[0x78 + i] = kDwPaletteAnim[i - 1 + 28]; + } + } + flag_update_cgram_in_nmi++; + int yy = 32; + if (sc == 0x43 || sc == 0x45) { + if (save_ow_event_info[0x43] & 0x20) + return; + yy = (frame_counter & 0xc) * 2; + } + for (int i = 0; i < 8; i++) + main_palette_buffer[0x68 + i] = kDwPaletteAnim2[yy + i]; +} + +void Overworld_LoadEventOverlay() { // 8ef652 + int x; + uint16 *dst = dung_bg2; + switch (overworld_screen_index) { + case 0: case 1: case 2: + dst[XY(11, 16)] = 0xe32; + dst[XY(12, 16)] = 0xe32; + dst[XY(13, 16)] = 0xe32; + dst[XY(14, 16)] = 0xe32; + dst[XY(11, 17)] = 0xe32; + dst[XY(14, 17)] = 0xe32; + dst[XY(12, 17)] = 0xe33; + dst[XY(13, 17)] = 0xe34; + dst[XY(11, 18)] = 0xe35; + dst[XY(12, 18)] = 0xe36; + dst[XY(13, 18)] = 0xe37; + dst[XY(14, 18)] = 0xe38; + dst[XY(11, 19)] = 0xe39; + dst[XY(12, 19)] = 0xe3a; + dst[XY(13, 19)] = 0xe3b; + dst[XY(14, 19)] = 0xe3c; + dst[XY(12, 20)] = 0xe3d; + dst[XY(13, 20)] = 0xe3e; + break; + case 3: case 4: case 5: case 6: case 7: + dst[XY(16, 14)] = 0x212; + break; + case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: + x = XY(3, 10); +loc_8EF7B4: + dst[x + XY(0, 0)] = 0x918; + dst[x + XY(1, 0)] = 0x919; + dst[x + XY(0, 1)] = 0x91a; + dst[x + XY(1, 1)] = 0x91b; + break; + case 20: + dst[XY(25, 10)] = 0xdd1; + dst[XY(26, 10)] = 0xdd2; + dst[XY(25, 11)] = 0xdd7; + dst[XY(26, 11)] = 0xdd8; + dst[XY(25, 12)] = 0xdd9; + dst[XY(26, 12)] = 0xdda; + break; + case 21: case 22: case 23: case 24: case 25: case 32: case 33: + dst[XY(31, 24)] = 0xe21; + dst[XY(33, 24)] = 0xe21; + dst[XY(32, 24)] = 0xe22; + dst[XY(31, 25)] = 0xe23; + dst[XY(32, 25)] = 0xe24; + dst[XY(33, 25)] = 0xe25; + break; + case 26: case 27: case 28: case 35: case 36: + dst[XY(30, 39)] = 0xdc1; + dst[XY(31, 39)] = 0xdc2; + dst[XY(30, 40)] = 0xdbe; + dst[XY(31, 40)] = 0xdbf; + dst[XY(32, 39)] = 0xdc2; + dst[XY(33, 39)] = 0xdc3; + dst[XY(32, 40)] = 0xdbf; + dst[XY(33, 40)] = 0xdc0; + break; + case 29: case 30: case 31: case 34: case 37: case 38: case 39: case 40: case 41: case 42: case 43: case 107: + x = XY(24, 6); + goto loc_8EF7B4; + case 44: case 45: case 46: case 47: case 48: case 49: case 56: case 57: + x = XY(44, 6); + goto loc_8EF7B4; + case 50: case 51: case 52: case 53: case 54: case 55: case 119: + x = XY(6, 8); + goto loc_8EF7B4; + case 58: + x = XY(15, 20); + goto loc_8EF7B4; + case 59: case 123: + dst[XY(22, 7)] = 0xddf; + dst[XY(18, 8)] = 0xddf; + dst[XY(16, 9)] = 0xddf; + dst[XY(15, 10)] = 0xddf; + dst[XY(14, 12)] = 0xddf; + dst[XY(26, 14)] = 0xddf; + dst[XY(23, 7)] = 0xde0; + dst[XY(17, 9)] = 0xde0; + dst[XY(24, 7)] = 0xde1; + dst[XY(28, 8)] = 0xde1; + dst[XY(29, 9)] = 0xde1; + dst[XY(21, 11)] = 0xde1; + dst[XY(29, 14)] = 0xde1; + dst[XY(19, 8)] = 0xde2; + dst[XY(20, 8)] = 0xde2; + dst[XY(21, 8)] = 0xde2; + dst[XY(25, 8)] = 0xde2; + dst[XY(26, 8)] = 0xde2; + dst[XY(27, 8)] = 0xde2; + dst[XY(22, 8)] = 0xde3; + dst[XY(18, 9)] = 0xde3; + dst[XY(16, 10)] = 0xde3; + dst[XY(15, 12)] = 0xde3; + dst[XY(23, 8)] = 0xde4; + dst[XY(19, 9)] = 0xde4; + dst[XY(20, 9)] = 0xde4; + dst[XY(24, 9)] = 0xde4; + dst[XY(27, 9)] = 0xde4; + dst[XY(17, 10)] = 0xde4; + dst[XY(18, 10)] = 0xde4; + dst[XY(19, 10)] = 0xde4; + dst[XY(28, 10)] = 0xde4; + dst[XY(16, 11)] = 0xde4; + dst[XY(17, 11)] = 0xde4; + dst[XY(18, 11)] = 0xde4; + dst[XY(19, 11)] = 0xde4; + dst[XY(16, 12)] = 0xde4; + dst[XY(17, 12)] = 0xde4; + dst[XY(15, 13)] = 0xde4; + dst[XY(16, 13)] = 0xde4; + dst[XY(15, 14)] = 0xde4; + dst[XY(16, 14)] = 0xde4; + dst[XY(19, 16)] = 0xde4; + dst[XY(19, 17)] = 0xde4; + dst[XY(20, 17)] = 0xde4; + dst[XY(19, 18)] = 0xde4; + dst[XY(24, 8)] = 0xde5; + dst[XY(28, 9)] = 0xde5; + dst[XY(20, 11)] = 0xde5; + dst[XY(21, 12)] = 0xde5; + dst[XY(21, 9)] = 0xde6; + dst[XY(25, 9)] = 0xde6; + dst[XY(20, 10)] = 0xde6; + dst[XY(28, 11)] = 0xde6; + dst[XY(21, 17)] = 0xde6; + dst[XY(20, 18)] = 0xde6; + dst[XY(22, 9)] = 0xde7; + dst[XY(24, 10)] = 0xde7; + dst[XY(15, 15)] = 0xde7; + dst[XY(16, 15)] = 0xde7; + dst[XY(19, 19)] = 0xde7; + dst[XY(28, 19)] = 0xde7; + dst[XY(23, 9)] = 0xde8; + dst[XY(26, 9)] = 0xde8; + dst[XY(27, 10)] = 0xde8; + dst[XY(17, 15)] = 0xde8; + dst[XY(18, 16)] = 0xde8; + dst[XY(23, 10)] = 0xde9; + dst[XY(26, 10)] = 0xde9; + dst[XY(14, 15)] = 0xde9; + dst[XY(17, 16)] = 0xde9; + dst[XY(26, 18)] = 0xde9; + dst[XY(27, 19)] = 0xde9; + dst[XY(29, 10)] = 0xdea; + dst[XY(28, 12)] = 0xdea; + dst[XY(28, 13)] = 0xdea; + dst[XY(29, 18)] = 0xdea; + dst[XY(15, 11)] = 0xdeb; + dst[XY(27, 11)] = 0xdeb; + dst[XY(27, 12)] = 0xdeb; + dst[XY(14, 13)] = 0xdeb; + dst[XY(27, 13)] = 0xdeb; + dst[XY(14, 14)] = 0xdeb; + dst[XY(18, 17)] = 0xdeb; + dst[XY(18, 18)] = 0xdeb; + dst[XY(18, 12)] = 0xdec; + dst[XY(17, 13)] = 0xdec; + dst[XY(19, 12)] = 0xded; + dst[XY(20, 12)] = 0xdee; + dst[XY(18, 13)] = 0xdef; + dst[XY(27, 15)] = 0xdef; + dst[XY(19, 13)] = 0xdf0; + dst[XY(19, 14)] = 0xdf0; + dst[XY(20, 14)] = 0xdf0; + dst[XY(21, 14)] = 0xdf0; + dst[XY(21, 15)] = 0xdf0; + dst[XY(27, 16)] = 0xdf0; + dst[XY(28, 16)] = 0xdf0; + dst[XY(20, 13)] = 0xdf1; + dst[XY(28, 15)] = 0xdf1; + dst[XY(21, 13)] = 0xdf2; + dst[XY(17, 14)] = 0xdf3; + dst[XY(18, 15)] = 0xdf3; + dst[XY(20, 16)] = 0xdf3; + dst[XY(18, 14)] = 0xdf4; + dst[XY(19, 15)] = 0xdf5; + dst[XY(20, 15)] = 0xdf6; + dst[XY(27, 17)] = 0xdf6; + dst[XY(26, 15)] = 0xdf7; + dst[XY(29, 15)] = 0xdf8; + dst[XY(21, 16)] = 0xdf9; + dst[XY(26, 16)] = 0xdfa; + dst[XY(29, 16)] = 0xdfb; + dst[XY(26, 17)] = 0xdfc; + dst[XY(28, 17)] = 0xdfd; + dst[XY(29, 17)] = 0xdfe; + dst[XY(27, 18)] = 0xdff; + dst[XY(28, 18)] = 0xe00; + dst[XY(21, 10)] = 0xe01; + dst[XY(25, 10)] = 0xe01; + dst[XY(21, 18)] = 0xe01; + dst[XY(29, 11)] = 0xe02; + dst[XY(20, 19)] = 0xe02; + dst[XY(29, 19)] = 0xe02; + dst[XY(18, 19)] = 0xe03; + dst[XY(27, 14)] = 0xe04; + dst[XY(28, 14)] = 0xe05; + break; + case 60: case 61: case 62: case 63: case 64: case 65: case 72: case 73: + dst[XY(8, 11)] = 0xe13; + dst[XY(11, 11)] = 0xe14; + dst[XY(8, 12)] = 0xe15; + dst[XY(9, 12)] = 0xe16; + dst[XY(10, 12)] = 0xe17; + dst[XY(11, 12)] = 0xe18; + dst[XY(9, 13)] = 0xe19; + dst[XY(10, 13)] = 0xe1a; + dst[XY(9, 16)] = 0xe06; + dst[XY(10, 16)] = 0xe06; + dst[XY(8, 14)] = 0xe07; + dst[XY(8, 15)] = 0xe07; + dst[XY(9, 14)] = 0xe08; + dst[XY(9, 15)] = 0xe08; + dst[XY(10, 14)] = 0xe09; + dst[XY(10, 15)] = 0xe09; + dst[XY(11, 14)] = 0xe0a; + dst[XY(11, 15)] = 0xe0a; + break; + case 66: case 67: case 68: case 75: case 76: + dst[XY(47, 8)] = 0xe96; + dst[XY(48, 8)] = 0xe97; + dst[XY(47, 9)] = 0xe9c; + dst[XY(47, 10)] = 0xe9c; + dst[XY(48, 9)] = 0xe9d; + dst[XY(48, 10)] = 0xe9d; + dst[XY(47, 11)] = 0xe9a; + dst[XY(48, 11)] = 0xe9b; + break; + case 69: case 70: case 77: case 78: + x = XY(52, 16); + goto loc_8EF7B4; + case 71: + dst[XY(15, 19)] = 0xe78; + dst[XY(16, 19)] = 0xe79; + dst[XY(17, 19)] = 0xe7a; + dst[XY(18, 19)] = 0xe7b; + dst[XY(15, 20)] = 0xe7c; + dst[XY(16, 20)] = 0xe7d; + dst[XY(17, 20)] = 0xe7e; + dst[XY(18, 20)] = 0xe7f; + dst[XY(15, 21)] = 0xe80; + dst[XY(16, 21)] = 0xe81; + dst[XY(17, 21)] = 0xe82; + dst[XY(18, 21)] = 0xe83; + dst[XY(15, 22)] = 0xe84; + dst[XY(16, 22)] = 0xe85; + dst[XY(17, 22)] = 0xe86; + dst[XY(18, 22)] = 0xe87; + break; + case 74: case 79: case 80: case 81: case 82: case 83: case 84: case 85: case 86: case 87: case 88: case 89: case 96: case 97: + dst[XY(31, 26)] = 0xe1b; + dst[XY(32, 26)] = 0xe1c; + dst[XY(31, 27)] = 0xe1d; + dst[XY(32, 27)] = 0xe1e; + dst[XY(31, 28)] = 0xe1f; + dst[XY(32, 28)] = 0xe20; + break; + case 90: case 91: case 92: case 99: case 100: + dst[XY(30, 7)] = 0xe3f; + dst[XY(31, 7)] = 0xe40; + dst[XY(32, 7)] = 0xe41; + dst[XY(30, 8)] = 0xe42; + dst[XY(31, 8)] = 0xe43; + dst[XY(32, 8)] = 0xe44; + dst[XY(30, 9)] = 0xe45; + dst[XY(31, 9)] = 0xe46; + dst[XY(32, 9)] = 0xe47; + break; + case 93: case 94: case 95: case 102: case 103: + dst[XY(51, 3)] = 0xe31; + dst[XY(53, 4)] = 0xe2d; + dst[XY(53, 5)] = 0xe2e; + dst[XY(53, 6)] = 0xe2f; + break; + case 98: + x = XY(16, 26); + goto loc_8EF7B4; + case 101: case 104: case 105: case 106: case 108: case 109: case 110: case 111: case 112: case 113: case 120: case 121: + dst[XY(17, 10)] = 0xe64; + dst[XY(18, 10)] = 0xe65; + dst[XY(19, 10)] = 0xe66; + dst[XY(20, 10)] = 0xe67; + dst[XY(17, 11)] = 0xe68; + dst[XY(18, 11)] = 0xe69; + dst[XY(19, 11)] = 0xe6a; + dst[XY(20, 11)] = 0xe6b; + dst[XY(17, 12)] = 0xe6c; + dst[XY(18, 12)] = 0xe6d; + dst[XY(19, 12)] = 0xe6e; + dst[XY(20, 12)] = 0xe6f; + dst[XY(17, 13)] = 0xe70; + dst[XY(18, 13)] = 0xe71; + dst[XY(19, 13)] = 0xe72; + dst[XY(20, 13)] = 0xe73; + dst[XY(17, 14)] = 0xe74; + dst[XY(18, 14)] = 0xe75; + dst[XY(19, 14)] = 0xe76; + dst[XY(20, 14)] = 0xe77; + break; + case 114: case 115: case 116: case 117: case 118: case 122: case 124: case 125: case 126: case 127: + assert(0); + } +} + +void Ancilla_TerminateWaterfallSplashes() { // 8ffd3c + uint8 t = BYTE(overworld_screen_index); + if (t == 0xf) { + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 0x41) + ancilla_type[i] = 0; + } + } +} + +void Overworld_GetPitDestination() { // 9bb860 + uint16 x = (link_x_coord & ~7); + uint16 y = (link_y_coord & ~7); + uint16 pos = ((y - overworld_offset_base_y) & overworld_offset_mask_y) << 3; + pos += (((x >> 3) - overworld_offset_base_x) & overworld_offset_mask_x); + + + int i = 36 / 2; + for (;;) { + if (kFallHole_Pos[i] == pos && kFallHole_Area[i] == overworld_area_index) + break; + if (--i < 0) { + savegame_is_darkworld = 0; + i = 38 / 2; + break; + } + } + which_entrance = kFallHole_Entrances[i]; + byte_7E010F = 0; +} + +void Overworld_UseEntrance() { // 9bbbf4 + uint16 xc = link_x_coord >> 3, yc = link_y_coord + 7; + uint16 pos = ((yc - overworld_offset_base_y) & overworld_offset_mask_y) * 8 + + ((xc - overworld_offset_base_x) & overworld_offset_mask_x); + + int x = dung_bg2[pos >> 1] * 4; + const uint16 *map8p = GetMap16toMap8Table(); + + if (!link_direction_facing) { + uint16 a = map8p[x + 1] & 0x41ff; + if (a == 0xe9) + goto do_draw; + + if (a == 0x149 || a == 0x169) + goto is_149_or_169; + + x = dung_bg2[(pos >> 1) + 1] * 4; + a = map8p[x] & 0x41ff; + if (a == 0x40e9) { + pos -= 2; +do_draw: + Overworld_DrawMap16_Persist(pos + 0, 0xDA4); + Overworld_DrawMap16_Persist(pos + 2, 0xDA6); + sound_effect_2 = 21; + nmi_load_bg_from_vram = 1; + return; + } + if (a == 0x4149 || a == 0x4169) { + pos -= 2; +is_149_or_169: + door_open_closed_counter = 0; + if (a & 0x20) { + // 0x169 + if ((sram_progress_indicator & 0xf) >= 3) + goto after; + door_open_closed_counter = 24; + } + big_rock_starting_address = pos - 0x80; + sound_effect_2 = 21; + subsubmodule_index = 0; + BYTE(door_animation_step_indicator) = 0; + submodule_index = 12; + return; + } + } +after: + if (!LookupInOwEntranceTab(map8p[x + 2] & 0x1ff, map8p[x + 3] & 0x1ff)) { + big_key_door_message_triggered = 0; + return; + } + + int lx = LookupInOwEntranceTab2(pos); + if (lx < 0) + return; + + if (!super_bomb_going_off && (link_pose_for_item == 1 || !CanEnterWithTagalong(kOverworld_Entrance_Id[lx] - 1))) { + if (!big_key_door_message_triggered) { + big_key_door_message_triggered = 1; + dialogue_message_index = 5; + Main_ShowTextMessage(); + } + } else { + which_entrance = kOverworld_Entrance_Id[lx]; + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + main_module_index = 15; + saved_module_for_menu = 6; + submodule_index = 0; + subsubmodule_index = 0; + } +} + +uint16 Overworld_ToolAndTileInteraction(uint16 x, uint16 y) { // 9bbd82 + word_7E04B2 = 0; + index_of_interacting_tile = 0; + uint16 pos = ((y - overworld_offset_base_y) & overworld_offset_mask_y) * 8 + + ((x - overworld_offset_base_x) & overworld_offset_mask_x); + uint16 attr = overworld_tileattr[pos >> 1], yv; + + if (!(link_item_in_hand & 2)) { + if (!(link_item_in_hand & 0x40)) { + if (attr == 0x34 || attr == 0x71 || attr == 0x35 || attr == 0x10d || + attr == 0x10f || attr == 0xe1 || attr == 0xe2 || attr == 0xda || + attr == 0xf8 || attr == 0x10e) { // shovelable + if (link_position_mode != 1) + return attr; + if (overworld_screen_index == 0x2a && pos == 0x492) + word_7E04B2 = pos; + yv = 0xdc9; + goto check_secret; + } else if (attr == 0x37e) { // isThickGrass + if (link_position_mode == 1) + return attr; + scratch_0 = x * 8 - 8; + scratch_1 = (y - 8) & ~7; + index_of_interacting_tile = 3; + yv = 0xdc5; + goto check_secret; + } + } + if ((yv = 2, attr == 0x36) || (yv = 4, attr == 0x72a)) { + // is_bush + if (link_position_mode != 1) { + scratch_0 = (x & ~1) * 8; + scratch_1 = y & ~0xf; + index_of_interacting_tile = yv; + yv = (attr == 0x72a) ? 0xdc8 : 0xdc7; +check_secret: + uint32 result; + result = Overworld_RevealSecret(pos); + if (result != 0) + yv = result; +memoize_getout: + overworld_tileattr[pos >> 1] = yv; + Overworld_Memorize_Map16_Change(pos, yv); + Overworld_DrawMap16(pos, yv); + nmi_load_bg_from_vram = 1; + } + uint16 t; + t = GetMap16toMap8Table()[attr * 4 + ((y & 8) >> 2) + (x & 1)]; + attr = kMap8DataToTileAttr[t & 0x1ff]; + if (index_of_interacting_tile) { + Sprite_SpawnImmediatelySmashedTerrain(index_of_interacting_tile, scratch_0, scratch_1); + AncillaAdd_BushPoof(scratch_0, scratch_1); + } + return attr; + } + return attr; + } else { // else_1 + if (attr == 0x21b) { + sound_effect_1 = 17; + HandlePegPuzzles(pos); + yv = 0xdcb; + goto memoize_getout; + } else { // else_3 + Overworld_PickHammerSfx(attr); + return attr; + } + } + + return 0; +} + +void Overworld_PickHammerSfx(uint16 a) { // 9bbf1e + uint16 attr = kMap8DataToTileAttr[GetMap16toMap8Table()[a * 4] & 0x1ff]; + uint8 y; + if (attr < 0x50) { + return; + } else if (attr < 0x52) { + y = 26; + } else if (attr < 0x54) { + y = 17; + } else if (attr < 0x58) { + y = 5; + } else { + return; + } + sound_effect_1 = y; +} + +uint16 Overworld_GetLinkMap16Coords(Point16U *xy) { // 9bbf64 + uint16 x = (link_x_coord + kGetBestActionToPerformOnTile_x[link_direction_facing >> 1]) & ~0xf; + uint16 y = (link_y_coord + kGetBestActionToPerformOnTile_y[link_direction_facing >> 1]) & ~0xf; + xy->x = x; + xy->y = y; + uint16 rv = ((y - overworld_offset_base_y) & overworld_offset_mask_y) << 3; + return rv + (((x >> 3) - overworld_offset_base_x) & overworld_offset_mask_x); +} + +uint8 Overworld_HandleLiftableTiles(Point16U *pt_arg) { // 9bbf9d + uint16 pos = Overworld_GetLinkMap16Coords(pt_arg); + Point16U pt = *pt_arg; + uint16 a = overworld_tileattr[pos >> 1], y; + if ((y = 0, a == 0x36d) || (y = 1, a == 0x36e) || (y = 2, a == 0x374) || (y = 3, a == 0x375) || + (y = 0, a == 0x23b) || (y = 1, a == 0x23c) || (y = 2, a == 0x23d) || (y = 3, a == 0x23e)) { + return SmashRockPile_fromLift(a, pos, y, pt); + } else if ((y = 0xdc7, a == 0x36) || (y = 0xdc8, a == 0x72a) || (y = 0xdca, a == 0x20f) || (y = 0xdca, a == 0x239) || (y = 0xdc6, a == 0x101)) { + return Overworld_LiftingSmallObj(a, pos, y, pt); + } else { + uint16 t = a * 4 + (pt.x & 8 ? 2 : 0) + (pt.y & 8 ? 1 : 0); + return kMap8DataToTileAttr[GetMap16toMap8Table()[t] & 0x1ff]; + } +} + +uint8 Overworld_LiftingSmallObj(uint16 a, uint16 pos, uint16 y, Point16U pt) { // 9bc008 + uint16 secret = Overworld_RevealSecret(pos); + if (secret != 0) + y = secret; + overworld_tileattr[pos >> 1] = y; + Overworld_Memorize_Map16_Change(pos, y); + Overworld_DrawMap16(pos, y); + nmi_load_bg_from_vram = 1; + uint16 t = a * 4 + (pt.x & 8 ? 2 : 0) + (pt.y & 8 ? 1 : 0); + return kMap8DataToTileAttr[GetMap16toMap8Table()[t] & 0x1ff]; +} + +int Overworld_SmashRockPile(bool down_one_tile, Point16U *pt) { // 9bc055 + uint16 bak = link_y_coord; + link_y_coord += down_one_tile ? 8 : 0; + uint16 pos = Overworld_GetLinkMap16Coords(pt); + link_y_coord = bak; + uint16 a = dung_bg2[pos >> 1]; + uint8 y = 0; + if ((y = 0, a == 0x226) || (y = 1, a == 0x227) || (y = 2, a == 0x228) || (y = 3, a == 0x229)) { + return SmashRockPile_fromLift(a, pos, y, *pt); + } else if (a == 0x36) { + return Overworld_LiftingSmallObj(a, pos, 0xDC7, *pt); + } else { + return -1; + } +} + +uint8 SmashRockPile_fromLift(uint16 a, uint16 pos, uint16 y, Point16U pt) { // 9bc09f + static const int8 kBigRockTab1[] = { 0, -1, -64, -65 }; + static const int8 kBigRockTabY[] = { 0, 0, -64, -64 }; + static const int8 kBigRockTabX[] = { 0, -1, 0, -1 }; + pos = 2 * ((pos >> 1) + kBigRockTab1[y]); + big_rock_starting_address = pos; + door_open_closed_counter = 40; + + *(uint16 *)&g_ram[0] = pt.y; + *(uint16 *)&g_ram[2] = pt.x; + + uint16 secret = Overworld_RevealSecret(pos); + pt.y = *(uint16 *)&g_ram[0]; + pt.x = *(uint16 *)&g_ram[2]; + + if (secret == 0xffff) { + save_ow_event_info[overworld_screen_index] |= 0x20; + sound_effect_2 = 27; + door_open_closed_counter = 80; + } + pt.x += kBigRockTabX[y] * 2; + pt.y += kBigRockTabY[y] * 2; + + Overworld_DoMapUpdate32x32_B(); // WARNING: The original destroys ram[0] and ram[2] + + uint16 t = a * 4 + (pt.x & 8 ? 2 : 0) + (pt.y & 8 ? 1 : 0); + return kMap8DataToTileAttr[GetMap16toMap8Table()[t] & 0x1ff]; +} + +void Overworld_BombTiles32x32(uint16 x, uint16 y) { // 9bc0f8 + x = (x - 23) & ~7; + y = (y - 20) & ~7; + + for (int yy = 3; yy != 0; yy--, y += 16) { + for (int xx = 3, xt = x; xx != 0; xx--, xt += 16) { + Overworld_BombTile(xt, y); + } + } + word_7E0486 = x, word_7E0488 = y; +} + +void Overworld_BombTile(int x, int y) { // 9bc155 + int a, j, k; + + int pos = ((y - overworld_offset_base_y & overworld_offset_mask_y) << 3) + + ((x >> 3) - overworld_offset_base_x & overworld_offset_mask_x); + + if (savegame_tagalong == 13) + goto label_a; + + a = dung_bg2[pos >> 1]; + + if (a == 0x36) { + k = 2, j = 0xdc7; + } else if (a == 0x72a) { + k = 4, j = 0xdc8; + } else if (a == 0x37e) { + k = 3, j = 0xdc5; + } else { + goto label_a; + } + a = Overworld_RevealSecret(pos); + if (a == 0) + a = j; + dung_bg2[pos >> 1] = a; + Overworld_Memorize_Map16_Change(pos, a); + Overworld_DrawMap16(pos, a); + + Sprite_SpawnImmediatelySmashedTerrain(k, x & ~7, y & ~7); + nmi_load_bg_from_vram = 1; + return; + +label_a: + a = Overworld_RevealSecret(pos); + if (a == 0xdb4) { + dung_bg2[pos >> 1] = a; + Overworld_Memorize_Map16_Change(pos, a); + Overworld_DrawMap16(pos, a); + + dung_bg2[(pos >> 1) + 1] = 0xDB5; + Overworld_Memorize_Map16_Change(pos, 0xDB5); // wtf + Overworld_DrawMap16(pos + 2, 0xDB5); + nmi_load_bg_from_vram = 1; + save_ow_event_info[overworld_screen_index] |= 2; + } +} + +void Overworld_AlterWeathervane() { // 9bc21d + door_open_closed_counter = 0x68; + big_rock_starting_address = 0xc3e; + Overworld_DoMapUpdate32x32_B(); + Overworld_DrawMap16_Persist(0xc42, 0xe21); + Overworld_DrawMap16_Persist(0xcc2, 0xe25); + + save_ow_event_info[0x18] |= 0x20; + nmi_load_bg_from_vram = 1; +} + +void OpenGargoylesDomain() { // 9bc264 + Overworld_DrawMap16_Persist(0xd3e, 0xe1b); + Overworld_DrawMap16_Persist(0xd40, 0xe1c); + Overworld_DrawMap16_Persist(0xdbe, 0xe1d); + Overworld_DrawMap16_Persist(0xdc0, 0xe1e); + Overworld_DrawMap16_Persist(0xe3e, 0xe1f); + Overworld_DrawMap16_Persist(0xe40, 0xe20); + save_ow_event_info[0x58] |= 0x20; + sound_effect_2 = 0x1b; + nmi_load_bg_from_vram = 1; +} + +void CreatePyramidHole() { // 9bc2a7 + Overworld_DrawMap16_Persist(0x3bc, 0xe3f); + Overworld_DrawMap16_Persist(0x3be, 0xe40); + Overworld_DrawMap16_Persist(0x3c0, 0xe41); + Overworld_DrawMap16_Persist(0x43c, 0xe42); + Overworld_DrawMap16_Persist(0x43e, 0xe43); + Overworld_DrawMap16_Persist(0x440, 0xe44); + Overworld_DrawMap16_Persist(0x4bc, 0xe45); + Overworld_DrawMap16_Persist(0x4be, 0xe46); + Overworld_DrawMap16_Persist(0x4c0, 0xe47); + WORD(sound_effect_ambient) = 0x3515; + save_ow_event_info[0x5b] |= 0x20; + sound_effect_2 = 3; + nmi_load_bg_from_vram = 1; +} + +// Strange return value in Carry/R14 +uint16 Overworld_RevealSecret(uint16 pos) { // 9bc8a4 + BYTE(dung_secrets_unk1) = 0; + + if (overworld_screen_index >= 0x80) { +fail: + AdjustSecretForPowder(); + return 0; + } + + const uint8 *ptr = kOverworldSecrets + kOverworldSecrets_Offs[overworld_screen_index]; + for (;;) { + uint16 x = *(uint16 *)ptr; + if (x == 0xffff) + goto fail; + if ((x & 0x7fff) == pos) + break; + ptr += 3; + } + uint8 data = ptr[2]; + if (data && data < 0x80) + BYTE(dung_secrets_unk1) |= data; + if (data < 0x80) { + AdjustSecretForPowder(); + return 0; // carry set + } + + BYTE(dung_secrets_unk1) = 0xff; + if (data != 0x84 && !(save_ow_event_info[overworld_screen_index] & 2)) { + if (overworld_screen_index == 0x5b && savegame_tagalong != 13) + goto fail; + sound_effect_2 = 0x1b; + } + static const uint16 kTileBelow[4] = { 0xDCC, 0x212, 0xFFFF, 0xDB4 }; + AdjustSecretForPowder(); + return kTileBelow[(data & 0xf) >> 1]; + +} + +void AdjustSecretForPowder() { // 9bc943 + if (link_item_in_hand & 0x40) + dung_secrets_unk1 = 4; +} + +void Overworld_DrawMap16_Persist(uint16 pos, uint16 value) { // 9bc97c + dung_bg2[pos >> 1] = value; + Overworld_DrawMap16(pos, value); +} + +void Overworld_DrawMap16(uint16 pos, uint16 value) { // 9bc980 + pos = Overworld_FindMap16VRAMAddress(pos); + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + const uint16 *src = GetMap16toMap8Table() + value * 4; + dst[0] = swap16(pos); + dst[1] = 0x300; + dst[2] = src[0]; + dst[3] = src[1]; + dst[4] = swap16(pos + 0x20); + dst[5] = 0x300; + dst[6] = src[2]; + dst[7] = src[3]; + dst[8] = 0xffff; + vram_upload_offset += 16; +} + +void Overworld_AlterTileHardcore(uint16 pos, uint16 value) { // 9bc9de + dung_bg2[pos >> 1] = value; + pos = Overworld_FindMap16VRAMAddress(pos); + uint16 *dst = &vram_upload_data[vram_upload_offset >> 1]; + const uint16 *src = GetMap16toMap8Table() + value * 4; + dst[0] = swap16(pos); + dst[1] = 0x300; + dst[2] = src[0]; + dst[3] = src[1]; + dst[4] = swap16(pos + 0x20); + dst[5] = 0x300; + dst[6] = src[2]; + dst[7] = src[3]; + dst[8] = 0xffff; + vram_upload_offset += 16; +} + +uint16 Overworld_FindMap16VRAMAddress(uint16 addr) { // 9bca69 + return (((addr & 0x3f) >= 0x20) ? 0x400 : 0) + (((addr & 0xfff) >= 0x800) ? 0x800 : 0) + (addr & 0x1f) + ((addr & 0x780) >> 1); +} + +void Overworld_AnimateEntrance() { // 9bcac4 + uint8 j = trigger_special_entrance; + flag_is_link_immobilized = j; + flag_unk1 = j; + nmi_disable_core_updates = j; + kOverworld_EntranceSequence[j - 1](); +} + +void Overworld_AnimateEntrance_PoD() { // 9bcade + switch (subsubmodule_index) { + case 0: + if (++overworld_entrance_sequence_counter != 0x40) + return; + OverworldEntrance_AdvanceAndBoom(); + save_ow_event_info[0x5e] |= 0x20; + Overworld_DrawMap16_Persist(0x1e6, 0xe31); + Overworld_DrawMap16_Persist(0x2ea, 0xe30); + Overworld_DrawMap16_Persist(0x26a, 0xe26); + Overworld_DrawMap16_Persist(0x2ea, 0xe27); + nmi_load_bg_from_vram = 1; + break; + case 1: + if (++overworld_entrance_sequence_counter != 0x20) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x26a, 0xe28); + Overworld_DrawMap16_Persist(0x2ea, 0xe29); + nmi_load_bg_from_vram = 1; + break; + case 2: + if (++overworld_entrance_sequence_counter != 0x20) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x26a, 0xe2a); + Overworld_DrawMap16_Persist(0x2ea, 0xe2b); + Overworld_DrawMap16_Persist(0x36a, 0xe2c); + nmi_load_bg_from_vram = 1; + break; + case 3: + if (++overworld_entrance_sequence_counter != 0x20) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x26a, 0xe2d); + Overworld_DrawMap16_Persist(0x2ea, 0xe2e); + Overworld_DrawMap16_Persist(0x36a, 0xe2f); + nmi_load_bg_from_vram = 1; + break; + case 4: + if (++overworld_entrance_sequence_counter != 0x20) + return; + OverworldEntrance_PlayJingle(); + break; + } +} + +// Dark Forest Palace +void Overworld_AnimateEntrance_Skull() { // 9bcba6 + switch (subsubmodule_index) { + case 0: + if (++overworld_entrance_sequence_counter != 4) + return; + overworld_entrance_sequence_counter = 0; + subsubmodule_index++; + Overworld_DrawMap16_Persist(0x409 * 2, 0xe06); + Overworld_DrawMap16_Persist(0x40a * 2, 0xe06); + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x20; + nmi_load_bg_from_vram = 1; + sound_effect_2 = 0x16; + break; + case 1: + if (++overworld_entrance_sequence_counter != 12) + return; + overworld_entrance_sequence_counter = 0; + subsubmodule_index++; + Overworld_DrawMap16_Persist(0x3c8 * 2, 0xe07); + Overworld_DrawMap16_Persist(0x3c9 * 2, 0xe08); + Overworld_DrawMap16_Persist(0x3ca * 2, 0xe09); + Overworld_DrawMap16_Persist(0x3cb * 2, 0xe0a); + nmi_load_bg_from_vram = 1; + sound_effect_2 = 0x16; + break; + case 2: + if (++overworld_entrance_sequence_counter != 12) + return; + overworld_entrance_sequence_counter = 0; + subsubmodule_index++; + Overworld_DrawMap16_Persist(0x388 * 2, 0xe07); + Overworld_DrawMap16_Persist(0x389 * 2, 0xe08); + Overworld_DrawMap16_Persist(0x38a * 2, 0xe09); + Overworld_DrawMap16_Persist(0x38b * 2, 0xe0a); + nmi_load_bg_from_vram = 1; + sound_effect_2 = 0x16; + break; + case 3: + if (++overworld_entrance_sequence_counter != 12) + return; + overworld_entrance_sequence_counter = 0; + subsubmodule_index++; + Overworld_DrawMap16_Persist(0x2c8 * 2, 0xe11); + Overworld_DrawMap16_Persist(0x2cb * 2, 0xe12); + Overworld_DrawMap16_Persist(0x308 * 2, 0xe0d); + Overworld_DrawMap16_Persist(0x309 * 2, 0xe0e); + Overworld_DrawMap16_Persist(0x30a * 2, 0xe0f); + Overworld_DrawMap16_Persist(0x30b * 2, 0xe10); + Overworld_DrawMap16_Persist(0x349 * 2, 0xe0b); + Overworld_DrawMap16_Persist(0x34a * 2, 0xe0c); + nmi_load_bg_from_vram = 1; + sound_effect_2 = 0x16; + break; + case 4: + if (++overworld_entrance_sequence_counter != 12) + return; + overworld_entrance_sequence_counter = 0; + subsubmodule_index++; + Overworld_DrawMap16_Persist(0x2c8 * 2, 0xe13); + Overworld_DrawMap16_Persist(0x2cb * 2, 0xe14); + Overworld_DrawMap16_Persist(0x308 * 2, 0xe15); + Overworld_DrawMap16_Persist(0x309 * 2, 0xe16); + Overworld_DrawMap16_Persist(0x30a * 2, 0xe17); + Overworld_DrawMap16_Persist(0x30b * 2, 0xe18); + Overworld_DrawMap16_Persist(0x349 * 2, 0xe19); + Overworld_DrawMap16_Persist(0x34a * 2, 0xe1a); + nmi_load_bg_from_vram = 1; + sound_effect_2 = 0x16; + OverworldEntrance_PlayJingle(); + break; + } +} + +void Overworld_AnimateEntrance_Mire() { // 9bccd4 + static const uint8 kMiseryMireEntranceBits[26] = { + 0xff, 0xf7, 0xf7, 0xfb, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x88, 0x88, 0x88, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, + }; + + int j; + if (subsubmodule_index >= 2) { + bg1_x_offset = frame_counter & 1 ? -1 : 1; + bg1_y_offset = -bg1_x_offset; + } + switch (subsubmodule_index) { + case 0: + if ((j = ++overworld_entrance_sequence_counter) < 32) + break; + j -= 32; + if (j == 207) + subsubmodule_index = 1, overworld_entrance_sequence_counter = 0; + TS_copy = (kMiseryMireEntranceBits[j >> 3] & (0x80 >> (j & 7))) != 0; + break; + case 1: case 2: + if ((j = ++overworld_entrance_sequence_counter) == 16) { + subsubmodule_index++; + sound_effect_ambient = 7; + } + if (j != 72) + break; + OverworldEntrance_AdvanceAndBoom(); + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x20; + j = 0xe48; +draw_misery_2: + Overworld_DrawMap16_Persist(0x622, j++); + Overworld_DrawMap16_Persist(0x624, j++); + Overworld_DrawMap16_Persist(0x626, j++); + Overworld_DrawMap16_Persist(0x628, j++); + Overworld_DrawMap16_Persist(0x6a2, j++); + Overworld_DrawMap16_Persist(0x6a4, j++); + Overworld_DrawMap16_Persist(0x6a6, j++); + Overworld_DrawMap16_Persist(0x6a8, j++); + Overworld_DrawMap16_Persist(0x722, j++); + Overworld_DrawMap16_Persist(0x724, j++); + Overworld_DrawMap16_Persist(0x726, j++); + Overworld_DrawMap16_Persist(0x728, j++); + nmi_load_bg_from_vram = 1; + break; + case 3: + if ((j = ++overworld_entrance_sequence_counter) != 72) + break; + OverworldEntrance_AdvanceAndBoom(); + j = 0xe54; +draw_misery_3: + Overworld_DrawMap16_Persist(0x5a2, j++); + Overworld_DrawMap16_Persist(0x5a4, j++); + Overworld_DrawMap16_Persist(0x5a6, j++); + Overworld_DrawMap16_Persist(0x5a8, j++); + goto draw_misery_2; + case 4: + if ((j = ++overworld_entrance_sequence_counter) != 80) + break; + OverworldEntrance_AdvanceAndBoom(); + j = 0xe64; + Overworld_DrawMap16_Persist(0x522, j++); + Overworld_DrawMap16_Persist(0x524, j++); + Overworld_DrawMap16_Persist(0x526, j++); + Overworld_DrawMap16_Persist(0x528, j++); + goto draw_misery_3; + case 5: + if ((j = ++overworld_entrance_sequence_counter) != 128) + break; + OverworldEntrance_PlayJingle(); + sound_effect_ambient = 5; + break; + } +} + +void Overworld_AnimateEntrance_TurtleRock() { // 9bce28 + bg1_x_offset = frame_counter & 1 ? -1 : 1; + bg1_y_offset = -bg1_x_offset; + + switch (subsubmodule_index) { + case 0: + save_ow_event_info[overworld_screen_index] |= 0x20; + Dungeon_ApproachFixedColor_variable(0); + vram_upload_data[0] = 0x10; +common: + vram_upload_data[1] = 0xfe47; + vram_upload_data[2] = 0x1e3; + BYTE(vram_upload_data[3]) = 0xff; + subsubmodule_index++; + nmi_load_bg_from_vram = 1; + break; + case 1: + vram_upload_data[0] = 0x14; + goto common; + case 2: + vram_upload_data[0] = 0x18; + goto common; + case 3: + vram_upload_data[0] = 0x1c; + goto common; + case 4: + for (int i = 0; i < 8; i++) + main_palette_buffer[0x58 + i] = aux_palette_buffer[0x68 + i] = 0; + BG1VOFS_copy2 = BG2VOFS_copy2; + BG1HOFS_copy2 = BG2HOFS_copy2; + subsubmodule_index++; + flag_update_cgram_in_nmi++; + break; + case 5: { + OverworldEntrance_DrawManyTR(); + TS_copy = 1; + CGWSEL_copy = 2; + CGADSUB_copy = 0x22; + uint16 *vram = vram_upload_data, *vram_end = vram + (vram_upload_offset >> 1); + do { + vram[0] |= 0x10; + if (vram[2] == 0x8aa) + vram[2] = 0x1e3; + if (vram[3] == 0x8aa) + vram[3] = 0x1e3; + } while ((vram += 4) != vram_end); + turtlerock_ctr = 0; + subsubmodule_index++; + break; + } + case 6: + if (!(frame_counter & 1)) { + if (!(turtlerock_ctr & 7)) { + PaletteFilter_RestoreAdditive(0xb0, 0xc0); + PaletteFilter_RestoreSubtractive(0xd0, 0xe0); + flag_update_cgram_in_nmi++; + sound_effect_2 = 2; + } + if (!--turtlerock_ctr) { + turtlerock_ctr = 0x30; + subsubmodule_index++; + } + } + break; + case 7: + if (!(frame_counter & 1) && !(turtlerock_ctr & 7)) + sound_effect_2 = 2; + if (!--turtlerock_ctr) { + OverworldEntrance_DrawManyTR(); + TS_copy = 0; + CGWSEL_copy = 0x82; + CGADSUB_copy = 0x20; + subsubmodule_index++; + sound_effect_ambient = 5; + } + break; + case 8: + OverworldEntrance_PlayJingle(); + break; + } +} + +void OverworldEntrance_PlayJingle() { // 9bcf40 + sound_effect_2 = 27; + trigger_special_entrance = 0; + subsubmodule_index = 0; + nmi_disable_core_updates = 0; + flag_is_link_immobilized = 0; + flag_unk1 = 0; + bg1_x_offset = 0; + bg1_y_offset = 0; +} + +void OverworldEntrance_DrawManyTR() { // 9bcf60 + int j = 0xe78; + Overworld_DrawMap16_Persist(0x99e, j++); + Overworld_DrawMap16_Persist(0x9a0, j++); + Overworld_DrawMap16_Persist(0x9a2, j++); + Overworld_DrawMap16_Persist(0x9a4, j++); + + Overworld_DrawMap16_Persist(0xa1e, j++); + Overworld_DrawMap16_Persist(0xa20, j++); + Overworld_DrawMap16_Persist(0xa22, j++); + Overworld_DrawMap16_Persist(0xa24, j++); + + Overworld_DrawMap16_Persist(0xa9e, j++); + Overworld_DrawMap16_Persist(0xaa0, j++); + Overworld_DrawMap16_Persist(0xaa2, j++); + Overworld_DrawMap16_Persist(0xaa4, j++); + + Overworld_DrawMap16_Persist(0xb1e, j++); + Overworld_DrawMap16_Persist(0xb20, j++); + Overworld_DrawMap16_Persist(0xb22, j++); + Overworld_DrawMap16_Persist(0xb24, j++); + nmi_load_bg_from_vram = 1; + nmi_disable_core_updates = 1; +} + +void Overworld_AnimateEntrance_GanonsTower() { // 9bcfd9 + switch (subsubmodule_index) { + case 0: + case 1: + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x20; + GanonTowerEntrance_Func1(); + break; + case 2: + GanonTowerEntrance_Func1(); + if (!TS_copy) { + TS_copy = 1; + if (++ganonentrance_ctr == 3) { + ganonentrance_ctr = 0; + sound_effect_ambient = 7; + } else { + subsubmodule_index = 0; + } + } + break; + case 3: + if (++ganonentrance_ctr != 48) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x45e, 0xe88); + Overworld_DrawMap16_Persist(0x460, 0xe89); + Overworld_DrawMap16_Persist(0x4de, 0xea2); + Overworld_DrawMap16_Persist(0x4e0, 0xea3); + Overworld_DrawMap16_Persist(0x55e, 0xe8a); + Overworld_DrawMap16_Persist(0x560, 0xe8b); + nmi_load_bg_from_vram = 1; + break; + case 4: + if (++ganonentrance_ctr != 48) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x45e, 0xe8c); + Overworld_DrawMap16_Persist(0x460, 0xe8d); + Overworld_DrawMap16_Persist(0x4de, 0xe8e); + Overworld_DrawMap16_Persist(0x4e0, 0xe8f); + Overworld_DrawMap16_Persist(0x55e, 0xe90); + Overworld_DrawMap16_Persist(0x560, 0xe91); + nmi_load_bg_from_vram = 1; + break; + case 5: + if (++ganonentrance_ctr != 52) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x45e, 0xe92); + Overworld_DrawMap16_Persist(0x460, 0xe93); + Overworld_DrawMap16_Persist(0x4de, 0xe94); + Overworld_DrawMap16_Persist(0x4e0, 0xe94); + Overworld_DrawMap16_Persist(0x55e, 0xe95); + Overworld_DrawMap16_Persist(0x560, 0xe95); + nmi_load_bg_from_vram = 1; + break; + case 6: + if (++ganonentrance_ctr != 32) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x45e, 0xe96); + Overworld_DrawMap16_Persist(0x460, 0xe97); + Overworld_DrawMap16_Persist(0x4de, 0xe98); + Overworld_DrawMap16_Persist(0x4e0, 0xe99); + nmi_load_bg_from_vram = 1; + break; + case 7: + if (++ganonentrance_ctr != 32) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x4de, 0xe9a); + Overworld_DrawMap16_Persist(0x4e0, 0xe9b); + nmi_load_bg_from_vram = 1; + break; + case 8: + if (++ganonentrance_ctr != 32) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x4de, 0xe9c); + Overworld_DrawMap16_Persist(0x4e0, 0xe9d); + Overworld_DrawMap16_Persist(0x55e, 0xe9e); + Overworld_DrawMap16_Persist(0x560, 0xe9f); + nmi_load_bg_from_vram = 1; + break; + case 9: + if (++ganonentrance_ctr != 32) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x55e, 0xe9a); + Overworld_DrawMap16_Persist(0x560, 0xe9b); + nmi_load_bg_from_vram = 1; + break; + case 10: + if (++ganonentrance_ctr != 32) + return; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x55e, 0xe9c); + Overworld_DrawMap16_Persist(0x560, 0xe9d); + Overworld_DrawMap16_Persist(0x5de, 0xea0); + Overworld_DrawMap16_Persist(0x5e0, 0xea1); + nmi_load_bg_from_vram = 1; + break; + case 11: + if (++ganonentrance_ctr != 32) + return; + sound_effect_ambient = 5; + OverworldEntrance_AdvanceAndBoom(); + Overworld_DrawMap16_Persist(0x5de, 0xe9a); + Overworld_DrawMap16_Persist(0x5e0, 0xe9b); + nmi_load_bg_from_vram = 1; + break; + case 12: + if (++ganonentrance_ctr != 72) + return; + OverworldEntrance_PlayJingle(); + ganonentrance_ctr = 0; + music_control = 13; + sound_effect_ambient = 9; + break; + } +} + +void OverworldEntrance_AdvanceAndBoom() { // 9bd00e + subsubmodule_index++; + overworld_entrance_sequence_counter = 0; + sound_effect_1 = 12; + sound_effect_2 = 7; +} + diff --git a/overworld.h b/overworld.h new file mode 100644 index 00000000..3904e3d7 --- /dev/null +++ b/overworld.h @@ -0,0 +1,179 @@ +#pragma once +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" + + + + +const uint8 *GetMap8toTileAttr(); +const uint16 *GetMap16toMap8Table(); +bool LookupInOwEntranceTab(uint16 r0, uint16 r2); +int LookupInOwEntranceTab2(uint16 pos); +bool CanEnterWithTagalong(int e); +int DirToEnum(int dir); +void Overworld_ResetMosaicDown(); +void Overworld_Func1D(); +void Overworld_Func1E(); +uint16 Overworld_GetSignText(int area); +const uint8 *GetOverworldSpritePtr(int area); +uint8 GetOverworldBgPalette(int idx); +void Sprite_LoadGraphicsProperties(); +void Sprite_LoadGraphicsProperties_light_world_only(); +void InitializeMirrorHDMA(); +void MirrorWarp_BuildWavingHDMATable(); +void MirrorWarp_BuildDewavingHDMATable(); +void TakeDamageFromPit(); +void Module08_OverworldLoad(); +void PreOverworld_LoadProperties(); +void AdjustLinkBunnyStatus(); +void ForceNonbunnyStatus(); +void RecoverPositionAfterDrowning(); +void Module0F_SpotlightClose(); +void Dungeon_PrepExitWithSpotlight(); +void Spotlight_ConfigureTableAndControl(); +void OpenSpotlight_Next2(); +void Module10_SpotlightOpen(); +void Module10_00_OpenIris(); +void SetTargetOverworldWarpToPyramid(); +void ResetAncillaAndCutscene(); +void Module09_Overworld(); +void OverworldOverlay_HandleRain(); +void Module09_00_PlayerControl(); +void OverworldHandleTransitions(); +void Overworld_LoadGFXAndScreenSize(); +void ScrollAndCheckForSOWExit(); +void Module09_LoadAuxGFX(); +void Overworld_FinishTransGfx(); +void Module09_LoadNewMapAndGFX(); +void Overworld_RunScrollTransition(); +void Module09_LoadNewSprites(); +void Overworld_StartScrollTransition(); +void Overworld_EaseOffScrollTransition(); +void Module09_0A_WalkFromExiting_FacingDown(); +void Module09_0B_WalkFromExiting_FacingUp(); +void Module09_09_OpenBigDoorFromExiting(); +void Overworld_DoMapUpdate32x32_B(); +void Module09_0C_OpenBigDoor(); +void Overworld_DoMapUpdate32x32_conditional(); +void Overworld_DoMapUpdate32x32(); +void Overworld_StartMosaicTransition(); +void Overworld_LoadOverlays(); +void PreOverworld_LoadOverlays(); +void Overworld_LoadOverlays2(); +void Module09_FadeBackInFromMosaic(); +void Overworld_Func1C(); +void OverworldMosaicTransition_LoadSpriteGraphicsAndSetMosaic(); +void Overworld_Func22(); +void Overworld_Func18(); +void Overworld_Func19(); +void Module09_MirrorWarp(); +void MirrorWarp_FinalizeAndLoadDestination(); +void Overworld_DrawScreenAtCurrentMirrorPosition(); +void MirrorWarp_LoadSpritesAndColors(); +void Overworld_Func2B(); +void Overworld_WeathervaneExplosion(); +void Module09_2E_Whirlpool(); +void Overworld_Func2F(); +void Module09_2A_RecoverFromDrowning(); +void Module09_2A_00_ScrollToLand(); +void Overworld_OperateCameraScroll(); +int OverworldCameraBoundaryCheck(int xa, int ya, int vd, int r8); +int OverworldScrollTransition(); +void Overworld_SetCameraBoundaries(int big, int area); +void Overworld_FinalizeEntryOntoScreen(); +void Overworld_Func1F(); +void ConditionalMosaicControl(); +void Overworld_ResetMosaic_alwaysIncrease(); +void Overworld_SetSongList(); +void LoadOverworldFromDungeon(); +void Overworld_LoadNewScreenProperties(); +void LoadCachedEntranceProperties(); +void Overworld_EnterSpecialArea(); +void LoadOverworldFromSpecialOverworld(); +void FluteMenu_LoadTransport(); +void Overworld_LoadBirdTravelPos(int k); +void FluteMenu_LoadSelectedScreenPalettes(); +void FindPartnerWhirlpoolExit(); +void Overworld_LoadAmbientOverlay(bool load_map_data); +void Overworld_LoadAmbientOverlay(); +void Overworld_LoadAndBuildScreen(); +void Module08_02_LoadAndAdvance(); +void Overworld_DrawQuadrantsAndOverlays(); +void Overworld_HandleOverlaysAndBombDoors(); +void TriggerAndFinishMapLoadStripe_Y(int n); +void TriggerAndFinishMapLoadStripe_X(int n); +void SomeTileMapChange(); +void CreateInitialNewScreenMapToScroll(); +void CreateInitialOWScreenView_Big_North(); +void CreateInitialOWScreenView_Big_South(); +void CreateInitialOWScreenView_Big_West(); +void CreateInitialOWScreenView_Big_East(); +void CreateInitialOWScreenView_Small_North(); +void CreateInitialOWScreenView_Small_South(); +void CreateInitialOWScreenView_Small_West(); +void CreateInitialOWScreenView_Small_East(); +void OverworldTransitionScrollAndLoadMap(); +uint16 *BuildFullStripeDuringTransition_North(uint16 *dst); +uint16 *BuildFullStripeDuringTransition_South(uint16 *dst); +uint16 *BuildFullStripeDuringTransition_West(uint16 *dst); +uint16 *BuildFullStripeDuringTransition_East(uint16 *dst); +void OverworldHandleMapScroll(); +uint16 *CheckForNewlyLoadedMapAreas_North(uint16 *dst); +uint16 *CheckForNewlyLoadedMapAreas_South(uint16 *dst); +uint16 *CheckForNewlyLoadedMapAreas_West(uint16 *dst); +uint16 *CheckForNewlyLoadedMapAreas_East(uint16 *dst); +uint16 *BufferAndBuildMap16Stripes_X(uint16 *dst); +uint16 *BufferAndBuildMap16Stripes_Y(uint16 *dst); +void Overworld_DecompressAndDrawAllQuadrants(); +void Overworld_DecompressAndDrawOneQuadrant(uint16 *dst, int screen); +void Overworld_ParseMap32Definition(uint16 *dst, uint16 input); +void OverworldLoad_LoadSubOverlayMap32(); +void LoadOverworldOverlay(); +void Map16ToMap8(const uint8 *src, int r20); +void OverworldCopyMap16ToBuffer(const uint8 *src, uint16 r20, int r14, uint16 *r10); +void MirrorBonk_RecoverChangedTiles(); +void DecompressEnemyDamageSubclasses(); +int Decompress_bank02(uint8 *dst, const uint8 *src); +uint8 Overworld_ReadTileAttribute(uint16 x, uint16 y); +void Overworld_SetFixedColAndScroll(); +void Overworld_Memorize_Map16_Change(uint16 pos, uint16 value); +void HandlePegPuzzles(uint16 pos); +void GanonTowerEntrance_Func1(); +void Overworld_CheckSpecialSwitchArea(); +const uint16 *Overworld_GetMap16OfLink_Mult8(); +void Palette_AnimGetMasterSword(); +void Palette_AnimGetMasterSword2(); +void Palette_AnimGetMasterSword3(); +void Overworld_DwDeathMountainPaletteAnimation(); +void Overworld_LoadEventOverlay(); +void Ancilla_TerminateWaterfallSplashes(); +void Overworld_GetPitDestination(); +void Overworld_UseEntrance(); +uint16 Overworld_ToolAndTileInteraction(uint16 x, uint16 y); +void Overworld_PickHammerSfx(uint16 a); +uint16 Overworld_GetLinkMap16Coords(Point16U *xy); +uint8 Overworld_HandleLiftableTiles(Point16U *pt_arg); +uint8 Overworld_LiftingSmallObj(uint16 a, uint16 pos, uint16 y, Point16U pt); +int Overworld_SmashRockPile(bool down_one_tile, Point16U *pt); +uint8 SmashRockPile_fromLift(uint16 a, uint16 pos, uint16 y, Point16U pt); +void Overworld_BombTiles32x32(uint16 x, uint16 y); +void Overworld_BombTile(int x, int y); +void Overworld_AlterWeathervane(); +void OpenGargoylesDomain(); +void CreatePyramidHole(); +uint16 Overworld_RevealSecret(uint16 pos); +void AdjustSecretForPowder(); +void Overworld_DrawMap16_Persist(uint16 pos, uint16 value); +void Overworld_DrawMap16(uint16 pos, uint16 value); +void Overworld_AlterTileHardcore(uint16 pos, uint16 value); +uint16 Overworld_FindMap16VRAMAddress(uint16 addr); +void Overworld_AnimateEntrance(); +void Overworld_AnimateEntrance_PoD(); +void Overworld_AnimateEntrance_Skull(); +void Overworld_AnimateEntrance_Mire(); +void Overworld_AnimateEntrance_TurtleRock(); +void OverworldEntrance_PlayJingle(); +void OverworldEntrance_DrawManyTR(); +void Overworld_AnimateEntrance_GanonsTower(); +void OverworldEntrance_AdvanceAndBoom(); diff --git a/player.cpp b/player.cpp new file mode 100644 index 00000000..ca31fd05 --- /dev/null +++ b/player.cpp @@ -0,0 +1,6489 @@ +#include "player.h" +#include "zelda_rtl.h" +#include "variables.h" +#include "tile_detect.h" +#include "ancilla.h" +#include "sprite.h" +#include "load_gfx.h" +#include "hud.h" +#include "overworld.h" +#include "tagalong.h" +#include "dungeon.h" +#include "misc.h" +#include "player_oam.h" +#include "sprite_main.h" + +static const uint8 kSpinAttackDelays[] = { 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 3, 3, 3, 3, 4, 4, 1, 5 }; +static const uint8 kFireBeamSounds[] = { 1, 2, 3, 4, 0, 9, 18, 27 }; +static const int8 kTagalongArr1[] = { -1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static const int8 kTagalongArr2[] = { -1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static const uint8 kLinkSpinGraphicsByDir[] = { + 10, 11, 10, 6, 7, 8, 9, 2, 3, 4, 5, 10, 0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 12, 13, 12, 4, 5, 6, 7, 8, 9, 2, 3, 12, 14, 15, 14, 8, 9, 2, 3, 4, 5, 6, 7, 14 +}; +static const uint8 kLinkSpinDelays[] = { 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5 }; +static const uint8 kGrabWallDirs[] = { 4, 8, 1, 2 }; +static const uint8 kGrabWall_AnimSteps[] = { 0, 1, 2, 3, 1, 2, 3 }; +static const uint8 kGrabWall_AnimTimer[] = { 0, 5, 5, 12, 5, 5, 12 }; +static const uint8 kCapeDepletionTimers[] = { 4, 8, 8 }; +static const int8 kAvoidJudder1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7 }; +static const int8 kLink_DoMoveXCoord_Outdoors_Helper2_y[2] = { -8, 8 }; +static const int8 kLink_DoMoveXCoord_Outdoors_Helper2_y2[2] = { -16, 16 }; +static const uint8 kLink_DoMoveXCoord_Outdoors_Helper2_velz[8] = { 32, 32, 32, 40, 48, 56, 64, 72 }; +static const uint8 kLink_DoMoveXCoord_Outdoors_Helper2_velx[8] = { 16, 28, 28, 28, 28, 28, 28, 28 }; +static const uint8 kLink_Lift_tab[9] = { 0x54, 0x52, 0x50, 0xFF, 0x51, 0x53, 0x55, 0x56, 0x57 }; +static const uint8 kLink_Move_Helper6_tab0[] = { 8, 8, 23, 23, 8, 23, 8, 23 }; +static const uint8 kLink_Move_Helper6_tab1[] = { 0, 15, 0, 15, 0, 0, 15, 15 }; +static const uint8 kLink_Move_Helper6_tab2[] = { 23, 23, 8, 8, 8, 23, 8, 23 }; +static const uint8 kLink_Move_Helper6_tab3[] = { 0, 15, 0, 15, 15, 15, 0, 0 }; +const uint8 kSwimmingTab1[4] = { 2, 0, 1, 0 }; +const uint8 kSwimmingTab2[2] = { 32, 8 }; +static PlayerHandlerFunc *const kPlayerHandlers[31] = { + &LinkState_Default, + &LinkState_Pits, + &LinkState_Recoil, + &LinkState_SpinAttack, + &PlayerHandler_04_Swimming, + &LinkState_OnIce, + &LinkState_Recoil, + &LinkState_Zapped, + &LinkState_UsingEther, + &LinkState_UsingBombos, + &LinkState_UsingQuake, + &LinkHop_HoppingSouthOW, + &LinkState_HoppingHorizontallyOW, + &LinkState_HoppingDiagonallyUpOW, + &LinkState_HoppingDiagonallyDownOW, + &LinkState_0F, + &LinkState_0F, + &LinkState_Dashing, + &LinkState_ExitingDash, + &LinkState_Hookshotting, + &LinkState_CrossingWorlds, + &PlayerHandler_15_HoldItem, + &LinkState_Sleeping, + &PlayerHandler_17_Bunny, + &LinkState_HoldingBigRock, + &LinkState_ReceivingEther, + &LinkState_ReceivingBombos, + &LinkState_ReadingDesertTablet, + &LinkState_TemporaryBunny, + &LinkState_TreePull, + &LinkState_SpinAttack, +}; +// forwards +static const uint8 kLinkItem_MagicCosts[] = { 16, 8, 4, 32, 16, 8, 8, 4, 2, 8, 4, 2, 8, 4, 2, 16, 8, 4, 4, 2, 2, 8, 4, 2, 16, 8, 4 }; +static const uint8 kBombosAnimDelays[] = { 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 3, 3, 7, 1, 1, 1, 1, 1, 13 }; +static const uint8 kBombosAnimStates[] = { 0, 1, 2, 3, 0, 1, 2, 3, 8, 9, 10, 11, 12, 10, 8, 13, 14, 15, 16, 17 }; +static const uint8 kEtherAnimDelays[] = { 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 3, 3 }; +static const uint8 kEtherAnimStates[] = { 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7 }; +static const uint8 kQuakeAnimDelays[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 19 }; +static const uint8 kQuakeAnimStates[] = { 0, 1, 2, 3, 0, 1, 2, 3, 18, 19, 20, 22 }; +static inline uint8 BitSum4(uint8 t); +static inline uint8 BitSum4(uint8 t) { + return (t & 1) + ((t >> 1) & 1) + ((t >> 2) & 1) + ((t >> 3) & 1); +} + +void Dungeon_HandleLayerChange() { // 81ff05 + link_is_on_lower_level_mirror = 1; + if (kind_of_in_room_staircase == 0) + BYTE(dungeon_room_index) += 16; + if (kind_of_in_room_staircase != 2) + link_is_on_lower_level = 1; + about_to_jump_off_ledge = 0; + SetAndSaveVisitedQuadrantFlags(); +} + +void CacheCameraProperties() { // 81ff28 + BG2HOFS_copy2_cached = BG2HOFS_copy2; + BG2VOFS_copy2_cached = BG2VOFS_copy2; + link_y_coord_cached = link_y_coord; + link_x_coord_cached = link_x_coord; + room_scroll_vars_y_vofs1_cached = room_bounds_y.a0; + room_scroll_vars_y_vofs2_cached = room_bounds_y.a1; + room_scroll_vars_x_vofs1_cached = room_bounds_x.a0; + room_scroll_vars_x_vofs2_cached = room_bounds_x.a1; + up_down_scroll_target_cached = up_down_scroll_target; + up_down_scroll_target_end_cached = up_down_scroll_target_end; + left_right_scroll_target_cached = left_right_scroll_target; + left_right_scroll_target_end_cached = left_right_scroll_target_end; + camera_y_coord_scroll_low_cached = camera_y_coord_scroll_low; + camera_x_coord_scroll_low_cached = camera_x_coord_scroll_low; + quadrant_fullsize_x_cached = quadrant_fullsize_x; + quadrant_fullsize_y_cached = quadrant_fullsize_y; + link_quadrant_x_cached = link_quadrant_x; + link_quadrant_y_cached = link_quadrant_y; + link_direction_facing_cached = link_direction_facing; + link_is_on_lower_level_cached = link_is_on_lower_level; + link_is_on_lower_level_mirror_cached = link_is_on_lower_level_mirror; + is_standing_in_doorway_cahed = is_standing_in_doorway; + dung_cur_floor_cached = dung_cur_floor; +} + +void CheckAbilityToSwim() { // 81ffb6 + if (!link_is_bunny_mirror && link_item_flippers) + return; + if (link_item_moon_pearl) + link_is_bunny_mirror = 0; + link_visibility_status = 0xc; + submodule_index = player_is_indoors ? 20 : 42; +} + +void Link_Main() { // 878000 +// RunEmulatedFunc(0x878000, 0, 0, 0, true, true, -2, 0); +// return; + + + + link_x_coord_prev = link_x_coord; + link_y_coord_prev = link_y_coord; + flag_unk1 = 0; + if (!flag_is_link_immobilized) + Link_ControlHandler(); + HandleSomariaAndGraves(); +} + +void Link_ControlHandler() { // 87807f + if (link_give_damage) { + if (link_cape_mode) { + link_give_damage = 0; + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + } else { + if (!link_disable_sprite_damage) { + uint8 dmg = link_give_damage; + link_give_damage = 0; + if (ancilla_type[0] == 5 && player_handler_timer == 0 && link_delay_timer_spin_attack) { + ancilla_type[0] = 0; + flag_for_boomerang_in_place = 0; + } + if (countdown_for_blink == 0) + countdown_for_blink = 58; + Ancilla_Sfx2_Near(38); + number_of_times_hurt_by_sprites++; + uint8 new_dmg = link_health_current - dmg; + if (new_dmg == 0 || new_dmg >= 0xa8) { + mapbak_TM = TM_copy; + mapbak_TS = TS_copy; + saved_module_for_menu = main_module_index; + main_module_index = 18; + submodule_index = 1; + countdown_for_blink = 0; + link_hearts_filler = 0; + new_dmg = 0; + } + link_health_current = new_dmg; + } + } + } + if (link_player_handler_state) + Player_CheckHandleCapeStuff(); + + kPlayerHandlers[link_player_handler_state](); +} + +void LinkState_Default() { // 878109 + CacheCameraPropertiesIfOutdoors(); + if (Link_HandleBunnyTransformation()) { + if (link_player_handler_state == 23) + PlayerHandler_17_Bunny(); + return; + } + fallhole_var2 = 0; + if (link_auxiliary_state) + HandleLink_From1D(); + else + PlayerHandler_00_Ground_3(); +} + +void HandleLink_From1D() { // 878130 + link_item_in_hand = 0; + link_position_mode = 0; + link_debug_value_1 = 0; + link_debug_value_2 = 0; + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + button_mask_b_y &= ~0x40; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + bitmask_of_dragstate = 0; + Link_ResetSwimmingState(); + link_cant_change_direction &= ~1; + link_z_coord &= 0xff; + if (link_electrocute_on_touch != 0) { + if (link_cape_mode) + Link_ForceUnequipCape_quietly(); + Link_ResetSwordAndItemUsage(); + link_disable_sprite_damage = 1; + player_handler_timer = 0; + link_delay_timer_spin_attack = 2; + link_animation_steps = 0; + link_direction &= ~0xf; + Ancilla_Sfx3_Near(43); + link_player_handler_state = 7; + LinkState_Zapped(); + } else { + link_moving_against_diag_tile = 0; + link_player_handler_state = 2; + LinkState_Recoil(); + } +} + +void PlayerHandler_00_Ground_3() { // 8781a0 + link_z_coord = 0xffff; + link_actual_vel_z = 0xff; + link_recoilmode_timer = 0; + + if (!Link_HandleToss()) { + Link_HandleAPress(); + if ((link_state_bits | link_grabbing_wall) == 0 && link_unk_master_sword == 0 && link_player_handler_state != 17) { + Link_HandleYItem(); + if (sram_progress_indicator != 0) { + Link_HandleSwordCooldown(); + if (link_player_handler_state == 3) { + link_x_vel = link_y_vel = 0; + goto getout_dostuff; + } + } + } + } + + Link_HandleCape_passive_LiftCheck(); + if (link_incapacitated_timer) { + link_moving_against_diag_tile = 0; + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + link_picking_throw_state = 0; + link_state_bits = 0; + link_grabbing_wall = 0; + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction &= ~1; + Link_HandleRecoilAndTimer(false); + return; + } + + if (link_unk_master_sword) { + link_direction = 0; + } else if (!link_is_transforming && (link_grabbing_wall & ~2) == 0 && (link_state_bits & 0x7f) == 0 && + ((link_state_bits & 0x80) == 0 || (link_picking_throw_state & 1) == 0) && !link_item_in_hand && !link_position_mode && + (button_b_frames >= 9 || (button_mask_b_y & 0x20) != 0 || (button_mask_b_y & 0x80) == 0)) { + // if_4 + + if (link_flag_moving) { + swimcoll_var9[0] = swimcoll_var9[1] = 0x180; + Link_HandleSwimMovements(); + return; + } + ResetAllAcceleration(); + uint8 dir; + + if ((dir = (force_move_any_direction & 0xf)) == 0) { + if (link_grabbing_wall & 2) + goto endif_3; + if ((dir = (joypad1H_last & 0xf)) == 0) { + link_x_vel = 0; + link_y_vel = 0; + link_direction = 0; + link_direction_last = 0; + link_animation_steps = 0; + bitmask_of_dragstate &= ~0xf; + link_timer_push_get_tired = 32; + link_timer_jump_ledge = 19; + goto endif_3; + } + } + link_direction = dir; + if (dir != link_direction_last) { + link_direction_last = dir; + link_subpixel_x = link_subpixel_y = 0; + link_moving_against_diag_tile = 0; + bitmask_of_dragstate = 0; + link_timer_push_get_tired = 32; + link_timer_jump_ledge = 19; + } + } + // endif_3 +endif_3: + Link_HandleDiagonalCollision(); + Link_HandleVelocity(); + Link_HandleCardinalCollision(); + Link_HandleMovingAnimation_FullLongEntry(); + if (link_unk_master_sword) + link_y_vel = link_x_vel = 0; + +getout_dostuff: + fallhole_var1 = 0; + HandleIndoorCameraAndDoors(); +} + +bool Link_HandleBunnyTransformation() { // 8782da + if (!link_timer_tempbunny) + return false; + + if (!link_need_for_poof_for_transform) { + if (link_player_handler_state == kPlayerState_PermaBunny || link_player_handler_state == kPlayerState_TempBunny) { + link_timer_tempbunny = 0; + return false; + } + if (link_picking_throw_state & 2) + link_state_bits = 0; + uint8 bak = link_state_bits & 0x80; + Link_ResetProperties_A(); + link_state_bits = bak; + + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 0x30 || ancilla_type[i] == 0x31) + ancilla_type[i] = 0; + } + Link_CancelDash(); + AncillaAdd_CapePoof(0x23, 4); + Ancilla_Sfx2_Near(0x14); + link_bunny_transform_timer = 20; + link_disable_sprite_damage = 1; + link_need_for_poof_for_transform = 1; + link_visibility_status = 12; + } + if (sign8(--link_bunny_transform_timer)) { + link_player_handler_state = kPlayerState_TempBunny; + link_is_bunny_mirror = 1; + link_is_bunny = 1; + LoadGearPalettes_bunny(); + link_visibility_status = 0; + link_disable_sprite_damage = 0; + link_need_for_poof_for_transform = 0; + } + return true; +} + +void LinkState_TemporaryBunny() { // 878365 + if (!link_timer_tempbunny) { + AncillaAdd_CapePoof(0x23, 4); + Ancilla_Sfx2_Near(0x15); + link_bunny_transform_timer = 32; + link_player_handler_state = 0; + Link_ResetProperties_C(); + link_need_for_poof_for_transform = 0; + link_is_bunny = 0; + link_is_bunny_mirror = 0; + LoadActualGearPalettes(); + link_need_for_poof_for_transform = 0; + LinkState_Default(); + } else { + link_timer_tempbunny--; + PlayerHandler_17_Bunny(); + } +} + +void PlayerHandler_17_Bunny() { // 8783a1 + CacheCameraPropertiesIfOutdoors(); + fallhole_var2 = 0; + if (!link_is_in_deep_water) { + if (link_auxiliary_state == 0) { + Link_TempBunny_Func2(); + return; + } + if (link_item_moon_pearl) + link_is_bunny_mirror = 0; + } + LinkState_Bunny_recache(); +} + +void LinkState_Bunny_recache() { // 8783c7 + link_need_for_poof_for_transform = 0; + link_timer_tempbunny = 0; + if (link_item_moon_pearl) { + link_is_bunny = 0; + link_auxiliary_state = 0; + } + link_animation_steps = 0; + link_is_transforming = 0; + link_cant_change_direction = 0; + Link_ResetSwimmingState(); + link_player_handler_state = kPlayerState_RecoilWall; + if (link_item_moon_pearl) { + link_player_handler_state = kPlayerState_Ground; + LoadActualGearPalettes(); + } +} + +void Link_TempBunny_Func2() { // 8783fa + if (link_incapacitated_timer != 0) { + Link_HandleRecoilAndTimer(false); + return; + } + link_z_coord = 0xffff; + link_actual_vel_z = 0xff; + link_recoilmode_timer = 0; + if (link_flag_moving) { + swimcoll_var9[0] = swimcoll_var9[1] = 0x180; + Link_HandleSwimMovements(); + return; + } + + ResetAllAcceleration(); + Link_HandleYItem(); + uint8 dir; + if (!(dir = force_move_any_direction & 0xf) && !(dir = joypad1H_last & 0xf)) { + link_x_vel = link_y_vel = 0; + link_direction = link_direction_last = 0; + link_animation_steps = 0; + bitmask_of_dragstate &= ~9; + link_timer_push_get_tired = 32; + link_timer_jump_ledge = 19; + } else { + link_direction = dir; + if (dir != link_direction_last) { + link_direction_last = dir; + link_subpixel_x = 0; + link_subpixel_y = 0; + link_moving_against_diag_tile = 0; + bitmask_of_dragstate = 0; + link_timer_push_get_tired = 32; + link_timer_jump_ledge = 19; + } + } + Link_HandleDiagonalCollision(); + Link_HandleVelocity(); + Link_HandleCardinalCollision(); + Link_HandleMovingAnimation_FullLongEntry(); + fallhole_var1 = 0; + HandleIndoorCameraAndDoors(); +} + +void LinkState_HoldingBigRock() { // 878481 + if (link_auxiliary_state) { + link_item_in_hand = 0; + link_position_mode = 0; + link_debug_value_1 = 0; + link_debug_value_2 = 0; + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + bitmask_of_dragstate = 0; + link_cant_change_direction &= ~1; + link_z_coord &= ~0xff; + if (link_electrocute_on_touch) { + Link_ResetSwordAndItemUsage(); + link_disable_sprite_damage = 1; + player_handler_timer = 0; + link_delay_timer_spin_attack = 2; + link_animation_steps = 0; + link_direction &= ~0xf; + Ancilla_Sfx3_Near(43); + link_player_handler_state = kPlayerState_Electrocution; + LinkState_Zapped(); + } else { + link_player_handler_state = kPlayerState_RecoilWall; + LinkState_Recoil(); + } + return; + } + + link_z_coord = 0xffff; + link_actual_vel_z = 0xff; + link_recoilmode_timer = 0; + if (link_incapacitated_timer) { + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction &= ~1; + Link_HandleRecoilAndTimer(false); + return; + } + + Link_HandleAPress(); + if (!(joypad1H_last & 0xf)) { + link_y_vel = 0; + link_x_vel = 0; + link_direction = 0; + link_direction_last = 0; + link_animation_steps = 0; + bitmask_of_dragstate &= ~9; + link_timer_push_get_tired = 32; + link_timer_jump_ledge = 19; + } else { + link_direction = joypad1H_last & 0xf; + if (link_direction != link_direction_last) { + link_direction_last = link_direction; + link_subpixel_x = 0; + link_subpixel_y = 0; + link_moving_against_diag_tile = 0; + bitmask_of_dragstate = 0; + link_timer_push_get_tired = 32; + link_timer_jump_ledge = 19; + } + } + Link_HandleMovingAnimation_FullLongEntry(); + fallhole_var1 = 0; + HandleIndoorCameraAndDoors(); +} + +void EtherTablet_StartCutscene() { // 87855a + button_b_frames = 0xc0; + link_delay_timer_spin_attack = 0; + link_player_handler_state = kPlayerState_ReceivingEther; + link_disable_sprite_damage = 1; + flag_block_link_menu = 1; +} + +void LinkState_ReceivingEther() { // 878570 + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + link_give_damage = 0; + int i = --WORD(button_b_frames); + if (sign16(i)) { + button_b_frames = 0; + link_delay_timer_spin_attack = 0; + } else if (i == 0xbf) { + link_force_hold_sword_up = 1; + } else if (i == 160) { + uint16 x = link_x_coord, y = link_y_coord; + link_x_coord = 0x6b0; + link_y_coord = 0x37; + AncillaAdd_EtherSpell(0x18, 0); + link_x_coord = x, link_y_coord = y; + } else if (i == 0) { + AncillaAdd_FallingPrize(0x29, 0, 4); + flag_is_link_immobilized = 1; + flag_block_link_menu = 0; + } +} + +void BombosTablet_StartCutscene() { // 8785e5 + button_b_frames = 0xe0; + link_delay_timer_spin_attack = 0; + link_player_handler_state = kPlayerState_ReceivingBombos; + link_disable_sprite_damage = 1; + flag_custom_spell_anim_active = 1; +} + +void LinkState_ReceivingBombos() { // 8785fb + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + link_give_damage = 0; + int i = --WORD(button_b_frames); + if (sign16(i)) { + button_b_frames = 0; + link_delay_timer_spin_attack = 0; + } else if (i == 223) { + link_force_hold_sword_up = 1; + } else if (i == 160) { + uint16 x = link_x_coord, y = link_y_coord; + link_x_coord = 0x378; + link_y_coord = 0xeb0; + AncillaAdd_BombosSpell(0x19, 0); + link_x_coord = x, link_y_coord = y; + } else if (i == 0) { + AncillaAdd_FallingPrize(0x29, 5, 4); + flag_is_link_immobilized = 1; + } +} + +void LinkState_ReadingDesertTablet() { // 87867b + if (!--button_b_frames) { + link_player_handler_state = kPlayerState_Ground; + Link_PerformDesertPrayer(); + } +} + +void HandleSomariaAndGraves() { // 878689 + if (!player_is_indoors && link_something_with_hookshot) { + int i = 4; + do { + if (ancilla_type[i] == 0x24) + Gravestone_Move(i); + } while (--i >= 0); + } + int i = 4; + do { + if (ancilla_type[i] == 0x2C) { + SomariaBlock_HandlePlayerInteraction(i); + return; + } + } while (--i >= 0); +} + +void LinkState_Recoil() { // 8786b5 + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + Link_HandleChangeInZVelocity(); + link_cant_change_direction = 0; + draw_water_ripples_or_grass = 0; + if (!sign8(link_z_coord) || !sign8(link_actual_vel_z)) { + Link_HandleRecoilAndTimer(false); + return; + } + TileDetect_MainHandler(5); + if (tiledetect_deepwater & 1) { + link_player_handler_state = kPlayerState_Swimming; + Link_SetToDeepWater(); + Link_ResetSwordAndItemUsage(); + AncillaAdd_Splash(21, 0); + Link_HandleRecoilAndTimer(true); + } else { + if (++link_recoilmode_timer != 4) { + uint8 t = link_actual_vel_z_copy, s = link_recoilmode_timer; + do { + t >>= 1; + } while (!--s); // wtf? + link_actual_vel_z = t; + if (t == 0) + link_recoilmode_timer = 3; + } else { + link_recoilmode_timer = 3; + } + Link_HandleRecoilAndTimer(false); + } +} + +void Link_HandleRecoilAndTimer(bool jump_into_middle) { // 878711 + if (jump_into_middle) + goto lbl_jump_into_middle; + + link_x_page_movement_delta = 0; + link_y_page_movement_delta = 0; + link_num_orthogonal_directions = 0; + Link_HandleRecoiling(); // not + if (--link_incapacitated_timer == 0) { + link_incapacitated_timer = 1; + int8 z; + z = link_z_coord & 0xfe; + if (z <= 0 && (int8)link_actual_vel_z < 0) { + if (link_auxiliary_state != 0) { + link_disable_sprite_damage = 0; + scratch_0 = link_player_handler_state; + if (link_player_handler_state != 6) { + button_b_frames = 0; + button_mask_b_y = 0; + link_delay_timer_spin_attack = 0; + link_spin_attack_step_counter = 0; + } + Link_SplashUponLanding(); + if (!link_is_bunny_mirror || !link_is_in_deep_water) { + if (link_want_make_noise_when_dashed) { + link_want_make_noise_when_dashed = 0; + Ancilla_Sfx2_Near(33); + } else if (scratch_0 != 2 && link_player_handler_state != 4) { + Ancilla_Sfx2_Near(33); + } + if (link_player_handler_state == 4) { + Link_ForceUnequipCape_quietly(); + if (player_is_indoors && scratch_0 != 2 && link_item_flippers) { + link_is_on_lower_level = 1; + } + AncillaAdd_Splash(21, 0); + } + TileDetect_MainHandler(0); + if (tiledetect_thick_grass & 1) + Ancilla_Sfx2_Near(26); + if (tiledetect_shallow_water & 1 && sound_effect_1 != 36) + Ancilla_Sfx2_Near(28); + + if (tiledetect_deepwater & 1) { + link_player_handler_state = kPlayerState_Swimming; + Link_SetToDeepWater(); + Link_ResetSwordAndItemUsage(); + AncillaAdd_Splash(21, 0); + } + + // OMG something jumps to here... +lbl_jump_into_middle: + if (link_is_on_lower_level == 2) + link_is_on_lower_level = 0; + if (about_to_jump_off_ledge) + Dungeon_HandleLayerChange(); + } + link_z_coord = 0; + link_auxiliary_state = 0; + link_speed_setting = 0; + link_cant_change_direction = 0; + link_item_in_hand = 0; + link_position_mode = 0; + player_handler_timer = 0; + link_disable_sprite_damage = 0; + link_electrocute_on_touch = 0; + link_actual_vel_x = 0; + link_actual_vel_y = 0; + } + link_animation_steps = 0; + link_incapacitated_timer = 0; + } + } + + if (link_player_handler_state != 5 && link_incapacitated_timer >= 33) { + if (!sign8(--byte_7E02C5)) + goto timer_running; + byte_7E02C5 = link_incapacitated_timer >> 4; + } + + Flag67WithDirections(); + if (link_player_handler_state != 6) { + Link_HandleDiagonalCollision(); // not + if ((link_direction & 3) == 0) + link_actual_vel_x = 0; + if ((link_direction & 0xc) == 0) + link_actual_vel_y = 0; + } + LinkHop_FindArbitraryLandingSpot(); // not +timer_running: + if (link_player_handler_state != 6) { + Link_HandleCardinalCollision(); // not + fallhole_var1 = 0; + } + HandleIndoorCameraAndDoors(); + if (BYTE(link_z_coord) == 0 || BYTE(link_z_coord) >= 0xe0) { + Player_TileDetectNearby(); + if ((tiledetect_pit_tile & 0xf) == 0xf) { + link_player_handler_state = 1; + link_speed_setting = 4; + } + } + HIBYTE(link_z_coord) = 0; +} + +void LinkState_OnIce() { // 878872 + assert(0); +} + +void Link_HandleChangeInZVelocity() { // 878926 + Player_ChangeZ(link_player_handler_state == kPlayerState_TurtleRock ? 1 : 2); +} + +void Player_ChangeZ(uint8 zd) { // 878932 + if (sign8(link_actual_vel_z)) { + if (!(uint8)link_z_coord) + return; + if (sign8(link_z_coord)) { + link_z_coord = 0xffff; + link_actual_vel_z = 0xff; + return; + } + } + link_actual_vel_z -= zd; +} + +void LinkHop_HoppingSouthOW() { // 87894e + link_last_direction_moved_towards = 1; + link_cant_change_direction = 0; + link_actual_vel_x = 0; + link_actual_vel_y = 0; + draw_water_ripples_or_grass = 0; + if (!link_incapacitated_timer && !link_actual_vel_z_mirror) { + Ancilla_Sfx2_Near(32); + LinkHop_FindTileToLandOnSouth(); + if (!player_is_indoors) + link_is_on_lower_level = 2; + } + link_actual_vel_z = link_actual_vel_z_mirror; + link_actual_vel_z_copy = link_actual_vel_z_copy_mirror; + link_z_coord = link_z_coord_mirror; + link_actual_vel_z -= 2; + LinkHop_FindArbitraryLandingSpot(); + if (sign8(link_actual_vel_z)) { + if (link_actual_vel_z < 0xa0) + link_actual_vel_z = 0xa0; + if (link_z_coord >= 0xfff0) { + link_z_coord = 0; + Link_SplashUponLanding(); + if (player_near_pit_state) + link_player_handler_state = kPlayerState_FallingIntoHole; + if (link_player_handler_state != kPlayerState_Swimming && + link_player_handler_state != kPlayerState_FallingIntoHole && !link_is_in_deep_water) + Ancilla_Sfx2_Near(33); + link_disable_sprite_damage = 0; + allow_scroll_z = 0; + link_auxiliary_state = 0; + link_actual_vel_z = 0xff; + link_z_coord = 0xffff; + link_incapacitated_timer = 0; + if (!player_is_indoors) + link_is_on_lower_level = 0; + } else { + link_y_vel = link_z_coord_mirror - link_z_coord; + } + } else { + link_y_vel = link_z_coord_mirror - link_z_coord; + } + link_actual_vel_z_mirror = link_actual_vel_z; + link_actual_vel_z_copy_mirror = link_actual_vel_z_copy; + link_z_coord_mirror = link_z_coord; +} + +void LinkState_HandlingJump() { // 878a05 + link_actual_vel_z = link_actual_vel_z_mirror; + link_actual_vel_z_copy = link_actual_vel_z_copy_mirror; + BYTE(link_z_coord) = link_z_coord_mirror; + link_actual_vel_z -= 2; + LinkHop_FindArbitraryLandingSpot(); + if (sign8(link_actual_vel_z)) { + if (link_actual_vel_z < 0xa0) + link_actual_vel_z = 0xa0; + if ((uint8)link_z_coord >= 0xf0) { + link_z_coord = 0; + if (link_player_handler_state == kPlayerState_FallOfLeftRightLedge || link_player_handler_state == kPlayerState_JumpOffLedgeDiag) { + TileDetect_MainHandler(0); + if (tiledetect_deepwater & 1) { + link_player_handler_state = kPlayerState_Swimming; + Link_SetToDeepWater(); + Link_ResetSwordAndItemUsage(); + AncillaAdd_Splash(21, 0); + } else if (tiledetect_pit_tile & 1) { + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + link_player_handler_state = kPlayerState_FallingIntoHole; + goto after_pit; + } + } + Link_SplashUponLanding(); + if (link_player_handler_state != kPlayerState_Swimming && !link_is_in_deep_water) + Ancilla_Sfx2_Near(33); +after_pit: + if (link_player_handler_state != kPlayerState_Swimming || !link_is_bunny_mirror) + link_disable_sprite_damage = 0; + + allow_scroll_z = 0; + link_auxiliary_state = 0; + link_actual_vel_z = 0xff; + link_z_coord = 0xffff; + link_incapacitated_timer = 0; + if (!player_is_indoors) + link_is_on_lower_level = 0; + } else { + link_y_vel = link_z_coord_mirror - link_z_coord; + } + } else { + link_y_vel = link_z_coord_mirror - link_z_coord; + } + link_actual_vel_z_mirror = link_actual_vel_z; + link_actual_vel_z_copy_mirror = link_actual_vel_z_copy; + BYTE(link_z_coord_mirror) = link_z_coord; +} + +void LinkHop_FindTileToLandOnSouth() { // 878ad1 + link_y_coord_original = link_y_coord; + link_y_vel = link_y_coord - link_y_coord_safe_return_lo; + for (;;) { + link_y_coord += kLink_DoMoveXCoord_Outdoors_Helper2_y[link_last_direction_moved_towards]; + TileDetect_Movement_Y(link_last_direction_moved_towards); + uint8 k = tiledetect_normal_tiles | tiledetect_pit_tile | tiledetect_destruction_aftermath | tiledetect_thick_grass | tiledetect_deepwater; + if ((k & 7) == 7) + break; + } + if (tiledetect_deepwater & 7) { + link_is_in_deep_water = 1; + if (link_auxiliary_state != 4) + link_auxiliary_state = 2; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_grabbing_wall = 0; + link_speed_setting = 0; + } + if (tiledetect_pit_tile & 7) { + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + } + link_y_coord += kLink_DoMoveXCoord_Outdoors_Helper2_y2[link_last_direction_moved_towards]; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_incapacitated_timer = 1; + uint8 z = link_z_coord; + if (z >= 0xf0) + z = 0; + link_z_coord = link_z_coord_mirror = link_y_coord - link_y_coord_original + z; +} + +// used on right ledges +void LinkState_HoppingHorizontallyOW() { // 878b74 + link_direction = sign8(link_actual_vel_x) ? 6 : 5; + link_cant_change_direction = 0; + link_actual_vel_y = 0; + draw_water_ripples_or_grass = 0; + LinkState_HandlingJump(); +} + +void Link_HoppingHorizontally_FindTile_Y() { // 878b9b + link_y_coord_original = link_y_coord; + link_y_vel = link_y_coord - link_y_coord_safe_return_lo; + + link_y_coord += kLink_DoMoveXCoord_Outdoors_Helper2_y[link_last_direction_moved_towards]; + TileDetect_Movement_Y(link_last_direction_moved_towards); + + uint8 tt = tiledetect_normal_tiles | tiledetect_destruction_aftermath | tiledetect_thick_grass | + tiledetect_deepwater; + + if ((tt & 7) != 7) { + link_y_coord = link_y_coord_original; + link_incapacitated_timer = 1; + + int8 velx = link_actual_vel_x, org_velx = velx; + if (velx < 0) velx = -velx; + velx >>= 4; + link_actual_vel_z_mirror = link_actual_vel_z_copy_mirror = kLink_DoMoveXCoord_Outdoors_Helper2_velz[velx]; + + uint8 xt = kLink_DoMoveXCoord_Outdoors_Helper2_velx[velx]; + if (org_velx < 0) xt = -xt; + link_actual_vel_x = xt; + } else { // else_1 + link_y_coord += kLink_DoMoveXCoord_Outdoors_Helper2_y2[link_last_direction_moved_towards]; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_incapacitated_timer = 1; + uint8 z = link_z_coord; + if (z == 255) z = 0; + link_z_coord_mirror = link_z_coord = link_y_coord - link_y_coord_original + z; + } // endif_1 + + if (tiledetect_deepwater & 7) { + link_auxiliary_state = 2; + Link_SetToDeepWater(); + } +} + +void Link_SetToDeepWater() { // 878c44 + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_grabbing_wall = 0; + link_speed_setting = 0; +} + +void LinkState_0F() { // 878c69 + assert(0); +} + +uint8 Link_HoppingHorizontally_FindTile_X(uint8 o) { // 878d2b + assert(o == 0 || o == 2); + link_y_coord_original = link_x_coord; + int i = 7; + static const int8 kLink_DoMoveXCoord_Outdoors_Helper1_tab1[2] = { -8, 8 }; + static const int8 kLink_DoMoveXCoord_Outdoors_Helper1_tab2[2] = { -32, 32 }; + static const int8 kLink_DoMoveXCoord_Outdoors_Helper1_tab3[2] = { -16, 16 }; + static const uint8 kLink_DoMoveXCoord_Outdoors_Helper1_velx[24] = { 20, 20, 20, 24, 24, 24, 24, 28, 28, 36, 36, 36, 36, 36, 36, 38, 38, 38, 38, 38, 38, 38, 40, 40 }; + static const uint8 kLink_DoMoveXCoord_Outdoors_Helper1_velz[24] = { 20, 20, 20, 20, 20, 20, 20, 24, 24, 32, 32, 32, 36, 36, 36, 38, 38, 38, 38, 38, 38, 38, 40, 40 }; + do { + link_x_coord += kLink_DoMoveXCoord_Outdoors_Helper1_tab1[o >> 1]; + TileDetect_Movement_X(link_last_direction_moved_towards); + + uint8 tt = tiledetect_normal_tiles | tiledetect_destruction_aftermath | tiledetect_thick_grass | + tiledetect_deepwater | tiledetect_pit_tile; + + if ((tt & 7) == 7) { + if ((tiledetect_deepwater & 7) == 7) { + link_is_in_deep_water = 1; + link_auxiliary_state = 2; + link_some_direction_bits = link_direction_last; + swimming_countdown = 0; + link_speed_setting = 0; + link_grabbing_wall = 0; + ResetAllAcceleration(); + } + goto finish; + } + } while (--i >= 0); + + link_x_coord = link_y_coord_original + kLink_DoMoveXCoord_Outdoors_Helper1_tab2[o >> 1]; +finish: + link_x_coord += kLink_DoMoveXCoord_Outdoors_Helper1_tab3[o >> 1]; + int16 xt = link_y_coord_original - link_x_coord; + if (xt < 0) xt = -xt; + xt >>= 3; + uint8 velx = kLink_DoMoveXCoord_Outdoors_Helper1_velx[xt]; + if (o != 2) velx = -velx; + link_actual_vel_x = velx; + link_actual_vel_z_mirror = link_actual_vel_z_copy_mirror = kLink_DoMoveXCoord_Outdoors_Helper1_velz[xt]; + + return i; +} + +// used on diag ledges +void LinkState_HoppingDiagonallyUpOW() { // 878dc6 + draw_water_ripples_or_grass = 0; + Player_ChangeZ(2); + LinkHop_FindArbitraryLandingSpot(); + if (sign8(link_z_coord)) { + Link_SplashUponLanding(); + if (link_player_handler_state != kPlayerState_Swimming && !link_is_in_deep_water) + Ancilla_Sfx2_Near(33); + link_disable_sprite_damage = 0; + link_auxiliary_state = 0; + link_actual_vel_z = 0xff; + link_z_coord = 0xffff; + link_incapacitated_timer = 0; + link_cant_change_direction = 0; + } +} + +void LinkState_HoppingDiagonallyDownOW() { // 878e15 + uint8 dir = sign8(link_actual_vel_x) ? 2 : 3; + link_last_direction_moved_towards = dir; + link_cant_change_direction = 0; + link_actual_vel_y = 0; + draw_water_ripples_or_grass = 0; + if (!link_incapacitated_timer && !link_actual_vel_z_mirror) { + link_last_direction_moved_towards = 1; + uint16 old_x = link_x_coord; + Ancilla_Sfx2_Near(32); + LinkHop_FindLandingSpotDiagonallyDown(); + link_x_coord = old_x; + + static const uint8 kLedgeVelX[] = { 4, 4, 4, 10, 10, 10, 11, 18, 18, 18, 20, 20, 20, 20, 22, 22, 26, 26, 26, 26, 28, 28, 28, 28 }; + + int8 velx = kLedgeVelX[(uint16)(link_y_coord - link_y_coord_original) >> 3]; + link_actual_vel_x = (dir != 2) ? velx : -velx; + if (!player_is_indoors) + link_is_on_lower_level = 2; + } + LinkState_HandlingJump(); +} + +void LinkHop_FindLandingSpotDiagonallyDown() { // 878e7b + static const int8 kLink_Ledge_Func1_dx[2] = { -8, 8 }; + static const int8 kLink_Ledge_Func1_dy[2] = { -9, 9 }; + static const uint8 kLink_Ledge_Func1_bits[2] = { 6, 3 }; + static const int8 kLink_Ledge_Func1_dy2[2] = { -24, 24 }; + link_y_coord_original = link_y_coord; + link_y_vel = link_y_coord - link_y_coord_safe_return_lo; + + uint8 scratch; + for (;;) { + int o = sign8(link_actual_vel_x) ? 0 : 1; + + link_x_coord += kLink_Ledge_Func1_dx[o]; + link_y_coord += kLink_Ledge_Func1_dy[link_last_direction_moved_towards]; + TileDetect_Movement_Y(link_last_direction_moved_towards); + scratch = kLink_Ledge_Func1_bits[o]; + uint8 k = tiledetect_normal_tiles | tiledetect_destruction_aftermath | tiledetect_thick_grass | tiledetect_deepwater; + if ((k & scratch) == scratch) + break; + } + + if (tiledetect_deepwater & scratch) { + link_is_in_deep_water = 1; + link_auxiliary_state = 2; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_speed_setting = 0; + link_grabbing_wall = 0; + } + + link_y_coord += kLink_Ledge_Func1_dy2[link_last_direction_moved_towards]; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_incapacitated_timer = 1; + link_z_coord_mirror = link_y_coord - link_y_coord_original + (uint8)link_z_coord; + link_z_coord = link_z_coord_mirror; +} + +void Link_SplashUponLanding() { // 878f1d + if (link_is_bunny_mirror) { + if (link_is_in_deep_water) { + AncillaAdd_Splash(21, 0); + LinkState_Bunny_recache(); + return; + } + link_player_handler_state = (link_item_moon_pearl) ? kPlayerState_TempBunny : kPlayerState_PermaBunny; + } else if (link_is_in_deep_water) { + if (link_player_handler_state != kPlayerState_RecoilOther) + AncillaAdd_Splash(21, 0); + Link_ForceUnequipCape_quietly(); + link_player_handler_state = kPlayerState_Swimming; + } else { + link_player_handler_state = kPlayerState_Ground; + } +} + +void LinkState_Dashing() { // 878f86 + CacheCameraPropertiesIfOutdoors(); + if (Link_HandleBunnyTransformation()) { + if (link_player_handler_state == 23) + PlayerHandler_17_Bunny(); + return; + } + if (!link_is_running) { + link_disable_sprite_damage = 0; + link_countdown_for_dash = 0; + link_speed_setting = 0; + link_player_handler_state = kPlayerState_Ground; + link_cant_change_direction = 0; + return; + } + + if (button_mask_b_y & 0x80) { + if (button_b_frames >= 9) + button_b_frames = 9; + } + fallhole_var2 = 0; + + if (link_auxiliary_state) { + link_disable_sprite_damage = 0; + link_countdown_for_dash = 0; + link_speed_setting = 0; + link_cant_change_direction = 0; + link_is_running = 0; + bitmask_of_dragstate = 0; + if (link_electrocute_on_touch) { + if (link_cape_mode) + Link_ForceUnequipCape_quietly(); + Link_ResetSwordAndItemUsage(); + link_disable_sprite_damage = 1; + player_handler_timer = 0; + link_delay_timer_spin_attack = 2; + link_animation_steps = 0; + link_direction &= ~0xf; + Ancilla_Sfx3_Near(43); + link_player_handler_state = kPlayerState_Electrocution; + LinkState_Zapped(); + } else { + link_player_handler_state = kPlayerState_RecoilWall; + LinkState_Recoil(); + } + return; + } + static const uint8 kDashTab1[] = { 7, 15, 15 }; + static const uint8 kDashTab2[] = { 8, 4, 2, 1 }; + uint8 a = link_countdown_for_dash; + if (a == 0) + a = index_of_dashing_sfx--; + if (!(kDashTab1[link_countdown_for_dash >> 4] & a)) + Ancilla_Sfx2_Near(35); + if (sign8(--link_countdown_for_dash)) { + link_countdown_for_dash = 0; + if (savegame_tagalong == kTagalongArr1[savegame_tagalong]) + savegame_tagalong = kTagalongArr2[savegame_tagalong]; + } else { + index_of_dashing_sfx = 0; + if (!(joypad1L_last & 0x80)) { + link_animation_steps = 0; + link_countdown_for_dash = 0; + link_speed_setting = 0; + link_player_handler_state = kPlayerState_Ground; + link_is_running = 0; + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction = 0; + return; + } + AncillaAdd_DashDust_charging(30, 0); + link_x_vel = link_y_vel = 0; + link_dash_ctr = 64; + link_speed_setting = 16; + uint8 dir; + if (button_mask_b_y & 0x80 || is_standing_in_doorway || (dir = joypad1H_last & 0xf) == 0) + dir = kDashTab2[link_direction_facing >> 1]; + link_some_direction_bits = link_direction = link_direction_last = dir; + link_moving_against_diag_tile = 0; + Link_HandleMovingAnimation_FullLongEntry(); + uint16 org_x = link_x_coord, org_y = link_y_coord; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + Link_HandleMovingFloor(); + Link_ApplyConveyor(); + if (player_on_somaria_platform) + Link_HandleVelocityAndSandDrag(org_x, org_y); + link_y_vel = link_y_coord - link_y_coord_safe_return_lo; + link_x_vel = link_x_coord - link_x_coord_safe_return_lo; + Link_HandleCardinalCollision(); + HandleIndoorCameraAndDoors(); + return; + } + + if (link_animation_steps >= 6) + link_animation_steps = 0; + + link_dash_ctr--; + if (link_dash_ctr < 32) + link_dash_ctr = 32; + + AncillaAdd_DashDust(30, 0); + link_spin_attack_step_counter = 0; + + if ((uint8)(link_sword_type + 1) & 0xfe) + TileDetect_MainHandler(7); + + if (sram_progress_indicator) { + button_mask_b_y |= 0x80; + button_b_frames = 9; + } + + link_incapacitated_timer = 0; + if ((joypad1H_last & 0xf) && (joypad1H_last & 0xf) != kDashTab2[link_direction_facing >> 1]) { + link_player_handler_state = kPlayerState_StopDash; + button_mask_b_y &= ~0x80; + button_b_frames = 0; + link_delay_timer_spin_attack = 0; + LinkState_ExitingDash(); + return; + } + uint8 dir = force_move_any_direction & 0xf; + if (dir == 0) + dir = kDashTab2[link_direction_facing >> 1]; + link_direction = link_direction_last = dir; + Link_HandleDiagonalCollision(); + Link_HandleVelocity(); + Link_HandleCardinalCollision(); + Link_HandleMovingAnimation_FullLongEntry(); + fallhole_var1 = 0; + HandleIndoorCameraAndDoors(); +} + +void LinkState_ExitingDash() { // 87915e + CacheCameraPropertiesIfOutdoors(); + if (joypad1H_last & 0xf || link_countdown_for_dash >= 16) { + link_countdown_for_dash = 0; + link_speed_setting = 0; + link_player_handler_state = kPlayerState_Ground; + link_is_running = 0; + swimcoll_var5[0] &= 0xff00; + if (button_b_frames < 9) + link_cant_change_direction = 0; + } else { + link_countdown_for_dash++; + } + Link_HandleMovingAnimation_FullLongEntry(); +} + +void Link_CancelDash() { // 879195 + if (link_is_running) { + int i = 4; + do { + if (ancilla_type[i] == 0x1e) + ancilla_type[i] = 0; + } while (--i >= 0); + link_countdown_for_dash = 0; + link_speed_setting = 0; + link_is_running = 0; + link_cant_change_direction = 0; + swimcoll_var5[0] = 0; + } +} + +void RepelDash() { // 8791f1 + if (link_is_running && link_dash_ctr != 64) { + Link_ResetSwimmingState(); + AncillaAdd_DashTremor(29, 1); + Prepare_ApplyRumbleToSprites(); + if ((sound_effect_2 & 0x3f) != 27 && (sound_effect_2 & 0x3f) != 50) + Ancilla_Sfx3_Near(3); + LinkApplyTileRebound(); + } +} + +void LinkApplyTileRebound() { // 879222 + static const int8 kDashTab6Y[] = { 24, -24, 0, 0 }; + static const int8 kDashTab6X[] = { 0, 0, 24, -24 }; + static const int8 kDashTabSw11Y[] = { 1, 0, 0, 0 }; + static const int8 kDashTabSw11X[] = { 0, 0, 1, 0 }; + static const uint16 kDashTabSw7Y[] = { 384, 384, 0, 0, 256, 256, 0, 0 }; + static const uint16 kDashTabSw7X[] = { 0, 0, 384, 384, 0, 0, 256, 256 }; + static const uint8 kDashTabDir[] = { 8,4,2,1 }; + + link_actual_vel_y = kDashTab6Y[link_last_direction_moved_towards]; + link_actual_vel_x = kDashTab6X[link_last_direction_moved_towards]; + link_incapacitated_timer = 24; + link_actual_vel_z = link_actual_vel_z_copy = 36; + if (link_flag_moving) { + link_some_direction_bits = link_direction = kDashTabDir[link_last_direction_moved_towards]; + swimcoll_var11[0] = kDashTabSw11Y[link_last_direction_moved_towards]; + swimcoll_var11[1] = kDashTabSw11X[link_last_direction_moved_towards]; + + int i = (link_flag_moving - 1) * 4 + link_last_direction_moved_towards; + swimcoll_var7[0] = kDashTabSw7Y[i]; + swimcoll_var7[1] = kDashTabSw7X[i]; + } + link_auxiliary_state = 1; + link_want_make_noise_when_dashed = 1; + BYTE(scratch_1) = 0; + link_electrocute_on_touch = 0; + link_speed_setting = 0; + link_cant_change_direction = 0; + link_moving_against_diag_tile = 0; + if (link_last_direction_moved_towards & 2) + link_y_vel = 0; + else + link_x_vel = 0; +} + +void Sprite_RepelDash() { // 879291 + link_last_direction_moved_towards = link_direction_facing >> 1; + RepelDash(); +} + +void Flag67WithDirections() { // 8792a0 + link_direction = 0; + if (link_actual_vel_y) + link_direction |= sign8(link_actual_vel_y) ? 8 : 4; + if (link_actual_vel_x) + link_direction |= sign8(link_actual_vel_x) ? 2 : 1; +} + +void LinkState_Pits() { // 8792d3 + link_direction = 0; + if (fallhole_var1 && ++fallhole_var2 == 0x20) { + fallhole_var2 = 31; + } else { + if (!link_is_running) + goto aux_state; + if (link_countdown_for_dash) { + LinkState_Dashing(); + return; + } + if (joypad1H_last & 0xf && !(joypad1H_last & 0xf & link_direction)) { + Link_CancelDash(); +aux_state: + if (link_auxiliary_state != 1) + link_direction = joypad1H_last & 0xF; + } + } + TileDetect_MainHandler(4); + if (!(tiledetect_pit_tile & 1)) { + if (link_is_running) { + LinkState_Dashing(); + return; + } + link_speed_setting = 0; + Link_CancelDash(); + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction &= ~1; + player_near_pit_state = 0; + link_player_handler_state = !link_is_bunny_mirror ? kPlayerState_Ground : + link_item_moon_pearl ? kPlayerState_TempBunny : kPlayerState_PermaBunny; + if (link_player_handler_state == kPlayerState_PermaBunny) + PlayerHandler_17_Bunny(); + else if (link_player_handler_state == kPlayerState_TempBunny) + LinkState_TemporaryBunny(); + else + LinkState_Default(); + return; + } + + Player_TileDetectNearby(); + link_speed_setting = 4; + if (!(tiledetect_pit_tile & 0xf)) { + player_near_pit_state = 0; + link_speed_setting = 0; + link_player_handler_state = !link_is_bunny_mirror ? kPlayerState_Ground : + link_item_moon_pearl ? kPlayerState_TempBunny : kPlayerState_PermaBunny; + Link_CancelDash(); + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction &= ~1; + return; + } + + static const uint8 kFallHolePitDirs[] = { 12, 3, 10, 5 }; + static const uint8 kFallHoleDirs[] = { 5, 6, 9, 10, 4, 8, 1, 2 }; + static const uint8 kFallHoleDirs2[] = { 10, 9, 6, 5, 8, 4, 2, 1 }; + + if ((tiledetect_pit_tile & 0xf) != 0xf) { + int i = 3; + do { + if ((tiledetect_pit_tile & 0xf) == kFallHolePitDirs[i]) { + i += 4; + goto endif_1; + } + } while (--i >= 0); + + i = 3; + uint8 pit_tile; + pit_tile= tiledetect_pit_tile; + while (!(pit_tile & 1)) { + i -= 1; + pit_tile >>= 1; + } + assert(i >= 0); +endif_1: + byte_7E02C9 = i; + if (link_direction & kFallHoleDirs[i]) { + link_direction_last = link_direction; + link_speed_setting = 6; + Link_HandleMovingAnimation_FullLongEntry(); + } else { + uint8 old_dir = link_direction; + link_direction |= kFallHoleDirs2[byte_7E02C9]; + if (old_dir) + Link_HandleMovingAnimation_FullLongEntry(); + } + Link_HandleDiagonalCollision(); + Link_HandleVelocity(); + Link_HandleCardinalCollision(); + ApplyLinksMovementToCamera(); + return; + } + if (player_near_pit_state != 2) { + if (link_item_moon_pearl) { + link_need_for_poof_for_transform = 0; + link_is_bunny = 0; + link_is_bunny_mirror = 0; + link_timer_tempbunny = 0; + } + link_direction = 0; + player_near_pit_state = 2; + link_disable_sprite_damage = 1; + button_mask_b_y = 0; + button_b_frames = 0; + link_item_in_hand = 0; + link_position_mode = 0; + link_incapacitated_timer = 0; + link_auxiliary_state = 0; + Ancilla_Sfx3_Near(31); + } + + link_cant_change_direction = 0; + link_incapacitated_timer = 0; + link_z_coord = 0; + link_actual_vel_z = 0; + link_auxiliary_state = 0; + link_give_damage = 0; + link_is_transforming = 0; + Link_ForceUnequipCape_quietly(); + link_disable_sprite_damage++; + if (!sign8(--byte_7E005C)) + return; + uint8 x = ++link_this_controls_sprite_oam; + byte_7E005C = 9; + if (savegame_tagalong != 13 && x == 1) + tagalong_var5 = x; + + if (x == 6) { + Link_CancelDash(); + submodule_index = 7; + link_this_controls_sprite_oam = 6; + player_near_pit_state = 3; + link_visibility_status = 12; + link_speed_modifier = 16; + uint16 y = (uint8)(link_y_coord - BG2VOFS_copy2); + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + some_animation_timer = 0; + if (player_is_indoors) { + BYTE(dungeon_room_index_prev) = dungeon_room_index; + Dungeon_FlagRoomData_Quadrants(); + if (Dungeon_IsPitThatHurtsPlayer()) { + DungeonPitDoDamage(); + return; + } + } + BYTE(dungeon_room_index_prev) = dungeon_room_index; + BYTE(dungeon_room_index) = dung_hdr_travel_destinations[0]; + tiledetect_which_y_pos[0] = link_y_coord; + link_y_coord = link_y_coord - y - 0x10; + if (player_is_indoors) { + HandleLayerOfDestination(); + } else { + if ((uint8)overworld_screen_index != 5) { + Overworld_GetPitDestination(); + main_module_index = 17; + submodule_index = 0; + subsubmodule_index = 0; + } else { + TakeDamageFromPit(); + } + } + } +} + +void HandleLayerOfDestination() { // 8794f1 + link_is_on_lower_level_mirror = (dung_hdr_hole_teleporter_plane >= 1); + link_is_on_lower_level = (dung_hdr_hole_teleporter_plane >= 2); +} + +void DungeonPitDoDamage() { // 879502 + submodule_index = 20; + link_health_current -= 8; + if (link_health_current >= 0xa8) + link_health_current = 0; +} + +void HandleDungeonLandingFromPit() { // 879520 + LinkOam_Main(); + link_x_coord_prev = link_x_coord; + link_y_coord_prev = link_y_coord; + if (submodule_index == 7) + link_visibility_status = 0; + if (!(frame_counter & 3) && ++link_this_controls_sprite_oam == 10) + link_this_controls_sprite_oam = 6; + link_direction = 4; + Link_HandleVelocity(); + if (sign16(link_y_coord) && !sign16(tiledetect_which_y_pos[0])) { + if (!sign16(-link_y_coord + tiledetect_which_y_pos[0])) + return; + } else { + if (tiledetect_which_y_pos[0] >= link_y_coord) + return; + } + link_y_coord = tiledetect_which_y_pos[0]; + link_animation_steps = 0; + link_speed_modifier = 0; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 0; + link_speed_setting = 0; + subsubmodule_index = 0; + submodule_index = 0; + link_disable_sprite_damage = 0; + if (savegame_tagalong != 0 && savegame_tagalong != 3) { + tagalong_var5 = 0; + if (savegame_tagalong == 13) { + savegame_tagalong = 0; + super_bomb_indicator_unk2 = 0; + super_bomb_indicator_unk1 = 0; + super_bomb_going_off = 0; + } else { + Follower_Initialize(); + } + } + TileDetect_MainHandler(0); + if (tiledetect_shallow_water & 1) + Ancilla_Sfx2_Near(0x24); + Player_TileDetectNearby(); + if ((sound_effect_1 & 0x3f) != 0x24) + Ancilla_Sfx2_Near(0x21); + + if (dung_hdr_collision_2 == 2 && (tiledetect_water_staircase & 0xf)) + byte_7E0322 = 3; + if ((tiledetect_deepwater & 0xf) == 0xf) { + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_is_on_lower_level = 1; + AncillaAdd_Splash(0x15, 1); + link_player_handler_state = kPlayerState_Swimming; + Link_ForceUnequipCape_quietly(); + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + link_speed_setting = 0; + } else { + link_player_handler_state = (tiledetect_pit_tile & 0xf) ? kPlayerState_FallingIntoHole : kPlayerState_Ground; + } +} + +void PlayerHandler_04_Swimming() { // 87963b + if (link_auxiliary_state) { + link_player_handler_state = kPlayerState_RecoilWall; + link_z_coord &= 0xff; + ResetAllAcceleration(); + link_maybe_swim_faster = 0; + link_swim_hard_stroke = 0; + link_cant_change_direction &= ~1; + LinkState_Recoil(); + return; + } + + button_mask_b_y = 0; + button_b_frames = 0; + link_delay_timer_spin_attack = 0; + link_spin_attack_step_counter = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + if (!link_item_flippers) + return; + + if (!(swimcoll_var7[0] | swimcoll_var7[1])) { + if ((uint8)swimcoll_var5[0] != 2 && (uint8)swimcoll_var5[1] != 2) + ResetAllAcceleration(); + link_animation_steps &= 1; + if (++link_counter_var1 >= 16) { + link_counter_var1 = 0; + byte_7E02CC = 0; + link_animation_steps = (link_animation_steps & 1) ^ 1; + } + } else { + if (++link_counter_var1 >= 8) { + link_counter_var1 = 0; + link_animation_steps = (link_animation_steps + 1) & 3; + byte_7E02CC = kSwimmingTab1[link_animation_steps]; + } + } + + if (!link_swim_hard_stroke) { + uint8 t; + if (!(swimcoll_var7[0] | swimcoll_var7[1]) || (t = ((filtered_joypad_L & 0x80) | filtered_joypad_H) & 0xc0) == 0) { + Link_HandleSwimMovements(); + return; + } + link_swim_hard_stroke = t; + Ancilla_Sfx2_Near(37); + link_maybe_swim_faster = 1; + swimming_countdown = 7; + Link_HandleSwimAccels(); + } + if (sign8(--swimming_countdown)) { + swimming_countdown = 7; + if (++link_maybe_swim_faster == 5) { + link_maybe_swim_faster = 0; + link_swim_hard_stroke &= ~0xC0; + } + } + + Link_HandleSwimMovements(); +} + +void Link_HandleSwimMovements() { // 879715 + uint8 t; + + if (!(t = force_move_any_direction & 0xf) && !(t = joypad1H_last & 0xf)) { + link_y_vel = link_x_vel = 0; + Link_FlagMaxAccels(); + if (link_flag_moving) { + if (link_is_running) { + t = link_some_direction_bits; + } else { + if (!(swimcoll_var7[0] | swimcoll_var7[1])) { + bitmask_of_dragstate = 0; + Link_ResetSwimmingState(); + } + goto out; + } + } else { + if (link_player_handler_state != kPlayerState_Swimming) + link_animation_steps = 0; + goto out; + } + } + + if (t != link_some_direction_bits) { + link_some_direction_bits = t; + link_subpixel_x = link_subpixel_y = 0; + link_moving_against_diag_tile = 0; + bitmask_of_dragstate = 0; + } + Link_SetIceMaxAccel(); + Link_SetMomentum(); + Link_SetTheMaxAccel(); +out: + Link_HandleDiagonalCollision(); + Link_HandleVelocity(); + Link_HandleCardinalCollision(); + Link_HandleMovingAnimation_FullLongEntry(); + fallhole_var1 = 0; + HandleIndoorCameraAndDoors(); +} + +void Link_FlagMaxAccels() { // 879785 + if (!link_flag_moving) + return; + for (int i = 1; i >= 0; i--) { + if (swimcoll_var7[i]) { + swimcoll_var9[i] = swimcoll_var7[i]; + swimcoll_var5[i] = 1; + } + } +} + +void Link_SetIceMaxAccel() { // 8797a6 + if (!link_flag_moving) + return; + swimcoll_var9[0] = 0x180; + swimcoll_var9[1] = 0x180; +} + +void Link_SetMomentum() { // 8797c7 + uint8 joy = joypad1H_last & 0xf; + uint8 mask = 12, bit = 8; + for (int i = 0; i < 2; i++, mask >>= 2, bit >>= 2) { + if (joy & mask) { + swimcoll_var3[i] = link_flag_moving ? kSwimmingTab2[link_flag_moving - 1] : 32; + if (((link_some_direction_bits | link_direction) & mask) == mask) { + swimcoll_var5[i] = 2; + } else { + swimcoll_var11[i] = (joy & bit) ? 0 : 1; + swimcoll_var5[i] = 0; + } + if (!swimcoll_var9[i]) + swimcoll_var9[i] = 240; + } + } +} + +void Link_ResetSwimmingState() { // 87983a + swimming_countdown = 0; + link_swim_hard_stroke = 0; + link_maybe_swim_faster = 0; + ResetAllAcceleration(); +} + +void Link_ResetStateAfterDamagingPit() { // 87984b + Link_ResetSwimmingState(); + link_player_handler_state = link_is_bunny && !link_item_moon_pearl ? + kPlayerState_PermaBunny : kPlayerState_Ground; + link_direction_last = link_some_direction_bits; + link_is_in_deep_water = 0; + link_disable_sprite_damage = 0; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 0; +} + +void ResetAllAcceleration() { // 879873 + swimcoll_var1[0] = 0; + swimcoll_var1[1] = 0; + swimcoll_var3[0] = 0; + swimcoll_var3[1] = 0; + swimcoll_var5[0] = 0; + swimcoll_var5[1] = 0; + swimcoll_var7[0] = 0; + swimcoll_var7[1] = 0; + swimcoll_var9[0] = 0; + swimcoll_var9[1] = 0; +} + +void Link_HandleSwimAccels() { // 8798a8 + static const uint16 kSwimmingTab3[] = { 128, 160, 192, 224, 256, 288, 320, 352, 384 }; + uint8 mask = 12; + for (int i = 0; i < 2; i++, mask >>= 2) { + if (joypad1H_last & mask) { + if (swimcoll_var7[i] && swimcoll_var9[i] >= 384) { + uint16 t; + for (int j = 0; j < 9 && (t = kSwimmingTab3[j]) < swimcoll_var7[i]; j++) {} + swimcoll_var9[i] = t; + } else { + uint16 t = swimcoll_var9[i]; + if (t) { + t += 160; + if (t >= 384) + t = 384; + swimcoll_var9[i] = t; + } else { + swimcoll_var7[i] = 1; + swimcoll_var9[i] = 240; + } + } + } + } +} + +void Link_SetTheMaxAccel() { // 879903 + if (link_flag_moving || link_swim_hard_stroke) + return; + uint8 mask = 12; + for (int i = 0; i < 2; i++, mask >>= 2) { + if ((joypad1H_last & mask) && swimcoll_var5[i] != 2) { + if (swimcoll_var1[i] || swimcoll_var7[i] >= 240 && swimcoll_var7[i] >= swimcoll_var9[i]) { + swimcoll_var5[i] = 0; + if (swimcoll_var7[i] >= 240) { + swimcoll_var1[i] = 1; + swimcoll_var5[i] = 1; + } else { + swimcoll_var9[i] = 240; + swimcoll_var1[i] = 0; + } + } + } else { + swimcoll_var9[i] = 240; + swimcoll_var1[i] = 0; + } + } +} + +void LinkState_Zapped() { // 87996c + CacheCameraPropertiesIfOutdoors(); + LinkZap_HandleMosaic(); + if (!sign8(--link_delay_timer_spin_attack)) + return; + link_delay_timer_spin_attack = 2; + player_handler_timer++; + if (player_handler_timer & 1) + Palette_ElectroThemedGear(); + else + LoadActualGearPalettes(); + if (player_handler_timer == 8) { + player_handler_timer = 0; + link_player_handler_state = kPlayerState_Ground; + link_disable_sprite_damage = 0; + link_electrocute_on_touch = 0; + link_auxiliary_state = 0; + Player_SetCustomMosaicLevel(0); + } +} + +void PlayerHandler_15_HoldItem() { // 8799ac + // empty by design +} + +void Link_ReceiveItem(uint8 item, int chest_position) { // 8799ad + if (link_auxiliary_state) { + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + countdown_for_blink = 0; + link_state_bits = 0; + } + link_receiveitem_index = item; + if (item == 0x3e) + Ancilla_Sfx3_Near(0x2e); + link_receiveitem_var1 = 0x60; + if (item_receipt_method == 0 || item_receipt_method == 3) { + link_state_bits = 0; + button_mask_b_y = 0; + bitfield_for_a_button = 0; + button_b_frames = 0; + link_speed_setting = 0; + link_cant_change_direction = 0; + link_item_in_hand = 0; + link_position_mode = 0; + player_handler_timer = 0; + link_player_handler_state = kPlayerState_HoldUpItem; + link_pose_for_item = 1; + link_disable_sprite_damage = 1; + if (item == 0x20) + link_pose_for_item = 2; + } + AncillaAdd_ItemReceipt(0x22, 4, chest_position); + if (item != 0x20 && item != 0x37 && item != 0x38 && item != 0x39) + Hud_RefreshIcon(); + Link_CancelDash(); +} + +void Link_TuckIntoBed() { // 879a2c + link_y_coord = 0x215a; + link_x_coord = 0x940; + link_player_handler_state = kPlayerState_AsleepInBed; + player_sleep_in_bed_state = 0; + link_pose_during_opening = 0; + link_countdown_for_dash = 3; + AncillaAdd_Blanket(0x20); +} + +void LinkState_Sleeping() { // 879a5a + switch (player_sleep_in_bed_state) { + case 0: + if (!(frame_counter & 0x1f)) + AncillaAdd_Snoring(0x21, 1); + break; + case 1: + if (submodule_index == 0 && sign8(--link_countdown_for_dash)) { + link_countdown_for_dash = 0; + if (((filtered_joypad_H & 0xe0) | (filtered_joypad_H << 4) | filtered_joypad_L) & 0xf0) { + link_pose_during_opening++; + link_direction_facing = 6; + player_sleep_in_bed_state++; + link_countdown_for_dash = 4; + } + } + break; + case 2: + if (sign8(--link_countdown_for_dash)) { + link_actual_vel_y = 4; + link_actual_vel_x = 21; + link_actual_vel_z = 24; + link_actual_vel_z_copy = 24; + link_incapacitated_timer = 16; + link_auxiliary_state = 2; + link_player_handler_state = kPlayerState_RecoilOther; + } + break; + } +} + +void Link_HandleSwordCooldown() { // 879ac2 + if (!sign8(--link_sword_delay_timer)) + return; + + link_sword_delay_timer = 0; + if (link_item_in_hand | link_position_mode) + return; + + if (button_b_frames < 9) { + if (!link_is_running) + Link_CheckForSwordSwing(); + } else { + HandleSwordControls(); + } + +} + +void Link_HandleYItem() { // 879b0e + if (button_b_frames && button_b_frames < 9) + return; + + if (link_is_bunny_mirror && (eq_selected_y_item != 11 && eq_selected_y_item != 20)) + return; + + if (byte_7E03FC && !link_is_bunny_mirror) { + if (byte_7E03FC == 2) + LinkItem_Bow(); + else + LinkItem_Shovel(); + return; + } + + if (eq_selected_y_item != eq_selected_y_item_copy) { + if (eq_selected_y_item_copy == 8 && (link_item_flute & 2)) + button_mask_b_y &= ~0x40; + if (eq_selected_y_item_copy == 19 && link_cape_mode) + Link_ForceUnequipCape(); + } + + if ((link_item_in_hand | link_position_mode) == 0) + eq_selected_y_item_copy = eq_selected_y_item; + + if (eq_selected_y_item_copy == 5 || eq_selected_y_item_copy == 6) + eq_selected_rod = eq_selected_y_item_copy - 5 + 1; + + switch (eq_selected_y_item_copy) { + case 0: + break; + case 1: LinkItem_Bombs(); break; + case 2: LinkItem_Boomerang(); break; + case 3: LinkItem_Bow(); break; + case 4: LinkItem_Hammer(); break; + case 5: LinkItem_Rod(); break; + case 6: LinkItem_Rod(); break; + case 7: LinkItem_Net(); break; + case 8: LinkItem_ShovelAndFlute(); break; + case 9: LinkItem_Lamp(); break; + case 10: LinkItem_Powder(); break; + case 11: LinkItem_Bottle(); break; + case 12: LinkItem_Book(); break; + case 13: LinkItem_CaneOfByrna(); break; + case 14: LinkItem_Hookshot(); break; + case 15: LinkItem_Bombos(); break; + case 16: LinkItem_Ether(); break; + case 17: LinkItem_Quake(); break; + case 18: LinkItem_CaneOfSomaria(); break; + case 19: LinkItem_Cape(); break; + case 20: LinkItem_Mirror(); break; + default: + assert(0); + } +} + +void Link_HandleAPress() { // 879baa + flag_is_sprite_to_pick_up_cached = 0; + if (link_item_in_hand || (link_position_mode & 0x1f) || byte_7E0379) + return; + + if (button_b_frames < 9 && (button_mask_b_y & 0x80)) + return; + + uint8 action = tile_action_index; + + if ((link_state_bits | link_grabbing_wall) == 0) { + if (!Link_CheckNewAPress()) { + bitfield_for_a_button = 0; + return; + } + + if (link_need_for_pullforrupees_sprite && !link_direction_facing) { + action = 7; + } else if (link_is_near_moveable_statue) { + action = 6; + } else { + if (!flag_is_ancilla_to_pick_up) { + if (!flag_is_sprite_to_pick_up) { + action = Link_HandleLiftables(); + goto attempt_action; + } + flag_is_sprite_to_pick_up_cached = flag_is_sprite_to_pick_up; + } + + if (button_b_frames) + Link_ResetSwordAndItemUsage(); + + if (link_item_in_hand | link_position_mode) { + link_item_in_hand = 0; + link_position_mode = 0; + Link_ResetBoomerangYStuff(); + flag_for_boomerang_in_place = 0; + if (ancilla_type[0] == 5) + ancilla_type[0] = 0; + } + action = 1; + } +attempt_action: + static const uint8 kAbilityBitmasks[] = { 0xE0, 0x40, 4, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0 }; + if (!(kAbilityBitmasks[action] & link_ability_flags)) { + bitfield_for_a_button = 0; + return; + } + + tile_action_index = action; + Link_APress_PerformBasic(action * 2); + } + + // actionInProgress + unused_2 = tile_action_index; + switch (tile_action_index) { + case 1: Link_APress_LiftCarryThrow(); break; + case 3: Link_APress_PullObject(); break; + case 6: Link_APress_StatueDrag(); break; + } +} + +void Link_APress_PerformBasic(uint8 action_x2) { // 879c5f + switch (action_x2 >> 1) { + case 0: Link_PerformDesertPrayer(); return; + case 1: Link_PerformThrow(); return; + case 2: Link_PerformDash(); return; + case 3: Link_PerformGrab(); return; + case 4: Link_PerformRead(); return; + case 5: Link_PerformOpenChest(); return; + case 6: Link_PerformStatueDrag(); return; + case 7: Link_PerformRupeePull(); return; + default: + assert(0); + } +} + +void HandleSwordSfxAndBeam() { // 879c66 + link_direction &= ~0xf; + button_b_frames = 0; + link_spin_attack_step_counter = 0; + + uint8 health = link_health_capacity - 4; + if (health < link_health_current && ((link_sword_type + 1) & 0xfe) && link_sword_type >= 2) { + int i = 4; + while (ancilla_type[i] != 0x31) { + if (--i < 0) { + AddSwordBeam(0); + break; + } + } + } + uint8 sword = link_sword_type - 1; + if (sword != 0xfe && sword != 0xff) + sound_effect_1 = kFireBeamSounds[sword] | Link_CalculateSfxPan(); + link_delay_timer_spin_attack = 1; +} + +void Link_CheckForSwordSwing() { // 879cd9 + if (bitfield_for_a_button & 0x10) + return; + + if (!(button_mask_b_y & 0x80)) { + if (!(filtered_joypad_H & 0x80)) + return; + if (is_standing_in_doorway) { + TileDetect_SwordSwingDeepInDoor(is_standing_in_doorway); + if ((R14 & 0x30) == 0x30) + return; + } + button_mask_b_y |= 0x80; + HandleSwordSfxAndBeam(); + link_cant_change_direction |= 1; + link_animation_steps = 0; + } + + if (!(joypad1H_last & 0x80)) + button_mask_b_y |= 1; + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (sign8(--link_delay_timer_spin_attack)) { + if (++button_b_frames >= 9) { + HandleSwordControls(); + return; + } + link_delay_timer_spin_attack = kSpinAttackDelays[button_b_frames]; + if (button_b_frames == 5) { + if (link_sword_type != 0 && link_sword_type != 1 && link_sword_type != 0xff) + AncillaAdd_SwordSwingSparkle(0x26, 4); + if (link_sword_type != 0 && link_sword_type != 0xff) + TileDetect_MainHandler(link_sword_type == 1 ? 1 : 6); + } else if (button_b_frames >= 4 && (button_mask_b_y & 1) && (joypad1H_last & 0x80)) { + button_mask_b_y &= ~1; + HandleSwordSfxAndBeam(); + return; + } + } + CalculateSwordHitBox(); +} + +void HandleSwordControls() { // 879d72 + if (joypad1H_last & 0x80) { + Player_Sword_SpinAttackJerks_HoldDown(); + } else { + if (link_spin_attack_step_counter < 48) { + Link_ResetSwordAndItemUsage(); + } else { + Link_ResetSwordAndItemUsage(); + link_spin_attack_step_counter = 0; + Link_ActivateSpinAttack(); + } + } +} + +void Link_ResetSwordAndItemUsage() { // 879d84 + link_speed_setting = 0; + bitmask_of_dragstate &= ~9; + link_delay_timer_spin_attack = 0; + button_b_frames = 0; + button_mask_b_y &= ~0x81; + link_cant_change_direction &= ~1; +} + +void Player_Sword_SpinAttackJerks_HoldDown() { // 879d9f + if ((bitmask_of_dragstate & 0x80) || (bitmask_of_dragstate & 9) == 0) { + if (set_when_damaging_enemies == 0) { + button_b_frames = 9; + link_cant_change_direction |= 1; + link_delay_timer_spin_attack = 0; + if (link_speed_setting != 4 && link_speed_setting != 16) { + link_speed_setting = 12; + if (!((uint8)(link_sword_type + 1) & ~1)) + return; + int i = 4; + do { + if (ancilla_type[i] == 0x30 || ancilla_type[i] == 0x31) + return; + } while (--i >= 0); + + if (link_spin_attack_step_counter >= 6 && (frame_counter & 3) == 0) + AncillaSpawn_SwordChargeSparkle(); + + if (link_spin_attack_step_counter < 64 && ++link_spin_attack_step_counter == 48) { + Ancilla_Sfx2_Near(55); + AncillaAdd_ChargedSpinAttackSparkle(); + } + } else { + CalculateSwordHitBox(); + } + return; + } else if (set_when_damaging_enemies == 1) { + Link_ResetSwordAndItemUsage(); + return; + } + } + // endif_2 + if (button_b_frames == 9) { + button_b_frames = 10; + link_delay_timer_spin_attack = kSpinAttackDelays[button_b_frames]; + } + + if (sign8(--link_delay_timer_spin_attack)) { + uint8 frames = button_b_frames + 1; + if (frames == 13) { + if ((uint8)(link_sword_type + 1) & ~1 && (bitmask_of_dragstate & 9)) { + AncillaAdd_WallTapSpark(27, 1); + Ancilla_Sfx2_Near((bitmask_of_dragstate & 8) ? 6 : 5); + TileDetect_MainHandler(1); + } + frames = 10; + } + button_b_frames = frames; + link_delay_timer_spin_attack = kSpinAttackDelays[button_b_frames]; + } + CalculateSwordHitBox(); +} + +void LinkItem_Rod() { // 879eef + static const uint8 kRodAnimDelays[] = { 3, 3, 5 }; + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + if (!LinkCheckMagicCost(0)) + goto out; + link_debug_value_2 = 1; + if (eq_selected_rod == 1) + AncillaAdd_FireRodShot(2, 1); + else + AncillaAdd_IceRodShot(11, 1); + link_delay_timer_spin_attack = kRodAnimDelays[0]; + link_animation_steps = 0; + player_handler_timer = 0; + link_item_in_hand = 1; + } + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer++; + + link_delay_timer_spin_attack = kRodAnimDelays[player_handler_timer]; + if (player_handler_timer != 3) + return; + link_debug_value_2 = 0; + link_speed_setting = 0; + player_handler_timer = 0; + link_delay_timer_spin_attack = 0; + link_item_in_hand &= ~1; +out: + button_mask_b_y &= ~0x40; +} + +void LinkItem_Hammer() { // 879f7b + static const uint8 kHammerAnimDelays[] = { 3, 3, 16 }; + if (link_item_in_hand & 0x10) + return; + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !(filtered_joypad_H & 0x40)) + return; + button_mask_b_y |= 0x40; + link_delay_timer_spin_attack = kHammerAnimDelays[0]; + link_cant_change_direction |= 1; + link_animation_steps = 0; + player_handler_timer = 0; + link_item_in_hand = 2; + } + + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer++; + + link_delay_timer_spin_attack = kHammerAnimDelays[player_handler_timer]; + if (player_handler_timer == 1) { + TileDetect_MainHandler(3); + Ancilla_AddHitStars(22, 0); + if (sound_effect_1 == 0) { + Ancilla_Sfx2_Near(16); + SpawnHammerWaterSplash(); + } + } else if (player_handler_timer == 3) { + player_handler_timer = 0; + link_delay_timer_spin_attack = 0; + button_mask_b_y &= ~0x40; + link_cant_change_direction &= ~1; + link_item_in_hand &= ~2; + } +} + +void LinkItem_Bow() { // 87a006 + static const uint8 kBowDelays[] = { 3, 3, 8 }; + + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + link_cant_change_direction |= 1; + link_delay_timer_spin_attack = kBowDelays[0]; + link_animation_steps = 0; + player_handler_timer = 0; + link_item_in_hand = 16; + } + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer++; + + link_delay_timer_spin_attack = kBowDelays[player_handler_timer]; + if (player_handler_timer != 3) + return; + + int obj = AncillaAdd_Arrow(9, link_direction_facing, 2, link_x_coord, link_y_coord); + if (obj >= 0) { + if (archery_game_arrows_left) { + archery_game_arrows_left--; + link_num_arrows += 2; + } + if (!archery_game_out_of_arrows && link_num_arrows) { + if (--link_num_arrows == 0) + Hud_RefreshIcon(); + } else { + ancilla_type[obj] = 0; + Ancilla_Sfx2_Near(60); + } + } + + player_handler_timer = 0; + link_delay_timer_spin_attack = 0; + button_mask_b_y &= ~0x40; + link_cant_change_direction &= ~1; + link_item_in_hand &= ~0x10; + if (button_b_frames >= 9) + button_b_frames = 9; +} + +void LinkItem_Boomerang() { // 87a0bb + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress() || flag_for_boomerang_in_place) + return; + link_animation_steps = 0; + link_item_in_hand = 0x80; + player_handler_timer = 0; + link_delay_timer_spin_attack = 7; + + int s0 = AncillaAdd_Boomerang(5, 0); + + if (button_b_frames >= 9) { + Link_ResetBoomerangYStuff(); + return; + } + + if (!s0) { + link_direction_last = joypad1H_last & 0xf; + } else { + link_cant_change_direction |= 1; + } + } else { + link_cant_change_direction |= 1; + } + + if (link_item_in_hand) { + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + link_delay_timer_spin_attack = 5; + if (++player_handler_timer != 2) + return; + } + Link_ResetBoomerangYStuff(); +} + +void Link_ResetBoomerangYStuff() { // 87a11f + link_item_in_hand = 0; + player_handler_timer = 0; + link_delay_timer_spin_attack = 0; + button_mask_b_y &= ~0x40; + if (!(button_mask_b_y & 0x80)) + link_cant_change_direction &= ~1; +} + +void LinkItem_Bombs() { // 87a138 + if (is_standing_in_doorway || savegame_tagalong == 13 || !CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + AncillaAdd_Bomb(7, 1); + link_item_in_hand = 0; +} + +void LinkItem_Bottle() { // 87a15b + if (!CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + int btidx = link_item_bottles - 1; + uint8 b = link_bottle_info[btidx]; + if (b == 0) + return; + if (b < 3) { +fail: + Ancilla_Sfx2_Near(60); + } else if (b == 3) { // red potion + if (link_health_capacity == link_health_current) + goto fail; + link_bottle_info[btidx] = 2; + link_item_in_hand = 0; + submodule_index = 4; + saved_module_for_menu = main_module_index; + main_module_index = 14; + animate_heart_refill_countdown = 7; + Hud_Rebuild(); + } else if (b == 4) { // green potion + if (link_magic_power == 128) + goto fail; + link_bottle_info[btidx] = 2; + link_item_in_hand = 0; + submodule_index = 8; + saved_module_for_menu = main_module_index; + main_module_index = 14; + animate_heart_refill_countdown = 7; + Hud_Rebuild(); + } else if (b == 5) { // blue potion + if (link_health_capacity == link_health_current && link_magic_power == 128) + goto fail; + link_bottle_info[btidx] = 2; + link_item_in_hand = 0; + submodule_index = 9; + saved_module_for_menu = main_module_index; + main_module_index = 14; + animate_heart_refill_countdown = 7; + Hud_Rebuild(); + } else if (b == 6) { // fairy + link_item_in_hand = 0; + if (ReleaseFairy() < 0) + goto fail; + link_bottle_info[btidx] = 2; + Hud_Rebuild(); + } else if (b == 7) { // bee + if (!ReleaseBeeFromBottle()) + goto fail; + link_bottle_info[btidx] = 2; + Hud_Rebuild(); + } +} + +void LinkItem_Lamp() { // 87a24d + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + if (link_item_torch && LinkCheckMagicCost(6)) { + AncillaAdd_MagicPowder(0x1a, 0); + Dungeon_LightTorch(); + AncillaAdd_LampFlame(0x2f, 2); + } + link_item_in_hand = 0; + button_mask_b_y = 0; + button_b_frames = 0; + link_cant_change_direction = 0; + if (button_b_frames == 9) + link_speed_setting = 0; +} + +void LinkItem_Powder() { // 87a293 + static const uint8 kMushroomTimer[] = { 2, 1, 1, 3, 2, 2, 2, 2, 6, 0 }; + + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + if (link_item_mushroom != 2) { + Ancilla_Sfx2_Near(60); + goto out; + } + if (!LinkCheckMagicCost(2)) + goto out; + link_delay_timer_spin_attack = kMushroomTimer[0]; + player_handler_timer = 0; + link_animation_steps = 0; + link_direction &= ~0xf; + link_item_in_hand = 0x40; + } + link_x_vel = link_y_vel = 0; + link_direction = 0; + link_subpixel_x = link_subpixel_y = 0; + link_moving_against_diag_tile = 0; + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer++; + link_delay_timer_spin_attack = kMushroomTimer[player_handler_timer]; + if (player_handler_timer == 4) + AncillaAdd_MagicPowder(26, 0); + if (player_handler_timer != 9) + return; + if (submodule_index == 0) + TileDetect_MainHandler(1); +out: + link_item_in_hand = 0; + player_handler_timer = 0; + button_mask_b_y &= ~0x40; +} + +void LinkItem_ShovelAndFlute() { // 87a313 + if (link_item_flute == 1) + LinkItem_Shovel(); + else if (link_item_flute != 0) + LinkItem_Flute(); +} + +void LinkItem_Shovel() { // 87a32c + static const uint8 kShovelAnimDelay[] = { 7, 18, 16, 7, 18, 16 }; + static const uint8 kShovelAnimDelay2[] = { 0, 1, 2, 0, 1, 2 }; + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + + link_delay_timer_spin_attack = kShovelAnimDelay[0]; + link_var30d = 0; + player_handler_timer = 0; + link_position_mode = 1; + link_cant_change_direction |= 1; + link_animation_steps = 0; + } + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + link_var30d++; + link_delay_timer_spin_attack = kShovelAnimDelay[link_var30d]; + player_handler_timer = kShovelAnimDelay2[link_var30d]; + + if (player_handler_timer == 1) { + TileDetect_MainHandler(2); + if (BYTE(word_7E04B2)) { + Ancilla_Sfx3_Near(27); + AncillaAdd_DugUpFlute(54, 0); + } + + if (!((tiledetect_thick_grass | tiledetect_destruction_aftermath) & 1)) { + Ancilla_AddHitStars(22, 0); // hit stars + Ancilla_Sfx2_Near(5); + } else { + AncillaAdd_ShovelDirt(23, 0); // shovel dirt + if (byte_7E03FC) + DiggingGameGuy_AttemptPrizeSpawn(); + Ancilla_Sfx2_Near(18); + } + } + + if (link_var30d == 3) { + link_var30d = 0; + player_handler_timer = 0; + button_mask_b_y &= 0x80; + link_position_mode = 0; + link_cant_change_direction &= ~1; + } +} + +void LinkItem_Flute() { // 87a3db + if (button_mask_b_y & 0x40) { + if (--flute_countdown) + return; + button_mask_b_y &= ~0x40; + } + if (!CheckYButtonPress()) + return; + flute_countdown = 128; + Ancilla_Sfx2_Near(19); + if (player_is_indoors || overworld_screen_index & 0x40 || main_module_index == 11) + return; + int i = 4; + do { + if (ancilla_type[i] == 0x27) + return; + } while (--i >= 0); + if (link_item_flute == 2) { + if (overworld_screen_index == 0x18 && link_y_coord >= 0x760 && link_y_coord < 0x7e0 && link_x_coord >= 0x1cf && link_x_coord < 0x230) { + submodule_index = 45; + AncillaAdd_ExplodingWeatherVane(55, 0); + } + } else { + AncillaAdd_Duck_take_off(39, 4); + link_need_for_pullforrupees_sprite = 0; + } +} + +void LinkItem_Book() { // 87a471 + if (button_mask_b_y & 0x40 || is_standing_in_doorway || !CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + if (byte_7E02ED) { + Link_PerformDesertPrayer(); + } else { + Ancilla_Sfx2_Near(60); + } +} + +void LinkItem_Ether() { // 87a494 + if (!CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + + if (is_standing_in_doorway || flag_block_link_menu || dung_savegame_state_bits & 0x8000 || !((uint8)(link_sword_type + 1) & ~1) || + super_bomb_going_off && savegame_tagalong == 13) { + Ancilla_Sfx2_Near(60); + return; + } + + if (ancilla_type[0] | ancilla_type[1] | ancilla_type[2]) + return; + + if (!LinkCheckMagicCost(1)) + return; + link_player_handler_state = kPlayerState_Ether; + link_cant_change_direction |= 1; + link_delay_timer_spin_attack = kEtherAnimDelays[0]; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + byte_7E0324 = 0; + Ancilla_Sfx3_Near(35); +} + +void LinkState_UsingEther() { // 87a50f + flag_unk1++; + if (!sign8(--link_delay_timer_spin_attack)) + return; + + step_counter_for_spin_attack++; + if (step_counter_for_spin_attack == 4) { + Ancilla_Sfx3_Near(35); + } else if (step_counter_for_spin_attack == 9) { + Ancilla_Sfx2_Near(44); + } else if (step_counter_for_spin_attack == 12) { + step_counter_for_spin_attack = 10; + } + link_delay_timer_spin_attack = kEtherAnimDelays[step_counter_for_spin_attack]; + state_for_spin_attack = kEtherAnimStates[step_counter_for_spin_attack]; + if (!byte_7E0324 && step_counter_for_spin_attack == 10) { + byte_7E0324 = 1; + AncillaAdd_EtherSpell(24, 0); + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + } +} + +void LinkItem_Bombos() { // 87a569 + if (!CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + + if (is_standing_in_doorway || flag_block_link_menu || dung_savegame_state_bits & 0x8000 || !((uint8)(link_sword_type + 1) & ~1) || + super_bomb_going_off && savegame_tagalong == 13) { + Ancilla_Sfx2_Near(60); + return; + } + + if (ancilla_type[0] | ancilla_type[1] | ancilla_type[2]) + return; + + if (!LinkCheckMagicCost(1)) + return; + link_player_handler_state = kPlayerState_Bombos; + link_cant_change_direction |= 1; + link_delay_timer_spin_attack = kBombosAnimDelays[0]; + state_for_spin_attack = kBombosAnimStates[0]; + step_counter_for_spin_attack = 0; + byte_7E0324 = 0; + Ancilla_Sfx3_Near(35); +} + +void LinkState_UsingBombos() { // 87a5f7 + flag_unk1++; + if (!sign8(--link_delay_timer_spin_attack)) + return; + + step_counter_for_spin_attack++; + if (step_counter_for_spin_attack == 4) { + Ancilla_Sfx3_Near(35); + } else if (step_counter_for_spin_attack == 10) { + Ancilla_Sfx2_Near(44); + } else if (step_counter_for_spin_attack == 20) { + step_counter_for_spin_attack = 19; + } + link_delay_timer_spin_attack = kBombosAnimDelays[step_counter_for_spin_attack]; + state_for_spin_attack = kBombosAnimStates[step_counter_for_spin_attack]; + if (!byte_7E0324 && step_counter_for_spin_attack == 19) { + byte_7E0324 = 1; + AncillaAdd_BombosSpell(25, 0); + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + } +} + +void LinkItem_Quake() { // 87a64b + if (!CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + + if (is_standing_in_doorway || flag_block_link_menu || dung_savegame_state_bits & 0x8000 || !((uint8)(link_sword_type + 1) & ~1) || + super_bomb_going_off && savegame_tagalong == 13) { + Ancilla_Sfx2_Near(60); + return; + } + + if (ancilla_type[0] | ancilla_type[1] | ancilla_type[2]) + return; + + if (!LinkCheckMagicCost(1)) + return; + link_player_handler_state = kPlayerState_Quake; + link_cant_change_direction |= 1; + link_delay_timer_spin_attack = kQuakeAnimDelays[0]; + state_for_spin_attack = kQuakeAnimStates[0]; + step_counter_for_spin_attack = 0; + byte_7E0324 = 0; + link_actual_vel_z_mirror = 40; + link_actual_vel_z_copy_mirror = 40; + BYTE(link_z_coord_mirror) = 0; + Ancilla_Sfx3_Near(35); +} + +void LinkState_UsingQuake() { // 87a6d6 + flag_unk1++; + link_actual_vel_x = link_actual_vel_y = 0; + + if (step_counter_for_spin_attack == 10) { + link_actual_vel_z = link_actual_vel_z_mirror; + link_actual_vel_z_copy = link_actual_vel_z_copy_mirror; + BYTE(link_z_coord) = link_z_coord_mirror; + link_auxiliary_state = 2; + Player_ChangeZ(2); + LinkHop_FindArbitraryLandingSpot(); + link_actual_vel_z_mirror = link_actual_vel_z; + link_actual_vel_z_copy_mirror = link_actual_vel_z_copy; + BYTE(link_z_coord_mirror) = link_z_coord; + if (!sign8(link_z_coord)) { + state_for_spin_attack = sign8(link_actual_vel_z) ? 21 : 20; + return; + } + } else { + if (!sign8(--link_delay_timer_spin_attack)) + return; + } + + step_counter_for_spin_attack++; + if (step_counter_for_spin_attack == 4) { + Ancilla_Sfx3_Near(35); + } else if (step_counter_for_spin_attack == 10) { + Ancilla_Sfx2_Near(44); + } else if (step_counter_for_spin_attack == 11) { + Ancilla_Sfx2_Near(12); + } else if (step_counter_for_spin_attack == 12) { + step_counter_for_spin_attack = 11; + } + link_delay_timer_spin_attack = kQuakeAnimDelays[step_counter_for_spin_attack]; + state_for_spin_attack = kQuakeAnimStates[step_counter_for_spin_attack]; + if (!byte_7E0324 && step_counter_for_spin_attack == 11) { + byte_7E0324 = 1; + AncillaAdd_QuakeSpell(28, 0); + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + } +} + +void Link_ActivateSpinAttack() { // 87a77a + AncillaAdd_SpinAttackInitSpark(42, 0, 0); + Link_AnimateVictorySpin(); +} + +void Link_AnimateVictorySpin() { // 87a783 + link_player_handler_state = 3; + link_spin_offsets = (link_direction_facing >> 1) * 12; + link_delay_timer_spin_attack = 3; + state_for_spin_attack = kLinkSpinGraphicsByDir[link_spin_offsets]; + step_counter_for_spin_attack = 0; + button_b_frames = 144; + link_cant_change_direction |= 1; + button_mask_b_y = 0x80; + LinkState_SpinAttack(); +} + +void LinkState_SpinAttack() { // 87a804 + CacheCameraPropertiesIfOutdoors(); + + if (link_auxiliary_state) { + int i = 4; + do { + if (ancilla_type[i] == 0x2a || ancilla_type[i] == 0x2b) + ancilla_type[i] = 0; + } while (--i >= 0); + link_x_coord &= 0xff; + link_cant_change_direction &= ~1; + link_delay_timer_spin_attack = 0; + button_b_frames = 0; + button_mask_b_y = 0; + bitfield_for_a_button = 0; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + link_speed_setting = 0; + if (link_electrocute_on_touch) { + if (link_cape_mode) + Link_ForceUnequipCape_quietly(); + Link_ResetSwordAndItemUsage(); + link_disable_sprite_damage = 1; + player_handler_timer = 0; + link_delay_timer_spin_attack = 2; + link_animation_steps = 0; + link_direction &= ~0xf; + Ancilla_Sfx3_Near(43); + link_player_handler_state = kPlayerState_Electrocution; + LinkState_Zapped(); + } else { + link_player_handler_state = kPlayerState_RecoilWall; + LinkState_Recoil(); + } + return; + } + + if (link_incapacitated_timer) { + Link_HandleRecoilAndTimer(false); + } else { + link_direction = 0; + Link_HandleVelocity(); + Link_HandleCardinalCollision(); + link_player_handler_state = kPlayerState_SpinAttacking; + fallhole_var1 = 0; + HandleIndoorCameraAndDoors(); + } + + if (!sign8(--link_delay_timer_spin_attack)) + return; + + step_counter_for_spin_attack++; + + if (step_counter_for_spin_attack == 2) + Ancilla_Sfx3_Near(35); + + if (step_counter_for_spin_attack == 12) { + link_cant_change_direction &= ~1; + link_delay_timer_spin_attack = 0; + button_b_frames = 0; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + if (link_player_handler_state != kPlayerState_SpinAttackMotion) { + button_mask_b_y = (button_b_frames) ? (joypad1H_last & 0x80) : 0; // wtf, it's zero, + } + link_player_handler_state = kPlayerState_Ground; + } else { + state_for_spin_attack = kLinkSpinGraphicsByDir[step_counter_for_spin_attack + link_spin_offsets]; + link_delay_timer_spin_attack = kLinkSpinDelays[step_counter_for_spin_attack]; + TileDetect_MainHandler(8); + } +} + +void LinkItem_Mirror() { // 87a91a + if (!(button_mask_b_y & 0x40)) { + if (!CheckYButtonPress()) + return; + + if (savegame_tagalong == 10) { + dialogue_message_index = 289; + Main_ShowTextMessage(); + return; + } + } + button_mask_b_y &= ~0x40; + + if (is_standing_in_doorway || !cheatWalkThroughWalls && !player_is_indoors && !(overworld_screen_index & 0x40)) { + Ancilla_Sfx2_Near(60); + return; + } + + DoSwordInteractionWithTiles_Mirror(); +} + +void DoSwordInteractionWithTiles_Mirror() { // 87a95c + if (player_is_indoors) { + if (flag_block_link_menu) + return; + Mirror_SaveRoomData(); + if (sound_effect_1 != 60) { + index_of_changable_dungeon_objs[0] = 0; + index_of_changable_dungeon_objs[1] = 0; + } + } else if (main_module_index != 11) { + last_light_vs_dark_world = overworld_screen_index & 0x40; + if (last_light_vs_dark_world) { + bird_travel_y_lo[15] = link_y_coord; + bird_travel_y_hi[15] = link_y_coord >> 8; + bird_travel_x_lo[15] = link_x_coord; + bird_travel_x_hi[15] = link_x_coord >> 8; + } + submodule_index = 35; + link_need_for_pullforrupees_sprite = 0; + link_triggered_by_whirlpool_sprite = 1; + subsubmodule_index = 0; + link_actual_vel_x = link_actual_vel_y = 0; + link_player_handler_state = kPlayerState_Mirror; + } +} + +void LinkState_CrossingWorlds() { // 87a9b1 + uint8 t; + + Link_ResetProperties_B(); + TileCheckForMirrorBonk(); + + if ((overworld_screen_index & 0x40) != last_light_vs_dark_world && ((t = R12 | R14) & 0xc) != 0 && BitSum4(t) >= 2) + goto do_mirror; + + if (BitSum4(tiledetect_deepwater) >= 2) { + if (link_item_flippers) { + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_player_handler_state = kPlayerState_Swimming; + Link_ForceUnequipCape_quietly(); + link_speed_setting = 0; + return; + } + if ((overworld_screen_index & 0x40) != last_light_vs_dark_world) { +do_mirror: + submodule_index = 44; + link_need_for_pullforrupees_sprite = 0; + link_triggered_by_whirlpool_sprite = 1; + subsubmodule_index = 0; + link_actual_vel_x = link_actual_vel_y = 0; + link_player_handler_state = kPlayerState_Mirror; + return; + } + CheckAbilityToSwim(); + } + + if (link_is_in_deep_water) { + link_is_in_deep_water = 0; + link_direction_last = link_some_direction_bits; + } + + link_countdown_for_dash = 0; + link_is_running = 0; + link_speed_setting = 0; + button_mask_b_y = 0; + button_b_frames = 0; + link_cant_change_direction = 0; + swimcoll_var5[0] &= ~0xff; + link_actual_vel_y = 0; + + if ((overworld_screen_index & 0x40) != last_light_vs_dark_world) + num_memorized_tiles = 0; + + link_player_handler_state = (link_item_moon_pearl || !(overworld_screen_index & 0x40)) ? kPlayerState_Ground : kPlayerState_PermaBunny; +} + +void Link_PerformDesertPrayer() { // 87aa6c + submodule_index = 5; + saved_module_for_menu = main_module_index; + main_module_index = 14; + flag_unk1 = 1; + some_animation_timer = 22; + some_animation_timer_steps = 0; + link_state_bits = 2; + link_cant_change_direction |= 1; + link_animation_steps = 0; + link_direction &= ~0xf; + sound_effect_ambient = 17; + music_control = 242; +} + +void HandleFollowersAfterMirroring() { // 87aaa2 + TileDetect_MainHandler(0); + link_animation_steps = 0; + if (savegame_tagalong == 12 || savegame_tagalong == 13) { + if (savegame_tagalong == 13) { + super_bomb_indicator_unk2 = 0xfe; + super_bomb_indicator_unk1 = 0; + } + if (super_bomb_going_off) { + super_bomb_going_off = 0; + savegame_tagalong = 0; + } + } else if (savegame_tagalong == 9 || savegame_tagalong == 10) { + savegame_tagalong = 0; + } else if (savegame_tagalong == 7 || savegame_tagalong == 8) { + savegame_tagalong ^= (7 ^ 8); + LoadFollowerGraphics(); + AncillaAdd_DwarfPoof(0x40, 4); + } + + if (!link_item_moon_pearl) { + AncillaAdd_BunnyPoof(0x23, 4); + Link_ForceUnequipCape_quietly(); + link_bunny_transform_timer = 0; + } else if (link_cape_mode) { + Link_ForceUnequipCape(); + link_bunny_transform_timer = 0; + } +} + +void LinkItem_Hookshot() { // 87ab25 + if (button_mask_b_y & 0x40 || is_standing_in_doorway || bitmask_of_dragstate & 2 || !CheckYButtonPress()) + return; + + ResetAllAcceleration(); + player_handler_timer = 0; + link_cant_change_direction |= 1; + link_delay_timer_spin_attack = 7; + link_animation_steps = 0; + link_direction &= ~0xf; + link_position_mode = 4; + link_player_handler_state = kPlayerState_Hookshot; + link_disable_sprite_damage = 1; + AncillaAdd_Hookshot(31, 3); +} + +void LinkState_Hookshotting() { // 87ab7c + static const int8 kHookshotArrA[4] = { -8, -16, 0, 0 }; + static const int8 kHookshotArrB[4] = { 0, 0, 4, -12 }; + static const int8 kHookshotArrC[4] = { -64, 64, 0, 0 }; + static const int8 kHookshotArrD[4] = { 0, 0, -64, 64 }; + + link_give_damage = 0; + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + int i = 4; + while (ancilla_type[i] != 0x1f) { + if (--i < 0) { + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer = 0; + link_disable_sprite_damage = 0; + button_mask_b_y &= ~0x40; + link_cant_change_direction &= ~1; + link_position_mode &= ~4; + link_player_handler_state = kPlayerState_Ground; + if (button_b_frames >= 9) + button_b_frames = 9; + return; + } + } + + if (sign8(--link_delay_timer_spin_attack)) + link_delay_timer_spin_attack = 0; + + if (!related_to_hookshot) { + link_y_coord_safe_return_lo = link_y_coord; + link_x_coord_safe_return_lo = link_x_coord; + link_y_vel = link_x_vel = 0; + Link_HandleCardinalCollision(); + return; + } + + player_on_somaria_platform = 0; + + uint8 hei = hookshot_effect_index; + if (sign8(--ancilla_item_to_link[hei])) { + ancilla_item_to_link[hei] = 0; + } else { + uint16 x = ancilla_x_lo[hei] | (ancilla_x_hi[hei] << 8); + uint16 y = ancilla_y_lo[hei] | (ancilla_y_hi[hei] << 8); + int8 r4 = kHookshotArrA[ancilla_dir[hei]]; + int8 r6 = kHookshotArrB[ancilla_dir[hei]]; + link_actual_vel_x = link_actual_vel_y = 0; + int8 r8 = kHookshotArrC[ancilla_dir[hei]]; + int8 r10 = kHookshotArrD[ancilla_dir[hei]]; + + uint16 yd = (int16)(y + r4 - link_y_coord); + if ((int16)yd < 0) + yd = -yd; + if (yd >= 2) + link_actual_vel_y = r8; + + uint16 xd = (int16)(x + r6 - link_x_coord); + if ((int16)xd < 0) + xd = -xd; + if (xd >= 2) + link_actual_vel_x = r10; + + if (link_actual_vel_x | link_actual_vel_y) + goto loc_87AD49; + } + + ancilla_type[hei] = 0; + tagalong_var7 = tagalong_var1; + link_player_handler_state = kPlayerState_Ground; + player_handler_timer = 0; + link_delay_timer_spin_attack = 0; + related_to_hookshot = 0; + button_mask_b_y &= ~0x40; + link_cant_change_direction &= ~1; + link_position_mode &= ~4; + link_disable_sprite_damage = 0; + + if (ancilla_arr1[hei]) { + link_is_on_lower_level_mirror ^= 1; + dung_cur_floor--; + if (kind_of_in_room_staircase == 0) { + BYTE(dungeon_room_index2) = dungeon_room_index; + BYTE(dungeon_room_index) += 0x10; + } + if (kind_of_in_room_staircase != 2) { + link_is_on_lower_level ^= 1; + } + Dungeon_FlagRoomData_Quadrants(); + } + Player_TileDetectNearby(); + if (tiledetect_deepwater & 0xf && !link_is_in_deep_water) { + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + AncillaAdd_Splash(21, 0); + link_player_handler_state = kPlayerState_Swimming; + Link_ForceUnequipCape_quietly(); + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + link_speed_setting = 0; + if (player_is_indoors) + link_is_on_lower_level = 1; + if (button_b_frames >= 9) + button_b_frames = 9; + } else if (tiledetect_pit_tile & 0xf) { + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + link_player_handler_state = kPlayerState_FallingIntoHole; + if (button_b_frames >= 9) + button_b_frames = 9; + } else { + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + Link_HandleCardinalCollision(); + HandleIndoorCameraAndDoors(); + } + return; +loc_87AD49: + LinkHop_FindArbitraryLandingSpot(); + TileDetect_MainHandler(5); + if (player_is_indoors) { + uint8 x = tiledetect_vertical_ledge >> 4 | tiledetect_vertical_ledge | detection_of_ledge_tiles_horiz_uphoriz; + if (x & 1 && sign8(--hookshot_var1)) { + hookshot_var1 = 3; + related_to_hookshot ^= 2; + } + } + draw_water_ripples_or_grass = 0; + if (!(related_to_hookshot & 2)) { + if (tiledetect_thick_grass & 1) { + draw_water_ripples_or_grass = 2; + if (!Link_PermissionForSloshSounds()) + Ancilla_Sfx2_Near(26); + } else if ((tiledetect_shallow_water | tiledetect_deepwater) & 1) { + draw_water_ripples_or_grass++; + Ancilla_Sfx2_Near((uint8)overworld_screen_index == 0x70 ? 27 : 28); + } + } + + HandleIndoorCameraAndDoors(); +} + +void LinkItem_Cape() { // 87adc1 + if (!link_cape_mode) { + if (!sign8(--link_bunny_transform_timer)) { + link_direction &= ~0xf; + HaltLinkWhenUsingItems(); + return; + } + link_bunny_transform_timer = 0; + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + button_mask_b_y &= ~0x40; + if (!link_magic_power) { + Ancilla_Sfx2_Near(60); + dialogue_message_index = 123; + Main_ShowTextMessage(); + return; + } + player_handler_timer = 0; + link_cape_mode = 1; + cape_decrement_counter = kCapeDepletionTimers[link_magic_consumption]; + link_bunny_transform_timer = 20; + AncillaAdd_CapePoof(35, 4); + Ancilla_Sfx2_Near(20); + } else { + link_disable_sprite_damage = 1; + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!--cape_decrement_counter) { + cape_decrement_counter = kCapeDepletionTimers[link_magic_consumption]; + if (!--link_magic_power) { + Link_ForceUnequipCape(); + return; + } + } + if (sign8(--link_bunny_transform_timer)) { + link_bunny_transform_timer = 0; + if (filtered_joypad_H & 0x40) + Link_ForceUnequipCape(); + } + } +} + +void Link_ForceUnequipCape() { // 87ae47 + AncillaAdd_CapePoof(35, 4); + Ancilla_Sfx2_Near(21); + Link_ForceUnequipCape_quietly(); +} + +void Link_ForceUnequipCape_quietly() { // 87ae54 + link_bunny_transform_timer = 32; + link_disable_sprite_damage = 0; + link_cape_mode = 0; + link_electrocute_on_touch = 0; +} + +void HaltLinkWhenUsingItems() { // 87ae65 + if (dung_hdr_collision_2 == 2 && (byte_7E0322 & 3) == 3) { + link_y_vel = 0; + link_x_vel = 0; + link_direction = 0; + link_subpixel_y = 0; + link_subpixel_x = 0; + link_moving_against_diag_tile = 0; + } + if (player_on_somaria_platform) + link_direction = 0; +} + +void Link_HandleCape_passive_LiftCheck() { // 87ae88 + if (link_state_bits & 0x80) + Player_CheckHandleCapeStuff(); +} + +void Player_CheckHandleCapeStuff() { // 87ae8f + if (link_cape_mode && eq_selected_y_item_copy == 19) { + if (eq_selected_y_item_copy == eq_selected_y_item) { + if (--cape_decrement_counter) + return; + cape_decrement_counter = kCapeDepletionTimers[link_magic_consumption]; + if (!link_magic_power || --link_magic_power) + return; + } + Link_ForceUnequipCape(); + } +} + +void LinkItem_CaneOfSomaria() { // 87aec0 + static const uint8 kRodAnimDelays[] = { 3, 3, 5 }; + if (!(button_mask_b_y & 0x40)) { + if (player_on_somaria_platform || is_standing_in_doorway || !CheckYButtonPress()) + return; + int i = 4; + while (ancilla_type[i] != 0x2c) { + if (--i < 0) { + if (!LinkCheckMagicCost(4)) + return; + break; + } + } + link_debug_value_2 = 1; + AncillaAdd_SomariaBlock(44, 1); + link_delay_timer_spin_attack = kRodAnimDelays[0]; + link_animation_steps = 0; + player_handler_timer = 0; + link_item_in_hand = 0; + link_position_mode |= 8; + } + + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer++; + + link_delay_timer_spin_attack = kRodAnimDelays[player_handler_timer]; + if (player_handler_timer != 3) + return; + link_speed_setting = 0; + player_handler_timer = 0; + link_delay_timer_spin_attack = 0; + link_debug_value_2 = 0; + button_mask_b_y &= ~0x40; + link_position_mode &= ~8; +} + +void LinkItem_CaneOfByrna() { // 87af3e + static const uint8 kByrnaDelays[] = { 19, 7, 13, 32 }; + if (SearchForByrnaSpark()) + return; + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + if (!LinkCheckMagicCost(8)) + goto out; + AncillaAdd_CaneOfByrnaInitSpark(48, 0); + link_spin_attack_step_counter = 0; + link_delay_timer_spin_attack = kByrnaDelays[0]; + link_var30d = 0; + player_handler_timer = 0; + link_position_mode = 8; + link_cant_change_direction |= 1; + link_animation_steps = 0; + } + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + player_handler_timer++; + link_delay_timer_spin_attack = kByrnaDelays[player_handler_timer]; + if (player_handler_timer == 1) { + Ancilla_Sfx3_Near(42); + } else if (player_handler_timer == 3) { +out: + link_var30d = 0; + player_handler_timer = 0; + button_mask_b_y &= 0x80; + link_position_mode = 0; + link_cant_change_direction &= ~1; + } +} + +bool SearchForByrnaSpark() { // 87afb5 + if (link_position_mode & 8) + return false; + int i = 4; + do { + if (ancilla_type[i] == 0x31) + return true; + } while (--i >= 0); + return false; +} + +void LinkItem_Net() { // 87aff8 + static const uint8 kBugNetTimers[] = { 11, 6, 7, 8, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 9, 4, 5, 6, 7, 8, 1, 2, 3, 4, 10, 8, 1, 2, 3, 4, 5, 6, 7, 8 }; + if (!(button_mask_b_y & 0x40)) { + if (is_standing_in_doorway || !CheckYButtonPress()) + return; + + player_handler_timer = kBugNetTimers[(link_direction_facing >> 1) * 10]; + link_delay_timer_spin_attack = 3; + link_var30d = 0; + link_position_mode = 16; + link_cant_change_direction |= 1; + link_animation_steps = 0; + Ancilla_Sfx2_Near(50); + } + + HaltLinkWhenUsingItems(); + link_direction &= ~0xf; + if (!sign8(--link_delay_timer_spin_attack)) + return; + + link_var30d++; + link_delay_timer_spin_attack = 3; + player_handler_timer = kBugNetTimers[(link_direction_facing >> 1) * 10 + link_var30d]; + + if (link_var30d == 10) { + link_var30d = 0; + player_handler_timer = 0; + button_mask_b_y &= 0x80; + link_position_mode = 0; + link_cant_change_direction &= ~1; + player_oam_x_offset = 0x80; + player_oam_y_offset = 0x80; + } +} + +bool CheckYButtonPress() { // 87b073 + if (button_mask_b_y & 0x40 || link_incapacitated_timer || !(filtered_joypad_H & 0x40)) + return false; + button_mask_b_y |= 0x40; + return true; +} + +bool LinkCheckMagicCost(uint8 x) { // 87b0ab + uint8 cost = kLinkItem_MagicCosts[x * 3 + link_magic_consumption]; + uint8 a = link_magic_power; + if (a && (a -= cost) < 0x80) { + link_magic_power = a; + return true; + } + if (x != 3) { + Ancilla_Sfx2_Near(60); + dialogue_message_index = 123; + Main_ShowTextMessage(); + } + return false; +} + +void Refund_Magic(uint8 x) { // 87b0e9 + uint8 cost = kLinkItem_MagicCosts[x * 3 + link_magic_consumption]; + link_magic_power += cost; +} + +void Link_ItemReset_FromOverworldThings() { // 87b107 + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + link_cant_change_direction &= ~1; +} + +void Link_PerformThrow() { // 87b11c + + if (!(flag_is_sprite_to_pick_up | flag_is_ancilla_to_pick_up)) { + Link_ResetSwordAndItemUsage(); + bitfield_for_a_button = 0; + int i = 15; + while (sprite_state[i] != 0) { + if (--i < 0) + return; + } + + if (interacting_with_liftable_tile_x1 == 5 || interacting_with_liftable_tile_x1 == 6) { + player_handler_timer = 1; + } else { + Point16U pt; + uint8 attr = player_is_indoors ? Dungeon_LiftAndReplaceLiftable(&pt) : Overworld_HandleLiftableTiles(&pt); + + i = 8; + while (kLink_Lift_tab[i] != attr) { + if (--i < 0) + return; + } + + flag_is_sprite_to_pick_up = 1; + Sprite_SpawnThrowableTerrain(i, pt.x, pt.y); + filtered_joypad_L &= ~0x80; + player_handler_timer = 0; + } + } else { + player_handler_timer = 0; + } + + button_mask_b_y = 0; + some_animation_timer = 6; + link_picking_throw_state = 1; + link_state_bits = 0x80; + some_animation_timer_steps = 0; + link_speed_setting = 12; + link_animation_steps = 0; + link_direction &= 0xf0; + link_cant_change_direction |= 1; +} + +void Link_APress_LiftCarryThrow() { // 87b1ca + if (!link_state_bits) + return; + + // throwing? + if ((link_picking_throw_state & 2) && some_animation_timer >= 5) + some_animation_timer = 5; + + // picking up? + if (link_picking_throw_state) + HaltLinkWhenUsingItems(); + + if (link_picking_throw_state & 1) { + link_animation_steps = 0; + link_counter_var1 = 0; + link_direction &= ~0xf; + } + + if (--some_animation_timer) + return; + + if (link_picking_throw_state & 2) { + link_state_bits = 0; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + if (link_player_handler_state == 24) + link_player_handler_state = 0; + } else { + static const uint8 kLiftTab0[10] = { 8, 24, 8, 24, 8, 32, 6, 8, 13, 13 }; + static const uint8 kLiftTab1[10] = { 0, 1, 0, 1, 0, 1, 0, 1, 2, 3 }; + static const uint8 kLiftTab2[] = { 6, 7, 7, 5, 10, 0, 23, 0, 18, 0, 18, 0, 8, 0, 8, 0, 254, 255, 17, 0, + 0x54, 0x52, 0x50, 0xFF, 0x51, 0x53, 0x55, 0x56, 0x57}; + + if (player_handler_timer != 0) { + if (player_handler_timer + 1 != 9) { + player_handler_timer++; + some_animation_timer = kLiftTab0[player_handler_timer]; + some_animation_timer_steps = kLiftTab1[player_handler_timer]; + if (player_handler_timer == 6) { + BYTE(dung_secrets_unk1) = 0; + Point16U pt; + uint8 what = (player_is_indoors) ? Dungeon_LiftAndReplaceLiftable(&pt) : Overworld_HandleLiftableTiles(&pt); + link_player_handler_state = 24; + flag_is_sprite_to_pick_up = 1; + Sprite_SpawnThrowableTerrain((what & 0xf) + 1, pt.x, pt.y); + filtered_joypad_L &= ~0x80; + } + return; + } + } else { + + // todo: This is an OOB read triggered when lifting for too long + some_animation_timer = kLiftTab2[++some_animation_timer_steps]; + assert(some_animation_timer_steps < arraysize(kLiftTab2)); + if (some_animation_timer_steps != 3) + return; + } + } + + // stop animation + link_picking_throw_state = 0; + link_cant_change_direction &= ~1; +} + +void Link_PerformDash() { // 87b281 + if (player_on_somaria_platform) + return; + if (flag_is_sprite_to_pick_up | flag_is_ancilla_to_pick_up) + return; + if (link_state_bits & 0x80) + return; + bitfield_for_a_button = 0; + link_countdown_for_dash = 29; + link_dash_ctr = 64; + link_player_handler_state = kPlayerState_StartDash; + link_is_running = 1; + button_mask_b_y &= 0x80; + link_state_bits = 0; + link_item_in_hand = 0; + bitmask_of_dragstate = 0; + link_moving_against_diag_tile = 0; + + if (savegame_tagalong == kTagalongArr1[savegame_tagalong]) { + printf("Warning: Write to CART!\n"); + link_speed_setting = 0; + timer_tagalong_reacquire = 64; + } +} + +void Link_PerformGrab() { // 87b2ee + if ((button_mask_b_y & 0x80) && button_b_frames >= 9) + return; + + link_grabbing_wall = 1; + link_cant_change_direction |= 1; + link_animation_steps = 0; + some_animation_timer_steps = 0; + some_animation_timer = 0; + link_var30d = 0; +} + +void Link_APress_PullObject() { // 87b322 + link_direction &= ~0xf; + + uint8 x; + + if (!(kGrabWallDirs[link_direction_facing >> 1] & joypad1H_last)) { + link_var30d = 0; + goto set; + } else if (sign8(--some_animation_timer)) { + link_var30d = (link_var30d + 1 == 7) ? 1 : link_var30d + 1; +set: + some_animation_timer_steps = kGrabWall_AnimSteps[link_var30d]; + some_animation_timer = kGrabWall_AnimTimer[link_var30d]; + } + + if (!(joypad1L_last & 0x80)) { + link_var30d = 0; + some_animation_timer_steps = 0; + link_grabbing_wall = 0; + bitfield_for_a_button = 0; + link_cant_change_direction &= ~1; + } +} + +void Link_PerformStatueDrag() { // 87b371 + link_grabbing_wall = 2; + link_cant_change_direction |= 1; + link_animation_steps = 0; + some_animation_timer_steps = 0; + some_animation_timer = kGrabWall_AnimTimer[0]; + link_var30d = 0; +} + +void Link_APress_StatueDrag() { // 87b389 + link_speed_setting = 20; + int j; + if (!(j = joypad1H_last & kGrabWallDirs[link_direction_facing >> 1])) { + link_direction = 0; + link_x_vel = link_y_vel = 0; + link_animation_steps = 0; + link_var30d = 0; + } else { + link_direction = j; + if (!sign8(--some_animation_timer)) + goto skip_set; + link_var30d = (link_var30d + 1 == 7) ? 1 : link_var30d + 1; + } + some_animation_timer_steps = kGrabWall_AnimSteps[link_var30d]; + some_animation_timer = kGrabWall_AnimTimer[link_var30d]; +skip_set: + if (!(joypad1L_last & 0x80)) { + link_speed_setting = 0; + link_is_near_moveable_statue = 0; + link_var30d = 0; + some_animation_timer_steps = 0; + link_grabbing_wall = 0; + bitfield_for_a_button = 0; + link_cant_change_direction &= ~1; + } +} + +void Link_PerformRupeePull() { // 87b3e5 + if (link_direction_facing != 0) + return; + Link_ResetProperties_A(); + link_grabbing_wall = 2; + link_cant_change_direction |= 2; + + link_animation_steps = 0; + some_animation_timer_steps = 0; + some_animation_timer = kGrabWall_AnimTimer[0]; + link_var30d = 0; + link_player_handler_state = kPlayerState_PullForRupees; + link_actual_vel_y = 0; + link_actual_vel_x = 0; + button_mask_b_y = 0; +} + +void LinkState_TreePull() { // 87b416 + CacheCameraPropertiesIfOutdoors(); + if (link_auxiliary_state) { + HandleLink_From1D(); + return; + } + + if (link_grabbing_wall) { + if (!button_mask_b_y) { + if (!(joypad1L_last & 0x80)) { + link_grabbing_wall = 0; + link_var30d = 0; + some_animation_timer = 2; + some_animation_timer_steps = 0; + link_cant_change_direction = 0; + link_player_handler_state = 0; + LinkState_Default(); + return; + } + if (!(joypad1H_last & 4)) + goto out; + button_mask_b_y = 4; + Ancilla_Sfx2_Near(0x22); + } + + if (!sign8(--some_animation_timer)) + goto out; + int j = ++link_var30d; + some_animation_timer_steps = kGrabWall_AnimSteps[j]; + some_animation_timer = kGrabWall_AnimTimer[j]; + if (j != 7) + goto out; + + link_grabbing_wall = 0; + link_var30d = 0; + some_animation_timer = 2; + some_animation_timer_steps = 0; + link_state_bits = 1; + link_picking_throw_state = 0; + } + + if (bitmask_of_dragstate & 9) { +reset_to_normal: + link_direction_facing = 0; + link_state_bits = 0; + link_cant_change_direction = 0; + link_player_handler_state = kPlayerState_Ground; + return; + } + if (link_var30d == 9) { + if (!(filtered_joypad_H & 0xf)) + goto out2; + link_player_handler_state = kPlayerState_Ground; + LinkState_Default(); + return; + } + AncillaAdd_DashDust_charging(0x1e, 0); + if (sign8(--some_animation_timer)) { + static const uint8 kGrabWall_AnimSteps2[10] = { 0, 1, 2, 3, 4, 0, 1, 2, 3, 0x20 }; // oob read + int j = ++link_var30d; + some_animation_timer_steps = kGrabWall_AnimSteps2[j]; + some_animation_timer = 2; + link_actual_vel_y = 48; + if (j == 9) + goto reset_to_normal; + } + Flag67WithDirections(); + if (!(link_direction & 3)) + link_actual_vel_x = 0; + if (!(link_direction & 0xc)) + link_actual_vel_y = 0; +out: + LinkHop_FindArbitraryLandingSpot(); +out2: + Link_HandleCardinalCollision(); + HandleIndoorCameraAndDoors(); +} + +void Link_PerformRead() { // 87b4f2 + if (player_is_indoors) { + dialogue_message_index = Dungeon_GetTeleMsg(dungeon_room_index); + } else { + dialogue_message_index = (sram_progress_indicator < 2) ? 0x3A : Overworld_GetSignText(overworld_screen_index); + } + Main_ShowTextMessage(); + bitfield_for_a_button = 0; +} + +void Link_PerformOpenChest() { // 87b574 + static const uint8 kReceiveItemAlternates[] = { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 255, 255, 53, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 70, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 }; + if (link_direction_facing || item_receipt_method || link_auxiliary_state) + return; + bitfield_for_a_button = 0; + int chest_position = -1; + uint8 item = OpenChestForItem(index_of_interacting_tile, &chest_position); + if (sign8(item)) { + item_receipt_method = 0; + return; + } + assert(chest_position != -1); + item_receipt_method = 1; + uint8 alt = kReceiveItemAlternates[item]; + if (alt != 0xff) { + uint16 ram_addr = kMemoryLocationToGiveItemTo[item]; + if (g_ram[ram_addr]) + item = alt; + } + + Link_ReceiveItem(item, chest_position); +} + +bool Link_CheckNewAPress() { // 87b5c0 + if (bitfield_for_a_button & 0x80 || link_incapacitated_timer || !(filtered_joypad_L & 0x80)) + return false; + bitfield_for_a_button |= 0x80; + return true; +} + +bool Link_HandleToss() { // 87b5d6 + if (!(bitfield_for_a_button & 0x80) || !(filtered_joypad_L & 0x80) || (link_picking_throw_state & 1)) + return false; + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + link_cant_change_direction &= ~1; + // debug stuff here + return true; +} + +void Link_HandleDiagonalCollision() { // 87b64f + if (CheckIfRoomNeedsDoubleLayerCheck()) { + Player_LimitDirections_Inner(); + CreateVelocityFromMovingBackground(); + } + link_direction &= 0xf; + Player_LimitDirections_Inner(); +} + +void Player_LimitDirections_Inner() { // 87b660 + link_direction_mask_a = 0xf; + link_direction_mask_b = 0xf; + link_num_orthogonal_directions = 0; + + static const uint8 kMasks[4] = { 7, 0xB, 0xD, 0xE }; + + if (link_direction & 0xC) { + link_num_orthogonal_directions++; + + link_last_direction_moved_towards = link_direction & 8 ? 0 : 1; + TileDetect_Movement_VerticalSlopes(link_last_direction_moved_towards); + + if ((R14 & 0x30) && !(tiledetect_var1 & 2) && !(((R14 & 0x30) >> 4) & link_direction) && (link_direction & 3)) { + link_direction_mask_a = kMasks[(link_direction & 2) ? 2 : 3]; + } else { + if (dung_hdr_collision == 0) { + if (link_auxiliary_state != 0 && (R12 & 3)) + goto set_thingy; + } + + if (R14 & 3) { + link_moving_against_diag_tile = 0; + if (link_flag_moving && (bitfield_spike_cactus_tiles & 3) == 0 && (link_direction & 3)) { + swimcoll_var1[0] = 0; + swimcoll_var5[0] = 0; + swimcoll_var7[0] = 0; + swimcoll_var9[0] = 0; + } +set_thingy: + fallhole_var1 = 1; + link_direction_mask_a = kMasks[link_last_direction_moved_towards]; + } + } + + if (link_direction & 3) { + link_num_orthogonal_directions++; + + link_last_direction_moved_towards = link_direction & 2 ? 2 : 3; + TileDetect_Movement_HorizontalSlopes(link_last_direction_moved_towards); + + if ((R14 & 0x30) && (tiledetect_var1 & 2) && !(((R14 & 0x30) >> 2) & link_direction) && (link_direction & 0xC)) { + link_direction_mask_b = kMasks[(link_direction & 8) ? 0 : 1]; + } else { + if (dung_hdr_collision == 0) { + if (link_auxiliary_state != 0 && (R12 & 3)) + goto set_thingy_b; + } + + if (R14 & 3) { + link_moving_against_diag_tile = 0; + if (link_flag_moving && (bitfield_spike_cactus_tiles & 3) == 0 && (link_direction & 0xC)) { + swimcoll_var1[1] = 0; + swimcoll_var5[1] = 0; + swimcoll_var7[1] = 0; + swimcoll_var9[1] = 0; + } +set_thingy_b: + fallhole_var1 = 1; + link_direction_mask_b = kMasks[link_last_direction_moved_towards]; + } + } + + link_direction &= link_direction_mask_a & link_direction_mask_b; + } + } + + // ending + if ((link_direction & 0xf) && (link_moving_against_diag_tile & 0xf)) + link_direction = link_moving_against_diag_tile & 0xf; + + if (link_num_orthogonal_directions == 2) { + link_num_orthogonal_directions = (link_direction_facing & 4) ? 2 : 1; + } else { + link_num_orthogonal_directions = 0; + } +} + +void Link_HandleCardinalCollision() { // 87b7c7 + tiledetect_diag_state = 0; + tiledetect_diagonal_tile = 0; + + if (((link_moving_against_diag_tile & 0x30) != 0 || (Link_HandleDiagonalKickback(), moving_against_diag_deadlocked == 0)) && + CheckIfRoomNeedsDoubleLayerCheck()) { + + if (dung_hdr_collision < 2 || dung_hdr_collision == 3) + goto yx; + tile_coll_flag = 2; + Player_TileDetectNearby(); + byte_7E0316 = R14; + if (byte_7E0316 == 0) + goto yx; + link_y_vel += dung_floor_y_vel; + link_x_vel += dung_floor_x_vel; + + uint8 a; + a = R14; + if (a == 12 || a == 3) + goto yx; + if (a == 10 || a == 5) + goto xy; + if ((a & 0xc) == 0 && (a & 3) == 0) + goto yx; + + if (link_y_vel) + goto xy; + if (!link_x_vel) + goto yx; + + if (sign8(dung_floor_y_vel)) { +yx: RunSlopeCollisionChecks_VerticalFirst(); + } else { +xy: RunSlopeCollisionChecks_HorizontalFirst(); + } + CreateVelocityFromMovingBackground(); + } // endif_1 + + if (dung_hdr_collision == 2) { + Player_TileDetectNearby(); + if ((R14 | byte_7E0316) == 0xf) { + if (!countdown_for_blink) + countdown_for_blink = 58; + if (link_direction == 0) { + if (BYTE(dung_floor_y_vel)) + link_y_vel = -link_y_vel; + if (BYTE(dung_floor_x_vel)) + link_x_vel = -link_x_vel; + } + } + tile_coll_flag = 1; + RunSlopeCollisionChecks_VerticalFirst(); + } else if (dung_hdr_collision == 3) { + tile_coll_flag = 1; + RunSlopeCollisionChecks_HorizontalFirst(); + } else if (dung_hdr_collision == 4 || (link_x_vel | link_y_vel) != 0) { + tile_coll_flag = 1; + RunSlopeCollisionChecks_VerticalFirst(); + } else { + uint8 st = link_player_handler_state; + if (st != 19 && st != 8 && st != 9 && st != 10 && st != 3) { + Player_TileDetectNearby(); + if (tiledetect_pit_tile & 0xf) { + link_player_handler_state = 1; + if (!link_is_running) + link_speed_setting = 4; + } + } + } + + TileDetect_MainHandler(0); + if (link_num_orthogonal_directions != 0) + link_moving_against_diag_tile = 0; + + if (link_player_handler_state != 11) { + link_y_vel = link_y_coord - link_y_coord_safe_return_lo; + if (link_y_vel) + link_direction = (link_direction & 3) | (sign8(link_y_vel) ? 8 : 4); + } + + link_x_vel = link_x_coord - link_x_coord_safe_return_lo; + if (link_x_vel) + link_direction = (link_direction & 0xC) | (sign8(link_x_vel) ? 2 : 1); + + if (!player_is_indoors || dung_hdr_collision != 4 || link_player_handler_state != kPlayerState_Swimming) + return; + + if (dung_floor_y_vel && (uint8)(link_y_vel - dung_floor_y_vel) == 0) + link_direction &= sign8(dung_floor_y_vel) ? ~8 : ~4; + + if (dung_floor_x_vel && (uint8)(link_x_vel - dung_floor_x_vel) == 0) + link_direction &= sign8(dung_floor_x_vel) ? ~2 : ~1; +} + +void RunSlopeCollisionChecks_VerticalFirst() { // 87b956 + if (!(link_moving_against_diag_tile & 0x20)) + StartMovementCollisionChecks_Y(); + if (!(link_moving_against_diag_tile & 0x10)) + StartMovementCollisionChecks_X(); +} + +void RunSlopeCollisionChecks_HorizontalFirst() { // 87b969 + if (!(link_moving_against_diag_tile & 0x10)) + StartMovementCollisionChecks_X(); + if (!(link_moving_against_diag_tile & 0x20)) + StartMovementCollisionChecks_Y(); +} + +bool CheckIfRoomNeedsDoubleLayerCheck() { // 87b97c + if (dung_hdr_collision == 0 || dung_hdr_collision == 4) + return false; + + if (dung_hdr_collision >= 2) { + link_y_coord += BG1VOFS_copy2 - BG2VOFS_copy2; + related_to_moving_floor_y = link_y_coord; + link_x_coord += BG1HOFS_copy2 - BG2HOFS_copy2; + related_to_moving_floor_x = link_x_coord; + } + link_is_on_lower_level = 1; + return true; +} + +void CreateVelocityFromMovingBackground() { // 87b9b3 + if (dung_hdr_collision != 1) { + uint16 x = link_x_coord - related_to_moving_floor_x; + uint16 y = link_y_coord - related_to_moving_floor_y; + link_y_coord += BG2VOFS_copy2 - BG1VOFS_copy2; + link_x_coord += BG2HOFS_copy2 - BG1HOFS_copy2; + if (link_direction) { + link_x_vel += x; + link_y_vel += y; + } + } + link_is_on_lower_level = 0; +} + +void StartMovementCollisionChecks_Y() { // 87ba0a + if (!link_y_vel) + return; + + if (is_standing_in_doorway == 1) + link_last_direction_moved_towards = (uint8)link_y_coord < 0x80 ? 0 : 1; + else + link_last_direction_moved_towards = sign8(link_y_vel) ? 0 : 1; + TileDetect_Movement_Y(link_last_direction_moved_towards); + if (player_is_indoors) + StartMovementCollisionChecks_Y_HandleIndoors(); + else + StartMovementCollisionChecks_Y_HandleOutdoors(); +} + +void StartMovementCollisionChecks_Y_HandleIndoors() { // 87ba35 + if (sign8(link_state_bits) || link_incapacitated_timer != 0) { + R14 |= R14 >> 4; + } else { + if (is_standing_in_doorway == 2) { + if (link_num_orthogonal_directions == 0) { + if (dung_hdr_collision != 3 || link_is_on_lower_level == 0) { + Link_AddInVelocityY(); + ChangeAxisOfPerpendicularDoorMovement_Y(); + return; + } + goto label_3; + } else if (tiledetect_var1) { + Link_AddInVelocityY(); + goto endif_1b; + } + } // else_3 + if (R14 & 0x70) { + if ((R14 >> 8) & 7) { + force_move_any_direction = (sign8(link_y_vel)) ? 8 : 4; + } // endif_6 + + is_standing_in_doorway = 1; + byte_7E03F3 = 0; + if ((R14 & 0x70) != 0x70) { + if (R14 & 5) { // if_7 + link_moving_against_diag_tile = 0; + Link_AddInVelocityYFalling(); + CalculateSnapScratch_Y(); + is_standing_in_doorway = 0; + + if (R14 & 0x20 && (R14 & 1) == 0 && (link_x_coord & 7) == 1) + link_x_coord &= ~7; + goto else_7; + } + if (R14 & 0x20) + goto else_7; + } else { // else_7 +else_7: + if (!(tile_coll_flag & 2)) + link_cant_change_direction &= ~2; + return; + } + } + } // endif_1 + + if (!(tile_coll_flag & 2)) { + is_standing_in_doorway = 0; + } + +endif_1b: + if (!(tile_coll_flag & 2)) { + link_cant_change_direction &= ~2; + room_transitioning_flags = 0; + force_move_any_direction = 0; + } // label_3 + +label_3: + + if ((R14 & 7) == 0 && (R12 & 5) != 0) { + byte_7E03F3 = 0; + FlagMovingIntoSlopes_Y(); + if ((link_moving_against_diag_tile & 0xf) != 0) + return; + } // endif_9 + + link_moving_against_diag_tile = 0; + if (tiledetect_key_lock_gravestones & 0x20) { + uint16 bak = R14; + int dummy; + OpenChestForItem(tiledetect_tile_type, &dummy); + tiledetect_tile_type = 0; + R14 = bak; + } + if (!link_is_on_lower_level) { + if (tiledetect_water_staircase & 7) { + byte_7E0322 |= 1; + } else if ((bitfield_spike_cactus_tiles & 7) == 0 && (R14 & 2) == 0) { // else_11 + byte_7E0322 &= ~1; + } // endif_11 + } else { // else_10 + if ((tiledetect_moving_floor_tiles & 7) != 0) { + byte_7E0322 |= 2; + } else { + byte_7E0322 &= ~2; + } + } // endif_11 + + if (tiledetect_misc_tiles & 0x2200) { + uint16 dy = tiledetect_misc_tiles & 0x2000 ? 8 : 0; + + static const uint8 kLink_DoMoveXCoord_Indoors_dx[] = { 8, 8, 0, 15 }; + static const uint8 kLink_DoMoveXCoord_Indoors_dy[] = { 8, 24, 16, 16 }; + + link_rupees_goal += 5; + uint16 y = link_y_coord + kLink_DoMoveXCoord_Indoors_dy[link_last_direction_moved_towards] - dy; + uint16 x = link_x_coord + kLink_DoMoveXCoord_Indoors_dx[link_last_direction_moved_towards]; + + Dungeon_DeleteRupeeTile(x, y); + Ancilla_Sfx3_Near(10); + } // endif_12_norupee + + if (tiledetect_var4 & 0x22) { + byte_7E03F3 = tiledetect_var4 & 0x20 ? 2 : 1; + } else if (tiledetect_var4 & 0x2200) { + byte_7E03F3 = tiledetect_var4 & 0x2000 ? 4 : 3; + } else { + if (!(bitfield_spike_cactus_tiles & 7) && !(R14 & 2)) + byte_7E03F3 = 0; + } // endif_15 + + if ((tiledetect_vertical_ledge & 7) == 7 && RunLedgeHopTimer()) { + Link_CancelDash(); + about_to_jump_off_ledge++; + link_disable_sprite_damage = 1; + link_auxiliary_state = 2; + Ancilla_Sfx2_Near(0x20); + + goto endif_19; + } else if ((tiledetect_deepwater & 7) == 7 && link_is_in_deep_water == 0) { + // if_20 + Link_CancelDash(); + if (TS_copy == 0) { + Dungeon_HandleLayerChange(); + } else { + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + link_speed_setting = 0; + Link_ResetSwimmingState(); + Ancilla_Sfx2_Near(0x20); + } +endif_19: + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_Y(); + } else { + // else_20 + if ((tiledetect_normal_tiles & 2) && link_is_in_deep_water != 0) { + if (link_auxiliary_state != 0) { + R14 = 7; + } else { + Link_CancelDash(); + link_direction_last = link_some_direction_bits; + link_is_in_deep_water = 0; + if (AncillaAdd_Splash(0x15, 0)) { + link_is_in_deep_water = 1; + R14 = 7; + } else { + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_Y(); + } + } + } + } // endif_21 + + if ((tiledetect_stair_tile & 7) == 7) { + if (link_incapacitated_timer) { + R14 &= ~0xff; + R14 |= tiledetect_stair_tile & 7; + HandlePushingBonkingSnaps_Y(); + return; + } + if (tiledetect_inroom_staircase & 0x77) { + submodule_index = tiledetect_inroom_staircase & 0x70 ? 16 : 8; + main_module_index = 7; + Link_CancelDash(); + } + if ((link_last_direction_moved_towards & 2) == 0) { + link_speed_setting = 2; + link_speed_modifier = 1; + return; + } + } + + if (link_speed_setting == 2) + link_speed_setting = link_is_running ? 16 : 0; + + if (link_speed_modifier == 1) + link_speed_modifier = 2; + + if (tiledetect_pit_tile & 5 && (R14 & 2) == 0) { + if (link_player_handler_state == 5 || link_player_handler_state == 2) + return; + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + link_player_handler_state = 1; + return; + } // endif_23 + + link_this_controls_sprite_oam = 0; + + if (bitfield_spike_cactus_tiles & 7) { + if ((link_incapacitated_timer | countdown_for_blink | link_cape_mode) == 0) { + if (((link_last_direction_moved_towards == 0) ? (link_y_coord & 4) == 0 : ((link_y_coord & 4) != 0)) && (countdown_for_blink == 0)) { + link_give_damage = 8; + Link_CancelDash(); + Link_ForceUnequipCape_quietly(); + LinkApplyTileRebound(); + return; + } + } else { + R14 &= ~0xFF; + R14 |= bitfield_spike_cactus_tiles & 7; + } // endif_24 + } // endif_24 + if (dung_hdr_collision == 0 || dung_hdr_collision == 4 || !link_is_on_lower_level) { + if (tiledetect_var2 && link_num_orthogonal_directions == 0) { + byte_7E02C2 = tiledetect_var2; + if (!sign8(--gravestone_push_timeout)) + goto endif_26; + uint16 bits = tiledetect_var2; + int i = 15; + do { + if (bits & 0x8000) { + uint8 idx = FindFreeMovingBlockSlot(i); + if (idx == 0xff) + continue; + R14 = idx; + if (InitializePushBlock(idx, i * 2)) + continue; + Sprite_Dungeon_DrawSinglePushBlock(idx * 2); + R14 = 4; // Unwanted side effect + pushedblock_facing[idx] = link_last_direction_moved_towards * 2; + push_block_direction = link_last_direction_moved_towards * 2; + pushedblocks_target[idx] = (pushedblocks_y_lo[idx] - (link_last_direction_moved_towards == 1)) & 0xf; + } + } while (bits <<= 1, --i >= 0); + } + // endif_27 + gravestone_push_timeout = 21; + } + // endif_26 +endif_26: + HandlePushingBonkingSnaps_Y(); +} + +void HandlePushingBonkingSnaps_Y() { // 87bdb1 + if (R14 & 7) { + if (link_player_handler_state == kPlayerState_Swimming) { + if ((uint8)dung_floor_y_vel == 0) + ResetAllAcceleration(); + + if (link_num_orthogonal_directions != 0) { + Link_AddInVelocityYFalling(); + goto label_a; + } + } // endif_2 + + if (R14 & 2 || (R14 & 5) == 5) { + uint16 bak = R14; + Link_BonkAndSmash(); + RepelDash(); + R14 = bak; + } + + fallhole_var1 = 1; + + if ((R14 & 2) == 2) { + Link_AddInVelocityYFalling(); + } else { + if (link_num_orthogonal_directions == 1) + goto returnb; + Link_AddInVelocityYFalling(); + if (link_num_orthogonal_directions == 2) + goto returnb; + } // endif_4 + +label_a: + + if ((R14 & 5) == 5) { + Link_BonkAndSmash(); + RepelDash(); + } else if (R14 & 4) { + uint8 tt = sign8(link_y_vel) ? link_y_vel : -link_y_vel; + uint8 r0 = sign8(tt) ? 0xff : 1; + if ((R14 & 2) == 0) { + if (link_x_coord & 7) { + link_x_coord += (int8)r0; + HandleNudging(r0); + return; + } + Link_BonkAndSmash(); + RepelDash(); + } + } else { // else_7 + uint8 tt = sign8(link_y_vel) ? -link_y_vel : link_y_vel; + uint8 r0 = sign8(tt) ? 0xff : 1; + if ((R14 & 2) == 0) { + if (link_x_coord & 7) { + link_x_coord += (int8)r0; + HandleNudging(r0); + return; + } + Link_BonkAndSmash(); + RepelDash(); + } + } + // endif_10 + if (link_last_direction_moved_towards * 2 == link_direction_facing) { + bitmask_of_dragstate |= (tile_coll_flag & 1) << 1; + if (button_b_frames == 0 && !sign8(--link_timer_push_get_tired)) + return; + + bitmask_of_dragstate |= (tiledetect_misc_tiles & 0x20) ? tile_coll_flag << 3 : tile_coll_flag; + } + } else {// else_1 + if (link_is_on_lower_level) + return; + bitmask_of_dragstate &= ~9; + } // endif_1 + +returnb: + link_timer_push_get_tired = 32; + bitmask_of_dragstate &= ~2; +} + +void StartMovementCollisionChecks_Y_HandleOutdoors() { // 87beaf + if (link_speed_setting == 2) + link_speed_setting = link_is_running ? 16 : 0; + + if ((tiledetect_pit_tile & 5) != 0 && (R14 & 2) == 0) { + if (link_player_handler_state != 5 && link_player_handler_state != 2) { + // start fall into hole + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + link_player_handler_state = 1; + } + return; + } + + if (tiledetect_read_something & 2) { + interacting_with_liftable_tile_x1 = interacting_with_liftable_tile_x2 >> 1; + } else { + interacting_with_liftable_tile_x1 = 0; + } // endif_2 + + if ((tiledetect_deepwater & 2) && !link_is_in_deep_water && !link_auxiliary_state) { + Link_ResetSwordAndItemUsage(); + Link_CancelDash(); + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + link_grabbing_wall = 0; + link_speed_setting = 0; + Link_ResetSwimmingState(); + if ((draw_water_ripples_or_grass == 1) && (Link_ForceUnequipCape_quietly(), link_item_flippers != 0)) { + if (!link_is_bunny_mirror) + link_player_handler_state = kPlayerState_Swimming; + } else { + Ancilla_Sfx2_Near(0x20); + link_y_coord = (link_y_coord_safe_return_hi << 8) | link_y_coord_safe_return_lo; + link_x_coord = (link_x_coord_safe_return_hi << 8) | link_x_coord_safe_return_lo; + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_Y(); + } + } // endif_afterSwimCheck + + if (link_is_in_deep_water) { + if (tiledetect_vertical_ledge & 7) { + R14 = tiledetect_vertical_ledge & 7; + HandlePushingBonkingSnaps_Y(); + return; + } + if ((tiledetect_stair_tile & 7) == 7 || (tiledetect_normal_tiles & 7) == 7) { + Link_CancelDash(); + link_is_in_deep_water = 0; + if (link_auxiliary_state == 0) { + link_direction_last = link_some_direction_bits; + link_disable_sprite_damage = 1; + AncillaAdd_Splash(0x15, 0); + Link_HopInOrOutOfWater_Y(); + return; + } + } + } + + if (detection_of_ledge_tiles_horiz_uphoriz & 2 || detection_of_unknown_tile_types & 0x22) { + R14 = 7; + HandlePushingBonkingSnaps_Y(); + return; + } + + if (tiledetect_vertical_ledge & 0x70 && RunLedgeHopTimer()) { + Link_CancelDash(); + link_disable_sprite_damage = 1; + allow_scroll_z = 1; + link_player_handler_state = 11; + link_incapacitated_timer = 0; + link_z_coord_mirror = -1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + link_actual_vel_z_copy_mirror = link_actual_vel_z_mirror = link_is_in_deep_water ? 14 : 20; + link_auxiliary_state = link_is_in_deep_water ? 4 : 2; + return; + } + + if (tiledetect_vertical_ledge & 7 && RunLedgeHopTimer()) { + Ancilla_Sfx2_Near(0x20); + link_disable_sprite_damage = 1; + Link_CancelDash(); + bitmask_of_dragstate = 0; + link_speed_setting = 0; + Link_FindValidLandingTile_North(); + return; + } + + if (!link_is_in_deep_water) { + if (tiledetect_ledges_down_leftright & 7 && !(tiledetect_vertical_ledge & 0x77)) { + uint8 xand = index_of_interacting_tile == 0x2f ? 4 : 1; + if ((tiledetect_ledges_down_leftright & xand) && RunLedgeHopTimer()) { + Link_CancelDash(); + link_actual_vel_x = tiledetect_ledges_down_leftright & 4 ? 16 : -16; + link_disable_sprite_damage = 1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + allow_scroll_z = 1; + link_auxiliary_state = 2; + link_actual_vel_z_copy_mirror = link_actual_vel_z_mirror = 20; + link_z_coord_mirror |= 0xff; + link_incapacitated_timer = 0; + link_player_handler_state = 14; + return; + } + } // endif_6 + + if (detection_of_ledge_tiles_horiz_uphoriz & 0x70 && !(tiledetect_vertical_ledge & 0x77) && RunLedgeHopTimer()) { + Link_CancelDash(); + Ancilla_Sfx2_Near(0x20); + link_last_direction_moved_towards = detection_of_ledge_tiles_horiz_uphoriz & 0x40 ? 3 : 2; + link_disable_sprite_damage = 1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + Link_FindValidLandingTile_DiagonalNorth(); + return; + } + } // endif_7 + + if ((tiledetect_stair_tile & 7) == 7) { + if (link_incapacitated_timer != 0) { + R14 = tiledetect_stair_tile & 7; + HandlePushingBonkingSnaps_Y(); + return; + } else if (!(link_last_direction_moved_towards & 2)) { + link_speed_setting = 2; + link_speed_modifier = 1; + return; + } + } // endif_8 + + if (link_speed_setting == 2) + link_speed_setting = link_is_running ? 16 : 0; + + if (link_speed_modifier == 1) + link_speed_modifier = 2; + + if ((R14 & 7) == 0 && (R12 & 5) != 0) { + FlagMovingIntoSlopes_Y(); + if ((link_moving_against_diag_tile & 0xf) != 0) + return; + } // endif_11 + + link_moving_against_diag_tile = 0; + if (tiledetect_key_lock_gravestones & 2 && link_last_direction_moved_towards == 0) { + if (link_is_running || sign8(--gravestone_push_timeout)) { + uint16 bak = R14; + AncillaAdd_GraveStone(0x24, 4); + R14 = bak; + gravestone_push_timeout = 52; + } + } else { + gravestone_push_timeout = 52; + } // endif_12 + + if ((bitfield_spike_cactus_tiles & 7) != 0) { + if ((link_incapacitated_timer | countdown_for_blink | link_cape_mode) == 0) { + if (link_last_direction_moved_towards == 0 ? ((link_y_coord & 4) == 0) : ((link_y_coord & 4) != 0)) { + link_give_damage = 8; + Link_CancelDash(); + Link_ForceUnequipCape_quietly(); + LinkApplyTileRebound(); + return; + } + } else { + R14 = bitfield_spike_cactus_tiles & 7; + } + } // endif_13 + HandlePushingBonkingSnaps_Y(); +} + +bool RunLedgeHopTimer() { // carry // 87c16d + bool rv = false; + if (link_auxiliary_state != 1) { + if (!link_is_running) { + if (sign8(--link_timer_jump_ledge)) { + link_timer_jump_ledge = 19; + return true; + } + } else { + rv = true; + } + } + link_y_coord = link_y_coord_prev; + link_x_coord = link_x_coord_prev; + link_subpixel_y = link_subpixel_x = 0; + return rv; +} + +void Link_BonkAndSmash() { // 87c1a1 + if (!link_is_running || (link_dash_ctr == 64) || !(bitmask_for_dashable_tiles & 0x70)) + return; + for (int i = 0; i < 2; i++) { + Point16U pt; + int j = Overworld_SmashRockPile(i != 0, &pt); + if (j >= 0) { + int k = FindInByteArray(kLink_Lift_tab, (uint8)j, 9); + if (k >= 0) { + if (k == 2 || k == 4) + Ancilla_Sfx3_Near(0x32); + Sprite_SpawnImmediatelySmashedTerrain(k, pt.x, pt.y); + } + } + } +} + +void Link_AddInVelocityYFalling() { // 87c1e4 + link_y_coord -= (tiledetect_which_y_pos[0] & 7) - (sign8(link_y_vel) ? 8 : 0); +} + +// Adjust X coord to fit through door +void CalculateSnapScratch_Y() { // 87c1ff + uint8 yv = link_y_vel; + if (R14 & 4) { + if (!sign8(yv)) yv = -yv; + } else { + if (sign8(yv)) yv = -yv; + } + link_x_coord += !sign8(yv) ? 1 : -1; +} + +void ChangeAxisOfPerpendicularDoorMovement_Y() { // 87c23d + link_cant_change_direction |= 2; + uint8 t = (R14 | (R14 >> 4)) & 0xf; + if (!(t & 7)) { + is_standing_in_doorway = 0; + return; + } + int8 vel; + uint8 dir; + + if ((uint8)link_x_coord >= 0x80) { + uint8 t = link_y_vel; + if (!sign8(t)) t = -t; + vel = sign8(t) ? -1 : 1; + dir = 4; + } else { + uint8 t = link_y_vel; + if (sign8(t)) t = -t; + vel = sign8(t) ? -1 : 1; + dir = 6; + } + if (!(link_cant_change_direction & 1)) + link_direction_facing = dir; + link_x_coord += vel; +} + +void Link_AddInVelocityY() { // 87c29f + link_y_coord -= (int8)link_y_vel; +} + +void Link_HopInOrOutOfWater_Y() { // 87c2c3 + static const uint8 kRecoilVelY[] = { 24, 16, 16 }; + static const uint8 kRecoilVelZ[] = { 36, 24, 24 }; + + uint8 ts = !player_is_indoors ? 2 : + about_to_jump_off_ledge ? 0 : TS_copy; + + int8 vel = kRecoilVelY[ts]; + if (!link_last_direction_moved_towards) + vel = -vel; + + link_actual_vel_y = vel; + link_actual_vel_x = 0; + link_actual_vel_z_copy = link_actual_vel_z = kRecoilVelZ[ts]; + link_z_coord = 0; + link_incapacitated_timer = 16; + if (link_auxiliary_state != 2) { + link_auxiliary_state = 1; + link_electrocute_on_touch = 0; + } + link_player_handler_state = 6; +} + +void Link_FindValidLandingTile_North() { // 87c36c + uint16 y_coord_bak = link_y_coord; + link_y_coord_original = link_y_coord; + + for (;;) { + link_y_coord -= 16; + TileDetect_Movement_Y(link_last_direction_moved_towards); + uint8 k = tiledetect_normal_tiles | tiledetect_destruction_aftermath | tiledetect_thick_grass | tiledetect_deepwater; + if ((k & 7) == 7) + break; + } + + if (tiledetect_deepwater & 7) { + link_auxiliary_state = 1; + link_electrocute_on_touch = 0; + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_grabbing_wall = 0; + link_speed_setting = 0; + } + + link_y_coord -= 16; + link_y_coord_original -= link_y_coord; + link_y_coord = y_coord_bak; + + uint8 o = (uint8)link_y_coord_original >> 3; + + static const uint8 kLink_MoveY_RecoilOther_dy[32] = { 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 36, 36, 40, 40, 44, 44, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; + static const uint8 kLink_MoveY_RecoilOther_dz[32] = { 24, 24, 24, 24, 28, 28, 28, 28, 32, 32, 32, 32, 36, 36, 36, 36, 40, 40, 40, 40, 44, 44, 44, 44, 48, 48, 48, 48, 52, 52, 52, 52 }; + static const uint8 kLink_MoveY_RecoilOther_timer[32] = { 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 36, 36, 40, 40, 44, 44, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }; + + int8 dy = kLink_MoveY_RecoilOther_dy[o]; + link_actual_vel_y = (link_last_direction_moved_towards != 0) ? dy : -dy; + link_actual_vel_x = 0; + link_actual_vel_z_copy = link_actual_vel_z = kLink_MoveY_RecoilOther_dz[o]; + link_z_coord = 0; + link_incapacitated_timer = kLink_MoveY_RecoilOther_timer[o]; + link_auxiliary_state = 2; + link_electrocute_on_touch = 0; + link_player_handler_state = 6; +} + +void Link_FindValidLandingTile_DiagonalNorth() { // 87c46d + uint8 b0 = link_y_coord_safe_return_lo; + uint16 b1 = link_x_coord; + uint8 dir = link_last_direction_moved_towards; + + link_actual_vel_x = (link_last_direction_moved_towards != 2 ? 1 : -1); + link_last_direction_moved_towards = 0; + LinkHop_FindLandingSpotDiagonallyDown(); + + link_x_coord = b1; + link_y_coord_safe_return_lo = b0; + + uint16 o = (uint16)(link_y_coord_original - link_y_coord) >> 3; + link_y_coord = link_y_coord_original; + + static const uint8 kLink_JumpOffLedgeUpDown_dx[32] = { 8, 8, 8, 8, 16, 16, 16, 16, 24, 24, 24, 24, 16, 16, 16, 16, 8, 20, 20, 20, 24, 24, 24, 24, 28, 28, 28, 28, 32, 32, 32, 32 }; + static const uint8 kLink_JumpOffLedgeUpDown_dy[32] = { 8, 8, 8, 8, 16, 16, 20, 20, 24, 24, 24, 24, 32, 32, 32, 32, 8, 20, 20, 20, 24, 24, 24, 24, 28, 28, 28, 28, 32, 32, 32, 32 }; + static const uint8 kLink_JumpOffLedgeUpDown_dz[32] = { 32, 32, 32, 32, 32, 32, 32, 32, 36, 36, 36, 36, 40, 40, 40, 40, 32, 40, 40, 40, 44, 44, 44, 44, 48, 48, 48, 48, 52, 52, 52, 52 }; + + link_actual_vel_y = -kLink_JumpOffLedgeUpDown_dy[o]; + uint8 dx = kLink_JumpOffLedgeUpDown_dx[o]; + link_actual_vel_x = (dir != 2) ? dx : -dx; + link_actual_vel_z_copy = link_actual_vel_z = kLink_JumpOffLedgeUpDown_dz[o]; + link_z_coord = 0; + link_z_coord_mirror &= ~0xff; + link_auxiliary_state = 2; + link_electrocute_on_touch = 0; + link_player_handler_state = 13; +} + +void StartMovementCollisionChecks_X() { // 87c4d4 + if (!link_x_vel) + return; + + if (is_standing_in_doorway == 2) + link_last_direction_moved_towards = (uint8)link_x_coord < 0x80 ? 2 : 3; + else + link_last_direction_moved_towards = sign8(link_x_vel) ? 2 : 3; + TileDetect_Movement_X(link_last_direction_moved_towards); + if (player_is_indoors) + StartMovementCollisionChecks_X_HandleIndoors(); + else + StartMovementCollisionChecks_X_HandleOutdoors(); +} + +void StartMovementCollisionChecks_X_HandleIndoors() { // 87c4ff + if (sign8(link_state_bits) || link_incapacitated_timer != 0) { + R14 |= R14 >> 4; + } else { + if (link_num_orthogonal_directions == 0) + link_speed_modifier = 0; + if (is_standing_in_doorway == 1 && link_num_orthogonal_directions == 0) { + if (dung_hdr_collision != 3 || link_is_on_lower_level == 0) { + SnapOnX(); + int8 spd = ChangeAxisOfPerpendicularDoorMovement_X(); + HandleNudgingInADoor(spd); + return; + } + goto label_3; + } // else_3 + + if (R14 & 0x70) { + if ((R14 >> 8) & 7) { + force_move_any_direction = (sign8(link_x_vel)) ? 2 : 1; + } // endif_6 + + is_standing_in_doorway = 2; + byte_7E03F3 = 0; + if ((R14 & 0x70) != 0x70) { + if (R14 & 7) { // if_7 + link_moving_against_diag_tile = 0; + is_standing_in_doorway = 0; + SnapOnX(); + CalculateSnapScratch_X(); + return; + } + if (R14 & 0x70) + goto else_7; + } else { // else_7 +else_7: + if (!(tile_coll_flag & 2)) + link_cant_change_direction &= ~2; + return; + } + } + } // endif_1 + + if (!(tile_coll_flag & 2)) { + link_cant_change_direction &= ~2; + is_standing_in_doorway = 0; + room_transitioning_flags = 0; + force_move_any_direction = 0; + } // label_3 + +label_3: + + if ((R14 & 2) == 0 && (R12 & 5) != 0) { + byte_7E03F3 = 0; + FlagMovingIntoSlopes_X(); + if ((link_moving_against_diag_tile & 0xf) != 0) + return; + } // endif_9 + + link_moving_against_diag_tile = 0; + if (!link_is_on_lower_level) { + if (tiledetect_water_staircase & 7) { + byte_7E0322 |= 1; + } else if ((bitfield_spike_cactus_tiles & 7) == 0 && (R14 & 2) == 0) { // else_11 + byte_7E0322 &= ~1; + } // endif_11 + } else { // else_10 + if ((tiledetect_moving_floor_tiles & 7) != 0) { + byte_7E0322 |= 2; + } else { + byte_7E0322 &= ~2; + } + } // endif_11 + + if (tiledetect_misc_tiles & 0x2200) { + uint16 dy = tiledetect_misc_tiles & 0x2000 ? 8 : 0; + + static const uint8 kLink_DoMoveXCoord_Indoors_dx[] = { 8, 8, 0, 15 }; + static const uint8 kLink_DoMoveXCoord_Indoors_dy[] = { 8, 24, 16, 16 }; + + link_rupees_goal += 5; + uint16 y = link_y_coord + kLink_DoMoveXCoord_Indoors_dy[link_last_direction_moved_towards] - dy; + uint16 x = link_x_coord + kLink_DoMoveXCoord_Indoors_dx[link_last_direction_moved_towards]; + + Dungeon_DeleteRupeeTile(x, y); + Ancilla_Sfx3_Near(10); + } // endif_12_norupee + + if (tiledetect_var4 & 0x22) { + byte_7E03F3 = tiledetect_var4 & 0x20 ? 2 : 1; + } else if (tiledetect_var4 & 0x2200) { + byte_7E03F3 = tiledetect_var4 & 0x2000 ? 4 : 3; + } else { + if (!(bitfield_spike_cactus_tiles & 7) && !(R14 & 2)) + byte_7E03F3 = 0; + } // endif_15 + + if ((detection_of_ledge_tiles_horiz_uphoriz & 7) == 7 && RunLedgeHopTimer()) { + Link_CancelDash(); + about_to_jump_off_ledge++; + link_auxiliary_state = 2; + goto endif_19; + } else if ((tiledetect_deepwater & 7) == 7 && link_is_in_deep_water == 0 && link_player_handler_state != 6) { + // if_20 + link_y_coord = link_y_coord_safe_return_lo | link_y_coord_safe_return_hi << 8; + link_x_coord = link_x_coord_safe_return_lo | link_x_coord_safe_return_hi << 8; + Link_CancelDash(); + if (TS_copy == 0) { + Dungeon_HandleLayerChange(); + } else { + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + link_speed_setting = 0; + Link_ResetSwimmingState(); + } +endif_19: + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_X(); + Ancilla_Sfx2_Near(0x20); + } else { + // else_20 + if ((tiledetect_normal_tiles & 7) == 7 && link_is_in_deep_water != 0) { + if (link_auxiliary_state != 0) { + R14 = 7; + } else { + Link_CancelDash(); + if (link_auxiliary_state == 0) { + link_direction_last = link_some_direction_bits; + link_is_in_deep_water = 0; + AncillaAdd_Splash(0x15, 0); + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_X(); + } + } + } + } // endif_21 + + if (tiledetect_pit_tile & 5 && (R14 & 2) == 0) { + if (link_player_handler_state == 5 || link_player_handler_state == 2) + return; + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + link_player_handler_state = 1; + return; + } // endif_23 + + player_near_pit_state = 0; + + if (bitfield_spike_cactus_tiles & 7) { + if ((link_incapacitated_timer | countdown_for_blink | link_cape_mode) == 0) { + if (((link_last_direction_moved_towards == 2) ? (link_x_coord & 4) == 0 : ((link_x_coord & 4) != 0)) && (countdown_for_blink == 0)) { + link_give_damage = 8; + Link_CancelDash(); + Link_ForceUnequipCape_quietly(); + LinkApplyTileRebound(); + return; + } + } else { + R14 &= ~0xFF; + R14 |= bitfield_spike_cactus_tiles & 7; + } // endif_24 + } // endif_24 + if (dung_hdr_collision == 0 || dung_hdr_collision == 4 || !link_is_on_lower_level) { + if (tiledetect_var2 && link_num_orthogonal_directions == 0) { + byte_7E02C2 = tiledetect_var2; + if (!sign8(--gravestone_push_timeout)) + goto endif_26; + uint16 bits = tiledetect_var2; + int i = 15; + do { + if (bits & 0x8000) { + uint8 idx = FindFreeMovingBlockSlot(i); + if (idx == 0xff) + continue; + R14 = idx; // This seems like it's overwriting the tiledetector's stuff + if (InitializePushBlock(idx, i * 2)) + continue; + Sprite_Dungeon_DrawSinglePushBlock(idx * 2); + R14 = 4; + pushedblock_facing[idx] = link_last_direction_moved_towards * 2; + push_block_direction = link_last_direction_moved_towards * 2; + pushedblocks_target[idx] = (pushedblocks_x_lo[idx] - (link_last_direction_moved_towards != 2)) & 0xf; + } + } while (bits <<= 1, --i >= 0); + } + // endif_27 + gravestone_push_timeout = 21; + } + // endif_26 +endif_26: + if (link_num_orthogonal_directions == 0) { + link_speed_modifier = 0; + if (link_speed_setting == 2) + link_speed_setting = 0; + } + HandlePushingBonkingSnaps_X(); +} + +void HandlePushingBonkingSnaps_X() { // 87c7fc + if (R14 & 7) { + if (link_player_handler_state == kPlayerState_Swimming && (uint8)dung_floor_x_vel == 0) + ResetAllAcceleration(); + + if (R14 & 2) { + uint16 bak = R14; + Link_BonkAndSmash(); + RepelDash(); + R14 = bak; + } + + fallhole_var1 = 1; + + if ((R14 & 7) == 7) { + SnapOnX(); + } else { + if (link_num_orthogonal_directions == 2) + goto returnb; + SnapOnX(); + if (link_num_orthogonal_directions == 1) + goto returnb; + } // endif_4 + + if ((R14 & 5) == 5) { + Link_BonkAndSmash(); + RepelDash(); + } else if (R14 & 4) { + uint8 tt = sign8(link_x_vel) ? link_x_vel : -link_x_vel; + uint8 r0 = sign8(tt) ? 0xff : 1; + if ((R14 & 2) == 0) { + if (link_y_coord & 7) { + link_y_coord += (int8)r0; + HandleNudging(r0); + return; + } + Link_BonkAndSmash(); + RepelDash(); + } + } else { // else_7 + uint8 tt = sign8(link_x_vel) ? -link_x_vel : link_x_vel; + uint8 r0 = sign8(tt) ? 0xff : 1; + if ((R14 & 2) == 0) { + if (link_y_coord & 7) { + link_y_coord += (int8)r0; + HandleNudging(r0); + return; + } + Link_BonkAndSmash(); + RepelDash(); + } + } + // endif_10 + if (link_last_direction_moved_towards * 2 == link_direction_facing) { + bitmask_of_dragstate |= (tile_coll_flag & 1) << 1; + if (button_b_frames == 0 && !sign8(--link_timer_push_get_tired)) + return; + + bitmask_of_dragstate |= (tiledetect_misc_tiles & 0x20) ? tile_coll_flag << 3 : tile_coll_flag; + } + } else {// else_1 + if (link_is_on_lower_level) + return; + bitmask_of_dragstate &= ~9; + } // endif_1 + +returnb: + link_timer_push_get_tired = 32; + bitmask_of_dragstate &= ~2; +} + +void StartMovementCollisionChecks_X_HandleOutdoors() { // 87c8e9 + if (link_num_orthogonal_directions == 0) { + link_speed_modifier = 0; + if (link_speed_setting == 2) + link_speed_setting = 0; + } + + if ((tiledetect_pit_tile & 5) != 0 && (R14 & 2) == 0) { + if (link_player_handler_state != 5 && link_player_handler_state != 2) { + // start fall into hole + byte_7E005C = 9; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 1; + link_player_handler_state = 1; + } + return; + } + + if (tiledetect_read_something & 2) { + interacting_with_liftable_tile_x1b = interacting_with_liftable_tile_x2 >> 1; + } else { + interacting_with_liftable_tile_x1b = 0; + } // endif_2 + + if ((tiledetect_deepwater & 4) && !link_is_in_deep_water && !link_auxiliary_state) { + Link_CancelDash(); + Link_ResetSwordAndItemUsage(); + link_is_in_deep_water = 1; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + link_grabbing_wall = 0; + link_speed_setting = 0; + if ((draw_water_ripples_or_grass == 1) && (Link_ForceUnequipCape_quietly(), link_item_flippers != 0)) { + if (!link_is_bunny_mirror) + link_player_handler_state = kPlayerState_Swimming; + } else { + link_y_coord = (link_y_coord_safe_return_hi << 8) | link_y_coord_safe_return_lo; + link_x_coord = (link_x_coord_safe_return_hi << 8) | link_x_coord_safe_return_lo; + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_X(); + Ancilla_Sfx2_Near(0x20); + } + } // endif_afterSwimCheck + + if (link_is_in_deep_water ? ((detection_of_ledge_tiles_horiz_uphoriz & 7) == 7) : (tiledetect_vertical_ledge & 0x42)) { + // not implemented, jumps to another routine + R14 = 7; + HandlePushingBonkingSnaps_X(); + return; + } // endif_3 + + if ((tiledetect_normal_tiles & 7) == 7 && link_is_in_deep_water) { + Link_CancelDash(); + if (!link_auxiliary_state) { + link_direction_last = link_some_direction_bits; + link_is_in_deep_water = 0; + AncillaAdd_Splash(0x15, 0); + link_disable_sprite_damage = 1; + Link_HopInOrOutOfWater_X(); + return; + } + } // endif_4 + + if ((detection_of_ledge_tiles_horiz_uphoriz & 7) != 0 && RunLedgeHopTimer()) { + Ancilla_Sfx2_Near(0x20); + link_actual_vel_x = (link_last_direction_moved_towards & 1) ? 0x10 : -0x10; + Link_CancelDash(); + link_auxiliary_state = 2; + link_actual_vel_z_mirror = link_actual_vel_z_copy_mirror = 20; + link_z_coord_mirror |= 0xff; + link_player_handler_state = kPlayerState_FallOfLeftRightLedge; + link_disable_sprite_damage = 1; + allow_scroll_z = 1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + if (!player_is_indoors) + link_is_on_lower_level = 2; + + uint16 xbak = link_x_coord; + uint8 rv = Link_HoppingHorizontally_FindTile_X((link_last_direction_moved_towards & ~2) * 2); + link_last_direction_moved_towards = 1; + if (rv != 0xff) { + Link_HoppingHorizontally_FindTile_Y(); + } else { + LinkHop_FindTileToLandOnSouth(); + } + link_x_coord = xbak; + return; + } // endif_5 + + if ((detection_of_unknown_tile_types & 0x77) != 0 && RunLedgeHopTimer()) { + uint8 sfx = Ancilla_Sfx2_Near(0x20); + link_player_handler_state = (sfx & 7) == 0 ? 16 : 15; + link_actual_vel_x = (link_last_direction_moved_towards & 1) ? 0x10 : -0x10; + Link_CancelDash(); + link_auxiliary_state = 2; + link_actual_vel_z_mirror = link_actual_vel_z_copy_mirror = 20; + link_z_coord_mirror |= 0xff; + link_incapacitated_timer = 0; + link_disable_sprite_damage = 1; + allow_scroll_z = 1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + return; + } // endif_6 + + if ((detection_of_ledge_tiles_horiz_uphoriz & 0x70) != 0 && + (detection_of_ledge_tiles_horiz_uphoriz & 0x7) == 0 && + (detection_of_unknown_tile_types & 0x77) == 0 && + link_player_handler_state != 13 && RunLedgeHopTimer()) { + Ancilla_Sfx2_Near(0x20); + Link_CancelDash(); + link_disable_sprite_damage = 1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + Link_FindValidLandingTile_DiagonalNorth(); + return; + } // endif_7 + + if ((tiledetect_ledges_down_leftright & 7) != 0 && (detection_of_ledge_tiles_horiz_uphoriz & 7) == 0 && + (detection_of_unknown_tile_types & 0x77) == 0 && RunLedgeHopTimer()) { + link_actual_vel_x = (link_last_direction_moved_towards & 1) ? 0x10 : -0x10; + Link_CancelDash(); + link_auxiliary_state = 2; + link_actual_vel_z_mirror = link_actual_vel_z_copy_mirror = 20; + link_z_coord_mirror |= 0xff; + link_player_handler_state = 14; + link_incapacitated_timer = 0; + link_disable_sprite_damage = 1; + allow_scroll_z = 1; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + return; + } // endif_8 + + if ((R14 & 2) == 0 && (R12 & 5) != 0 && (!link_is_running || (link_direction_facing & 4))) { + FlagMovingIntoSlopes_X(); + if ((link_moving_against_diag_tile & 0xf) != 0) + return; + } // endif_9 + + link_moving_against_diag_tile = 0; + + if ((bitfield_spike_cactus_tiles & 7) != 0) { + if ((link_incapacitated_timer | countdown_for_blink | link_cape_mode) == 0) { + if (link_last_direction_moved_towards == 2 ? ((link_x_coord & 4) == 0) : ((link_x_coord & 4) != 0)) { + link_give_damage = 8; + Link_CancelDash(); + LinkApplyTileRebound(); + return; + } + } else { + R14 = bitfield_spike_cactus_tiles & 7; + } + } // endif_10 + HandlePushingBonkingSnaps_X(); +} + +void SnapOnX() { // 87cb84 + link_x_coord -= (link_x_coord & 7) - (sign8(link_x_vel) ? 8 : 0); +} + +void CalculateSnapScratch_X() { // 87cb9f + if (R14 & 4) { + int8 x = link_x_vel; + if (x >= 0) x = -x; // wtf + link_y_coord += x < 0 ? -1 : 1; + } else { + int8 x = link_x_vel; + if (x < 0) x = -x; + link_y_coord += x < 0 ? -1 : 1; + } +} + +int8 ChangeAxisOfPerpendicularDoorMovement_X() { // 87cbdd + link_cant_change_direction |= 2; + uint8 r0 = (R14 | (R14 >> 4)) & 0xf; + if ((r0 & 7) == 0) { + is_standing_in_doorway = 0; + return r0; // wtf? + } + + int8 x_vel = link_x_vel; + uint8 dir; + if ((uint8)link_y_coord >= 0x80) { + if (x_vel >= 0) x_vel = -x_vel; + dir = 0; + } else { + if (x_vel < 0) x_vel = -x_vel; + dir = 2; + } + if (!(link_cant_change_direction & 1)) + link_direction_facing = dir; + link_y_coord += x_vel; + return x_vel; +} + +void Link_HopInOrOutOfWater_X() { // 87cc3c + static const uint8 kRecoilVelX[] = { 28, 24, 16 }; + static const uint8 kRecoilVelZ[] = { 32, 24, 24 }; + + uint8 ts = !player_is_indoors ? 2 : + about_to_jump_off_ledge ? 0 : TS_copy; + + int8 vel = kRecoilVelX[ts]; + if (!(link_last_direction_moved_towards & 1)) + vel = -vel; + link_actual_vel_x = vel; + link_actual_vel_y = 0; + link_actual_vel_z_copy = link_actual_vel_z = kRecoilVelZ[ts]; + link_incapacitated_timer = 16; + if (link_auxiliary_state != 2) { + link_auxiliary_state = 1; + link_electrocute_on_touch = 0; + } + link_player_handler_state = 6; +} + +void Link_HandleDiagonalKickback() { // 87ccab + if (link_x_vel && link_y_vel) { + link_y_coord_copy = link_y_coord; + link_x_coord_copy = link_x_coord; + + TileDetect_Movement_X(sign8(link_x_vel) ? 2 : 3); + if ((R12 & 5) == 0) + goto noHorizOrNoVertical; + FlagMovingIntoSlopes_X(); + if (!(link_moving_against_diag_tile & 0xf)) + goto noHorizOrNoVertical; + + int8 xd = link_x_coord - link_x_coord_copy; + link_x_coord = link_x_coord_copy; + link_x_vel = xd; + + TileDetect_Movement_Y(sign8(link_y_vel) ? 0 : 1); + if ((R12 & 5) == 0) + goto noHorizOrNoVertical; + FlagMovingIntoSlopes_Y(); + if (!(link_moving_against_diag_tile & 0xf)) + goto noHorizOrNoVertical; + + moving_against_diag_deadlocked = link_moving_against_diag_tile; + + int8 yd = link_y_coord - link_y_coord_copy; + link_y_vel = yd; + + static const int8 x0[] = { 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 }; + static const int8 x1[] = { 0, -1, -1, -1, -2, -2, -2, -3, -3, -3 }; + link_x_coord += sign8(link_x_vel) ? x1[-(int8)link_x_vel] : x0[link_x_vel]; + + static const int8 y0[] = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3 }; + static const int8 y1[] = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 3 }; + link_y_coord += sign8(link_y_vel) ? y1[-(int8)link_y_vel] : y0[link_y_vel]; + } else { +noHorizOrNoVertical: + moving_against_diag_deadlocked = 0; + } + link_moving_against_diag_tile = 0; +} + +void TileDetect_MainHandler(uint8 item) { // 87d077 + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + uint16 o; + + if (item == 8) { + int16 a = state_for_spin_attack - 2; + if (a < 0 || a >= 8) + return; + static const uint8 kDoSwordInteractionWithTiles_o[] = { 10, 6, 14, 2, 12, 4, 8, 0 }; + o = kDoSwordInteractionWithTiles_o[a] + 0x40; + } else { + o = item * 8 + link_direction_facing; + } + o >>= 1; + + static const int8 kDoSwordInteractionWithTiles_x[] = { 8, 8, 8, 8, 6, 8, -1, 22, 19, 19, 0, 19, 6, 8, -1, 22, 8, 8, 8, 8, 8, 8, 0, 15, 6, 8, -10, 29, 6, 8, -6, 22, 6, 8, -4, 22, -4, 22, -4, 22 }; + static const int8 kDoSwordInteractionWithTiles_y[] = { 20, 20, 20, 20, 4, 28, 16, 16, 22, 22, 22, 22, 4, 24, 16, 16, 16, 16, 16, 16, 20, 20, 23, 23, -4, 36, 16, 16, 4, 28, 16, 16, 4, 28, 16, 16, 4, 4, 28, 28 }; + uint16 x = ((link_x_coord + kDoSwordInteractionWithTiles_x[o]) & tilemap_location_calc_mask) >> 3; + uint16 y = ((link_y_coord + kDoSwordInteractionWithTiles_y[o]) & tilemap_location_calc_mask); + + if (item == 1 || item == 2 || item == 3 || item == 6 || item == 7 || item == 8) { + TileBehavior_HandleItemAndExecute(x, y); + return; + } + + TileDetection_Execute(x, y, 1); + + if (item == 5) + return; + + if (tiledetect_thick_grass & 0x10) { + uint8 tx = (link_x_coord + 0) & 0xf; + uint8 ty = (link_y_coord + 8) & 0xf; + + if ((ty < 4 || ty >= 11) && (tx < 4 || tx >= 12) && countdown_for_blink == 0 && link_auxiliary_state == 0) { + if (player_is_indoors) { + Dungeon_FlagRoomData_Quadrants(); + Ancilla_Sfx2_Near(0x33); + link_speed_setting = 0; + submodule_index = 21; + BYTE(dungeon_room_index_prev) = dungeon_room_index; + BYTE(dungeon_room_index) = dung_hdr_travel_destinations[0]; + HandleLayerOfDestination(); + } else if (!link_triggered_by_whirlpool_sprite) { + DoSwordInteractionWithTiles_Mirror(); + } + } + } else { // else_3 + link_triggered_by_whirlpool_sprite = 0; + if (tiledetect_thick_grass & 1) { + draw_water_ripples_or_grass = 2; + if (!Link_PermissionForSloshSounds() && link_auxiliary_state == 0) + Ancilla_Sfx2_Near(26); + return; + } + + if (tiledetect_shallow_water & 1) { + draw_water_ripples_or_grass = 1; + + if (!player_is_indoors && link_is_in_deep_water && !link_is_bunny_mirror) { + if (link_item_flippers) { + link_is_in_deep_water = 0; + link_direction_last = link_some_direction_bits; + link_player_handler_state = 0; + } + } else if (!Link_PermissionForSloshSounds()) { + if ((uint8)overworld_screen_index == 0x70) { + Ancilla_Sfx2_Near(27); + } else if (link_auxiliary_state == 0) { + Ancilla_Sfx2_Near(28); + } + } + return; + } + + if (!player_is_indoors && !link_is_in_deep_water && (tiledetect_deepwater & 1)) { + draw_water_ripples_or_grass = 1; + if (!Link_PermissionForSloshSounds()) { + if ((uint8)overworld_screen_index == 0x70) { + Ancilla_Sfx2_Near(27); + } else if (link_auxiliary_state == 0) { + Ancilla_Sfx2_Near(28); + } + } + return; + } + } + // else_6 + draw_water_ripples_or_grass = 0; + + if (tiledetect_spike_floor_and_tile_triggers & 1) { + byte_7E02ED = 1; + return; + } + + byte_7E02ED = 0; + + if (tiledetect_spike_floor_and_tile_triggers & 0x10) { + link_give_damage = 0; + if (!link_cape_mode && !SearchForByrnaSpark() && !countdown_for_blink) { + link_need_for_poof_for_transform = 0; + link_timer_tempbunny = 0; + if (link_item_moon_pearl) { + link_is_bunny = 0; + link_is_bunny_mirror = 0; + } + link_give_damage = 8; + Link_CancelDash(); + return; + } + } + + if (tiledetect_icy_floor & 0x11) { + if (link_flag_moving) { + if (link_num_orthogonal_directions) + link_direction_last = link_some_direction_bits; + } else { // else_11 + if (link_direction & 0xC) + swimcoll_var7[0] = 0x180; + if (link_direction & 3) + swimcoll_var7[0] = 0x180; + + link_flag_moving = (tiledetect_icy_floor & 1) ? 1 : 2; + link_some_direction_bits = link_direction_last; + Link_ResetSwimmingState(); + } + } else { + if (link_player_handler_state != 4) { + if (link_flag_moving) + link_direction_last = link_some_direction_bits; + Link_ResetSwimmingState(); + } + link_flag_moving = 0; + } + + if ((bitfield_spike_cactus_tiles & 0x10) && countdown_for_blink == 0) + countdown_for_blink = 58; +} + +bool Link_PermissionForSloshSounds() { // 87d2c6 + if (!(link_direction & 0xf)) + return true; + if (link_player_handler_state != 17) { + return (frame_counter & 0xf) != 0; + } else { + return (frame_counter & 0x7) != 0; + } +} + +bool PushBlock_AttemptToPushTheBlock(uint8 what, uint16 x, uint16 y) { // 87d304 + static const int8 kChangableDungeonObj_Func1B_y0[4] = { -4, 20, 4, 4 }; + static const int8 kChangableDungeonObj_Func1B_y1[4] = { -4, 20, 12, 12 }; + static const int8 kChangableDungeonObj_Func1B_x0[4] = { 4, 4, -4, 20 }; + static const int8 kChangableDungeonObj_Func1B_x1[4] = { 12, 12, -4, 20 }; + static const uint8 T[256] = { + 0, 1, 2, 3, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + + }; + + uint8 idx = what * 4 + link_last_direction_moved_towards, xt; + uint16 new_x, new_y; + + new_x = ((x + kChangableDungeonObj_Func1B_x0[idx]) & tilemap_location_calc_mask) >> 3; + new_y = ((y + kChangableDungeonObj_Func1B_y0[idx]) & tilemap_location_calc_mask); + xt = PushBlock_GetTargetTileFlag(new_x, new_y); + if (T[xt] != 0 && xt != 9) + return true; + + new_x = ((x + kChangableDungeonObj_Func1B_x1[idx]) & tilemap_location_calc_mask) >> 3; + new_y = ((y + kChangableDungeonObj_Func1B_y1[idx]) & tilemap_location_calc_mask); + xt = PushBlock_GetTargetTileFlag(new_x, new_y); + if (T[xt] != 0 && xt != 9) + return true; + + return false; +} + +uint8 Link_HandleLiftables() { // 87d383 + static const uint8 kGetBestActionToPerformOnTile_a[7] = { 0, 1, 0, 0, 2, 1, 2 }; + static const uint8 kGetBestActionToPerformOnTile_b[7] = { 2, 3, 1, 4, 0, 5, 6 }; + + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + + uint16 y0 = (link_y_coord + kGetBestActionToPerformOnTile_y[link_direction_facing >> 1]) & tilemap_location_calc_mask; + uint16 y1 = (link_y_coord + 20) & tilemap_location_calc_mask; + + uint16 x0 = ((link_x_coord + kGetBestActionToPerformOnTile_x[link_direction_facing >> 1]) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((link_x_coord + 8) & tilemap_location_calc_mask) >> 3; + + TileDetection_Execute(x0, y0, 1); + TileDetection_Execute(x1, y1, 2); + + uint8 action = ((R14 | tiledetect_vertical_ledge) & 1) ? 3 : 2; + + if (player_is_indoors) { + uint8 a = Dungeon_CheckForAndIDLiftableTile(); + if (a != 0xff) { + interacting_with_liftable_tile_x1 = kGetBestActionToPerformOnTile_b[a & 0xf]; + } else { + if ((tiledetect_read_something & 1) && link_direction_facing == 0 && interacting_with_liftable_tile_x2 == 0) + action = 4; + goto getout; + } + } else { + if (!(tiledetect_read_something & 1)) + goto getout; + if (link_direction_facing == 0 && interacting_with_liftable_tile_x2 == 0) { + action = 4; + goto getout; + } + interacting_with_liftable_tile_x1 = interacting_with_liftable_tile_x2 >> 1; + } + if (kGetBestActionToPerformOnTile_a[interacting_with_liftable_tile_x1] - link_item_gloves <= 0) + action = 1; +getout: + if (tiledetect_chest & 1) + action = 5; + return action; +} + +void HandleNudging(int8 arg_r0) { // 87d485 + uint8 p, o; + + if ((link_last_direction_moved_towards & 2) == 0) { + p = (link_last_direction_moved_towards & 1) ? 4 : 0; + o = (R14 & 4) ? 0 : 2; + } else { + p = (link_last_direction_moved_towards & 1) ? 12 : 8; + o = (R14 & 4) ? 0 : 2; + } + o = (o + p) >> 1; + + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + + uint16 y0 = (link_y_coord + kLink_Move_Helper6_tab0[o]) & tilemap_location_calc_mask; + uint16 x0 = ((link_x_coord + kLink_Move_Helper6_tab1[o]) & tilemap_location_calc_mask) >> 3; + + uint16 y1 = (link_y_coord + kLink_Move_Helper6_tab2[o]) & tilemap_location_calc_mask; + uint16 x1 = ((link_x_coord + kLink_Move_Helper6_tab3[o]) & tilemap_location_calc_mask) >> 3; + + TileDetection_Execute(x0, y0, 1); + TileDetection_Execute(x1, y1, 2); + + if ((R14 | detection_of_ledge_tiles_horiz_uphoriz) & 3 || + (tiledetect_vertical_ledge | detection_of_unknown_tile_types) & 0x33) { + + if (link_last_direction_moved_towards & 2) + link_y_coord -= arg_r0; + else + link_x_coord -= arg_r0; + } +} + +void TileBehavior_HandleItemAndExecute(uint16 x, uint16 y) { // 87dc4a + uint8 tile = HandleItemTileAction_Overworld(x, y); + TileDetect_ExecuteInner(tile, 0, 1, false); +} + +uint8 PushBlock_GetTargetTileFlag(uint16 x, uint16 y) { // 87e026 + return dung_bg2_attr_table[(y & ~7) * 8 + (x & 0x3f) + (link_is_on_lower_level ? 0x1000 : 0)]; +} + +void FlagMovingIntoSlopes_Y() { // 87e076 + int8 y = (tiledetect_which_y_pos[0] & 7); + uint8 o = (tiledetect_diag_state * 4) + ((link_x_coord - ((R12 & 4) != 0)) & 7); + + if (tiledetect_diagonal_tile & 5) { + int8 ym = tiledetect_which_y_pos[0] & 7; + + if (!(tiledetect_diag_state & 2)) { + ym = 8 - ym; + } else { + ym += 8; + } + ym = kAvoidJudder1[o] - ym; + if (link_y_vel == 0) + return; + if (sign8(link_y_vel)) + ym = -ym; + y = ym; + } else { // else_1 + y = kAvoidJudder1[o] - y; + } // endif_1 + + if (sign8(link_y_vel)) { + if (y <= 0) + return; + link_y_coord += y; + link_moving_against_diag_tile = 8; + } else { + if (y >= 0) + return; + link_y_coord += y; + link_moving_against_diag_tile = 4; + } + link_moving_against_diag_tile |= (R12 & 4) ? 0x10 + 2 : 0x10 + 1; +} + +void FlagMovingIntoSlopes_X() { // 87e112 + int8 x = (link_x_coord - (tiledetect_diag_state == 6)) & 7; + uint8 o = (tiledetect_diag_state * 4) + (tiledetect_which_y_pos[(R12 & 4) ? 1 : 0] & 7); + + if (tiledetect_diagonal_tile & 5) { + int8 xm = link_x_coord & 7; + + if (tiledetect_diag_state != 4 && tiledetect_diag_state != 6) { + o ^= 7; + xm = -xm; + } else { + xm -= 8; + xm = -xm; + xm = kAvoidJudder1[o] - xm; + } // endif_5 + if (link_x_vel == 0) + return; + if (sign8(link_x_vel)) + xm = -xm; + x = xm; + } else { // else_1 + x = kAvoidJudder1[o] - x; + } // endif_1 + + if (sign8(link_x_vel)) { + if (x <= 0) + return; + link_x_coord += x; + link_moving_against_diag_tile = 2; + } else { + if (x >= 0) + return; + link_x_coord += x; + link_moving_against_diag_tile = 1; + } + link_moving_against_diag_tile |= (tiledetect_diag_state & 2) ? 0x20 + 8 : 0x20 + 4; +} + +void Link_HandleRecoiling() { // 87e1be + link_direction = 0; + if (link_actual_vel_y) { + link_direction_last = (link_direction |= sign8(link_actual_vel_y) ? 8 : 4); + Player_HandleIncapacitated_Inner2(); + } + if (link_actual_vel_x) + link_direction_last = (link_direction |= sign8(link_actual_vel_x) ? 2 : 1); + Player_HandleIncapacitated_Inner2(); +} + +void Player_HandleIncapacitated_Inner2() { // 87e1d7 + if ((link_moving_against_diag_tile & 0xc) && (link_moving_against_diag_tile & 3) && link_player_handler_state == 2) { + link_actual_vel_x = -link_actual_vel_x; + link_actual_vel_y = -link_actual_vel_y; + } + if (is_standing_in_doorway == 1) { + link_direction_last &= 0xc; + link_direction &= 0xc; + link_actual_vel_x = 0; + } else if (is_standing_in_doorway == 2) { + link_direction_last &= 3; + link_direction &= 3; + link_actual_vel_y = 0; + } +} + +void Link_HandleVelocity() { // 87e245 + if (submodule_index == 2 && main_module_index == 14 || link_prevent_from_moving) { + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + Link_HandleVelocityAndSandDrag(link_x_coord, link_y_coord); + return; + } + + if (link_player_handler_state == kPlayerState_Swimming) { + HandleSwimStrokeAndSubpixels(); + return; + } + uint8 r0; + + if (link_flag_moving) { + if (!link_is_running) { + HandleSwimStrokeAndSubpixels(); + return; + } + r0 = 24; + } else { + if (link_is_running) { + link_speed_modifier = 0; + assert(link_dash_ctr >= 32); + } + + if ((byte_7E0316 | byte_7E0317) == 0xf) + return; + + r0 = link_speed_setting; + if (draw_water_ripples_or_grass) { + r0 = (link_speed_setting == 16) ? 22 : + (link_speed_setting == 12) ? 14 : 12; + } + } // endif_4 + + link_actual_vel_x = link_actual_vel_y = 0; + link_y_page_movement_delta = link_x_page_movement_delta = 0; + + r0 += ((link_direction & 0xC) != 0 && (link_direction & 3) != 0); + + if (player_near_pit_state) { + if (player_near_pit_state == 3) + link_speed_modifier = (link_speed_modifier < 48) ? link_speed_modifier + 8 : 32; + } else { + if (link_speed_modifier) { + r0 = (submodule_index == 8 || submodule_index == 16) ? 10 : 2; + if (link_speed_modifier != 1) { + if (link_speed_modifier < 16) { + link_speed_modifier += 1; + r0 = 26; // kSpeedMod[26] is 0 + } else { + link_speed_modifier = 0; + link_speed_setting = 0; + } + } + } + } // endif_7 + + static const uint8 kSpeedMod[27] = { 24, 16, 10, 24, 16, 8, 8, 4, 12, 16, 9, 25, 20, 13, 16, 8, 64, 42, 16, 8, 4, 2, 48, 24, 32, 21, 0 }; + + uint8 vel = link_speed_modifier + kSpeedMod[r0]; + if (link_direction & 3) + link_actual_vel_x = (link_direction & 2) ? -vel : vel; + if (link_direction & 0xC) + link_actual_vel_y = (link_direction & 8) ? -vel : vel; + + link_actual_vel_z = 0xff; + link_z_coord = 0xffff; + link_subpixel_z = 0; + LinkHop_FindArbitraryLandingSpot(); +} + +void LinkHop_FindArbitraryLandingSpot() { // 87e370 + uint16 x = link_x_coord, y = link_y_coord; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + + if (link_player_handler_state != 10 && player_on_somaria_platform == 2) { + Link_HandleVelocityAndSandDrag(x, y); + return; + } + + uint32 tmp; + tmp = link_subpixel_x + (int8)link_actual_vel_x * 16 + link_x_coord * 256; + link_subpixel_x = (uint8)tmp, link_x_coord = (tmp >> 8); + tmp = link_subpixel_y + (int8)link_actual_vel_y * 16 + link_y_coord * 256; + link_subpixel_y = (uint8)tmp, link_y_coord = (tmp >> 8); + if (link_auxiliary_state) { + tmp = link_subpixel_z + (int8)link_actual_vel_z * 16 + link_z_coord * 256; + link_subpixel_z = (uint8)tmp, link_z_coord = (tmp >> 8); + } + + Link_HandleMovingFloor(); + Link_ApplyConveyor(); + Link_HandleVelocityAndSandDrag(x, y); +} + +void Link_HandleVelocityAndSandDrag(uint16 x, uint16 y) { // 87e3e0 + link_y_coord += drag_player_y; + link_x_coord += drag_player_x; + link_y_vel = link_y_coord - y; + link_x_vel = link_x_coord - x; +} + +void HandleSwimStrokeAndSubpixels() { // 87e42a + link_actual_vel_x = link_actual_vel_y = 0; + + static const int8 kSwimmingTab4[] = { 8, -12, -8, -16, 4, -6, -12, -6, 10, -16, -12, -6 }; + static const uint8 kSwimmingTab5[] = { ~0xc & 0xff, ~3 & 0xff }; + static const uint8 kSwimmingTab6[] = { 8, 4, 2, 1 }; + uint16 S[2]; + for (int i = 1; i >= 0; i--) { + if ((int16)--swimcoll_var3[i] < 0) { + swimcoll_var3[i] = 0; + swimcoll_var5[i] = 1; + } + uint16 t = swimcoll_var5[i]; + if (link_flag_moving) + t += link_flag_moving * 4; + + uint16 sum = swimcoll_var7[i] + kSwimmingTab4[t]; + if ((int16)sum <= 0) { + link_direction &= kSwimmingTab5[i]; + link_direction_last = link_direction; + //link_actual_vel_y = link_y_page_movement_delta; // WTF bug?! + if (swimcoll_var5[i] == 2) { + swimcoll_var5[i] = 0; + swimcoll_var9[i] = 240; + swimcoll_var7[i] = 2; + } else { + swimcoll_var5[i] = 0; + swimcoll_var9[i] = 0; + swimcoll_var7[i] = 0; + } + } else { + link_direction |= kSwimmingTab6[swimcoll_var11[i] + i * 2]; + if (sum >= swimcoll_var9[i]) + sum = swimcoll_var9[i]; + swimcoll_var7[i] = sum; + } + S[i] = swimcoll_var7[i]; + if (link_num_orthogonal_directions | link_moving_against_diag_tile) + S[i] -= S[i] >> 2; + if (!swimcoll_var11[i]) + S[i] = -S[i]; + } + + Player_SomethingWithVelocity_TiredOrSwim(S[1], S[0]); + +} + +void Player_SomethingWithVelocity_TiredOrSwim(uint16 xvel, uint16 yvel) { // 87e4d3 + uint16 org_x = link_x_coord, org_y = link_y_coord; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + + uint8 u; + + uint32 tmp; + tmp = link_subpixel_x + (int16)xvel + link_x_coord * 256; + link_subpixel_x = (uint8)tmp, link_x_coord = (tmp >> 8); + + u = xvel >> 8; + link_actual_vel_x = ((sign8(u) ? -u : u) << 4) | ((uint8)xvel >> 4); + + tmp = link_subpixel_y + (int16)yvel + link_y_coord * 256; + link_subpixel_y = (uint8)tmp, link_y_coord = (tmp >> 8); + u = yvel >> 8; + link_actual_vel_y = ((sign8(u) ? -u : u) << 4) | ((uint8)yvel >> 4); + + if (dung_hdr_collision == 4) + Link_ApplyMovingFloorVelocity(); + link_x_page_movement_delta = 0; + link_y_page_movement_delta = 0; + Link_HandleVelocityAndSandDrag(org_x, org_y); +} + +void Link_HandleMovingFloor() { // 87e595 + if (!dung_hdr_collision) + return; + if (BYTE(link_z_coord) != 0 && BYTE(link_z_coord) != 255) + return; + if (((byte_7E0322) & 3) != 3) + return; + if (link_player_handler_state == 19) // hookshot + return; + + if (dung_floor_y_vel) + link_direction |= sign8(dung_floor_y_vel) ? 8 : 4; + + if (dung_floor_x_vel) + link_direction |= sign8(dung_floor_x_vel) ? 2 : 1; + + Link_ApplyMovingFloorVelocity(); +} + +void Link_ApplyMovingFloorVelocity() { // 87e5cd + link_num_orthogonal_directions = 0; + link_y_coord += dung_floor_y_vel; + link_x_coord += dung_floor_x_vel; +} + +void Link_ApplyConveyor() { // 87e5f0 + static const uint8 kMovePosDirFlag[4] = { 8, 4, 2, 1 }; + static const int8 kMovingBeltY[4] = { -8, 8, 0, 0 }; + static const int8 kMovingBeltX[4] = { 0, 0, -8, 8 }; + + if (!byte_7E03F3) + return; + if (BYTE(link_z_coord) != 0 && BYTE(link_z_coord) != 0xff) + return; + if (link_grabbing_wall & 1 || link_player_handler_state == kPlayerState_Hookshot || link_auxiliary_state) + return; + + int j = byte_7E03F3 - 1; + if (link_is_running && link_dash_ctr == 32 && (link_direction & kMovePosDirFlag[j])) + return; + + link_num_orthogonal_directions = 0; + link_direction |= kMovePosDirFlag[j]; + + uint32 t = link_y_coord << 8 | dung_some_subpixel[0]; + t += kMovingBeltY[j] << 4; + dung_some_subpixel[0] = t; + link_y_coord = t >> 8; + + t = link_x_coord << 8 | dung_some_subpixel[1]; + t += kMovingBeltX[j] << 4; + dung_some_subpixel[1] = t; + link_x_coord = t >> 8; +} + +void Link_HandleMovingAnimation_FullLongEntry() { // 87e6a6 + if (link_player_handler_state == 4) { + Link_HandleMovingAnimationSwimming(); + return; + } + + static const uint8 kTab[4] = { 8, 4, 2, 1 }; + + uint8 r0 = link_direction_last; + uint8 y; + if (r0 == 0) + return; + if (link_flag_moving) + r0 = link_some_direction_bits; + if (link_cant_change_direction) + goto bail; + if (link_num_orthogonal_directions == 0) + goto not_diag; + if (is_standing_in_doorway) { + y = (is_standing_in_doorway * 2) & ~3; + } else { + if (r0 & kTab[link_direction_facing >> 1]) + goto bail; +not_diag: + y = (r0 & 0xc) ? 0 : 4; + } + + if (y != 4) { + y += (r0 & 4) ? 2 : 0; + } else { + y += (r0 & 1) ? 2 : 0; + } + link_direction_facing = y; +bail: + Link_HandleMovingAnimation_StartWithDash(); +} + +void Link_HandleMovingAnimation_StartWithDash() { // 87e704 + if (link_is_running) { + Link_HandleMovingAnimation_Dash(); + return; + } + + uint8 x = link_direction_facing >> 1; + if (link_speed_setting == 6) { + x += 4; + } else if (link_flag_moving) { + if (!(joypad1H_last & 0xf)) { + link_animation_steps = 0; + return; + } + x += 4; + } + + static const uint8 tab2[16] = { 4, 4, 4, 4, 1, 1, 1, 1, 2, 2, 2, 2, 8, 8, 8, 8 }; + static const uint8 tab3[24] = { 1, 2, 3, 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 2, 2, 3, 2 }; + + if (link_player_handler_state == 23) { // kPlayerState_PermaBunny + if (link_animation_steps < 4 && player_on_somaria_platform != 2) { + if (++link_counter_var1 >= tab2[x]) { + link_counter_var1 = 0; + if (++link_animation_steps == 4) + link_animation_steps = 0; + } + } else { + link_animation_steps = 0; + } + return; + } + + if (submodule_index == 18 || submodule_index == 19) { + x = 12; + } else if (submodule_index != kPlayerState_JumpOffLedgeDiag && (link_state_bits & 0x80) == 0) { + if (bitmask_of_dragstate & 0x8d) { + x = 12; + } else if (!draw_water_ripples_or_grass && !button_b_frames) { + // else_6 + x = link_animation_steps; + if (link_speed_setting == 6) + x += 8; + if (link_flag_moving) + x += 8; + if (player_on_somaria_platform == 2) + return; + if (++link_counter_var1 >= tab3[x]) { + link_counter_var1 = 0; + if (++link_animation_steps == 9) + link_animation_steps = 1; + } + return; + } + } + // endif_4 + + if (link_animation_steps < 6 && player_on_somaria_platform != 2) { + if (++link_counter_var1 >= tab2[x]) { + link_counter_var1 = 0; + if (++link_animation_steps == 6) + link_animation_steps = 0; + } + } else { + link_animation_steps = 0; + } +} + +void Link_HandleMovingAnimationSwimming() { // 87e7fa + static const uint8 kTab[4] = { 8, 4, 2, 1 }; + if (!link_some_direction_bits || link_cant_change_direction) + return; + uint8 y; + + if (link_num_orthogonal_directions) { + if (is_standing_in_doorway) { + y = (is_standing_in_doorway * 2) & ~3; + } else { + if (link_some_direction_bits & kTab[link_direction_facing >> 1]) + return; + y = link_some_direction_bits & 0xC ? 0 : 4; + } + } else { + y = link_some_direction_bits & 0xC ? 0 : 4; + } + if (y != 4) { + y += (link_some_direction_bits & 4) ? 2 : 0; + } else { + y += (link_some_direction_bits & 1) ? 2 : 0; + } + link_direction_facing = y; +} + +void Link_HandleMovingAnimation_Dash() { // 87e88f + static const uint8 kDashTab3[] = { 48, 36, 24, 16, 12, 8, 4 }; + static const uint8 kDashTab4[] = { 3, 3, 5, 3, 3, 3, 5, 3, 2, 2, 4, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + static const uint8 kDashTab5[] = { 1, 2, 2, 2, 2, 2, 2 }; + + uint8 t = 6; + while (link_countdown_for_dash >= kDashTab3[t] && t) + t--; + + if (button_b_frames < 9 && !draw_water_ripples_or_grass) { + if (++link_counter_var1 >= kDashTab4[t * 8]) { + link_counter_var1 = 0; + link_animation_steps++; + if (link_animation_steps == 9) + link_animation_steps = 1; + } + } else { + if (++link_counter_var1 >= kDashTab5[t]) { + link_counter_var1 = 0; + link_animation_steps++; + if (link_animation_steps >= 6) + link_animation_steps = 0; + } + } +} + +void HandleIndoorCameraAndDoors() { // 87e8f0 + if (player_is_indoors) { + if (is_standing_in_doorway) + HandleDoorTransitions(); + else + ApplyLinksMovementToCamera(); + } +} + +void HandleDoorTransitions() { // 87e901 + uint16 t; + + link_x_page_movement_delta = 0; + link_y_page_movement_delta = 0; + + if (link_direction_last & 0xC && is_standing_in_doorway == 1) { + if (link_direction_last & 4) { + if (((t = link_y_coord + 28) & 0xfc) == 0) + link_y_page_movement_delta = (t >> 8) - link_y_coord_safe_return_hi; + } else { + t = link_y_coord - 18; + link_y_page_movement_delta = (t >> 8) - link_y_coord_safe_return_hi; + } + } + + if (link_direction_last & 3 && is_standing_in_doorway == 2) { + if (link_direction_last & 1) { + if (((t = link_x_coord + 21) & 0xfc) == 0) + link_x_page_movement_delta = (t >> 8) - link_x_coord_safe_return_hi; + } else { + t = link_x_coord - 8; + link_x_page_movement_delta = (t >> 8) - link_x_coord_safe_return_hi; + } + } + + if (link_x_page_movement_delta) { + some_animation_timer = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + if (sign8(link_x_page_movement_delta)) + Dung_StartInterRoomTrans_Left_Plus(); + else + HandleEdgeTransitionMovementEast_RightBy8(); + } else if (link_y_page_movement_delta) { + some_animation_timer = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + if (sign8(link_y_page_movement_delta)) + Dungeon_StartInterRoomTrans_Up(); + else + HandleEdgeTransitionMovementSouth_DownBy16(); + } +} + +void ApplyLinksMovementToCamera() { // 87e9d3 + link_y_page_movement_delta = (link_y_coord >> 8) - link_y_coord_safe_return_hi; + link_x_page_movement_delta = (link_x_coord >> 8) - link_x_coord_safe_return_hi; + + if (link_x_page_movement_delta) { + if (sign8(link_x_page_movement_delta)) + AdjustQuadrantAndCamera_left(); + else + AdjustQuadrantAndCamera_right(); + } + + if (link_y_page_movement_delta) { + if (sign8(link_y_page_movement_delta)) + AdjustQuadrantAndCamera_up(); + else + AdjustQuadrantAndCamera_down(); + } +} + +uint8 FindFreeMovingBlockSlot(uint8 x) { // 87ed2c + if (index_of_changable_dungeon_objs[1] == 0) { + index_of_changable_dungeon_objs[1] = x + 1; + return 1; + } + if (index_of_changable_dungeon_objs[0] == 0) { + index_of_changable_dungeon_objs[0] = x + 1; + return 0; + } + return 0xff; +} + +bool InitializePushBlock(uint8 r14, uint8 idx) { // 87ed3f + uint16 pos = dung_object_tilemap_pos[idx >> 1]; + uint16 x = (pos & 0x007e) << 2; + uint16 y = (pos & 0x1f80) >> 4; + + x += (dung_loade_bgoffs_h_copy & 0xff00); + y += (dung_loade_bgoffs_v_copy & 0xff00); + + pushedblocks_x_lo[r14] = (uint8)x; + pushedblocks_x_hi[r14] = (uint8)(x >> 8); + pushedblocks_y_lo[r14] = (uint8)y; + pushedblocks_y_hi[r14] = (uint8)(y >> 8); + pushedblocks_target[r14] = 0; + pushedblocks_subpixel[r14] = 0; + + if (dung_hdr_tag[0] != 38 && dung_replacement_tile_state[idx >> 1] == 0) { + if (!PushBlock_AttemptToPushTheBlock(0, x, y)) { + Ancilla_Sfx2_Near(0x22); + dung_replacement_tile_state[idx >> 1] = 1; + return false; + } + } + + index_of_changable_dungeon_objs[r14] = 0; + return true; +} + +void Sprite_Dungeon_DrawSinglePushBlock(int j) { // 87f0d9 + static const uint8 kPushedBlock_Tab1[9] = { 0, 1, 2, 3, 4, 0, 0, 0, 0 }; + static const uint8 kPushedblock_Char[4] = { 0xc, 0xc, 0xc, 0xff }; + j >>= 1; + Oam_AllocateFromRegionB(4); + OamEnt *oam = GetOamCurPtr(); + int y = (uint8)pushedblocks_y_lo[j] | (uint8)pushedblocks_y_hi[j] << 8; + int x = (uint8)pushedblocks_x_lo[j] | (uint8)pushedblocks_x_hi[j] << 8; + y -= BG2VOFS_copy2 + 1; + x -= BG2HOFS_copy2; + uint8 ch = kPushedblock_Char[kPushedBlock_Tab1[pushedblocks_some_index]]; + if (ch != 0xff) { + oam->x = x; + oam->y = y; + oam->charnum = ch; + oam->flags = 0x20; + bytewise_extended_oam[oam - oam_buf] = 2; + } +} + +void Link_Initialize() { // 87f13c + link_direction_facing = 2; + link_direction_last = 0; + link_item_in_hand = 0; + link_position_mode = 0; + link_debug_value_1 = 0; + link_debug_value_2 = 0; + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + link_is_transforming = 0; + bitfield_for_a_button = 0; + button_mask_b_y &= ~0x40; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + Link_ResetSwimmingState(); + link_cant_change_direction &= ~1; + link_z_coord &= 0xff; + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + countdown_for_blink = 0; + link_electrocute_on_touch = 0; + link_pose_for_item = 0; + link_cape_mode = 0; + Link_ForceUnequipCape_quietly(); + Link_ResetSwordAndItemUsage(); + link_disable_sprite_damage = 0; + player_handler_timer = 0; + link_direction &= ~0xf; + player_on_somaria_platform = 0; + link_spin_attack_step_counter = 0; +} + +void Link_ResetProperties_A() { // 87f1a3 + link_direction_last = 0; + link_direction = 0; + link_flag_moving = 0; + Link_ResetSwimmingState(); + link_is_transforming = 0; + countdown_for_blink = 0; + ancilla_arr24[0] = 0; + link_is_bunny = 0; + link_is_bunny_mirror = 0; + BYTE(link_timer_tempbunny) = 0; + link_need_for_poof_for_transform = 0; + byte_7E03FC = 0; + link_need_for_pullforrupees_sprite = 0; + BYTE(bit9_of_xcoord) = 0; + link_something_with_hookshot = 0; + link_give_damage = 0; + link_spin_offsets = 0; + tagalong_event_flags = 0; + link_want_make_noise_when_dashed = 0; + BYTE(tiledetect_tile_type) = 0; + item_receipt_method = 0; + link_triggered_by_whirlpool_sprite = 0; + Link_ResetProperties_B(); +} + +void Link_ResetProperties_B() { // 87f1e6 + player_on_somaria_platform = 0; + link_spin_attack_step_counter = 0; + fallhole_var1 = 0; + flag_is_sprite_to_pick_up_cached = 0; + bitmask_of_dragstate = 0; + link_this_controls_sprite_oam = 0; + player_near_pit_state = 0; + Link_ResetProperties_C(); +} + +void Link_ResetProperties_C() { // 87f1fa + tile_action_index = 0; + state_for_spin_attack = 0; + step_counter_for_spin_attack = 0; + tile_coll_flag = 0; + link_force_hold_sword_up = 0; + link_sword_delay_timer = 0; + tiledetect_misc_tiles = 0; + link_item_in_hand = 0; + link_position_mode = 0; + link_debug_value_1 = 0; + link_debug_value_2 = 0; + link_var30d = 0; + link_var30e = 0; + some_animation_timer_steps = 0; + bitfield_for_a_button = 0; + button_mask_b_y = 0; + button_b_frames = 0; + link_state_bits = 0; + link_picking_throw_state = 0; + link_grabbing_wall = 0; + link_cant_change_direction = 0; + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + link_electrocute_on_touch = 0; + link_pose_for_item = 0; + link_cape_mode = 0; + Link_ResetSwordAndItemUsage(); + link_disable_sprite_damage = 0; + player_handler_timer = 0; + related_to_hookshot = 0; + flag_is_ancilla_to_pick_up = 0; + flag_is_sprite_to_pick_up = 0; + link_need_for_pullforrupees_sprite = 0; + link_is_near_moveable_statue = 0; +} + +bool Link_CheckForEdgeScreenTransition() { // 87f439 + uint8 st = link_player_handler_state; + if (st == 3 || st == 8 || st == 9 || st == 10 || !link_incapacitated_timer) + return false; + link_actual_vel_x = link_actual_vel_y = 0; + link_recoilmode_timer = 3; + link_x_coord = link_x_coord_prev; + link_y_coord = link_y_coord_prev; + return true; +} + +void CacheCameraPropertiesIfOutdoors() { // 87f514 + if (!player_is_indoors) + CacheCameraProperties(); +} + +void SomariaBlock_HandlePlayerInteraction(int k) { // 88e7e6 + cur_object_index = k; + if (ancilla_G[k]) + return; + + if (!ancilla_H[k]) { + if (link_auxiliary_state || (link_state_bits & 1) || ancilla_z[k] != 0 && ancilla_z[k] != 0xff || ancilla_K[k] || ancilla_L[k]) + return; + if (!(joypad1H_last & 0xf)) { + ancilla_arr3[k] = 0; + bitmask_of_dragstate = 0; + ancilla_A[k] = 255; + if (!link_is_running) { + link_speed_setting = 0; + return; + } + } else if ((joypad1H_last & 0xf) == ancilla_arr3[k]) { + if (link_speed_setting == 18) + bitmask_of_dragstate |= 0x81; + } else { + ancilla_arr3[k] = (joypad1H_last & 0xf); + link_speed_setting = 0; + } + + CheckPlayerCollOut coll_out; + if (!Ancilla_CheckLinkCollision(k, 4, &coll_out) || ancilla_floor[k] != link_is_on_lower_level) + return; + + if (!link_is_running || link_dash_ctr == 64) { + uint8 t; + ancilla_x_vel[k] = 0; + ancilla_y_vel[k] = 0; + ancilla_arr3[k] = t = joypad1H_last & 15; + if (t & 3) { + ancilla_x_vel[k] = t & 1 ? 16 : -16; + ancilla_dir[k] = t & 1 ? 3 : 2; + } else { + ancilla_y_vel[k] = t & 8 ? -16 : 16; + ancilla_dir[k] = t & 8 ? 0 : 1; + } + if (link_actual_vel_y == 0 || link_actual_vel_x == 0) { + if (!Ancilla_CheckTileCollision_Class2(k)) { + Ancilla_MoveY(k); + Ancilla_MoveX(k); + if (!(link_state_bits & 0x80) && !(++ancilla_A[k] & 7)) + Ancilla_Sfx2_Pan(k, 0x22); + } + bitmask_of_dragstate = 0x81; + link_speed_setting = 0x12; + } + Sprite_NullifyHookshotDrag(); + return; + } + static const int8 kSomarianBlock_Yvel[4] = { -40, 40, 0, 0 }; + static const int8 kSomarianBlock_Xvel[4] = { 0, 0, -40, 40 }; + if (flag_is_ancilla_to_pick_up == k + 1) + flag_is_ancilla_to_pick_up = 0; + Link_CancelDash(); + Ancilla_Sfx3_Pan(k, 0x32); + int j = link_direction_facing >> 1; + ancilla_dir[k] = j; + ancilla_y_vel[k] = kSomarianBlock_Yvel[j]; + ancilla_x_vel[k] = kSomarianBlock_Xvel[j]; + ancilla_z_vel[k] = 48; + ancilla_H[k] = 1; + ancilla_z[k] = 0; + } + + ancilla_z_vel[k] -= 2; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + Ancilla_MoveZ(k); + if (ancilla_z[k] && ancilla_z[k] < 252) + return; + + Ancilla_Sfx2_Pan(k, 0x21); + ancilla_z[k] = 0; + int j = ancilla_H[k]++; + if (j == 3) { + ancilla_arr4[k] = 0; + ancilla_H[k] = 0; + } else { + static const int8 kSomarianBlock_Zvel[4] = { 48, 24, 16, 8 }; + ancilla_z_vel[k] = kSomarianBlock_Zvel[j - 1]; + ancilla_y_vel[k] = (int8)ancilla_y_vel[k] / 2; + ancilla_x_vel[k] = (int8)ancilla_x_vel[k] / 2; + } +} + +void Gravestone_Move(int k) { // 88ed89 + if (submodule_index) + return; + ancilla_y_vel[k] = -8; + Ancilla_MoveY(k); + + Gravestone_ActAsBarrier(k); + uint16 y_target = ancilla_B[k] << 8 | ancilla_A[k]; + uint16 y_cur = Ancilla_GetY(k); + + if (y_cur >= y_target) + return; + + ancilla_type[k] = 0; + link_something_with_hookshot = 0; + bitmask_of_dragstate &= ~4; + BYTE(scratch_0) = ((uint8 *)door_debris_y)[k]; + HIBYTE(scratch_0) = ((uint8 *)door_debris_x)[k]; + big_rock_starting_address = scratch_0; + + door_open_closed_counter = big_rock_starting_address == 0x532 ? 0x48 : + big_rock_starting_address == 0x488 ? 0x60 : 0x40; + Overworld_DoMapUpdate32x32_B(); +} + +void Gravestone_ActAsBarrier(int k) { // 88ee57 + uint16 x = Ancilla_GetX(k); + uint16 y = Ancilla_GetY(k); + uint16 r4 = y + 0x18; + uint16 r6 = x + 0x20; + uint16 lx = link_x_coord + 8; + uint16 ly = link_y_coord + 8; + if (ly >= y && ly < r4 && + lx >= x && lx < r6) { + uint16 r10 = abs16(ly - r4); + link_y_coord += r10; + link_y_vel += r10; + bitmask_of_dragstate |= 4; + } + if (link_direction_facing) + link_direction_facing &= ~4; +} + +void AncillaAdd_DugUpFlute(uint8 a, uint8 y) { // 898c73 + int k = Ancilla_AddAncilla(a, y); + if (k < 0) + return; + ancilla_step[k] = 0; + ancilla_z[k] = 0; + ancilla_z_vel[k] = 24; + ancilla_x_vel[k] = link_direction_facing == 4 ? -8 : 8; + DecodeAnimatedSpriteTile_variable(12); + Ancilla_SetXY(k, 0x490, 0xa8a); +} + +void AncillaAdd_CaneOfByrnaInitSpark(uint8 a, uint8 y) { // 898ee0 + for (int k = 4; k >= 0; k--) { + if (ancilla_type[k] == 0x31) + ancilla_type[k] = 0; + } + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_aux_timer[k] = 9; + link_disable_sprite_damage = 1; + ancilla_arr3[k] = 2; + } +} + +void AncillaAdd_ShovelDirt(uint8 a, uint8 y) { // 898f5b + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_item_to_link[k] = 0; + ancilla_timer[k] = 20; + Ancilla_SetXY(k, link_x_coord, link_y_coord); + } +} + +void AncillaAdd_Hookshot(uint8 a, uint8 y) { // 899b10 + static const int8 kHookshot_Yvel[4] = { -64, 64, 0, 0 }; + static const int8 kHookshot_Xvel[4] = { 0, 0, -64, 64 }; + static const int8 kHookshot_Yd[4] = { 4, 20, 8, 8 }; + static const int8 kHookshot_Xd[4] = { 0, 0, -4, 11 }; + + int k = Ancilla_AddAncilla(a, y); + if (k >= 0) { + ancilla_aux_timer[k] = 3; + ancilla_item_to_link[k] = 0; + ancilla_step[k] = 0; + ancilla_L[k] = 0; + related_to_hookshot = 0; + hookshot_effect_index = k; + ancilla_K[k] = 0; + ancilla_G[k] = 255; + ancilla_arr1[k] = 0; + ancilla_timer[k] = 0; + int j = link_direction_facing >> 1; + ancilla_dir[k] = j; + ancilla_x_vel[k] = kHookshot_Xvel[j]; + ancilla_y_vel[k] = kHookshot_Yvel[j]; + Ancilla_SetXY(k, link_x_coord + kHookshot_Xd[j], link_y_coord + kHookshot_Yd[j]); + } +} + +void ResetSomeThingsAfterDeath(uint8 a) { // 8bffbf + link_is_in_deep_water = 0; + link_speed_setting = a; + byte_7E03F3 = 0; + byte_7E0322 = 0; + flag_is_link_immobilized = 0; + overworld_palette_swap_flag = 0; + player_unk1 = 0; + link_give_damage = 0; + link_actual_vel_y = 0; + link_actual_vel_x = 0; + link_actual_vel_z = 0; + BYTE(link_z_coord) = 0; + draw_water_ripples_or_grass = 0; + byte_7E0316 = 0; + countdown_for_blink = 0; + link_player_handler_state = 0; + link_visibility_status = 0; + Ancilla_TerminateSelectInteractives(0); + Link_ResetProperties_A(); +} + +void SpawnHammerWaterSplash() { // 9aff3c + static const int8 kItem_Hammer_SpawnWater_X[4] = { 0, 12, -8, 24 }; + static const int8 kItem_Hammer_SpawnWater_Y[4] = { 8, 32, 24, 24 }; + if (submodule_index | flag_is_link_immobilized | flag_unk1) + return; + int i = link_direction_facing >> 1; + uint16 x = link_x_coord + kItem_Hammer_SpawnWater_X[i]; + uint16 y = link_y_coord + kItem_Hammer_SpawnWater_Y[i]; + uint8 tiletype; + if (player_is_indoors) { + int t = (link_is_on_lower_level >= 1) ? 0x1000 : 0; + t += (x & 0x1f8) >> 3; + t += (y & 0x1f8) << 3; + tiletype = dung_bg2_attr_table[t]; + } else { + tiletype = Overworld_ReadTileAttribute(x >> 3, y); + } + + if (tiletype == 8 || tiletype == 9) { + int j = Sprite_SpawnSmallSplash(0); + if (j >= 0) { + Sprite_SetX(j, x - 8); + Sprite_SetY(j, y - 16); + sprite_floor[j] = link_is_on_lower_level; + sprite_z[j] = 0; + } + } +} + +void DiggingGameGuy_AttemptPrizeSpawn() { // 9dfd5c + static const int8 kDiggingGameGuy_Xvel[2] = { -16, 16 }; + static const int8 kDiggingGameGuy_X[2] = { 0, 19 }; + static const uint8 kDiggingGameGuy_Items[4] = { 0xdb, 0xda, 0xd9, 0xdf }; + + beamos_x_hi[1]++; + if (link_y_coord >= 0xb18) + return; + int j = GetRandomNumber() & 7; + uint8 item_to_spawn; + switch (j) { + case 0: case 1: case 2: case 3: + item_to_spawn = kDiggingGameGuy_Items[j]; + break; + case 4: + if (beamos_x_hi[1] < 25 || beamos_x_hi[0] || GetRandomNumber() & 3) + return; + item_to_spawn = beamos_x_hi[0] = 0xeb; + break; + default: + return; + } + SpriteSpawnInfo info; + j = Sprite_SpawnDynamically(4, item_to_spawn, &info); // zelda bug: 4 wtf... + if (j >= 0) { + int i = link_direction_facing != 4; + sprite_x_vel[j] = kDiggingGameGuy_Xvel[i]; + sprite_y_vel[j] = 0; + sprite_z_vel[j] = 24; + sprite_stunned[j] = 255; + sprite_delay_aux4[j] = 48; + Sprite_SetX(j, (link_x_coord + kDiggingGameGuy_X[i]) & ~0xf); + Sprite_SetY(j, (link_y_coord + 22) & ~0xf); + sprite_floor[j] = 0; + SpriteSfx_QueueSfx3WithPan(j, 0x30); + } +} + diff --git a/player.h b/player.h new file mode 100644 index 00000000..36d1152e --- /dev/null +++ b/player.h @@ -0,0 +1,242 @@ +#pragma once +#include "types.h" + +extern const uint8 kSwimmingTab1[4]; +extern const uint8 kSwimmingTab2[2]; + +enum { + kPlayerState_Ground = 0, + kPlayerState_FallingIntoHole = 1, + kPlayerState_RecoilWall = 2, + kPlayerState_SpinAttacking = 3, + kPlayerState_Swimming = 4, + kPlayerState_TurtleRock = 5, + kPlayerState_RecoilOther = 6, + kPlayerState_Electrocution = 7, + kPlayerState_Ether = 8, + kPlayerState_Bombos = 9, + kPlayerState_Quake = 10, + kPlayerState_FallOfLeftRightLedge = 12, + kPlayerState_JumpOffLedgeDiag = 14, + kPlayerState_StartDash = 17, + kPlayerState_StopDash = 18, + kPlayerState_Hookshot = 19, + kPlayerState_Mirror = 20, + kPlayerState_HoldUpItem = 21, + kPlayerState_AsleepInBed = 22, + kPlayerState_PermaBunny = 23, + kPlayerState_ReceivingEther = 25, + kPlayerState_ReceivingBombos = 26, + kPlayerState_OpeningDesertPalace = 27, + kPlayerState_TempBunny = 28, + kPlayerState_PullForRupees = 29, + kPlayerState_SpinAttackMotion = 30, +}; + + + + + + +void Dungeon_HandleLayerChange(); +void CacheCameraProperties(); +void CheckAbilityToSwim(); +void Link_Main(); +void Link_ControlHandler(); +void LinkState_Default(); +void HandleLink_From1D(); +void PlayerHandler_00_Ground_3(); +bool Link_HandleBunnyTransformation(); +void LinkState_TemporaryBunny(); +void PlayerHandler_17_Bunny(); +void LinkState_Bunny_recache(); +void Link_TempBunny_Func2(); +void LinkState_HoldingBigRock(); +void EtherTablet_StartCutscene(); +void LinkState_ReceivingEther(); +void BombosTablet_StartCutscene(); +void LinkState_ReceivingBombos(); +void LinkState_ReadingDesertTablet(); +void HandleSomariaAndGraves(); +void LinkState_Recoil(); +void Link_HandleRecoilAndTimer(bool jump_into_middle); +void LinkState_OnIce(); +void Link_HandleChangeInZVelocity(); +void Player_ChangeZ(uint8 zd); +void LinkHop_HoppingSouthOW(); +void LinkState_HandlingJump(); +void LinkHop_FindTileToLandOnSouth(); +void LinkState_HoppingHorizontallyOW(); +void Link_HoppingHorizontally_FindTile_Y(); +void Link_SetToDeepWater(); +void LinkState_0F(); +uint8 Link_HoppingHorizontally_FindTile_X(uint8 o); +void LinkState_HoppingDiagonallyUpOW(); +void LinkState_HoppingDiagonallyDownOW(); +void LinkHop_FindLandingSpotDiagonallyDown(); +void Link_SplashUponLanding(); +void LinkState_Dashing(); +void LinkState_ExitingDash(); +void Link_CancelDash(); +void RepelDash(); +void LinkApplyTileRebound(); +void Sprite_RepelDash(); +void Flag67WithDirections(); +void LinkState_Pits(); +void HandleLayerOfDestination(); +void DungeonPitDoDamage(); +void HandleDungeonLandingFromPit(); +void PlayerHandler_04_Swimming(); +void Link_HandleSwimMovements(); +void Link_FlagMaxAccels(); +void Link_SetIceMaxAccel(); +void Link_SetMomentum(); +void Link_ResetSwimmingState(); +void Link_ResetStateAfterDamagingPit(); +void ResetAllAcceleration(); +void Link_HandleSwimAccels(); +void Link_SetTheMaxAccel(); +void LinkState_Zapped(); +void PlayerHandler_15_HoldItem(); +void Link_ReceiveItem(uint8 item, int chest_position); +void Link_TuckIntoBed(); +void LinkState_Sleeping(); +void Link_HandleSwordCooldown(); +void Link_HandleYItem(); +void Link_HandleAPress(); +void Link_APress_PerformBasic(uint8 action_x2); +void HandleSwordSfxAndBeam(); +void Link_CheckForSwordSwing(); +void HandleSwordControls(); +void Link_ResetSwordAndItemUsage(); +void Player_Sword_SpinAttackJerks_HoldDown(); +void LinkItem_Rod(); +void LinkItem_Hammer(); +void LinkItem_Bow(); +void LinkItem_Boomerang(); +void Link_ResetBoomerangYStuff(); +void LinkItem_Bombs(); +void LinkItem_Bottle(); +void LinkItem_Lamp(); +void LinkItem_Powder(); +void LinkItem_ShovelAndFlute(); +void LinkItem_Shovel(); +void LinkItem_Flute(); +void LinkItem_Book(); +void LinkItem_Ether(); +void LinkState_UsingEther(); +void LinkItem_Bombos(); +void LinkState_UsingBombos(); +void LinkItem_Quake(); +void LinkState_UsingQuake(); +void Link_ActivateSpinAttack(); +void Link_AnimateVictorySpin(); +void LinkState_SpinAttack(); +void LinkItem_Mirror(); +void DoSwordInteractionWithTiles_Mirror(); +void LinkState_CrossingWorlds(); +void Link_PerformDesertPrayer(); +void HandleFollowersAfterMirroring(); +void LinkItem_Hookshot(); +void LinkState_Hookshotting(); +void LinkItem_Cape(); +void Link_ForceUnequipCape(); +void Link_ForceUnequipCape_quietly(); +void HaltLinkWhenUsingItems(); +void Link_HandleCape_passive_LiftCheck(); +void Player_CheckHandleCapeStuff(); +void LinkItem_CaneOfSomaria(); +void LinkItem_CaneOfByrna(); +bool SearchForByrnaSpark(); +void LinkItem_Net(); +bool CheckYButtonPress(); +bool LinkCheckMagicCost(uint8 x); +void Refund_Magic(uint8 x); +void Link_ItemReset_FromOverworldThings(); +void Link_PerformThrow(); +void Link_APress_LiftCarryThrow(); +void Link_PerformDash(); +void Link_PerformGrab(); +void Link_APress_PullObject(); +void Link_PerformStatueDrag(); +void Link_APress_StatueDrag(); +void Link_PerformRupeePull(); +void LinkState_TreePull(); +void Link_PerformRead(); +void Link_PerformOpenChest(); +bool Link_CheckNewAPress(); +bool Link_HandleToss(); +void Link_HandleDiagonalCollision(); +void Player_LimitDirections_Inner(); +void Link_HandleCardinalCollision(); +void RunSlopeCollisionChecks_VerticalFirst(); +void RunSlopeCollisionChecks_HorizontalFirst(); +bool CheckIfRoomNeedsDoubleLayerCheck(); +void CreateVelocityFromMovingBackground(); +void StartMovementCollisionChecks_Y(); +void StartMovementCollisionChecks_Y_HandleIndoors(); +void HandlePushingBonkingSnaps_Y(); +void StartMovementCollisionChecks_Y_HandleOutdoors(); +bool RunLedgeHopTimer(); // carry +void Link_BonkAndSmash(); +void Link_AddInVelocityYFalling(); +void CalculateSnapScratch_Y(); +void ChangeAxisOfPerpendicularDoorMovement_Y(); +void Link_AddInVelocityY(); +void Link_HopInOrOutOfWater_Y(); +void Link_FindValidLandingTile_North(); +void Link_FindValidLandingTile_DiagonalNorth(); +void StartMovementCollisionChecks_X(); +void StartMovementCollisionChecks_X_HandleIndoors(); +void HandlePushingBonkingSnaps_X(); +void StartMovementCollisionChecks_X_HandleOutdoors(); +void SnapOnX(); +void CalculateSnapScratch_X(); +int8 ChangeAxisOfPerpendicularDoorMovement_X(); +void Link_HopInOrOutOfWater_X(); +void Link_HandleDiagonalKickback(); +void TileDetect_MainHandler(uint8 item); +bool Link_PermissionForSloshSounds(); +bool PushBlock_AttemptToPushTheBlock(uint8 what, uint16 x, uint16 y); +uint8 Link_HandleLiftables(); +void HandleNudging(int8 arg_r0); +void TileBehavior_HandleItemAndExecute(uint16 x, uint16 y); +uint8 PushBlock_GetTargetTileFlag(uint16 x, uint16 y); +void FlagMovingIntoSlopes_Y(); +void FlagMovingIntoSlopes_X(); +void Link_HandleRecoiling(); +void Player_HandleIncapacitated_Inner2(); +void Link_HandleVelocity(); +void LinkHop_FindArbitraryLandingSpot(); +void Link_HandleVelocityAndSandDrag(uint16 x, uint16 y); +void HandleSwimStrokeAndSubpixels(); +void Player_SomethingWithVelocity_TiredOrSwim(uint16 xvel, uint16 yvel); +void Link_HandleMovingFloor(); +void Link_ApplyMovingFloorVelocity(); +void Link_ApplyConveyor(); +void Link_HandleMovingAnimation_FullLongEntry(); +void Link_HandleMovingAnimation_StartWithDash(); +void Link_HandleMovingAnimationSwimming(); +void Link_HandleMovingAnimation_Dash(); +void HandleIndoorCameraAndDoors(); +void HandleDoorTransitions(); +void ApplyLinksMovementToCamera(); +uint8 FindFreeMovingBlockSlot(uint8 x); +bool InitializePushBlock(uint8 r14, uint8 idx); +void Sprite_Dungeon_DrawSinglePushBlock(int j); +void Link_Initialize(); +void Link_ResetProperties_A(); +void Link_ResetProperties_B(); +void Link_ResetProperties_C(); +bool Link_CheckForEdgeScreenTransition(); +void CacheCameraPropertiesIfOutdoors(); +void SomariaBlock_HandlePlayerInteraction(int k); +void Gravestone_Move(int k); +void Gravestone_ActAsBarrier(int k); +void AncillaAdd_DugUpFlute(uint8 a, uint8 y); +void AncillaAdd_CaneOfByrnaInitSpark(uint8 a, uint8 y); +void AncillaAdd_ShovelDirt(uint8 a, uint8 y); +void AncillaAdd_Hookshot(uint8 a, uint8 y); +void ResetSomeThingsAfterDeath(uint8 a); +void SpawnHammerWaterSplash(); +void DiggingGameGuy_AttemptPrizeSpawn(); diff --git a/player_oam.cpp b/player_oam.cpp new file mode 100644 index 00000000..5c2e7339 --- /dev/null +++ b/player_oam.cpp @@ -0,0 +1,1278 @@ +#include "player_oam.h" +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" +#include "player.h" +#include "misc.h" +static const int8 kPlayerOam_StairsOffsY[] = { + 0, -2, -3, 0, -2, -3, 0, 0, 0, 0, 0, 0, 0, -2, -3, 0, + -2, -3, 0, 0, 0, 0, 0, 0, +}; +static const uint16 kPlayerOam_FloorOamPrio[] = {0x2000, 0x1000, 0x3000, 0x2000}; +static const uint16 kPlayerOam_SortSpritesOffs[] = {0x190, 0xe0}; +static const int8 kPlayerOam_Tab1[9] = {0, 1, 2, 0, 1, 2, 0, 1, 2}; +static const int8 kPlayerOam_Tab2[8] = {6, 6, 6, 6, 7, 7, 8, 9}; +static const int8 kPlayerOam_Tab3[6] = {12, 11, 32, 34, 35, 37}; +static const int8 kPlayerOam_Tab4[8] = {38, 11, 11, 12, 11, 11, 11, 13}; +static const uint8 kPlayerOam_Tab5[7] = {4, 16, 18, 21, 23, 24, 39}; +static const uint16 kSwordTipSomething[] = { 0xFFFF, 0xFFFF, 0x6A3E, 0x6A2F, 0x6A2F, 0x2A05, 0x2A2F, 0x2A3E, 0xFFFF, 0xFFFF, 0xFFFF, 0xAA3E, 0xAA2F, 0xAA2F, 0xAA05, 0xEA2F, 0xEA3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x2A3E, 0x2A3F, 0x2A3F, 0x2A05, 0xAA3F, 0xAA3E, 0xFFFF, 0xFFFF, 0xFFFF, 0x6A3E, 0x6A3F, 0x6A3F, 0x6A05, 0xEA3F, 0xEA3E, 0xFFFF }; +static const int8 kSwordOamYOffs_Good[] = {-1, -1, -5, -13, -15, -21, -13, -5, -1, -1, -1, 22, 27, 29, 35, 27, 24, -1, -1, -1, -1, 2, 5, 12, 20, 26, -1, -1, -1, -1, 2, 5, 12, 20, 26, -1}; +static const int8 kSwordOamXOffs_Good[] = {-1, -1, 15, 13, 8, -1, -10, -14, -1, -1, -1, -6, -3, 1, 8, 16, 21, -1, -1, -1, -11, -15, -18, -24, -17, -12, -1, -1, -1, 19, 23, 26, 32, 25, 20, -1}; +static const uint16 kPlayerOamOtherOffs[] = { 0, 36, 72, 96, 108, 118, 122, 134, 36, 146, 154, 178, 185, 188, 212, 236, 252, 264, 272, 288, 300, 316, 339, 363, 374, 390, 396, 402, 408, 420, 421, 422, 424, 428, 444, 456, 468, 469, 470, 475, 9, 45, 78, 99, 108, 119, 125, 137, 45, 148, 160, 178, 185, 194, 218, 236, 255, 266, 276, 291, 304, 316, 345, 363, 378, 393, 399, 402, 411, 420, 421, 422, 425, 432, 447, 456, 468, 469, 470, 484, 18, 54, 84, 102, 108, 120, 128, 140, 54, 150, 166, 178, 182, 200, 224, 236, 258, 268, 280, 294, 308, 316, 351, 363, 382, 390, 396, 402, 414, 420, 421, 422, 426, 436, 450, 456, 468, 469, 470, 493, 27, 63, 90, 105, 108, 121, 131, 143, 63, 152, 172, 178, 185, 206, 230, 236, 261, 270, 284, 297, 312, 316, 357, 363, 386, 393, 399, 402, 417, 420, 421, 422, 427, 440, 453, 456, 468, 469, 470, 502 }; +static const int8 kSwordOamYOffs[511] = { + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, 9, 5, -2, -6, -8, -5, -3, 7, 9, 11, 15, 21, 25, 27, 25, 23, 13, 11, -2, 2, 3, 12, 12, 15, 22, 27, 27, -2, + 2, 3, 12, 12, 15, 22, 27, 27, -5, -4, -3, -5, -4, -3, 24, 25, 26, 24, 25, 26, 13, 14, 15, 13, 14, 15, 13, 14, 15, 13, 14, 15, + -3, -7, 2, 20, 26, 24, 10, 13, 15, 10, 13, 15, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -7, -1, -2, -3, 10, 26, + -2, 3, 14, -2, 3, 14, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -4, -8, 6, 15, 26, 26, 14, 6, -7, -7, 22, 26, 16, 8, 5, 12, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, 24, 16, -5, 16, + 13, -4, -5, -5, -1, -5, -5, -5, -5, 11, 15, 21, 25, 27, 13, -3, -7, 26, 18, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -4, -5, 4, 14, 20, 15, 8, -3, -8, 14, -3, 15, -128, -128, -128, -128, -128, -128, -128, 9, 5, -3, -9, -11, + -15, -9, -4, 8, 11, 14, 20, 25, 27, 31, 25, 23, 13, -2, -1, 0, 8, 9, 12, 16, 24, 30, -2, -1, 0, 8, 9, 12, 16, 24, 30, +}; +static const int8 kSwordOamXOffs[511] = { + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, 19, 18, 14, 10, 0, -4, -10, -13, -15, -8, -6, -5, 5, 8, 12, 18, 22, 23, 3, -2, -7, -11, -14, -11, -9, 1, 3, 5, + 10, 15, 19, 22, 19, 17, 7, 5, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, -10, -10, -10, -10, -10, -10, 18, 18, 18, 18, 18, 18, + -3, 2, -3, 10, 7, 10, -16, -24, -20, 16, 24, 20, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -2, -2, -2, 10, 10, 10, + 1, -10, -11, 7, 18, 19, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, 13, 6, 22, 22, 8, -1, -14, -14, -1, 9, -5, 3, 18, 21, -11, -12, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, 7, -9, 0, 17, + 22, 14, 10, 10, 14, 11, 8, 8, 8, 23, 22, 20, 12, 8, 23, 14, 10, 12, 12, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, 13, 13, 16, 11, 2, -11, -16, -9, 0, 11, -9, -11, -128, -128, -128, -128, -128, -128, -128, 19, 17, 15, 14, 3, + -1, -5, -11, -14, -8, -7, -6, 3, 5, 8, 12, 18, 22, 3, -2, -8, -13, -16, -20, -15, -12, 1, 5, 10, 16, 21, 24, 28, 23, 20, 7, +}; +static const int8 kPlayerOam_Main_SwordStuff_array1[511] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1, 5, 14, 26, 6, 8, 16, 20, 0, 0, 2, 13, + 25, 7, 11, 19, 23, 1, 6, 8, 16, 20, 0, 2, 13, 25, 7, 6, + 10, 18, 22, 1, 4, 15, 27, 7, 10, 10, 10, 10, 10, 10, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 6, 10, 6, 7, 9, 7, 0, 0, 0, 1, 1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 8, 10, 10, 8, 32, 29, 33, 29, 34, 30, + 31, 37, 38, 31, 35, 36, 42, 39, 39, 41, 40, 40, 44, 42, 42, 45, + 41, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 49, 49, 50, 47, 47, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 8, 5, 4, + 11, 9, 2, 3, 8, 10, 9, 11, 4, 5, 3, 2, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 3, + -1, 1, 5, 5, -1, 0, 3, 3, -1, 1, 5, 5, 9, 2, 6, 4, + 4, 10, 6, 6, 10, 6, 8, 8, 8, 1, 4, 15, 11, 7, 4, 10, + 6, 7, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, 54, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 68, 70, 68, + 68, 67, 71, 68, 74, 73, 69, 72, 55, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 6, 75, -1, -1, -1, -1, -1, 1, 5, 14, 26, 10, + 6, 8, 16, 20, 0, 2, 13, 25, 9, 7, 11, 19, 23, 6, 8, 16, + 20, 3, 0, 2, 13, 25, 6, 10, 18, 22, 5, 1, 4, 15, 27, +}; +static const uint8 kPlayerOam_Main_SwordStuff_array2[76] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, + 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, +}; +static const uint8 kPlayerOam_Main_SwordStuff_array3[76] = { + 6, 6, 4, 4, 4, 4, 0, 0, 8, 8, 8, 8, 2, 2, 2, 2, + 10, 10, 10, 10, 12, 12, 12, 12, 14, 14, 14, 14, 0, 9, 12, 9, + 12, 14, 10, 8, 13, 8, 13, 18, 18, 17, 17, 16, 16, 16, 16, 64, + 65, 64, 65, 24, 24, 25, 25, 36, 33, 37, 35, 34, 32, 38, 35, 37, + 38, 34, 40, 42, 41, 41, 44, 40, 43, 40, 43, 48, +}; +static const uint8 kPlayerOam_Main_SwordStuff_array4[10] = {1, 4, 1, 4, 6, 2, 0, 5, 0, 5}; +static const int8 kPlayerOam_ShieldStuff_array1[511] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 1, + 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1, 0, 1, 1, 2, 2, 2, 3, 3, 3, + 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1, 2, 0, 3, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, + 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 0, 0, + 3, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +}; +static const uint8 kPlayerOam_ShieldStuff_array2[18] = { + 0, 2, 4, 4, 4, 4, 4, 4, 9, 12, 9, 12, 14, 10, 8, 13, + 8, 13, +}; +static const uint8 kPlayerOam_ShieldStuff_array3[10] = {1, 4, 1, 4, 6, 2, 0, 5, 0, 5}; +static const uint8 kPlayerOamSpriteLocs[511] = { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0, 0, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 3, 6, 6, 6, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 0, 0, 0, 3, 3, 6, 6, 6, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, + 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 2, 1, 1, 2, 4, 4, 4, 4, + 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 3, 3, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 2, 2, 3, 6, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 5, 2, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, +}; +static const uint16 kPlayerOam_Tab6[28] = {0, 10, 22, 38, 61, 72, 88, 0, 13, 26, 38, 61, 76, 97, 0, 16, 30, 38, 61, 80, 106, 0, 19, 34, 38, 61, 84, 115}; +static const int8 kPlayerOam_Spr1Bank[124] = { + 0, -1, -1, 2, 3, 4, -1, -1, -1, -1, -1, 21, 23, -1, 21, 23, -1, 22, 24, -1, 21, 23, 19, 11, 15, -1, 17, 9, 13, -1, 9, 18, + 13, -1, 10, 17, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 23, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 23, -1, -1, 21, 21, -1, -1, 24, 24, -1, -1, 23, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 26, 26, -1, -1, -1, -1, -1, -1, 25, 25, 25, -1, -1, +}; +static const int8 kPlayerOam_Spr2Bank[124] = { + 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 24, -1, 22, 24, -1, -1, -1, -1, -1, -1, 20, 12, 16, -1, 18, 10, 14, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, 24, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, 24, -1, -1, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +}; +static const uint8 kPlayerOam_Tab19B[12] = {20, 28, 8, 16, 16, 20, 28, 16, 8, 8, 8, 20}; +static const uint8 kPlayerOam_Tab19A[12] = {0, 8, 0, 8, 8, 12, 20, 8, 8, 0, 0, 0}; +static const int8 kPlayerOam_Spr1X[124] = { + 8, -1, -1, 4, 4, 4, -1, -1, -1, -1, -1, -7, -9, -1, -8, -10, -1, 13, 16, -1, -5, -8, -2, -6, -5, -1, -1, -5, -6, -1, -3, 4, + 9, -1, 11, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -5, -8, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -5, -8, -1, -1, -5, -8, -1, -1, 15, 17, -1, -1, -7, -9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, -7, -3, -1, -1, -1, -1, -1, -1, 11, 15, 11, -1, -1, +}; +static const int8 kPlayerOam_Spr1Y[124] = { + 0, -1, -1, 8, 8, 8, -1, -1, -1, -1, -1, 7, 10, -1, 5, 8, -1, 8, 12, -1, 8, 12, 2, 7, 13, -1, 20, 14, 7, -1, 20, 21, + 20, -1, 20, 21, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -8, -8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 11, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 11, -1, -1, 6, 1, -1, -1, 13, 15, -1, -1, 13, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 12, 12, -1, -1, -1, -1, -1, -1, 12, 12, 12, -1, -1, +}; +static const int8 kPlayerOam_Spr2X[124] = { + -8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, -1, 16, 18, -1, -1, -1, -1, -1, -1, 10, 14, 13, -1, 9, 14, 14, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, 16, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, 16, -1, -1, 13, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +}; +static const int8 kPlayerOam_Spr2Y[124] = { + 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 10, -1, 5, 8, -1, -1, -1, -1, -1, -1, 2, 7, 13, -1, 20, 14, 7, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 11, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 11, -1, -1, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +}; +static const uint8 kPlayerOam_Tab20A[12] = {4, 12, 4, 12, 12, 16, 24, 12, 12, 12, 4, 4}; +static const uint8 kPlayerOam_Tab20B[12] = {24, 32, 12, 20, 20, 24, 32, 20, 12, 20, 12, 24}; +static const uint8 kPlayerOam_Prio[15] = {0x0, 0x0, 0x0, 0x0, 0x40, 0x40, 0x48, 0xc0, 0x48, 0xc0, 0x48, 0xc0, 0x48, 0xc0, 0x40}; +static const int8 kDrawSword_y[511] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 9, 5, -2, -6, -8, -5, -3, -1, 9, 11, 15, 13, 17, 19, 17, 15, 13, 11, -2, 2, 3, 4, 12, 15, 14, 19, 19, -2, + 2, 3, 4, 12, 15, 14, 19, 19, -5, -4, -3, -5, -4, -3, 16, 17, 18, 16, 17, 18, 13, 14, 15, 13, 14, 15, 13, 14, 15, 13, 14, 15, + -3, -7, 2, 12, 18, 16, 15, 13, 10, 15, 13, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 3, 6, 6, -8, -3, -3, -3, 10, 18, + -2, 2, 14, -2, 2, 14, 5, 9, 9, 9, 13, 13, 10, 7, 7, 10, 7, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, -4, 10, 11, -4, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, -8, 6, 15, 18, 18, 14, 6, -7, -7, 14, 17, 16, 8, 5, 12, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 6, 10, -1, 8, 6, 10, -1, 8, 6, 10, -1, 8, 6, 10, 16, 16, -5, 16, + 13, -4, -5, -5, -1, -5, -5, -5, -5, 11, 15, 13, 17, 19, 13, -3, -7, 18, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2, 17, 12, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -2, -9, -7, + -2, 16, 2, -2, 12, 2, -2, 12, -4, -5, 4, 14, 20, 15, 8, -3, -8, 14, -3, 15, -5, 0, -1, -1, -1, -1, -1, 9, 5, -3, -9, -11, + -15, -9, -4, 0, 11, 14, 12, 17, 19, 23, 17, 15, 13, -2, -1, 0, 0, 9, 12, 16, 16, 19, -2, -1, 0, 0, 9, 12, 16, 16, 19, +}; +static const int8 kDrawSword_x[511] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 11, 10, 6, 2, 0, -4, -10, -13, -15, -8, -6, -5, -3, 8, 12, 10, 14, 15, 3, -2, -7, -11, -14, -11, -9, -7, 3, 5, + 10, 7, 11, 14, 11, 9, 7, 5, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, -10, -10, -10, -10, -10, -10, 10, 10, 10, 10, 10, 10, + -3, 2, -3, 10, 7, 10, -12, -16, -8, 12, 16, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, 12, 8, 0, -2, -2, -2, 10, 10, 9, + 1, -10, -11, 7, 10, 11, -2, -5, -5, 9, 2, 2, -2, -3, -3, 2, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, -7, 8, 3, 7, 0, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, 6, 14, 14, 8, -1, -14, -14, -1, 9, -5, 3, 10, 13, -11, -12, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -14, -13, -12, -1, 14, 13, 12, -1, -14, -13, -12, -1, 14, 13, 12, 7, -9, 0, 9, + 14, 14, 10, 10, 14, 11, 8, 8, 8, 15, 14, 12, 12, 8, 15, 14, 10, 4, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, -7, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -3, -3, 9, + 12, 8, 10, 3, -13, -10, 5, 13, 13, 13, 16, 11, 2, -11, -16, -9, 0, 8, -9, -11, 12, -7, -1, -1, -1, -1, -1, 11, 9, 7, 6, 3, + -1, -5, -11, -14, -8, -7, -6, -5, 5, 8, 12, 10, 14, 3, -2, -8, -13, -16, -20, -15, -12, -7, 5, 10, 8, 13, 16, 20, 15, 12, 7, +}; +static const int8 kPlayerOam_Rod[3] = {0x2, 0x4, 0x4}; +static const uint16 kSwordTiledata[228] = { + 0x2a05, 0x2a06, 0xffff, + 0x6a06, 0x6a05, 0xffff, + 0xaa05, 0xaa06, 0xffff, + 0x2a05, 0x2a06, 0xffff, + 0xea06, 0xea05, 0xffff, + 0x6a06, 0x6a05, 0xffff, + 0x2a05, 0xffff, 0x2a15, + 0xaa15, 0xffff, 0xaa05, + 0x2a05, 0xffff, 0x2a15, + 0xaa15, 0xffff, 0xaa05, + 0x6a05, 0xffff, 0x6a15, + 0xea15, 0xffff, 0xea05, + 0x2a05, 0xffff, 0xffff, + 0xaa05, 0xffff, 0xffff, + 0x6a05, 0xffff, 0xffff, + 0xea05, 0xffff, 0xffff, + 0x2a05, 0xffff, 0xffff, + 0xaa05, 0xffff, 0xffff, + 0x6a05, 0xffff, 0xffff, + 0xea05, 0xffff, 0xffff, + 0x2a05, 0xffff, 0xffff, + 0xaa05, 0xffff, 0xffff, + 0x6a05, 0xffff, 0xffff, + 0xea05, 0xffff, 0xffff, + 0x2a05, 0xffff, 0xffff, + 0xaa05, 0xffff, 0xffff, + 0x6a05, 0xffff, 0xffff, + 0xea05, 0xffff, 0xffff, + 0xaa15, 0xffff, 0xffff, + 0x2209, 0xffff, 0x2219, + 0x2209, 0xffff, 0x2219, + 0x221a, 0xffff, 0x2219, + 0xa219, 0xffff, 0xa209, + 0x2209, 0xffff, 0x2219, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2219, 0x2209, 0xffff, + 0x6209, 0xffff, 0xffff, + 0x6209, 0x6219, 0xffff, + 0xa209, 0xe209, 0xffff, + 0x2209, 0x6209, 0xffff, + 0x6209, 0xffff, 0xe209, + 0x2209, 0xffff, 0xa209, + 0xa209, 0xffff, 0xffff, + 0x6209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0xe209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x6209, 0xffff, 0xffff, + 0x6209, 0xffff, 0xffff, + 0x221a, 0xffff, 0xffff, + 0x221a, 0xffff, 0xffff, + 0x221a, 0xffff, 0xffff, + 0x221a, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0xe209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0xffff, + 0x2209, 0xffff, 0x2219, + 0x2209, 0xffff, 0x2219, + 0x2209, 0xffff, 0x2219, + 0x6209, 0xffff, 0x6219, + 0x2209, 0xffff, 0x2219, + 0x2209, 0xffff, 0xffff, + 0xa219, 0xa209, 0xffff, + 0x6209, 0xffff, 0xffff, + 0xe209, 0xe219, 0xffff, + 0x2809, 0xffff, 0xffff, +}; +static const int8 kShieldStuff_x[511] = { + 5, 5, 5, 5, 5, 5, 5, 5, 5, -4, -4, -4, -4, -4, -4, -4, -4, -4, -8, -8, -8, -8, -8, -8, -8, -8, -8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 6, 6, 8, 8, 10, 10, 10, 10, 10, -5, -5, -7, -7, -10, -10, -10, -10, -10, 1, 1, 1, 1, 0, 0, 0, 0, 0, -1, + -1, -1, -1, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, -9, -9, -9, -9, -9, -9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 10, 10, 10, -10, -10, -10, 0, -1, 0, 0, 1, 0, -4, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -4, 2, -3, 9, 9, 9, -10, -10, -10, + 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 9, -4, -10, 0, 0, 8, 0, 5, 5, 5, 5, 5, 5, + -4, -4, -4, -4, -4, -4, -8, -8, -8, -8, -8, -8, 8, 8, 8, 8, 8, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -4, -8, 5, 8, + -4, -4, -4, -4, -5, -5, -5, -5, -5, -10, -10, -10, -10, -10, -5, -5, -7, -4, -4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, 9, 9, -10, -10, -10, -1, -1, + -1, -1, -1, -1, -6, -1, -1, -1, 10, -10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 10, 10, 10, 10, + 10, 10, 10, 10, -9, -9, -9, -9, -10, -10, -10, -10, -10, 1, 1, 1, 2, 2, 2, 1, 2, 2, -1, -1, -1, -2, -2, -2, -1, -2, -2, +}; +static const int8 kShieldStuff_y[511] = { + 5, 5, 4, 3, 5, 5, 4, 3, 5, 9, 10, 9, 7, 8, 10, 9, 7, 8, 5, 5, 4, 3, 4, 5, 4, 3, 4, 5, 5, 4, 3, 4, + 5, 4, 3, 4, 12, 12, 8, 8, 6, 6, 6, 6, 6, 1, 1, 3, 3, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 5, 6, 7, 6, 7, 8, 6, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 7, 5, 7, 7, 8, 7, 5, 5, 5, 5, 5, 5, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 8, 7, 7, 6, 5, 5, 7, 7, 7, + 5, 5, 5, 5, 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, 6, 11, 7, 4, 8, 4, 8, 4, 5, 6, 4, 5, 6, + 10, 11, 12, 10, 11, 12, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 5, 4, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 10, 10, 1, 10, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 5, 5, 7, 7, 7, -1, -1, + -1, -1, -1, -1, 9, -1, -1, -1, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, 8, 6, 6, 4, + 2, 5, 6, 6, 1, 1, 4, 4, 6, 8, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +}; +static const uint8 kShieldStuff_oam_index_ptrs_1[12] = {36, 20, 36, 8, 32, 36, 20, 36, 36, 36, 16, 28}; +static const uint8 kShieldStuff_oam_index_ptrs_0[12] = {28, 0, 28, 0, 24, 28, 12, 28, 36, 28, 8, 8}; +static const uint16 kShieldStuff_OamData[54] = { + 0x2a07, 0xffff, 0xffff, + 0x2a07, 0xffff, 0xffff, + 0x2a07, 0xffff, 0xffff, + 0x6a07, 0xffff, 0xffff, + 0x2a07, 0xffff, 0xffff, + 0x6a07, 0xffff, 0xffff, + 0x2a07, 0xffff, 0xffff, + 0x6a07, 0xffff, 0xffff, + 0x2809, 0xffff, 0x2819, + 0x2809, 0xffff, 0x2819, + 0x281a, 0xffff, 0x2819, + 0xa819, 0xffff, 0xa809, + 0x2809, 0xffff, 0x2819, + 0x2809, 0xffff, 0xffff, + 0x2809, 0xffff, 0xffff, + 0x2819, 0x2809, 0xffff, + 0x6809, 0xffff, 0xffff, + 0x6809, 0x6819, 0xffff, +}; +static const uint8 kLinkBody_oam_index_0[12] = {20, 28, 8, 16, 0, 20, 24, 0, 16, 4, 16, 28}; +static const uint8 kLinkBody_oam_index_1[12] = {28, 36, 16, 24, 8, 28, 36, 8, 16, 12, 24, 36}; +static const uint16 kLinkDmaGraphicsIndices[511] = { + 0, 174, 175, 176, 177, 178, 179, 180, 181, 5, 182, 183, 184, 185, 182, 186, 187, 188, 10, 10, 189, 190, 191, 192, 193, 194, 195, 13, 13, 196, 197, 198, + 199, 200, 201, 202, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, + 28, 29, 29, 30, 30, 31, 31, 31, 32, 33, 34, 32, 35, 36, 37, 38, 39, 37, 40, 41, 42, 43, 44, 42, 43, 44, 45, 46, 47, 45, 46, 47, + 49, 48, 50, 52, 51, 52, 54, 53, 55, 57, 56, 58, 59, 60, 61, 62, 62, 62, 0, 13, 5, 10, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 33, 116, 5, 117, 118, 42, 26, 119, 45, 30, 120, 163, 164, 165, 166, 167, 26, 168, 30, 0, 206, 207, 0, 162, 36, + 5, 208, 209, 5, 210, 211, 10, 212, 213, 10, 212, 213, 13, 214, 215, 13, 214, 215, 125, 126, 127, 128, 83, 84, 85, 86, 87, 88, 89, 90, 91, 89, + 92, 93, 94, 95, 96, 94, 97, 98, 99, 100, 101, 99, 100, 101, 102, 103, 104, 102, 103, 104, 32, 33, 34, 32, 35, 36, 37, 38, 39, 37, 40, 41, + 42, 43, 44, 42, 43, 44, 45, 46, 47, 45, 46, 47, 105, 106, 107, 107, 108, 108, 109, 109, 13, 13, 110, 111, 112, 113, 114, 115, 216, 217, 217, 218, + 219, 219, 220, 221, 221, 222, 223, 223, 142, 143, 144, 145, 146, 147, 148, 149, 152, 150, 151, 150, 155, 153, 154, 153, 158, 156, 157, 156, 161, 159, 160, 159, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 171, 171, 172, 172, 169, 169, 170, 170, 171, 171, 172, 172, 169, 169, 170, 170, 37, 42, 32, 45, + 107, 173, 173, 173, 107, 203, 203, 203, 203, 204, 204, 204, 166, 166, 107, 203, 94, 205, 205, 224, 225, 226, 224, 227, 228, 229, 230, 231, 229, 232, 233, 234, + 235, 236, 234, 235, 236, 237, 238, 239, 237, 238, 239, 257, 279, 279, 279, 279, 240, 241, 255, 94, 219, 255, 257, 279, 279, 279, 260, 280, 280, 280, 263, 281, + 281, 281, 266, 282, 282, 282, 245, 246, 247, 242, 243, 244, 251, 252, 253, 248, 249, 250, 5, 10, 0, 13, 272, 273, 0, 33, 116, 5, 117, 118, 42, 26, + 119, 45, 30, 120, 274, 275, 276, 277, 18, 22, 26, 30, 283, 284, 283, 285, 286, 287, 286, 288, 289, 290, 289, 290, 291, 292, 291, 292, 111, 293, 294, 106, + 203, 72, 113, 99, 26, 295, 102, 30, 105, 203, 107, 10, 10, 109, 109, 13, 13, 112, 114, 110, 203, 297, 299, 300, 301, 302, 63, 16, 16, 79, 79, 294, + 80, 294, 19, 19, 20, 20, 21, 21, 81, 82, 81, 23, 23, 24, 24, 25, 130, 131, 132, 133, 134, 134, 28, 28, 29, 121, 122, 123, 124, 129, 129, +}; +struct LinkSpriteBody { + int8 y, x; + uint8 tile; +}; +static const LinkSpriteBody kLinkSpriteBodys[303] = { + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 0, 1, 0x44}, + { 1, 1, 0x44}, + { 2, 2, 0x44}, + { 0, -1, 0x00}, + { 1, -1, 0x00}, + { 2, -2, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 1, 0x44}, + { 1, 1, 0x44}, + { 1, 0, 0x44}, + { 1, 1, 0x44}, + { 1, -1, 0x00}, + { 1, -1, 0x00}, + { 1, 0, 0x00}, + { 1, -1, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 0, 1, 0x44}, + { 1, 1, 0x44}, + { 2, 1, 0x44}, + { 0, -1, 0x00}, + { 1, -1, 0x00}, + { 2, -1, 0x00}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x00}, + { 2, -1, 0x44}, + { 1, 1, 0x44}, + { 1, 1, 0x44}, + { 2, 1, 0x00}, + { 1, -1, 0x00}, + { 1, -1, 0x00}, + { 0, -8, 0x00}, + { 4, 0, 0x0f}, + { 4, 0, 0x0f}, + { 0, 0, 0xff}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x44}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + {-1, 0, 0x00}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 0, 0, 0x44}, + { 1, 0, 0x44}, + { 1, 0, 0x44}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 0, 0x00}, + {-1, 0, 0x00}, + {-5, 0, 0x00}, + { 2, 0, 0x00}, + { 5, 0, 0x00}, + {-1, 0, 0x44}, + { 0, 0, 0x44}, + { 0, 1, 0x44}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 0, -1, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 0, 1, 0x44}, + { 1, 1, 0x44}, + { 2, 1, 0x44}, + { 0, -1, 0x00}, + { 1, -1, 0x00}, + { 2, -1, 0x00}, + { 1, 0, 0x04}, + { 0, 0, 0x44}, + { 0, 0, 0x00}, + { 0, 1, 0x44}, + { 0, 0, 0x00}, + { 0, 0, 0x04}, + { 0, 0, 0x44}, + { 0, 1, 0x40}, + { 0, 2, 0x40}, + { 0, -1, 0x00}, + { 0, -2, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 1, 0x44}, + { 0, -1, 0x00}, + { 1, 1, 0x00}, + { 2, 1, 0x00}, + { 2, 4, 0x00}, + { 2, 1, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 1, -1, 0x44}, + { 2, -1, 0x44}, + { 2, -4, 0x44}, + { 2, -1, 0x44}, + { 1, 0, 0x44}, + { 0, 0, 0x00}, + { 0, 0, 0x40}, + { 0, 0, 0x04}, + { 0, 0, 0x04}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x04}, + { 1, 0, 0x00}, + { 2, 0, 0x04}, + { 5, 1, 0x40}, + { 6, 1, 0x44}, + { 5, -1, 0x04}, + { 6, -1, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x04}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x44}, + { 0, 0, 0x00}, + {13, 3, 0x44}, + {12, 5, 0x44}, + {12, 5, 0x44}, + {13, -3, 0x00}, + {12, -5, 0x00}, + {12, -5, 0x00}, + { 1, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 0, 0, 0x44}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x44}, + { 0, 0, 0x44}, + {-1, 0, 0x04}, + { 0, 0, 0x00}, + {-1, 0, 0x00}, + {-2, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + {-1, 0, 0x00}, + {-2, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x04}, + {-1, 0, 0x00}, + {-2, 0, 0x00}, + { 0, 0, 0x00}, + {-1, 0, 0x04}, + {-2, 0, 0x04}, + { 0, 0, 0x04}, + {-1, 1, 0x44}, + {-1, 0, 0x44}, + { 0, 1, 0x44}, + { 0, 1, 0x44}, + {-1, 1, 0x44}, + {-1, 0, 0x44}, + { 0, 0, 0x44}, + {-1, -1, 0x00}, + {-1, 0, 0x00}, + { 0, -1, 0x00}, + { 0, -1, 0x00}, + {-1, -1, 0x00}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x04}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 1, 1, 0x44}, + { 2, 1, 0x44}, + { 1, -1, 0x00}, + { 2, -1, 0x00}, + { 2, 0, 0x00}, + { 2, 0, 0x00}, + { 3, 0, 0x00}, + { 3, 0, 0x00}, + { 2, -2, 0x44}, + { 2, 1, 0x44}, + { 2, 2, 0x00}, + { 2, -1, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x04}, + { 2, 0, 0x04}, + { 2, 0, 0x00}, + { 3, 0, 0x00}, + { 4, 0, 0x00}, + { 3, 0, 0x04}, + { 4, 0, 0x04}, + { 0, 0, 0x44}, + { 1, 0, 0x44}, + { 2, 0, 0x44}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 3, 0, 0x00}, + { 2, 0, 0x00}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + {-1, 0, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + {-1, 0, 0x44}, + { 0, 0, 0x44}, + { 1, 0, 0x44}, + {-1, 0, 0x44}, + { 0, 0, 0x44}, + { 1, 0, 0x44}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 0, 0x00}, + { 2, 0, 0x00}, + { 0, 0, 0x00}, + { 3, 0, 0x00}, + { 4, 0, 0x00}, + { 2, 0, 0x00}, + { 0, -1, 0x44}, + { 1, 1, 0x44}, + { 0, 1, 0x44}, + { 0, 1, 0x00}, + { 1, 1, 0x00}, + { 0, -1, 0x00}, + { 3, 0, 0x00}, + { 2, 0, 0x04}, + { 3, 0, 0x04}, + { 0, 2, 0x00}, + { 8, 8, 0x00}, + { 0, 0, 0x00}, + { 0, 0, 0x00}, + {-1, 0, 0x0f}, + { 1, 0, 0x00}, + { 0, 0, 0x04}, + { 0, 0, 0x00}, + { 2, 0, 0x00}, + { 1, 4, 0x44}, + { 1, -4, 0x00}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 0, 0x04}, + { 0, 0, 0x00}, + { 1, 0, 0x00}, + { 1, 0, 0x04}, + { 0, 1, 0x44}, + { 1, 1, 0x44}, + { 0, -1, 0x00}, + { 1, -1, 0x00}, + { 0, 0, 0x44}, + {-2, 0, 0x00}, + { 0, -2, 0x04}, + { 0, 0, 0x00}, + { 0, 1, 0x00}, + { 0, 0, 0x04}, + {12, 0, 0x08}, + {14, 0, 0x80}, + {12, 0, 0x00}, + {11, 0, 0x00}, +}; +static const uint8 kSwordStuff_oam_index_ptrs_1[12] = {0, 0, 24, 32, 24, 0, 0, 24, 24, 24, 32, 0}; +static const uint8 kSwordStuff_oam_index_ptrs_0[12] = {8, 16, 16, 24, 16, 0, 0, 16, 24, 16, 24, 16}; +static const int8 kPlayerOam_DrawOam_Throwing_State[16] = {-1, -1, -1, -1, 0, -1, -1, -1, 0, 0, -1, -1, 0, 0, 0, -1}; +static const int8 kPlayerOam_DrawOam_Throwing_X[16] = {-1, -1, -1, -1, 8, -1, -1, -1, 8, 5, -1, -1, 8, 5, 2, -1}; +static const int8 kPlayerOam_DrawOam_Throwing_Y[16] = {-1, -1, -1, -1, 14, -1, -1, -1, 14, 22, -1, -1, 14, 22, 30, -1}; +static const uint8 kShieldTypeToOffs[4] = {4, 4, 8, 8}; +static const int8 kOffsToShadowGivenDir_X[12] = {0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0}; +static const int8 kOffsToShadowGivenDir_Y[12] = {16, 16, 17, 17, 16, 16, 16, 16, 18, 18, 18, 18}; +static const uint8 kShadow_oam_indexes_1[12] = {12, 12, 0, 0, 0, 12, 12, 0, 0, 0, 0, 12}; +static const uint8 kShadow_oam_indexes_0[12] = {40, 40, 40, 40, 40, 40, 40, 40, 0, 40, 40, 40}; +static const uint16 kLinkShadows_Chardata[22] = {0x286c, 0x686c, 0x2828, 0x6828, 0x2838, 0xffff, 0x286e, 0x686e, 0x287e, 0x687e, 0x24d8, 0x64d8, 0x24d9, 0x64d9, 0x24da, 0x64da, 0x22c8, 0x62c8, 0x22c9, 0x62c9, 0x22ca, 0x62ca}; +static const uint8 kPlayerOam_DrawOam_2X[3] = {0, 0, 4}; +bool PlayerOam_WantInvokeSword() { + if (link_player_handler_state != kPlayerState_Ether && + link_player_handler_state != kPlayerState_Bombos && + link_player_handler_state != kPlayerState_Quake && + link_player_handler_state != kPlayerState_SpinAttacking && + link_player_handler_state != kPlayerState_SpinAttackMotion && + !link_state_bits && !link_force_hold_sword_up && !link_electrocute_on_touch) { + if (link_item_in_hand & 0x40) + return false; + if (link_position_mode & 0x3d || link_item_in_hand & 0x93) + return true; + if (!(button_mask_b_y & 0x80)) + return false; + } + return ((link_sword_type + 1) & 0xfe) != 0; +} + +void CalculateSwordHitBox() { // 879e63 + if (link_sword_type == 0 || link_sword_type == 0xff) + return; + if (link_sword_type >= 2 && button_b_frames < 9) { + int i = button_b_frames + ((link_direction_facing>>1) * 9); + if ((uint8)kSwordTipSomething[i] != 0xff) { + player_oam_y_offset = kSwordOamYOffs_Good[i]; + player_oam_x_offset = kSwordOamXOffs_Good[i]; + return; + } + } + uint8 offs = button_b_frames; + if (offs == 9) + return; + uint8 y = 39; + if (offs >= 10) { + offs -= 10; + y = 3; + } + int i = kPlayerOamOtherOffs[(link_direction_facing >> 1) * 40 + y] + offs; + player_oam_y_offset = kSwordOamYOffs[i]; + player_oam_x_offset = kSwordOamXOffs[i]; +} + +void LinkOam_Main() { // 8da18e + uint16 y_coord_backup = link_y_coord; + + if (submodule_index == 18 || submodule_index == 19) { + int t = submodule_index == 18 ? 0 : 12; + t += which_staircase_index & 4 ? 6 : 0; + t += (link_animation_steps < 6) ? link_animation_steps : 0; + link_y_coord += kPlayerOam_StairsOffsY[t]; + } + + uint8 xcoord = link_x_coord - BG2HOFS_copy2; + uint8 ycoord = link_y_coord - BG2VOFS_copy2; + player_oam_x_offset = player_oam_y_offset = 0x80; + uint8 scratch_0_var = (draw_water_ripples_or_grass != 0); + oam_priority_value = kPlayerOam_FloorOamPrio[link_is_on_lower_level]; + sort_sprites_offset_into_oam_buffer = kPlayerOam_SortSpritesOffs[(uint8)sort_sprites_setting]; + + uint8 yt, rt; + + if (link_player_handler_state == kPlayerState_AsleepInBed && link_pose_during_opening != 2) { + yt = 0x1f, rt = link_pose_during_opening; + goto continue_after_set; + } + if (link_force_hold_sword_up) { + yt = 0x24, rt = 0; + link_direction_facing_mirror = link_direction_facing; + goto continue_after_set; + } + if (link_is_bunny_mirror) { + yt = 0x21, rt = link_animation_steps & 3; + link_direction_facing_mirror = link_direction_facing; + goto continue_after_set; + } + yt = draw_water_ripples_or_grass ? 10 : 0; + + if (submodule_index == 14 && main_module_index != 18 && ((yt = 10), link_actual_vel_x)) { + if (link_direction_facing != 4 && link_direction_facing != 6) { + rt = kPlayerOam_Tab1[link_animation_steps]; + yt = which_staircase_index & 4 ? 0x1a : 0x19; + } else { + rt = link_animation_steps; + } + } else { + if (link_grabbing_wall & 3) { + yt = 0x18, rt = some_animation_timer_steps; + } else { + if (bitmask_of_dragstate & 0xd) { + yt = 0x16; + if (link_animation_steps >= 5) + link_animation_steps = 0; + } + rt = link_animation_steps; + } + } + link_direction_facing_mirror = link_direction_facing; + if (link_is_in_deep_water) + oam_priority_value = 0x2000; + + if (link_player_handler_state == kPlayerState_Swimming) { + yt = 0x11, rt &= 1; + if (submodule_index == 0 && (joypad1H_last & 0xf) != 0 || (swimcoll_var7[0] | swimcoll_var7[1])) + yt = 0x13, rt = byte_7E02CC; + if (link_maybe_swim_faster) + yt = 0x12, rt = link_maybe_swim_faster - 1; + goto continue_after_set; + } + if (link_pose_for_item) { + rt = 0, yt = (link_pose_for_item != 2) ? 0x1d : 0x1e; + goto continue_after_set; + } + if (player_unk1 & 1) { + yt = 0x1b, rt = some_animation_timer_steps; + goto continue_after_set; + } + + if (link_auxiliary_state != 0) { + if (link_auxiliary_state == 4) { + yt = 0x13, rt = kSwimmingTab1[(frame_counter & 0x18) >> 3]; + goto continue_after_set; + } else if (link_auxiliary_state == 1) { + if (link_player_handler_state == kPlayerState_TurtleRock) { + if (!byte_7E034E) + oam_priority_value = 0x3000; + goto link_state_is_empty; + } else if (link_player_handler_state != kPlayerState_Hookshot && !link_cape_mode) { + if (link_electrocute_on_touch) + yt = 0x14, rt = player_handler_timer & 3; + else + yt = 5, rt = 0; + goto continue_after_set; + } + } + } + + if (player_near_pit_state != 0 && player_near_pit_state != 1) { + if (player_near_pit_state == 3) + sort_sprites_offset_into_oam_buffer = 0; + yt = 4, rt = link_this_controls_sprite_oam; + if (rt >= 6) + oam_priority_value |= 0x3000; + goto continue_after_set; + } + + if (link_state_bits != 0) { + uint8 bit = FindMostSignificantBit(link_state_bits); + if (bit < 6) + link_direction_facing_mirror = 2; + yt = kPlayerOam_Tab4[bit]; + if (yt >= 0xd) { + if (link_picking_throw_state & 2) + yt += 1; + + if (link_picking_throw_state & 1) + yt = 0x10; + else if (link_state_bits & 0x80) + goto continue_after_set; + } + rt = some_animation_timer_steps; + goto continue_after_set; + } +link_state_is_empty: + if (link_unk_master_sword != 0) { + yt = 0x17, rt = link_unk_master_sword - 1; + goto continue_after_set; + } + + if (link_item_in_hand != 0) { + yt = kPlayerOam_Tab2[FindMostSignificantBit(link_item_in_hand)]; + rt = player_handler_timer; + goto continue_after_set; + } else if (link_position_mode != 0) { + yt = kPlayerOam_Tab3[FindMostSignificantBit(link_position_mode)]; + rt = player_handler_timer; + goto continue_after_set; + } + + if (link_player_handler_state == kPlayerState_Quake || link_player_handler_state == kPlayerState_Ether || link_player_handler_state == kPlayerState_Bombos) { + yt = 0x15, rt = state_for_spin_attack; + goto continue_after_set; + } else if (link_player_handler_state == kPlayerState_SpinAttackMotion || link_player_handler_state == kPlayerState_SpinAttacking) { + yt = 0xf, rt = state_for_spin_attack; + goto continue_after_set; + } + + if (button_mask_b_y & 0x80) { + if (button_b_frames == 9) { + yt = 2; + } else { + yt = 0x27, rt = button_b_frames; + if (rt >= 9) { + yt = 3; + rt -= 10; + } + } + } +continue_after_set: + value_computed_for_player_oam = yt; + if (yt != 5) + oam_priority_value_2 = oam_priority_value; + + BYTE(index_of_interacting_tile) = rt; + + int dir = link_direction_facing >> 1; + int scratch_1_var = dir * 14; + + int r2 = kPlayerOamOtherOffs[dir * 40 + yt] + rt; + int r4loc = kPlayerOamSpriteLocs[r2]; + + link_palette_bits_of_oam = overworld_palette_swap_flag ? 0 : 0xe00; + link_dma_var1 = link_dma_var2 = 0; + + int xt = FindInByteArray(kPlayerOam_Tab5, yt, 7); + if (xt >= 0) { + int j = kPlayerOam_Tab6[xt + dir * 7] + rt; + scratch_1 = j; + { + uint8 bank1 = kPlayerOam_Spr1Bank[j]; + if (bank1 != 0xff) { + link_dma_var1 = bank1 * 2; + int oam_pos = ((scratch_0_var ? kPlayerOam_Tab19B : kPlayerOam_Tab19A)[r4loc] + sort_sprites_offset_into_oam_buffer) >> 2; + uint8 zt = ((int16)link_z_coord >= 0 || BYTE(link_z_coord) < 0xf0) ? BYTE(link_z_coord) : 0; + oam_buf[oam_pos].y = kPlayerOam_Spr1Y[j] + ycoord - zt; + oam_buf[oam_pos].x = kPlayerOam_Spr1X[j] + xcoord; + uint16 q = WORD(kPlayerOam_Prio[bank1 >> 1]); + q = (bank1 & 1) ? q << 4 : q; + WORD(oam_buf[oam_pos].charnum) = (q & 0xc000) | oam_priority_value | link_palette_bits_of_oam | 4; + bytewise_extended_oam[oam_pos] = 0; + } + } + + uint8 bank2 = kPlayerOam_Spr2Bank[j]; + if (bank2 != 0xff) { + link_dma_var2 = bank2 * 2; + int oam_pos = ((scratch_0_var ? kPlayerOam_Tab20B : kPlayerOam_Tab20A)[r4loc] + sort_sprites_offset_into_oam_buffer) >> 2; + uint8 zt = ((int16)link_z_coord >= 0 || BYTE(link_z_coord) < 0xf0) ? BYTE(link_z_coord) : 0; + oam_buf[oam_pos].y = kPlayerOam_Spr2Y[j] + ycoord - zt; + oam_buf[oam_pos].x = kPlayerOam_Spr2X[j] + xcoord; + uint16 q = WORD(kPlayerOam_Prio[bank2 >> 1]); + q = (bank2 & 1) ? q << 4 : q; + WORD(oam_buf[oam_pos].charnum) = (q & 0xc000) | oam_priority_value | link_palette_bits_of_oam | 0x14; + bytewise_extended_oam[oam_pos] = 0; + } + } + SwordResult sr; + + if (link_picking_throw_state & 4) { + LinkOam_UnusedWeaponSettings(r4loc, xcoord, ycoord); + } else if (PlayerOam_WantInvokeSword() && !LinkOam_SetWeaponVRAMOffsets(r2, &sr)) { + uint8 zcoord = ((int16)link_z_coord >= 0 || BYTE(link_z_coord) < 0xf0) ? BYTE(link_z_coord) : 0; + uint8 oam_y = kDrawSword_y[r2] + ycoord - zcoord; + uint8 oam_x = kDrawSword_x[r2] + xcoord; + + if ((link_item_in_hand & 2) ? (player_handler_timer == 2 && link_delay_timer_spin_attack == 15) : ((link_item_in_hand & 5) == 0)) { + player_oam_y_offset = kSwordOamYOffs[r2]; + player_oam_x_offset = kSwordOamXOffs[r2]; + } + uint16 oam_pal = 0; + if (link_item_in_hand & 5) { + assert(link_state_bits == 0); + oam_pal = kPlayerOam_Rod[eq_selected_rod - 1] << 8; + } + if ((link_position_mode & 8) && eq_selected_y_item == 13) + oam_pal = 0x400; // cane of byrna + + int oam_pos = ((scratch_0_var ? kSwordStuff_oam_index_ptrs_1 : kSwordStuff_oam_index_ptrs_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + oam_pos = LinkOam_CalculateSwordSparklePosition(oam_pos, xcoord, ycoord); + + int j = sr.r6 * 3; + for (int i = 0; i != 3; i++, j++) { + uint16 td = kSwordTiledata[j]; + if (td != 0xffff) { + td = (td & ~0x3000) | oam_priority_value; + if ((td & 0xe00) != 0x200 && !link_palette_bits_of_oam) + td = (td & ~0xe00) | 0x600; + if (oam_pal) + td = (td & ~0xe00) | oam_pal; + WORD(oam_buf[oam_pos].charnum) = td; + oam_buf[oam_pos].x = oam_x; + oam_buf[oam_pos].y = oam_y; + uint16 xt = (uint8)xcoord - oam_x; + if ((int16)xt < 0) xt = -xt; + bytewise_extended_oam[oam_pos] = sr.r12 | (xt >= 0x80); + oam_pos++; + } + oam_x += 8; + if (i == 1) + oam_x -= 16, oam_y += 8; + } + } + + //SwordStuff_fail + if (link_shield_type && sram_progress_indicator && !LinkOam_SetEquipmentVRAMOffsets(r2, &sr)) { + uint8 zcoord = ((int16)link_z_coord >= 0 || BYTE(link_z_coord) < 0xf0) ? BYTE(link_z_coord) : 0; + uint8 oam_y = kShieldStuff_y[r2] + ycoord - 1 - zcoord; + uint8 oam_x = kShieldStuff_x[r2] + xcoord; + + LinkOam_CalculateXOffsetRelativeLink(kShieldStuff_x[r2]); + + uint16 oam_pal = (link_palette_bits_of_oam >> 8) ? 0xa00 : 0x600; + + int oam_pos = ((scratch_0_var ? kShieldStuff_oam_index_ptrs_1 : kShieldStuff_oam_index_ptrs_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + + int j = sr.r6 * 3; + for (int i = 0; i != 3; i++, j++) { + uint16 td = kShieldStuff_OamData[j]; + if (td == 0xffff) + continue; + td = (td & 0xc1ff) | oam_pal | oam_priority_value; + WORD(oam_buf[oam_pos].charnum) = td; + WORD(oam_buf[oam_pos].x) = oam_x | oam_y << 8; + bytewise_extended_oam[oam_pos] = sr.r12 | bit9_of_xcoord; + oam_x += 8; + if (i == 1) + oam_x -= 16, oam_y += 8; + } + } + + if (link_visibility_status != 12 && link_player_handler_state != kPlayerState_AsleepInBed) { + if (value_computed_for_player_oam != 5 && draw_water_ripples_or_grass) { + LinkOam_DrawFootObject(r4loc, xcoord, ycoord); + } else if (link_auxiliary_state != 4 && link_player_handler_state != kPlayerState_Swimming) { + if (player_near_pit_state != 0 && player_near_pit_state != 1) { + if (link_this_controls_sprite_oam >= 6) { + LinkOam_DrawDungeonFallShadow(r4loc, xcoord); + r4loc = 2; // wtf + } + } else { + // draw shadow + int shadow_idx = (link_auxiliary_state != 0) && (link_auxiliary_state != 1 || !link_cape_mode); + uint16 oam_y = link_y_coord - BG2VOFS_copy2 + kOffsToShadowGivenDir_Y[link_direction_facing_mirror >> 1]; + if (oam_y < 256) { + uint8 oam_x = xcoord + kOffsToShadowGivenDir_X[link_direction_facing_mirror >> 1]; + int oam_pos = ((scratch_0_var ? kShadow_oam_indexes_1 : kShadow_oam_indexes_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + + uint16 td = kLinkShadows_Chardata[shadow_idx*2] & ~0x3000 | oam_priority_value_2; + if (!link_palette_bits_of_oam) + td = td & ~0xe00 | 0x600; + WORD(oam_buf[oam_pos+0].charnum) = td; + WORD(oam_buf[oam_pos+1].charnum) = td & ~0xC000 | 0x4000; + WORD(oam_buf[oam_pos+0].x) = (uint8)oam_x | oam_y << 8; + WORD(oam_buf[oam_pos+1].x) = (uint8)(oam_x + 8) | oam_y << 8; + bytewise_extended_oam[oam_pos+0] = 0; + bytewise_extended_oam[oam_pos+1] = 0; + } + } + } + } + + { + int oam_pos = ((scratch_0_var ? kLinkBody_oam_index_1 : kLinkBody_oam_index_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + + int j = kLinkDmaGraphicsIndices[r2]; + link_dma_graphics_index = j * 2; + + if (link_visibility_status != 12) { + uint8 zcoord = ((int16)link_z_coord >= 0 || BYTE(link_z_coord) < 0xf0) ? BYTE(link_z_coord) : 0; + + const LinkSpriteBody *sp = &kLinkSpriteBodys[j]; + + uint8 oam_y = ycoord + sp->y - zcoord; + uint8 oam_x = xcoord + sp->x; + uint16 td = sp->tile << 8; + + if ((td & 0xf000) != 0xf000) { + WORD(oam_buf[oam_pos].charnum) = td & 0xf000 | oam_priority_value | link_palette_bits_of_oam; + WORD(oam_buf[oam_pos].x) = oam_x | oam_y << 8; + bytewise_extended_oam[oam_pos] = 2 + (oam_x >= 0xf8); + } + + if ((td << 4 & 0xf000) != 0xf000) { + WORD(oam_buf[oam_pos+1].charnum) = td << 4 & 0xf000 | oam_priority_value | link_palette_bits_of_oam | 2; + WORD(oam_buf[oam_pos+1].x) = (uint8)(xcoord) | (ycoord - zcoord + 8) << 8; + bytewise_extended_oam[oam_pos+1] = 2; + } + } + } + + uint16 t; + bool skip_erase = true; + if (is_standing_in_doorway && ((t = link_x_coord - BG2HOFS_copy2) < 4 || t >= 252 || (t = link_y_coord - BG2VOFS_copy2) < 4 || t >= 224) || + (skip_erase = false, + submodule_index == 0 && countdown_for_blink && --countdown_for_blink >= 4 && (countdown_for_blink & 1) == 0 || + link_visibility_status == 12 || + link_cape_mode != 0)) { + uint8 *p = &bytewise_extended_oam[sort_sprites_offset_into_oam_buffer >> 2]; + WORD(p[0]) = 0x101; + WORD(p[2]) = 0x101; + WORD(p[4]) = 0x101; + WORD(p[6]) = 0x101; + WORD(p[8]) = 0x101; + WORD(p[10]) = 0x101; + if (link_visibility_status != 12 && !skip_erase) { + int oam_pos = ((scratch_0_var ? kShadow_oam_indexes_1 : kShadow_oam_indexes_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + WORD(bytewise_extended_oam[oam_pos]) = 0; + } + } + + if (submodule_index == 18 || submodule_index == 19) + link_y_coord = y_coord_backup; +} + +uint8 FindMostSignificantBit(uint8 v) { // 8daac3 + int i = 7; + while (!(v & 0x80) && --i >= 0) + v <<= 1; + return (uint8)i; +} + +bool LinkOam_SetWeaponVRAMOffsets(int r2, SwordResult *sr) { // 8dab6e + uint8 j = kPlayerOam_Main_SwordStuff_array1[r2]; + if ((sr->r6 = j) == 0xff) + return true; + sr->r12 = kPlayerOam_Main_SwordStuff_array2[j]; + uint8 y = kPlayerOam_Main_SwordStuff_array3[j]; + if (j < 29) { + link_dma_var3 = y; + } else { + if (link_item_in_hand & 5) + y = kPlayerOam_Main_SwordStuff_array4[j - 29]; + link_dma_var5 = y; + } + return false; +} + +bool LinkOam_SetEquipmentVRAMOffsets(int r2, SwordResult *sr) { // 8dabe6 + uint8 j = kPlayerOam_ShieldStuff_array1[r2]; + if ((sr->r6 = j) == 0xff) + return true; + + uint8 y = kPlayerOam_ShieldStuff_array2[j]; + if (j >= 8) { + if (link_item_in_hand & 5) + y = kPlayerOam_ShieldStuff_array3[j - 8]; + link_dma_var5 = y; + sr->r12 = (y & 7) ? 0 : 2; + } else { + link_dma_var4 = y; + sr->r12 = 2; + } + return false; +} + +int LinkOam_CalculateSwordSparklePosition(int oam_pos, uint8 oam_x, uint8 oam_y) { // 8dacd5 + if (link_player_handler_state | link_speed_setting) + return oam_pos; + if (link_sword_type == 0 || link_sword_type == 1 || link_sword_type == 0xff || !(button_mask_b_y & 0x80) || button_b_frames >= 9) + return oam_pos; + + int i = (link_direction_facing >> 1) * 9 + button_b_frames; + uint16 td = kSwordTipSomething[i]; + if (td == 0xffff) + return oam_pos; + td = td & ~0x3000 | oam_priority_value; + if (!link_palette_bits_of_oam) + td = td & ~0xe00 | 0x600; + WORD(oam_buf[oam_pos].charnum) = td; + player_oam_x_offset = kSwordOamXOffs_Good[i]; + player_oam_y_offset = kSwordOamYOffs_Good[i]; + oam_x += player_oam_x_offset; + oam_y += player_oam_y_offset; + oam_buf[oam_pos].x = oam_x; + oam_buf[oam_pos].y = oam_y; + LinkOam_CalculateXOffsetRelativeLink(player_oam_x_offset); + bytewise_extended_oam[oam_pos] = bit9_of_xcoord; + return oam_pos + 1; +} + +void LinkOam_UnusedWeaponSettings(int r4loc, uint8 oam_x, uint8 oam_y) { // 8dadb6 + int j = link_var30e * 4; + int oam_pos = ((draw_water_ripples_or_grass != 0 ? kSwordStuff_oam_index_ptrs_1 : kSwordStuff_oam_index_ptrs_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + OamEnt *oam = &oam_buf[oam_pos]; + for (int i = 0; i != 4; i++, j++) { + uint8 st = kPlayerOam_DrawOam_Throwing_State[j]; + if (st != 0xff) { + WORD(oam->charnum) = 0x2609 & ~0x3000 | oam_priority_value; + oam->x = oam_x + kPlayerOam_DrawOam_Throwing_X[j]; + oam->y = oam_y + kPlayerOam_DrawOam_Throwing_Y[j]; + bytewise_extended_oam[oam_pos] = 0; + oam++, oam_pos++; + } + } +} + +void LinkOam_DrawDungeonFallShadow(int r4loc, uint8 xcoord) { // 8dae3b + uint8 yd = tiledetect_which_y_pos[0] - 12 - link_y_coord; + int yv = yd >= 240 ? 0 : + yd >= 96 ? 2 : + yd >= 48 ? 1 : 0; + + xcoord += kPlayerOam_DrawOam_2X[yv]; + uint8 ycoord = tiledetect_which_y_pos[0] - 12 - BG2VOFS_copy2 + 29; + int oam_pos = ((draw_water_ripples_or_grass ? kShadow_oam_indexes_1 : kShadow_oam_indexes_0)[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + + yv *= 2; + for (int i = 0; i != 2; i++, oam_pos++, yv++) { + uint16 td = kLinkShadows_Chardata[yv]; + if (td != 0xffff) { + WORD(oam_buf[oam_pos].charnum) = td & ~0x3000 | oam_priority_value_2; + WORD(oam_buf[oam_pos].x) = xcoord | ycoord << 8; + } + bytewise_extended_oam[oam_pos] = 0; + xcoord += 8; + } +} + +void LinkOam_DrawFootObject(int r4loc, uint8 oam_x, uint8 oam_y) { // 8daed1 + primary_water_grass_timer = (primary_water_grass_timer + 1) & 0xf; + if (primary_water_grass_timer >= 9) { + primary_water_grass_timer = 0; + secondary_water_grass_timer = (secondary_water_grass_timer + 1) & 3; + if (secondary_water_grass_timer == 3) + secondary_water_grass_timer = 0; + } + + int i = (link_direction_facing_mirror >> 1) + kShieldTypeToOffs[link_shield_type]; + + oam_x += kOffsToShadowGivenDir_X[i]; + oam_y += kOffsToShadowGivenDir_Y[i]; + + int oam_pos = (kShadow_oam_indexes_1[r4loc] + sort_sprites_offset_into_oam_buffer)>>2; + uint8 animst = secondary_water_grass_timer; + + uint8 yv; + if (draw_water_ripples_or_grass == 2) { + yv = (link_animation_steps >= 3 ? link_animation_steps - 3 : link_animation_steps); + ((uint8 *)&overlay_index)[1] = yv * 4; + yv = (8 + yv); + } else { + ((uint8 *)&overlay_index)[1] = secondary_water_grass_timer * 4; + yv = (5 + secondary_water_grass_timer); + } + + OamEnt *oam = &oam_buf[oam_pos]; + + if (yv >= 11) { + // OOB read + WORD(oam[0].charnum) = 0x00 & ~0x3000 | oam_priority_value_2; + WORD(oam[1].charnum) = 0xAE | oam_priority_value_2; + } else { + WORD(oam[0].charnum) = kLinkShadows_Chardata[yv * 2 + 0] & ~0x3000 | oam_priority_value_2; + WORD(oam[1].charnum) = kLinkShadows_Chardata[yv * 2 + 1] | oam_priority_value_2; + + } + + + oam[0].x = oam_x; + oam[1].x = oam_x + 8; + + oam[0].y = oam_y; + oam[1].y = oam_y; + + WORD(bytewise_extended_oam[oam_pos]) = 0; +} + +void LinkOam_CalculateXOffsetRelativeLink(uint8 x) { // 8dafc0 + bit9_of_xcoord = (link_x_coord + (int8)x - BG2HOFS_copy2) >> 8 & 1; +} + diff --git a/player_oam.h b/player_oam.h new file mode 100644 index 00000000..b040397a --- /dev/null +++ b/player_oam.h @@ -0,0 +1,19 @@ +#pragma once +#include "types.h" + +struct SwordResult { + uint8 r6; + uint8 r12; +}; + +bool PlayerOam_WantInvokeSword(); +void CalculateSwordHitBox(); +void LinkOam_Main(); +uint8 FindMostSignificantBit(uint8 v); +bool LinkOam_SetWeaponVRAMOffsets(int r2, SwordResult *sr); +bool LinkOam_SetEquipmentVRAMOffsets(int r2, SwordResult *sr); +int LinkOam_CalculateSwordSparklePosition(int oam_pos, uint8 oam_x, uint8 oam_y); +void LinkOam_UnusedWeaponSettings(int r4loc, uint8 oam_x, uint8 oam_y); +void LinkOam_DrawDungeonFallShadow(int r4loc, uint8 xcoord); +void LinkOam_DrawFootObject(int r4loc, uint8 oam_x, uint8 oam_y); +void LinkOam_CalculateXOffsetRelativeLink(uint8 x); diff --git a/poly.cpp b/poly.cpp new file mode 100644 index 00000000..73f8039d --- /dev/null +++ b/poly.cpp @@ -0,0 +1,323 @@ +#include "poly.h" +#include "zelda_rtl.h" +#include "variables.h" + +static const int8 kPolySinCos[320] = { + 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23, + 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, + 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60, + 59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, + 45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26, + 24, 23, 22, 20, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 3, 2, + 0, -2, -3, -5, -6, -8, -9, -11, -12, -14, -16, -17, -19, -20, -22, -23, + -24, -26, -27, -29, -30, -32, -33, -34, -36, -37, -38, -39, -41, -42, -43, -44, + -45, -46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -56, -57, -58, -59, + -59, -60, -60, -61, -61, -62, -62, -62, -63, -63, -63, -64, -64, -64, -64, -64, + -64, -64, -64, -64, -64, -64, -63, -63, -63, -62, -62, -62, -61, -61, -60, -60, + -59, -59, -58, -57, -56, -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, + -45, -44, -43, -42, -41, -39, -38, -37, -36, -34, -33, -32, -30, -29, -27, -26, + -24, -23, -22, -20, -19, -17, -16, -14, -12, -11, -9, -8, -6, -5, -3, -2, + 0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 20, 22, 23, + 24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, + 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64, +}; +struct Vertex3 { + int8 x, y, z; +}; +static const Vertex3 kPoly0_Vtx[6] = { + { 0, 65, 0}, + { 0, -65, 0}, + { 0, 0, -40}, + {-40, 0, 0}, + { 0, 0, 40}, + { 40, 0, 0}, +}; +static const uint8 kPoly0_Polys[40] = { + 3, 0, 5, 2, 4, + 3, 0, 2, 3, 1, + 3, 0, 3, 4, 2, + 3, 0, 4, 5, 3, + 3, 1, 2, 5, 4, + 3, 1, 3, 2, 1, + 3, 1, 4, 3, 2, + 3, 1, 5, 4, 3, +}; +static const Vertex3 kPoly1_Vtx[6] = { + { 0, 40, 10}, + { 40, -40, 10}, + {-40, -40, 10}, + { 0, 40, -10}, + {-40, -40, -10}, + { 40, -40, -10}, +}; +static const uint8 kPoly1_Polys[28] = { + 3, 0, 1, 2, 7, + 3, 3, 4, 5, 6, + 4, 0, 3, 5, 1, 5, + 4, 1, 5, 4, 2, 4, + 4, 3, 0, 2, 4, 3, +}; +struct PolyConfig { + uint8 num_vtx, num_poly; + uint16 vtx_val, polys_val; + const Vertex3 *vertex; + const uint8 *poly; +}; +static const PolyConfig kPolyConfigs[2] = { + {6, 8, 0xff98, 0xffaa, kPoly0_Vtx, kPoly0_Polys}, + {6, 5, 0xffd2, 0xffe4, kPoly1_Vtx, kPoly1_Polys}, +}; +static const uint32 kPoly_RasterColors[16] = { + 0x00, 0xff, 0xff00, 0xffff, + 0xff0000, 0xff00ff, 0xffff00, 0xffffff, + 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, + 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff, +}; +static const uint16 kPoly_LeftSideMask[8] = {0xffff, 0x7f7f, 0x3f3f, 0x1f1f, 0xf0f, 0x707, 0x303, 0x101}; +static const uint16 kPoly_RightSideMask[8] = {0x8080, 0xc0c0, 0xe0e0, 0xf0f0, 0xf8f8, 0xfcfc, 0xfefe, 0xffff}; +uint16 Poly_Divide(uint16 a, uint16 b) { + poly_tmp1 = sign16(a) ? -a : a; + poly_tmp0 = b; + while (poly_tmp0 >= 256) + poly_tmp0 >>= 1, poly_tmp1 >>= 1; + int q = poly_tmp1 / poly_tmp0; + return sign16(a) ? -q : q; +} + +void Poly_RunFrame() { + Polyhedral_EmptyBitMapBuffer(); + Polyhedral_SetShapePointer(); + Polyhedral_SetRotationMatrix(); + Polyhedral_OperateRotation(); + Polyhedral_DrawPolyhedron(); +} + +void Polyhedral_SetShapePointer() { // 89f83d + poly_var1 = poly_config1 * 2 + 0x80; + poly_tmp0 = poly_which_model * 2; + + const PolyConfig *poly_config = &kPolyConfigs[poly_which_model]; + poly_config_num_vertex = poly_config->num_vtx; + poly_config_num_polys = poly_config->num_poly; + poly_fromlut_ptr2 = poly_config->vtx_val; + poly_fromlut_ptr4 = poly_config->polys_val; +} + +void Polyhedral_SetRotationMatrix() { // 89f864 + poly_sin_a = kPolySinCos[poly_a]; + poly_cos_a = kPolySinCos[poly_a + 64]; + poly_sin_b = kPolySinCos[poly_b]; + poly_cos_b = kPolySinCos[poly_b + 64]; + poly_e0 = (int16)poly_sin_b * (int8)poly_sin_a >> 8 << 2; + poly_e1 = (int16)poly_cos_b * (int8)poly_cos_a >> 8 << 2; + poly_e2 = (int16)poly_cos_b * (int8)poly_sin_a >> 8 << 2; + poly_e3 = (int16)poly_sin_b * (int8)poly_cos_a >> 8 << 2; +} + +void Polyhedral_OperateRotation() { // 89f8fb + const PolyConfig *poly_config = &kPolyConfigs[poly_which_model]; + const int8 *src = &poly_config->vertex[0].x; + int i = poly_config_num_vertex; + src += i * 3; + do { + src -= 3, i -= 1; + poly_fromlut_x = src[2]; + poly_fromlut_y = src[1]; + poly_fromlut_z = src[0]; + Polyhedral_RotatePoint(); + Polyhedral_ProjectPoint(); + poly_arr_x[i] = poly_base_x + poly_f0; + poly_arr_y[i] = poly_base_y - poly_f1; + } while (i); +} + +void Polyhedral_RotatePoint() { // 89f931 + int x = (int8)poly_fromlut_x; + int y = (int8)poly_fromlut_y; + int z = (int8)poly_fromlut_z; + + poly_f0 = (int16)poly_cos_b * z - (int16)poly_sin_b * x; + poly_f1 = (int16)poly_e0 * z + (int16)poly_cos_a * y + (int16)poly_e2 * x; + poly_f2 = ((int16)poly_e3 * z >> 8) - ((int16)poly_sin_a * y >> 8) + ((int16)poly_e1 * x >> 8) + poly_var1; +} + +void Polyhedral_ProjectPoint() { // 89f9d6 + poly_f0 = Poly_Divide(poly_f0, poly_f2); + poly_f1 = Poly_Divide(poly_f1, poly_f2); +} + +void Polyhedral_DrawPolyhedron() { // 89fa4f + const PolyConfig *poly_config = &kPolyConfigs[poly_which_model]; + const uint8 *src = poly_config->poly; + do { + poly_num_vertex_in_poly = *src++; + BYTE(poly_tmp0) = poly_num_vertex_in_poly; + poly_xy_coords[0] = poly_num_vertex_in_poly * 2; + + int i = 1; + do { + int j = *src++; + poly_xy_coords[i + 0] = poly_arr_x[j]; + poly_xy_coords[i + 1] = poly_arr_y[j]; + i += 2; + } while (--BYTE(poly_tmp0)); + + poly_raster_color_config = *src++; + int order = Polyhedral_CalculateCrossProduct(); + if (order > 0) { + Polyhedral_SetForegroundColor(); + Polyhedral_DrawFace(); + } + } while (--poly_config_num_polys); +} + +void Polyhedral_SetForegroundColor() { // 89faca + uint8 t = poly_which_model ? (poly_config1 >> 5) : 0; + uint8 a = (poly_tmp0 << (t + 1)) >> 8; + Polyhedral_SetColorMask(a <= 1 ? 1 : a >= 7 ? 7 : a); +} + +int16 Polyhedral_CalculateCrossProduct() { // 89fb24 + int16 a = poly_xy_coords[3] - poly_xy_coords[1]; + poly_tmp0 = a * (int8)(poly_xy_coords[6] - poly_xy_coords[4]); + a = poly_xy_coords[5] - poly_xy_coords[3]; + poly_tmp0 -= a * (int8)(poly_xy_coords[4] - poly_xy_coords[2]); + return poly_tmp0; +} + +void Polyhedral_SetColorMask(int c) { // 89fcae + uint32 v = kPoly_RasterColors[c]; + poly_raster_color0 = v; + poly_raster_color1 = v >> 16; +} + +void Polyhedral_EmptyBitMapBuffer() { // 89fd04 + memset(polyhedral_buffer, 0, 0x800); +} + +void Polyhedral_DrawFace() { // 89fd1e + int n = poly_xy_coords[0]; + uint8 min_y = poly_xy_coords[n]; + int min_idx = n; + while (n -= 2) { + if (poly_xy_coords[n] < min_y) + min_y = poly_xy_coords[n], min_idx = n; + } + poly_raster_dst_ptr = 0xe800 + (((min_y & 0x38) ^ (min_y & 0x20 ? 0x24 : 0)) << 6) + (min_y & 7) * 2; + poly_cur_vertex_idx0 = poly_cur_vertex_idx1 = min_idx; + poly_total_num_steps = poly_xy_coords[0] >> 1; + poly_y0_cur = poly_y1_cur = poly_xy_coords[min_idx]; + poly_x0_cur = poly_x1_cur = poly_xy_coords[min_idx - 1]; + if (Polyhedral_SetLeft() || Polyhedral_SetRight()) + return; + for (;;) { + Polyhedral_FillLine(); + if (BYTE(poly_raster_dst_ptr) != 0xe) { + poly_raster_dst_ptr += 2; + } else { + uint8 a = HIBYTE(poly_raster_dst_ptr) + 2; + poly_raster_dst_ptr = (a ^ ((a & 8) ? 0 : 0x19)) << 8; + } + if (poly_y0_cur == poly_y0_trig) { + poly_x0_cur = poly_x0_target; + if (Polyhedral_SetLeft()) + return; + } + poly_y0_cur++; + if (poly_y1_cur == poly_y1_trig) { + poly_x1_cur = poly_x1_target; + if (Polyhedral_SetRight()) + return; + } + poly_y1_cur++; + poly_x0_frac += poly_x0_step; + poly_x1_frac += poly_x1_step; + } +} + +void Polyhedral_FillLine() { // 89fdcf + uint16 left = kPoly_LeftSideMask[(poly_x0_frac >> 8) & 7]; + uint16 right = kPoly_RightSideMask[(poly_x1_frac >> 8) & 7]; + poly_tmp2 = (poly_x0_frac >> 8) & 0x38; + int d0 = ((poly_x1_frac >> 8) & 0x38); + uint16 *ptr = (uint16*)&g_ram[poly_raster_dst_ptr + d0 * 4]; + if ((d0 -= poly_tmp2) == 0) { + poly_tmp1 = left & right; + ptr[0] ^= (ptr[0] ^ poly_raster_color0) & poly_tmp1; + ptr[8] ^= (ptr[8] ^ poly_raster_color1) & poly_tmp1; + return; + } + if (d0 < 0) + return; + int n = d0 >> 3; + ptr[0] ^= (ptr[0] ^ poly_raster_color0) & right; + ptr[8] ^= (ptr[8] ^ poly_raster_color1) & right; + ptr -= 0x10; + while (--n) { + ptr[0] = poly_raster_color0; + ptr[8] = poly_raster_color1; + ptr -= 0x10; + } + ptr[0] ^= (ptr[0] ^ poly_raster_color0) & left; + ptr[8] ^= (ptr[8] ^ poly_raster_color1) & left; + poly_tmp1 = left, poly_raster_numfull = 0; +} + +bool Polyhedral_SetLeft() { // 89feb4 + int i; + for (;;) { + if (sign8(--poly_total_num_steps)) + return true; + i = poly_cur_vertex_idx0 - 2; + if (i == 0) + i = poly_xy_coords[0]; + if (poly_xy_coords[i] < poly_y0_cur) + return true; + if (poly_xy_coords[i] != poly_y0_cur) + break; + poly_x0_cur = poly_xy_coords[i - 1]; + poly_cur_vertex_idx0 = i; + } + poly_y0_trig = poly_xy_coords[i]; + poly_x0_target = poly_xy_coords[i - 1]; + poly_cur_vertex_idx0 = i; + int t = poly_x0_target - poly_x0_cur, u = t; + if (t < 0) + t = -t; + t = ((t & 0xff) << 8) / (uint8)(poly_y0_trig - poly_y0_cur); + poly_x0_frac = (poly_x0_cur << 8) | 0x80; + poly_x0_step = (u < 0) ? -t : t; + return false; +} + +bool Polyhedral_SetRight() { // 89ff1e + int i; + for (;;) { + if (sign8(--poly_total_num_steps)) + return true; + i = poly_cur_vertex_idx1; + if (i == poly_xy_coords[0]) + i = 0; + i += 2; + if (poly_xy_coords[i] < poly_y1_cur) + return true; + if (poly_xy_coords[i] != poly_y1_cur) + break; + poly_x1_cur = poly_xy_coords[i - 1]; + poly_cur_vertex_idx1 = i; + } + poly_y1_trig = poly_xy_coords[i]; + poly_x1_target = poly_xy_coords[i - 1]; + poly_cur_vertex_idx1 = i; + int t = poly_x1_target - poly_x1_cur, u = t; + if (t < 0) + t = -t; + t = ((t & 0xff) << 8) / (uint8)(poly_y1_trig - poly_y1_cur); + poly_x1_frac = (poly_x1_cur << 8) | 0x80; + poly_x1_step = (u < 0) ? -t : t; + return false; +} + diff --git a/poly.h b/poly.h new file mode 100644 index 00000000..e3e9d7ac --- /dev/null +++ b/poly.h @@ -0,0 +1,19 @@ +#pragma once +#include "types.h" + +uint16 Poly_Divide(uint16 a, uint16 b); +void Poly_RunFrame(); +void Polyhedral_SetShapePointer(); +void Polyhedral_SetRotationMatrix(); +void Polyhedral_OperateRotation(); +void Polyhedral_RotatePoint(); +void Polyhedral_ProjectPoint(); +void Polyhedral_DrawPolyhedron(); +void Polyhedral_SetForegroundColor(); +int16 Polyhedral_CalculateCrossProduct(); +void Polyhedral_SetColorMask(int c); +void Polyhedral_EmptyBitMapBuffer(); +void Polyhedral_DrawFace(); +void Polyhedral_FillLine(); +bool Polyhedral_SetLeft(); +bool Polyhedral_SetRight(); diff --git a/saves/ref/Chapter 1 - Zelda's Rescue.sav b/saves/ref/Chapter 1 - Zelda's Rescue.sav new file mode 100644 index 0000000000000000000000000000000000000000..ff33bf3c78c931c9b8e1ec43dde1bc6e5f675bb8 GIT binary patch literal 278310 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 aH?}HTIt_sz27&J~Z~ZVO(xm>#2>c(a2&M@D literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 10 - After Ice Palace.sav b/saves/ref/Chapter 10 - After Ice Palace.sav new file mode 100644 index 0000000000000000000000000000000000000000..1400db01d14e73e889661ccac43c628756b54776 GIT binary patch literal 555890 zcmeFZ30M@@(lC6wduAA5X1ZqqMuk}by+nl>K+TN;Bde%DgM#9MO%!lU)OHt*q%~0? zQ5;P)k{Cq|F)q>IsBw(}#Q*Az2pYNXeN}K!yw`gb=wV4>BFtAkXqI<*-uL^z@A=pC z*ymK&sZ*z_PF0=i0mKkOZ<{bQRt*4Lp>ShxdyWtZkBE7j8!&C=vUO9L(b*Z;|^i0l=oy;g16El#}ShMG>+hp@9Ua+CWrYW&`m6U9>1(nz&?`$q!Fk$w_ zVjEsOJ8o_9hT^vi*XGSyvU2KM@6fWP96pZ5>A`dmH;RkkJUN{6WR3GV)f=gtWEPXe zkU2J!Eq(Elr5oN^okXi?k2Q1(Jv5b8FOP${t1Vt5In%1;g)yV_em*R_kVULF?UhKY zXo?;|%WVTT+J=|V_gQkTO;j9flNYldjA#b!S+L=qq<4z5ir?X|S(%&%Gn|%y5Gwd! zw0d2!&AYg?*k&rW4J~F~$|)(f$x61A*syoEl(0l{ZgEMRP4rGliOpw|jV!SlN^JTP zM$7rFWJWMrb}^&jR^-#WI1~Hze49tg+cwQ6+qz|;A%8nkzzGO{H zn3rFWZy7p@0nJx&X<2&QPd{LQp3>?AeDwpgdaafbE!Fuk(pU8|Esc$5J!oOZv|J9GJavg4 zX;)@3(xtjV%b;7L1zOf?+8o9>dCBDI%UIPUR>VmQX&DGU}eSg4PxQ>T!FCG@no6^wK-=RJjyEN25I(bCxo%O)aj%B9E8(EY5jw z0o>T6Wn93xq~&Qg&th9ZF%vk$CfR5kQ9O&0PNcmyZM0zeH2Od-7jBb6bS!;~70>0Q2`l4RQQowv>{9k+ zddA$iq`Xp_l2#|Kk9`{=Cc#!cC$#`1@vRPnT~Df(!L}#TCPvC=C(ob*Y0ttpDJwX9C4;hKUS=^?uJvVKTL?yvTEPY^Vncj1^wKqn%zz~}i7ji(#+mt33pg?} zb?G?ToA&(0+3A;9aUA$DP11-9OrkA|5)x_Mat>d`8OPIT1ve;h{34DhAN|3?88aA< z8H`s>=3FL#^IXY9RF4Kpr&h~B(plMg`4%*a9-L?`$hTUgqx6BkoNK^}6)U)vD^{-H zh(ZpnT)AA2YuMqb3)y5^!~`-rS~s2@QBLkG58qiX-NDKjIb@@k=Oxpwm+3*Qgi~|D zbkMj(h3p^ZtuMBDzD*;xh$R7uzd@_|bx^|MkOM`QOCwq1Tw0VkuOMdRL|blLv2Dc0 zY?heJ_{?R9$(%Hc_FEZ8OXF71zAIT(e1XQ74PX*qV?|l)PKIOhgh;AWhv)1 zj+Q2KGdMLfWf`-S8942gQM55muvy`>Y>Q^pbiF21!?;{&EXtZOuaFVbI4xUD6P$$h zTse~&GnGN}Sj_~RY9o!?a*CJHKB*iY&j!w?r_f^hCEA~cV22Y!%4y@cU6wJUEP*fU zePE0JQp71ag7N1(r_yqcSe(4^9Y&m!xp*2Uvb|KClFB7;ejLHtnH7wTRE%?8L^-7$RK&nLKNC_Dv;XIZXu#)lPmrE8CH1+1VRdOk(SS1lN z(MzW+<1{3aEa6m~=lr?jQ`fI2eMOvh744bA{gEb?0i%4@D?ffbE@COxizX6qF{uzI zjAxBtKJ0ap5OY3o6CHHSH`@oC;f_OkL4@@F|91HPGpHGjA*Lf zBg1DLEoV+MI_~6~uczde6w?8DEX83Pm#yP)eej$`YF5JynzpofLk=UEF@YuGSoIPi zFEGT)#Y@@rOz!nOjUVS(z!J-7?}>V4zH$+*&s~y~v~=S}n>2py;-W$TJQChoI)NF; ziDA_o&V%+$Vl!q;o6lj>mNJSWW)?SS)r$PdBsN>bd2!M?EJhm>SqY@C#3k{p7bH&7 zOUxQraEf`aj(asfc3wU$2G6C~nJYOoixo}EX9&>#O>ozhOfnP1pt%Js%Ad|krZePh zC?3f5?-biSif!UzTS&%wIvRFXmYkY2Yu1GEjK|a^jJEKdVoo%T7SYP$Vw=}STDpGa z+7)SB5N8Gl8M<=8T%C^|saA8;Y}u<~4~bapAZfXrHpokjf6NZ z&dFVnz+p-8OUEat<-lg=WK5pO1+1ipFl!mz=#fxlWM#*UoUhmB`min$eSQwDW(Tvf z*>JQ|lh-WCT(U5O_Lxn3#TIc!R>Ddbu!tT)e@lB#WFe4bsgTPr7C=1}PMg^o)7jxx zCa93XmobB^a0;-VujNf=CNq93r_u^~AT3@U&;2DenH$2aTT#SGvgt8J9Ffe06v0O1 z+agMAqK#>c?-XtX?X_h2`uO#5d~m9SB@<{Wk@ny`Vqdp;zPf?&p0Y4!&O0`=xg=|q zkhTk0GI2xvdRG2g?CY>stT?`49OugoU_DsRWZE}@rdV+SqhU3Z^DV?kIy7nd%4I8F z8ObQJ*uho~`7G6}&|`}CPoBfYtzyK58E_7~ zy%9>q;*yPTk9%uz$%YNmhP z(YbUiN3Niw84(jqi<4*>H-^Snys>i0ghlL_*Eu7c@#)~*K8u&fE@KqTv_;%duE5)4 z5gm|3dWsqEjLa!1;f83iW$YcG9^1}Zhn5j z=#j7My`lWfvym)rvuxbBp|~K8#!A=gMLx_c1=-WspiEX|*)R%9zoev9E0!0&GHMMi zSw%~{J)p20;LCWh{*&h=yi@${M&UiHgbvso|F%uMv9#pPwFz&{TK@LN67XNx&J7!Y z0J`G!#T#a4t{p!I3P6rp{dVGXZp1Vjo->01cV;L!qP(&v&R$=_@jE00r8Nm)vdOq-X;VzaXf;F!bTeaGg#5tJ$6 zJl}ddW5dSybd2-T9r5-^e(I+expS;G3ts1&^#&Mz4&N@FFk%|Y<`v2sOXQp`v_=>v}D z$?kwx&yQ@f#C5i~4K~So#+#E)p=C*Q;Broz$OJ9r22J6XL-jx=&|1!y{=;%sUOmWv}f!wQRi)HGkUPCJPST)B!BPniwn@^)rk zQC2nH#bViuSFKn*3;YvJo57u3yHT&#l7U|A%dC+Z{AyP2JoY_E<|3$}2Tfz-c{64+ zhV02Zm+aug<;D-7x~1Z{LBdgv_%$`$aI!)c(3@tL@D`TOO%51_b` zEH8mlYSGHXge9dLC+6BD#jnSu&MA58?UL8y$0e+TSEBd?sENkRAZrHG%GosaY94E0W9aDx9Kng`L}otcF?H&4&Ny?*WX3yZVi6=#e<3vn(1SQh zBK`8J4I3bU@{(BXRLBdSpyjNEwxK2OyaNsmA!LhzW4^d}0~p54zQ&G&I{GG@-59rk z*_tz+hNVMjVs+x%#f$aSz@>#A(q*#c7zZA?gy5*nb`DX(tcym0PY1?w{2-MFPVG4JiX*pl^|HmoZy znf&(bEh{poEM3oF$?W#H^$b3nBc{w;%84^)E@cKpjbcVlnUXbkZUJN`z0#Kv+q|Gm z4o}^Xx;}mba|$Y;PdHW7C^|F&-VM=6;jNC<=>2_i^H_t$b$b*WS&%<>%t$VpmMqc5 zY4l>>K|X{00(=5|x#6^C39E+mm<#oTO5^9N_5}y`@$=CK_|P5`Cd4h^2EV!#()aXP z+=<=$oG0UwnAw6k2cvuxMS4?ftrb4U5|o#k(QP@c1++~b4t z@3xoYJM{bf%83ukled@8*ikP1pxm`_SGjsuxvS`-va<5p56X6y5BQ)wQ7uLj#XEk%y?~s0gcfzZ)pMff%=b^fujmr+YzMjm9WZkt9M>V_hx}2@OGv<$ z^`QYM0!19g4r3@H!p$aw_7wSedx|_o8OfLwBZR5_ANTNo*=V&dNPdA{VE$Wu`0$8+ zeX0Kz`Tt9Z+Q+Akr=Jit(*Id`GoQ)Iv}H2*WImKV)INOZ^-%Lr`;GD&B|zvQa$tKs zcnKm9;lPB?KfhnowYh6+*Y>VmKV1C&+aFqg;Cepm+4%jRzVG@${IvCl|Jn8bD|)Rz z(jhY%jv@fkAb%}91_CeuX`vm6pwoeGdm)7z0S@>-d0jz!!B>UP$r2ZGwWE(*{hvGN z8VvChqs&ngqee%Kz8ih_$`u~g5mxg+Vk8rwzqx`?lgo&V=r#0>>l+tRXaKA6(1u>?|_OV=0*AV~$U*7xkKM@cAM9i$j zkEFCtZil%UwHaHzEl<7b5Rfnl(pC|#szWwxTz5E6SQ@G5Xzy_iT`55u>rqTQysl>*ersRPR=mNh=T&0u zscr7b+wj~SuM(Cc3dz7R!}D3IUuf&N;DN^)B-c6-Yz_Mel@1qn6qQB^ zovU;vbe6vCCTc~O>xs+X5SQzS+JS7{+P_Y}`e))1s-3a6Vw&Z;;`U4ic|U9+ z8g#AGF1HYm7S&GcNAPmM)=mQ+Ed*d#tBc=hb@CUjoqU6}i*K^>yq76>^PdTxU}WB{ z1Cw2fBxFM(8yd%!qVLC!9vdn&y~o(xIs{8z1#Tk$oE}$wZ%<$S?Xfmo_Iwgsr?9OZ z_sG?V5s$nqU&|Vmcq8l^&O+G{i_NQHaBl;_tn;$2K6;wZc}4u*e- z<8R*{Yx>J=-%|2>-@lmAUFwGyuIJUG#2dtq5V#b0%Gz67Z*9A9YmwU-Tk6nXXMuzM zH33|7^{zz?^DQ%F4SwBg`OTKo@?C2i_#QKU%iI%=-wHRinhg+*Kw#E}mWO!se)mCi zBZeOfA$z~u6WvG&BUT4^?gW|XY>$f&4Qh}zJ>Olzf_wHL{MMr09t^KJPd`DVVD+FOc`DNa%nY{P8DXS+f%*4-S-k#KI<$ccOtx6!GBkBV|&?=_SnME^%avLYFI zjvLwA7kXsp6naD)a=!KFoy z(Cuutb~=!|-TjB@Zik0>xjl)k%@ojCYbz%IkSU<2u(jzdI33&QaIbR1y-GFv2r~)m zY{i=z*SQDQy4!6)xE5~kS;)5_^j5df1`rzS7n%a0l_2ywxW~HZ#JX9o?KU@>@$T@( zaJ*-%;3%=+DD34+MC}BS2xQCc?`GSR*;=b0Nul`^agv=8jUt3!-r~k2ly`6h| z_WooRlDsgI22H87KBtuIDOExah;GU)p?ay#9}?Kw)Y2kI7Z1BoUMfED9frA>r?4>(ho9At&+PHW39B3#lJXq0oaoxAqCmUT7d0LoN>C8rOo6UL}6oyTHA< zi@;8c2^O+#t+FSVsHNDp*Hsje?7C2j_Jlq{d)j|U=u$~;YtAV?(y#@xuVrI56-x7JQUJZyXgwJVJP@xyXhjZ4~4t;nCV38 zI5JUi9hd-(y~`*_i=eI}(l+`aFsp{O8s?X@(La42>k=Tmwr@#e~e9)vAF4!N_Z z8aK(uo=1jW9`8P$yQ2!fb-ZUUoTK}2IDTtY{{CC>WLIzZajSEyIE1V>iG(B4lB8tj zd!Da+p#Fh{RjYYV_f`;=H095R1*3cQ#DbN_5*D+vOHEj|lbvcoh`qd`dmkvZ7zP&! zgCN!^w^(01&gj_(Su}UYUYt2j-B*93vN#kA9%s~lqp=~M#~H`!S8D(x9OdkNHBjGh zQ#aslF@LJAZ%TGOo>t#O;q^TjQQuVG)MzAFa3T-6kM5-raT&AbE?l~D^_rqLIqrEq zn*H@1zRyD@lNpB%Q}=Z}9TAEC^&$4`@$e{l>im?M(V;V6os%{pIZ-iwViE(jOulEg z=Vq_r-hc7lB%2`DDE_IaBQH`zr{pg&Ob!o=Fb{on_;NRTbpCP=df1Ju*BYLh3{RjM z`e_z4X1azgj{r&StCRNjlHzcz#4Pzg z5WKlg;od-*gV;I<%nteNat+bbK-3y~_7M##SRBZo`GAWA1YGf={)Gi182K1%4g+g6 zKmgUm*M5!Lh}zKaF8VcYC2EH=1AM{JE?*<~uowKV{fGRi-|(mY^|##bKIg92_H);1 zf94Jry8bKf*Z)s&AMMjG`=9~++y@SL!Tk|}{b>Zt4s`qFK(Hft2QLGi1jOZU2$N30 z)d{$|eq0@4@&cQ>$Loo|CO~NkWu-uMiQoqXPiXLKoshfXXD@&Fpr7;s0ZXw08ThqA z=)VC6v&{2hM*9fu8jaB2)mSd61jBEGoVS&@J-nw9cA!$&fvdiwhd-<$+}l=%{yv;P zVP5>CiulWMV)XF853i-nb8`B*^I=82_#Y36hO}DhNsZvDbx0tg$iNL!s3L zaau(%J2cStLWK(wSho7XL(g#n#O_oB2zgv=S>b0QAK}X@i3TAjxPuagT0>z+T8G1S z^o!o$E%aa*30MV80`}-%7ij;Q@XG=}BX8~d1>76j54XFC;q8v8^6kfzde-NFx;Ck* z2gQK)(a#pDdH@v6XM}R_F9w|P^ZnHk2-Qn36fd_ac>RF`EVL9}GhyDb(iG-<&;R=S ziAh6d4_P^+cnBRrhrIHKQGeLtf5HEgL9+)b1_cZnJ}73;=ejGpn*&=0@&jE1gZ&>2 z5;*>P9EUFwB}fWiWy;{IO$w>tTUB59PI4f8jjuxnq!}`J$cQ2FLz)Kv%iz<49}GS^ z_)miigFhak2^Ixk3jQ&O52_2=8?-iPYtZnZgrF%w3xj-vJc6*G^MNY||0D2rV11y6 z@p#~;fgc1WgiH!74zvVE8anm=sy|@(vwoc3sk?3%7jV~~)z9_M^N%0M>Oa>1T|Ybc z<$*^6PX&z({dEaMpC{9uzY$ar9Ilfi57 zySgt8vj-k9Y%@$W%>TpvKhzJw4Dp8Dx;J!Vb>9y$>QuU}fU1B)0XYF{111mp^T5J^ z?*|kFEDiW<;K_jZb$*5_!wTcO!P|rP1h4&#?g&MJiqEemAY5>$MCjTV03BB=W_rvKq*6imk)9^UCszd+K9WD<0;i{26aPdfJ#a)@LL z_eoG$@WOq_q40`&`Z1F3^GbTU8%aO$N`JZ+Nk2uhyr-Wcufq;6kD{mhka)MW=;B6UnkhlW6qexmIWt>P_DNTp=kTe$BFQlPv*w=}~Um%BvH0r4xiBC$C zo?b-KYB$M6X#|i|3xwi}@RJHj;V1jbkpp>0JuOGx6g>hy1s4<-&YwMfR-m$<1nN_YQ}!n^){d{%!MbZ z3%Ni79(U?26>@>nU7$1}7uq2g!@aW02<|+UMg7hPmrvdFH3ORc0 z=og}>FOD5MDoO|NsA&4JV_zH-r5_dADEDYTjYfcBibvkl14wlAKkR-Ei6cTtY=Oul z^C0A8r^)pGE~>u^ad$B66Y}&3QdRmyKpd;=K2eY$R409so*qZ4FMZOVoN%2^drQ5#5qyXM=&-vs*Kw?7H&hu0S+<^{B{70d;;DJ`2d!w zlsFLq2J?{=KCJ{uf-by(7WN~iyStw$E=k<@YDu1euadZjFG|vdr;C!L{w~Vh!T!q% z%S5Owxe&ZJ89JxXE_Aokg?1viR5GZbgxs(N$#z3-@Z1Nf=p6(C3bkt4z)p6|o9N;FT;BgrX=&WR-F zB_KV(5LU!_n*tfU9s z>H3Hicu5aPfiGlw;0U?j%RMRvZm?aLB;vx?7rvH6x!Vw-6`Vf;yo@@m1V)M@po4$Z z=@Xv^p8-gLPWwlFdGus(6l|_slz!^;+4C1JR#nR&?8KtN9ox2u3pa1wB3ig@+xwD* zAH27N$g{n_O_aBF%T96LmTj8>+PvjIqujg=B0w!luYiBr=@rjmFMtoiVqk}lzyjb{ zl6``Afg5@RM}Q3ik4OOr8ANz2fBp!zR#3W%T-|A54-gzOmAN{Q85gCW6?s9_3i3;J za8?Rt@RsI5KuPS-RU!%KLWt7sqV&q(bb*g3>8vQ?yhxZXle!P;1F)j>Bca(RG=c!) zop4(21|C2pPKS^em&4&JhMmH-g-?r-_7r#-MQuLy&M8rZ zyA5%-I(Msaw_ZXEY(+`?v`OG*KHxHH>GXYOCkC_-6608X602tIiQ4CIE!S0M4n(D;qm7%fk$&5*j|~O2O?rn34DRXu)42TA;gc@ z25=v*&Cq!47K|BnR3HHh%2h(ipgO8@A`%{PX~fY34oo!Ne)Nzi>Bznck?xa^VaJr( zJTQ<_S_qm;cYDIVfi9RR1auG`5`(|t2gKmYIIy6!g&%2`?$R#&SUYdGHgAuXDc4Tl zE8z3?Y3J?NF8oBhv_e}5bpcR*D!_mNJd84XwbQ{LfO3y87dQZ)Lcw8VAwrCo%isj_ z1VMyn`-^8#NG?rsANsi`rTtYv?nywxktz*&f!93;Ku4&(HY1PIU;)8<#1#~(kcNN* zL6A8sp$3DHfRT$x49QgtDwiWMm=tLRFV$94^5?vL97fZ3Oam!idRqE2_#WgHXirN)BjMnZNJ7q5p7;`` zK_ahodpc|$E=fNqgN^s5^7ifjBp0?9pvvR+T&S1;I&}C*?&lz*IqxHh*X}Zj2JR5J z(|4D_#|%P(o1Hy(UN}M};4JSW&q~P9r;y~dBn$S?E`fp);EB+lbYsp+U@swwK|+Fr z1{DO13YZHLC@O@5!2>LH1c@O{L1793B-Ee%dFqIC0H^}hqF53Fgh(23#C`}8*}($` zE2O$3rw*N#dL6Y_KuW;=4G%B@1SOai_yG@qN#F#IAP~Ck7SV4vVKKX#&}}z>g#>xp zO%7fmm8Dk-S==)nW=RAYAoskFB$X0yO#+fXnD&IEQuO?WY@tmDdWobES{&k}5_yz? z&4txKZ&(d11Y!XUA_5GF7+?^NfYmTj68M8?Gn^ph?r?#PJ4V1KjP}5G?teOHN&?|v%#Ft{XY zPjJa@?T5h|qjm>x+@<~0O{$Px%`Ms~yAr&AzwAox2LSBdE4z}p9f0k7Wjn8Az6a2I zdu5-vsa4vmnMJ#_K&0J!CG$f7_GtH9N!}>{yR}!6KLB9&o_;;gpF4Z*tMlj1p96)_ z3k^@gC1?sN1%L5Ew-;)IGTP5yXmtcGK|4@Pb_n!|+8?|LRteFD`e(k5A&nLkp z`vFr5K6@MMn*q3`i@{D+W`kiQ$?G{b`3_lRK$!{B#V zhar?VY{#%8!@eEXK1?@Uki;^4{_r)!*AL${{7>%Z`@?0SA)zBeX9$0%4%hn7BcWe~ z-U=0ky&NVyCx+#P%@11}w#EH~;HVP3=fS{%lp&{5ntJ5K^G+LDX`pZZD!9I z7Mzi$e0e5!4FnY4cCy8*qc#jHy?V8D^Hu7qbhFmh@ogBUjfS0rx_QhYY4jnju#003 zNe&(Q4ceh>yVCIhXiG~=Wu=mw(o${o=FOX>Hk%D3+1nz2;4et>nKZTH$n#Dc`k8q_ zg_Qp6NTr!QVOVfnn)1c*+%=WJ>ST+w;|E~27d&{(UdfETd$rN!<>k^b`=!zQ_y30q zr5>p~VJJE+P5ttWEc)~bY3dh8PUIF&t*qGlYUbE zS#HJEt5;EGQHAW&^aIjQE6ksi=avJ?Ezl?vE;vHJOC0JLYXT<`j9DTnDba4(vPBBF z_Wk$Ym%T4}|9veug3Knd*#tlkvSX@1ziZbn*)GYhU4m#*xPK#}Y`+9T`jMPVqyE-Y=tLjzdU31 zNM`KW3 zetL&*+m9Vl;jlg0wkxun?R&THeQ(cudtUTH*a*Y!(W|nYT~~ke0rZa@>Cb0tbGB~} zeowYtdu6-%J?+-5!SFSN_R3cC7KaL$0F}T*o3nRs@E#c)1AEPTv>$&Q{E_Tq?Uj$s zAN3FJ+7OO+N-k4tAG}eSYx3)nixPJsfnhoP(d+ z4;-%SZv~3~n-0HzNBF({-2%T`;CBoBZh_w|@Vfv$G?%`xMAu5cf&YA;n zR=-)av1sFKr5j4qwwG?duur%z?ECwHQ^#&pKB*jjV)%(y&$)he{XfpMF2@+B6lkm+C>s~>)~#t(0c6kwEg1@=J0w~XuSbLAeqqal|zdmg{$L?VlN4; z1W^LML1`0cRM1Lzb+5od19*?UKJHOp_oyGhc$K!#1~d`*T$%lwhtCE?q~tH*HkW;B z|N5K1KJ0w5sp{V8Sd97!nJBH!yS)%le)#A%D8CAEW5&IpZPFkN`*o0PB0!KSY5%?pe~G z1$zN_l|1L;_W~o>QY1_#?kUfZZazTs^Y1wQ?>F85CpZd!#NfVOBd=dOeD27FZ&r77 zw6{0ky>@Q(k;A(VU%1xhdQBOTm_H>yD`9n@GB7Y=L}J$JDFrLC^5Y_@*Qurp=Z>8F z{Myfa?5!<^TgR0s%-)H@FF8^yv37m8JVhUX1=tm|YktaD6>moYrUy0X(oK8g<5=en zW9vOT)#Xjq57!0k*S}vo-q@K!+DGS5)v1pSsrC~wq&V7OMt1Z#!hX}))nT`&6s_KA zcvR0tdFglf%nyr zD6mGUM~)i0#epFu{I1K5=rHu4t)tY|FEzwM-8R0w3s^EjrQgogI;;xdBg6aWybq-Cuxr%P51A25MFjH z4GYsNhX&a@C_YthARF!Nx-gR|#x;L`OO*Jy{y{*WT~FQbOEXdW8Xcd8s1_%x!8>_9 z&WAPH&lQEv>^VLb*+m@zE%N&<4lrg+U_hF(%l@|t|8PeT_Q2lJelPS{Dpgq%O6i?g z-+Xh8@}3-#Q6kdLgoQWW3iD^|_sQOrm@yX9{<@&*fH?7Kvc`bI@OJ0$82fxB=7=Kt zaQmsg2@6{Sh?92z7_2w#ndNWxc7$q_uJBNMkRvR>Xi$u{tG_Ydbm7i0`=A_N(vj-I z_n*sg?btVFR;T@b452w6-;34s9H;rdP`+dTSYA|9^yUNJuJ4iTU0nU`-)i=!Iu$AK zRj~crv{~UMr-`!TJQi@v5jx#Y1-HfF!#&>L|8&WzncXKEzONyj4K8dLxTxNs)6Kdc zO4pDSA21fF+iTEJB0$}z;%mq#$VEy%#vV1RIc?zVc6CjS(P0{{?m%|aE!VJ_s!(-} zlfs+`lZ$Gqb)jjv;z5UfY{iLtt#<0MJ*Y~3bH=5x4Ey^g*I2^Q-D$t%nrNATHy*Xm z3>5J_ZIL%?c%s>;@8OO126cndE4)Kj)7`8zU*_-Ms1Y@j`l#p_gZ;AU{_t53E;WO- z@LK_t&SY<$*g}RHtK02*6Z#B(K{&nU{&1?r6-qm6NS%qNZiZp@_vJGTWEY9-mIt*m zbpPA78dVhTh~~R)>`xmrvZ1F64YuzT;-Afr~0=;<&Bh@ z0G_GgO>(7z?snN@YSDWWi5VUC8z!7L{WRyIeO6dXtNwxBWOrIxs0Tb=Ygb?n#{vi- zd+fLJvCdQ~%&sOx=)L(ZI=fCGdK^dIYO(7A$?*H#4Z~`Ts3Vmkd4v7`@HYjX;4yOz zg*`CDpj4_Ru$pv|WZ1o$VK;gMNeZS1Rna%b+-i@pci`3XN%b)g=FS*61uVRmcFpemY&;5gr=Rb=)4&_3dRxfV#D&1y`h+6{Mnu;;|OT z1l(0ag*t1L0mhE~(=J`K*uT6TT4Ta1(@2FLt0DOgN{76aHLe_|$>D6#+cn?f@c*|! zK7_dIx}^V?s{L_I;e*mFqhsxq(|Nxpre%ixzR9#8qHjj0{aN^pv|-^BaC;Z;A`L3B ze@zUpaAGc}5R9Getetn*$uXL?2wAl9z=0cG|CoAAQ)3VN!;xHvsjJE!U7K>EBL*^( z>48a}=D-^4&rHK9|IQn({nMTl)s47@|E-3ns4hnsj)BB{$4bBy-x zlZ29t(R@-vg+J6=kS?rd3`LR{GN|qP=m>}9rHp2~Mbu!Ts7q$MtFMzMYV@J@G((HA zdRUm!?(#Qx_6WDi%UsEPco4tv@x2mh@l z)MPiPFZWttL-uznk>;Xi-*EeVeb)(HbnH!gE8p$V-y1q}KOWTZ(Ak`!uv4+TLEkbV z#@_Wc)lz98al76{s;Vh{*Zy9fo-e{26YVC2NJvjr@|iDqM&H~gFgGr zR>IDT>9qbr!xmGUk8B;h1NxIf#SZdgB~K}ot?eb-Ntm!c8rYP)w5kp>M}7l_Wl zZ^nmG)t0c6otU~qnP5iS>pOT?O=x@j8Kme+At6*N#5nw97o&ntB0ZniUT+RM8Q)I1 zn%dOHlX!P1FRXmfg+1$WPXC0ikTv6%lu9Lb25$>jH-z0(9^5}F^>#W%p@S4p@s$Z} z$}=tDM>3q`{jiGB;iJahzcVHHq^w$%Nd;WWt>|jtd61PqgLpEqN?%2vbhco8yrNop zM%i~mi77;eiba)o>IV-~XB^~VQ(b@RP#jeGj}544k!Mz*`iM4Hi#+HgPa2zWL!jZz zgXosXI;BBZ(e_^c7}rmA#KF55I3@d4`t-j$J1g38CC*d_qKc@>o{Z*)bL0mj zIs!UTM2EcMo+$8}2FirW_z~B81ON8)#=(rX2a|rfk9AeZgGMUq+Qa1s9h19{Jn#v- zR#D%p88MWPlO2qY`GU}!qHa{QV`IB|8%8K9g8EwHRV@l*h0}beSryh~KNurNu+7+$ zgFR@t@lMzh`oM@M9mGLP8ww_Q(*K|uCERtA zcuSdBUQYyn_4VxS@rvtRgu{T9Ih>&#!8q1jrfT8y>Kmd)mOXa*#Q&&sb(Se3n%g@@ zV6rl@CA2Ekh@tHf@!|K9Mr3?kwx}h}#NQcWF6lj8O^$iUZ!cqA_Ius*?FVHU*X=(96alDTx|&}yW4pW(+5$_C8`@(qSq%`O(m_1RJi^e z9$Tiuc*Q+p(%rIq!SZXo+T2@)BmUa`Og&%5W0W%kYcQ4Z)L^Q?h5E`|fq3r|Oo_@= z&l(V>raH6_(0uJoFeokPdX!%!MzTmB%_ZX5z+g#sw7g; z5FBtFk1aWO9UrN6+7sT#mlNV}bNJ2c}k(v^hp* zJiCA=l*AicP0d6?M47J5F(SO(p)BdWr%Ft_cF$D;zt?1Vau5DbrOstPUUS6fM=x9O zxh9Srkrh`M9FF=#fn{L;OO)VoPxhQ2|VZ<{>VxHyBg~F~Z z`kKoBTz6sSv+4x>9fzUNNM8HKF~X!SG}T?;l}VXDmei{P0}UNYrS;Y3Wd{8>cTu6T zQ%U{ve4V;*Qoy0lv4r>^OPVnQ3XTu#E4h0!GLUld%ECyh?e14N)>4S^Jg#VN2ri6# z@|7r@57Za_`KV^LqED%^22Jj0!SmuH3RSARl_TTy&kCD+n=Z5@#XVVXZgT{M_jTZf zf$fgSaQQt=NzjP!-n)E6U}4zZYdq?^;I!s>-9@?!H&+yzuQ`Gv6xZqtM<(c-+abeR z9c0Upgx&{{+0mvnTGp33w2*X>WbZW>W~Dk@cdx61gRFWiehzpiUKp8a=z#xd{cd3u zIJ!gCcdqav9&GGud(vL0Oq@jZIwB2L4B;KF@R1pXie_h0M!=n_!UU=vY^u0t#XFvS zRW;lHTp_RQt5T`ed|^9}1t+K|mo;)ya1h>r^%XYYL49@C+ZlKyWWIIw*x`4( z^NnCS)kt%1b01L{sK3*UQGHF;O4NS-E8ZAyHDQ!0P#HO?P^Au5_SHFq3gZ>+&7_i2 zX8+@HFJqQWG-tQh+>Z^o`p-exP3qj+AK&X} z&nAt=nJLduW}(`^D^(-HNox~k3^cfUpA`1B^OWvxA8(CxUHiNaM72_=gI6czXIdjr zyK_nedAG2GSE&?tn_Y#*Kz-Yj4x`bk>ubN)?i>+s^*+}eydo})xAJO(ittGYw8rZB zdpxBitxxJY+S)o??b(OFaOX5?zR(8MEaTT|0L zCx-Fa4BaBAOsv4ne|EeW|vOfE!opiN#+_he~?o=7c z4u=&3hc||+l-9sNoCpq5IkP*zuG_V{lGIu6*4=gJ$@XTeq8-nSGt1@K-AQv;veS1` zw)eTF;N|&)HCDc%8jmozcq{4bsJm9*;mW?#ap{W-9V6ygDIQk^27z8mWkiI5hb3Gt zrJj6z?n!oEjQ5i}bzeWQVlE1G;v#kSi0}xE7!u!ctBb3<~)_(2duiJaAr0ZT?^YtoMc9mMB zQW*k+tVUclB2vlsWn&Q;5%Pc5xsrqC3~F!D_g=_u>*!GEpWJQA?(J=INhJ60SnuJ% zkw(m@%+81ijE^*6nruvQ=T1{!OsZA>5$$2YT85oUcvVtjaZY<^a7ko=A-+Zd$0 zezE>ZlePUGuczcq4cRw?_3gTdT!YmqI6baZW(Q&_Nud65Gbq^C)O6v3Gus&UujiYw zprC96`OMYcz=vnYWsJa-SZ7bRWJ;s~1x6UMT~D61bR0eUMRt`#A^Yd~Ds^@Qd67qv zs_<;RAwF?rkV>B%@oHkaAy!$J{rGO1OD^xYm)+i{@9V4QRoN;>L)DG$Aqm;!*DZKZ zWMEvfa%^~9Y*ya#Y@PSBJ}BPqX8&~iNv~et>q>UqRI4Mi;ta_VBjyH)da|;T)vEg~ zMvL)Q@(stekIpwW-^+%-0_pu9?7eGr8|Qg0Iy0c$6N{J|NT;<3%mtvES|sjtTbsm{ zR8n0?iWg^X+PYu7H?nQ3iQ;-8Yp43b)uY8i4Oxw^lqcW6jjbs*0D2g0Xw6ZGV zPAOd#aTx%VyJ`ZM8Gv$EEnwz+loO}>ob&(uDfC0b`R4s@^IhKWd7t;4x+){zuwod_ z_#MPIa;tlu(_!)aH=gS8!*E_Md;{4jeMXjGzQ+1(G=>W5@2Z$sOGU?HzpJR3 zvKGqS``yBAI0qYH;{U*hU=K;t;KBoA;E)J6XpA@o6lV}p5W+C6l9j#$(~{|QCT(2{6hz=W9+Z!P3xZ&7fEU;^tftdrCqxW@?>PLU zU09W6f4~M=o5SdEb~_iq{e7QYNlIh+rA!&@e#+nP<^zHHeEH+tdRC}PD;Cb+fnaru z$Z=hYrAA6y*mT9Scwyi0@_i27poL!5UgX&NBcRgX@NjB>#`t-Ya-Y-ZJlFc`gITWO z*)3|VOZ4(F2DPh5qlTxF2En?_D7>w#tLgLw1D|m5Ox#*B@)2E&4&7?2@O>NBSZ|Ew zd3%kFH#HJkzEG08D)dS_C!YF?B!PWfd5?An>oo^ zbFDNBG*|0PH0QnbLtLUGVJp2PIJu;~ydSb}*tqOIXrPL(lsNVziES*AM>x`uyr$`5 zv>e3k!R(Fu6I^Q!FYRM|RSsW$pEyit6WmYs7;KN9ub8+b#ute^Er-<)9BU@@Oa)fU~y771HtDLQ|zPe|Hu5Dvp>tm2&V zG=4$@-M+y!8QhHr^Q{$*NPLBP9maCpyL&`y%R$1<-G*<+Y_Bi|4!`|O!csp(bDn~< zHqE{S+TOCVXB8J8bIdUvwsE6D<=l@C;>>O62KNrpW^Mcf#K?UFt-fPFLfG&A z)-+yE{^e&0y2iE9E*UPYRyd3@9LDJ+G94P%{fXU!KA(ANKh!>s zE;Hs`%XllpX z8}y(2&kOgCtcgi?uIoaf+}y_KtJsBmZ{)kSl%1{%q$`gl`egUToow^dOiP1uA?^_^ zNkgLRB>(1yK6Wx~y^zx;db3smJ1O*)t*b59|NNxrNf?BFg+7@u3;kug+Vx;Vn ztS13J;i~kx;80eNuH~$ud-K=-2LPB(pn~LVsUV%!J{FYCrnu2x5^bvEM7% z1U<|^o+j0kJ-2Kudvxj}cfP$r^t75ubH$MBvu13$*YihtqczKl%}T{wwbrYhIhW8b z(wAI6vK0NX2>bE&0r^9(r5``NG$OC!>iUY77tj*vb*n57n=6<<5 z{3vT7qYlEv|4_^^khEy4P3az89a8D*ciu%ATrC^BZeD35CW!6efE?ojXA zpv8Z8@kThc!A2z37{WFvl#RmmD;AUe!85P3hLA|N!;MLl3NhC577kA5SDI1m^BZyV zksBN8w7m8;TIa_a&foBnKr2bb#8BBo6GD}suEbIxqUVnNZ?7En zf5QFyaQ!D&_GfN?`V@p3L&SZQu+twfp){n=6ByKNLu!m=d<_QMu=f4p`D`;+1Kc7)#UkXhGTrdLbxP@_)H(T5y;p$+?EM9HMO zLX<;GcRKpt4Gpy5+VWkiK4hx1?akf~&)n5ADy&#hQ>cg>**Ut@-G4_U#F}JiKo>j* zo0S#YVI>5YwwK$UGOHomqy8*Dh^iqde68)_34saS>lbhnsfeL)M!VIY(LD_Lcy|+F zKsQ5KF?m#wxBBm>ec=4Bl;u!L{I(=L^eCaz_bN=w`}td;#vWPt)d|UQr-H+lNF|1b zKC=mT-bfB?-NEzjaG@+ocUUOjm+&U(JBhwxQWYfA9W`&w`UP9|PJcQlh?tJLlc&XQ zMJL)q3vs@LHhEU=(4rI5iF7H1Wt2=)f0ABE4s80bcZt2Bvan=7UZKU1_+oz!Y(}_DGy|2o|tVGE7-f8*JH9j3;|6qrV_1V3l8)p)) zE@jKr&^`ppnT`EIs5RG{jtU#vkgfCx1JTmN4!TKKqyrkYFB$X(wGT0zZB@-8HqNqwAhhEDZGwR;PqbceDaj(U;whCIuL-%C^1YEU1cOa8x6Jm8(NIm$WF3nin>xt*YjxJNA-- zXc!4wC`gAjNmOH9_&Z|H#zC}eC$tGPBPwy$a7W1zRsv0GLpj%beeprEb|+3SYZLsS$t`Er_n}iuo^C8M38RIw&g_>)S1y08-ArNp# zv{>+_g$Ub5mhT;bu6TZ@Xtmn*v@aCeZJCV|@gt!s3Ii>kh=sH|Y_X~Cg|C=5toGjK zxnf8M6$_0voCxJ;#!S{k%@t+edrzCZJ1Yw~)=p@53c{6R{HM=Z9|=1lD+Xb40qP5> z#Rf`)SKJ{P9K*`FJ}OjfFf>?_o@9tlGvyp@Nrf8pd(0bet}vk}4X{T~iV4-5T^n!Y z@a2%TEXm$mo=nK-Nxmsj%hpgClYLQl#Ic}XJB(3zix9F%_N+VXuwRLv_G~Y!<*ty# z$mW#J4qdT-=V$Q}hN^Qe;<5e(bI}v(4of8hM3P_dlr069-eL!9OAS#G#TZgx(N5#0 zVo0oM&}!MFTtOl)!~Gq5Z(aFZHh-M{oz7ec(?K2v%ha!EJs%hEeZS;hAh1I;l)$<| zLFR>sK*5sMr-Y=qtt)5UIJyALXhPj*kQY|n2RHhD z`s&jQN0a!cr_6F9g!h+>@iQ;UH`tz+ew>cny%{>)s3{MpHr>P32n#`dDV*D}#0m~{I3pIo( zRoWTXm20qB`LOiE3n9hiDqG~C>;i5!027C+6l(1&;cAZng(xhh2*#F2A#VmkUyubV z1jodVygFqjCbLgA{3rR5o|EQ-Vhp>k_KrIl}P?W`2 zdrB4b%CB0F&{Bk-TkxoP?=4oV3u*cwxEwDc3u?}uBFso3WChTFyfIHN zs|~?IFxe>gK2vSzOwK`FHwCXA%(1BPl`pQ%-k=#4kEAowEfkP z)LO(XQYIF{!Nkx0X5u5oW%vJM;unrkSKR;K6Q3cXA=HR1Y7{W>4Z9P+b#D8~#IM;I z=*h%K>SFbZ3MRhOwmb0+dRu*W;=lT2;!D+#6^Afhkif(TtCoh!d%(m8dS}i zh=WS$+#-txm2_5ZJ&P)VsSlBE2G}+NPF!vEVwgCFDI(M{P$~zm$-bAZFr@}zTq1F$ zlo?YoMfj$t7zupXeA?s{AS?hAj$sDdzBvZ846)TKDQ~%f^~u?7rvfkrvly06jR67$ zKzy4|jfEpHfx|cyuwl5#$CAtx22voU`P);)j7;o?>KpmHSgM3kqJ9no>pT!1tMelx&*vrLv&XI281N zA`l15j)AY<$S8=~Kj&9KAPx{1aEzBBMZ#cW48qcqs&4<~+z?sF}%DUhuFur=5*eY2mz_T={M|o{`J0_aiHS8bzpdi!AjAlppz~x0jHeim26)}VvgE$i1(yWJ6}K2$^nm?6h-44Bj)Oqr5jcCBXs zq8@nJOGuE|d_L&3ro*7DfBH?kh=BSW1bDPMK$=C@e|Bs0mO2H0v-f63V(_M+v z@IugGEv*YrYUr>iB8`kZ96DgY9P z0{=L`0t;g6YeB!Y78Z#w`YH%D2dV*#@Lxz_#s4G~I!%D#)BGA}R|%NtzmO^k zU_J!C`fXam%1958DyPL=Db-{Jvk-#cIt}7Rgm2zz08-^e0j{rKm7Gu7^&7ATf;b3$ zgP;NCKYgO!T{ZmAH%9T7C8wgu{QZ6>rnv*CN`g{LT+@8iG~fI?IHav_meyc+ zM+V3lw3fr*Elou+tVs#LER(kqYrVLkL1@Qw^OCgJCBF+o!uXx{6+YaV{rM|fR97W> zxNWUBNAIcN^2+@6*#7=XoSj+2kTo-nK<#U&p1@*9ChQ$EL9qYC9&X=`Kcb`eKexyi6*#c~-+m96|r9eL)AAKJ&Kqi9pb@07WgcYk6j zh~g@*+Dymc$fm@{Ee(v_juCvUO{%L1e0q(kG@|=DA%rio1I|IGtH765(#j6&>)_GO za+nt?{&|fdIse1YA$iS$KP>Es26C;|R=AgScb?#x`?L*1q1!x4n(TI!&hr|r=Yb&% zuktpx&7xBgoW~RyQgd8pjk4#fYq#rtd_@02x|9{swFV1wPo?TDd@X%TT`dvpn$UMY ztKlS+`@w$*dv*33{XB!`ytX51f?rZgR{CSXxR$7Dn=*t@;P+8hNs7Bg9vBP5Z1Sj= zXZ4Z_%=Axl5TW}ngD19l$-t3HeILYwQ=AuTfGFNpHLPJd^#*Ujy%m_FG~9C%@w~=n zI>BvhkB8Uxv_8j2TPl*VmGp4v)6c&rT9HK_@UNS@b(U?un7%LC7^uX*TQpYp9Q8lT z<15j}b-j?|8H=ga?rEcWw60iMu9uqlEt5mn>B~Om;2$59ms7t(@_xH61DCN3pR+YX zM67J)$+(2S*aj*Fdj^{0NEzdke9={ASb~4`1TX^=7BjD*lDl8pzZwQ+kA#5nGTd9hI=Sz;*6n{L~5iedVF zUeCa-c}9ZxSSNFm%%)R(y$zvu5Qmw!5f(|mxLN0q^qy!YfXQ?%>jotKhBcXQFp`Y* zpk2#bifTO(@v?ja(U6wjNgzC9HsabYJ!rd&aeH))3@> z7Zm)+ADg7F^1_=G?b;wTd|k&OcmYoE3erL&n8Co~WvI;tYcO7`-Qm5iBQ!6mR9VXF zPx8kQ?3nAsi3Gpb{PZ6{NUxJ`5XvP(g&}x{0Z*$Nl!qUpAMsccB6#48kSJ6oH!rQk zL{if1;VlrLX#z-!ryvz2B-;sIQ$`zI39O%oj}fItSwi?E?XsX0(a5*2#Vs0`sB(YP z+prfPd2#-_*{s(Hd5ITYn2;n1h)28Pg8a{7A0RO+*=*&ojx)IGZHE362IgJuC8&&XGgs9IYkhjGZWfCT#BK!Wde=T(7c==rW!UTRv`{o}`L_)dwgTi|0J@2V+@R$L7rZT@O@_qCLJg9JCpA(cCZGgYc%&2bmiJ)J+1pu= z^w`H7_tJ}v(0%m;=P;#5_NAA~oc&Gzs&@O?92h^i)g;JePX8cTcmzMShc5takQYFQ z!z^Tz+wc;PVi1i~+#a6Lx^HV~8RdGJH>_4+5!?O-d>{8PV@vGY%c8s;NA=)^)j5x?`Lyn_B6HFG)k^hOS%gm{ z2^K~&3dgQC%-5~I9OsbhR)jRXn&cEuzMV>bYUOigx6?&%Ej$F7J1SNj( z#$JwD!B%}b71(oCbA#oG1?D9Prwb}s;1ckL!OEe}@Pg{Apd_%C-b$B#RcLY z>Pz#-j}U9ZG3#yKy_FRcf_j^mjXN?SOENDf0goG#SNJ-fpdbWHY6O_muvpQ>!$|Xv znXc5iHzP-?6E$*)r&p2V{;WIBD>V3YO+MAm-S<9_o?|gin9;^u~XDx3Kn@^X4~Jx8edh{iEa&g&`0|*|M!36l<35S7$GcicUjv^cm!3KCmk8*_y z+hDctLXQlueUV`io^4BX|D zS!vw;myaon(6c#R7h@3f=!A6~b}z<%j7c_-Gt~nzxNAJauh;Ak8*p~s)$i!Vv_f$I1%-1}VV_YTF!4FEHL1<~Qt;IIn| zTAUg`&RAYbX9&-@_b6Uz+%E{@`kgkTNOjr9$p*2l#jq-kS0FQ%eAaP$;$A`4SE8=c z_}(@l&w_6YjN?r?pGIiWjxWl>L*mcv*f^%{bu^GZb$s($qTJ_r1|D}4zh{xOlrmn6 zM_nw#*vFMlL6ESVYaEu$W(;kD#=T~=E|h6uoF;Iq9qY$0?LWQ|$1scbQoMMi3LSYt zKi;<^QDVJ4e`&ABg1Zr%zSPxGZ;52%(k0kW9k1Y(zDs^W{bOt!f-jkE;Bfm`tBm&1 z>R|=h&|h--NJ0al%MDqy@q&z=dDsN8iRY0H=T523@Fc-0e-c z&zLSiWcvA-+f=x~xLhqd6?R|1q|X}*u+e|PK45598};rBIYVBR)n4X;+ER&{Wdn7A zgbl*;P=&nEPxWggx*R=uwWhV3d{0$RQuISe1Ow#clDdZ3G+OIPNX*4s%qOfT69Vw< zV+s5u;EP%;`bXSJRnfa2B6hf+a;3gPPHf!nHylsgS7n;$7Yy~dv}Hcsk5`g66j)_E zck-Qtm`$SnG%X2~3$A$H5gQNxs$e|oVL!S4tg2`V9&;B0Kg5qQ9#~XF8Eo9n?~ULe z?WZBiYRn$N6%|HI<~#&1zM-3!r6!3)5iq6%J!SgcRppS4#^B}1^#X&cJeIacQ(;(+fUIOBkIe(Fp z*ALLhoMZRm>tEafQuq@o`CndkR~A^%Ej1Gbq_$&H>ILwyy%xjLt=8XOT>Z_RFW*iu zl0`a(9dv4}3`pBJ;LHVooa=b`teqf&I;WFS(^(|Y@p3n9XyUr_;$|>FEsNC}TIJCJU_dsbggXQV`Y<9#bNU1W__NCTakV=x|tq zIg?k^I37fUOSPpknnjDjxWhr~4xEyL0A9jcdoxjhC@zW>f=&l9geG)@;M0#L8=4=) z(_&EF6d{7GXM-X^!cH3{1z9>~bkx$>U_C6Vq@kP%pgQWg;cnO&^w)BL37>@mbBpP? zHMJNC!jw#QGjvC=Pt^JGvV;YGvG@U|zqdHf{j%Q>)dX4KT1VDz2?0<$ z2rF-A1FhZ8m;F>^=X-#B4>R>h_Di^DJbkE(#Q+>P{?f5_W(!B^X~D|!B@OgY zP^&q^w1JS#dc4IoZ9txXU8TBU&H&t*F}%&nVPx8kL-|9T7qGyCZ%{cNE(p|q1JHP-1Y8Buci{KQxP-E_A4 zX!}2A{>R}XfE;%_Ka(eRewC+4Y|_3j_~`Lx+b>KA6@07QOB|h`bxnUI-pH>_tf(*M zvMwDtP5X=tf@q8rg;+Kr0LJ@7Z(dg^fb+*hCuNo(L4qb$tNEP-RDdQb1(euYDO4}< znSc6m>~Xt%>D@N@fQ>#dd?{x$)@!^rG0rP!PHxwj#&u?Q)2h&pjcc&RMzm4^yRfD7 z$cx#H7q8v2{^QMKpP=KIp01Tk5;EGoYB9$2vFvEJUNQHR2tL}UDP)EGB0jo7U?)#l zbNHwbi;0ani*>Zmcl-i`y-SUT%W94&p45-_$i$m<(*iphz3xUTm~-za3(iXE{wOip zZXD5kUo?I`N_<)f7W-|Li_e~|zi3GX#L<9(@*tE4e|v`m9-QXn;Anw3k%t>xe>~|c z!8Ek8(LIYQ5NmFvEEC?YbfjW$$1cC&K19`#zLv{+M3&)0+M|~%dj6QT*3~{yr&UWk z@MD>f9cs+D&Lb0gU_Step)l%Co4PVJSv%TR-x=JSH~KFpRQkw1%!j@Gf%Wu@ozYXr zN2!toQ?+QrWvK?yQssF3?LxIGfAEvke&A2pi5%BrjHm6I3$ zb>+78oyxo9#l}N&ZtKQ<_@Zp~H^(EidR8lB1!o@p-dW3MADP~ymiGMjAG|a4_~Y-r zxbLE7NE=q2N^Df)!0TlUj=wEDC;fQ%rJuUrUNJr}nRC|k+d~fu)+Cc)FM70*cgvz~ z@GQHIWmk3NpI&Uw(J>sVQx~P)s+SdU?qVsI?>4AA>e&|Mm*0s)%2OBXS_Z`gA9K+x zRO&Sk4P8JQ@{p?+6N^HWs1`U6Z00X@ebs_iW6J z!j;=129VZKwqe7*l7Q7q^=KUEXAgTXnIHNGtFaIFj#KeQR?{NKN9~qEz5)y!5V^(gy_%El6tkLWE(yHaVtY;l%vGeYgHN%f~cVmtS8 zm02Aj6;_jQVdnbEN*#aB#LNnE9>;U$zIj*`u^bF<%^1tiO3ZGM8I+dsWd7BC^Yw(L zlS&}w`91@`%A7!j`A4#%$gIybAE`-ifC>K5yrgT$^BWd)#wNFXCSFh0=CLLw`D$BB z>E}8&k;Z&EbsmS}ma1k2;+!N?`j8Z^&g%|b+fW4c^?BHBCqC~A4{+;5Mfbu>HzFJi zxg{ULv0M~pEmA^b=CnS(-h3jnkGofa;-tSOay(`($218JR>5@Wv^MnIpSPqx$7VL{su?q2;xwmw(?Ll9Wz59= zIAT-fiNh$4J{02EB=8?s4%4VQBUNO|BgoW*m0)kd+FWiFe`rxp+vLwD48@afL4Ye0 zJ7&GeAWCVXPv_Dy`K{7Kjq=A;jsNwT;;OT2U3l3#%ds7qh{lHj$6*^?S3U3y1(p(6 zz@gFXS8es1@A`KpFzuddSD7Rx_KG<`V#1_JqHcSvA!OHRHbOsRS-v?iO2TQsRTBBj z7%W$^&VAzLoodQ~uO#fFM=@1P=UUw3W!31=13i8`leW3}D1!&-`9OZkbcU8NMs zQJJhm8h0&c-MReIdN0vmTh(3sdTZJ6StG}eYH~u{fz?;uZkX=s#G!}jw+}TKJD1#B zZ5Q>B{D?6WEEkMVKe#0u`-zKmy-xehh4{tFM=>YosNiRd@70sfG*SO{G4g`_ah4po zcfnJNY7ug$<8mC=RAWL@f1m zQUKh`bn_Th2H*Fnr#_hi>vApbpv9ocx&J4?4^9FmKhkd4UX08^ttZ2xL=a=5UqrJc zE{&-$$lc z=b#D$9gPUIPvzMmSU)!97{VQ=-WSULmL``sq_H8nQVWODu?Mh)%(^>rSR7B|TmVi{? zG^GMR?rs-IQX$=tMV;E_U+|W|xCy8N!Pah^R>q!KqPxA@Q)$8EtHnXjXY5!**H8TB z-LfFEn=nkJVlNym?j{*92V4h8?3f|}XW4Fsn%c~E94!hk9SGxoNW0Vnq=4BQaWeSS zcC2GyI}XZ9tT^O4@2~}nSxl+?*dB3bEh`r zAW5t-NXxR{2c)2K{+mOtFQj5dDuAE_*?4UTWEjUwxtIL|Q$--P9b<_==Qv_)`MYj= zuoR~h@r5(&R6W{!dON10g8~>khNuG%)&;5_@9sVdl3EA0IUNy%vIK018kt}zL6qXg zo`Kz@Q=i7b@dV5^$dF;_pdu1VwADWdlAarQz!~X4Ng`nF2cWFFfP;tz{_ZJl^qJES zmO(x!=zc82G9ZaSBf4(il#*#a{cp=gYfz*hnF3V}D!WM<|Ik!D+kE<8I3NW$ow6YY zq(G83N*afO)HA1^WN6sUFzNvGhFvMd(LINWz?UENVX)K=!)S~pzeuWlkz^|hVEH<; z4a0^d2LX~u{Vmw|M9Nm%mCAx@7@~GMhzTSbmUoj>jSUPNBG{RDl0<-08);aS+1(`4 z2F3;v?9D>IE-S~NVTpBuB%QUEW$_?ja)Kl~9>gRT4GTK|ZjucQ8#?If!YcY@Pz_Zk z3}Jx;QW6Q0NIYoQf=EL#JFzRJUzA8ANYYtB5)l-D_X8TWgU*y0!@5d1ew!3efS?Au zQfLKKL;TND**qpcX)-2*%B!$_4ui-qGNfa`S!TC;QJ67=%Lw~Lk_dW30xo_}GQ?!o za1$^Dc9U#i^wL4ufXSd5prc?GT~wj}oTP`KFDef*Tn7v66R9FFKLz_@u%tX`*OMfC zHwm;WX2gS}Ajwav0gjHKhVuWGgh?oH=?G#KP!=Gjd?B@)p*KxQ`eh#+q+~ltg276= zo8cEpxcXZu72rSrDG8E+Cc^}=T`A#zPr?Nhyp-?#Ch5z4@Zff)6v<{X+XvA|rmRS1 zc?4k?h%u7>kskk$-R`hEN5H$u7BlJSNO&<7$%tk3poBQjcAx9%K6uLMW1upcI+%JK zj@uRGvxH!z05&cwj?6T;?0p_sg#YCMd)BsH!w)RjA;ZS=z2Pw z${yTI-CaU_-Gd_p49iZ^?-+T`uESxdVmT;DwPXe?$p_OZDXIsgn+g_ZfOtl55ns|Ubqz=QGqvy&e`2G;x{^3yPvclJc-HLa4CBA;C4DviULy7!75}Y zz0VohgMOdAk6;;L1T70{c{`dJiKW+5G1=J@0B)5=K+k~=CWgC>gD906$z-%kz-o^j z3`4G`oW!0ZBLvfAx57GTM1oThwFLU7lqoI5nry9sj-Fu~OOwVCJBvYg7q9*}kPd?= zBC4W}Kyj8NogKp?-Od98m}I0!lqg&*Z~h`01Qu2a%-)XR5YQHYYcvs%2}J>%ob|x^ z;?0|jS;#Ts@DH)3p6=I1y3ZMhS*D&DQL_K?cd7RkfRBO3sgm*Kv2Ng411L*Sz=|rF zOe&HNgj4IcB4vmiv1{1j1H;|jBQ~5Cx+z<11n^warBsF*$uqhEM+0LUBS8#{U02eP zsNnvb>wftH#a|^62<_7YjZebvW_?b%Q!=(bO#r@%TPVeAOV*2vwntWjIx;l4tBmx*lFkt?SNI)s*20eSwlZFd+BBLFV%1XGH;sL{rC5^!I z*AcKWz%O>lQW`0y)9dfw{MkYv6~$06epJxCpm#tOM~aKa?E_jJGeT)2zbHi%H6Ss_ zt{3dkNO$*ZL;mw!VgOSVz-ua}1DolR2)6bNV5W&8V(e)ji)i$DK!TG3!~4YR2Hx`!=|wTMZprDEF7TjSw$r+ zYJx-uZL$ID+sHZG2s4&aDo`$`Q{iwVJ5o{=Q3G7PgMeBmVWnbZOg8Ggi-I*1xDX|6 z8n;>rzA(__gLE`J;$xV`>|OD0puG9Mn2OZXBN^B<%y#(65gL#JF=c%&ST3byz%qOg zTsD?STnCm5(&Tq~RD=#x8B{1{i%Wr0HWdc^cWfl3VRggZcH0Qd0G+n9@HfG78F1*F z?o_a{w_<^ftTV{61gsl^hyXTijbY{VX5dz8381R=+=yYv4ja$ei6$C`$N@54u9gOzS$;7rq5A4wx@0L-%oiDI}I0BkRB2k(#Wr zT8eKR1Kb#xVc1WDC**aIhX6I#VA3 zQD&HWws>_6pezdPbY+8*cB{9+=jaLg{1j1#aW>%9{%om!RXZ0*FGfol;08VdT-5=w z-e@1ury)gEinqpqwV*6OI$toAu;%@yAvWmr5nwBlsX*(~?}z_7yB-eQ3}-;u1Uquk z(Qy_SCz%lhi-?Ws&BY)9H^K5rnu2F>)d|M9BVacTl7?t)C1??pR1Ab839N$>K!6#? z$k59^Fb+jxgi-5Cq_loDxQnTl%76iQjxl1UA=()5^#IBeHU~g&NX?X%l=8^><8ioZ z@(%~>eg>?4ggPPte7v}r+6*eYOv|(YJnMVhLQlWO7jOdad%Of*cQ~C=7Q$Dj*fAW{*@$-wj0WX6u=s&BX(o zvI5AIpvSrazHi4>d<4RaVkuI*3ED1!;2&~F@VuWSn*0zOU|Q|4lG(f&SXeAe|8zBS za|B8wtnPgG@W|KCI7kX0tRrM&yar|w5EsG9DoUX3g9L5z;q15QRy$G8Y_5Yz`Ni+z z=j)4$;Y=y}bI9IEQ8*4w?6H$1L9oQz-C$v19ZcJ7(eeo{@-Aw$v=jkLL#8wdP+}F6 zU1#RovOVtbqf^w+_rrbOMhYs;14Cy{V_lMGX(kXg6?xxu$E`~G+1n4SWlQ!O1$1Di&97I?nFMy0HqWfeec#Il~ti{JlM zSp>gPFd56LYD`TIxzRl2$ljS51V$7iFh$K6l3oyZ048R^x`D;)gL`M={O+2qp=Nfu zy#N?DO@2s2#gz^%Iw_(l9T*?#+rQXcTwf1|!*7G7H=P1;8ZLt+OBB>c-}*U>A+>^4 zASW$1Vcl>`mY+3QD%z}r#%49RqTR3}>?HmH1BjIbz_oUNSk*d!(wbt=Zjo zpsH_gf~+HvbojsD{Mp>X!p)mu&_Ki$U-43tcrkhI@yby5%(LK(ZO*cv&+sr|Cz{@T zf7XY_jZKHH9hm$VV7PN82@v3D$k`3zIr)fLfeXE7PQMMH74z|2GMC?fG6{$FLxBg zFz_a3(Wj2Au)r*JxxohFB>+WXbT?=MLH+8)EG73PWGQZ%eelSgOE+zA%mAG>r2_l! z&w(LQDK=5ktOah|fK(irIl9OSLq$#F?4#q?hBKJ|gBjyhjL5JDZ1W(RR>Wj23bTLy z&M_Ih7Ut(Fh$10*;)a=JI%V%RERZwwhd!whd`@=~`*e$5^y(hZu&OqWBB=wjksR{u zmVNnu&8J~H0%AR&Gg||7KqynPv%XqYD^*>U8SCcGQQ3~`W?HHgY~O?{v+WfeN;g~8 z8D-~WwB;eyGeg0}t)nU{&r;xhWrvmG>_cF6GGK~vw#E;nbob>;__RuAy%Db04&psFSAtIzJV{pwf}rtldoV`|?x1wk`l2dPW9 zbi}OX`jLWTyHc8Y*qCmxkcw_r+Pl+UT^tsEj^$`@kb=~io&Kwm#FiZs`#vbfpLuT0jRoWR@$yXI(-G7Y+>c~4UgoQ z&?0A|PhV4=Ge)n(KyrU!^7CqI=e?HP;AFLJ6(3k;%d^fhx(B5}Rkuy`CanphW;Cuy z26l)bs33@%2$)~DW^VW8FmUv;&c<}^a>bRdPW<7UvB#|?Rha1cRH$oM&%!LhP&uux z1)0HP=Lky4cTc>T+gyL@L?S*jT!Udi=P%93uuG6|lYScgryBzj{$P5xNa&M&5{Reg zE5iP5#3fAZbXNXt>+#nuleEHhi#ZE3(U>r=m@6gQ3__J+ekEg?)y7E_scS3~Z1b_} zAi5Vj3B0XZ3SR2kj0D?ZG-GOCY@S%%U&_QJS=ARx;#hrlx6}_=utYu%9Rj zqlwe#%@1GG(lcoVK}%7Sex~XUgRkwDgjoXEy-i^UHiLr#tyz10;{F?XB{HlcGni8~ z_p5HG2vkHPv)QhOq(0J$xJ33cY7kb{>7O%4e*07%uX9= zpujZr#V6yg)Mu{3zK${8QPlLXTD zLHDPHvlGXcl;{h6<*O4$f+_83DGL({!q9*Netiab)fs6?5hh)ks++gEmnTJ|_j-#= zh!fBBCUC^TK%=aItUHt69h!hX|M)bcgsZcZXpya@of8v#qxwwDud0(!L%sdR@aOMM z5EV+P;N7K33%m=8kmX6kb+3pRu;~e7agV+*s7RB7XR!yzmVFb3oulczwOpB?>(%}W ze)p5feap@o3t7q&5!haj+nP>HuKE-SufXO}2|utejifpzGk%eobK1+3Ox7&hwHaj8 zY5dfrsG8H0(FUtF;ZdN85~7Vd0eCWrgSis}IN^lO(4>zDEIq10PHX`F=fJ4-Z(dU% zqscWIv)uCz8$Ri}?4(Mc^b^a+C#19q@7No2OlB>zy@bb&llo|n*uK*!Uw-T*zVgwK zQk+D}YzAT@#t9IMO{{0K-IJv_Y0K7)xk*d?o>vk{*F>t~#YBdrM}c*hFtuH?UCz52 z3j3q2T@#2c;sE}1^+{(DrX_vV1$y3fO?T+FcXAVP>`xGB=cH)J6B$b5o&b^TWe1fp zP5{^Wf>)bGCT#!$#UYfOtOLISacI$a*}QZ*ymR!{$CsJ_G>5UGaT1mc8UsI69L=|^ z+B|WzV*=ImMIoI z3+sP<*{NbR-L0lqNAJd8&^I_5`BCG*2j{e6hyJq04R+LmnI|((zIP8)Y00*0eUl!>n2s;UrW#t^0J3_ zFTW`^9G{FJc10$&xyv-(y6z~nOP6J@Q0%bXJur$I@u;timB9$#cl&6X#4cBs_?~G_G>FD~>x-II}$3gjZ-{Gi$%RM1s$n`^=@wvMt&eWj%E3uPP0>Kn8<^=BW!H&OpjmVhS5}84YNDcvIwssia~%^i887jgPR!(! zF?pRDM~xDLD1wBr3LW|ghMHA;7NgKWLk?|T|iBxZ8wec#`IQ{S$x zI(6!7&w0*sp0gIl*a9|U=SPhz+2`b@Ad6~Ny}E1q`i{Vk8G$)}JijqENOAVc^6KFA z9loa{t>b(nH(DOrw`lt5NaMy(z5_EnPDi~KIsbu_?mkG3{WK$!}Aqh6-#5QkmbWm7yD6(G|2Q?$A@F?s$`ReY_>DToX9%=K9b! z=Bac3GyOIytS0}c`dHIOON@&$VUx~Hw`K)YMufNm($7VoWmM;M7dLgpwNGjc#11O< z`u5mavN4y|J31!adfwGxUe82WHIuge`uX+QA&F-jVxsEOH6i1ltByO{mLBR#^o#G( zyt?Vjna1eWXhp+D+V|4@T8*ML{fx)t=c@zF>U6_D)>NqJnfo@z*M$YS+M}fP>RFVl zE2e4D`sR*sjdjMM`RS9YU16yX(Yk&{gG>>AD9yOZXpIsr0o?(c#DvbSSr#fFz4E!e zF`abF`1D0H_P*rn`r?o44@O)Gj>t{0uJ^gDQ#Qmz)NPW@I;Wzg@mfs zI}^{%Z#%g_v&nTn!6e3*sB~pZ7=N-YIyhaTql_W8p0xDZb1`aWMq}*y&YpNv@PWw@ z>&=&g5>7Hfr`ONF*%cCgY3BKjba1mDrh>TEKQNXVo%e^vkoD6l!`Z;v*p~Fh#m{|C zQBBr#NuA_4w}1^#Z$CaRLD4$p`Sg}{oowb83BKzYDbe@j>-32ghZA2YJN;a>l#UJR zS2odsqt>@XHqK&NVguK=XsqF1#FdAnYkV6PIbAK%dQCu`M%f)~UVq`KQ=yIV)pUB2 z?!>sju(8&3bU!m=4#t~tW5H$sbZ~lSTL?3&rCXQoYHJCLuXVMjC!Bz2!hRX+pFU>| zu!Ql(RdMYWMjfc=PLKRNu0t7Y)~t8>smC;8bwhfWFE~kLqF$TPfcCMnW6`RJMoUod z+|T{fqs&1klU%ejz3ZuyVsMK!W_>k(IRe8c!Ra9p^eXwY#Sg<;8ES5!*X>+SPtD|V;xulzV(JwTi6Z;~pZmL+M z_6sjA)rZ9_?8HZ`D$t7URP zogRvsQ}$nh&3da+B~5;+6RqPA2RENKF?vc-9TuagtZH7?S80z+(J z!B!0x8S0Hn|0vg4qf#FmK!?q;bhhiUgByCtsZjL2kB_%BHK_D{(Z2O2Hp-=M{q+l~ zrgM}=pETx_xjVtss`pqKRa@V#nxYSHYwC`7w#xL2;ydds)a04^21jFjv(YbEKflg# zI&#!gM!j!??yS*2d4b+^vpUE>N|N-(pfgzLm+H`)t28kXB(z@jL;1Kx7%SADxwL=@ zGP6N~sU9mZQ3vX)ljsm9JL{~zChm-X~y!j1hrC6mWEnGgKz3f8v+{_g@m{S3)-iQ zT2ZTS)EPtkk^-;{mJVb{-#?ZOTGXLBQ4*|bDg;|8`U|r}%Vca+YY~E}kih1;TX90G zG;U!)i-Z~2AMh=7C733u-S1Z%}^`^wW6ghly3_W7R~Q$ zu_h?hg3@HRhF3?A6JG3W6=M;eV3N$x8)8!h-+Ii#6V;NSthGoXF^Q2vix~s_Xp{@c zMm8~2XBJ!y(Gr?EH--H)`bR<(W&vA=T0_(~ck3@C{pW(%S!Y`XORy9gb+fcVKY3AV zOnhgH85Hx2a+EZH6JnDVI$CSH1eITcqqL0)*0YNjjm37R!Gd3cZ%HHOxC)_(fi8?5 z`3VWWCmPg}#UK5>CbOi{qzZiPxe&?Ry+}xKv`T7qVt~-prVebePF^ASwzLJSVBLf1XRB4vpf|u|^j|0h zG+U#5>ns`}N=Yk32BEh!f=Uf)WD{9$8Jpk`&V^9UQw(^6^wWkV2Gj}2^s259jZ#40 z0lP91WC>O_VYHk=7PK_n%+JpA;KEV!h0Z!A1bY}`Sh+q}QZoxL3M~zOki2xT zzLQb-NBTdsTVH!=Ww6WQ7pZShc4NNj@fLmElotb=yP}nt{Wv>Lai;#J{_^Vy_EUaQ z7^3w{P+**(O&AxYY_<3Wg4Gj)Oc)hKe1aTp>JWud2#Z1!6z(69tvCJtoL>lF_S^qoQw=g(V6K5gU0|wMRqf z#RME{OpOwpU5Sdb=P;(pghpLF>Aye;wox^o>`KJ=7s|0QHi#C~!H%ki$x)Wo$!E>` z!$OmjQ1ni;u?quLdIzS5D*Y2f1jX5UCN`RK>Cs0l+q*$nC=}C9As(|PN`!TMmCESB!DI+&{bO}G=xEF*3+~Q*p-MKlxxj`Us9@X zm6Z+>jFS_UXZDL$VREYOY#S3K37SQ^rqX(AC^*6XxzaDdDkLx9chzCwQb-N2mDEAf zI3YFgShg91twMZL1Fe?)QU%?O-DV^DhXp6X3G7Nr6zscOC2LG_fY8#8rsm`Y3gOr( z$)cGY2l=C>sL+Lx7ll%b5=~xT5hX>*CP!V|qp!zc$>NzOL3xS}Tj)4`Qm;{k#ON?y zDNtCuKeME&U7w(iQn|VkA)44E-Psf8&|{xKxf)-B*s&%>+xORj{Xzp7qO8|Rc+X(0K@LqSZo~^BShJ&TF_}7D3~m<@oJY}ln`(N3+h7x z&4TE^P^|=K3g|*dpCx+i*+s!BV<^gdl~L-7Ry21AE2D#48l9LQF*K)bhZ!^6{u7PHMi&w zEDk@u|JN&iD`4TIHN;WZDuhL}wD?EIs89-MjJvn8Lj2j*?o@PyV@?hh$G3FHgCVgY zJicRtDoJHBwi%Ojx2{)?*HZf79guVhP>M}+7^mA2b&Md-uE)Mj}sUP$TvB2Tot7;3x_P;c(W zI3lf&KO>rHP4aZ)g(fBv-6w(z110L1@Duvei&oAws$#|nSWT~q4KHmJl0yPTl{&IT zXtnw!DNdYDf*b=ws!er*F*GsYY;`ik1?Gxq_ewo) z|3ak_8%=Zt)VF#p6cjDc=2R9*Fk&dk%q~>uOBug)k!nmPSF}0GMy(iIr}qyU7o|~{ z9r}~1TG;{<9iop?V{?fXQ>mWm92FrlsXD!rO^hKgU zB5m5jAnuF;7S~}|+CNBWIX7-aQ0KW=At<=B)y&4#3a#T-#x>WCiWeBiIn%ADPn;9R zz4UZ#OZUP+#L(Q8@WZLe!n*lqTdkOCE|{=r>xa){UlLxpS#KPN;WnX7qwFl3yy!*2 zx3&#})B>f#*-{^t4Cl3CSE9>;8sAX|HFaT-Lx4(vd<#KsZdJ!7geXv!Lom-K>c)P3 zW76W(*)vNpEU1?Jqi^hP*RRAbyDwZkB?>eKd2a4*4Amzv$t%a4s6%berrykI3<(x6 z$0o4V+^!P*7TS+j$EYL$W!hvi1~Wpc<3u$Svo2v#JjQu~HHkvNaXc_}Bnu0Do7*%H zZo=7f`0juawRu1@S%MJQiP~K4I2X1kPG~|mR5S{bpvDXaX7&PyP-Trtz-G`ism^Vp!Ee2t}jDNQN$9j8fgKMs2RbGMBETXov854COq@L__Rg_-ot( zMV-K+8j0H6FBmh% z6hf6UDGKvVEKndt*D0#kAQmPY8CwAJE1%^cMA)Ho$bMr zsar_oPoa0WAyi0Enl(zv7%O0Q3ZpZtu@|fZwYlqow4vHuqYwN%SPG^SZGS~Q5F*jE z`fkGqecny4MCt-pU;F!!4zo0E=4#7abwt+#mnxQ?^9qlc7{kS^{_4EKXqlHcW?hR* z8JHN86sB*uAYD*I&YHFQ$#|!-($Z78`k*WzWLDr)o%)Fs%}5sxkJGav@0u~~c}ah% z>udHB#Z&r+A_KzxM8EFUNs)WbSM{_-uBPcfjC($Cw|aFh{kea`AEy78UWf7ffcD6C zeU~Pfd1_LpORrQblxj6QO5fwW=?J$@57bA7jPleRIQhAric%=LXQqu3bkezMRW}4I zaydljtZmaL_)i^sDK0Tqh;r6et2HS2#*mP(xaJb0etc|TeMd~fGlI@pTpgp1G-gQ} zwIOK22dl7A2^lgo)f)xPWR~Ru z7<)FWJ9@FN6COsfFu-cDuemE!2dfjiFC{J_u3~h4W6$iq1P>L&iv4T&iIPi+vwg9P z`0XRz=r^O|^1>wZ`e5w2p(KoR{GoyE6JIW7nUGtd>aswsuy`H@2EC&uga>^2cEx ziy2Z&Q0Ba|X$^BHog05Rj!~iq+o;T+*EpJ1M~cqFl*MJ{XsY8Vb*nDqYeiRk=D178 z{TM~%zQaaO>O38$2`>uM@va4zA5s)CI$qfj`3jp)e>r(&V5DwdzPVFFqok=ZrrFgP zK#kvC^mmn-a(1hwOto|+u9L-TZi-BE>3Ui!N(fK|Rz5fFn+(gbj`Ig!=>F!Yk)jmJ zK)>llH^VdmQ``Ng=JSrGARRg=GF8o8e$}75WJT=dTx(Rg1z)9+)j#okSliSLI#fMY ztajBFwOf@F!{etbiX!I5wVzi$MP=q&qGlN{smE?oTsXh_#wE5Q!{!L|=zU=FQyHmA z8YbZRNxmDcR^#7$zW%&rQ@|wV^jNkcJcFh&Ibqf$RmRL06PfX`?a>=`k4?Qe2d&uj zeV0x*{+*w=XA?SJP1pe8;HC~~&Mard+~pgis6)|MMWEW0U>^H)1f@`?pPPC5q>6F5 zR(w-&?DIeY)p~uGf#nB5M_WS1Z$QQQi=JkipVTD?3bfi(|7tt;R2V0VTs~VH_ zYo)Mw3mSw%tEs{7r7?Aqpr~!9&;ei;nyRCHTSUlS&Ey2Nq->jv1{57AYND}b4WEaq zv#2HgZ{pDuSsa}xI7->1AR0^Fst~HAyt!X!Q=8S&&6ChTqQ}R#K;#IR6eW&}QnU%l zQ7R3ZNijmCQE8zkr}_vdu@h9-f=*G8eA|M9np#>h*)=4{)QTG>37rXM%Xr~MWqV9u zOII*jQkZdvmY5LitTm2XU=0*nYa1u)Xf(3SnC>kp&9#CRqqYIf=vbiqPz|?*qLuWY zD}AjhCnJOeqsWzdBnrM&s6ZyiJB3=Te+pZu5HXPheHP9-R8s9Bl*`;)3zbi2LDM`$ zpOi3r#hBbA68fS^yStMD&>i72La~zcrZd}~Sr;6m5X|^)4drw-XF-icOQPh1M5CpkG@)gw(nLUE2*!3^P*btGOj0)Ox9Alu zvX#DN8jTQ)X(19m3?WQj;53E=BXqQYv42@;q`nqo9!W1vsz*BobnUD+31%@g;B15A zr2ZruZ&E9pDul3ws!&Y6OcGFmGZ^;@(C=<-^^Zx83DMj4cO^%YraeA57HJFw#o9uB z+bpgV^?ECRdPVS$p9e#GPl{4nG$HzNagD0+=^0zQY~(nRawiC^@TbYJAMQu0s4-1u;8ycOh^I!0*e zibk)XvR0^8V=jWTxgPp68ql3}R{i4CnmH0!52$g3_?{K8-*RZEc)3ib!-9^wnz`1Bg${x!YF-nYdw>knCKMz z0_yz|L03U3#U>~us4F7AR0J8>BG%C&trR~u{W@oFUpYo#8KYDiXcp+GUc@3ed zf%;O+s$>3BN9mO<4gN0$h-i|l@W~-;|Ax8fSYICKJT9QZM!QE;>KV-4P>)&}jBY5G z>?C%kq*{iqImf6hG4&>c%@$DvW#09b>j zN3^x`6yv<~%q3vse_2 zkJy>&EK2=}`WAC-N78H|-i4WMm~p0mzE%vTl2`Eh22E@*o9gZdu=t?~Zy^Z`hPrMN z>L|(7Dk{K8q8Y74HW6JhphxJ!VEuekt95ds3X|m3;CM|cq+c7pje>Ki zOKcDmeX~Iyc(%T!`2=|0+_bBtP7HfVAJ=*OB#TLkt9?&RUg+!bBDw@IRnk8(2%Txr zZeyabt6Qrzd7%_G_Kdzw>fDc+xRM|_YfWZ~iP1+nj-6yz#w5PXADEn|@L!lPq_X|{ z`fm#Sn*#r)z`rT*|CRza9Gm+#_oWV`4lHmkaE=EAhu{ctg}7dIzUutK{)Iiuk>z+A zu-Gg%ja_3uZ#!>$&HkGGy7RhoFJK%1dX2qb_kG>hY3sDjw9mA^W_!(+3d91nz&iUn z`?t1lZI1vY10@5uY`1JRz^enV4lp*x_E!H}{Zsp<_EG&*KR3V)>;z=M6a7#0Zywk@ z;Ig~yRgNmh4ciSHF%viG1L*^EY;$a__Evj?t-9h3J z_ty7j^5l0RhuvZC1U>~e0;3(H9WMa+_I$gy&D%C_VBSC+kkOyfKdEn0-(o<~ujn@dT?1Y2 z=PUYF^zHB8->W8?lITrNzhCr!(f@wm`+bC#oxm2L z1E{c7xbvlRpmQL@mSGFB2id6sYT#7=ss6(QhX+R6N89H)=OGqXo%w*bs9O3FYlLEdsTbQ@tNaO08HVh@Oyz*d|vTs^=kDx4iG=S@cF_g%{R?A z33!%&mVd$L1s{jE!+WRCPM?{;MemE=8Xt|%cJJ-pJn*j1yFNNz$M5mk<1^KJs`nFK zPk62KUgypDFh19TSU#3-_HK5^&)?hMo0D_$Ri3LnHGs>*?eW~> zIY~ZAe$?}*=d-{??jo1#nd|wq{Au}YZZ`Kd`!#E(&GcwsJAg@V>~v|XaxVHeoL-4pN zyDIw~`#ZLPE}*ASQ>c94D1DS(3h=!>~}K4BP9NWPmaru%XFO1U7n_RPVqbpXgCc= z{3F){U>@+W=fj=>K!HaAIMU@YhnvH_CVNfxDf21w68jQMcyG4nY)?X?TOPMOYPcG= zTaq5)$5)e7-Rf?b@s1!Pd zJ`4l^r>Ij@rBo@6agA|RI4hi_>@@&e0Fs6vU>op?>lIg*)FmyT7NF#El)vOJk+?l) zf6kuZNN}unu6D{Da(9_bvM1T!vb|;VclbM^ozc#BfvK*kuIY!H?z)-O z*;OcGr>9DDwv!L@)^P}cHmOXf5ttAY&WxZwnwCmHZ(bmz{d@*07u(Wt5FwZ*A zx~gkc*B8JkAiX=iyZTo3t*)M~o-Mswdd~nGfwz0!?wJW3?>*jox#x1vQh?Y!(EmVx z?QJ;v9DO@`clIs?^7`}oi5^36ap2;>QQJ}5EB06HX|^=m{(=1ikJulv+km%#cLAcK z)#KVm$>_H<2ta8 zTgTZv?wbwl^xoD+Hp@55 z$9s+UB66jR>*7-6gV4w|@|l1hs0XHaP4Q9ysq$30g|l$gK!v`vLfwe#<@D^~K zJI=iVgaCTrTaRzuw0_^?efM>urBWEZUv)sW)&jBh{#S;C_2xKu?%$I<`3T{1R0keQf1xOvM14#W@ z0zAPy!DIpr0MQ#OfmXJaeO30VER)S-*E8#x0D#ncbAVo|my*+R)DDa38sHt~9p(l= z>di-iN%SN-4Oq%7Wv&7*0dE08Y>+!1<7MM9f>p$l=e2Y#-OKbcX>1xhkD2EVhtM_! zApViKE?^h1Ynio7H9oVuUD_@|47ITv^U6=V)N6W2z$-=yG;B^Q1hf9N+*_kHtCSpw(A9NIka&P`DH>BAba! z-s9Tinj_7T-gUj}!WXQaUjjtWhf09jW|GSW)JQebCTbHAaqjx_ZTfB6M%gHTAXQ40 zHdC7^Lf<(+5nV)U7!5O;RvbSaL16$ZFtb=yYMN|>B7r0Dcrt_FQH|^K5YuT@uub4?dKiv;a zs(^j~Ai5CId){W=X1=1o0!KGMQ_Z5+0_6T_=4piVzMFS=hG!H2;RhG(q90)%VMYTL zbOn72AYqeyByoB`_JC|P(9ia>gh*GZtCTmOr}b{08O@Gnc_5aFW$@)-isVHY6-KS5 zSHrgo8cj~>Z6H>Pm1etUyGR}U8c^e`aqAJJo+a&?R)FXLa=_>`Iu!uXC5Vi#bW}R_ zqAg6?OJ^KspoKi^u-GlAG2gL&1)yo+cmSxjSKBAqCfT+RY#%V&%(gj>IgTQGk-flH zV9Nza`EF|T1}GRP7ak;C@jm6~f~uWz2vBT-Zz zGOqvO_3MpFQw?X}HXJN3I-xl(OS0GxiJsR_#q*ufWTY7#ypwpv5LhQa3nc{v(*5U^Xb zDHS-QqK8+7GPHe=+9gP$;Uw zPoKYVUVS0@!k;eWUpRN6;{ruJ_4ONHXMNrLHT%t^Z{~iJ_l@jZ+k-tPhSEt<*T!7Q zHQCy|jXsw&W5)kT>6VwP46^X@a`{A@;pJlJw+uh4oO`U8n^w#(E9Pbt7xT{-b59j> zv&c;`g$0P}cJE8_fB^0Co$_frckaA<&5%#a$jHzxAG&UrPusqIyLS2Q>#`3%&@TUg ze}2b@rW&JPyEpen0rz?Vx4wY;?*dL=K#Xq{aBmi9-zt#5QBY7IPXCr+-!2%npHHSiYpVSpImi_&XB+Vs6P^ZrNTwhg+VL!#|(P<>vDH z_L-WoafHt$MbIO<<@v->zI;i3zWnigF`YQd=a%Gg%kub-x#b^!%s-#c<>&LCd}6|g z>Fwk$%a%Wuot>?{bKNa}Z1?Wn+GRu6UGm3v?b@YXcKf=7SZSB<=AYk_ZK?sy{lv}R zvY;QY`_rC1ro-(FV&nJF!`_B}H5Zs-vE*A?y!b86A93fLPDGc!NZ zX38@&Gm%*ze8A5|b{!_!B~JU!lV4N7y=1bgb$5ISvdY9U z-!r(f_tN#YX^_0biL1-rCqDf>Gf3QQ-QGdsg4}N6Hn*#g4}K4hCj{2MnOCGM&EKaT zypTtxt41F};*@0vwTJmb23>`=ETvp~kgqW4%7)(-r<7<9@Z|LGqiLyOIRY^YJ`i3t2&)4+#s3 zg_wf8f}iW$HxOTV0`c``LAZgsD_r@x<%UPr6mxUSx#i{D+zM`aB{%nwZp{(iz=t1^ zZ#W`f{^?Olx8^wbJp8zP`EmK0qw=|*9yNT5ceHbl@ZpEJ<%hWNBf7bt@^Cfx5FdV! zTYiuWKcs{0nnV2DgM4@eS5c{3b6EQsb+;r#B4^0wW@K#FW@J#>H3f2%*aE(Q#1jXl zHGnB}*&5VjdHDr}I#f{H-o3eb`PxtRQrbQI9&S%IL}$)EJ}+PQ-~0AasF@4~il1A6 z^yG1K3%KP4+}uJ^=H`~7P?GfQmoML6UO{;oej(M%k08w{$F(QmfJ z|6eZPRudtG(sMh-_aVWalsw(OY|6-xYFYl?d++Jqb0?G9^nE5!^Swm9@;ya;|NRYg z33~kSzz>i7Ky-(hKdk=Y&p-UteNW8!Kb-pEyC2$q=>H+%A~A2ixbtGp#gdDME`H-S z_g(aA8r>AuG`Z=&n~43frn61WO;?-xntYmxS!+mn^8o%Ta2~{2>3&jzyHcF{ahCBL zwtbYcM+|CaVS2L&f5kZ6uZZKD>BYJZ>4>9n#8EWjC?0Vjy>A}E-(X&q;|_V0u{$M~|8P&rK4MGqt(1H7 z(1>G1PE~Smj)-IV$V3p&NKl7y-Ww!gnqfhU`v%#=%`ve0nHU@%ag2!IpdZj+9J_AN(f_Kz-AEr1>AsSDGcN5XHNv8J{v}iE5eILW(*?J=wCP{;=gp%h}ua#QwV$Yl~0oL#?r`#6(djw4qRxHJAMT{l&T1m1{%U^yLM*8dNg5 zc#5tqen!^5!9#qpl^uLHz+Zf&RVKbc-Y=fM{A0W?enbq1r!Oxfh9kFqs{9vyIxyU) zV=&l$g&2+-6f6E{Mfv*=#dfg5_#eb_Sj4m&%DDZdd`Vi(&&Nx=&aROvWYJ+7|L)dH5A>>2jmVvgFFJCLxnPYhRdghO4#1cyZeW?D|hgqwxi8J4$9g} zw*|LJ)D`4^RNLydb!`XRu(v4=&N#_9-I!vWV|?96%!iGCH(oHd8?P9n+KG8X`{wqX z_R{tX?GCp&w8Nb@cSZig0Rf1O_oV>;0MynK4)7BXXrDZQn*#^LDIK(dJka5RfiilT z4wKi!r#l#^{db(~=O^yhKDnQtfbw7{<0qEso-E@H@az5-!<`mEcho*v#7}@=H5Bs` zi*-*HyPe+O0&Md@njy|0n|9)ucEgD@!*l~Tcx!rhFh2hOBndKuxU_>7(>v&zf&yIu zQiNIw=}B9YlbO9!6gtrOxSJ{zc79nYKLJ+*ZkLqu69-M=86NdBWd-~MTn+hX z7%t1_C*bP7Uy{#HbQ=wMd3pSjJbq#xKOrwq{BBr0ei|)zg)|hgJ;Ng=T00n`T%ko< z%%KVHzW&5q#4Q0mxn;Mn%kMQ0#hs{XOAu*p+3o8Hv#7a*us-INeEjjp+_Kx(5#|vI z8S+|;xkRTuTa%VjbBDwkJ2Puw{lE~Pea27x>@z<6Gwp;5zM`h`u=WUl_{e92j)uG; z{D_jkFUxgbLBqQw%oFEbx+fb@RrAXV`3blhKpk{Y@Dp$qm*KU|gV{PPT6fuc1jA4% zzu%)>^N}t)lN8cBJWfi%0Y3bIb^_XdR83Klt_XZen7xb-FVjva;)}@pcanF4pLpT~ zAAUmn_z`}>k($HY;Y!`(huy4wjGuVy7$1I23-g4-HI-ath3@f6aO3c3Q$ukcV(7bp zbIVJ)CE!YK+3o8HGsP`Oe+4*@TXy?8!b}mm5_T@-!%MXj^7;Ilf+B4(UsPO5fz|J@ zJ#{Y&Q=2dCxwIdsx>S2fqF%j3QO%dkm-x%0FB3sSj!BoFy}aV`D|gK6FaPE8hnKT2 z7hi61Kl8aV_R6#?k6&4K<>M>l{hlk_RrS@Ft23|8yGqP&UH#kD%&W(*{^RP8ZnOCC zH9Dn&KTziWOFK|QiE-CxC^1COB|6TKQUe*Ag6ct>ca7$EWToV||HO6IXmPXqeWF?x zq}7ZNeg9P36+gV=x>)=e_m$UJ@#r1j3U9|`CP$bcnu=Gh z(O~a;j{h;aNE6|ok&9^cAeV?3-xB}~BV+hWDH6HsciIKqn(F2e|K^gQRk# z8}V1y8S&xkbV?aIAIgi1%2Ud~7qhO@#pV0UN=jr_^mrrb|dPyTQU5W4^y)4aYeX=G|fth0`G1V-eX-b z%+q0N@lbL|xbBAC9Y;TH(NQDXVaU3B4{A8k$UQZj4&?rh@47e3w3X=0s?0(QVGVdHiPW%~ss^y3NYYn9j#L=XWmYT-8b5Pw#xM zb6011=ifUU-Da_+lTKN4L|3ETP(1AZ2o}(#}|q>I%(bzmZi&0>+-HlyCffJ_=_)|0=6-=16^H_I zBo|tQzucf(Qx3CkO{I22`A;IK+HfRg&1cBy4WGfTvJ#s(((WW6+FQeNKFHpgy(23# z=Y!0h**nK)i!)4v(asZ>xbLz@=ZUYlql$>Rqn9PVJ7`v9r>rT}?bDW~6casCn~x47 zRQ-fHA0mtqA*wbM-!~rR|G&kBrj@y z65`H+pM;oq-w+9_425{Fr*Spt&^ml=)ZGp(Z|`;tpt%(}{}h8kykerMb`L!9B0O}L zg9kZxh(m{S;%!%Ar-{a`&VURZ?&VK>+!01f#Q4H?-`fo)e{VzB1{4Uf&qTNT3_W}R z4^aw48NT{^o99#9(HjiN9S*vH?{YYGuZP*%JScMa7PQg%)V%?KQV`1bmNvycN{13d z@@l9_=Z@h{cVW%c?i(zu#Ph-Od-u`sxDS@yeS-lE88Qb8GLe+G%P4sNPAKqk!(b@* zC;pQ(4EYI{8{iFzE{XMUAId3^9lUzy;nV1H9*SKy676>579~jBC^JQkGcPlzn=8z< zW^Zw(=pNX8_v-B2LAH3B=}%j+;@X1{G?e!WBiHWVQB9?7$Q;mVi?61w=ue}lngOkr zGyrbDKy_66r)}6V5UtH8HaoyRO1Mg+xDBT?Z=U+;e@B}CPah6GG1-jX?UZiAM+1~D zs|J4`-Mxdqbh}cEkSJ|tyT^wER8U2`6874vc8^`S{JmY7IcVC6%V+J%3|vavJ+|YL z8p+nGzkCmRPsyklZ+GqK%J2FCGsj4E6WKiv)7jqY-rT*d zJENOCDeOMdeX_f?yQBMRx7e+|HTKq{x8iQSeyikG+bxRfzNP93>3O7QDki!m^pN+( z#XYpRs)tTRHwfyx99$GttjH4Moz+guP8a>N1v@Z2U=L5a8 z_+P!mWeyl|eY@PM3!T8YtqaW~$8-_IJrku~j#OWHA7lpMaaTs+WAV+ue@ z0asc!80yJhnfOgF&1Yycc!Ve?q3+b~o zo0iYbKw~Ul4po6i+lxFvXTs0}^c59w(+ap5WV}WWl}7AFSccqOZdxvfCUP!j!J)AX zzp}HrY1!Ni46A0#F)9u5a=2Z7|A;e4DMt8)Cr4I#H>F}wAB~P5Lei7HoI7#bwA=V? z+qTJZ@>{f9_$^zu$Z?8~_A&oj0zdhLoAwE}>=TTn%Rl+#6B6-#`?zWQxEW*|Rt|ND zM~j~jYDONP4=urPC;c!DCO#*Jo0h{Z%i(i!l2%|C zMz7?)dzbT5u~)GFtorB9p6~QHTeHe4!i~uohibI0y6o4UpUY0_Xz$%FQ%Hfa7%Y z6cOV%-E`D~D{#8`gUHo(o+QzOF!{Yve!S2<17^(K>N7f;FavqLT|tTl3d)8%WlT0$ z#x`%>%o{eli`4slwD`aKXt+5%7|4*DoV#W8PI39y3n^DvJXlI~q<9|T4ppWdT8a*o zlnU<1p~?#L?4@ZhR}PifRKsvi=GK%Jd@`j#TPn)?p$Fb(>N|O}4HN=j6Ry^7#r;-( zt9AA1;c>#@!}DyA^dH0WWBy|~I>_!J{qQUqym!Ad=xA785FHt(n|1HWufgYo zg%_DT$dYLW%=%eVnpQ$I;F`O6cu%?}y2TX9uOZ6+ALW+2sWT|-rmrdG^GhozuB?1s z8CR?=ot}?55Cw(v3b?$qeDs(X^S>z`{*MVlI4C#I&v5ewzkD;L9lFyFKHE&)l@{(& z3_3thxkm_ufrsz4yDQnkvWMB>y&<6rS&?y{<}@OJha{r0p*&KTuOc=IpuO@Z}A<4eqhR zunM#pMvobrR&lWMPz{-v=YGLcix=FZquNUH!b4-y4jn%7>D?D(VR+#)a`2zw1ro;5 zW5-Y61+PIL7!=phx(&I7r4?y-BX3`Bj@$Au%Kd|*$Dp0-wtMz7xna=dvo#ch)lDG- z64j5yMPv2evVm0tuMfOCK$7~mflSQNKQwT1z~DAt7-${1IxsN6+LZ43kb|V~_wQr8 znQP;WK9KLDwf<8ugQJ@CVfzr14vp*MLxuoD!kW*94Ct>}b9l(W8J4a&IAlm$Q+h32 z9BpI7NE<_mNw`^JgHjN-EDL1{g^K)(uaZaN>o!{aGwu|o^+PU<%+OQ#BEWGD@#QdX z41>Px!TggwVeWsi)$Pj__|kpbm)kDj%k8HWzr2uNQc%b*FW{FH77Uv35T;LH`UG~L z44Uwej4b5cbHT%X{1PZ3!!K0Wu3bFF5!c1m$=H{Zq zbw;is7tVLrxQBSjl%BK=e-WQS((hc{)6M==$h}?2y-`@m>2bb^^DUekaK4T6PlaBE z>@U1AvWK$p#X`(!Yfjtnq4;MK+|Y#t2M_;waPDybNpyY^SXv>nDA%2j@_>=qycF|? zDUx4D4;?*@^UzUJxT%_xVJEq{RmXK}s@%4Pd4ro`=xk#6%vxV-~Ht@ z5podm^zY-}6!?Ehfk_nAKKJdMK`*_O6cy-=y|V&|83t@wOa91lLhUX5c$D0w1yH=%t0+mF%OY4u*4EeG|c3BRYdv5;u z`kycFHEO9jhZ$fxrm=O#q^TJNuZMN_jqG7*Buz-N6@Z&vSn zw>rDNw$AMCvn`W<;=l1B?So#5sjSoXa^Irf>^?R1Uw>n$Y}}K$#@&wVND6pqX)01? z{Ub%iVHIjS);Vp$YQhRBpJJJ5>_6CRj6{{W{^H29u>(i?T)k@Qy}z-PtM^FX{d}cv z(^WQ_M&5o`Pf>nWy2IGkaplj~ya(PGXzzKq_d)5`KIyK_wo9&CE}7>JZUXm}hd1^1 z3Woa1V*+=-+#2$ggm`-9;~OX{p=+$w$Fix1>MOFvQE#!U9PND_Ccm57o(s%wpEs0y zyg&1eQh8IGS29$T>NDTFzK*%W14F*fnnip)_6bFezjmnenp3X$wO0luI8IZCsUk;< zLrJ?RGu6hcwOdDDl|Lg#-mGG%XXIDqcYU4o6JK9@4Qw_YL{CejsA^m(IyyQ4cQOrS zW+^^+;zU1J_W)I9k9Tz06t*B+xNVQ^3HwO1%B6DUIrE(70G&(c8U+YW0V|J;&eN{b zu5YDpB^|A!Uj!~v7pW?#N~(3%Iu|+?Ixt_!aoTy>dBJhPaT>?~!U3{Yn5-pj0mvG& zQdg;~)7j~a06c*!09jYM4H5+&-#Op;BJedp;^zlg z9acvwuo@uiiNjst?lipRc*`*lAbVUqXnWB1Jg^Q}4m=CYwa>K=09n9Pz`d4uVD$jm zuj2OrS?5&OSJ&6w+uhsL)6{d|)`45^b-&kb>9TZ<>K@hY4a5S+fneaJu9vzLfDR}I zu3N8L_gVH?CX18trM`{k>*95>$=YQ70(cFm?5gaF>yGQzc4@mPD`gD_-UP55wJWAO zru(s5kKG#IGrnhj@BH3beY5)B0{nojy<2-7J&vAHz~x()Zw2=T_nz)K-IEE__SW|P zqwgPm)B30NKMW8zFZaIO`#kU;{r}Pby6tsaInat0#*4NWZC?Z90b-tPpKR{~N&&JD z$xYi$_dX4O8~EG6e%pSVkKG45iKy%!0g;YKM=S87>qply>6p|Bgis;W9%+wc1J(eM zu1J?J@D)JT82>k*ku=gn)I*dP{ub~7$a=}Y z0c36QLf}Jytcg9~dBAg>e4Tu)*IF;=dR~dZpX7g%zwGt07ugHL$IHhH%Q)o@Plx9W z`3(8{z(HU%Fb60C$a>vBdi~Lh^X9xmfikZ$FKj6x@A2&Md=)qk6au+iF4qQxdWL$w z3yhPGlP>{KqCMAgYq>vo{sFsgtny3%HUQ^l$W{^9Wtk5_;=}2QY=5!hXSgfmPpIm>RZ*orJaD?Xq^+Y#@itaj$oL zl6{gTYlpk(Zn}@^bFTv~qzbY7!k5_Pm}Wj?Kg3G$a`tiNab_AljrIq~J{7lshvw;I(E9pbhA!&(giK`6wM*2pIpd;uB%mgM3Fk}CTWG0!}43PavUI1!~!<}VDog_-x+_u0<@vPr;AfUM_L0&mc7U}fvu zbR-kW{0$&$b&mqXkDKgGHVtc~x3Sw;vM&l*gG$yU&jrYOXtK65oC$ZYId(7(#*_7A z$+}~*UYM*&CTmRFfko^htZb&(P@n?P$TYGYz)XOwe|?d8k@*_v1m*%efREXa*&~3J zu`-(gvi7x(uA~1z{ejwqdUPy6*6ow^!sHX5q+DKeT|>Qh%XJP&ai%!QUK25n7{^KH zN#|p($6U`lpLaGo8r`z|;U>LX$J>8TLVs2R+^bZpdz67oRX0 z4K%S$Y%1_3K-Oaa+T+(Avw;Fxf$UxOUG`<>Wo9a%WR>999QF~}BeG(EtS?sp#E(|2 z58nh#kWG+{_89F^A**o9D8ffSus^u%wqv#T{|3GTNLe9qBY8>k?h)WQARZuVlFtKY z06*4`y#f49_BYu zKJW&xz_!5l`M~D`rM6PrW&36O z1t1N03|MMgYTGcdVcA5 z@6XDx{bvyLS$yn;*xo+0Z%a~j)$ONu8UpU8C-3((?$G_7RztmV`+LU+n1&9D@}$Xu z5Xa*+dzagSM2q}JJSDFUJ|#9O?^zd+D>+R3PcdfHm=9-;n)xBQ{?yjQ581!-;5$pk zEE@C8{mz+-X5RPt(7VKb+k@MdkZ}G_PZB=y=l}F1;SZ&ST>sUxL>@7hq-Q9tX`}w* ze}J?_Lo|r+Es=wow`pzSUmNwuU&PvP)-57#NL+8bza74br+n#O#JW*#_wKwYk>49W zG5->7yLX3A=#RME3ICVe68qud6Z#KNKe0dHb>Q(huXwNc$H|%CMV=+N@8cdH=Kg2H z|J>{I$DjVoY_H#X{r2(SdM$RlU;H?^f7)=;|DT6X!X6CYC7-Syi8!zFyYAiLZ+&p< zJ?ST5lXJe;{oK!g{A9+x;paSA0VWGb||5bNPUY$=;f5-jLhEMz)?*48n z?s4zV|NDji&(c3Kd}1D+|3m42`o8IZ`tgzUzwQ1G|C6u@PYuuisp_fohw^_U{qGk( z;i>uVydRnWKczn@uOs=7_<0xD4{Od{6S*7C|D?PQPyfAd64TGRchjGg*Z-UF2W9i! z@^@GMq%9hZ%iZvY?A9*2TmFe08Xo>#`SaSMO%HB*a47!dez+ZRGbAgAr~j_}q2^{j zn0d!NxgTyv+ziRUyW!uzuKBt8hlJ0mJ=J%^zw76a-@kNyRQ(unf2Xb+O4Gk`{l5vH z#BbAse*twzo_9IvUb~^^FQ>ejvK(d4#AiOZ3)CHX4!-wS`Cn7+wHtgs=sHo(kK+G7 z_TD|dsVeIq-nq~ONSi<@q!5|_6^axZXoUc2PXtC81q%v_iV!YS>I~2d2t`6pxOjVp z5xk5815)OqqN7s9M{&3`P^36Alu;fBMQxxA?F^R&iZrEZ&hNX<&S^r$ah&J#zVpY^ zy_<8+zVE%(+H0-7_CBX6G~X1OR%HG^8-H7T(0o&Px*`X^5AN~lZQK8$x3z<{8%n+>q7WUmvgN3GS)aw|~K~G-c5*V_HCQbRNI1kIlbWD(M2( zw@>AlPK{{+Y@$LjvH2HErMyFsL&3iV+>D-;GT(RSd50uM%VSReJLPZO{+xk}2Nn#x zu@0d0OX=&4+V^LSeJ$}}(gRv`07wNcgW}778~%L!ynI_Z?&_$>BC3Phy%GE=?Z)LN z|G2F#@_p?q^55B|_iLmBaCsinMgH~n69+oGDCJ|aP#FjD!Fc@pGxles4ZPm(FZ35u z`_vDGZsN*chyP<4f5})mQ1PCJBYMxkzZ4#m%Tqs4gG@JZ<*#c$kZ~&G6Zqp9xdU?_ z{^`KS29ACBRAHcy>xD60kY-X$rp4$lm~p8PKI34<=z*gjK8Pps!9uPVPHxpD`D`i% zd48C$uStjuYqE`kNQCEf13xgiLti1PNVSafAt<~`-kfvR5sQQr@z!*+Zp}&XpWA%6I=jdtfy7af|f9Q|eo~{3lp62c({bYRn z`G@_e?QMWA&0V*Cmi~wSsBHx|WiZG8&>yv}_!$0w_|wtCKNtRQ=oRY04waYN zCwWBW6azQ9lFQ%JWm%VHlW%HmpXAYZly9Bqw{*$wl0EqrNbJ}3 z%Cpiw$s?t0F4KlgY}>w)PCS^~CSo=tMGo>jLne|vs_pm{SwlRS+a_W*1CoQr1xX8j zw%~O=)lcP#uPN{)eT3>JiAilMGDu0Mw7v`aELcJ1qjHA$nle6;hm?oDB6`WIfg%*_dDej&HOBU>q`@~y! zr_h=q*1m#s%B#?Vl1_2S3+`U<7Ve5~3x5UYl&(C-w=YbbJ#p_-ibm3kzgGHF>Q(52 z!bK=p$NQ zPA9(c9pzicui%`@DYT%BpZErqkLN#%E~>~`1?N;=p#=s0#5bsXJpXy54gD)Pr}7Fd zDDCsHT+e@0ZRlUYIptNJmG&tvPJfW~Z;D$zevGU^ENG(}m=Zfjy=kJ77F*|X{g=u= zH~#MNV^Kp}y&%54l14II;kn9ue_j9E@%Nw)ZS{iq@=6-XaE0cS`Tn~8o$+(fhqih_ ze0e2}s5V-@b^J7j-;AFeB?alH&4Z$aVuFe9lZQK5LmXEHJ+S+G+X#0fgm<5JSr1J4R|NGm&-aZq*r$BK3 z&hk;(p!SJo6dzCjgzxVx-#Y&5%g56{wV#ogN`B&Xzlj;G@Ne6G9R0TPbOpCJx)ZJP zzW;1+(qQA@xbm$s<)6(1qE%jg#o#`J`^K05m)eibyQ0BU20t8M{$FZ8R$d%Dcd$k- zA3y(S%w*SA*2VG9l*Va==KYTGO9tN~mye%+GI;XG)8~|E=+N4^AGe^oQ!^ zI`4Pu+>|F)e(&Mgi9%vLtO@_|;Tt{2%D=9+C-zFDI+dT&e*Bo@pRaG9>uierp|+Iv z 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

jwiJ_F%M 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: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 z zPuJdekZ+`KyFTqcj|?9a-u~h6=!aeH03ANaccky%`n=ia&Cmb#`A7$Ty?@tzS35wD zXL-OvSv{rhgFYX84lCuHhF|aBb>Gzv(Bm0AEB}= znS~Xu+8FT7YWem4UH4t>fQIye%-R;h-NKE)pUUc|H}3^$8?5I@tbS`Lk6LC*uV8u4rsy=<=dHv{_ja!@4-@Oo|xzdHUg{n->| z8e$qM{$386JTm-cZOS54`c>OgwPGDPyz@W~x~=GdR_Q;{<^iG*9{yZo{12hwq5Tlx_4d^WzY7fy8;7ct0G|1*4^ZuQhF8U{ zhQJ4PKFl!=!8ldb3{GWmz_XamPV*jFrugIW^I0AZ;~itTs?j#%*YK6@VbnTGQFeapq9NJp3TSoEy6E`1MjYa6s>WW{Y2lv&DB*Zs|1aegMDTk{jUl{wLHF z8p6u1)jO;2k5F%}_*p3%#!@U7z5j_3W5j4N%xT`?AI|WO@;?Z#_do2(q|i6iTC1Ob z{V(w6wbASn2fP!0%)d6kKN5dl8_h0>5~IW!p%G5y$NX;tyrcdfq+jR%d#3l)IX<=h z>GQu0@Q=i=^Pi1l*gRVU{~wOuwf*b-XX6+)&-VNHU7_>Z==^8n7|i{NzmK2Q{b{Yu z)nB!KoQ-?fJlpT%Z!9}ZepsK(`fXApI_P zs{JszaAsj+`$5xpuI1KX_4-#s4BlbCINKi&=(~E}<+ai4U+u#IAJaVMP3Bbi2rX8p zlFbjgI=%isYw}r>=qA$v|2kaEo72OhU;7Mh+H1(e0mbGA^?Tjd>)(O5xegB+R7#$8 zf`72?^<47WXmAX-vqL!=!8fFLy^C24s++}xIiHC6>Cy1o{Fgpw!|=!a>vi7-7xN?I z!=vDJdquZ9H2kmo4pZmzhK0ZG8x!_u{I1Z7T7HIKuTQ`~62A_u*?$@ZI)1%AAB|s! z)+u+uJIX)FceL;5@JWpRhvI)2G_xIa{7(FPNckTItyxhT|6_iP`B%f~%Kt}0Lw->I z54y(n|DgTLa1V%J{dUaan4jR-)%k2BKd$z#2JIig^bTu3tOfN}TVQWT>-p@p7oFs{ zF@9$E4~PJCD1&#j)QGXoA{Iw19?M1_4bIW(8sk5o;DFZP9rL*rB7?6G^?68V{o;y0 zz=3;n=>AZhw>rEg73UIkd1UR4;cuAtJfEP!Zw`GY^b1kXyD|Lv`u<&oS1oK^?#{Pi z@S8)2h7Jh{3(?Ew0-vDk7ahM2&Bi?p{+-ZKfSxSsV~fV{tcDuiv+6Wzd1&}2gpLmx z{_P}@jp3La>+rfgtoQGa!apr^YRGUCgV&ts+swCFxL9xDKAQjM)bdXV4G9@zno$q$ zx4O;hHs}1#>G`?xUoSr^87u#^(2*g7k%OMz&$o?ln{dB+{JK71&l}3GjX4?o+R$+! zZ-opB(cwG$cJb{J-nkzB;r!ReoD6AtOT^&uC!d za&0W#Ft%r~&hfg8G>mz>s%?+apwqAW%qDOi>$7-Q{47qVL5HjNS?j}dXZIj}_OxpR zvmIW1;<0A&fh z^o#QNg9DQ2bp&OqIDpFi4h}dtpgf-D(@5-S^kzd|GwB|BhSG0TcLD&Kb0nw_&IEqu zw4+uF=s`r*Qpxe`phEp9dU_N=Hy5nB^lO zo#T0n>GM< zY(Ri}{pMb5Uk3xWg77i~xCeU$vz_M(hB<$j)m7bL!dF!P|kma9W`*H2ZHQnmERe32Kf}o(m zT{lzj*hQbM>V4wC_a&tt*XnueJ|)E+YM;&d>tBk0*^~9zpR9Vk?$;ATYTc{6svPpC zKh38grZ1TFEbSJ%Fm@qiK@X~O;6;N;*np8e-gz-Jcwq1c{;`AvlUOm<6ieU+#zw{l zy9Z;>!2oPI=ngsHNHC5799~}T?gj(LA-gA$6_bG;tl(O(fd^_)t5g}NRVAG<)#-4r zb+27G1vSJPj3;g5^ay;HX>Afcfjmy2s;AI=X--2hwm#|i*g$O#8ocw<(oiWBnKS)K^aw5qstJ*zFTT-Ya;cq{2qw&0@a?>4<)QZ)j}W`EE9Sy zSmu8=c>WuC?$WFKCS2$r%jeVC)IvklYWso?jt#VbHRG!pb3X?Upe(TaR(*xCAf=lw zjoG_w#y>w>@yW8u%O?NaNq^25W}rq|b)x1()uJlWoA_b7I8TxfBG|!d$qNT-{Q=g1 z>#8e%Nc*2p3+$7nZqz+kt>xJc`K+S7)f|L6gJh7rZU>YHTxWS{_?`4yy+Fl!#WID^ zAYW<(*ifqy#4abGt6h)2bQ-+{cNT6Z-D#&a*nZ4POW+Q`K|J6jgM%$oT*1*Iy&{u1 zWsdYst$ST?zRn-!v-W9_0!m}QXlVahd;s(-J7OtBU^Y%%g9iq*Z6e^7vY>hmCSE5j zc4M`8HLmWc{R*v8ZZmj-I%KVwDQ-2WMXFb)TlEoC(|};VfF`>BWKjKreFJp;8Jr)s zf8^G8c7z@nc%a>-fKmo8Qd51lu}QJ38|haU{ZbNqaloFLFV=Ode*b#xi3j^1eIFi8 ziwEmLhZZN;W-)-oI_XC=@c=Hifj=rCDz9*Ph<*(4Qk{DMbA|xUB^Y3?6{YLc8?q<} zPdxGT(@cvHY;;vc>WCfA9AF8)PEEB{RgsZ9cXsYvs_x6^4t^;QUDZ=sF?*AlU}sX~!m1NhbrbG--S?^! z8W^D6QBo(=c_xkbs(Pa;DH8hM<C;bGm}o#KR2)njVv{6n2-ZwCNxesAbRSXFRAPUx$4i_T|vz54Zg7{ou_> zCHXx_57I|%%UT-AQ0KmPaQ71(&u)Fo{rYBX+NvFlLrgDkwpy*%ulML-HhXz}|9#O3 z78ii+Ag?2Dwgc-4?Ec>Wkmv2E{Hm*2HR|xCL{ddHsr0Z^Hf#EUt|hO3R`FYn`rjEX z&1^LXsB{`o5=(;*Xa~zZm~|2kCox@ThsKk&qZU{tIK|<{j@@-&N^B{#vlk>+!q0m1 zQG5DfAQL8Rtv1(s;W=v=y@Qif?&{C;NoZ(NQt#j@JSEhfic&TBmajjCEVb`2Xz-jl zg9m^8O)XL+P==ei>5epiT>pP0AF2ejJu&6`>DGtTe{D^*^?J#(B_-Fb)irg$sXvyh zCl4~vS9-EG`={da)#)3zR^E=s&qcKZo8PK8{+Igii;1z@YicOHaN)oK##t4k_s#K<1)9 zf(a(o)C2@D95-%gdDnuAngm&`b#-NBLtiaA@#Bd#Nh=bo$Wf9=b`lF*B>8}RTN6wN zAD%PEVCd0f!pB7?7}5REt{9J*e0@B<=yt!ub?y}{kM`L!GpuMfOHhAUNOg63dgsm^ zJC>GKRWV)QrMBu4NRifxN=mHOUcFkkZrYSL7~M@?nr4ve^S9Z0_Wb3S`1sEK^3ll- zKnHn(SRvhq9XN8Uqbg21j)^z6+!l$yDxXY71JEBz2LH0nIWP9^)#qPJTVJyY3~V5H zmygmhP4dR^30M2uWuywW#7>{}xkYWYEESW}+2oC)H;UFzxX_O^?GsfWPiK5#?V9OR z1DQkC%si|+^t;;GMBkXq8kAH%BtK%9jS;@9?ZI0BMH7 z+K{1omyp=E-_#ku)#TSMzTKgGV1B8}7wA1z{{)j)jz(2(m5Odh#_l|Dp(J;IZ^%45 zW+PoGwiI<&d&-;x0XRDK{RRKIVh4LxO1?)PRj^{*X*1botE~;}*D^qRju8jkVWj!n z?LYsz<@Tq4e-GB^L3BW#s9%2)uhtDqI~EGrJy@LSTNiX^{FSM98Qy%s(oa0|68Cac1s%ZwQsAfj@3zEzI%Sw7bd*zMeZyf&uG;4=hZ37=qXD*<$ z-0$Lm^a&@1&q3aEQ1h%EvJ`!#gjqjggjy|9;$GWVasW4YV5k@Mlls(sdgtk@?$@*j ztbAT5haZWJWqMVs|1o3w_jl!gtzBxPcv97l3qBZ}?t+_K^$o0~W@O6H$L3#Ob-f>JMXcRBAHc^c1_eXW>t@!Hm`-s%j_v!~$d*Cx z&$@^WE?GiC=9A;7{rbZ}Fq8c%ubdOk^fL{>DekpiRRN^|r79h>ou4bvGWo%Jo3eV_ zjlua1&%IDmY`R_&d>}TKX;FpNDrI$g`(cCsgV3)vrhw9qr;oh&&s%R#TfhD4eP-W$ zLE54fd`k-8807EiU-EbIV&IGA)m61;p#z?La=r>BLOz%#tR;fdgHE&_{r>Rbw|@Tk z`T$k`d&AoA2gmdfti@`fZrXP*{o8z<)nEht+8vA29JnXBvre*+178lte#6FwaF`)z z{FKQwxK{@2zufCKGsRt>Ynl0#4>*V?578f(@c?4kaLre%|N44!+)!qJ=O4(AolQBG zx9hREYISYPI{~2FzpUTkT6Z?a5s^r>XCX^xufO}T?#v&1|J92uY~*InsrI_!cfb%`c;+H0j zlLYlgH-x;5o>}X^FsI^8+rkZmn@wjk`kfDzuK_T|z{YyGjB4JZ#j9Q%!Gpar`= zCv?C;r)c2>4{XnZfru9~#jW8V@Kq6*w z1KfLiP4O@5{e6{JX@I7`zi{a9U_zA_dj98^q{MFh4l2CdLMEh$RD#F(C?wP6mJ^L# z0P=KpJ7RalW=3uJENjW(} zzC#+#z41m(&2KaA_WPmR-6wCDKU;VJlHm^87onYg4_T6=>gwYsf(8`UJ$v0hU?%vZ zX$AqUvlM!&%In6HGv~z4?tdtt)T_!Ml{(tBW_?rg&(NRyeZ1;Geo1N3?a6;1Kf~fw zdCdNBVJCIvKc!adi4#dliXur&*SJ34)hL615!bK^<8*OCuimou%koq>*3-D=uGt?< zhceseVJW_c<-X-W^8oLFZkCc#t$pW%2c>EadXd`@ov-C%wu0KbqTOA4uJ!&*`&N+_ zw>#bJap%Rm{&jxky}vIFXa?!=18=qVAAtIgOw!!I1FWB8bsy|-tRK4Pb=#}XJ$Lx8 zZO--o?7)uLe6{aq(#Kkvfv{RnnQ$^_;_5#C_P^|Po7K86`4?L0WsFcIGUJ=)&h$GR zP}=6QSCxD1gY|b?IV^cq^*>Z&DrsBmUK*hBkAsW^sGR@*vG*?EQB_yp_?}BLLl`mx zi7>#B86ZNm0RjXVU@~WbR8SF8#fpj~Tm)K?M7aeS<_wotup&^k7Ag{2Z)mkpwTg0? zks!fJ3AMJOTrwfZ&;rRofK13__V-)+%t->ZweR;m|Nr}Z&*xsrnX}G5`?mI4Yp=cb zKIbs5j7*9bqs5OQ;%IzsLwa#~BmLXj2V@`K*aH<6_4RMRee76O)w}P~90FDu5wT-}_yISr-Z(z=qmlHPC= zrUA%%ML>D@mdA8wyIeA#?(xTwif20tt_ksdd=+mfz4OqjRpSp0=7uQgAq~7|OOXdv z#w^qkX9EXLpMF^6RA-@|!0ke4iu3f32o$o2TO6@JF5ME*^BwPi|lQ)@x&ob8KY zzn-@Lj>82fJ;yyk?uU0SL%8I6qNZ<8ebM{=l0EZJ4u5pZuu6MKY5zFB8~)2W80CLh z*RAh``bA3~oWj|Man1_i1T~;-TX_@~C7Oc-zU6zy_^=W}=PtB*WulIh*QQN@z?n0n z5x^n1dlqQYmG1#?@Cf6jnZrAFPwTGxLE0mOKfC9%duGT(rF6UAu9x(3CKgS~k8OFu zJz~(1!MTHT2MsZ$Wb$eFgv7xFTttpa{~;?u0;T@ce?)2q|LEa?f9_wMQSM&(#4i_Y zp97UD;uzP14no|(6BYa-+H(;fA5de}-}NOg&iws^Q}zSWQ%d@lJCyYIpL}YUQ& zewFdAcXcUe4)7&`1NV`aSy`_#iwTbKwcjSXa4srCKlYCXq)f(QMr1ms{iLObHuD{ko{x)tGDTg!X# zZn$gV3lG2c+4x^tx90>Lyr_A)5!{`_i_lB?LJJh`oVe|mlj};ViU?ku>4p!(%S*AC zu>jINi(g5p?S9Pt&VpBGoYB-zy3#oXbsC6ImJ~wE{hiO@+Y1&SJ?6cu|EmWce)5w( zug)sq*C4fj!|`kWE7aiCC8sxDdTVK}yPdtgS=Y6T7Ti!kG#%%FyWLEkG1dXkr!jw^Ahx-Jygn)5?mD z&HQBQuV;ughEIm%ZIM0s%i)w7k?~}K`bkB#g z-=FvU;+?a%mwZsFa+X@Y($9?1h(d{!>uS3hFR~Xp3j5s+c)Y`iB+OmqHXt$c+mHWs z#D$E7>&|WdptLF!*J#nUWblX^eo=VqcvU8dte?NCc+Hp2%A6|4EPNy&Rm8i|MkoK< zuq#9UI^@c|7jODn`eX!W<9G_-FnDt;MkmG}KJ)5p1poEgL-CiPL%Q(?0QeLHKZO!t zmYWBq_0#lE%j;}cRKMLMb&{BrE7`?`?&sgTv$5~BMf~|PeS3pJw9mmGL)|u%ktrME zM(O6i?U&P4tOXzmOi6(8~Is_4F+?)5_7}JVN{@H9wckf8o%Bv^n zs)ujnFN06VK$8tWFz=1a^P^pcSF~?v*b-mMp#R%LHY=c?n*d9myyFiOKa`Gg%`+u? zN($F7NXKw26PhsgJwX(#SoGo2Eg$+mdxDqvo*DFK8k>_5mn$j;rwq9lnl&+POcQrk z%SV)2X_d()aw&J^v0rVxGH`yUrcSjtSAEJb>drzsjnjBic z^@B!m1Oq5{1!!h%uJ^8rXR24|SBDl_!@1@6_|Nrf=p4W6#EdtGDwAXzbf*TR$6`KW zpnKqmf$=NxE2&BDh3Vj}8t>dd7}e-1vqJY4-|^&R_u_;C+@0VOvB zUcyIn;=E&Mz}1PT#{NThdBD{!O$2hV2@z`U>7m}C(hNwcIcSkv0Xo^zc)7e>+x^ree&3s)60s|aeWkQv^yc4#DC53 zD{(BX;V43~pdRhqQEE!gv!cQs+mGJ&*3(zNslOzn?`e-jn9oQ1O?>fl!}jN`^1V~| zRB_hu6|B;TT*n}_gKq!_=5Q}7^M{L~R=&Evgd3zFhfcBc)sPQGyD7cfj8({bbA@C^ zk1DP%JE!VS*VY)cLJhU`kkr8SMmC!v}%n=_ZKaeuz}*W97Z8tK>$QUv=G@>RIJ zN>jXC3U&{fA|B*PX-Nw7L@NxE4hye}RB?7-6=?tl>d=v49ATgWXT3(h{inPWT-#Kw z#Fz0-uNi-*bq^sJnd^IO*L#X)R*xm<|Fy;I0sf+`a!^*}kNV$^v;>&3#+v~h zQt`dY+Gpk|R~a}*;gY(XhHeYm@pAViu9@MW@-5I`TGU*_HzR%hrRp<-^1L(NdijgL zoT|PUA^KIr-kFbm7CoR1FI{Z7eD&)2^L2GqRRMUaP3SkWYl(s$(766m!=<`2fpv9f z8ZK2H4xgcT8!S*8eqA_nj3OsbHpl8C4Gp#7nD8O@MCr7x#fGx5GAlK}hq7#?t30DR z^&&}@0W%0ix}&0vmb&2wNKe>98P$ny7eB-+CwkQAq{_n3l$zZ&-twz2xshuSBWMj| zdnGt@leM;A?765x9shlh4B{+x{I6J5*tJ&ocKiGC&j!()jipF?5%%j&v=IXyC;e;F z-_FLca?Km?yHdeTZ7MP4E$>?Vw}3jIP=5t)`Q4w(Z`66dcXTr6AuRBlH*FfZMM?VmJxMjZU%#uU(8^bx3p|YS<0{YTAn=(6+P`~BA zwi=G|ZL8nDYkUfC#y7{xn=t;@SC)ngBUVs{`gc8`0%h&4k3;Gp@@x5)@atbz%s{+a zcPmD~y0WY0uYOs-ZqbxLiZAon&+L%iKH%M_P|I@6HFg*6p7Y+!H;P^^dU@I#MLUb^ zXjymst5CSTc*8v}x9xwj+tl7S^O1MjUNQg0a8|caw^K7kvv(EfO4?%$)Xs09i7O9F zInjzxdT@KNi$B}HGzZ+vpqnlDtmZxNPc<3KW*MUFKDLcr0UyA=pxSTa_rZ#%mdpyw z3M?ucS(&%meUCi6_${gz$He5J&zATPNV}! zKXPkbR+Xjd=T*<~3eu0%1Ek{|IBROUa^-iwyYr5VC>@Ai54kM_Q#6Uv^?cKo`Cjzz zeDv?cB70COh32US5WjO`@O7CxZ;RLe)1A7%O+g`FR;j?q%>J^_%13Byi9 z1@SkKkHMzXb_^?CiE@?N(vjkq%WD6t@oN81SsTmVeJEy%A<*!y+HGq3<)g>!agSzu zu-wDhXMX5JhMpNMerXQz(nDkRN)?7u{nPp;Th03?gp&p}pO4-l`TJ_}sbBBLx|FKF z+|bHx_1DC;6WdK_e^>j(ufTQUmpA6X`u;ukD_TK)(qG?2KmKf8X4SYdOTZE69q7x~ zE8{2m7YN{=kpqFUvhCYH_~5s@p4pS(^W$m}M%Gfu#%Q#JGfYy0hKMezi)vyT6SZ3s z97y|r>tU3Qa`&>`d;8w^Pn~+v8Ny?c@fA#lF z;7s6Z+0u!7`ff?9Y&To4@c(LXpfZBgWmT@(Zj{XphNZeq%MW=-@0Nf^X7LrGBrUyr=G##m}qt8w1;%Y&Fh;azI{Ryms!|;nDt?J=COTy zmiyqZhJ39=AJJm05B0}-ls1$av;}Q`r{77mX~qazBjm6Gx%t2+6R@%VKFpdsBxt3vAMc{v^xG0Z#M()BUX}m9vcM9<^O-8$~Z7y{g6p_WD+N*Lt`3X#F>c+?4V)tSmCAZn}u~ zdslhaVFIiKHD296;QrXVvUK%DGwm6mJqk)LjD@Xv`||dE9o`3ea#(C)OaLZ24%oxS(eCp!N#5*ysemkoQqAdxCtbo9RDEpL)?=Yp&Nd7jM`#vueSO9kTdf z^OKcBXYc&rC?Ah8cFm3PC+9DHd)eO}{kr(;y07`O{P`Q>vC4wo6HFUze&I&`U13AvyK#Uz2UhX};G^RV#eeot(=%-cE_{BP0ob`=P zxHz}|O4EF!vbKU3f~*-pR|1~0B94zh&-*#$ zKOB40mSSD+MfMf$iL(#ocjVv5`=yy>xs}$iIkCBfN>}z*_%$A_LvJw}EqaI6qw)K} zSG0S>$n;DLE-90@$Y<=2ub&T~Go@OzGV51PdAkM;pB%8l55k~%m5Z%M&gydNa?j2#pCKo(0ybf#ulV=U(Y&v_pRw24 zPbWji-I)5tS$}%G`6K>p)vU?|{1xBFH^%dxO+Rex!*2`Jf_DbS;SIVTHmUTp=bD{; z^L%+K~$tX)4`dQ2v(W*s!Hla+wC{FG7z(jTc8Z8gIy=C7Y!cG!Kr{?I^wknXrS zFE7uA;%3ZH^v6DY?z#rl*vuaLc};H>=07+8xk^^n0*d^>Qja>r#Z^-R(ZEhwp*!vG z42pV0wx8*`Vwqny)&JxLN0pWw9@l{(O8y=1s?s&}X<};ArZ$BdYi9qYIf1@R|$&Q{CXoHHhR`j_uOkk@wM|E83^)@`R2CfcCs@6SL7jHNl$%G z5)Sl+3f+K0V5-pjO_(y)!QNE+U*SN?>lXLgvcFY*R{2dhaxoT*$Aj2+?Am^^bmWV!~ z5G*_h+9^BhMDZ+W_D?)g7%c1=@CQ6HlWBjg1Kx(c0Aqp;KZBC)|5FUqf~?a zKO1pR5rFC;_6x+Lu}EW0czqT1AJLt5SK1(n=zbBfKRq64EDxJOUkXa!xKK|eUOoD2 zlz8?raH2VwUTb(CNbKje=aj`$#-CchgviJGXv zkJ5XxY1M=3ZK7=Q8qVh#Vt1T+53Otc`}%!X`;3x9T2ppY*};jY`(EsL*+eua+UKAb z4ns$oKks|COT(Hd)i4CBy{{NMmAX?cXfK31s8IW;-ED&dEvK0v%_?X{?jJ!V@vY;dy(?oe+dZxqcu?4T0`^}6~?b2L3tuRtzad4a56_aGMw_={#D1TM^& z2-JA>w+8j2&2N49ggPJAJ#5gv9PR#!{T^DV91KRQ)zrsUIzqpaR;E+oO1qA~qG+j_ zFZ~)YHxv6xL6;EXhz>*_W$&_tSXrc}wHSJ)jDXUShEVKN9qG3k_8Yc&)aDs}TaB%T zN~TLRdJyOZ{WZv$dML=XltJ5oo17Kn-}SC^V)X>YCDN(C=s}jwvW+fFI-AX2M}Z8s zkwqM>Y%=aXSo({_+va^f_0_zejeNB)waSS7bvscZ{Wag_-)8mvFG31kb1XA3rR z|FKufcL##2ORa6<>C}t)nQkTXmqu61Q8*05HSmQhVJ5THKG0o_U1&6tS4I@;N8Bb3 zErdfo{4!O>PF&RrBzUx)fhLt$9B56coVB@Ar1|g0o56D-@b}}sOjo{lMO;bm$L`s3 z=uhYZc<2pH<_7x(`#C#yqEft$bzuVp^ku#!a%liN_nUQjO|!n4c!=okQ8K|OnZrD? zM-GV+J`9xE4^NA4mSOa=xa)RBsQ3P3I2w*tMyf)7Q9FOjE$br{ zh?!klTv8PZ1hKv-g0lOTo*;vZh*Z~T9O3q=yP^LrD(kjLP)o*%6QWsLxG`Qxvo1CH zLBm_Rm)Q{y;d)&=!xUYerN*`cgI$o7c&wJGbMg-UiM5A%3bGx+vyt}?HW({&IwbUk zgB3V-dtRKWK40Tto}AE>NO5GMQl6fr=<~E+^|6OkTx&9nzyp7m6r6z4tVA=`}TTyap_n95`C4a2*V~Ny(P9^t4B__ZtF$9QUfR=2p>tg6) zNZG6aWa^ZW?Jjt{;PI`e z2=u7XKsI6Ez|_RnK3wQIaDqHgQZHCpCYxX?vjyBQ*?y6ZXD+NR*WN<=!T#Cb0H(4!k9>>U+RbRv8#Kgx+bspGH{`oLOD5@O4chqgUh8B_jw9sv1HWQS z!T#&BurG@k;c?BS4qlyP>0(maA1OXnP-1fF=-Dm`vVYB}piA&<}ulirhzma!clf&W0@L35NaR6sY$j5ePGa%(i;AdL}#iTCI?N2935gv^6xj zw6A2n?mY~M(uyJ|kq8v>FX;DgusU)#^etUbdj6M&?dB>w zd`x)Yoq)7rkq}#@*Bh=jU2Db;8QLpHKx@>r0*c)@;OusgkTg>#6Fqm4f$=dF{g;L_ z!cW<**sLm?DyHD#BKq2#+`YZaDv2pI1CBhw2M#5gq_gPg5tlXQ zR4x>OXS2Wu`b4~Vs?Q>I?AwBO6VD*!C2%M68ZWb`|ENQ`;AE39J2@)msWj^9bcTdP z!g{&^M~?;pp@hwF(O%y;{3zFE5SXKlj$5ho=ho&|eW0;1h@zLnzm>$ax zgws5*?VLxaBkiEr0<&gSRsHtqk3XJ1JvUc$;4BB9M80>Q(S-pHA&Yslyw17KEDHhf ztVv!1rwGbbI_5j+**oPb9lhQxrv>*jmcr~Q_SB&^;&p+i++@GWeyiJtU}Y|=-Q={} z^$M-6)=XD-dta%$dVvz4KW_*v7o051l8b!1=~MI_v`Jb#nnVvL*}xvDWJ(R|QhbX% z^og7&a$M7dN{ZCBId=ck&cnp|0DgF*D$KUgPr3GfB(4YJ&{ z2Qz1mbajy+@kGOHaF-0rSi;yvc;?a1T^Z+Xkywa4KS2~tnn-;*HON|Jk=|AT{eUO$ zsa{A*1|C!~6152=mn50Q1Aae)R!@MIWE0k~S%D6C{{`Vu+@t_ujFsYo5)_<{R^jgz zohdF_tv&?N+stI@-1!GTSom0Zxz9%)Ah1zJx|AZj;4B0c5u8kR=GbNQt`eNiv9ctM zZM}fYVAEDsC0qo$zm-1-LvAfW!5R4anqC*XrdRqOxE?-#`2Cd&Bo;>^0fGi0w$pPsXRyhnnztcTD2^^lFug{jH6)ok*-Z(a*Jwx@sb`b~!Qj?V zNyG`tg8>i}>7$+q26aN42vr0wlp#zSc^T{|8S^>D`{8*G@&T&=^D^j z(phE=IJr~SvJ8{mXlIyf)B3wcE@cNjXN!1IqqP~!>2VJ$&52r~wApMQ&F4@djL+6P za;Ih~`Wel`0G;d0@>vt|jXrVYTDloiVf!S4)9BKZ{2(Z2XkuTeY{Kz`+`DjVc=X2qLiFJlv z*RqGT&lZ(99N@={43kN#ojv=~r4qUTL6!yO$zv^eIKw8F@xzq&UNiG znwUp#(Dp)0+L1OgnLHkYp%?IW0@rGp#bVRX44yi5$pU`YYJu8j&IEdib9_QBg>)mN&_FN#g-@Mx!@&5Xb~{ z2LB;={dM%X@E-!Fhkye3S5`@}#^k!_Zk~WG;X~af?3O|ABN9P|eIqmu#nagzt_%0i@c!|@Q^1Qy%$8qox*}u0)_si4dN91+! z={|;QHPagwf%~kvmRxWUrF@F}VBcf|=vmnDIjvgGV##tYNQ{l7>d0tHBEt#nV%GM+ zc&*ivWu^s?4x$FC613m_V$)a^9}*1^y%H3NcAsZ*i*&E|{@ zYlg*6mdaVAJQB*v$u)XGpGc%sj3G{^$))#_ex+yD>A6+KX4UIcQafd&q^6{Hw37{= z0XA~u-;Vzb6rYjNQ|j;TDfO`TlrnIke~S#rI0xSUNAkS_ekAwDg;{LVtZHB5tVSFk zcLATJ^e-KKpdUSnMyv{Er^YdZ!EToj)VF+*vL;rgH3JHvkTNrgMnlR4Tq7>Ecj%rn zyer)ST-O2m{3d%Ji8$n0tQAB&(H%Q2USc6!@EqC^85cbmT@~9idebcU_D3Jf+~gZg z3J0u2lg&(c+|aeI7!Gl?ke=!{vt+h5Hr=-_zEJLz(J7-H-WlU#i(E+HD<2)6MGA{X z&OMl_?%|vGXk5s$%(c8}shtF{Jd47Gc*Q>g#N*H6!k~;<&TwhC(`j9os>m1w9x8bFH~nmt~Mm`M03{ z6x?p*U$OsC=>K+b*+zDET5TqEudT5X+E+b5-B5{2NvIFk;mHCc%!^O+vIR-FF0 zro*U3sT}|%s5vFj>wk(IldajdVdn119g@VDN*>H~%s`XW61uk^rVs4$u8!W7@E4>( zR$O>WdmnO2P3@89?&Bzrop?}6Dx!>7*JMHa&V`2zjy!MeUGn;*?=S6 ze!xDqPBGwM{%Ew!kd&e|>APQFwRTVshTUsgmke`AU*ym@A_7pFuW0S|euLdTeWM>X%kpd_sJ^Z`0o7w3SI0VU!B zT4w@{iKI^Fc<=j%Upsj??uFKb{J^w3jCGwjeu1iC%$TrdEL3P(%LVj;SOeAT6}I;K zLq(VKYpMQ9@I#;Mr&A9MdFoKDa{UIBI#Maj3x~1j*ET3yzI^m7*8`cZOqc6{(X*B> zUk<-ASsY|-j3)Ps7AFo-3PW@KH=s;w))@45Yu}stCuOv^wYO2NlaVMHK<~(T*Zauk zi(5X3-igP%s~nsy0M)iY7cPJgg0jt&Zg$(dNsbXWE3q4i$)7qC6ewt{ zzNJOMt=8P^g!@2Tu!4V7YfdY5cc)9YE;Q$KaT;vQkcQUV*%0JmWqRE0IlZ;?pzEM( z$N00hkduXiQ2$xTe_Wzlz+1=3h9BZ+Gwxm!+fW*T zfkeTG)Egm57KRiCgQ>l%gHP8VNktkxTHYULiLl>OYdYy4?=LFafx;2?kILF#8P~4Y=-xY$kljrU@ zJcq=^Lj3Dwb6`)Dw&XN&q<3Qd=DHol3kv5I&STh>G!aGZ0Ef*ZA4yKmc<&0|8~hXb zDfb=exjAe+a(#n+f_D(yAy&X)DPsoEOQY9y&<#%b8`Sk5LOrPd26#4q6FeGv<)~UL zF;oa15C)5+peSn~Y~}9O9$i-g2MmN1Sh0HoD42s;JZoS1I&!`wwyng1c3Ide_D6Oa zT$ICt{;fgAdgYr_wPOojHhL&uhL)#d$Msf}4TCS8Wlbt_WI!OauisyjOltB@HAAv0#HyH|1_*q zhYmWuuDd=7B@stPsj@x`A#y89f;5BfvA54muc$6)m8ET|w~+ zX?w=}y~~sFl2X#ZacIXe@KMGSQWy$tEIqyXfmsjC>Nl8Dgm8T`?B-d>V@Juhqm$;| zI+Wn1?l*NWLHp-|I|#Z1Z0QT;K7W4B#nCKdn?l3 z0XYSOc~}l)JRP2;WK$=iZjRtDlAliKi4upuU}jMU>t#z@kaQdMdV%OU8#EM9v@x4a zH~p;Sy;9>kJ#`3z39T=MeM6|8-I4!F$m0>3Kq$?8PzET9G_tvqZd-QivPY$KsaxOV zu1uQ`t&)dPtTWS!oPIU*_}uhp=H+eC$!BNcN@vhF0^M^KBM1eZR&N-Y_es-;1N&Xh zXfOyv3hA5J0kk~|KCz$;BeI;g=A=aK_+s7^$^xys71rY&;PaWxm;dG$I}bctJL13t zv+`l#!|Qvntencsju>4V-ifl5G;Td!UV@5`2ckUI?T z{~3S*wHG$~OVDq$(+jB0l4X63c86LYh9-2{Q2J|F-CT(g4k)~}o{}TcIq~UxbE;D1 zc4b+h?h)v=K3F5C8IRFwDcKNR6Q5dlX9JUqipeV50sfi*?a&+dS)3)Mjz~e&5}#6> za-Xg)2c;H?lEUN7Tz=u=r}``3d%QEK zatJ*-8B`8Z>&A4QmX(t;uzk9YHZ(zQrlAG{QFnndy>_N{bN=%tHN6)7mJjNv>5&CE zz(YUi?QaiQT~X$+$;%Xxg?4tc;gGN)A_3W)!jDt5H>Bi1S2m+1Zz=IN_{T^_6zfO1 z8%IpbQL#+0Y$7P!MH;M>ZOI8ZW?P3R_Z4xIQPxG!uq*gq38YWWnzRmmyY`0tu2=}E z;Hy5MF9ko^7h*?>&gPsgQScz);L)?N!b|-dt0&B#zN~v*hg3ZVWIwCM4xwe>QgVQk z#`Jnh#+UCH{cC-VejlaxV2t0vevLgE`@l&>(h+&Pyg~kDDFJZwOaQw~HVWv%tcIQ$ zH>G4Gbx&!pT@6nJnY%ZEOK-whU_ee=(4OqiE$3bPj_Mcfp!|=3|7~m#Y|z8dg8x3f z2lWjyXV4TGbm;3u`XD&K2>GJ)mbAV<=<4g!G?5QEdCSz>-?xA!53qO9pFakVzRo;b zbD{_Hau56Cmq&EIuvXrRv|YhrYf=7b)XZgY(_3LtQ?k5iHr!2&y9x$v9r6aFej0It zLfW#xS!Bj381=>V{xKa=+mZJ?HU;!4Vva=?3Er|r4}^W?u35~L3C^%VI%h#gW}>_b z)O1VEUdO}T)c!93eJ?>emHzLU(bL}3ZZTWT?UIQfXlB<_jNP!hfNzV8+p#TjBxDIW zfaE>=2_*+Q*&z7Qe&N%i?jS7loi1 z`~b2IoTz;wXtgHnZzeaa2wLP2#6O{TXol(gk>4;8%ovk~pbRx!4E`?18j4!Zdw%N3 zMy`0C40`b_+l{qX7x4cm{pst|$J(TCcXj($uU0)|rQT4&$pFaO=?dfhiypGUrb^=`EXHTMzrJwis^h(Pz}BZn{XNR{wk8Af({q?g?L@6#esxFi8LvwLyh z3s{6_$f21@L3=2G4PLZAneblFuDige&!F^VO$V*rDA{Cdz*04tdZ+_{&Dkd%Q{QAO8!cn;SpB_brY` z5le+W-GcI`s?|yS8vZ3-!Y1dOcb?g)-az9!mGhqmC5P7gl^nRYIJ>WYWG5`U=|~5x z!1y;D{bvEi2@J8#kZg6w^KVXR{k+w z5_N>2)uy9Y8zAHBV2OrUUT1kI;1;>Rq$dyV0I_!ZW8^;)?KiN^8`iCTa@E&IPELwB z$b&nVJz%!QTt1jeb_=+w*H*YHu@ z?&d-D*>##hcuk!+ zKcV*H!3F)DQx_!a|4#kfx=!wd1-DOg#qb&#!_scUM7WCeGjXEQ*5k)60lxt`gom_<7BqV#5k=vBr4 zPSWoJXUgbDJLWeS%QRu_IgI7Xi#4FbaJ>sVhgLp{2a12kqQU)6IFoU_HuJRgnvHz* z%KA1PeJy3%*bLj=`(rKsIh&v!G(K=_ds|o_W<3C+CWEeQ+S&XUM!Ck+Ag*}Yb zeeTYd=gQNY57qjEkiY@(9hPBsG8iMY2NF24yIACCsb?lMb7~95*rSrHE<}i{)a&X> z1znI#upW}&1kx$b;|xX(Q^A#b{F4pwUG*Q{ad4+0Hx27-@6aW=Jv2~%)(`T33$#pE zp@A+0xV;QZ`F;Vk-bnJiMrib$xR-Q} z1j#uL-ArC0RR`fRLWo&Hb0W&Qg3}&GHP9%06Y^FA`Ov#T3#cK2GA}{q)j;n+Rb~Ln z6{0nHP1T@!pcFg=K7R!gxhD}#Yf4ivf{y{7k5RhH7*Fz}TSyI%0y;!+paIkPIXH$3V74!=s^-k!9 zoscwPeG7Q(wB%`LD%=3^%4qvb4mWfr}(YL9P^4>X`>yy)q!a@rr> zCWiqj6Gi>i9EKnVTHkD&1L19Rp!A^T*4WPTb1oNLg8f7IWKi{a%#IEdD(Hg^0j9y7 zhLOun^b~oB`=OTqN&b}PyMvVtFpd=YEB9I<{R7%0v$E6H*umBdR#4xCZ%fDysbfZ} z&6HuHEi*GPauM&-dp3=rrO$s=e}2uJBCBPxg*L<;#_GiaSoSoxvY@4foz@$}`QiNP zX-h{+W=VJlcEYyX0t(Qx5-~^Ibl9}Tws~XB8TAKY`8*CjK82b8esE9_V~^}wI@0U% z^~dTT${zrp%*X$akebSm9jwhhd??lA&fUC$%D>D$$L!(~{GYT!6=L$hAt~LH3>tXd zH1s^+ofvoNxgGKzlT7R>FXv&GZ!`~wS-3n5?Ln{y@(_j<5oQzH72hIRdT6^CJ7Dgn z1IOP7DNF7J9fVrFz&gLYZ~;Y(gN=s@0_d0&+Lv(j#|iq+YF#FcsHb%EV$P2zsEnV=`C!4 zWw@p-PHQo(p@f}zryW%ovb5 zpo3lG0G^N8>ooXa27|_Gh_fo+Gf*?FxWXs!4+?8vvAalL(c0>pEkOJIC4elBl%E}z zvjnXvB`jz)$8Z02f)BS~w8=uQwJ3>v>!%>0w8QcvTqFIt7(82zou>EUobY?u(@4_< z`u1XN`G-nq%RhvB=lJHv_s2ILW^vONYS_nqV#5a{m?X9@+E3O4 zof9ng;T=nxKXhX#Z2Ob7|f%Y?yQ>Psyg5 z$(Vx;g7(dWWlUDnRoltk=XXRx-l7q?WHrSRKOTI%8~sS@=}(tb&F70}r@52eFda+4 zSuu>wbCG_y$p5_a_|9!PIS#i&UPSrF(DsAy(ZmyVfW5D4uQwV@2D6^(L@R(DFm@17 z2(nPHBvcZN6h(pwTv!lfMNocj>Lmc(kM>|~JxM@&%p%~8F!Z%g9Xz#nph&7I-ALYv zzTlCu;8GWx%`9DJFWnSZ{Abw@lK*T5`#Rx2yA$`YeL0QfKU>8ka(dlbc^~AS{AbTV zdT2EHKlLxt+^4;+ho%P`ZW+`uuN%#MXwQ`$BVm7VGH2^bmiu;2^sS%Y9FCsKi(uZl z9CNdIm_J1^js`MgCrkvF4M#s3FP-5XdmsgqCH6^kT9_cA3aWeM>0!e zuJ9@*aFRjd0P1TxyAfABm+e~Y6(f3{#(h;jLq%0z2Dah>q#$?jED57(mf-4PuzJU$ zrR^`jaT5Nsy7h|>$T?DKyD;WnRhU1K|7;*+;2*ZL?)NTCKe2+J&UnXbiW~>mp9lB; z4U$oU`uv~z7rQ2RO?K&=h6TF$pxZ+57CkSL1qrza@M9K|LQ(|#&7YA+OP9>`<^aY8 zj{j$1DbTm5vLXu1i4=qiLR*7mmnm=r61EjJ{P)4e`q(7ayT_1>5gB%k9kv8~TKFf~ z&43j_!Owzz=w44Gv}3D+d!QY+LIaebFT14LF$e5z%gq>Rw`-_xF{eTvdEkN!y8Yj# z$J3OW)MTsi!S(@L)i_>2yFc1t7B&gq_YYt}`&r0e0_*eZBhAjHPCUiW#Ew49&?+$h zru7LOOV#3~s#e(&uy7CI9l#Bl*k|!~$O7?Bi6@#9v&N0hMtZyw&o80>GU1*4CFVKF z4%dBi+_QG|KGAj2!g+I1;V!86JMb)a!YD`60T1q9!*=FGJjh(&G;gCFiGmLrf9w8Uad|fSyVi0PFJ>F}5lA zIm7LSU+6|?^3W$%NXHK#fwZ>R8=8kkN{`>;--;QT1^*7T%>$tMQ3QF0gv2B={ue)X zvpd6Ole$PL!@3m@9FBZ?BJV8p-Vpe?hO?bJN=tIHE@gl8#d|^Wu+yxMZ16YPd!js% z-XssJc%oQrAEWexan~nEO~%yD9lklUGp>$vhBlT&fR{q+hoPUGm_rbbuRc1n>}e(m zo`eDIb$D*K5T&OK5@4aOE0V4ZNM;oXI z)d2s4CP}Aa$}Bgj6@?^&Q-iG+fFlnBD>baqubQ4ec=W*0!+Y9*!+v-P_QeFTe!7ay z^Jf%&q(5yvZJqwSHna-k%Cn3t&rIk5(l2IaF&p)Itx4CZ!}J~k7kdZs`g6w}%(-mbm#Ymvwq^}%>$gDN z1@Nx9+srR8g6T5MwibfXh(?-_Tg!}1MPBOwQ*R9_hqlppEki~mXdlL&FrN5fY-ZKS zbERIZWPHTB7~JiOStHg^W~deh0dT<| z`!;h2-$1pj6i90{Mc;iB==SDLk_64FzQQQ<*I@o$9m;7udm|nKb)caa{ zN4amak>|{BGryqs6U;{{m4?GD+_Z(A-LN4PLTR);yB^k86s0Tpa64^uZha7u`keUA zAnwNc$kF)e%SWQ{PAK6F^e5RbDy~>#c{)iqfDO_-lm`vk^+dLr>Qj1TX^*1Am;iuF22Y0gg1 zI6PrX7k0ohJ&3V+97Yn-6B%rzW*Pc)Ue`SAzr_bmQTiD8kmiZ;-4E*{;$KrTC-PqO zd88-3Q3AP~gVdCsb{ys5Kb1Xa`kV0IWkC0Lg%$7|`hfzC_)*8Ug3G0oMEPV*9>qHG zWk@km8ef5AE?pid&`EHw1*2>>Xh8FOMOq>ltzt$~PHt%s6xjfvQScD-gA!;4W5#n# z=`>&2pPRi&tj&q4C7_% z`O?^qt3kr)c?Ft9x32#gS)p;)*xiN4W-IA|BQ3q!l|x6Z1_k~(xaTZ-Pg#9q>}FkeL%;TU z-7^weAWy7+(+phU;4jc;xzV%GJ|U5w`s^}tuqOC7ulu~N&Cs+XHA;#h==ELbee#V_ z4$nv5i_VFxDT(-lLXS}DIq3ZoaDgB3F?LzA5Pg@Lq;Pxy^P{`K4=D)=NJsfuZR)>3 zl-^o@x8?_ijP|sLPie0kywC-_qdYCl*raIszfGT>nhw9EnwqS~j_7$cHTF7{WJMw& zvYeD~7IjxFH3k1{@$pBz-G_JX4R8B;3qXK z8Me3`?{(sbyV@zNvjm#w1jZ0-RuZ@DjO;AIyg3vS)MH3Xx`VWbU&Ira{f~k}b~I%D zDC=6*gMcYnvSXVIk4`w&WIvTHJ6?CZfpa;NuE>t3v({(*HuJ5_^>dz{qg+vrld>kb zCTD$=bw}1iS(`F{k@*7de_kA)%Y2s7;(u%AKZBabq^zk(e|y$vNUvVI@%P5mZR08Z z{aFugdvM#7ZEdgri*us4XpefN^pmb@ks9-@zyFlJVB3$g3eNtI_Tv964}D+y|NRtj z%HPBH6!_06@P9wYf8T=dDeyf7zNf(V6!@M3-&5dw3jB{y06QwLn~Q#r{dXzQ(E`>qGNDm!AXi0ew`zlRv^j3w?OKZkNRU8U<65u;q)nfal}=_-!z zWWSqzC3B?1<+zgBHa+<{u1`;xdi7JB2SpzHviHrsl9}gl-;lnwrfT`ESN_$RQvM@1 z&%Jrx&BZr+Z(eq@?`HYtw&{0d{vM_7$li-OFU#_whKsTm<2Wm8HjZ>>)9%I_ped%b zpGpm8eoV*gkCEPYcG=l0nTyXZ!g2Q5SvZRHS&cV9lkmBybp2O#r|Y8rSp#m)y?MyZ zLvJ2-vvO~&P5RxLdvM?Tjt@YsFS7rNT6kQe&@ZpLUc*sIe`5)4(;v$G6Ve}WR3QE7 z>~D~Mbk-Q8JnH)Dy7adV96K<--w*qVTD2+v#=Nh`zq|Z7H&_^+X9Cd$8o`x>(n{FfPd1$4>& zcMwDRSk{uvCo-32dNbF8t^^7CXI{ejgZ(D=ySLwrez)|yl0B{8q<#hc?!nm%{65(4 zfqqK*pJhIbJMrn&1y?fXWY3warWd)P{Qm#44odn3u5sYIvfMJHFU>B!E`4FYnJDQ& zlu6~!?Dvp3o8E60>NO=%{+C(T!*%707Afue=c7{oPcna+`AFv6%ttdx-?p}&?!P7X z)?E7iI_p>#{r)QZMeyB~%)yztI4bE0SK-bf1^AZgB>pgJu|VJsltv{s;S0*&hyN!j5Cf~l z@Y>ww1j~(-SFWcIy7Ki+_}pbY-qc)Ee@J{Xhx7UJN^X!>^Y)1E{r?ZOV!S?9S6|og zWnI+;DpA5Wk3ZmD_%7n|tADLKUr%3DQKaQF-Xu3{Z!lL%65War#aCVF`>751qFEJi z`eHJDAE^!!cMh_0B3>0cftWDvq0gt!;5G6LI z;48E~jQDUM0^w6YRAK%6)k`XdR}SR#`6jc-00(?`wk1UHJ%T^-|KdNxe-Kw?l(QXQ z8-1BSgtu0QL`THy@v({uR1^Po~Wox3wIU06l_9^ zsm%x)KCP^tzOhVgrqC>MBx(>eq1O-NdqYii_2Ny*xS<-KLmkNbfh4c<*&@le9O&D} z0ua}7jw@}?)%do_6-`gy9MBu|2BUe!iXT?oQMnkpZL0Y0pc3!*2ZOyseX7&ztB`m$ z|1E!nzlrK_-p+hIwCUe?UF>t*p;k-D=`Z}R@ni8X(ZgYm&f~wRzaE~if8pYDkqs^I z8UL+(Og<+qMX809TT8&{b$E~!`5nQnH$b9zr4n>(69jGA;5dyZ&?q{7H9ANJ4u)+G zU#q-a*0`nqCE#FKDO~t&<&yP{1E>jYf=GU`>6?a6>z=E69bGKp>y9KX`0`Cv=)(gW z>V&l5i}m!)o(pN8kc!6*O_fdSo6OCI_;Z{;gYku6T_WGN@iyyU^EddT349|)hjF0) z#svN+yzBZs-2bNp9>CkRB|sp7=Og7@@vmHXh=0oO#aAUCQqUN>p%Efkj}8H3WJvUC z-+uC__?F0qqN1xWMk|}ch*duD#fuxO>H}d&f-DMwSX^m}Up(J*Kzy&8^UM5NLvvI7 z8%0{Eh#0@rTzm0&&GDL@6+0_9l2smCU&;QIrLedp+$Ng)eM}CI?wMzXkc0M5B zwFLf*Xzeq2!?F_o%zufm1AmE(ln{fY{r&1!XO5lz=#$-ecv3BIr97={cts2QBu+Rg z8pN1iRd>AZtGd6`a$aBe1IXdZWp&`ZrQ11LctHT3a}!jYCG_D>_qj!&vT#}I^Z=f3V)pZ=ESL{({+spcKw~lz->*#jxFBRu$VrN zEJ?_O(&_Pq7d1V8ZC#~~!+Oo@HBav?Eyb(K@MdehO>Z+gRlKV-$gQ^}Nu7Li@j$JH zFxMcrdVj}Z9i>4&jXcYzchMVqHTF~yuT53bYs|?RdRHf(dcQWKtJHJ$=m}H;9{fOg zT_xmsU3|x3S~p5TeMlq&*8->T?cZmirvJ#nc+0Aq$MV|&_i%bZnqF4r6-OX=J$?up zvj#F-A8!Qn_2vdhGIV#KQZD1t@$m7Q+WNYS4bjFp^$?N_9eTTalzWt|7v7I&B=iya z-bWsqaqG}@<(2b8hsth%&26+%JiQ>>){E{|?q}D1oe5cD9Ees#iLD4Y$~V}<_Avc& zY|^FgV-%K3eY<7!!aMBk_JIRt-(UHMV{c#mD7GpZwb|mQV(G2?f%N!Vb`wNX87+Iw zQXvIz8fUB{zJyNy`G-bTR#pm?h{m6&+52%INKh53i!?-=Vz3%0D-jxyV;Bj3ReDPCqc^SQ|pJJQ&C0^ZdmfBMWPMaU#6Zz`OVd3r~dVN_a9R2X* z$#7LQ@BlQVolAjYxe`i&K5g09e5vU)=t4uF+#t;_8(vv9yK*qs)Qj)EbILY=k&>t- z0=^r;8|(x?D-g4@EMAFg^+0JjyeM6es(2tQ<3kdpn3_5A4mI!wG*X7d2RL-E0pqER z1RtNMIq`DMON*Z>{;~{c6!}!a#t1||>)WhO$%NBA~^97$9CBM;-Y9K%KN5Z|tj-!EcEW1`*d& zr|{!}lYwxV;7SMQn9!CEtdx?`=dcQ7rutrEr39G)z5Q6*^fRjuN@LhhHwNv7hU5 ztZ&$EryGL!Xy3;;(&x-5n9*Jd859x|A`sW8wIk}1O`sHDry@v2(d8Qg<**)|7Dlci z$R4pNJ_-PR4!-7#*JI54C2m28HD7~3kafDAST`^~QE`exXgpB8rMax>rK*qWj#CZ8 zFO~<&rIqq(04T+|wFT%4d*vwcdaw!$s^u=cu|SgZiwho~IR8=K9o~G!2y3;)M4{Im zs?o-8z{L|$F&Q`Fb@OZ&|Mnk0 z|7K&&OTb0>sDZE+b?~wwJZ#N1{?&Nzn!g(TO!g-?#_@%m%ewTM%Q{JOn{!=BddL~f->Hv|j?wq5 z^1Z8KGrjZezER!! z?FqcUUbI?0TCLQUai!x**P(68QQNzH@5J8`=a2h{8bpL#369U*F!* zJ} z>XlbOf6BZV3bw2PR;-yfz}^vI>C!s{s5oYRfF;QC3(O|=qYiTu`QHX>ndTene1-gB z{V}8dO(I^xuLR{tzYwxSkmYfJ+hw8`(TBbhIKNGN4BzdbFLzKH8k1PFVTk5g^b#

zGXbXoJ$X;0-^(|HGQR=0eT>1B`gAov*7v2F3-wo;G-4ol4Y7Nxc2)#}e#Cy$)S>=D z+J&@pUBY%!wsE;R&{Wk>SJzP06lj)Fr7(GI!2QH06jtJw{^>}e9A{M5JvgJV8oWcX zyTtH8zLWs&q&t?2_*Oh1a3%eRE$Jz(QraF7UxA)fKRTt`)!bG35UzNHsdu>045S_2$Gn>Y#nKRaERp{%SmG)LD1JHGuK323 z_R%%EUk&TfHpNGvcnE$9PmBVO;g)~yU$X4mSodJK0R9VcEEHK9_!B%C|4$^$tyI{< z3Z#no?)>lkAF%k&@$LdY%Rhs?^ayap*mI!v#V}H8VR=%h7qTDZC*eV&aASY0hOUw! z+e;Jtvj+Y4jF@3t#r?Yy{IwU~sH5;}^!*H!P$%SB(Ral{>lKUm-+` zam2y!bn@Lj@9ufB=aWlL;+Nq$LV_^cJ?6nzj%BLpSF(MY(aT3KSMetHyC1!M_x1u6 zKfxBR`NOym#;N$nY>Z#IpWXwck`N*MfpB|fB)b2pPrky-1VG$ z?z!ild*91_e_pd@>D;9gU|s zke(N3{5=c*Z;b9^GM#6eki`VVfo03QSrIFVOgVnKd%27!-nPUe>?$od8M zKXLyP<160CgKxdV{!pGP+}Z>Clr^MEST^ zw3?6K23$lp?WGppKl+nxH*LG=#=Tpz+Qo6oMBw@=-U--$0HBXO@}tSTKby} zAKdc6EwBCMo0OG&{1K3;Bf1hxUb&n1UwNYZKCWA9qw+>mxQX6{Ie%LoVP7$k1UOCQ z0RI6i_f(p8{~V%~})#0~$|cEi8$zYV_-G4fM^o|WXA zltV+m19_*=K#bMcPJ%yJz7X<1^D4;O98CsKAm#rNogV6pAjDrw9#Luq*~Roi`)|o= zKra~_Gce%NdH;ooXL+|Nd;{4+dE0>Dl_X;&^9<@gqkk(OKR@Bz0E|Bs|7p_v zk*T?r`IsXZe`8EZZ;W3f|4Djl%oj;-B@F2|2mJfwG(DzXGz{?GF!#nYW9CgfayOf> zxB%ndx%I1sJ7O{ZFrS}IxIb!0&xGN>MC=-j@!7=Ot>3WE)NBGR-`vfm_Vh-2*aXhG zWaLlM@>q7rmiRA{ZjIrbGnM<~7K{E?p~fzjstRz9TXFT=LPo8oF=r*zJ_Ea8Lr zV}>p9t+ShN!uWkR9-jSA=a%@q{6}xbc;@bHcf7k~OMLCX=el8hTlBNtN=I&q_mAmu z1L)59P>1m^45jgRIzGD>^M9+nrRSvdE%Euxs9215^j#c-`4{xEBy!I5h_ddFJMwcI zw3`Qi5RdV*6E;Wf6mN--9G@~6r~!Uaj-=+!A4&7?;PZ1LoBGASu=hQ&q_UrL>=MbQ z7|n8Q_W_>I?lX7}+&94U6I>hb`;%v0pP_J!g5w9z%3(V^r2S)0YI=!hUfM>_Je$MA zCKq`w&RXty>eW@Ar%tZ&tbWxA$LhdQ3|9;j{Hq~7hT*Z=vm?2;XT~n-$8h1;0rxwS z0q-!tI}GTUvmE?*VA)Pcx4?67>D!(&qu>|;_l0mB4#!Zqcf!>KM+O|}fiRQR)3kI3 zq+j4UG-|r139bk67;5v7M4Ly)eo>}7QH)9;!o8Y(wj#bv9$&Xr(&T;^43q4|sV~%X#Dvx;ns%d2Ks@dYf z5T;{2viny7?ni;%rJg=>%RHaXc+S%&#o&1&cA-ZH`S9oyxL(aK#Pu1t?fx+A*J3uZ zd>g>?VYl}!zvC}qthjtzcpnH*gZ0R7B5Q_ifV$v6o&&GJ4oa}`kDBO+=rwo<3HJo= zkuh*@fyvTk08#Wu6Ja_yv;;P5L=b%npBJZ9OE;pcshbPVTg0#Hq&$p zgW)Q8kf|jMtJ0y5f)iG*1;CUhSEhBn5J1Fo)fx#acuoAx5HoI3hR{|Nxkkk@tQa4V zb^yb6-13|0Daqp}gCRhLF6hJU@*xB!6hSIPA*Ipy$Th(ngp4Q(`sAe78fFb6mGGNR zg<_^@j4*-2%~IiGKW4xo#fkE-gY1)Q$14e=0~eA2DG!Bizzt;xwU@_>2|?15e)-DV8v``2)zfL1~+2Z)-RSUXJgNcJ#p+RXn&yw z0;ZmjMg{pX95&8kBOiugxagNPuqhdY!o4&GFaIsjnJ>$x(?LKV0^KA8%z=CUn#GeX z1O;L`Ux0Fm*L4Jfrvo6a11#p>Zt;%9SGf_3$q?*jA^>=Pg*UMCA6y|KTpmuo7k@9- z4bv^uS%}z@MmU)aH?M>p;QV5~PhO?S|9X&QluV>Bcg`0Ml~=(RST^#7*KoopF^r6_oW7(qmVN7p+^cX+n>oiatlKUn0T6nGvQ`ZN|| zQ$H6B9<%1$4Byh7z z$Lh>1e445p{;DU232H|z&G1ZgeIug->hNED)CC@X>Ktoyj)!#)lH_2M9HfuqHS!uH zTcotZ$FsawJ|NW#?>NAhjo{Np{YeFuN~H1djVA!iZC5UWyh7H9u!xAj*Do=_9}LsN z5+jJSaj&Y zGqx1Fqau}stBA01;YED4`A=#=&^~etF6qX*$%0juW*UCQunj+XUM@_;iza@0%W4#nFB{4NSTQG z9^{J$kxl^(1^?#xQQ4pzE*grmsgn{PcZuVhEmnugq$CMnX2VvYz__ zyC-o#kFZ8Yw=ZUqUs)y67Ws!IY|`HmCTp4L^egH zhrCBd;IoXEgIZ2l!cOP~pZfz2ZsWUjFpWjHReFF2u;&J+19?9w@B?DS@HS{UVE+FT zx?YOzdMO%(oV~_N(O`KY;Ja{FK%i4VG)D31E<52{bl8L7tvc+ykOtqX3%pxLGvQgt z%cliPF9b+ZR(A!T21h{{8OwY*DC&1Rj&g`Nf|gW zWnhXvC51`GMGbq!<-DSu^ryKHw}~y~=4{ zxva<$*8#x{1U?u_9xB-MPf*b?V0S0~`c7#k@ZDOM#Y|j~&Sil+GacS(Hh6!MDo_ak z?0bdh4uFrmh6h@YriSx6JwR$|s$Q?r$oWr&;=H6Y@Ei`DRwXA3MoLE+Bz_8lwMPg* zB;-=4QKF8=F5Pm zck-O6d6Va04Bw$HOVY_3QUM4T>EQHVf!%w8@RL^iCZ9Ki7vUj|`;tVmfnZAp5vck3 zm4d>Tx8C~aU=+PG75#AQ{U7WZG-_GS+RNj>UjRKG?1J??TqT|cy@&Ard+71u2{ux3 zIF>nteuF`s0L2mHvQyYKJbe2Ial$mgMFE3dLR{b)8K^5>#7d=t@2`Ql>akm|>ma zal?AU21AMA3B!|yrwmUUW;{d&JY#s)@SI_zVUyu`!wZJZh8GQ`hB8CB;U&Y%hF1)) z8nzf-Gi)`yZg|5mV+$Fu&G4q-EyLS}zZte0Dh%%!-Zi{uc;E1M!v}^PhDyVShK~$8 z4Z94x4SNhTJ|P3D3@*dRhP{Sr!#=|&hW&;b!vVvmhR+QDFdQ^|Za8E(Y&c^0!tkZx zE5nR`lL22F{%QD^;TywI!?%X-4Bs1$8IBuH7-|h}L!IFVL%rdo;opW+h6Y2UVP+T^ z@T1`;!)e1A!_S5$L$kqSIBPg(Xfd2O{9?FZXf=2Z7Y&yTZ3dsA-N12YL|yJbfdj0e z$Z&mOiUGQK+g^*x8~$<8723G%J-9rA6w`&p^IL)-0VCHjgJ zHYOPLM6cGvWJ)j5ce9GEvDQA;Vb(BfTu8VG>arEK>gg!qpW0_=36CUfO32WQ^fCG* z{ZPGBA8!>|W2{Nmp;oCiJ|vvuoT+gV^DsE~#WP)vMBD3nfM56em4sUOtN*WoV95Pi znqP~nnK^UjjOqC^X5Bky?(BPK&ai-A8GR+BJTPy50ZfQH;NIDDMPXOM)o?{no0y-p z^0RBXLYUHDE%~p8v4_=_dYG375>GCS{Ebk-aAFvapLZMO# zf5(jKc-})3z`y3Y-2Y|{T;AKVXJpTi;yi5#Y<`r2jqK;Q^&nb0IWmZD$P38ERWF}( zW54LuZU3X)HUQjFdqzKM=oj~m$+Iqfx~lN?<*!b}r7WCm@v9mz?P8zFUA8sO!~At@ zWl7k0b9#JyJj{+`;TIbl7axnWHU8<%ul-My-*`YmVABl*SUib{5Q!p0il}h;1f5!~ z7d>8pKkJ}Z-obh@G~Kp&qZ z?3JJ8v%u0DtiRFRVqu01{yb8_2i}sugiHweza?yD&WBGKG=)^&Mf3fyIs;9?Y4!yk+n(h1kg(?1*L z7ymZ?zlvxtK}ryNtfEFtU7X_b5>JUkHJJX{u;;*S4hs{7i)4ZFuih86;voJ3 zl3?laJQZ;ryb$Ubqz*$kP)qTfTWwE zyP}6eqe$rBfl#;5Yv(k1eA;I5=iq9^ixkg>EmL5I>}tf;=mpUWqYD8)`tcCb;5}{k z{eiT3ivJG&ha^<iw&Y&{vL!LHt7R7wUeJuYHX;OEFfFt+yw#(u?gx-6GK0 zl!D+WeViN*yxDW*co>SmrvxeZCV(A#^KF3pcEu#cWH?Vy+`;3gdO*NOx%H)Zv0@1y zi})!8!4bNaxC7j{azv*1-y{n}vqd_IK!MPkZ&TcL;_cd_J=z(`J8CbSiV`tR>Vflxcd|5wFS#XX8?o$zC=Px5>!l_2j! z3n0s8_d@n)cbQh^$g;uQFSd|a+r z0iigS3HSy56x2nO0s%kO0$37`FDT~=6@?1auXMb5IUIH4ekiYpL?g)!OMqTO^(Jb> zV6Ew$U9mC{CP;;#pJ*>Y-A}Cm0skp6Esg3ItS#b4j8xwU^Id;71=K1J>Y3o!h;k!f@2n57-wHF6ha`xd;-^m2Lf89&V*)U|?z5sDwVD#!??7xZsXe+xCI zx`)n+Lgz);`|&{hcgr4<2>MshWwftRYlKojDH1p<)KaK7)dExp2pR#?Abw$1bmhDV z*8t36Q$xldYTePge$MwKqyfi!+V=#!c%|AsG$eRW=Mc2T>1+^ZMV;qGbOjh^$sC|SHmCij7?>8O2n&QFI5j$!plOkAiVGO3+7xWF{`?u(nXh-;t z@ZMr-_h9`8%7XkC@MHPr4jP2sFO(~2G{oOcL3!1`0YBgkElg73s9760y#?%;SxrIVgR zrSnSs4@rI$(G@XTe=|Sk%m`q|u@v!Rzo&e}J1kLHji6E|=sWZYW8Ib5gEn6%|9=!6 z;a87Wi=6z*6v|(iOwdA9nvwte1Ec24;S{IP>R0N!;4C<_?wBjI{({w819MZHoeFE7 zI0Lv6JL1PV-FGnFQT%jF=sezGjG*U*9zs)7eg*M|TD>*=N^fw*bus_{6XZPABeeDR z^K&}n1TB${38CX%a7@M&!Coh%r#1?;`a4^_K|Q1u_Yva?Y!G{}MQiz$2;?c&4Qq4? z4l4h`d{@9F=mqKzrf-7&NmntiP62YC>VMkrY5vPwRH$2{LXdwt-|ftEK|+GOXyp3} z(tuQ4jRM3^^*{1nD37+DU&gR&>0P_3x*0jpk-59@hsRsf{frbID%ZA0s%jjJYh|TmWg$s?TmFlrT7ufcu*JA z0YckjeGwlWx#)<5BS^5%T*(6gKh_@WF3>LUfwnW&y;1QKobkBa<~hkzM)M-a5Hs4# z!uUzc#1RG8hdZxAQ2cb=MW|WmHQ4s`iqn7_kDwbFnDbJqFr3z!$^&f=%1gm+r5Yjl zWI`*xUz94QD?fsTEL_KR;0nrp5I5C>R6;0KS8B#!YTB!D)=c$*FdicQk>XVGP+4wR zsKZ%xa3(IyD?%+T3=2v(VnSJ=@-~u}eFwiv8VpC<x>fUZ7dX8Kh$YKdZY|J{nGQ)A_zo!hW(Z z>i?~~JL>njYroleeKEfe``uC3hvnL-y72!#4qThF*BA5quy?ip^>O*ysk-?8`#5lI z&R$>4@5A0D|JTRmYp3es|L^0#wK;ozF~1Lcm;7HJm#>|wi~qlm1J~y4^~L-?>|OGI zeO$hFsxJQjJ`P-)v)32%`>_A-m;dYIQdg=j4s>y#ivwL8_)p;g%M>xInAPyn)rXje znYGLxUGEa+3Fb-WDduVB8Rl8$xj!6#Ir9?pGV==aDzk-ojoJE#^G;y@P%{#XutGv#nj^W5gS zt+obRv$fgUcX(VJZs~~IqBx3tlExnAR403Xmd^QoUblPinpWHRgKO4II5?b>d7Uh5 z&8%NB95!g=_lX}mbjFNBu$3uCn$;XR^df9i(Cil(t3Rw6p1ZYne%a57|1dHP4CV}D za>9nCZm!IYW$=#Qz?3CM&QZ;6YS`k?WU%6owe{6SL{n7FaoZkz?cT43{iyjxiEhV4 zwMH2(7H63!ymxv>ZNrk>5z#BM7f<~A`f&}p+YgnNPRrW8o6FjbCGXDKJ^Onj6i>3M zt7m8L+zGeY*(oV@`}5B~@(ApNu=AVM_b#D3A~=({Y2Lq_$+zNuGSglAU1MZYWuzwF zn(Nl(9@c0I3#AcpW=7wzjv+}2w`M%$d}QgK=~b3mGYQ8{GopuZM8=t1xt>Cw&b`6O z?@l6ttsz_-spHHGeCDDQ;%nAye36Ne@x^?iHV3-%9|?JhiFc(8QTVa5&g z=j^I&_WXT)&;CERELrx~sT}#x&yoDYveo5YKVPV$X!lqL_i-j7Fcz%_6ohQrR8@8A zR2BfV39d)mhm9DXIy`mQ z2xVmQ^p6h!oE7+qq+=C$e!|sB4h{Wca9v_`=IZ6oE!sX8BZyQE@`%Z5xU-xWjtzVU zjM`v*Vb(hne_-~T9_f_+FDD+E_-XW~(cdP%XJ2dM2<{@KgKce99CaSp;R9UBpwV-=p zR%WK%W?eLU_Ail5y}r+UchQ!ar$jB2f9W2{41FMf#gB8h=Pf<@z5Uj~TlU}k@F)GY z%+9;C?q8R_d%owEWhXbDduv5%W(1>9NfLU9SJzq7G(=tcZ1q>mmMN8M=H%{r>&TO* zrw@9#MMES~!Z|t|DT3M*AwYF_r{Oe#JE&4a1Dr~yms!4_^~toCW@lv>p{rPD&38DA zgsjbZv*7(jZ!FvDEO)+Qf6uO0EBGBsv9*lGqN3_*=(;?6sxdkFZ1G|16Z7j5$6nUH z$WI?v4=u~U0pbyWhi`dt(uZ?CnEy^e<(%!-9X4!4K8kN3LWV=(w0znI7A9Ypf8*`o z7DkN@6Sj>a%7fPRV!5wXYj&pzw9sX^11a3njOza#owU<5Jxcb6zLd+XqSv@wvuz&s= z=L@|(3^j_@)>8jE5~GmSw6?V^d-%_P&;8JJloLH}-EGY;CPNLql}nZz(`uG{xT5q! z$3K>HR>$MRz95?LC9qA9l5irwq+R3_`$YcCI_D8Ui(4TntBo1t`HjB}EsSl8ZMvcM zQ&K%AdYw|EXPp+NM0K#npU#Qv^?vv`iCfQabIVsu;*)t*E%r73WJ8%Z=qtz6W1>FA-ELq`ww|Kk58IxKT>=Hm07^B#|fW&O_fs%g1rho2&Nnjm8u!gxqc>N)B8^b=!nBt( zHTw;sl_EcWH^BHwnjaN$ET`jUeLtr5&ZXP>JPm&{fNzuN$SorYCvNY1Y-uq^j`bzn zOq9Ok#e~dk*z9|3SxtIF;o+|~RH&-d8i`D%8j@@N;ncZvU$`DCYN*>*_vgJgecbzJ ze|!6j8U7gekPEp#jQdG)e#nI$ps}Ng8a{A9$l%ZC_q7{7iu+`&Um~v|oMz*y>@?W- z*YxA}DesdNlC^|;82ePX?6A)U=^ZgAB2Lv^i18dXU)W- zk!EKlMgQUt+w)A*r~YsKqWup+JCY+XuBDM{@xNKstl~&545fcOQzp&(t zt{L18b=#EoteGOb&YeS7pRt>G2G=JNJuNSQ0;{B8Tlhx`N-e7uf)wg5L z=q{++a$4_fO>WAuXEG{TM8Z(iE|=Qd#ccp+SD|3F1JH1gHvkMn;O}|A3BZ_Y8lC~R z6$G?+Jde-s?C6f;YIOm-ludW_b`5s*aH~8LpIR>M69dh-^R|{dd|BU3cst{h1>ejl zv&75COdqe1llF@srGTH8RVW(w??#2lI$c$k{EF>I?|SR83;%98=QNcaZYWGpE`4g$ zzKk`Fck>@9NHMG;hvo9IB3((g-cHKc28&n2t!=S#GLwsQGHY$H8#U!}yX2y*MO9-` zameP6B{G$=rB;W1tZ<#KmTw!_^t~4Fo4zb~HNQB&#QCl%N4Z*m7*v3cuvTJhNvvxn z&B|I$eo5L|Qd(apSL<}<>Hf)FHaDw1d1Z0tmrGybbjVXlghq{Wm|s*YDkw6!dbyPz zGtueP@M#>055{gaSL>cemtNC~jLPuAO?XB_9mZFLx47AuA=wT;6~shK0t zrKdU;?0g@T27>kR`RfWcfMYG?PL~tqQ>_N^gsO=A?cm@uFHKQRkI#o7;(@qkeQVD} z5nOfVIZiYaYEIOv#1heF(sHiu)UXWu%(q_o`l}!6&U%!Zy86QO-qGjIww}Lm;mn!l z=Gxk-DyLJaR55D!09MPn)^p9Ls@6B3YCU)OP{S#uQft>LjarVY;!d1s_qBLhTbmku z4TK~~RMA?EimNfTs?Mrbt~ORD)Sn`!>>rFfu?|=d;PoEwT`w^m z&Ua6(-&Jp~zVKqE*5$6RUY)Q>({!WnDX&b>|Be_5um5Y-&q-d5a|-RR<2Zlle8 zwxyDh5!4S_=`Ca|sTREf-zoxglE*OhE&Dn+Ivl7H9{4t7Grx4c(QN+uk;d*QhHCxn z2-N4d7oFC%#=_jV4J2v(EzY>y&oyx=$<>D$2j^EYSH}(R*yXNq*k_0|H^r0DP`G zbm)sC&CRD8ntp6PL(D@>j8?1tu(Z&4YT3b-jSc$4?lPCj>i&2&m~|$O6gfhBDl|L~ z*V20poBfZpSGR%wZ#ish$oFVO64{0gHSS$4evnE|&aLB08@7H^Gn2PkG-=Ic7gXOq z*Rp=e)T&5F^7oH2hx;iX`M7%4F3YaD@6UR}@`~k^>2FvnEez8OrdbS=zrCPj(kmhS zCrY0G>EpGps=ksnN)}5hMN>t4){NDui?d%IbNG-+@2zpiySBS}u!GnYdKXcsQzorx zlb6kwdC6Vmb@B`G!#G07>vu(p$n2`wRZGg!4`-~+oa8hVyv2ap8(YMxzq#vQcmDH^ zZ|?eh;-wYsVO$)rK4V0EBmtX$&xAA{I3#D^y zZBl7;KG!B9(oLm>cHna%@HyAQxJ))rUG>@xWx!{>{?MV?TA|4ZH&lo1MR{K|<3&di zIKH21G5lKmpLX`1mJb^)uJz6_>7BObL3Q<@-hqvVg09lHGPcWcIqJ$0Xa z@^M{*57Y+yhH_(xL=-{j?yZyt3@>sD{70O~|EcSIgLWN+uRj4`*bv}8rZ37GyE`+B z>?YM9!T(@6BPq%t^eS7CaC5@i6r6MDL=flt2)>pGkeqi zn7b}FVj}F0v-H)uFfVj&)K|Roo~BH8&H8drHYeBSl&Pz9Reh`aa~nY4TFhoMaXPE2 z%F4EH-?8J(osaKMbg*WN)ix`uh$AMVa>+aruf!|ziIkwRL8VAqSm&6`KH58O+4I5i zvi)%X5bOuIKj%$yJ0q%p6Mb5^=G&MCh z2kzBvaxi(kFay5`e9k2vkXv^+sZe#`-FjkD^MIvKBi^w|YB@(-&MN1If_3xO6|5`Z z^|?9@dT^j{xIj6GioZd5i)ups58t$b={0Y+@ZX@gmb~G3aq-f{OG0`uHKZsQUw!rA zhuQYKXMfl*>-)XCiyTHr&1#Xx2omfg9CIa!(wjBp+#J_oxBCVVVddmOo)^%bpjIL+kk#JadMJsLSuI(^qzpTsY! zYibH#wjzDC$`jw*r*>@B9>*H{I(wk_MWMg$!QIQ55^dFcilIq>~?GIxX ztt-y1ITK$4XfvnNNv@qf`Yh9=YLT=Tlvzpz`p= zyFFf3WEShBYPno3)rrj_mNo0ZbQFuqoTbiF%)$+Y;P4L9vn-ssh*l9drAhgo8?@wj4$+;T zJFQ42@RN;fjcko*m9`Zg^lb2`+zi z!s<%->5<9<7Rtf78}ne}+hfL6Gq80xY*^hJTRpvI>4t)`g0gz1o#CYx7>77~zSdTT zX=`h3ZEOUu*A0e3J$Ibj1D-v5jvucFkw!Yl^nsy@^Qbfp%9i~XXSBcP`>UN($)HmZ zc3;i94F=N!XFaT8t>=tfn$^W(9_%mCXSMZ)n!*ip$_`})`irPRgMH$%Mfo~Z9DxWcCjpE_KIfbuEhRNl0Pg4(H7-l|F`Pbcurv;9=Us+Fu$*>c~r zx>_+PTM9BS&a>=mY{e~c4YGzFP_34RgGUb_udMoUbI{`6egw70hK)!k1b4Xbi(r)p zKm$BaYe1)MQF$dCFrT(eF*hDE41z^m@(;+$Lslwz{?6Ugw=X%Cd0M-;*tA#XO%jtL zcCXv}^Y9aWzwKAwyH)O7l>y<9o@HHb-tG-z4$2kB)dB@=&<~qAT%UsU(7=QY$Xr+U zuiAec{&$1ttk387yDU1rCR!p|=0EGN^RM>d9MTPT2&Tp5K)0oC`le;K?w+t~!Y;gH z62n)mUY!`uaTj1D+}hC4fGjI3gMFDb&;}O!YN(aHx*D^aOc1pimb?Kfot4gAPOd7y zs-QNlLFI)`=K}IMmkH84pK!vND+L9F`4CR2>cZ!&x%c74&;FeF@94VlBS()OJ>WWW zv_bms@b<)eOYd7hXHC7hPIUCB3qp^b82PE@RKzdC4=FAvTO>YZ3k*Uqp0;r!A|Wc0 z7&SU!nPyL7?KF{C729u4-AgQS5f8Cd*f;v+H_9K2WX+zO?1#Vk1-}Q%$kKa0(8t;L z$LStDk!fzY!~85vs#wxaOfJS}$#WbUE0!!H&UsJ-L3x#-syRF(6QTZwM{>uihxDiZn$5N-$@uhLkJYUX~@`;`wN4Dl(X7`sSP80Cb zE3Uus&~alWQ}k!jPE}&4)dnj0H-YBhlR*Z~UNES?G(DD)sNm~%60$1KaD!SYlW>_$ zgZ7cl@-*UcxuGq_#O^wIK<{>4)LiNbOPmg8caw~PLbg8SDw?ii$R(>y@2&7!J#IH> z9YP*GkW;L-u%va-oa9mQ={*^hieG$q^zMOBzJxS{pOT(QId&A(oy!I34Ih1-EC*xX z|Ddlw7gsxlH&!9MthRY8-aB72HE}1JmCnJ-(wzECa`9|k%WdOwGr3#A2${|Oh0AwF zGg7cSxw6;F7xa?tDlgrmM4av>D z^R{$Gwz*{ex`)?%cjUxmpUz9%WZuH%gSQ>?x)Wq3b-H4BT)N`H8^?v^Dj8Gipw!!! z7dCmPo#z~_A2si4AJ#IcITqG4oX+-^W*O<6Ll($zs1XdlByY|?Ws(NjskO4W6Vs%d_mBVWKbmt8l#5vCHZ73Sn0@36=94P z=MW|=iV-!4Ps7KzKjoDl^hu`2>7@_;{5P*_Us|Hi2j@$(PHHY`y*@vvIUjF-VToEY zQ@iIcKK|QbS|`U94B`y6w^ix52kiP`uyj6Y|KDn#&K)lDpUF%$rW`wROuehp=kb!n zLthU%ldbgTDw`klr`6_F_4VJsa>OW7_+-uYW6%6~RP&dagPil6GujU}u`ZC%At%aS z96sO7ruSl^g^xEN{^S_yd(h-$7=FDQLqYzWu*d*lQZgb{m<%{7g)Q(!WO!n20QyA&H{i;&iDAJ{XRT)T4X1frDdIq(@_hE8TS-cAC*c z?}g7M{;B`LG>;4HvrB59+(ztrza9IP>7!$|39E$O1_2=ZYWG~U)8G~u8vxYO-N>JK zpG4WSV+Vc@>?Ly!G%te37|pLQ;=KfTBPJj|0QkuQ{szj{kXK=!`rYVtd#64;mXK^% z5v!H^!yGD8oHGf&g5F!jFiQ#PLt03i+F4#|H6C!Rf$uR^dTib%%m`zKC|nXQQp!xQ z;s*;BVJZ_mHz18kSr@S{Jom$_eKr@gsc}WR-RKx>QepW+#%7PbO)r=E4m1rqbTC?( znYy_I%Rm3+uydcyQ@fo*M@04tlfm~pB_ix!c9Uwzuxsio?sF9vp7zNr z%?Bzx(DMj6^wZY|Y#x>r3@o^Dh_b(w5v5Dh!x(bMq~Ym_{rfQ;_KG#0?!m(4kd{ew?98ouK&UEbZ>fOO2uCKj< z>D6S2+Q6^M5w(fx13uD98et@+w_Y1wl_XIK@;o3nvS1MSVh7x{coH8ECy-K*=iR(L z=ztd;gz!WHId05_m3)|^510h~Q2?5Q_dy0B)JD$Cz3~1yHTrE&f7X;njKrQcO_QHE zBzg#p20CN*?CC>?GeUYlsdYRK-3k5p*b3Gui5(X91V_~KwjsbO7K|+>c&?6T$j<0Y zW)m13*MKw_i%Q7^_@ehb(gY=@&H7uyzx#^U3o^YG z2W`i^drtbN`gkpF^Z73QU}uRbfdMIy!ODUJ^r3|GXJk?_EH)Q8K$1|CWL1>AK^{=7 zcID~ZM>=4{s9nxUz>f}-=(9|%C02csQ zzQ>U+JFOsXMaHNol`J!S>Yy~c^X_5tjC>sBE@)5eI#c0s+byG0wVD3AC#ZK_0xOq1 zX00vcmd=UG49|=v);3?|ybJ@Db0+Or!0s|v)xpCs11~QXLfP3In;L@^3!$+nR3K`MJ`ZLppPwQJ{ zG1c2P$~65ajoWIRqwXwA~bv-lE>bpdJ>J(NiK-CNe_?-@uXe)*?q`u46-CdxQ6f4A1(a;`uARyIt_? zV>9f3{<3+p`zVa#=E{>7_Dnt6i1oc1Y@X+2Oe*K7!%OzunhVnM)b!!YK7BV=WEko9 z`aJ$KE%R5tdk)(D(}xe1K6UFkHh)M}zEfrDF=zDr5ku55WkeoEW!P=0{idoMUSx4`IxfXT%2M*RqYjT7t~me3i7mBHHg8zE->El6M>N#d zZtp*CsQf2wW9Ium&p5t{JDK>dUFkWt>&$_FX|3>DKzB`~G8`72h)!yQ*`Y=$73*vy z?&DZi&Fa*B)aJB!i<^ARvTAjjg(QS0gc~JkvPF_YvXCq$37X`T$&)7C={C7d9xju6 z+?i!Mr)p7EnK;wq)x(FUc&MA}$#dtq%Uz8KM~;+36|V|f(obt5eS42c9G%FBm?&+g zDKo>6$bYwqB`y|pgW2P*D2I+`)|IQ_#jqaH4A`K3wW*2e3?qtWm_$=XS|S#Hwe%t) z6Gew>ED@_j#6Vq00wUcFD_m$%E|BR;N*1If=m*Bie7bJyI=**p6lPgt^e{=7ue zBkkRLVrPRLWQH#`6_ZN6$81L8%pUK73NwrfS!5I8W;={V3?;C_yeSKAE%1e>9B@C+ec^-W@A zW>}jnCnYeNlt3OAF`J=VTS2<60gNg$(Wo``Fh!2)SuoT<)Jc6)GDZ{_Dl2T()Rc3B zKKlB7m(JxPHt+c_x4o}(@#&S$Q8mj8`0s?PlZM+qDNvKj3dh_zi5GIx+#C6i!`b`| z7t%I*NUbhEErp3w!sw+OqL7ep^HbuqeFd$n9|^Wv-$>sT$umUfGvOxt`~I`_dZKM%OX*Q1xEYer{h1rq`2sy8YQr^H!#< zOf|twMnCnVC&!H+3X>R^rG@eu*YbhWG;}xGrbY+w1cP^1pV%IwyC+GE9FJGk(`ZH_^CHde8Zm`3sM6 zYCmynPI|mwW-Po0`#XXqBuo-1Q-))JBuv5UXS{cja#x;PZ{hFDkAR&n0L(8$VW?8j zR1OnDu@`^@xOhKnE|(FTtXR5cM)vTmp;?9`t<2W;;)IDe_gzEgvx%0Eq$f2eH8Y+T zyVu=T?>kf7ro_O^ykbDI|?+SBvGa1>nVW=52q=Uw^{6( zA>p?!eo1Mc=y~%R<@tb_JYST~K>>88&0nO5nUhr`%((J+dUVbN(Y-BQ-Q4DBX zhJlBl$VsZMk# zWG@geTS07kYUk&luvrg)ou8@556h39m$F=b>xj*Zs#cg*EVygw@;0BqH6fm78^mpv zbNa#%JBmA8$iJ^*P;<&s(pXaBc0;XTdAX$&mfWF!j0qm)1y>GC;FUo9M5?#_>LZ^%sG#<f*5bM6AwAgpBm<6U@|5ylpvM#YCPY1T z7lyk4gID)@-g(<(DBtBd`uh1rIL}wZH|LC!45&dY^hx!f2Hh~60cqpM_Kn0RSL#!3 zE?r59_x!>4u^b#@q!N`ZUKNjvEfQ%&Ob_AC9;SL5p?A44IXQp+e4_?#GkVQWXeTS71rmW%gp8QK zb8J6GM4tA(@15%@wt84xjl%SEi>=USeB``nG4L`P)|e2g*58^D3Agc3eo6>Ei_TMe zGDUxqB`TsM@TL);J~O>XloW0!d*iQ~K0Z1g=HWtWSTBl+z~m&wn&R=eaipWrSX`pR z`+qDw_JF;Yq5EK%8>rEL%x=g`Q8Z4Wo$Yq>wIu}J%ksEce59o%@$#VK1GEq*IGxrKZtFEGYH#?*5>~{*pl*jr zs}mNDYRGDM5F7xOxX4^~SB~H(5Fl@q`n+VKez;O-U5NEUZg`~t#GwN~Mm5F*J`Ij@ z2%3#jAG#a}z;esY<>n*0Jl$O20hUYL;5^VlZ7_XN0X?2P-4xwC^+a%n}zg{4-6X-_`ER93&XyNriV3MazyvKc}jV}&(C$S4C;rq30Q4I7x2Rh1%*HW zFF`KQRULlT#Y4BK`0(yB1W95-%95b;DTz-E&Z%X;=d3og(W((_rc+81;L3{8mNT~+u z!C{vc=oY9)n$Zc?38fm(EDOm4fKMTLDH8l3KPW+BUQ2k%8Qpo9`S?IPBY3@&eFuH7 z`m{b+dLe_z>|{qWu4_18cB9dx8t-=8?byO?;T(=+V={ztn)%7IlR1q8Eb`=JjJusr zaknEm8Ozf^KEd&R4dmmU(P#lB;M1Ig7Y|{T2b6@xveA3eSL%P>f6}+nYq4N@1hnfN zKnL}KUt3UldEEw*hFO@zzbt~DCBr6It2)HLCyGN0%gfYe4LEX znFEM9lmk$EsDA@c29rF1**s^y=dy$eAcUDf8Q}V!049^!X?9ZC75IvDAi~|i*V)Kd zZ~_HrwC_HfxOW=#dGTMGHOLEOENprVQg!&obUV2+t5pjK(bB>Yt(g@QRaId>TeesW$G;qMXN6_^4nv zXD83kdUVm_3m;nk=%Q72JF(kW`B(YZa%(xfLI4j!{wj08&*v}VR&!xuxhy6+R%k9> zGr*L;qy6NblAsVkX1TY-6B>}L5gctUs9*pn_cUa-X4CAQ*|h!+Xg!BxQ%C(Bz>`h0 zH_hfb!;@CTVeF<(?T0fab;l>pK^yU!iv}Q9cV}(6dp1vph9F;egM+6h0Kpc-!tsew zC*T9r1lJ`e%bx}-0mff=pEV^-o)$kfesjDwB~3|Um4nr{>u%S*Y(}S4#wHHR%v+eZ zu>1#fQZOinl8Hly3QzeUAZh4C=TMw11Ei?)bilz5Wss7VX9W(rI|4v5ar~d6>#xzE zLLz2oxx3sw#n#`X37YwoY+T?C0Z>St{9x1TLZXRI=kefxYtlYon$FD8rYch5yYyPE z2@KqPaDz;P0-XYeYtVkIF!~af4QMbHL>{U3qDrpI>pY zg5>*ryL|iM0W=15j}kNkr7V%@5H%Wrc0wpz?g#ybJXV8Y=Ah}W2r%;TwEy!-t_aZb zW?u-JkN_pjL=>oqoWmyh=|dnVJQLwK(|GL!&PSrN@XNK8bBZbQpf}P zOGqJ?2W8J3NX8qucyE?U`5=%s@R(mMpO}pSycYvbl8Ho$a;R3*RS1QwhjMU2I=lvo z+{e)yC*A1~04+x>>=AdP{=8;taWS-<*;Njsuh(n$9XkdA02Xq@GFP9famaU0;Qbbl z$7VAcmphJg$LB9srfTNuj|4h3JSKpiW3zbzy&QW-rg~-K9-AHd2egAaEiE(C34biI z+qGJ#C5#KHYQbsvabb{Aa2oit=db5SdK_R#w%Y@(i+%^ZHUxBF9GI(#ils{*D=53I zYI>P%EzB1ampUKg%HaP2WuWC~8jfW-4rJEt4)|g1pW_5S@=PoVmxast4#x8kxrl)2 zU2fgcyth)mUi8zhz36wlk9yzoeeL_nzt@j`1euHhtMK*$>Z5*>slX|R*#-9Ta6T3P#iI^Sliy#&X9YIXU1 zRv+*6No5*l#OOl%;^hlh8Zr|>BQVTplij)8xzd>lb_~$tGFN!yUa2>G-MP{q!0Y0@ zzHE5A%g@tq1`Tst(twyA_?Q8}Y%X`-wqSsv2mBQho{*&3;RS%b{%20V{>{`^1i#;Z zn)`-(1^FwHC{=1kmzb1(Q|kB*uPMoNlXJWiR0c|%Md#LgDm+#X`du!I+s#{m9#87{ z(U7a>4N^>vg+_WyB`1j%6`wxg!_o{KLE7_(R&h%50C^rAGsHzyAmSK9HybP>Kuuqd$52 z^c&xdb2?$Rg;ShQIBZw&2K=Bojyzo)DGd|TvGItf(fjn~NLU^S1RxPGaw7YK<0roL zjza-j;5M>`EVN$O=hxb8UKjXnKHqx(XrN;aJgPU6iPEafs==){&sPqT50V>=3*jZ# zFSrl6g^pBXYKYQCJXZ&>03j!Jm;x<8!D-1bb-S{+wD}CjS5T`RoY?~Z&57YY=7c#M z<^ejCWr*peyw< z+k=n1%4xoGNBG+C!xKU2^05mY7rBevJDuzwSOcbi77XM^-LIp4pDYa@%<~oLKnj*Q zhrx?W)ZqvO_PLCaCyIKIUh>{bcrgg<^H`=A)0^oIXNK{@$mJzAHVsw>yl{uJAGx>K zdjMPxxCCYIfQyobK?mx=#08v!pMmjtAfF2y3-~clj@RZjyDsNcfcUOU7YF`>IKUA% zEYWS~aPYEoC&xh#Rft=|xoGNOq~m~`^bkwi*y1g#mQ9pl{iogZ^5_r7>UKHs7 z9n50N%^hCCy3x^^KPTI+s%7B6D)1g6IvZ!j|5$*dwQjx8cBviyL63V$pp$b_PRz$c zz5C1htA@bB4PP{4(tuOr%Q}33Pjja6OyhZv)a&Ep-99xqIhs;@0Mt58)&tDt0AVV4 zxGiU36*CZUK;P(T^msd7M05!X%}XFayWAZsF z)eWG>IPLAB@EN3 zU`+G`;%O={q3b&c=Wm=OkGuWEx)X$~U%!Bp`dE0sB#9J4RTe<}YM^mAH;o&^_2m+w zc4lZ(GsI^CZUIDmy+xdad)WVZ`-&ApIJG9$5OcHM!+^DJ;WY5-g@;4#P@qiaKw1nC z@8YIA->W(SlnB5A_9QaBZdi+!$32Fd&J}XOl_;9-x9Iz=`pIFWEiUU;b|Cj;|FbdY zl{n5>!0DkC4v~7I`m%pxkJe%@Qs{<$+aG3e_+E(sN-iAgPFo-AhxHBx9n>8EXbc++ zKspKVuQTL1%Ym<}pf^al1c+z(nQ$V^(~>f%Og;IQyaThgY7j6zIIN!r&+QyM zIN|>cM&KPvbRhu$_UKf;47xDNFKRnC#33J$KXgqIJGhh258EE_TG0oZ5$Qr}l&+{s z06!4(GTA(4^GsG-udU~CLQp;81}EkDFM^V>gQrJR(xWe0{d4nZwI%F3%?1`VaFc`aZ832&EB4N#o>Wxf>R zJy0{M0dxf8DSNN4fBSrFHPSDDB*0%RqoJYtd(G~k{NS2#10A}y()J<uy;QK~4Es|m*{Dhjw>$mt4NSzTE~MMVh80d()a&)=FOX= zX)CVl?$7=2JCir_&hb3+JfFGVW8N8^7pQx}t-p-9KW=yO_vaT>QtK~6{iOCUZZs7^ z(dV1dZW-jS0M1IV;?{?5P0)Ydgf!Ham2ky1<(hnUpc@1SN)dq8;U`5nQ(Av66(Wp6 zr?^IucMu%xm_}pDRl=zT`%xF^Nip>SIl|U#|Dz$d8S~JZN;f0L&C)8g%JXbHJIvlh z>z|7PDhjp#Y%2ZB_#Q6Q{zY>N)lZVFQs|)MkDdv21gjVzJgW8MR-Z;DH*yiJAMug4 zUjYQ8+rAixsr?_rlti?DR!jR|h_5skNIRr=p+}G;h&7P+1=RxfpYZw%-G-!_G#t#(c~%Q$;h>0;{;931VziMhB|jkB|Cv zlz#QvZ40*z#5)P*Yl_-ch5#o_IBEZ?+3o?h)&A8@a(no`W4oX%z0Rfa-yel9 zeTP|F`~ET42UI@g<;VW9A_^aRb3T@Nt`0uD@UY*1?AQp&b2jO`Rm^kti4mS^I<okt#{aLH zowQ#zP@5s_vrr1V*mtbmSB=URRy-hT7q#z3)kc3vORWMUunsBcqtIyi={#PFN6$$k zf9>txv$ys3DL4^1mV%wekRA5i-=u zbK#}YKZqC_`~8Tg(O+r(J`qnn1l^C}` z7$W_#eA-=^@&l*;1K+Qu2k{12et&r(?S$ckVV|YH zS&n}gRLk&u>7G!$bZ_~%vlEXD74McI?Of0cve0k+6LL#Y8FLyQP^{mutwC5 zXj@i@3rN`(VJHvN22r+Tty*-8ipBk(LTe1gBTZp+{&YVbEdk;UAqiwTP=6F2!krM7 zfNng)v`YTcMXLcE$kIR)rj5$q7cBwF94!I-Rn;Uwd^HJxUPyvE@()W;cm9w-ni8@R zT$D4Si(sIHDy~9T2<@SN4J)H|QPDp(o}QfEoZXH!!hHEI44;d^KNEG_fe|26-08J9 zPi9+KC8iQpv8@Pg%Lc=@0~h6gU?W4V-OILlw|Pf-&^(0kLXN!{AyD06EVvGpzsr%k zcMF@rc2=XOR3_0c(3xyZkSRm);N2Wa5bj>!CkdWIypK(9Js8%|pVa znUn0yC#_(sSmzy+J`sL=*>i@q694}yy^bYnlgwQkT#w^A%k>`?`KwqeO0o(_<)YN--Dt8Y$t=$i;22%;jR3;sarP^InXj~TwH#@2 zm*8Cjt$ZklBTV+!NBU@b`ik_Qp>Kz`gKv6Y^^WjdFC@r;?BAg7Oc7TXW~|Z@k)Q+; zj6!-v0`gC9J-t=;ZYc9s(_4EnON`3ii!`$9L)o7hJa0DYz~D2V(265e@>;~pZq>g` zpPQ6p&31d-xp;yv{()&ON=>v_Su^M%n?hDrcwm2yy)s+zFG1Vf0X<|x^lqyoo`)_EiQdK5%)8Ej%We|ly>PsI!& ze&p9ef8|PC%;RHa{*z0T1Rl0ud@-W7i&dT3Bn?t|5Omn{E1@Rrn8hSu?Y8k{jW5Uj`e(dSjuf0mwfY zn4BuTm|S&gq`-UXy}1J5Y&&ew?Mxh-+^aiq>k61=9#jrU9D~dJ$JQ$$}L(S&2!h` zi|&a_)(+(-bIK|Ll;6{MpGj>GZ{qQEG=SdQs!y_XNa&`+clk)47`{7|>5IJ+2kzMX zcyZ3jiXf%m3_ClDzC+URv~gW>8s+Nb^qJ@#eNp+R9r!rMb&BJGy_{bT`rWE1`ewW^ zcXVzSXD+@Oru=hb=#Mkk@rI{z!u0Yu9FhNDEq}BWyycbWoY1V3ntpT=0a!F)*b2tv zxkK{%|B8ypTuu3nwG|72KoR-~k0wMi0dka(k-3)v@un4b2)?VnE4~M?YS|IrSzlCA zaf<7e5@}A=tV&}=ZrO-)xIR|edM?U2F*dpC{~trZth|b#o}22M@-I&R|Nm#jD9g0R zEC&)-nyq+dF-2QwWmkocuG#> z+Fefh^ZaL-o0+F3&O}Gh5TYfFNN9**CK>96au&JF^Pt-bMB$rR*PF;?*^;{9TT7Eh+w+sdIsU@=&tynsa@)Y_Un>!la4r04}CKnuO}bsv@W@P{Mlbo z{EjyJ#{bQ?E_vXnhi;~L_ptT1Z=AL+`ADm$QYik4<;j#)H?B*r>fWe1W9yQmEyXXt zPL3Z^vgbEMf6&}J^|mhSl1I5aHlX;DX7|-6`nww!x+Gth_|**`DH%231Ygni^<;`4 z?^u!ewsu`|y}lW3Ar0`75$Q1Ct{Y|gHw3+;DYmW5_usK}+U6F%o2KcO)wj=7%m077 z{Cysur#$16Jf%4lwlMR-OrPfk&x<(srBR5_^Ki!Ej6bHml(u-{!xQBY z`G0Um|D2&2Z)Nn!D9Bir_C(r~NdLI_|9#qHM2llhT1~6)7@RQ@^u06w3VJ0h){Ui( zjwky3jNzrjOGlJOhu3jVSI9yi<)7#WSJOy|snxAPKd^L2#z669hv*;wslWg1Zbvn9 z`=^9e6RQZQ2&f3C2&f3C2&f3C2&f3C2&f3C2&f3C2&f3C2&f3C2&f3C2&f3C2&f3C z2&f3C2&f3C2&f4BPa{CJtQ}TfjZx1Z$u!9qEMiZSLq8qvM@9=U;fsOzE;Ej z&7qz^sqqp1|D9)~Q{?*wV+|!RpFi|<1GVm7e*0F|iB#6hrmu*UZ;z=ZM3=odkL>|t z6U4-$KKQF(=@aFuKvhs4ALLpQ_%9eAVhfo11!@^}nILqMTX$V4e(rEHdMnvzO;!`F zhwJuRJrtr_K>xm=n;aNxPfD2^=vMTo@Eh@c8fX^i{KCtOe)N8Rjj5eiUIsmxU71^N zfz|K!BNbb{zfTsdA3$HW>ha4&FUkA+6~7E;MsjyL-2u^hep zxefL}_A=~YLTkAzM(@WocoTB)T0%iqEGcaKixS@`pw(NECc@Rs@DZcO&9nNpvYd!@K}_?tpGytsn6_tX>6Se0%|G|gX&uk9MJnf?afYs-@S^N=UWgQZx* z9|5G|OlXQQ?Bn6DcRxm|xfd2_kXC$~ps$Y@e6TV$M}P-@IwG;;(^5dl6ndjeTnYX0u2!pQiye7{!IGn75TwE9kXntw zWYBKWZP69BFPmOCj%k-H@k_KaDt;bTHC?0R5+H#T zk1+eMf6L5yPP0moK#*3rFFsCLPM-Gmj zIC|mm4#)X$$a_2F#bF-;cSs9O;b6#)W5n$^AKF4QnOuZV#8HG}#IO6YHN*R{4LC|i z+{D)FUe~RUe?4B3PzK5C8*a2q(lWL+X+8g#(;&BJ(YZyEbT8X%++mcYM_7^m9!rrU zud#%6J0CNDYknx{A*5@{K1lii?rrQV)5N54;4zgwWZr0&qy(01&#(`+Q&@ZUP{O$c zb8=Sle>%@|R!Qo?UN@eD4ybPqmm|X=Nt4(f-8roN9$*Iy#|>$T_7q#HB<*LedTEIb zY?5?48wjbpvu<%kmL(~Y)SHcn+iN{zEkfu6h?{I5*myFK*u~n%_le(_xF=DPp2Q}t z=7jbMo(A%5+IB|znt2w`c?vs0WSPk?Nh{dEI7wQ`%qbHaN>~FcFQq7DAfJp>xD;w1 zb$vvaNb>a&E|Cm6eH`5n!}#g1xY&>N>*)*&uT%;5ntw)Ps*Oy@)f)_0kDn#hGZ;AM z+PF9aoiMm`&D*S5oZDT`Lq>6vk{TtG3AqhZQW_*B*&D)5YSAL8QKOWU6yY{@Vq12* zy-~x4Nl8f#hofObdy*Y4ILDI-xwPs$KHD|Omx9fUY%Re=(UGE`dFC zAr4=Z5mh7Pw_|e;GJ0W}6xdq$BV2bO??J`b#Hc6Z;g& zei5He$s+L{$f4CXqZ~zgk2YO980Vq1NFDYgNHIbt#RE4=RKZU~i8~t-gsKS)B|=1E zVu&!-A0iUz>HN2oNHh}+)w+pyq^Gm=!a|t}A944c05cwj@FkNzHvRV7H9eUII`Ph3 z82q>0rs=7nl^=)$!%8-9^?Ypd`oVt`7Qw=lvz24+eC%`s#b3k*Vh6tc9){J82Q?Yg zpU>Xa^qAXYu0nr>{pr@12fZ>-@gHXQEqtxl8@&|& zc6O6rPA{(`^R@PdcMmr`kj}7{W_SN~tff3p^B&F^);8+1pwEI?3sS$HaevwmTWS8d*1*W)VI z(Q*OxdBVzzhcI@y>EDFC;oTD={q~T)qD3I2?*g*37Azkp`e8PD)s!WK(^Oj28b(1f z0nbUu#Ky1dA=~G>9~1F}A=%L=v)a<%-0Ah+ulIgF|FeuaBA!+S+K(Ne2CfMTf6YG` z@57!4iskwyrwC$CF`~S7eWbnhbU<3J2ebjDscf_N1@F2ZYj0YI^6$i2+gjDXteLd* zO#PRz;8GBKpa!u<<3Yp4_#59>C~d_hRiY z>`8>DzSxeM88ucT?S!7=&T*GmmDT0l;!XA_^qWC{8Fnr2wc(UKZ?mfme(~;kGu{(y zVVA>#1<|jrz^aIf31W4&*;t8CF|=xJC+x$l7$frTh85#wXx0iLHWwhZh z!y0A>Ang@k^0nYctLIsa7Gti_r})8z*54f<`~i#z1J~GsIYD_$4*-J=;8TfJ++>5t zy&8iK>+ePUjNWvIw$%oTUcV<$6cDfQk%mSK!to@|?W}`+n*ANDIGH1;X=V8mtP)Hs z&XSS+%KEe9Pea;a_@`B9WTRnLO(R_+<~D}?0)t2jQdj8DvsqYY)ra(zf_@uY%?|1>87{KlV7)~Sna)C{PWT@Q4jj^6V#__N z3(q2-9jH?Y;C2N0O~?C<+3>f+X3aNfr@)saRzu4MRadP4*byt}(KYh->^OVLdy$R6 zT8kUt=g61p{VA-2M}9)7A?|Y$m>xcg$D1S^){vi2n&=;he~*aIhSbG4%0m83R+8y6 zY)dV%yR{ARz9&(vq?X}dLf_g@BVx}aXr8(5vl z4?EtkDf2HuZIewgu3w9gyW*!UGf{7iIr<#_UDnhrdcR`^hb};~Kg(lYYB7O|V2&pz zd$D;hR;faZLi{11d5>5h6?ZbAK?^c;H8;lfF&SEaG9K@gQiP9q1Or8dTe1!;5drXf zumWW-Rx0|R9Q~};+j!+|`7Ms+;Hd!e9*jEkiYQ}0JLT`3argu2#@s#2$L-4Tv&rmJ ztZn)}yCCX_oSQ{g-`cWKL9@OcWk2-+9kDw5bU8b;w=#d_hP`<^d&&Xuvk%xttb`~V zEcX@Sp!gLIp#)(LQGUUJbhYYotofD^#@ozC06O(RxscrlOV==jUv}9Ftbn*D>taCo z(VAwX9#x^v;|(86*R?aIvkAHt`e#t!a?hKK6jz`l`qew2N(eu=xY2*i5b-3z=CT7tr?M-brU3ZCh4{>7Q?tIy%HcVvL$vy& z7A4*vB~Nuo-lbu$d9gVsJI9078w0rVLy6yml0Ss_Ebw8haeP;^#Xwt4Yl$^Vya7sH zsf~;sSh6Lns4ysKDZUh?z67NoAP>yZZpFDJ?sCVhM0t<+DuLTJ{L^ZVjNL!mT{)-X z>@#0(>av^eNJ`K*U>g;*zzgUn7<;ee{Oqf}Doy>ex`_9`6iap%%Afj=#g88O_)6hD zo|&FYjNV$`&DyZ1K=~#50rL0l2o5Du|0?r?O!v zh8lA>_Vzf9va1yBc(ys)l&9}+7-jrSGaCG+BHvlSy_mg@^_$TiJ?%Z6J+q3cfHhZ&34Z7pr*EObQ+Ambo>vq}Lw*yC_XU?Mw6z z)O%9?LHP4cBTSu5v{ko^`7}sy1Nsf62bevyVqk@TA=_Xhn~3Azj-v#cz!2c+1=m8cUmc*kx`wYacx6;WFNht=wG z*37jSshHXSt0H1D)ukW&Nk=hXVY7D3rfQR>&5}UzMiFltDdEvrM{c? zD8|aPVs%++moCJ+TupM@c59OBbT`R$A)u|OvDDgqIETOOt-jlZz17zi0pr=S@kdK8 zjlYEddoZMrA0L_WLVLI>>-l4T1E}H04yH7#P}xOOZt*k%2St1^DDQzrQN3uaiS0!6U{*>|&VWZjsAS&mKchRpzbOu-P`71{4H%KiE*#3p*GtsGO-ar?$^; z)5MjZ1vkSjPK~bC8Trj!sm}Y_WQc&I)=k|Rt+}hauX*!{zD%T>MkKCwO`GSp$Vks@ z<7%DRJwHFGNosmpe*28J-Abk!Qqwci^Lc8^Hf>wGocV1t^BcQ(YTHa#eiPSJp3%0s zGyT>!`Hfq{H{{Rfty6iL!c9m+xlhe#+gi>&Q}Ce(S)HconN6LpsWN1cm$z=8*(SAlCKwuB zLcDxWYC9Kcj!a33<{9l%n@^3xOVhSZzKoNzDZw$dW%JbZe82_>TjzURZQ984fYzPb z8jKS&vU=oOTQ^PTuFTAQhpV|WH6M{#sZA;6RFn~s=F6fHnn`V2w`uOmub;uwx=*#D zND2S8ty{P6=F1ZMpSHPYRB-t5+fH?_YEt6y*>c;XdW^#uOV?v`RakC1YulH#FYBzW z+$3S{53MOpd$7^^(=?J)>ZrfG7++zmFb3V_W}T>jwDK_3Ycnf;boTw7cXi&?;B4O3 z{W-gH7UIrhC+r!Fjald$QaWc&ZFOI>*-c6u-R!w$cPhsA8_+A!9z|~S;Mj4%bi#ht zcEV2iyMr{NhjxIni~NJ3{4pYEt27lxC4cHw=uXDWidIyZ?|rnx-n1|6m1~NZ6fXhY zBD4ouy}J;-V#r`yVnk@Qp@}otwV1r{+e0+$^_8NrXMw zp&wx+n?S%5+@G~SOYswS9#}FOoz_Tu2wNLilZ7AcSr6$GF_MxY+9gH%vrgJi+C>0p z3qiXC7OVemyKhV!ceXT`BeN{ z%XF0{>D7HJj`cgA<6}8=*K-y-8wD{AqBCQs-Jf=8bN*|QjkXRf^9TF^G2CF>p)TAndvK<8WAc*nuo8adIs&J{Bvob}d3E1`6WDo$vP16s z!2P)Ff&a8SMLK=H@ripEi|kNmE+Bs@dD(dAQa6%as1FTAk|STX$mJjLit-Po3YET1 z@m4E+%=Suix3VT1Lz~*Ua9>*=cLT;yYAUm!J!lIQdIJezc( zYs5oJn0VkXkL7ZK5dHqFB}E>(go2?m_kdb>;J;S+UMrq>(lc51HMl~= zTi$Sp93DU_>X9NoT7AD4t-5cU?wRG8Uqzct!kW>l8saJ+uc?KlC7#LZA+;B@aUt88^~BQ&Z>YR}*rB!( zF>-xTLWm~=S~Ol;Q74Ee`A*`=1zt5Xse9t~q@(TbPM_iN(ay2kasO~9c0}off}ygQ zULo6Al^+0qkEHA!bOmE*0GycA9{b;Ud}N8<$NGT-3N=LkRK)|r&ad$%p9a_M0bUH7?|16LxmkN9|wUld2h;hPzp0g4^%?<^zW8o%_dT z;-wiqzsSJTvmMxhr9HcPOX9AS6K$q9_cil5Apb7h0Zu^;ROH_lknNX8-xEc>jmh>) z)D9}^SyeNuX2D*mT7+K8CY7MhmWUd%SoA}Zwov!9@q5d0Q~}z6Scm#I9um@XB)SKe z+iw;^=!%7*bk<;BjXX$}7z#mP*!aU|bV9U>q30$_A3%Ku?I1!SaxYwjw3NOOwW}VU z|I+;+`IayzC1@@Pj|rAmcLLMRZah(D1RT?y{vzsv;xgq zC%N$%OAxo@K3siV75xL&A|GZM!H&ao zY6_`tyfs3qw|9Abpr?^KL1+`#TMT(-i~4X9Ig#esxCZZp5a!T0H2Ez5t=(^#-ZBkX zILeXbRHp`gIL+rPl^hgzJ)|RBO@Gsh zycOm!9x?JOl(K7e%C?&RK=Liq+c*RsKS*Dl+a_m9esX@YBgGLNUYq`H3vvrc?&x&l zykJv7Y*_93w=E#a3r(XKTmqc!yZGzNP^eq6pje}nnY<~4+0q`Yl!nZoo` zA8OVAGv}v5SG^<7VQ|PYQLeOmCD(D_rREECa2hu74tcgG^&hKdgT&^(JSQ z<2uK6`B~wXz#UG9GoOe33V+HgR)2TF`aIJ8wq8AYDR^Z%+Bn+eXNKvc`N!%{^rZXP zUW0nwX};4uE3e?1`d9A*HaV4kV}xl$uL9Fe*U+C3jP64=IhB4xk>Bh{bR_1R!}2Tq ztLrb?xRc}`pVzC`aMP@C{pZV^%bW-KL4{v5|A_wRA%G{*Psn3m@$tL9u5Vbel z|3&I=xcp<~-{h40!4UmFt^X#c+z%csko&LG=7OaKOHZ3+A4wVMXCviLv7d+ZAJ?n@ z!b#BoV8H?BfdYk|&WT##FYpWZe}aCctpB~e`kN-1^GtcY`k8u0mH%(hZ`G{-vHC0Z zbB=kAd8WBvl>YZc(}&uB&GJ|3r=pu8zpVe~;r3Ot{AK-L$-6nPXRm&}l(LPXU#ak~ zOaCExgF!vnyw$ulZ>#wg^mccc2#1?(uSEA>q4IY*y9rE*n{1W(={L_c`^`f{Z%G^m zn}$TwhxL!;5UHQ?_@~HEV7GrH&~2Z*q1ka8VzIe344nk%`oPM)p(u!VQ&`Qb$7c zD?`+RUMW|(+#&n!YVwE5zb^gLRbo+OOlHS|x9pR=@Y{hD^pN9lFyPg+n5 z?^ZzNHfQOak6`IP`lwD{t^F(1K#=eQC%RrDt%dGFf8j%jxE@3*S$|!)cMjEng7kQ$ zE`)W5{(m&B_+Z5%;!*wjC#e>C(tl23Uq{5w>4%VN^2c7~h3dE{-8n#S&LeX^j6M)@ zYczgJ8)Fk^p=e`0OQ>y8&^o1easgF?F ziBjIeh5j;rpRcT@f0XVrdUbFBy`p~~aUar$jlo|+r7p`Z z|C9cIgxpH0-5jI4GEU2>6j!E;?LlMdmDF{)2M^cOKT_wbk3Wk3xEC#e z4YkZz{Uhi_-+wB!GKpx5=q<)RbH4FXYj)81yoJ#i0>& zTGaTFet-7+r_Dlt zMQ<@)e5$0X=0;y1p&lllPCjjhO^&9oG2TRRQ2Gl+qiFqa!TliJ6D#AMEN841M0wDu zwCU>lk2TRfaWuU`9k~vZ$6>*{pnq8Y{#5=^a?0n1YR?4d83ElhQ>&8c3BTF#ljE!7 zr|^lsua?tqDv!;(*KhA8!jWHQbqH|e41Lh;o9$vR%|xSpsAgj*no$@fJ{ ze;az901omq0=jP^&Ncc!fkE_jPcug|Ase|=HuCkl(*6{k!sRb8h`#QrE}N1*`u?Q7 zqsUP-quGpRor*dY<+m65EBqCAle4-Uk?>7UyMyAY>{Ua_wF`QMzv6CkR+l3ZPH08- ze=+)hez^UzW}Qg3W;5C!jI`P4_D4F^rT@W#_Ks!;g>1{(=ZD5kwvzEb{5 zoZ{9dhZ5J+(Zf;bXws?4jKcgL`Lg~>oZ{9dhZ09_SofInKX{m=qtYkIB2Q>z$K<;8 zZ%Vb3>JKEV`TSNHnM@AYd=s^>g6h2G=OA^<@tM;ITCbzKqkFy=9E_s;Bf81YSw1hQ zTMimuNq=$u7o)$-$LIi8k_@udv^2g7{pp!+jrLE{HCxu~ppdLq`kEZ;3i)9<>Y|dv z>yqPBp;7JSAAJoVbBV6|^c+^nv-a|jTmvZSs@MI{b67D}(s)_Z*5sgY!gUc!T6z9n zms|a*ZG@K2qGgHIKXMIF69b|Z&!F)XRpD4uf8`pWE)7B)YSB3sg}OLU-mz(G`hSQz zLXYd6sP{hdH2^&qm#>3ra-}E86sq99hMxOS-52#=xdw<}prljW+|cuzS~&j*ME+T- z+&b%t!YQO{tr*ZdlIWv0Oz0gzT^P_ilITOeHdJ!{f9ooGjWJCX??Gy-2lS34`XH$VWrS1`TtZ`;qy~nMOWp% zCtA0|4+iT-$hqBq`4Q&JNHrhwUR@|(RTuNl(`%mH1%=-2s;UY(cbavB5LfWfcz8@yVt z0TWOR0ZkyzukpuuHQqSPGl>hZfZosidN1?pC%f)+-Q{w+rnrh+rE$YtV_i~Qd?M3~ zbbhP9+jWm?r>&enY5h8GI4_MWjhl*CIsRT3(~Q;awY^}yli#0m7x!Bu@o6?&{YuAu zuB)0Iwn3otf-~7$_?w*Qr@3B>TOX%Q{lI3>Q21?pvyD>q<=tJ=UB#{$u2149g+XJ` z3;_L1*HBky*ARXiAHrvW*KF6EaEj8n5`+xlZ*ZS$CHK4LBHd!^JlA}rSm64d>kWQC z;$P(txE8u@;ibGU_&wea*GStaTe2<1_N>t0 z`NYxiMcXmZ`x)2ZMA8q-CeTziXB~C`ud1pn z!?YkProTj}WP<4bDol;3Py#RmrmV8EO04xtVXUlDoHOS42gMg1l`xpb><^Yz;6$to zTZvVW1C{;?zsMKa;sXxMovMUY)`}I0t3U@)Ot4&PDuj}bZTI{A+mA_XZ~t{&AL{bA z>EGV5<%MTb>milicGvv0HSK<**L zof7k5p+G=l+j6#cRqVDL=9LWzqAapXYi!H>t18!x|03ta(~|#-weM}&7I>gonQ1y( zDv@-UJXc)tfUm+Rp?Q9YnLv$L>99e=M-=oP$uKW&C%d1Oj(VnX@^_OAiCAxACuY(O z8|xm2wR8;gM0^J}N{VNPC;j%2NvqdPDJmT{7XFdn-hI!`@+ZF@URpX;g8yDNcJB*! z-hY>0_|t5a_g&pFsMK3pT6)Wyk~HnL_1X^%rKPuRF7@{9KD~IxC$FtH7zUKi9NKxv zZ9`_2&YnX7r6r|9-tevT&mFRO-uzD%{O*nWOJ99p;Vq?oOCS8hL&1kx??t6gJkn{% zqmMlC#^NQ&bKug)djG!Pq7`rKetbmv6Hh+%(J)qCUjFp5Wg|w8N=|v!V0eDCSnnq} zd5qzi!3IN>rb8xC|A#qQdUZ%H4$-t?x+-%gyKA!C*k9m{6Raot{0R z_(a8tihX5AFk>v>r&P0X7+-)MD9b5ZhksR#b&N{*oUvK{;vJit7wo{q)Q;BhI$p}W2AjmhpVnsN|@g2I+`1B2i?H| zWj9~K(o@oe%U!O%T(V_ChqL3POI3TN=X?(7VQHUqL^>>$50zGzufF=_CGe;MF5kGX zN~?X6v|5_HI^)Q@lC|<2_)|VNTzN0I|F$MTEeF10X_u6HB#`Tm5;TArw-Ld+Ne55N zp3fvrm9ElQVJ)+kE&l!%Y39|#-Ojk>GMjbc%8B$N=||3vq7sp$ZAZ2pQ5dW)+?RF2 ze%`#gFgM^sCRI8~l)EIAOJ^b7Q_?rmRp@)+$}wrDv`D&AxdI*ASz966V=gqxH91i^sYK_^{h|w`{u0fDsY#iv#XD}KWzV< zrNUT=n(XthE<9nsWFS0zek#w!MZ2LnxGg486AHy+PQO2N9^7BJ1kYmEknt224t3lxa(HK_OIREbmsR0RIp z5ulv|V6a&M?MoqhYWn|uT1I6_`C}a_8b?VEY>j|yW8*^-lDs0mnjdQjM$!`_9H9hI zQSgsSPq9&(G|*NII@-sA(7>AUB#FkT&|}vHK~Je*XnjHw&R91xwO^sgLnuomWBpO`Qh!z*Kd_3FhZqlk zc73W#ThkYjkIqD|Su;^|h)h7^6;;<7`a~!FQRgy0Do{!{DK~iyySO{{wglSKU80gv6W7)aM5`Zf$Wz%kgz}EjjAYueYiZ4i(rWVYW*4U zLliEU=u9@^RNl`|FrlVN*HhOtwfD*)&X`kbwkBHZ!PQu;7OZ)0#ynFKyzw}!)& zVKnu$4ij%SSTyk#Ya-Go#3v?N6Y9ZZmU-dd7@uI)C0Mb#zSV>&tR^gtP6zS`F~yGK z*4P8<(ppWB$Beu!NcTer(NcOkV)(N6P~A|zXcW|^!a@vjU`b5bFmRyQkhg|Y zUAE|G;!kUOYMGcSFI&mo|f449*C#ys){ zQnF;P^nBm+T#GZAC)vEZ&Yy3RH&r|%oub)rw z^SOThu%AES=d1nv1wVhq&o}$|c0aH5^DpM|hV%Gs^Z2@XT$;yS^LfF1{>*&7bv{2a zpZk8txBiZo|Bf%XpFe*;Kl1=jTF4V0JNPUANU)8;JWAdsOR{m=lJpGc*nKezm^Bq@(XKu?mB+|I{uG!-1$8J z=6Rm+0>AqOzTpLa<^`Tv%14*-m8Cpb${WAP`@YB@e32i2k*BZckFV$Hf8<;L$S?nq zr@h4Iy~N*ni7$Mazw|OU|B1Kx6EFP}|ME}V{0i^%3cv3azUCEv_!VA%1Mjeb&)vZP zyn$=~%m@6L|LM=%vXMW%kuQ6dzy2zpvWdU5iLZH$k9?hv@A)Aw z`H;W%A^+|}p0Stzb}xT!FaLTkZ@G^@vyXqVkMsS!?|!~yKi{{XCx68AKH^J0;(I>g z^*-ize9X^(%v=5+cYMN^e!_Ks<3s<(8-B`jKjpW6%Afd@xA}~Z`Hav1jBo#ppZbia z9N^vqeAfX!>L5S!IUn=|f9?zZ`4`-Ahz~!+Hy+}94{^s~{=i|r@i0Gmm=}J@SANM4 zf63Vqo_&Pp9pO`s@IME+<0v0~l>h!H|L7>Ue8qFW;xoVE8@}SFzT&Nq@v+DFvSWPO z*ZhqW{MNtowcqjyr})>WdGT4k`Yiv;SzdOQzxN&QdX8((^MU92o9B6#@A=a2IlI8O zU*HuNxc4Ie=pwh4^K}*cLIsy9c>E>a?h+q+iKkrV?#sOOW#0KRzvVI?bD5W1=FeQ_ zuV3chT;|DFc%Li$`bs{sk`KPh{a5)rSGl{2=U4GrReVJi-(JPzBV=jRKdIkKx1T9!-tSC7>8(oo zx2Mmlzwf@+N+R*MbXDSCEZ#rouhTC3UL5xl`0wr@)4w`t=q$-6`Nk&OT5j&TVrrk! zZ>3%*=pQb~=x692Km74QE2a{^g}slDoG|r7&pQeRAbx=-?sih+;escoUjqG3TXKW0 zUA`Re7<9Tv%NB|}5q%`zL6gz7r_Z|N+@vE829#zvUQa&MX=?qTb1-#Beu@{v|grBM9E)F)F`-MB8fs(Yj6jIB$KwiLhoIyrtw$)4X3 z{Xui@)Z4nOOCII!*nr}n@oY-G(rR7u6y0x8HeKRZH+-aI)PNIwMcdbtDZXX?toqxU zu1kKcWZ!)<-WOWFmD;ZPJJTN@MDZof-l$LcOPXTa%6$JFOQ&sa;k#)>t7Y}=GYJXR zs0gSCs0gSCs0jSx5s2DLIYw4-6%!MtdjC5RsJm4EfIO z)~;Q9{P-uwKiTogj!io@t=+Wt@wJaHcznUV3+^3v@3?V`pIrI!-K$oOdHLlrt5)5H zlU1wkUiGqn@hZQ6vEOgE+mq@xMx*g3OZESX&|qt$El zTBG)-Nc9VP>=GsZ2sRnM$@KU08^TG$w9vd7Vw%B>U0~}Du*8Jv7jzfc_0c&eut3#YL^^zYZV&&@q=>hA5Vi{rJ+p<;b%;c1mh7B7vvfCZ0jT>{P%kB0wY1%BUd5ae58KVoUo6)03j~O#& z?AUQ*$HE;wx4dnq_*Hcv`z#S}e{MJgsqBYMMQ*VH(s7o3Uh|d9*S8i{@I@ z#BdE`PP70%o2`Dx0NSLa!DyE`cNrg3_$u6ssxVI)W#tK z#p%#Kt8Hehj23B4J+2YMh7K7#Xkh=mKD}=4*~8l{r*rm=Ro5`p>iAFaG`fZ{U&F)+ nlK>MRA0JazMq`}O7!zia31a>QeL{Tgkuhnjdw+t;HAwzH^re0X literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 12 - After Turtle Rock.sav b/saves/ref/Chapter 12 - After Turtle Rock.sav new file mode 100644 index 0000000000000000000000000000000000000000..717d1207fa77dfbd60863f5956f137de7a2dc141 GIT binary patch literal 555998 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

KL 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

AYQymgkOgbhIORJ64j3E{`>j) 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

(t9kjAR- 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%0D0Y}su)|_8qkR&hvifB`)VX6oz`}*HT#%jp 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 literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 2 - After Eastern Palace.sav b/saves/ref/Chapter 2 - After Eastern Palace.sav new file mode 100644 index 0000000000000000000000000000000000000000..4c40bd120615611a1dbc4ef841a63929acb9b5ef GIT binary patch literal 557833 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 z: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

rBjtbNbu+KK;=0SPn{nOP@g4JZw)%`q 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

#oX=#~hD2k2Barb0ZwU>GY7!0Doo!{RrNAnQdmr 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 Psp$cCZ}UaViNL=BHuVD| literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 3 - After Desert Palace.sav b/saves/ref/Chapter 3 - After Desert Palace.sav new file mode 100644 index 0000000000000000000000000000000000000000..c57e2cf4688bac3d93430be54f3bba6315eee85a GIT binary patch literal 556124 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%0AqZ2 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 Tqz~|OU+9*CW&Tn9iT-~8X&);4 literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 4 - After Tower of Hera.sav b/saves/ref/Chapter 4 - After Tower of Hera.sav new file mode 100644 index 0000000000000000000000000000000000000000..1c07624e55166d2c890c648db807dc94bf71262e GIT binary patch literal 556751 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�#nZsnpb)nSzEXht#Nl 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

MS^NU9toVR&~ZcKa;BXa(Y# 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 L?D>1k9m@AVd?0Fv literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 5 - After Hyrule Castle Tower.sav b/saves/ref/Chapter 5 - After Hyrule Castle Tower.sav new file mode 100644 index 0000000000000000000000000000000000000000..9c4f399c3a8958fb5d56b2706311ddf461a707ad GIT binary patch literal 555150 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 VqXdaRHac`>NDiL(OYK(j{SQO0YIXns literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 6 - After Dark Palace.sav b/saves/ref/Chapter 6 - After Dark Palace.sav new file mode 100644 index 0000000000000000000000000000000000000000..177efb7b2a02b8eb9c5d8df4226a84dd24526bfa GIT binary patch literal 555689 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%0A1x>xCKcN;7bE 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 JmQ1xS8czl|NC1o?C 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 literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 7 - After Swamp Palace.sav b/saves/ref/Chapter 7 - After Swamp Palace.sav new file mode 100644 index 0000000000000000000000000000000000000000..baf6fd9bc5e6161887dd20a4c3591fd22b2f0bd2 GIT binary patch literal 561074 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 z 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

    7cRc>Z) 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
    9A{ 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

    -S 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

    B3i}kJyFUSc4EwspA6&dszfK=W#c)X%41q3ZQ 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 literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 8 - After Skull Woods.sav b/saves/ref/Chapter 8 - After Skull Woods.sav new file mode 100644 index 0000000000000000000000000000000000000000..513ff8f3e5e8d4d19276be4b8e897876f7563196 GIT binary patch literal 554566 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 LH-9U>4W<8oV4QnN literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 9 - After Gargoyle's Domain.sav b/saves/ref/Chapter 9 - After Gargoyle's Domain.sav new file mode 100644 index 0000000000000000000000000000000000000000..8f4203039792ffbd933c7f22581a056e8498dfa3 GIT binary patch literal 553263 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

    +N8dg+2X$R(dqV%&OG=l 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

    r$*|9%3Wd-|;Q@LN1hR#<$jwsS3FCKGAaR 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%0DhP1F^2(9Et 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�?%Car+TO7ov7<4 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%0D_t` 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 OHRrqc3V%Qp2>G8n4 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 4) + (i & 1)]; + return dst; +} + +void SelectFile_Func5_DrawOams(int k) { + static const uint8 kSelectFile_Draw_OamIdx[3] = {0x28, 0x3c, 0x50}; + static const uint8 kSelectFile_Draw_SwordChar[4] = {0x85, 0xa1, 0xa1, 0xa1}; + static const uint8 kSelectFile_Draw_ShieldChar[3] = {0xc4, 0xca, 0xe0}; + static const uint8 kSelectFile_Draw_Flags[3] = {0x72, 0x76, 0x7a}; + static const uint8 kSelectFile_Draw_Flags2[3] = {0x32, 0x36, 0x3a}; + static const uint8 kSelectFile_Draw_Flags3[3] = {0x30, 0x34, 0x38}; + + link_dma_graphics_index = 0x116 * 2; + uint8 *sram = g_zenv.sram + 0x500 * k; + + OamEnt *oam = oam_buf + kSelectFile_Draw_OamIdx[k] / 4; + uint8 x = 0x34; + uint8 y = kSelectFile_Draw_Y[k]; + + oam[0].x = oam[1].x = x + 0xc; + oam[0].y = y - 5; + oam[1].y = y + 3; + oam[0].flags = oam[1].flags = kSelectFile_Draw_Flags[k]; + uint8 sword = sram[kSrmOffs_Sword] - 1; + if (sign8(sword)) + oam[1].y = oam[0].y = 0xf0, sword = 0; + oam[0].charnum = kSelectFile_Draw_SwordChar[sword]; + oam[1].charnum = oam[0].charnum + 16; + bytewise_extended_oam[oam - oam_buf] = bytewise_extended_oam[oam - oam_buf + 1] = 0; + + oam += 2; + oam[0].x = x - 5; + oam[0].y = y + 10; + uint8 shield = sram[kSrmOffs_Shield] - 1; + if (sign8(shield)) + oam[0].y = 0xf0, shield = 0; + oam[0].charnum = kSelectFile_Draw_ShieldChar[shield]; + oam[0].flags = kSelectFile_Draw_Flags2[k]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + + oam[0].x = oam[1].x = x; + oam[0].y = y; + oam[1].y = y + 8; + oam[0].charnum = 0; + oam[1].charnum = 2; + oam[0].flags = kSelectFile_Draw_Flags3[k]; + oam[1].flags = oam[0].flags | 0x40; + bytewise_extended_oam[oam - oam_buf] = bytewise_extended_oam[oam - oam_buf + 1] = 2; +} + +void SelectFile_Func6_DrawOams2(int k) { + static const uint8 kSelectFile_DrawDigit_Char[10] = {0xd0, 0xac, 0xad, 0xbc, 0xbd, 0xae, 0xaf, 0xbe, 0xbf, 0xc0}; + static const int8 kSelectFile_DrawDigit_OamIdx[3] = {4, 16, 28}; + static const int8 kSelectFile_DrawDigit_X[3] = {12, 4, -4}; + + uint8 *sram = g_zenv.sram + 0x500 * k; + uint8 x = 0x34; + uint8 y = kSelectFile_Draw_Y[k]; + + int died_ctr = WORD(sram[kSrmOffs_DiedCounter]); + if (died_ctr == 0xffff) + return; + + if (died_ctr > 999) + died_ctr = 999; + + uint8 digits[3]; + digits[2] = died_ctr / 100; + died_ctr %= 100; + digits[1] = died_ctr / 10; + digits[0] = died_ctr % 10; + + int i = (digits[2] != 0) ? 2 : (digits[1] != 0) ? 1 : 0; + OamEnt *oam = oam_buf + kSelectFile_DrawDigit_OamIdx[k] / 4; + do { + oam->charnum = kSelectFile_DrawDigit_Char[digits[i]]; + oam->x = x + kSelectFile_DrawDigit_X[i]; + oam->y = y + 0x10; + oam->flags = 0x3c; + bytewise_extended_oam[oam - oam_buf] = 0; + } while (oam++, --i >= 0); +} + +void SelectFile_Func17(int k) { + static const uint16 kSelectFile_DrawName_VramOffs[3] = {8, 0x5c, 0xb0}; + static const uint16 kSelectFile_DrawName_HealthVramOffs[3] = {0x16, 0x6a, 0xbe}; + uint8 *sram = g_zenv.sram + 0x500 * k; + uint16 *name = (uint16 *)(sram + kSrmOffs_Name); + uint16 *dst = vram_upload_data + kSelectFile_DrawName_VramOffs[k] / 2; + for (int i = 5; i >= 0; i--) { + uint16 t = *name++ + 0x1800; + dst[0] = t; + dst[21] = t + 0x10; + dst++; + } + int health = sram[kSrmOffs_Health] >> 3; + dst = vram_upload_data + kSelectFile_DrawName_HealthVramOffs[k] / 2; + uint16 *dst_org = dst; + int row = 10; + do { + *dst++ = 0x520; + if (--row == 0) + dst = dst_org + 21; + } while (--health); +} + +void SelectFile_Func16() { + static const uint8 kSelectFile_Func16_FaerieY[2] = {175, 191}; + FileSelect_DrawFairy(0x1c, kSelectFile_Func16_FaerieY[selectfile_R16]); + + int k = selectfile_R16; + if (filtered_joypad_H & 0x2c) { + k += (filtered_joypad_H & 0x24) ? 1 : -1; + selectfile_R16 = k & 1; + sound_effect_2 = 0x20; + } + + uint8 a = (filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0; + if (a != 0) { + sound_effect_1 = 0x2c; + if (selectfile_R16 == 0) { + sound_effect_2 = 0x22; + sound_effect_1 = 0x0; + int k = subsubmodule_index; + selectfile_arr1[k] = 0; + memset(g_zenv.sram + k * 0x500, 0, 0x500); + memset(g_zenv.sram + k * 0x500 + 0xf00, 0, 0x500); + } + ReturnToFileSelect(); + subsubmodule_index = 0; + } +} + +void Module_NamePlayer_1() { + uint16 *dst = SelectFile_Func1(); + dst[0] = 0xffff; + nmi_load_bg_from_vram = 1; + submodule_index++; +} + +void Module_NamePlayer_2() { + nmi_load_bg_from_vram = 5; + submodule_index++; + INIDISP_copy = 15; + nmi_disable_core_updates = 0; +} + +void Intro_FixCksum(uint8 *s) { + uint16 *src = (uint16 *)s; + uint16 sum = 0; + for (int i = 0; i < 0x27f; i++) + sum += src[i]; + src[0x27f] = 0x5a5a - sum; +} + +void LoadFileSelectGraphics() { // 80e4e9 + zelda_ppu_write(OBSEL, 2); + zelda_ppu_write(VMAIN, 0x80); + zelda_ppu_write_word(VMADDL, 0x5000); + + Decomp_spr(&g_ram[0x14000], 0x5e); + Do3To4High(&g_ram[0x14000]); + + Decomp_spr(&g_ram[0x14000], 0x5f); + Do3To4High(&g_ram[0x14000]); + + zelda_ppu_write_word(VMADDL, 0x7000); + + const uint16 *src = GetFontPtr(); + for (int i = 0; i < 0x800; i++) + zelda_ppu_write_word(VMDATAL, *src++); + + Decomp_spr(&g_ram[0x14000], 0x6b); + src = (const uint16 *)&g_ram[0x14000]; + for (int i = 0; i < 0x300; i++) + zelda_ppu_write_word(VMDATAL, *src++); +} + +void Intro_ValidateSram() { // 828054 + uint8 *cart = g_zenv.sram; + for (int i = 0; i < 3; i++) { + uint8 *c = cart + i * 0x500; + if (!Intro_CheckCksum(c)) { + if (Intro_CheckCksum(c + 0xf00)) { + memcpy(c, c + 0xf00, 0x500); + } else { + memset(c, 0, 0x500); + memset(c + 0xf00, 0, 0x500); + } + } + } + memset(&g_ram[0xd00], 0, 256 * 3); +} + +void Module01_FileSelect() { // 8ccd7d + BG3HOFS_copy2 = 0; + BG3VOFS_copy2 = 0; + switch (submodule_index) { + case 0: Module_SelectFile_0(); break; + case 1: FileSelect_ReInitSaveFlagsAndEraseTriforce(); break; + case 2: Module_EraseFile_1(); break; + case 3: FileSelect_TriggerStripesAndAdvance(); break; + case 4: FileSelect_TriggerNameStripesAndAdvance(); break; + case 5: FileSelect_Main(); break; + } +} + +void Module_SelectFile_0() { // 8ccd9d + EnableForceBlank(); + is_nmi_thread_active = 0; + nmi_flag_update_polyhedral = 0; + music_control = 11; + submodule_index++; + overworld_palette_aux_or_main = 0x200; + dung_hdr_palette_1 = 6; + nmi_disable_core_updates = 6; + Palette_Load_DungeonSet(); + Palette_Load_OWBG3(); + hud_palette = 0; + Palette_Load_HUD(); + hud_cur_item = 0; + misc_sprites_graphics_index = 1; + main_tile_theme_index = 35; + aux_tile_theme_index = 81; + LoadDefaultGraphics(); + InitializeTilesets(); + LoadFileSelectGraphics(); + Intro_ValidateSram(); + DecompressEnemyDamageSubclasses(); +} + +void FileSelect_ReInitSaveFlagsAndEraseTriforce() { // 8ccdf2 + memset(selectfile_arr1, 0, 6); + FileSelect_EraseTriforce(); +} + +void FileSelect_EraseTriforce() { // 8ccdf9 + nmi_disable_core_updates = 128; + EnableForceBlank(); + EraseTileMaps_triforce(); + Palette_LoadForFileSelect(); + flag_update_cgram_in_nmi++; + submodule_index++; +} + +void Module_EraseFile_1() { // 8cce53 + static const uint8 kSelectFile_Gfx0[224] = { + 0x10, 0x42, 0, 0x27, 0x89, 0x35, 0x8a, 0x35, 0x8b, 0x35, 0x8c, 0x35, 0x8b, 0x35, 0x8c, 0x35, + 0x8b, 0x35, 0x8c, 0x35, 0x8b, 0x35, 0x8c, 0x35, 0x8b, 0x35, 0x8c, 0x35, 0x8b, 0x35, 0x8c, 0x35, + 0x8b, 0x35, 0x8c, 0x35, 0x8b, 0x35, 0x8c, 0x35, 0x8a, 0x75, 0x89, 0x75, 0x10, 0x62, 0, 3, + 0x99, 0x35, 0x9a, 0x35, 0x10, 0x64, 0x40, 0x1e, 0x7f, 0x34, 0x10, 0x74, 0, 3, 0x9a, 0x75, + 0x99, 0x75, 0x10, 0x82, 0, 3, 0xa9, 0x35, 0xaa, 0x35, 0x10, 0x84, 0x40, 0x1e, 0x7f, 0x34, + 0x10, 0x94, 0, 3, 0xaa, 0x75, 0xa9, 0x75, 0x10, 0xa2, 0, 0x27, 0x9d, 0x35, 0xad, 0x35, + 0x9b, 0x35, 0x9c, 0x35, 0x9b, 0x35, 0x9c, 0x35, 0x9b, 0x35, 0x9c, 0x35, 0x9b, 0x35, 0x9c, 0x35, + 0x9b, 0x35, 0x9c, 0x35, 0x9b, 0x35, 0x9c, 0x35, 0x9b, 0x35, 0x9c, 0x35, 0x9b, 0x35, 0x9c, 0x35, + 0xad, 0x75, 0x9d, 0x75, 0x10, 0xc2, 0, 0x27, 0xab, 0x35, 0xac, 0x35, 0xab, 0x35, 0xac, 0x35, + 0xab, 0x35, 0xac, 0x35, 0xab, 0x35, 0xac, 0x35, 0xab, 0x35, 0xac, 0x35, 0xab, 0x35, 0xac, 0x35, + 0xab, 0x35, 0xac, 0x35, 0xab, 0x35, 0xac, 0x35, 0xab, 0x35, 0xac, 0x35, 0xab, 0x75, 0xac, 0x75, + 0x10, 0xe2, 0, 1, 0x83, 0x35, 0x10, 0xe3, 0x40, 0x32, 0x85, 0x35, 0x10, 0xfd, 0, 1, + 0x84, 0x35, 0x11, 2, 0xc0, 0x22, 0x86, 0x35, 0x11, 0x1d, 0xc0, 0x22, 0x96, 0x35, 0x13, 0x42, + 0, 1, 0x93, 0x35, 0x13, 0x43, 0x40, 0x32, 0x95, 0x35, 0x13, 0x5d, 0, 1, 0x94, 0x35, + }; + uint16 *dst = SelectFile_Func1(); + memcpy(dst, kSelectFile_Gfx0, 224); + dst += 224 / 2; + uint16 t = 0x1103; + for (int i = 17; i >= 0; i--) { + *dst++ = swap16(t); + t += 0x20; + *dst++ = 0x3240; + *dst++ = 0x347f; + } + *(uint8 *)dst = 0xff; + submodule_index++; + nmi_load_bg_from_vram = 1; +} + +void FileSelect_TriggerStripesAndAdvance() { // 8ccea5 + selectfile_R16 = selectfile_var2; + submodule_index++; + nmi_load_bg_from_vram = 6; +} + +void FileSelect_TriggerNameStripesAndAdvance() { // 8cceb1 + static const uint8 kSelectFile_Func3_Data[253] = { + 0x61, 0x29, 0, 0x25, 0xe7, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0x49, 0, 0x25, 0xf7, 0x18, + 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0x61, 0xa9, 0, 0x25, 0xe8, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0xc9, + 0, 0x25, 0xf8, 0x18, 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x62, 0x29, 0, 0x25, 0xe9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0x62, 0x49, 0, 0x25, 0xf9, 0x18, 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xff, + }; + memcpy(vram_upload_data, kSelectFile_Func3_Data, 253); + INIDISP_copy = 0xf; + nmi_disable_core_updates = 0; + submodule_index++; + nmi_load_bg_from_vram = 6; +} + +void FileSelect_Main() { // 8ccebd + static const uint8 kSelectFile_Faerie_Y[5] = {0x4a, 0x6a, 0x8a, 0xaf, 0xbf}; + + uint8 *cart = g_zenv.sram; + + if (selectfile_R16 < 3) + selectfile_var2 = selectfile_R16; + + for (int k = 0; k < 3; k++) { + if (*(uint16 *)(cart + k * 0x500 + 0x3E5) == 0x55AA) { + selectfile_arr1[k] = 1; + SelectFile_Func5_DrawOams(k); + SelectFile_Func6_DrawOams2(k); + SelectFile_Func17(k); + } + } + + FileSelect_DrawFairy(0x1c, kSelectFile_Faerie_Y[selectfile_R16]); + nmi_load_bg_from_vram = 1; + + uint8 a = (filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xfc; + if (a & 0x2c) { + if (a & 8) { + sound_effect_2 = 0x20; + if (sign8(--selectfile_R16)) + selectfile_R16 = 4; + } else { + sound_effect_2 = 0x20; + if (++selectfile_R16 == 5) + selectfile_R16 = 0; + } + } else if (a != 0) { + sound_effect_1 = 0x2c; + if (selectfile_R16 < 3) { + selectfile_R17 = 0; + if (!selectfile_arr1[selectfile_R16]) { + main_module_index = 4; + submodule_index = 0; + subsubmodule_index = 0; + } else { + music_control = 0xf1; + srm_var1 = selectfile_R16 * 2 + 2; + WORD(g_ram[0]) = selectfile_R16 * 0x500; + CopySaveToWRAM(); + } + } else if (selectfile_arr1[0] | selectfile_arr1[1] | selectfile_arr1[2]) { + main_module_index = (selectfile_R16 == 3) ? 2 : 3; + selectfile_R16 = 0; + submodule_index = 0; + subsubmodule_index = 0; + } else { + sound_effect_1 = 0x3c; + } + } +} + +void Module02_CopyFile() { // 8cd053 + selectfile_var2 = 0; + switch (submodule_index) { + case 0: FileSelect_EraseTriforce(); break; + case 1: Module_EraseFile_1(); break; + case 2: Module_CopyFile_2(); break; + case 3: CopyFile_ChooseSelection(); break; + case 4: CopyFile_ChooseTarget(); break; + case 5: CopyFile_ConfirmSelection(); break; + } +} + +void Module_CopyFile_2() { // 8cd06e + nmi_load_bg_from_vram = 7; + submodule_index++; + INIDISP_copy = 0xf; + nmi_disable_core_updates = 0; + int i = 0; + for (; selectfile_arr1[i] == 0; i++) {} + selectfile_R16 = i; +} + +void CopyFile_ChooseSelection() { // 8cd087 + CopyFile_SelectionAndBlinker(); + if (submodule_index == 3 && !(frame_counter & 0x30)) + FilePicker_DeleteHeaderStripe(); + nmi_load_bg_from_vram = 1; +} + +void CopyFile_ChooseTarget() { // 8cd0a2 + CopyFile_TargetSelectionAndBlink(); + if (submodule_index == 4 && !(frame_counter & 0x30)) + FilePicker_DeleteHeaderStripe(); + nmi_load_bg_from_vram = 1; +} + +void CopyFile_ConfirmSelection() { // 8cd0b9 + CopyFile_HandleConfirmation(); + nmi_load_bg_from_vram = 1; +} + +void FilePicker_DeleteHeaderStripe() { // 8cd0c6 + static const uint16 kFilePicker_DeleteHeaderStripe_Dst[2] = {4, 0x1e}; + for (int j = 1; j >= 0; j--) { + uint16 *dst = vram_upload_data + kFilePicker_DeleteHeaderStripe_Dst[j] / 2; + for (int i = 0; i != 11; i++) + dst[i] = 0xa9; + } +} + +void CopyFile_SelectionAndBlinker() { // 8cd13f + static const uint8 kCopyFile_SelectionAndBlinker_Tab[173] = { + 0x61, 4, 0, 0x15, 0x85, 0x18, 0x26, 0x18, 7, 0x18, 0xaf, 0x18, 2, 0x18, 7, 0x18, + 0x6f, 0x18, 0x86, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0x24, 0, 0x15, 0x95, 0x18, + 0x36, 0x18, 0x17, 0x18, 0xbf, 0x18, 0x12, 0x18, 0x17, 0x18, 0x7f, 0x18, 0x96, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0x61, 0x67, 0, 0xf, 0xe7, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0x87, 0, 0xf, 0xf7, 0x18, 0x91, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0xc7, 0, 0xf, + 0xe8, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0x61, 0xe7, 0, 0xf, 0xf8, 0x18, 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0x62, 0x27, 0, 0xf, 0xe9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x62, 0x47, 0, 0xf, 0xf9, 0x18, 0x91, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xff, + }; + static const uint8 kCopyFile_SelectionAndBlinker_Tab1[73] = { + 0x61, 0x67, 0x40, 0xe, 0xa9, 0, 0x61, 0x87, 0x40, 0xe, 0xa9, 0, 0x61, 0xc7, 0x40, 0xe, + 0xa9, 0, 0x61, 0xe7, 0x40, 0xe, 0xa9, 0, 0x11, 0x30, 0, 1, 0x83, 0x35, 0x11, 0x31, + 0x40, 0x14, 0x85, 0x35, 0x11, 0x3c, 0, 1, 0x84, 0x35, 0x11, 0x50, 0xc0, 0xe, 0x86, 0x35, + 0x11, 0x5c, 0xc0, 0xe, 0x96, 0x35, 0x12, 0x50, 0, 1, 0x93, 0x35, 0x12, 0x51, 0x40, 0x14, + 0x95, 0x35, 0x12, 0x5c, 0, 1, 0x94, 0x35, 0xff, + }; + static const uint16 kCopyFile_SelectionAndBlinker_Dst[3] = {0x3c, 0x64, 0x8c}; + static const uint8 kCopyFile_SelectionAndBlinker_FaerieX[4] = {36, 36, 36, 28}; + static const uint8 kCopyFile_SelectionAndBlinker_FaerieY[4] = {87, 111, 135, 191}; + + vram_upload_offset = 0xac; + memcpy(vram_upload_data, kCopyFile_SelectionAndBlinker_Tab, 173); + + for (int k = 0; k != 3; k++) { + if (selectfile_arr1[k] & 1) { + uint16 *name = (uint16 *)(g_zenv.sram + 0x500 * k + kSrmOffs_Name); + uint16 *dst = vram_upload_data + kCopyFile_SelectionAndBlinker_Dst[k] / 2; + for (int i = 0; i != 6; i++) { + uint16 t = *name++ + 0x1800; + dst[0] = t; + dst[10] = t + 0x10; + dst++; + } + } + } + FileSelect_DrawFairy(kCopyFile_SelectionAndBlinker_FaerieX[selectfile_R16], kCopyFile_SelectionAndBlinker_FaerieY[selectfile_R16]); + + uint8 a = (filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xfc; + if (a & 0x2c) { + uint8 k = selectfile_R16; + if (a & 8) { + do { + if (--k < 0) { + k = 3; + break; + } + } while (!selectfile_arr1[k]); + } else { + do { + k++; + if (k >= 4) + k = 0; + } while (k != 3 && !selectfile_arr1[k]); + } + selectfile_R16 = k; + sound_effect_2 = 0x20; + } else if (a != 0) { + sound_effect_1 = 0x2c; + if (selectfile_R16 == 3) { + ReturnToFileSelect(); + return; + } + selectfile_R20 = selectfile_R16 * 2; + memcpy(vram_upload_data + 26, kCopyFile_SelectionAndBlinker_Tab1, 73); + if (selectfile_R16 != 2) { + uint16 *dst = vram_upload_data + selectfile_R16 * 6; + dst[26] = 0x2762; + dst[29] = 0x4762; + } + submodule_index++; + selectfile_R16 = 0; + } +} + +void ReturnToFileSelect() { // 8cd22d + main_module_index = 1; + submodule_index = 1; + subsubmodule_index = 0; + selectfile_R16 = 0; +} + +void CopyFile_TargetSelectionAndBlink() { // 8cd27b + { + int k = 1, t = 4; + do { + if (t != selectfile_R20) + selectfile_arr2[k--] = t; + } while ((t -= 2) >= 0); + } + + static const uint8 kCopyFile_TargetSelectionAndBlink_Tab0[133] = { + 0x61, 0x51, 0, 0x15, 0x85, 0x18, 0x23, 0x18, 0xe, 0x18, 0xa9, 0x18, 0x26, 0x18, 7, 0x18, + 0xaf, 0x18, 2, 0x18, 7, 0x18, 0x6f, 0x18, 0x86, 0x18, 0x61, 0x71, 0, 0x15, 0x95, 0x18, + 0x33, 0x18, 0x1e, 0x18, 0xb9, 0x18, 0x36, 0x18, 0x17, 0x18, 0xbf, 0x18, 0x12, 0x18, 0x17, 0x18, + 0x7f, 0x18, 0x96, 0x18, 0x61, 0xb4, 0, 0xf, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0xd4, 0, 0xf, 0xa9, 0x18, 0x91, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x62, 0x14, 0, 0xf, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0x62, 0x34, 0, 0xf, 0xa9, 0x18, 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xff, + }; + static const uint8 kCopyFile_TargetSelectionAndBlink_Tab2[49] = { + 0x61, 0xb4, 0x40, 0xe, 0xa9, 0, 0x61, 0xd4, 0x40, 0xe, 0xa9, 0, 0x62, 0xc6, 0, 0xd, + 2, 0x18, 0xe, 0x18, 0xf, 0x18, 0x28, 0x18, 0xa9, 0x18, 0xe, 0x18, 0xa, 0x18, 0x62, 0xe6, + 0, 0xd, 0x12, 0x18, 0x1e, 0x18, 0x1f, 0x18, 0x38, 0x18, 0xa9, 0x18, 0x1e, 0x18, 0x1a, 0x18, + 0xff, + }; + static const uint8 kCopyFile_TargetSelectionAndBlink_FaerieX[3] = {0x8c, 0x8c, 0x1c}; + static const uint8 kCopyFile_TargetSelectionAndBlink_FaerieY[3] = {0x67, 0x7f, 0xbf}; + static const uint16 kCopyFile_TargetSelectionAndBlink_Dst[2] = {0x38, 0x60}; + static const uint16 kCopyFile_TargetSelectionAndBlink_Tab1[3] = {0x18e7, 0x18e8, 0x18e9}; + memcpy(vram_upload_data, kCopyFile_TargetSelectionAndBlink_Tab0, 133); + + for (int k = 0, j = 0; k != 3; k++) { + if (k * 2 == selectfile_R20) + continue; + + uint16 *dst = vram_upload_data + kCopyFile_TargetSelectionAndBlink_Dst[j++] / 2; + uint16 t = kCopyFile_TargetSelectionAndBlink_Tab1[k]; + dst[0] = t; + dst[10] = t + 0x10; + dst += 2; + if (selectfile_arr1[k]) { + uint16 *name = (uint16 *)(g_zenv.sram + 0x500 * k + kSrmOffs_Name); + for (int i = 0; i != 6; i++) { + uint16 t = *name++ + 0x1800; + dst[0] = t; + dst[10] = t + 0x10; + dst++; + } + } + } + + vram_upload_offset = 132; + + FileSelect_DrawFairy(kCopyFile_TargetSelectionAndBlink_FaerieX[selectfile_R16], kCopyFile_TargetSelectionAndBlink_FaerieY[selectfile_R16]); + + uint8 a = (filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xfc; + if (a & 0x2c) { + uint8 k = selectfile_R16; + if (a & 8) { + if (sign8(--k)) + k = 2; + } else { + if (++k >= 3) + k = 0; + } + selectfile_R16 = k; + sound_effect_2 = 0x20; + } else if (a) { + sound_effect_1 = 0x2c; + if (selectfile_R16 == 2) { + ReturnToFileSelect(); + selectfile_R16 = 0; + return; + } + selectfile_R18 = selectfile_arr2[selectfile_R16]; + memcpy(vram_upload_data + 26, kCopyFile_TargetSelectionAndBlink_Tab2, 49); + if (selectfile_R16 == 0) { + uint16 *dst = vram_upload_data; + dst[26] = 0x1462; + dst[29] = 0x3462; + } + submodule_index++; + selectfile_R16 = 0; + } +} + +void CopyFile_HandleConfirmation() { // 8cd371 + static const uint8 kCopyFile_HandleConfirmation_FaerieY[2] = {0xaf, 0xbf}; + FileSelect_DrawFairy(0x1c, kCopyFile_HandleConfirmation_FaerieY[selectfile_R16]); + + uint8 a = (filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xfc; + if (a & 0x2c) { + sound_effect_2 = 0x20; + if (a & 0x24) { + if (++selectfile_R16 >= 2) + selectfile_R16 = 0; + } else { + if (sign8(--selectfile_R16)) + selectfile_R16 = 1; + } + } else if (a != 0) { + sound_effect_1 = 0x2c; + if (selectfile_R16 == 0) { + memcpy(g_zenv.sram + (selectfile_R18 >> 1) * 0x500, g_zenv.sram + (selectfile_R20 >> 1) * 0x500, 0x500); + selectfile_arr1[(selectfile_R18 >> 1)] = 1; + } + ReturnToFileSelect(); + selectfile_R16 = 0; + } +} + +void Module03_KILLFile() { // 8cd485 + switch (submodule_index) { + case 0: FileSelect_EraseTriforce(); break; + case 1: Module_EraseFile_1(); break; + case 2: KILLFile_SetUp(); break; + case 3: KILLFile_HandleSelection(); break; + case 4: KILLFile_HandleConfirmation(); break; + } +} + +void KILLFile_SetUp() { // 8cd49a + nmi_load_bg_from_vram = 8; + submodule_index++; + INIDISP_copy = 0xf; + nmi_disable_core_updates = 0; + int i = 0; + for (; selectfile_arr1[i] == 0; i++) {} + selectfile_R16 = i; +} + +void KILLFile_HandleSelection() { // 8cd49f + if (selectfile_R16 < 3) + selectfile_var2 = selectfile_R16; + KILLFile_ChooseTarget(); + nmi_load_bg_from_vram = 1; +} + +void KILLFile_HandleConfirmation() { // 8cd4b1 + SelectFile_Func16(); + nmi_load_bg_from_vram = 1; +} + +void KILLFile_ChooseTarget() { // 8cd4ba + static const uint8 kKILLFile_ChooseTarget_Tab[253] = { + 0x61, 0xa7, 0, 0x25, 0xe7, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x61, 0xc7, 0, 0x25, 0xf7, 0x18, + 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0x62, 7, 0, 0x25, 0xe8, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x62, 0x27, + 0, 0x25, 0xf8, 0x18, 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0x62, 0x67, 0, 0x25, 0xe9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0x62, 0x87, 0, 0x25, 0xf9, 0x18, 0x91, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, + 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xa9, 0x18, 0xff, + }; + static const uint8 kKILLFile_ChooseTarget_Tab2[101] = { + 0x61, 0xa7, 0x40, 0x24, 0xa9, 0, 0x61, 0xc7, 0x40, 0x24, 0xa9, 0, 0x62, 7, 0x40, 0x24, + 0xa9, 0, 0x62, 0x27, 0x40, 0x24, 0xa9, 0, 0x62, 0xc6, 0, 0x21, 4, 0x18, 0x21, 0x18, + 0, 0x18, 0x22, 0x18, 4, 0x18, 0xa9, 0x18, 0x23, 0x18, 7, 0x18, 0xaf, 0x18, 0x22, 0x18, + 0xa9, 0x18, 0xf, 0x18, 0xb, 0x18, 0, 0x18, 0x28, 0x18, 4, 0x18, 0x21, 0x18, 0x62, 0xe6, + 0, 0x21, 0x14, 0x18, 0x31, 0x18, 0x10, 0x18, 0x32, 0x18, 0x14, 0x18, 0xa9, 0x18, 0x33, 0x18, + 0x17, 0x18, 0xbf, 0x18, 0x32, 0x18, 0xa9, 0x18, 0x1f, 0x18, 0x1b, 0x18, 0x10, 0x18, 0x38, 0x18, + 0x14, 0x18, 0x31, 0x18, 0xff, + }; + static const uint8 kKILLFile_ChooseTarget_FaerieX[4] = {36, 36, 36, 28}; + static const uint8 kKILLFile_ChooseTarget_FaerieY[4] = {103, 127, 151, 191}; + memcpy(vram_upload_data, kKILLFile_ChooseTarget_Tab, 253); + for (int k = 0; k < 3; k++) { + if (selectfile_arr1[k]) + SelectFile_Func17(k); + } + + FileSelect_DrawFairy(kKILLFile_ChooseTarget_FaerieX[selectfile_R16], kKILLFile_ChooseTarget_FaerieY[selectfile_R16]); + + int k = selectfile_R16; + if (filtered_joypad_H & 0x2c) { + if (!(filtered_joypad_H & 0x24)) { + do { + if (--k < 0) { + k = 3; + break; + } + } while (!selectfile_arr1[k]); + } else { + do { + k++; + if (k >= 4) + k = 0; + } while (k != 3 && !selectfile_arr1[k]); + } + sound_effect_2 = 0x20; + } + selectfile_R16 = k; + + uint8 a = (filtered_joypad_L & 0xc0 | filtered_joypad_H) & 0xd0; + if (a) { + sound_effect_1 = 0x2c; + if (k == 3) { + ReturnToFileSelect(); + return; + } + + memcpy(vram_upload_data, kKILLFile_ChooseTarget_Tab2, 101); + submodule_index++; + if (selectfile_R16 != 2) { + uint16 *dst = vram_upload_data + selectfile_R16 * 6; + dst[0] = 0x6762; + dst[3] = 0x8762; + } + subsubmodule_index = selectfile_R16; + selectfile_R16 = 0; + } +} + +void FileSelect_DrawFairy(uint8 x, uint8 y) { // 8cd7a5 + oam_buf[0].x = x; + oam_buf[0].y = y; + oam_buf[0].charnum = frame_counter & 8 ? 0xaa : 0xa8; + oam_buf[0].flags = 0x7e; + bytewise_extended_oam[0] = 2; +} + +void Module04_NameFile() { // 8cd88a + switch (submodule_index) { + case 0: NameFile_EraseSave(); break; + case 1: Module_NamePlayer_1(); break; + case 2: Module_NamePlayer_2(); break; + case 3: NameFile_DoTheNaming(); break; + } +} + +void NameFile_EraseSave() { // 8cd89c + FileSelect_EraseTriforce(); + irq_flag = 1; + selectfile_var3 = 0; + selectfile_var4 = 0; + selectfile_var5 = 0; + selectfile_arr2[0] = 0; + selectfile_var6 = 0; + selectfile_var7 = 0x83; + selectfile_var8 = 0x1f0; + BG3HOFS_copy2 = 0; + attract_legend_ctr = selectfile_R16 * 0x500; + memset(g_zenv.sram + attract_legend_ctr, 0, 0x500); + uint16 *name = (uint16 *)(g_zenv.sram + attract_legend_ctr + kSrmOffs_Name); + name[0] = name[1] = name[2] = name[3] = name[4] = name[5] = 0xa9; +} + +void NameFile_DoTheNaming() { // 8cda4d + static const int16 kNamePlayer_Tab1[26] = { + -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, + -2, 2, -2, 2, -2, 2, -2, 2, -4, 4, + }; + static const uint8 kNamePlayer_Tab2[4] = {131, 147, 163, 179}; + static const int8 kNamePlayer_X[6] = {31, 47, 63, 79, 95, 111}; + static const int16 kNamePlayer_Tab0[32] = { + 0x1f0, 0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, + 0xf0, 0x100, 0x110, 0x120, 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1a0, 0x1b0, 0x1c0, 0x1d0, 0x1e0, + }; + static const int8 kNamePlayer_Tab3[128] = { + 6, 7, 0x5f, 9, 0x59, 0x59, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x60, 0x23, + 0x59, 0x59, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x59, 0x59, 0x59, 0, 1, 2, 3, 4, 5, + 0x10, 0x11, 0x12, 0x13, 0x59, 0x59, 0x24, 0x5f, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x59, 0x59, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x59, 0x59, 0x59, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, + 0x40, 0x41, 0x42, 0x59, 0x59, 0x59, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x40, 0x41, 0x42, 0x59, + 0x59, 0x59, 0x61, 0x3f, 0x45, 0x46, 0x59, 0x59, 0x59, 0x59, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x44, 0x59, 0x6f, 0x6f, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5a, 0x44, 0x59, 0x6f, 0x6f, + 0x59, 0x59, 0x5a, 0x44, 0x59, 0x6f, 0x6f, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5a, + }; + for (;;) { + int j = selectfile_var9; + if (j == 0) { + NameFile_CheckForScrollInputX(); + break; + } + if (j != 0x31) + selectfile_var9 += 4; + j--; + if (kNamePlayer_Tab0[selectfile_var3] == selectfile_var8) { + selectfile_var9 = (joypad1H_last & 3) ? 0x30 : 0; + NameFile_CheckForScrollInputX(); + continue; + } + if (!selectfile_var10) + j += 2; + selectfile_var8 = (selectfile_var8 + WORD(((uint8*)&kNamePlayer_Tab1)[j])) & 0x1ff; + break; + } + + for (;;) { + if (selectfile_var11 == 0) { + NameFile_CheckForScrollInputY(); + break; + } + uint8 diff = selectfile_var7 - kNamePlayer_Tab2[selectfile_var5]; + if (diff != 0) { + selectfile_var7 += sign8(diff) ? 2 : -2; + break; + } + selectfile_var11 = 0; + NameFile_CheckForScrollInputY(); + } + + OamEnt *oam = oam_buf; + for (int i = 0; i != 26; i++) { + oam->x = 0x18 + i * 8; + oam->y = selectfile_var7; + oam->charnum = 0x2e; + oam->flags = 0x3c; + bytewise_extended_oam[oam - oam_buf] = 0; + oam++; + } + + oam->x = kNamePlayer_X[selectfile_var4]; + oam->y = 0x58; + oam->charnum = 0x29; + oam->flags = 0xc; + bytewise_extended_oam[oam - oam_buf] = 0; + + if (selectfile_var9 | selectfile_var11) + return; + + if (!(filtered_joypad_H & 0x10)) { + if (!(filtered_joypad_H & 0xc0 || filtered_joypad_L & 0xc0)) + return; + + sound_effect_1 = 0x2b; + uint8 t = kNamePlayer_Tab3[selectfile_var3 + selectfile_var5 * 0x20]; + if (t == 0x5a) { + if (!selectfile_var4) + selectfile_var4 = 5; + else + selectfile_var4--; + return; + } else if (t == 0x44) { + if (++selectfile_var4 == 6) + selectfile_var4 = 0; + return; + } else if (t != 0x6f) { + int p = selectfile_var4 * 2 + attract_legend_ctr; + uint16 chr = (t & 0xfff0) * 2 + (t & 0xf); + WORD(g_zenv.sram[p + kSrmOffs_Name]) = chr; + NameFile_DrawSelectedCharacter(selectfile_var4, chr); + if (++selectfile_var4 == 6) + selectfile_var4 = 0; + return; + } + } + int i = 0; + for(;;) { + uint16 a = WORD(g_zenv.sram[i * 2 + attract_legend_ctr + kSrmOffs_Name]); + if (a != 0xa9) + break; + if (++i == 6) { + sound_effect_1 = 0x3c; + return; + } + } + srm_var1 = selectfile_R16 * 2 + 2; + uint8 *sram = &g_zenv.sram[selectfile_R16 * 0x500]; + WORD(sram[0x3e5]) = 0x55aa; + WORD(sram[0x20c]) = 0xf000; + WORD(sram[0x20e]) = 0xf000; + WORD(sram[kSrmOffs_DiedCounter]) = 0xffff; + static const uint8 kSramInit_Normal[60] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x18, 0x18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0, 0, + }; + memcpy(sram + 0x340, kSramInit_Normal, 60); + Intro_FixCksum(sram); + ReturnToFileSelect(); + irq_flag = 0xff; + sound_effect_1 = 0x2c; +} + +void NameFile_CheckForScrollInputX() { // 8cdc8c + static const uint16 kNameFile_CheckForScrollInputX_Add[2] = {1, 0xff}; + static const int16 kNameFile_CheckForScrollInputX_Cmp[2] = {0x20, 0xff}; + static const int16 kNameFile_CheckForScrollInputX_Set[2] = {0, 0x1f}; + if (joypad1H_last & 3) { + int k = (joypad1H_last & 3) - 1; + selectfile_var10 = k; + selectfile_var9++; + uint8 t = selectfile_var3 + kNameFile_CheckForScrollInputX_Add[k]; + if (t == kNameFile_CheckForScrollInputX_Cmp[k]) + t = kNameFile_CheckForScrollInputX_Set[k]; + selectfile_var3 = t; + } +} + +void NameFile_CheckForScrollInputY() { // 8cdcbf + static const int8 kNameFile_CheckForScrollInputY_Add[2] = {1, -1}; + static const int8 kNameFile_CheckForScrollInputY_Cmp[2] = {4, -1}; + static const int8 kNameFile_CheckForScrollInputY_Set[2] = {0, 3}; + + uint8 a = joypad1H_last & 0xc; + if (a) { + if ((a * 2 | selectfile_var5) == 0x10 || (a * 4 | selectfile_var5) == 0x13) { + selectfile_arr2[1] = a; + return; + } + a >>= 2; + int t = selectfile_var5 + kNameFile_CheckForScrollInputY_Add[a-1]; + if (t == kNameFile_CheckForScrollInputY_Cmp[a-1]) + t = kNameFile_CheckForScrollInputY_Set[a-1]; + selectfile_var5 = t; + + selectfile_var11++; + selectfile_arr2[1] = a; + + } else { + selectfile_arr2[0] = 0; + } +} + +void NameFile_DrawSelectedCharacter(int k, uint16 chr) { // 8cdd30 + static const uint16 kNameFile_DrawSelectedCharacter_Tab[6] = {0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e}; + uint16 *dst = vram_upload_data; + uint16 a = kNameFile_DrawSelectedCharacter_Tab[k] | 0x6100; + dst[0] = swap16(a); + dst[1] = 0x100; + dst[2] = 0x1800 | chr; + dst[3] = swap16(a + 0x20); + dst[4] = 0x100; + dst[5] = (0x1800 | chr) + 0x10; + BYTE(dst[6]) = 0xff; + nmi_load_bg_from_vram = 1; +} + diff --git a/select_file.h b/select_file.h new file mode 100644 index 00000000..dc27b28e --- /dev/null +++ b/select_file.h @@ -0,0 +1,44 @@ +#pragma once + + +bool Intro_CheckCksum(const uint8 *s); +uint16 *SelectFile_Func1(); +void SelectFile_Func5_DrawOams(int k); +void SelectFile_Func6_DrawOams2(int k); +void SelectFile_Func17(int k); +void SelectFile_Func16(); +void Module_NamePlayer_1(); +void Module_NamePlayer_2(); +void Intro_FixCksum(uint8 *s); +void LoadFileSelectGraphics(); +void Intro_ValidateSram(); +void Module01_FileSelect(); +void Module_SelectFile_0(); +void FileSelect_ReInitSaveFlagsAndEraseTriforce(); +void FileSelect_EraseTriforce(); +void Module_EraseFile_1(); +void FileSelect_TriggerStripesAndAdvance(); +void FileSelect_TriggerNameStripesAndAdvance(); +void FileSelect_Main(); +void Module02_CopyFile(); +void Module_CopyFile_2(); +void CopyFile_ChooseSelection(); +void CopyFile_ChooseTarget(); +void CopyFile_ConfirmSelection(); +void FilePicker_DeleteHeaderStripe(); +void CopyFile_SelectionAndBlinker(); +void ReturnToFileSelect(); +void CopyFile_TargetSelectionAndBlink(); +void CopyFile_HandleConfirmation(); +void Module03_KILLFile(); +void KILLFile_SetUp(); +void KILLFile_HandleSelection(); +void KILLFile_HandleConfirmation(); +void KILLFile_ChooseTarget(); +void FileSelect_DrawFairy(uint8 x, uint8 y); +void Module04_NameFile(); +void NameFile_EraseSave(); +void NameFile_DoTheNaming(); +void NameFile_CheckForScrollInputX(); +void NameFile_CheckForScrollInputY(); +void NameFile_DrawSelectedCharacter(int k, uint16 chr); diff --git a/snes/apu.cpp b/snes/apu.cpp new file mode 100644 index 00000000..70e63cac --- /dev/null +++ b/snes/apu.cpp @@ -0,0 +1,186 @@ + +#include +#include +#include +#include +#include +#include +#include "apu.h" +#include "snes.h" +#include "spc.h" +#include "dsp.h" + +static const uint8_t bootRom[0x40] = { + 0xcd, 0xef, 0xbd, 0xe8, 0x00, 0xc6, 0x1d, 0xd0, 0xfc, 0x8f, 0xaa, 0xf4, 0x8f, 0xbb, 0xf5, 0x78, + 0xcc, 0xf4, 0xd0, 0xfb, 0x2f, 0x19, 0xeb, 0xf4, 0xd0, 0xfc, 0x7e, 0xf4, 0xd0, 0x0b, 0xe4, 0xf5, + 0xcb, 0xf4, 0xd7, 0x00, 0xfc, 0xd0, 0xf3, 0xab, 0x01, 0x10, 0xef, 0x7e, 0xf4, 0x10, 0xeb, 0xba, + 0xf6, 0xda, 0x00, 0xba, 0xf4, 0xc4, 0xf4, 0xdd, 0x5d, 0xd0, 0xdb, 0x1f, 0x00, 0x00, 0xc0, 0xff +}; + +Apu* apu_init() { + Apu* apu = (Apu * )malloc(sizeof(Apu)); + apu->spc = spc_init(apu); + apu->dsp = dsp_init(apu->ram); + return apu; +} + +void apu_free(Apu* apu) { + spc_free(apu->spc); + dsp_free(apu->dsp); + free(apu); +} + +void apu_saveload(Apu *apu, SaveLoadFunc *func, void *ctx) { + size_t size = sizeof(struct Apu2); + size_t size2 = offsetof(Apu, hist); + func(ctx, apu->ram, offsetof(Apu, hist) - offsetof(Apu, ram)); + dsp_saveload(apu->dsp, func, ctx); + spc_saveload(apu->spc, func, ctx); +} + +void apu_reset(Apu* apu) { + apu->romReadable = true; // before resetting spc, because it reads reset vector from it + spc_reset(apu->spc); + dsp_reset(apu->dsp); + memset(apu->ram, 0, sizeof(apu->ram)); + apu->dspAdr = 0; + apu->cycles = 0; + memset(apu->inPorts, 0, sizeof(apu->inPorts)); + memset(apu->outPorts, 0, sizeof(apu->outPorts)); + for(int i = 0; i < 3; i++) { + apu->timer[i].cycles = 0; + apu->timer[i].divider = 0; + apu->timer[i].target = 0; + apu->timer[i].counter = 0; + apu->timer[i].enabled = false; + } + apu->cpuCyclesLeft = 7; + apu->hist.count = 0; +} + +void apu_cycle(Apu* apu) { + if(apu->cpuCyclesLeft == 0) { + apu->cpuCyclesLeft = spc_runOpcode(apu->spc); + } + apu->cpuCyclesLeft--; + + if((apu->cycles & 0x1f) == 0) { + // every 32 cycles + dsp_cycle(apu->dsp); + } + + // handle timers + for(int i = 0; i < 3; i++) { + if(apu->timer[i].cycles == 0) { + apu->timer[i].cycles = i == 2 ? 16 : 128; + if(apu->timer[i].enabled) { + apu->timer[i].divider++; + if(apu->timer[i].divider == apu->timer[i].target) { + apu->timer[i].divider = 0; + apu->timer[i].counter++; + apu->timer[i].counter &= 0xf; + } + } + } + apu->timer[i].cycles--; + } + + apu->cycles++; +} + +uint8_t apu_cpuRead(Apu* apu, uint16_t adr) { + switch(adr) { + case 0xf0: + case 0xf1: + case 0xfa: + case 0xfb: + case 0xfc: { + return 0; + } + case 0xf2: { + return apu->dspAdr; + } + case 0xf3: { + return dsp_read(apu->dsp, apu->dspAdr & 0x7f); + } + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + case 0xf8: + case 0xf9: { + return apu->inPorts[adr - 0xf4]; + } + case 0xfd: + case 0xfe: + case 0xff: { + uint8_t ret = apu->timer[adr - 0xfd].counter; + apu->timer[adr - 0xfd].counter = 0; + return ret; + } + } + if(apu->romReadable && adr >= 0xffc0) { + return bootRom[adr - 0xffc0]; + } + return apu->ram[adr]; +} + +void apu_cpuWrite(Apu* apu, uint16_t adr, uint8_t val) { + switch(adr) { + case 0xf0: { + break; // test register + } + case 0xf1: { + for(int i = 0; i < 3; i++) { + if(!apu->timer[i].enabled && (val & (1 << i))) { + apu->timer[i].divider = 0; + apu->timer[i].counter = 0; + } + apu->timer[i].enabled = val & (1 << i); + } + if(val & 0x10) { + apu->inPorts[0] = 0; + apu->inPorts[1] = 0; + } + if(val & 0x20) { + apu->inPorts[2] = 0; + apu->inPorts[3] = 0; + } + apu->romReadable = val & 0x80; + break; + } + case 0xf2: { + apu->dspAdr = val; + break; + } + case 0xf3: { + int i = apu->hist.count; + if (i != 256) { + apu->hist.count = i + 1; + apu->hist.addr[i] = (DspReg)apu->dspAdr; + apu->hist.val[i] = val; + } + if(apu->dspAdr < 0x80) dsp_write(apu->dsp, apu->dspAdr, val); + break; + } + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: { + apu->outPorts[adr - 0xf4] = val; + break; + } + case 0xf8: + case 0xf9: { + apu->inPorts[adr - 0xf4] = val; + break; + } + case 0xfa: + case 0xfb: + case 0xfc: { + apu->timer[adr - 0xfa].target = val; + break; + } + } + apu->ram[adr] = val; +} diff --git a/snes/apu.h b/snes/apu.h new file mode 100644 index 00000000..1ac3d722 --- /dev/null +++ b/snes/apu.h @@ -0,0 +1,64 @@ + +#ifndef APU_H +#define APU_H + +#include +#include +#include +#include +#include + +typedef struct Apu Apu; + +#include "spc.h" +#include "dsp.h" + +typedef struct Timer { + uint8_t cycles; + uint8_t divider; + uint8_t target; + uint8_t counter; + bool enabled; +} Timer; + + +struct Apu { + Spc* spc; + Dsp* dsp; + uint8_t ram[0x10000]; + bool romReadable; + uint8_t dspAdr; + uint32_t cycles; + uint8_t inPorts[6]; // includes 2 bytes of ram + uint8_t outPorts[4]; + Timer timer[3]; + uint8_t cpuCyclesLeft; + union { + DspRegWriteHistory hist; + void *padpad; + }; +}; + +struct Apu2 { + // Snes* snes; + Spc* spc; + Dsp* dsp; + uint8_t ram[0x10000]; + bool romReadable; + uint8_t dspAdr; + uint32_t cycles; + uint8_t inPorts[6]; // includes 2 bytes of ram + uint8_t outPorts[4]; + Timer timer[3]; + uint8_t cpuCyclesLeft; +}; + +Apu* apu_init(); +void apu_free(Apu* apu); +void apu_reset(Apu* apu); +void apu_cycle(Apu* apu); +uint8_t apu_cpuRead(Apu* apu, uint16_t adr); +void apu_cpuWrite(Apu* apu, uint16_t adr, uint8_t val); +void apu_saveload(Apu *apu, SaveLoadFunc *func, void *ctx); + +#endif diff --git a/snes/cart.cpp b/snes/cart.cpp new file mode 100644 index 00000000..5e50e9b7 --- /dev/null +++ b/snes/cart.cpp @@ -0,0 +1,112 @@ + +#include +#include +#include +#include +#include +#include +#include "cart.h" +#include "snes.h" + +static uint8_t cart_readLorom(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeLorom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +static uint8_t cart_readHirom(Cart* cart, uint8_t bank, uint16_t adr); +static void cart_writeHirom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); + +Cart* cart_init(Snes* snes) { + Cart* cart = (Cart *)malloc(sizeof(Cart)); + cart->snes = snes; + cart->type = 0; + cart->rom = NULL; + cart->romSize = 0; + cart->ramSize = 0x2000; + cart->ram = (uint8_t *)malloc(cart->ramSize); + return cart; +} + +void cart_free(Cart* cart) { + free(cart); +} + +void cart_reset(Cart* cart) { + if(cart->ramSize > 0 && cart->ram != NULL) memset(cart->ram, 0, cart->ramSize); // for now +} + +void cart_saveload(Cart *cart, SaveLoadFunc *func, void *ctx) { + func(ctx, cart->ram, cart->ramSize); +} + +void cart_load(Cart* cart, int type, uint8_t* rom, int romSize, int ramSize) { + cart->type = type; + if(cart->rom != NULL) free(cart->rom); + cart->rom = (uint8_t*)malloc(romSize); + cart->romSize = romSize; + assert(ramSize == cart->ramSize); + memset(cart->ram, 0, ramSize); + cart->ramSize = ramSize; + memcpy(cart->rom, rom, romSize); +} + +uint8_t cart_read(Cart* cart, uint8_t bank, uint16_t adr) { + if (cart->type == 1) + return cart_readLorom(cart, bank, adr); + + switch(cart->type) { + case 0: return cart->snes->openBus; + case 1: + case 2: return cart_readHirom(cart, bank, adr); + } + return cart->snes->openBus; +} + +void cart_write(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + switch(cart->type) { + case 0: break; + case 1: cart_writeLorom(cart, bank, adr, val); break; + case 2: cart_writeHirom(cart, bank, adr, val); break; + } +} + +static uint8_t cart_readLorom(Cart* cart, uint8_t bank, uint16_t adr) { + if(adr >= 0x8000) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + if(((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 && cart->ramSize > 0) { + // banks 70-7e and f0-ff, adr 0000-7fff + return cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)]; + } + if(bank & 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[((bank << 15) | (adr & 0x7fff)) & (cart->romSize - 1)]; + } + return cart->snes->openBus; +} + +static void cart_writeLorom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + if(((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && adr < 0x8000 && cart->ramSize > 0) { + // banks 70-7e and f0-ff, adr 0000-7fff + cart->ram[(((bank & 0xf) << 15) | adr) & (cart->ramSize - 1)] = val; + } +} + +static uint8_t cart_readHirom(Cart* cart, uint8_t bank, uint16_t adr) { + bank &= 0x7f; + if(bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + return cart->ram[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)]; + } + if(adr >= 0x8000 || bank >= 0x40) { + // adr 8000-ffff in all banks or all addresses in banks 40-7f and c0-ff + return cart->rom[(((bank & 0x3f) << 16) | adr) & (cart->romSize - 1)]; + } + return cart->snes->openBus; +} + +static void cart_writeHirom(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val) { + bank &= 0x7f; + if(bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && cart->ramSize > 0) { + // banks 00-3f and 80-bf, adr 6000-7fff + cart->ram[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (cart->ramSize - 1)] = val; + } +} diff --git a/snes/cart.h b/snes/cart.h new file mode 100644 index 00000000..2edb7053 --- /dev/null +++ b/snes/cart.h @@ -0,0 +1,35 @@ + +#ifndef CART_H +#define CART_H + +#include +#include +#include +#include +#include + +typedef struct Cart Cart; + +#include "snes.h" + +struct Cart { + Snes* snes; + uint8_t type; + + uint8_t* rom; + uint32_t romSize; + uint8_t* ram; + uint32_t ramSize; +}; + +// TODO: how to handle reset & load? (especially where to init ram) + +Cart* cart_init(Snes* snes); +void cart_free(Cart* cart); +void cart_reset(Cart* cart); // will reset special chips etc, general reading is set up in load +void cart_load(Cart* cart, int type, uint8_t* rom, int romSize, int ramSize); // TODO: figure out how to handle (battery, cart-chips etc) +uint8_t cart_read(Cart* cart, uint8_t bank, uint16_t adr); +void cart_write(Cart* cart, uint8_t bank, uint16_t adr, uint8_t val); +void cart_saveload(Cart *cart, SaveLoadFunc *func, void *ctx); + +#endif diff --git a/snes/cpu.cpp b/snes/cpu.cpp new file mode 100644 index 00000000..106a02ed --- /dev/null +++ b/snes/cpu.cpp @@ -0,0 +1,2443 @@ + +#include +#include +#include +#include +#include +#include +#include +#include "cpu.h" +#include "snes.h" + +static const int cyclesPerOpcode[256] = { + 7, 6, 7, 4, 5, 3, 5, 6, 3, 2, 2, 4, 6, 4, 6, 5, + 2, 5, 5, 7, 5, 4, 6, 6, 2, 4, 2, 2, 6, 4, 7, 5, + 6, 6, 8, 4, 3, 3, 5, 6, 4, 2, 2, 5, 4, 4, 6, 5, + 2, 5, 5, 7, 4, 4, 6, 6, 2, 4, 2, 2, 4, 4, 7, 5, + 6, 6, 2, 4, 7, 3, 5, 6, 3, 2, 2, 3, 3, 4, 6, 5, + 2, 5, 5, 7, 7, 4, 6, 6, 2, 4, 3, 2, 4, 4, 7, 5, + 6, 6, 6, 4, 3, 3, 5, 6, 4, 2, 2, 6, 5, 4, 6, 5, + 2, 5, 5, 7, 4, 4, 6, 6, 2, 4, 4, 2, 6, 4, 7, 5, + 3, 6, 4, 4, 3, 3, 3, 6, 2, 2, 2, 3, 4, 4, 4, 5, + 2, 6, 5, 7, 4, 4, 4, 6, 2, 5, 2, 2, 4, 5, 5, 5, + 2, 6, 2, 4, 3, 3, 3, 6, 2, 2, 2, 4, 4, 4, 4, 5, + 2, 5, 5, 7, 4, 4, 4, 6, 2, 4, 2, 2, 4, 4, 4, 5, + 2, 6, 3, 4, 3, 3, 5, 6, 2, 2, 2, 3, 4, 4, 6, 5, + 2, 5, 5, 7, 6, 4, 6, 6, 2, 4, 3, 3, 6, 4, 7, 5, + 2, 6, 3, 4, 3, 3, 5, 6, 2, 2, 2, 3, 4, 4, 6, 5, + 2, 5, 5, 7, 5, 4, 6, 6, 2, 4, 4, 2, 8, 4, 7, 5 +}; + +static uint8_t cpu_read(Cpu* cpu, uint32_t adr); +static void cpu_write(Cpu* cpu, uint32_t adr, uint8_t val); +static uint8_t cpu_readOpcode(Cpu* cpu); +static uint16_t cpu_readOpcodeWord(Cpu* cpu); +void cpu_setFlags(Cpu* cpu, uint8_t value); +static void cpu_setZN(Cpu* cpu, uint16_t value, bool byte); +static void cpu_doBranch(Cpu* cpu, uint8_t value, bool check); +static uint8_t cpu_pullByte(Cpu* cpu); +static void cpu_pushByte(Cpu* cpu, uint8_t value); +static uint16_t cpu_pullWord(Cpu* cpu); +static void cpu_pushWord(Cpu* cpu, uint16_t value); +static uint16_t cpu_readWord(Cpu* cpu, uint32_t adrl, uint32_t adrh); +static void cpu_writeWord(Cpu* cpu, uint32_t adrl, uint32_t adrh, uint16_t value, bool reversed); +static void cpu_doInterrupt(Cpu* cpu, bool irq); +static void cpu_doOpcode(Cpu* cpu, uint8_t opcode); + +// addressing modes and opcode functions not declared, only used after defintions + +static uint8_t cpu_read(Cpu* cpu, uint32_t adr) { + // assume mem is a pointer to a Snes + return snes_cpuRead((Snes*) cpu->mem, adr); +} + +static void cpu_write(Cpu* cpu, uint32_t adr, uint8_t val) { + // assume mem is a pointer to a Snes + snes_cpuWrite((Snes*) cpu->mem, adr, val); +} + +Cpu* cpu_init(void* mem, int memType) { + Cpu* cpu = (Cpu * )malloc(sizeof(Cpu)); + cpu->mem = mem; + cpu->memType = memType; + return cpu; +} + +void cpu_free(Cpu* cpu) { + free(cpu); +} + +void cpu_reset(Cpu* cpu) { + cpu->a = 0; + cpu->x = 0; + cpu->y = 0; + cpu->sp = 0x100; + cpu->pc = cpu_read(cpu, 0xfffc) | (cpu_read(cpu, 0xfffd) << 8); + cpu->dp = 0; + cpu->k = 0; + cpu->db = 0; + cpu->c = false; + cpu->z = false; + cpu->v = false; + cpu->n = false; + cpu->i = true; + cpu->d = false; + cpu->xf = true; + cpu->mf = true; + cpu->e = true; + cpu->irqWanted = false; + cpu->nmiWanted = false; + cpu->waiting = false; + cpu->stopped = false; + cpu->cyclesUsed = 0; + cpu->spBreakpoint = 0x0; + cpu->in_emu = 0; +} + +void cpu_saveload(Cpu *cpu, SaveLoadFunc *func, void *ctx) { + func(ctx, &cpu->a, offsetof(Cpu, cyclesUsed) - offsetof(Cpu, a)); + cpu->spBreakpoint = 0x0; +} + +int cpu_runOpcode(Cpu* cpu) { + cpu->cyclesUsed = 0; + if(cpu->stopped) return 1; + if(cpu->waiting) { + if(cpu->irqWanted || cpu->nmiWanted) { + cpu->waiting = false; + } + return 1; + } + // not stopped or waiting, execute a opcode or go to interrupt + if((!cpu->i && cpu->irqWanted) || cpu->nmiWanted) { + if (cpu->in_emu) { + printf("nmi while in emu!\n"); + } + + cpu->cyclesUsed = 7; // interrupt: at least 7 cycles + if(cpu->nmiWanted) { + cpu->nmiWanted = false; + cpu_doInterrupt(cpu, false); + } else { + // must be irq + cpu_doInterrupt(cpu, true); + } + } else { + uint8_t opcode = cpu_readOpcode(cpu); + cpu->cyclesUsed = cyclesPerOpcode[opcode]; + cpu_doOpcode(cpu, opcode); + } + return cpu->cyclesUsed; +} + +static uint8_t cpu_readOpcode(Cpu* cpu) { + return cpu_read(cpu, (cpu->k << 16) | cpu->pc++); +} + +static uint16_t cpu_readOpcodeWord(Cpu* cpu) { + uint8_t low = cpu_readOpcode(cpu); + return low | (cpu_readOpcode(cpu) << 8); +} + +uint8_t cpu_getFlags(Cpu* cpu) { + uint8_t val = cpu->n << 7; + val |= cpu->v << 6; + val |= cpu->mf << 5; + val |= cpu->xf << 4; + val |= cpu->d << 3; + val |= cpu->i << 2; + val |= cpu->z << 1; + val |= (uint8_t)cpu->c; + return val; +} + +void cpu_setFlags(Cpu* cpu, uint8_t val) { + cpu->n = val & 0x80; + cpu->v = val & 0x40; + cpu->mf = val & 0x20; + cpu->xf = val & 0x10; + cpu->d = val & 8; + cpu->i = val & 4; + cpu->z = val & 2; + cpu->c = val & 1; + if(cpu->e) { + cpu->mf = true; + cpu->xf = true; + cpu->sp = (cpu->sp & 0xff) | 0x100; + } + if(cpu->xf) { + cpu->x &= 0xff; + cpu->y &= 0xff; + } +} + +static void cpu_setZN(Cpu* cpu, uint16_t value, bool byte) { + if(byte) { + cpu->z = (value & 0xff) == 0; + cpu->n = value & 0x80; + } else { + cpu->z = value == 0; + cpu->n = value & 0x8000; + } +} + +static void cpu_doBranch(Cpu* cpu, uint8_t value, bool check) { + if(check) { + cpu->cyclesUsed++; // taken branch: 1 extra cycle + cpu->pc += (int8_t) value; + } +} + +static uint8_t cpu_pullByte(Cpu* cpu) { + cpu->sp++; + if(cpu->e) cpu->sp = (cpu->sp & 0xff) | 0x100; + return cpu_read(cpu, cpu->sp); +} + +static void cpu_pushByte(Cpu* cpu, uint8_t value) { + cpu_write(cpu, cpu->sp, value); + cpu->sp--; + if(cpu->e) cpu->sp = (cpu->sp & 0xff) | 0x100; +} + +static uint16_t cpu_pullWord(Cpu* cpu) { + uint8_t value = cpu_pullByte(cpu); + return value | (cpu_pullByte(cpu) << 8); +} + +static void cpu_pushWord(Cpu* cpu, uint16_t value) { + cpu_pushByte(cpu, value >> 8); + cpu_pushByte(cpu, value & 0xff); +} + +static uint16_t cpu_readWord(Cpu* cpu, uint32_t adrl, uint32_t adrh) { + uint8_t value = cpu_read(cpu, adrl); + return value | (cpu_read(cpu, adrh) << 8); +} + +static void cpu_writeWord(Cpu* cpu, uint32_t adrl, uint32_t adrh, uint16_t value, bool reversed) { + if(reversed) { + cpu_write(cpu, adrh, value >> 8); + cpu_write(cpu, adrl, value & 0xff); + } else { + cpu_write(cpu, adrl, value & 0xff); + cpu_write(cpu, adrh, value >> 8); + } +} + +static void cpu_doInterrupt(Cpu* cpu, bool irq) { + cpu_pushByte(cpu, cpu->k); + cpu_pushWord(cpu, cpu->pc); + cpu_pushByte(cpu, cpu_getFlags(cpu)); + cpu->cyclesUsed++; // native mode: 1 extra cycle + cpu->i = true; + cpu->d = false; + cpu->k = 0; + if(irq) { + cpu->pc = cpu_readWord(cpu, 0xffee, 0xffef); + } else { + // nmi + cpu->pc = cpu_readWord(cpu, 0xffea, 0xffeb); + } +} + +// addressing modes + +static uint32_t cpu_adrImm(Cpu* cpu, uint32_t* low, bool xFlag) { + if((xFlag && cpu->xf) || (!xFlag && cpu->mf)) { + *low = (cpu->k << 16) | cpu->pc++; + return 0; + } else { + *low = (cpu->k << 16) | cpu->pc++; + return (cpu->k << 16) | cpu->pc++; + } +} + +static uint32_t cpu_adrDp(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + *low = (cpu->dp + adr) & 0xffff; + return (cpu->dp + adr + 1) & 0xffff; +} + +static uint32_t cpu_adrDpx(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + *low = (cpu->dp + adr + cpu->x) & 0xffff; + return (cpu->dp + adr + cpu->x + 1) & 0xffff; +} + +static uint32_t cpu_adrDpy(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + *low = (cpu->dp + adr + cpu->y) & 0xffff; + return (cpu->dp + adr + cpu->y + 1) & 0xffff; +} + +static uint32_t cpu_adrIdp(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord(cpu, (cpu->dp + adr) & 0xffff, (cpu->dp + adr + 1) & 0xffff); + *low = (cpu->db << 16) + pointer; + return ((cpu->db << 16) + pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdx(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord(cpu, (cpu->dp + adr + cpu->x) & 0xffff, (cpu->dp + adr + cpu->x + 1) & 0xffff); + *low = (cpu->db << 16) + pointer; + return ((cpu->db << 16) + pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdy(Cpu* cpu, uint32_t* low, bool write) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + uint16_t pointer = cpu_readWord(cpu, (cpu->dp + adr) & 0xffff, (cpu->dp + adr + 1) & 0xffff); + if(write && (!cpu->xf || ((pointer >> 8) != ((pointer + cpu->y) >> 8)))) cpu->cyclesUsed++; + // x = 0 or page crossed, with writing opcode: 1 extra cycle + *low = ((cpu->db << 16) + pointer + cpu->y) & 0xffffff; + return ((cpu->db << 16) + pointer + cpu->y + 1) & 0xffffff; +} + +static uint32_t cpu_adrIdl(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + uint32_t pointer = cpu_readWord(cpu, (cpu->dp + adr) & 0xffff, (cpu->dp + adr + 1) & 0xffff); + pointer |= cpu_read(cpu, (cpu->dp + adr + 2) & 0xffff) << 16; + *low = pointer; + return (pointer + 1) & 0xffffff; +} + +static uint32_t cpu_adrIly(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + if(cpu->dp & 0xff) cpu->cyclesUsed++; // dpr not 0: 1 extra cycle + uint32_t pointer = cpu_readWord(cpu, (cpu->dp + adr) & 0xffff, (cpu->dp + adr + 1) & 0xffff); + pointer |= cpu_read(cpu, (cpu->dp + adr + 2) & 0xffff) << 16; + *low = (pointer + cpu->y) & 0xffffff; + return (pointer + cpu->y + 1) & 0xffffff; +} + +static uint32_t cpu_adrSr(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + *low = (cpu->sp + adr) & 0xffff; + return (cpu->sp + adr + 1) & 0xffff; +} + +static uint32_t cpu_adrIsy(Cpu* cpu, uint32_t* low) { + uint8_t adr = cpu_readOpcode(cpu); + uint16_t pointer = cpu_readWord(cpu, (cpu->sp + adr) & 0xffff, (cpu->sp + adr + 1) & 0xffff); + *low = ((cpu->db << 16) + pointer + cpu->y) & 0xffffff; + return ((cpu->db << 16) + pointer + cpu->y + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbs(Cpu* cpu, uint32_t* low) { + uint16_t adr = cpu_readOpcodeWord(cpu); + *low = (cpu->db << 16) + adr; + return ((cpu->db << 16) + adr + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbx(Cpu* cpu, uint32_t* low, bool write) { + uint16_t adr = cpu_readOpcodeWord(cpu); + if(write && (!cpu->xf || ((adr >> 8) != ((adr + cpu->x) >> 8)))) cpu->cyclesUsed++; + // x = 0 or page crossed, with writing opcode: 1 extra cycle + *low = ((cpu->db << 16) + adr + cpu->x) & 0xffffff; + return ((cpu->db << 16) + adr + cpu->x + 1) & 0xffffff; +} + +static uint32_t cpu_adrAby(Cpu* cpu, uint32_t* low, bool write) { + uint16_t adr = cpu_readOpcodeWord(cpu); + if(write && (!cpu->xf || ((adr >> 8) != ((adr + cpu->y) >> 8)))) cpu->cyclesUsed++; + // x = 0 or page crossed, with writing opcode: 1 extra cycle + *low = ((cpu->db << 16) + adr + cpu->y) & 0xffffff; + return ((cpu->db << 16) + adr + cpu->y + 1) & 0xffffff; +} + +static uint32_t cpu_adrAbl(Cpu* cpu, uint32_t* low) { + uint32_t adr = cpu_readOpcodeWord(cpu); + adr |= cpu_readOpcode(cpu) << 16; + *low = adr; + return (adr + 1) & 0xffffff; +} + +static uint32_t cpu_adrAlx(Cpu* cpu, uint32_t* low) { + uint32_t adr = cpu_readOpcodeWord(cpu); + adr |= cpu_readOpcode(cpu) << 16; + *low = (adr + cpu->x) & 0xffffff; + return (adr + cpu->x + 1) & 0xffffff; +} + +static uint16_t cpu_adrIax(Cpu* cpu) { + uint16_t adr = cpu_readOpcodeWord(cpu); + return cpu_readWord(cpu, (cpu->k << 16) | ((adr + cpu->x) & 0xffff), (cpu->k << 16) | ((adr + cpu->x + 1) & 0xffff)); +} + +// opcode functions + +static void cpu_and(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + cpu->a = (cpu->a & 0xff00) | ((cpu->a & value) & 0xff); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high); + cpu->a &= value; + } + cpu_setZN(cpu, cpu->a, cpu->mf); +} + +static void cpu_ora(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + cpu->a = (cpu->a & 0xff00) | ((cpu->a | value) & 0xff); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high); + cpu->a |= value; + } + cpu_setZN(cpu, cpu->a, cpu->mf); +} + +static void cpu_eor(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + cpu->a = (cpu->a & 0xff00) | ((cpu->a ^ value) & 0xff); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high); + cpu->a ^= value; + } + cpu_setZN(cpu, cpu->a, cpu->mf); +} + +static void cpu_adc(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + int result = 0; + if(cpu->d) { + result = (cpu->a & 0xf) + (value & 0xf) + cpu->c; + if(result > 0x9) result = ((result + 0x6) & 0xf) + 0x10; + result = (cpu->a & 0xf0) + (value & 0xf0) + result; + } else { + result = (cpu->a & 0xff) + value + cpu->c; + } + cpu->v = (cpu->a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + if(cpu->d && result > 0x9f) result += 0x60; + cpu->c = result > 0xff; + cpu->a = (cpu->a & 0xff00) | (result & 0xff); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high); + int result = 0; + if(cpu->d) { + result = (cpu->a & 0xf) + (value & 0xf) + cpu->c; + if(result > 0x9) result = ((result + 0x6) & 0xf) + 0x10; + result = (cpu->a & 0xf0) + (value & 0xf0) + result; + if(result > 0x9f) result = ((result + 0x60) & 0xff) + 0x100; + result = (cpu->a & 0xf00) + (value & 0xf00) + result; + if(result > 0x9ff) result = ((result + 0x600) & 0xfff) + 0x1000; + result = (cpu->a & 0xf000) + (value & 0xf000) + result; + } else { + result = cpu->a + value + cpu->c; + } + cpu->v = (cpu->a & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + if(cpu->d && result > 0x9fff) result += 0x6000; + cpu->c = result > 0xffff; + cpu->a = result; + } + cpu_setZN(cpu, cpu->a, cpu->mf); +} + +static void cpu_sbc(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low) ^ 0xff; + int result = 0; + if(cpu->d) { + result = (cpu->a & 0xf) + (value & 0xf) + cpu->c; + if(result < 0x10) result = (result - 0x6) & ((result - 0x6 < 0) ? 0xf : 0x1f); + result = (cpu->a & 0xf0) + (value & 0xf0) + result; + } else { + result = (cpu->a & 0xff) + value + cpu->c; + } + cpu->v = (cpu->a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + if(cpu->d && result < 0x100) result -= 0x60; + cpu->c = result > 0xff; + cpu->a = (cpu->a & 0xff00) | (result & 0xff); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high) ^ 0xffff; + int result = 0; + if(cpu->d) { + result = (cpu->a & 0xf) + (value & 0xf) + cpu->c; + if(result < 0x10) result = (result - 0x6) & ((result - 0x6 < 0) ? 0xf : 0x1f); + result = (cpu->a & 0xf0) + (value & 0xf0) + result; + if(result < 0x100) result = (result - 0x60) & ((result - 0x60 < 0) ? 0xff : 0x1ff); + result = (cpu->a & 0xf00) + (value & 0xf00) + result; + if(result < 0x1000) result = (result - 0x600) & ((result - 0x600 < 0) ? 0xfff : 0x1fff); + result = (cpu->a & 0xf000) + (value & 0xf000) + result; + } else { + result = cpu->a + value + cpu->c; + } + cpu->v = (cpu->a & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + if(cpu->d && result < 0x10000) result -= 0x6000; + cpu->c = result > 0xffff; + cpu->a = result; + } + cpu_setZN(cpu, cpu->a, cpu->mf); +} + +static void cpu_cmp(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low) ^ 0xff; + result = (cpu->a & 0xff) + value + 1; + cpu->c = result > 0xff; + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high) ^ 0xffff; + result = cpu->a + value + 1; + cpu->c = result > 0xffff; + } + cpu_setZN(cpu, result, cpu->mf); +} + +static void cpu_cpx(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->xf) { + uint8_t value = cpu_read(cpu, low) ^ 0xff; + result = (cpu->x & 0xff) + value + 1; + cpu->c = result > 0xff; + } else { + cpu->cyclesUsed++; // x = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high) ^ 0xffff; + result = cpu->x + value + 1; + cpu->c = result > 0xffff; + } + cpu_setZN(cpu, result, cpu->xf); +} + +static void cpu_cpy(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->xf) { + uint8_t value = cpu_read(cpu, low) ^ 0xff; + result = (cpu->y & 0xff) + value + 1; + cpu->c = result > 0xff; + } else { + cpu->cyclesUsed++; // x = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high) ^ 0xffff; + result = cpu->y + value + 1; + cpu->c = result > 0xffff; + } + cpu_setZN(cpu, result, cpu->xf); +} + +static void cpu_bit(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + uint8_t result = (cpu->a & 0xff) & value; + cpu->z = result == 0; + cpu->n = value & 0x80; + cpu->v = value & 0x40; + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t value = cpu_readWord(cpu, low, high); + uint16_t result = cpu->a & value; + cpu->z = result == 0; + cpu->n = value & 0x8000; + cpu->v = value & 0x4000; + } +} + +static void cpu_lda(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | cpu_read(cpu, low); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + cpu->a = cpu_readWord(cpu, low, high); + } + cpu_setZN(cpu, cpu->a, cpu->mf); +} + +static void cpu_ldx(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->xf) { + cpu->x = cpu_read(cpu, low); + } else { + cpu->cyclesUsed++; // x = 0: 1 extra cycle + cpu->x = cpu_readWord(cpu, low, high); + } + cpu_setZN(cpu, cpu->x, cpu->xf); +} + +static void cpu_ldy(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->xf) { + cpu->y = cpu_read(cpu, low); + } else { + cpu->cyclesUsed++; // x = 0: 1 extra cycle + cpu->y = cpu_readWord(cpu, low, high); + } + cpu_setZN(cpu, cpu->y, cpu->xf); +} + +static void cpu_sta(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + cpu_write(cpu, low, cpu->a); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + cpu_writeWord(cpu, low, high, cpu->a, false); + } +} + +static void cpu_stx(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->xf) { + cpu_write(cpu, low, cpu->x); + } else { + cpu->cyclesUsed++; // x = 0: 1 extra cycle + cpu_writeWord(cpu, low, high, cpu->x, false); + } +} + +static void cpu_sty(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->xf) { + cpu_write(cpu, low, cpu->y); + } else { + cpu->cyclesUsed++; // x = 0: 1 extra cycle + cpu_writeWord(cpu, low, high, cpu->y, false); + } +} + +static void cpu_stz(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + cpu_write(cpu, low, 0); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + cpu_writeWord(cpu, low, high, 0, false); + } +} + +static void cpu_ror(Cpu* cpu, uint32_t low, uint32_t high) { + bool carry = false; + int result = 0; + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + carry = value & 1; + result = (value >> 1) | (cpu->c << 7); + cpu_write(cpu, low, result); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + uint16_t value = cpu_readWord(cpu, low, high); + carry = value & 1; + result = (value >> 1) | (cpu->c << 15); + cpu_writeWord(cpu, low, high, result, true); + } + cpu_setZN(cpu, result, cpu->mf); + cpu->c = carry; +} + +static void cpu_rol(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->mf) { + result = (cpu_read(cpu, low) << 1) | (uint8_t)cpu->c; + cpu->c = result & 0x100; + cpu_write(cpu, low, result); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + result = (cpu_readWord(cpu, low, high) << 1) | (uint8_t)cpu->c; + cpu->c = result & 0x10000; + cpu_writeWord(cpu, low, high, result, true); + } + cpu_setZN(cpu, result, cpu->mf); +} + +static void cpu_lsr(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + cpu->c = value & 1; + result = value >> 1; + cpu_write(cpu, low, result); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + uint16_t value = cpu_readWord(cpu, low, high); + cpu->c = value & 1; + result = value >> 1; + cpu_writeWord(cpu, low, high, result, true); + } + cpu_setZN(cpu, result, cpu->mf); +} + +static void cpu_asl(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->mf) { + result = cpu_read(cpu, low) << 1; + cpu->c = result & 0x100; + cpu_write(cpu, low, result); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + result = cpu_readWord(cpu, low, high) << 1; + cpu->c = result & 0x10000; + cpu_writeWord(cpu, low, high, result, true); + } + cpu_setZN(cpu, result, cpu->mf); +} + +static void cpu_inc(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->mf) { + result = cpu_read(cpu, low) + 1; + cpu_write(cpu, low, result); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + result = cpu_readWord(cpu, low, high) + 1; + cpu_writeWord(cpu, low, high, result, true); + } + cpu_setZN(cpu, result, cpu->mf); +} + +static void cpu_dec(Cpu* cpu, uint32_t low, uint32_t high) { + int result = 0; + if(cpu->mf) { + result = cpu_read(cpu, low) - 1; + cpu_write(cpu, low, result); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + result = cpu_readWord(cpu, low, high) - 1; + cpu_writeWord(cpu, low, high, result, true); + } + cpu_setZN(cpu, result, cpu->mf); +} + +static void cpu_tsb(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + cpu->z = ((cpu->a & 0xff) & value) == 0; + cpu_write(cpu, low, value | (cpu->a & 0xff)); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + uint16_t value = cpu_readWord(cpu, low, high); + cpu->z = (cpu->a & value) == 0; + cpu_writeWord(cpu, low, high, value | cpu->a, true); + } +} + +static void cpu_trb(Cpu* cpu, uint32_t low, uint32_t high) { + if(cpu->mf) { + uint8_t value = cpu_read(cpu, low); + cpu->z = ((cpu->a & 0xff) & value) == 0; + cpu_write(cpu, low, value & ~(cpu->a & 0xff)); + } else { + cpu->cyclesUsed += 2; // m = 0: 2 extra cycles + uint16_t value = cpu_readWord(cpu, low, high); + cpu->z = (cpu->a & value) == 0; + cpu_writeWord(cpu, low, high, value & ~cpu->a, true); + } +} + +void HookedFunctionRts(int is_long); + +static void cpu_doOpcode(Cpu* cpu, uint8_t opcode) { + switch(opcode) { + case 0x00: { // brk imp + uint32_t addr = (cpu->k << 16) | cpu->pc; + switch (addr - 1) { + + // Uncle_AtHome case 3 will read random memory. + case 0x5DEC7: + *(uint8_t *)&cpu->a = cpu_read(cpu, 0x5DEB0 + (cpu->y & 0xff)); + + if (cpu_read(cpu, 0xD90 + (cpu->x & 0xff)) == 2) { + cpu->pc = 0xdeea; + return; + } + cpu->pc += 2; + return; + + // Overlord_StalfosTrap doesn't initialize the sprite_D memory location + case 0x9be5e: + *(uint8_t *)&cpu->a = 224; + cpu_write(cpu, 0xDE0 + (uint8_t)cpu->y, 0); + cpu->pc++; + return; + + case 0x1AF9A4: // Lanmola_SpawnShrapnel uses undefined carry value + *(uint8_t *)&cpu->a += 4; + cpu->c = 0; + cpu->pc++; + return; + + /* +.9E:8A46 E5 E2 sbc.b A, BYTE BG2HOFS_copy2 +.9E:8A48 E5 08 sbc.b A, R8 +.9E:8A4A 69 0C adc.b A, #0xC +. */ + case 0x1E8A46: // carry junk + cpu->a = cpu->a - cpu_read(cpu, 0xe2) - cpu_read(cpu, 8) + 12; + cpu->pc += 5; + return; +/* +.9E:8A52 E5 E8 sbc.b A, BYTE BG2VOFS_copy2 +.9E:8A54 69 08 adc.b A, #8 +.9E:8A56 E5 09 sbc.b A, R9 +.9E:8A58 69 08 adc.b A, #8 +*/ + case 0x1E8A52: // carry junk + cpu->a = cpu->a - cpu_read(cpu, 0xe8) + 8 - cpu_read(cpu, 9) + 8; + cpu->pc += 7; + return; + + case 0x9a966: // TAgalong_DrawInner doesn't init scratch_0 / scratch_1 + for(int i = 0; i < 4; i++) cpu_write(cpu, 0x72 + i, 0); + cpu->pc += 1; + return; + + case 0x8f708: + cpu->pc += 0; + cpu_write(cpu, 0x75, 0); + goto case_iny_c8; + + case 0x1de0e5: // GreatCatfish_ConversateThenSubmerge - not carry preserving + if ((uint8_t)cpu->a >= 160) + cpu->pc = 0xe164; + else + cpu->pc += 1; + return; + + case 0x6d0b6: + case 0x6d0c6: { // Sprite_CommonItemPickup - wrong carry chain + cpu->c = ((uint8_t)cpu->a >= 4); + cpu->a = cpu->a - 4; + cpu->pc += 1; + return; + } + + case 0x1d8f29: + case 0x1dc812: + case 0x6ED0B: + case 0x9b478: + case 0x9b46c: + cpu->c = 0; + goto adc_69; + + case 0x9B468: + case 0x9B46A: + case 0x9B474: + case 0x9B476: + cpu->c = 1; + goto sbc_e5; + + case 0x9B60C: + cpu->c = 1; + goto sbc_e9; + + case 0x1DCDEB: + cpu->y = cpu_read(cpu, 0x0eb0 + (cpu->x & 0xff)); // BC B0 0E mov.b Y, sprite_head_dir[X] + cpu->a = cpu->x; + return; + } + + assert(0); +#if 0 + cpu_pushByte(cpu, cpu->k); + cpu_pushWord(cpu, cpu->pc + 1); + cpu_pushByte(cpu, cpu_getFlags(cpu)); + cpu->cyclesUsed++; // native mode: 1 extra cycle + cpu->i = true; + cpu->d = false; + cpu->k = 0; + cpu->pc = cpu_readWord(cpu, 0xffe6, 0xffe7); +#endif + break; + } + case 0x01: { // ora idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x02: { // cop imm(s) + cpu_readOpcode(cpu); + cpu_pushByte(cpu, cpu->k); + cpu_pushWord(cpu, cpu->pc); + cpu_pushByte(cpu, cpu_getFlags(cpu)); + cpu->cyclesUsed++; // native mode: 1 extra cycle + cpu->i = true; + cpu->d = false; + cpu->k = 0; + cpu->pc = cpu_readWord(cpu, 0xffe4, 0xffe5); + break; + } + case 0x03: { // ora sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x04: { // tsb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_tsb(cpu, low, high); + break; + } + case 0x05: { // ora dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x06: { // asl dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_asl(cpu, low, high); + break; + } + case 0x07: { // ora idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x08: { // php imp + cpu_pushByte(cpu, cpu_getFlags(cpu)); + break; + } + case 0x09: { // ora imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_ora(cpu, low, high); + break; + } + case 0x0a: { // asla imp + if(cpu->mf) { + cpu->c = cpu->a & 0x80; + cpu->a = (cpu->a & 0xff00) | ((cpu->a << 1) & 0xff); + } else { + cpu->c = cpu->a & 0x8000; + cpu->a <<= 1; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x0b: { // phd imp + cpu_pushWord(cpu, cpu->dp); + break; + } + case 0x0c: { // tsb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_tsb(cpu, low, high); + break; + } + case 0x0d: { // ora abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x0e: { // asl abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_asl(cpu, low, high); + break; + } + case 0x0f: { // ora abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x10: { // bpl rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), !cpu->n); + break; + } + case 0x11: { // ora idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_ora(cpu, low, high); + break; + } + case 0x12: { // ora idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x13: { // ora isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x14: { // trb dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_trb(cpu, low, high); + break; + } + case 0x15: { // ora dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x16: { // asl dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_asl(cpu, low, high); + break; + } + case 0x17: { // ora ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x18: { // clc imp + cpu->c = false; + break; + } + case 0x19: { // ora aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_ora(cpu, low, high); + break; + } + case 0x1a: { // inca imp + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | ((cpu->a + 1) & 0xff); + } else { + cpu->a++; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x1b: { // tcs imp + cpu->sp = cpu->a; + break; + } + case 0x1c: { // trb abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_trb(cpu, low, high); + break; + } + case 0x1d: { // ora abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_ora(cpu, low, high); + break; + } + case 0x1e: { // asl abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_asl(cpu, low, high); + break; + } + case 0x1f: { // ora alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_ora(cpu, low, high); + break; + } + case 0x20: { // jsr abs + uint16_t value = cpu_readOpcodeWord(cpu); + cpu_pushWord(cpu, cpu->pc - 1); + cpu->pc = value; + break; + } + case 0x21: { // and idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x22: { // jsl abl + uint16_t value = cpu_readOpcodeWord(cpu); + uint8_t newK = cpu_readOpcode(cpu); + cpu_pushByte(cpu, cpu->k); + cpu_pushWord(cpu, cpu->pc - 1); + cpu->pc = value; + cpu->k = newK; + break; + } + case 0x23: { // and sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x24: { // bit dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_bit(cpu, low, high); + break; + } + case 0x25: { // and dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x26: { // rol dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_rol(cpu, low, high); + break; + } + case 0x27: { // and idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x28: { // plp imp + cpu_setFlags(cpu, cpu_pullByte(cpu)); + break; + } + case 0x29: { // and imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_and(cpu, low, high); + break; + } + case 0x2a: { // rola imp + int result = (cpu->a << 1) | (uint8_t)cpu->c; + if(cpu->mf) { + cpu->c = result & 0x100; + cpu->a = (cpu->a & 0xff00) | (result & 0xff); + } else { + cpu->c = result & 0x10000; + cpu->a = result; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x2b: { // pld imp + cpu->dp = cpu_pullWord(cpu); + cpu_setZN(cpu, cpu->dp, false); + break; + } + case 0x2c: { // bit abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_bit(cpu, low, high); + break; + } + case 0x2d: { // and abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x2e: { // rol abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_rol(cpu, low, high); + break; + } + case 0x2f: { // and abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x30: { // bmi rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), cpu->n); + break; + } + case 0x31: { // and idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_and(cpu, low, high); + break; + } + case 0x32: { // and idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x33: { // and isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x34: { // bit dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_bit(cpu, low, high); + break; + } + case 0x35: { // and dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x36: { // rol dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_rol(cpu, low, high); + break; + } + case 0x37: { // and ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x38: { // sec imp + cpu->c = true; + break; + } + case 0x39: { // and aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_and(cpu, low, high); + break; + } + case 0x3a: { // deca imp + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | ((cpu->a - 1) & 0xff); + } else { + cpu->a--; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x3b: { // tsc imp + cpu->a = cpu->sp; + cpu_setZN(cpu, cpu->a, false); + break; + } + case 0x3c: { // bit abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_bit(cpu, low, high); + break; + } + case 0x3d: { // and abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_and(cpu, low, high); + break; + } + case 0x3e: { // rol abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_rol(cpu, low, high); + break; + } + case 0x3f: { // and alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_and(cpu, low, high); + break; + } + case 0x40: { // rti imp + cpu_setFlags(cpu, cpu_pullByte(cpu)); + cpu->cyclesUsed++; // native mode: 1 extra cycle + cpu->pc = cpu_pullWord(cpu); + cpu->k = cpu_pullByte(cpu); + break; + } + case 0x41: { // eor idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x42: { // wdm imm(s) + cpu_readOpcode(cpu); + break; + } + case 0x43: { // eor sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x44: { // mvp bm + uint8_t dest = cpu_readOpcode(cpu); + uint8_t src = cpu_readOpcode(cpu); + cpu->db = dest; + cpu_write(cpu, (dest << 16) | cpu->y, cpu_read(cpu, (src << 16) | cpu->x)); + cpu->a--; + cpu->x--; + cpu->y--; + if(cpu->a != 0xffff) { + cpu->pc -= 3; + } + if(cpu->xf) { + cpu->x &= 0xff; + cpu->y &= 0xff; + } + break; + } + case 0x45: { // eor dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x46: { // lsr dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_lsr(cpu, low, high); + break; + } + case 0x47: { // eor idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x48: { // pha imp + if(cpu->mf) { + cpu_pushByte(cpu, cpu->a); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + cpu_pushWord(cpu, cpu->a); + } + break; + } + case 0x49: { // eor imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_eor(cpu, low, high); + break; + } + case 0x4a: { // lsra imp + cpu->c = cpu->a & 1; + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | ((cpu->a >> 1) & 0x7f); + } else { + cpu->a >>= 1; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x4b: { // phk imp + cpu_pushByte(cpu, cpu->k); + break; + } + case 0x4c: { // jmp abs + cpu->pc = cpu_readOpcodeWord(cpu); + break; + } + case 0x4d: { // eor abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x4e: { // lsr abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_lsr(cpu, low, high); + break; + } + case 0x4f: { // eor abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x50: { // bvc rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), !cpu->v); + break; + } + case 0x51: { // eor idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_eor(cpu, low, high); + break; + } + case 0x52: { // eor idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x53: { // eor isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x54: { // mvn bm + uint8_t dest = cpu_readOpcode(cpu); + uint8_t src = cpu_readOpcode(cpu); + cpu->db = dest; + cpu_write(cpu, (dest << 16) | cpu->y, cpu_read(cpu, (src << 16) | cpu->x)); + cpu->a--; + cpu->x++; + cpu->y++; + if(cpu->a != 0xffff) { + cpu->pc -= 3; + } + if(cpu->xf) { + cpu->x &= 0xff; + cpu->y &= 0xff; + } + break; + } + case 0x55: { // eor dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x56: { // lsr dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_lsr(cpu, low, high); + break; + } + case 0x57: { // eor ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x58: { // cli imp + cpu->i = false; + break; + } + case 0x59: { // eor aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_eor(cpu, low, high); + break; + } + case 0x5a: { // phy imp + if(cpu->xf) { + cpu_pushByte(cpu, cpu->y); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + cpu_pushWord(cpu, cpu->y); + } + break; + } + case 0x5b: { // tcd imp + cpu->dp = cpu->a; + cpu_setZN(cpu, cpu->dp, false); + break; + } + case 0x5c: { // jml abl + uint16_t value = cpu_readOpcodeWord(cpu); + cpu->k = cpu_readOpcode(cpu); + cpu->pc = value; + break; + } + case 0x5d: { // eor abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_eor(cpu, low, high); + break; + } + case 0x5e: { // lsr abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_lsr(cpu, low, high); + break; + } + case 0x5f: { // eor alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_eor(cpu, low, high); + break; + } + case 0x60: { // rts imp + //if (cpu->spBreakpoint) + // fprintf(stderr, "0x%x: rts 0x%x 0x%x\n", cpu->k<<16 | cpu->pc, cpu->spBreakpoint, cpu->sp); + if (cpu->sp >= cpu->spBreakpoint && cpu->spBreakpoint) { + assert(cpu->sp == cpu->spBreakpoint); + cpu->spBreakpoint = 0; + HookedFunctionRts(0); + } + cpu->pc = cpu_pullWord(cpu) + 1; + break; + } + case 0x61: { // adc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x62: { // per rll + uint16_t value = cpu_readOpcodeWord(cpu); + cpu_pushWord(cpu, cpu->pc + (int16_t) value); + break; + } + case 0x63: { // adc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x64: { // stz dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_stz(cpu, low, high); + break; + } + case 0x65: { // adc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x66: { // ror dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_ror(cpu, low, high); + break; + } + case 0x67: { // adc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x68: { // pla imp + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | cpu_pullByte(cpu); + } else { + cpu->cyclesUsed++; // 16-bit m: 1 extra cycle + cpu->a = cpu_pullWord(cpu); + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + adc_69: + case 0x69: { // adc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_adc(cpu, low, high); + break; + } + case 0x6a: { // rora imp + bool carry = cpu->a & 1; + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | ((cpu->a >> 1) & 0x7f) | (cpu->c << 7); + } else { + cpu->a = (cpu->a >> 1) | (cpu->c << 15); + } + cpu->c = carry; + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x6b: { // rtl imp + //if (cpu->spBreakpoint) + // fprintf(stderr, "0x%x: rtl 0x%x 0x%x\n", cpu->k<<16 | cpu->pc, cpu->spBreakpoint, cpu->sp); + + if (cpu->sp >= cpu->spBreakpoint && cpu->spBreakpoint) { + assert(cpu->sp == cpu->spBreakpoint); + cpu->spBreakpoint = 0; + HookedFunctionRts(1); + } + cpu->pc = cpu_pullWord(cpu) + 1; + cpu->k = cpu_pullByte(cpu); + break; + } + case 0x6c: { // jmp ind + uint16_t adr = cpu_readOpcodeWord(cpu); + cpu->pc = cpu_readWord(cpu, adr, (adr + 1) & 0xffff); + break; + } + case 0x6d: { // adc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x6e: { // ror abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_ror(cpu, low, high); + break; + } + case 0x6f: { // adc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x70: { // bvs rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), cpu->v); + break; + } + case 0x71: { // adc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_adc(cpu, low, high); + break; + } + case 0x72: { // adc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x73: { // adc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x74: { // stz dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_stz(cpu, low, high); + break; + } + case 0x75: { // adc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x76: { // ror dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_ror(cpu, low, high); + break; + } + case 0x77: { // adc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x78: { // sei imp + cpu->i = true; + break; + } + case 0x79: { // adc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_adc(cpu, low, high); + break; + } + case 0x7a: { // ply imp + if(cpu->xf) { + cpu->y = cpu_pullByte(cpu); + } else { + cpu->cyclesUsed++; // 16-bit x: 1 extra cycle + cpu->y = cpu_pullWord(cpu); + } + cpu_setZN(cpu, cpu->y, cpu->xf); + break; + } + case 0x7b: { // tdc imp + cpu->a = cpu->dp; + cpu_setZN(cpu, cpu->a, false); + break; + } + case 0x7c: { // jmp iax + cpu->pc = cpu_adrIax(cpu); + break; + } + case 0x7d: { // adc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_adc(cpu, low, high); + break; + } + case 0x7e: { // ror abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_ror(cpu, low, high); + break; + } + case 0x7f: { // adc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_adc(cpu, low, high); + break; + } + case 0x80: { // bra rel + cpu->pc += (int8_t) cpu_readOpcode(cpu); + break; + } + case 0x81: { // sta idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x82: { // brl rll + cpu->pc += (int16_t) cpu_readOpcodeWord(cpu); + break; + } + case 0x83: { // sta sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x84: { // sty dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_sty(cpu, low, high); + break; + } + case 0x85: { // sta dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x86: { // stx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_stx(cpu, low, high); + break; + } + case 0x87: { // sta idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x88: { // dey imp + if(cpu->xf) { + cpu->y = (cpu->y - 1) & 0xff; + } else { + cpu->y--; + } + cpu_setZN(cpu, cpu->y, cpu->xf); + break; + } + case 0x89: { // biti imm(m) + if(cpu->mf) { + uint8_t result = (cpu->a & 0xff) & cpu_readOpcode(cpu); + cpu->z = result == 0; + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + uint16_t result = cpu->a & cpu_readOpcodeWord(cpu); + cpu->z = result == 0; + } + break; + } + case 0x8a: { // txa imp + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | (cpu->x & 0xff); + } else { + cpu->a = cpu->x; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x8b: { // phb imp + cpu_pushByte(cpu, cpu->db); + break; + } + case 0x8c: { // sty abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_sty(cpu, low, high); + break; + } + case 0x8d: { // sta abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x8e: { // stx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_stx(cpu, low, high); + break; + } + case 0x8f: { // sta abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x90: { // bcc rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), !cpu->c); + break; + } + case 0x91: { // sta idy + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, true); + cpu_sta(cpu, low, high); + break; + } + case 0x92: { // sta idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x93: { // sta isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x94: { // sty dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_sty(cpu, low, high); + break; + } + case 0x95: { // sta dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x96: { // stx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(cpu, &low); + cpu_stx(cpu, low, high); + break; + } + case 0x97: { // sta ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0x98: { // tya imp + if(cpu->mf) { + cpu->a = (cpu->a & 0xff00) | (cpu->y & 0xff); + } else { + cpu->a = cpu->y; + } + cpu_setZN(cpu, cpu->a, cpu->mf); + break; + } + case 0x99: { // sta aby + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, true); + cpu_sta(cpu, low, high); + break; + } + case 0x9a: { // txs imp + cpu->sp = cpu->x; + break; + } + case 0x9b: { // txy imp + if(cpu->xf) { + cpu->y = cpu->x & 0xff; + } else { + cpu->y = cpu->x; + } + cpu_setZN(cpu, cpu->y, cpu->xf); + break; + } + case 0x9c: { // stz abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_stz(cpu, low, high); + break; + } + case 0x9d: { // sta abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_sta(cpu, low, high); + break; + } + case 0x9e: { // stz abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_stz(cpu, low, high); + break; + } + case 0x9f: { // sta alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_sta(cpu, low, high); + break; + } + case 0xa0: { // ldy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, true); + cpu_ldy(cpu, low, high); + break; + } + case 0xa1: { // lda idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xa2: { // ldx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, true); + cpu_ldx(cpu, low, high); + break; + } + case 0xa3: { // lda sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xa4: { // ldy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_ldy(cpu, low, high); + break; + } + case 0xa5: { // lda dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xa6: { // ldx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_ldx(cpu, low, high); + break; + } + case 0xa7: { // lda idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xa8: { // tay imp + if(cpu->xf) { + cpu->y = cpu->a & 0xff; + } else { + cpu->y = cpu->a; + } + cpu_setZN(cpu, cpu->y, cpu->xf); + break; + } + case 0xa9: { // lda imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_lda(cpu, low, high); + break; + } + case 0xaa: { // tax imp + if(cpu->xf) { + cpu->x = cpu->a & 0xff; + } else { + cpu->x = cpu->a; + } + cpu_setZN(cpu, cpu->x, cpu->xf); + break; + } + case 0xab: { // plb imp + cpu->db = cpu_pullByte(cpu); + cpu_setZN(cpu, cpu->db, true); + break; + } + case 0xac: { // ldy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_ldy(cpu, low, high); + break; + } + case 0xad: { // lda abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xae: { // ldx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_ldx(cpu, low, high); + break; + } + case 0xaf: { // lda abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xb0: { // bcs rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), cpu->c); + break; + } + case 0xb1: { // lda idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_lda(cpu, low, high); + break; + } + case 0xb2: { // lda idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xb3: { // lda isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xb4: { // ldy dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_ldy(cpu, low, high); + break; + } + case 0xb5: { // lda dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xb6: { // ldx dpy + uint32_t low = 0; + uint32_t high = cpu_adrDpy(cpu, &low); + cpu_ldx(cpu, low, high); + break; + } + case 0xb7: { // lda ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xb8: { // clv imp + cpu->v = false; + break; + } + case 0xb9: { // lda aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_lda(cpu, low, high); + break; + } + case 0xba: { // tsx imp + if(cpu->xf) { + cpu->x = cpu->sp & 0xff; + } else { + cpu->x = cpu->sp; + } + cpu_setZN(cpu, cpu->x, cpu->xf); + break; + } + case 0xbb: { // tyx imp + if(cpu->xf) { + cpu->x = cpu->y & 0xff; + } else { + cpu->x = cpu->y; + } + cpu_setZN(cpu, cpu->x, cpu->xf); + break; + } + case 0xbc: { // ldy abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_ldy(cpu, low, high); + break; + } + case 0xbd: { // lda abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_lda(cpu, low, high); + break; + } + case 0xbe: { // ldx aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_ldx(cpu, low, high); + break; + } + case 0xbf: { // lda alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_lda(cpu, low, high); + break; + } + case 0xc0: { // cpy imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, true); + cpu_cpy(cpu, low, high); + break; + } + case 0xc1: { // cmp idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xc2: { // rep imm(s) + cpu_setFlags(cpu, cpu_getFlags(cpu) & ~cpu_readOpcode(cpu)); + break; + } + case 0xc3: { // cmp sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xc4: { // cpy dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_cpy(cpu, low, high); + break; + } + case 0xc5: { // cmp dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xc6: { // dec dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_dec(cpu, low, high); + break; + } + case 0xc7: { // cmp idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case_iny_c8: + case 0xc8: { // iny imp + if(cpu->xf) { + cpu->y = (cpu->y + 1) & 0xff; + } else { + cpu->y++; + } + cpu_setZN(cpu, cpu->y, cpu->xf); + break; + } + case 0xc9: { // cmp imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_cmp(cpu, low, high); + break; + } + case 0xca: { // dex imp + if(cpu->xf) { + cpu->x = (cpu->x - 1) & 0xff; + } else { + cpu->x--; + } + cpu_setZN(cpu, cpu->x, cpu->xf); + break; + } + case 0xcb: { // wai imp + cpu->waiting = true; + break; + } + case 0xcc: { // cpy abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_cpy(cpu, low, high); + break; + } + case 0xcd: { // cmp abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xce: { // dec abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_dec(cpu, low, high); + break; + } + case 0xcf: { // cmp abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xd0: { // bne rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), !cpu->z); + break; + } + case 0xd1: { // cmp idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_cmp(cpu, low, high); + break; + } + case 0xd2: { // cmp idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xd3: { // cmp isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xd4: { // pei dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_pushWord(cpu, cpu_readWord(cpu, low, high)); + break; + } + case 0xd5: { // cmp dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xd6: { // dec dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_dec(cpu, low, high); + break; + } + case 0xd7: { // cmp ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xd8: { // cld imp + cpu->d = false; + break; + } + case 0xd9: { // cmp aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_cmp(cpu, low, high); + break; + } + case 0xda: { // phx imp + if(cpu->xf) { + cpu_pushByte(cpu, cpu->x); + } else { + cpu->cyclesUsed++; // m = 0: 1 extra cycle + cpu_pushWord(cpu, cpu->x); + } + break; + } + case 0xdb: { // stp imp + cpu->stopped = true; + break; + } + case 0xdc: { // jml ial + uint16_t adr = cpu_readOpcodeWord(cpu); + cpu->pc = cpu_readWord(cpu, adr, (adr + 1) & 0xffff); + cpu->k = cpu_read(cpu, (adr + 2) & 0xffff); + break; + } + case 0xdd: { // cmp abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_cmp(cpu, low, high); + break; + } + case 0xde: { // dec abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_dec(cpu, low, high); + break; + } + case 0xdf: { // cmp alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_cmp(cpu, low, high); + break; + } + case 0xe0: { // cpx imm(x) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, true); + cpu_cpx(cpu, low, high); + break; + } + case 0xe1: { // sbc idx + uint32_t low = 0; + uint32_t high = cpu_adrIdx(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xe2: { // sep imm(s) + cpu_setFlags(cpu, cpu_getFlags(cpu) | cpu_readOpcode(cpu)); + break; + } + case 0xe3: { // sbc sr + uint32_t low = 0; + uint32_t high = cpu_adrSr(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xe4: { // cpx dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_cpx(cpu, low, high); + break; + } + sbc_e5: + case 0xe5: { // sbc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xe6: { // inc dp + uint32_t low = 0; + uint32_t high = cpu_adrDp(cpu, &low); + cpu_inc(cpu, low, high); + break; + } + case 0xe7: { // sbc idl + uint32_t low = 0; + uint32_t high = cpu_adrIdl(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xe8: { // inx imp + if(cpu->xf) { + cpu->x = (cpu->x + 1) & 0xff; + } else { + cpu->x++; + } + cpu_setZN(cpu, cpu->x, cpu->xf); + break; + } + sbc_e9: + case 0xe9: { // sbc imm(m) + uint32_t low = 0; + uint32_t high = cpu_adrImm(cpu, &low, false); + cpu_sbc(cpu, low, high); + break; + } + case 0xea: { // nop imp + // no operation + break; + } + case 0xeb: { // xba imp + uint8_t low = cpu->a & 0xff; + uint8_t high = cpu->a >> 8; + cpu->a = (low << 8) | high; + cpu_setZN(cpu, high, true); + break; + } + case 0xec: { // cpx abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_cpx(cpu, low, high); + break; + } + case 0xed: { // sbc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xee: { // inc abs + uint32_t low = 0; + uint32_t high = cpu_adrAbs(cpu, &low); + cpu_inc(cpu, low, high); + break; + } + case 0xef: { // sbc abl + uint32_t low = 0; + uint32_t high = cpu_adrAbl(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xf0: { // beq rel + cpu_doBranch(cpu, cpu_readOpcode(cpu), cpu->z); + break; + } + case 0xf1: { // sbc idy(r) + uint32_t low = 0; + uint32_t high = cpu_adrIdy(cpu, &low, false); + cpu_sbc(cpu, low, high); + break; + } + case 0xf2: { // sbc idp + uint32_t low = 0; + uint32_t high = cpu_adrIdp(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xf3: { // sbc isy + uint32_t low = 0; + uint32_t high = cpu_adrIsy(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xf4: { // pea imm(l) + cpu_pushWord(cpu, cpu_readOpcodeWord(cpu)); + break; + } + case 0xf5: { // sbc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xf6: { // inc dpx + uint32_t low = 0; + uint32_t high = cpu_adrDpx(cpu, &low); + cpu_inc(cpu, low, high); + break; + } + case 0xf7: { // sbc ily + uint32_t low = 0; + uint32_t high = cpu_adrIly(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + case 0xf8: { // sed imp + cpu->d = true; + break; + } + case 0xf9: { // sbc aby(r) + uint32_t low = 0; + uint32_t high = cpu_adrAby(cpu, &low, false); + cpu_sbc(cpu, low, high); + break; + } + case 0xfa: { // plx imp + if(cpu->xf) { + cpu->x = cpu_pullByte(cpu); + } else { + cpu->cyclesUsed++; // 16-bit x: 1 extra cycle + cpu->x = cpu_pullWord(cpu); + } + cpu_setZN(cpu, cpu->x, cpu->xf); + break; + } + case 0xfb: { // xce imp + bool temp = cpu->c; + cpu->c = cpu->e; + cpu->e = temp; + cpu_setFlags(cpu, cpu_getFlags(cpu)); // updates x and m flags, clears upper half of x and y if needed + break; + } + case 0xfc: { // jsr iax + uint16_t value = cpu_adrIax(cpu); + cpu_pushWord(cpu, cpu->pc - 1); + cpu->pc = value; + break; + } + case 0xfd: { // sbc abx(r) + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, false); + cpu_sbc(cpu, low, high); + break; + } + case 0xfe: { // inc abx + uint32_t low = 0; + uint32_t high = cpu_adrAbx(cpu, &low, true); + cpu_inc(cpu, low, high); + break; + } + case 0xff: { // sbc alx + uint32_t low = 0; + uint32_t high = cpu_adrAlx(cpu, &low); + cpu_sbc(cpu, low, high); + break; + } + } +} diff --git a/snes/cpu.h b/snes/cpu.h new file mode 100644 index 00000000..2aae1162 --- /dev/null +++ b/snes/cpu.h @@ -0,0 +1,58 @@ + +#ifndef CPU_H +#define CPU_H + +#include +#include +#include +#include +#include + +#include "saveload.h" + +typedef struct Cpu Cpu; + +struct Cpu { + // reference to memory handler, for reading//writing + void* mem; + uint8_t memType; // used to define which type mem is + // registers + uint16_t a; + uint16_t x; + uint16_t y; + uint16_t sp; + uint16_t pc; + uint16_t dp; // direct page (D) + uint8_t k; // program bank (PB) + uint8_t db; // data bank (B) + // flags + bool c; + bool z; + bool v; + bool n; + bool i; + bool d; + bool xf; + bool mf; + bool e; + // interrupts + bool irqWanted; + bool nmiWanted; + // power state (WAI/STP) + bool waiting; + bool stopped; + // internal use + uint8_t cyclesUsed; // indicates how many cycles an opcode used + uint16_t spBreakpoint; + bool in_emu; +}; + +Cpu* cpu_init(void* mem, int memType); +void cpu_free(Cpu* cpu); +void cpu_reset(Cpu* cpu); +int cpu_runOpcode(Cpu* cpu); +void cpu_saveload(Cpu *cpu, SaveLoadFunc *func, void *ctx); +uint8_t cpu_getFlags(Cpu *cpu); +void cpu_setFlags(Cpu *cpu, uint8_t val); + +#endif diff --git a/snes/dma.cpp b/snes/dma.cpp new file mode 100644 index 00000000..e3ba1ace --- /dev/null +++ b/snes/dma.cpp @@ -0,0 +1,328 @@ + +#include +#include +#include +#include +#include +#include +#include "dma.h" +#include "snes.h" +#include "../snes_regs.h" +static const int bAdrOffsets[8][4] = { + {0, 0, 0, 0}, + {0, 1, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 1, 1}, + {0, 1, 2, 3}, + {0, 1, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 1, 1} +}; + +static const int transferLength[8] = { + 1, 2, 2, 4, 4, 4, 2, 4 +}; + +static void dma_transferByte(Dma* dma, uint16_t aAdr, uint8_t aBank, uint8_t bAdr, bool fromB); + +Dma* dma_init(Snes* snes) { + Dma* dma = (Dma*)malloc(sizeof(Dma)); + dma->snes = snes; + return dma; +} + +void dma_free(Dma* dma) { + free(dma); +} + +void dma_reset(Dma* dma) { + for(int i = 0; i < 8; i++) { + dma->channel[i].bAdr = 0xff; + dma->channel[i].aAdr = 0xffff; + dma->channel[i].aBank = 0xff; + dma->channel[i].size = 0xffff; + dma->channel[i].indBank = 0xff; + dma->channel[i].tableAdr = 0xffff; + dma->channel[i].repCount = 0xff; + dma->channel[i].unusedByte = 0xff; + dma->channel[i].dmaActive = false; + dma->channel[i].hdmaActive = false; + dma->channel[i].mode = 7; + dma->channel[i].fixed = true; + dma->channel[i].decrement = true; + dma->channel[i].indirect = true; + dma->channel[i].fromB = true; + dma->channel[i].unusedBit = true; + dma->channel[i].doTransfer = false; + dma->channel[i].terminated = false; + dma->channel[i].offIndex = 0; + } + dma->hdmaTimer = 0; + dma->dmaTimer = 0; + dma->dmaBusy = false; +} + +void dma_saveload(Dma *dma, SaveLoadFunc *func, void *ctx) { + func(ctx, &dma->channel, sizeof(Dma) - offsetof(Dma, channel)); +} + +uint8_t dma_read(Dma* dma, uint16_t adr) { + uint8_t c = (adr & 0x70) >> 4; + switch(adr & 0xf) { + case 0x0: { + uint8_t val = dma->channel[c].mode; + val |= dma->channel[c].fixed << 3; + val |= dma->channel[c].decrement << 4; + val |= dma->channel[c].unusedBit << 5; + val |= dma->channel[c].indirect << 6; + val |= dma->channel[c].fromB << 7; + return val; + } + case 0x1: { + return dma->channel[c].bAdr; + } + case 0x2: { + return dma->channel[c].aAdr & 0xff; + } + case 0x3: { + return dma->channel[c].aAdr >> 8; + } + case 0x4: { + return dma->channel[c].aBank; + } + case 0x5: { + return dma->channel[c].size & 0xff; + } + case 0x6: { + return dma->channel[c].size >> 8; + } + case 0x7: { + return dma->channel[c].indBank; + } + case 0x8: { + return dma->channel[c].tableAdr & 0xff; + } + case 0x9: { + return dma->channel[c].tableAdr >> 8; + } + case 0xa: { + return dma->channel[c].repCount; + } + case 0xb: + case 0xf: { + return dma->channel[c].unusedByte; + } + default: { + return dma->snes->openBus; + } + } +} + +void dma_write(Dma* dma, uint16_t adr, uint8_t val) { + uint8_t c = (adr & 0x70) >> 4; + switch(adr & 0xf) { + case 0x0: { + + dma->channel[c].mode = val & 0x7; + dma->channel[c].fixed = val & 0x8; + dma->channel[c].decrement = val & 0x10; + dma->channel[c].unusedBit = val & 0x20; + dma->channel[c].indirect = val & 0x40; + dma->channel[c].fromB = val & 0x80; + break; + } + case 0x1: { + dma->channel[c].bAdr = val; + break; + } + case 0x2: { + dma->channel[c].aAdr = (dma->channel[c].aAdr & 0xff00) | val; + break; + } + case 0x3: { + dma->channel[c].aAdr = (dma->channel[c].aAdr & 0xff) | (val << 8); + break; + } + case 0x4: { + dma->channel[c].aBank = val; + break; + } + case 0x5: { + dma->channel[c].size = (dma->channel[c].size & 0xff00) | val; + break; + } + case 0x6: { + dma->channel[c].size = (dma->channel[c].size & 0xff) | (val << 8); + break; + } + case 0x7: { + dma->channel[c].indBank = val; + break; + } + case 0x8: { + dma->channel[c].tableAdr = (dma->channel[c].tableAdr & 0xff00) | val; + break; + } + case 0x9: { + dma->channel[c].tableAdr = (dma->channel[c].tableAdr & 0xff) | (val << 8); + break; + } + case 0xa: { + dma->channel[c].repCount = val; + break; + } + case 0xb: + case 0xf: { + dma->channel[c].unusedByte = val; + break; + } + default: { + break; + } + } +} + +void dma_doDma(Dma* dma) { + /*if(dma->dmaTimer > 0) { + dma->dmaTimer -= 2; + return; + }*/ + // figure out first channel that is active + int i = 0; + for(i = 0; i < 8; i++) { + if(dma->channel[i].dmaActive) { + break; + } + } + if(i == 8) { + // no active channels + dma->dmaBusy = false; + return; + } + // do channel i + dma_transferByte( + dma, dma->channel[i].aAdr, dma->channel[i].aBank, + dma->channel[i].bAdr + bAdrOffsets[dma->channel[i].mode][dma->channel[i].offIndex++], dma->channel[i].fromB + ); + dma->channel[i].offIndex &= 3; + dma->dmaTimer += 6; // 8 cycles for each byte taken, -2 for this cycle + if(!dma->channel[i].fixed) { + dma->channel[i].aAdr += dma->channel[i].decrement ? -1 : 1; + } + dma->channel[i].size--; + if(dma->channel[i].size == 0) { + dma->channel[i].offIndex = 0; // reset offset index + dma->channel[i].dmaActive = false; + dma->dmaTimer += 8; // 8 cycle overhead per channel + } +} + +void dma_initHdma(Dma* dma) { + dma->hdmaTimer = 0; + bool hdmaHappened = false; + for(int i = 0; i < 8; i++) { + if(dma->channel[i].hdmaActive) { + hdmaHappened = true; + // terminate any dma + dma->channel[i].dmaActive = false; + dma->channel[i].offIndex = 0; + // load address, repCount, and indirect address if needed + dma->channel[i].tableAdr = dma->channel[i].aAdr; + dma->channel[i].repCount = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + dma->hdmaTimer += 8; // 8 cycle overhead for each active channel + if(dma->channel[i].indirect) { + dma->channel[i].size = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + dma->channel[i].size |= snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++) << 8; + dma->hdmaTimer += 16; // another 16 cycles for indirect (total 24) + } + dma->channel[i].doTransfer = true; + } else { + dma->channel[i].doTransfer = false; + } + dma->channel[i].terminated = false; + } + if(hdmaHappened) dma->hdmaTimer += 16; // 18 cycles overhead, -2 for this cycle +} + +void dma_doHdma(Dma* dma) { + dma->hdmaTimer = 0; + bool hdmaHappened = false; + for(int i = 0; i < 8; i++) { + if(dma->channel[i].hdmaActive && !dma->channel[i].terminated) { + hdmaHappened = true; + // terminate any dma + dma->channel[i].dmaActive = false; + dma->channel[i].offIndex = 0; + // do the hdma + dma->hdmaTimer += 8; // 8 cycles overhead for each active channel + if(dma->channel[i].doTransfer) { + for(int j = 0; j < transferLength[dma->channel[i].mode]; j++) { + dma->hdmaTimer += 8; // 8 cycles for each byte transferred + if(dma->channel[i].indirect) { + dma_transferByte( + dma, dma->channel[i].size++, dma->channel[i].indBank, + dma->channel[i].bAdr + bAdrOffsets[dma->channel[i].mode][j], dma->channel[i].fromB + ); + } else { + dma_transferByte( + dma, dma->channel[i].tableAdr++, dma->channel[i].aBank, + dma->channel[i].bAdr + bAdrOffsets[dma->channel[i].mode][j], dma->channel[i].fromB + ); + } + } + } + dma->channel[i].repCount--; + dma->channel[i].doTransfer = dma->channel[i].repCount & 0x80; + if((dma->channel[i].repCount & 0x7f) == 0) { + dma->channel[i].repCount = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + if(dma->channel[i].indirect) { + // TODO: oddness with not fetching high byte if last active channel and reCount is 0 + dma->channel[i].size = snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++); + dma->channel[i].size |= snes_read(dma->snes, (dma->channel[i].aBank << 16) | dma->channel[i].tableAdr++) << 8; + dma->hdmaTimer += 16; // 16 cycles for new indirect address + } + if(dma->channel[i].repCount == 0) dma->channel[i].terminated = true; + dma->channel[i].doTransfer = true; + } + } + } + if(hdmaHappened) dma->hdmaTimer += 16; // 18 cycles overhead, -2 for this cycle +} + +static void dma_transferByte(Dma* dma, uint16_t aAdr, uint8_t aBank, uint8_t bAdr, bool fromB) { + // TODO: invalid writes: + // accesing b-bus via a-bus gives open bus, + // $2180-$2183 while accessing ram via a-bus open busses $2180-$2183 + // cannot access $4300-$437f (dma regs), or $420b / $420c + if(fromB) { + snes_write(dma->snes, (aBank << 16) | aAdr, snes_readBBus(dma->snes, bAdr)); + } else { + uint8_t data = snes_read(dma->snes, (aBank << 16) | aAdr); + snes_writeBBus(dma->snes, bAdr, data); + } +} + +bool dma_cycle(Dma* dma) { + if(dma->hdmaTimer > 0) { + dma->hdmaTimer -= 2; + return true; + } else if(dma->dmaBusy) { + dma_doDma(dma); + return true; + } + return false; +} + +void dma_startDma(Dma* dma, uint8_t val, bool hdma) { + for(int i = 0; i < 8; i++) { + if(hdma) { + dma->channel[i].hdmaActive = val & (1 << i); + } else { + dma->channel[i].dmaActive = val & (1 << i); + } + } + if(!hdma) { + dma->dmaBusy = val; + dma->dmaTimer += dma->dmaBusy ? 16 : 0; // 12-24 cycle overhead for entire dma transfer + } +} diff --git a/snes/dma.h b/snes/dma.h new file mode 100644 index 00000000..19feb98d --- /dev/null +++ b/snes/dma.h @@ -0,0 +1,57 @@ + +#ifndef DMA_H +#define DMA_H + +#include +#include +#include +#include +#include + +typedef struct Dma Dma; + +#include "snes.h" + +typedef struct DmaChannel { + uint8_t bAdr; + uint8_t aBank; + uint8_t indBank; // hdma + uint8_t repCount; // hdma + uint16_t aAdr; + uint16_t size; // also indirect hdma adr + uint16_t tableAdr; // hdma + uint8_t unusedByte; + bool dmaActive; + bool hdmaActive; + uint8_t mode; + bool fixed; + bool decrement; + bool indirect; // hdma + bool fromB; + bool unusedBit; + bool doTransfer; // hdma + bool terminated; // hdma + uint8_t offIndex; +} DmaChannel; + +struct Dma { + Snes* snes; + DmaChannel channel[8]; + uint16_t hdmaTimer; + uint32_t dmaTimer; + bool dmaBusy; +}; + +Dma* dma_init(Snes* snes); +void dma_free(Dma* dma); +void dma_reset(Dma* dma); +uint8_t dma_read(Dma* dma, uint16_t adr); // 43x0-43xf +void dma_write(Dma* dma, uint16_t adr, uint8_t val); // 43x0-43xf +void dma_doDma(Dma* dma); +void dma_initHdma(Dma* dma); +void dma_doHdma(Dma* dma); +bool dma_cycle(Dma* dma); +void dma_startDma(Dma* dma, uint8_t val, bool hdma); +void dma_saveload(Dma *dma, SaveLoadFunc *func, void *ctx); + +#endif diff --git a/snes/dsp.cpp b/snes/dsp.cpp new file mode 100644 index 00000000..2e2d7608 --- /dev/null +++ b/snes/dsp.cpp @@ -0,0 +1,578 @@ + +#include +#include +#include +#include +#include +#include +#include "dsp.h" + +#define MY_CHANGES 1 + +static const int rateValues[32] = { + 0, 2048, 1536, 1280, 1024, 768, 640, 512, + 384, 320, 256, 192, 160, 128, 96, 80, + 64, 48, 40, 32, 24, 20, 16, 12, + 10, 8, 6, 5, 4, 3, 2, 1 +}; + +static const int gaussValues[512] = { + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, + 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x002, 0x002, 0x002, 0x002, 0x002, + 0x002, 0x002, 0x003, 0x003, 0x003, 0x003, 0x003, 0x004, 0x004, 0x004, 0x004, 0x004, 0x005, 0x005, 0x005, 0x005, + 0x006, 0x006, 0x006, 0x006, 0x007, 0x007, 0x007, 0x008, 0x008, 0x008, 0x009, 0x009, 0x009, 0x00A, 0x00A, 0x00A, + 0x00B, 0x00B, 0x00B, 0x00C, 0x00C, 0x00D, 0x00D, 0x00E, 0x00E, 0x00F, 0x00F, 0x00F, 0x010, 0x010, 0x011, 0x011, + 0x012, 0x013, 0x013, 0x014, 0x014, 0x015, 0x015, 0x016, 0x017, 0x017, 0x018, 0x018, 0x019, 0x01A, 0x01B, 0x01B, + 0x01C, 0x01D, 0x01D, 0x01E, 0x01F, 0x020, 0x020, 0x021, 0x022, 0x023, 0x024, 0x024, 0x025, 0x026, 0x027, 0x028, + 0x029, 0x02A, 0x02B, 0x02C, 0x02D, 0x02E, 0x02F, 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, 0x038, + 0x03A, 0x03B, 0x03C, 0x03D, 0x03E, 0x040, 0x041, 0x042, 0x043, 0x045, 0x046, 0x047, 0x049, 0x04A, 0x04C, 0x04D, + 0x04E, 0x050, 0x051, 0x053, 0x054, 0x056, 0x057, 0x059, 0x05A, 0x05C, 0x05E, 0x05F, 0x061, 0x063, 0x064, 0x066, + 0x068, 0x06A, 0x06B, 0x06D, 0x06F, 0x071, 0x073, 0x075, 0x076, 0x078, 0x07A, 0x07C, 0x07E, 0x080, 0x082, 0x084, + 0x086, 0x089, 0x08B, 0x08D, 0x08F, 0x091, 0x093, 0x096, 0x098, 0x09A, 0x09C, 0x09F, 0x0A1, 0x0A3, 0x0A6, 0x0A8, + 0x0AB, 0x0AD, 0x0AF, 0x0B2, 0x0B4, 0x0B7, 0x0BA, 0x0BC, 0x0BF, 0x0C1, 0x0C4, 0x0C7, 0x0C9, 0x0CC, 0x0CF, 0x0D2, + 0x0D4, 0x0D7, 0x0DA, 0x0DD, 0x0E0, 0x0E3, 0x0E6, 0x0E9, 0x0EC, 0x0EF, 0x0F2, 0x0F5, 0x0F8, 0x0FB, 0x0FE, 0x101, + 0x104, 0x107, 0x10B, 0x10E, 0x111, 0x114, 0x118, 0x11B, 0x11E, 0x122, 0x125, 0x129, 0x12C, 0x130, 0x133, 0x137, + 0x13A, 0x13E, 0x141, 0x145, 0x148, 0x14C, 0x150, 0x153, 0x157, 0x15B, 0x15F, 0x162, 0x166, 0x16A, 0x16E, 0x172, + 0x176, 0x17A, 0x17D, 0x181, 0x185, 0x189, 0x18D, 0x191, 0x195, 0x19A, 0x19E, 0x1A2, 0x1A6, 0x1AA, 0x1AE, 0x1B2, + 0x1B7, 0x1BB, 0x1BF, 0x1C3, 0x1C8, 0x1CC, 0x1D0, 0x1D5, 0x1D9, 0x1DD, 0x1E2, 0x1E6, 0x1EB, 0x1EF, 0x1F3, 0x1F8, + 0x1FC, 0x201, 0x205, 0x20A, 0x20F, 0x213, 0x218, 0x21C, 0x221, 0x226, 0x22A, 0x22F, 0x233, 0x238, 0x23D, 0x241, + 0x246, 0x24B, 0x250, 0x254, 0x259, 0x25E, 0x263, 0x267, 0x26C, 0x271, 0x276, 0x27B, 0x280, 0x284, 0x289, 0x28E, + 0x293, 0x298, 0x29D, 0x2A2, 0x2A6, 0x2AB, 0x2B0, 0x2B5, 0x2BA, 0x2BF, 0x2C4, 0x2C9, 0x2CE, 0x2D3, 0x2D8, 0x2DC, + 0x2E1, 0x2E6, 0x2EB, 0x2F0, 0x2F5, 0x2FA, 0x2FF, 0x304, 0x309, 0x30E, 0x313, 0x318, 0x31D, 0x322, 0x326, 0x32B, + 0x330, 0x335, 0x33A, 0x33F, 0x344, 0x349, 0x34E, 0x353, 0x357, 0x35C, 0x361, 0x366, 0x36B, 0x370, 0x374, 0x379, + 0x37E, 0x383, 0x388, 0x38C, 0x391, 0x396, 0x39B, 0x39F, 0x3A4, 0x3A9, 0x3AD, 0x3B2, 0x3B7, 0x3BB, 0x3C0, 0x3C5, + 0x3C9, 0x3CE, 0x3D2, 0x3D7, 0x3DC, 0x3E0, 0x3E5, 0x3E9, 0x3ED, 0x3F2, 0x3F6, 0x3FB, 0x3FF, 0x403, 0x408, 0x40C, + 0x410, 0x415, 0x419, 0x41D, 0x421, 0x425, 0x42A, 0x42E, 0x432, 0x436, 0x43A, 0x43E, 0x442, 0x446, 0x44A, 0x44E, + 0x452, 0x455, 0x459, 0x45D, 0x461, 0x465, 0x468, 0x46C, 0x470, 0x473, 0x477, 0x47A, 0x47E, 0x481, 0x485, 0x488, + 0x48C, 0x48F, 0x492, 0x496, 0x499, 0x49C, 0x49F, 0x4A2, 0x4A6, 0x4A9, 0x4AC, 0x4AF, 0x4B2, 0x4B5, 0x4B7, 0x4BA, + 0x4BD, 0x4C0, 0x4C3, 0x4C5, 0x4C8, 0x4CB, 0x4CD, 0x4D0, 0x4D2, 0x4D5, 0x4D7, 0x4D9, 0x4DC, 0x4DE, 0x4E0, 0x4E3, + 0x4E5, 0x4E7, 0x4E9, 0x4EB, 0x4ED, 0x4EF, 0x4F1, 0x4F3, 0x4F5, 0x4F6, 0x4F8, 0x4FA, 0x4FB, 0x4FD, 0x4FF, 0x500, + 0x502, 0x503, 0x504, 0x506, 0x507, 0x508, 0x50A, 0x50B, 0x50C, 0x50D, 0x50E, 0x50F, 0x510, 0x511, 0x511, 0x512, + 0x513, 0x514, 0x514, 0x515, 0x516, 0x516, 0x517, 0x517, 0x517, 0x518, 0x518, 0x518, 0x518, 0x518, 0x519, 0x519 +}; + +static void dsp_cycleChannel(Dsp* dsp, int ch); +static void dsp_handleEcho(Dsp* dsp, int* outputL, int* outputR); +static void dsp_handleGain(Dsp* dsp, int ch); +static void dsp_decodeBrr(Dsp* dsp, int ch); +static int16_t dsp_getSample(Dsp* dsp, int ch, int sampleNum, int offset); +static void dsp_handleNoise(Dsp* dsp); + +Dsp* dsp_init(uint8_t *apu_ram) { + Dsp* dsp = (Dsp*)malloc(sizeof(Dsp)); + dsp->apu_ram = apu_ram; + return dsp; +} + +void dsp_free(Dsp* dsp) { + free(dsp); +} + +void dsp_reset(Dsp* dsp) { + memset(dsp->ram, 0, sizeof(dsp->ram)); + dsp->ram[0x7c] = 0xff; // set ENDx + for(int i = 0; i < 8; i++) { + dsp->channel[i].pitch = 0; + dsp->channel[i].pitchCounter = 0; + dsp->channel[i].pitchModulation = false; + memset(dsp->channel[i].decodeBuffer, 0, sizeof(dsp->channel[i].decodeBuffer)); + dsp->channel[i].srcn = 0; + dsp->channel[i].decodeOffset = 0; + dsp->channel[i].previousFlags = 0; + dsp->channel[i].old = 0; + dsp->channel[i].older = 0; + dsp->channel[i].useNoise = false; + memset(dsp->channel[i].adsrRates, 0, sizeof(dsp->channel[i].adsrRates)); + dsp->channel[i].rateCounter = 0; + dsp->channel[i].adsrState = 0; + dsp->channel[i].sustainLevel = 0; + dsp->channel[i].useGain = false; + dsp->channel[i].gainMode = 0; + dsp->channel[i].directGain = false; + dsp->channel[i].gainValue = 0; + dsp->channel[i].gain = 0; + dsp->channel[i].keyOn = false; + dsp->channel[i].keyOff = false; + dsp->channel[i].sampleOut = 0; + dsp->channel[i].volumeL = 0; + dsp->channel[i].volumeR = 0; + dsp->channel[i].echoEnable = false; + } + dsp->dirPage = 0; + dsp->evenCycle = false; + dsp->mute = true; + dsp->reset = true; + dsp->masterVolumeL = 0; + dsp->masterVolumeR = 0; + dsp->noiseSample = -0x4000; + dsp->noiseRate = 0; + dsp->noiseCounter = 0; + dsp->echoWrites = false; + dsp->echoVolumeL = 0; + dsp->echoVolumeR = 0; + dsp->feedbackVolume = 0; + dsp->echoBufferAdr = 0; + dsp->echoDelay = 1; + dsp->echoRemain = 1; + dsp->echoBufferIndex = 0; + dsp->firBufferIndex = 0; + memset(dsp->firValues, 0, sizeof(dsp->firValues)); + memset(dsp->firBufferL, 0, sizeof(dsp->firBufferL)); + memset(dsp->firBufferR, 0, sizeof(dsp->firBufferR)); + memset(dsp->sampleBuffer, 0, sizeof(dsp->sampleBuffer)); + dsp->sampleOffset = 0; +} + +void dsp_saveload(Dsp *dsp, SaveLoadFunc *func, void *ctx) { + func(ctx, &dsp->ram, sizeof(Dsp) - offsetof(Dsp, ram)); +} + +void dsp_cycle(Dsp* dsp) { + int totalL = 0; + int totalR = 0; + for(int i = 0; i < 8; i++) { + dsp_cycleChannel(dsp, i); + totalL += (dsp->channel[i].sampleOut * dsp->channel[i].volumeL) >> 6; + totalR += (dsp->channel[i].sampleOut * dsp->channel[i].volumeR) >> 6; + totalL = totalL < -0x8000 ? -0x8000 : (totalL > 0x7fff ? 0x7fff : totalL); // clamp 16-bit + totalR = totalR < -0x8000 ? -0x8000 : (totalR > 0x7fff ? 0x7fff : totalR); // clamp 16-bit + } + totalL = (totalL * dsp->masterVolumeL) >> 7; + totalR = (totalR * dsp->masterVolumeR) >> 7; + totalL = totalL < -0x8000 ? -0x8000 : (totalL > 0x7fff ? 0x7fff : totalL); // clamp 16-bit + totalR = totalR < -0x8000 ? -0x8000 : (totalR > 0x7fff ? 0x7fff : totalR); // clamp 16-bit + dsp_handleEcho(dsp, &totalL, &totalR); + if(dsp->mute) { + totalL = 0; + totalR = 0; + } + dsp_handleNoise(dsp); + // put it in the samplebuffer, if space + if (dsp->sampleOffset < 534) { + dsp->sampleBuffer[dsp->sampleOffset * 2] = totalL; + dsp->sampleBuffer[dsp->sampleOffset * 2 + 1] = totalR; + dsp->sampleOffset++; + } + dsp->evenCycle = !dsp->evenCycle; +} + +static void dsp_handleEcho(Dsp* dsp, int* outputL, int* outputR) { + // get value out of ram + uint16_t adr = dsp->echoBufferAdr + dsp->echoBufferIndex * 4; + dsp->firBufferL[dsp->firBufferIndex] = ( + dsp->apu_ram[adr] + (dsp->apu_ram[(adr + 1) & 0xffff] << 8) + ); + dsp->firBufferL[dsp->firBufferIndex] >>= 1; + dsp->firBufferR[dsp->firBufferIndex] = ( + dsp->apu_ram[(adr + 2) & 0xffff] + (dsp->apu_ram[(adr + 3) & 0xffff] << 8) + ); + dsp->firBufferR[dsp->firBufferIndex] >>= 1; + // calculate FIR-sum + int sumL = 0, sumR = 0; + for(int i = 0; i < 8; i++) { + sumL += (dsp->firBufferL[(dsp->firBufferIndex + i + 1) & 0x7] * dsp->firValues[i]) >> 6; + sumR += (dsp->firBufferR[(dsp->firBufferIndex + i + 1) & 0x7] * dsp->firValues[i]) >> 6; + if(i == 6) { + // clip to 16-bit before last addition + sumL = ((int16_t) (sumL & 0xffff)); // clip 16-bit + sumR = ((int16_t) (sumR & 0xffff)); // clip 16-bit + } + } + sumL = sumL < -0x8000 ? -0x8000 : (sumL > 0x7fff ? 0x7fff : sumL); // clamp 16-bit + sumR = sumR < -0x8000 ? -0x8000 : (sumR > 0x7fff ? 0x7fff : sumR); // clamp 16-bit + // modify output with sum + int outL = *outputL + ((sumL * dsp->echoVolumeL) >> 7); + int outR = *outputR + ((sumR * dsp->echoVolumeR) >> 7); + *outputL = outL < -0x8000 ? -0x8000 : (outL > 0x7fff ? 0x7fff : outL); // clamp 16-bit + *outputR = outR < -0x8000 ? -0x8000 : (outR > 0x7fff ? 0x7fff : outR); // clamp 16-bit + // get echo input + int inL = 0, inR = 0; + for(int i = 0; i < 8; i++) { + if(dsp->channel[i].echoEnable) { + inL += (dsp->channel[i].sampleOut * dsp->channel[i].volumeL) >> 6; + inR += (dsp->channel[i].sampleOut * dsp->channel[i].volumeR) >> 6; + inL = inL < -0x8000 ? -0x8000 : (inL > 0x7fff ? 0x7fff : inL); // clamp 16-bit + inR = inR < -0x8000 ? -0x8000 : (inR > 0x7fff ? 0x7fff : inR); // clamp 16-bit + } + } + // write this to ram + inL += (sumL * dsp->feedbackVolume) >> 7; + inR += (sumR * dsp->feedbackVolume) >> 7; + inL = inL < -0x8000 ? -0x8000 : (inL > 0x7fff ? 0x7fff : inL); // clamp 16-bit + inR = inR < -0x8000 ? -0x8000 : (inR > 0x7fff ? 0x7fff : inR); // clamp 16-bit + inL &= 0xfffe; + inR &= 0xfffe; + if(dsp->echoWrites) { + dsp->apu_ram[adr] = inL & 0xff; + dsp->apu_ram[(adr + 1) & 0xffff] = inL >> 8; + dsp->apu_ram[(adr + 2) & 0xffff] = inR & 0xff; + dsp->apu_ram[(adr + 3) & 0xffff] = inR >> 8; + } + // handle indexes + dsp->firBufferIndex++; + dsp->firBufferIndex &= 7; + dsp->echoBufferIndex++; + dsp->echoRemain--; + if(dsp->echoRemain == 0) { + dsp->echoRemain = dsp->echoDelay; + dsp->echoBufferIndex = 0; + } +} + +static void dsp_cycleChannel(Dsp* dsp, int ch) { + // handle pitch counter + uint16_t pitch = dsp->channel[ch].pitch; + if(ch > 0 && dsp->channel[ch].pitchModulation) { + int factor = (dsp->channel[ch - 1].sampleOut >> 4) + 0x400; + pitch = (pitch * factor) >> 10; + if(pitch > 0x3fff) pitch = 0x3fff; + } + int newCounter = dsp->channel[ch].pitchCounter + pitch; + if(newCounter > 0xffff) { + // next sample + dsp_decodeBrr(dsp, ch); + } + dsp->channel[ch].pitchCounter = newCounter; + int16_t sample = 0; + if(dsp->channel[ch].useNoise) { + sample = dsp->noiseSample; + } else { + sample = dsp_getSample(dsp, ch, dsp->channel[ch].pitchCounter >> 12, (dsp->channel[ch].pitchCounter >> 4) & 0xff); + } +#if !MY_CHANGES + if(dsp->evenCycle) { + // handle keyon/off (every other cycle) + if(dsp->channel[ch].keyOff) { + // go to release + dsp->channel[ch].adsrState = 4; + } else if(dsp->channel[ch].keyOn) { + dsp->channel[ch].keyOn = false; + // restart current sample + dsp->channel[ch].previousFlags = 0; + uint16_t samplePointer = dsp->dirPage + 4 * dsp->channel[ch].srcn; + dsp->channel[ch].decodeOffset = dsp->apu_ram[samplePointer]; + dsp->channel[ch].decodeOffset |= dsp->apu_ram[(samplePointer + 1) & 0xffff] << 8; + memset(dsp->channel[ch].decodeBuffer, 0, sizeof(dsp->channel[ch].decodeBuffer)); + dsp->channel[ch].gain = 0; + dsp->channel[ch].adsrState = dsp->channel[ch].useGain ? 3 : 0; + } + } +#endif + // handle reset + if(dsp->reset) { + dsp->channel[ch].adsrState = 4; + dsp->channel[ch].gain = 0; + } + // handle envelope/adsr + bool doingDirectGain = dsp->channel[ch].adsrState != 4 && dsp->channel[ch].useGain && dsp->channel[ch].directGain; + uint16_t rate = dsp->channel[ch].adsrState == 4 ? 0 : dsp->channel[ch].adsrRates[dsp->channel[ch].adsrState]; + if(dsp->channel[ch].adsrState != 4 && !doingDirectGain && rate != 0) { + dsp->channel[ch].rateCounter++; + } + if(dsp->channel[ch].adsrState == 4 || (!doingDirectGain && dsp->channel[ch].rateCounter >= rate && rate != 0)) { + if(dsp->channel[ch].adsrState != 4) dsp->channel[ch].rateCounter = 0; + dsp_handleGain(dsp, ch); + } + if(doingDirectGain) dsp->channel[ch].gain = dsp->channel[ch].gainValue; + // set outputs + dsp->ram[(ch << 4) | 8] = dsp->channel[ch].gain >> 4; + sample = (sample * dsp->channel[ch].gain) >> 11; + dsp->ram[(ch << 4) | 9] = sample >> 7; + dsp->channel[ch].sampleOut = sample; +} + +static void dsp_handleGain(Dsp* dsp, int ch) { + switch(dsp->channel[ch].adsrState) { + case 0: { // attack + uint16_t rate = dsp->channel[ch].adsrRates[dsp->channel[ch].adsrState]; + dsp->channel[ch].gain += rate == 1 ? 1024 : 32; + if(dsp->channel[ch].gain >= 0x7e0) dsp->channel[ch].adsrState = 1; + if(dsp->channel[ch].gain > 0x7ff) dsp->channel[ch].gain = 0x7ff; + break; + } + case 1: { // decay + dsp->channel[ch].gain -= ((dsp->channel[ch].gain - 1) >> 8) + 1; + if(dsp->channel[ch].gain < dsp->channel[ch].sustainLevel) dsp->channel[ch].adsrState = 2; + break; + } + case 2: { // sustain + dsp->channel[ch].gain -= ((dsp->channel[ch].gain - 1) >> 8) + 1; + break; + } + case 3: { // gain + switch(dsp->channel[ch].gainMode) { + case 0: { // linear decrease + dsp->channel[ch].gain -= 32; + // decreasing below 0 will underflow to above 0x7ff + if(dsp->channel[ch].gain > 0x7ff) dsp->channel[ch].gain = 0; + break; + } + case 1: { // exponential decrease + dsp->channel[ch].gain -= ((dsp->channel[ch].gain - 1) >> 8) + 1; + break; + } + case 2: { // linear increase + dsp->channel[ch].gain += 32; + if(dsp->channel[ch].gain > 0x7ff) dsp->channel[ch].gain = 0; + break; + } + case 3: { // bent increase + dsp->channel[ch].gain += dsp->channel[ch].gain < 0x600 ? 32 : 8; + if(dsp->channel[ch].gain > 0x7ff) dsp->channel[ch].gain = 0; + break; + } + } + break; + } + case 4: { // release + dsp->channel[ch].gain -= 8; + // decreasing below 0 will underflow to above 0x7ff + if(dsp->channel[ch].gain > 0x7ff) dsp->channel[ch].gain = 0; + break; + } + } +} + +static int16_t dsp_getSample(Dsp* dsp, int ch, int sampleNum, int offset) { + int16_t news = dsp->channel[ch].decodeBuffer[sampleNum + 3]; + int16_t olds = dsp->channel[ch].decodeBuffer[sampleNum + 2]; + int16_t olders = dsp->channel[ch].decodeBuffer[sampleNum + 1]; + int16_t oldests = dsp->channel[ch].decodeBuffer[sampleNum]; + int out = (gaussValues[0xff - offset] * oldests) >> 10; + out += (gaussValues[0x1ff - offset] * olders) >> 10; + out += (gaussValues[0x100 + offset] * olds) >> 10; + out = ((int16_t) (out & 0xffff)); // clip 16-bit + out += (gaussValues[offset] * news) >> 10; + out = out < -0x8000 ? -0x8000 : (out > 0x7fff ? 0x7fff : out); // clamp 16-bit + return out >> 1; +} + +static void dsp_decodeBrr(Dsp* dsp, int ch) { + // copy last 3 samples (16-18) to first 3 for interpolation + dsp->channel[ch].decodeBuffer[0] = dsp->channel[ch].decodeBuffer[16]; + dsp->channel[ch].decodeBuffer[1] = dsp->channel[ch].decodeBuffer[17]; + dsp->channel[ch].decodeBuffer[2] = dsp->channel[ch].decodeBuffer[18]; + // handle flags from previous block + if(dsp->channel[ch].previousFlags == 1 || dsp->channel[ch].previousFlags == 3) { + // loop sample + uint16_t samplePointer = dsp->dirPage + 4 * dsp->channel[ch].srcn; + dsp->channel[ch].decodeOffset = dsp->apu_ram[(samplePointer + 2) & 0xffff]; + dsp->channel[ch].decodeOffset |= (dsp->apu_ram[(samplePointer + 3) & 0xffff]) << 8; + if(dsp->channel[ch].previousFlags == 1) { + // also release and clear gain + dsp->channel[ch].adsrState = 4; + dsp->channel[ch].gain = 0; + } + dsp->ram[0x7c] |= 1 << ch; // set ENDx + } + uint8_t header = dsp->apu_ram[dsp->channel[ch].decodeOffset++]; + int shift = header >> 4; + int filter = (header & 0xc) >> 2; + dsp->channel[ch].previousFlags = header & 0x3; + uint8_t curByte = 0; + int old = dsp->channel[ch].old; + int older = dsp->channel[ch].older; + for(int i = 0; i < 16; i++) { + int s = 0; + if(i & 1) { + s = curByte & 0xf; + } else { + curByte = dsp->apu_ram[dsp->channel[ch].decodeOffset++]; + s = curByte >> 4; + } + if(s > 7) s -= 16; + if(shift <= 0xc) { + s = (s << shift) >> 1; + } else { + s = (s >> 3) << 12; + } + switch(filter) { + case 1: s += old + (-old >> 4); break; + case 2: s += 2 * old + ((3 * -old) >> 5) - older + (older >> 4); break; + case 3: s += 2 * old + ((13 * -old) >> 6) - older + ((3 * older) >> 4); break; + } + s = s < -0x8000 ? -0x8000 : (s > 0x7fff ? 0x7fff : s); // clamp 16-bit + s = ((int16_t) ((s & 0x7fff) << 1)) >> 1; // clip 15-bit + older = old; + old = s; + dsp->channel[ch].decodeBuffer[i + 3] = s; + } + dsp->channel[ch].older = older; + dsp->channel[ch].old = old; +} + +static void dsp_handleNoise(Dsp* dsp) { + if(dsp->noiseRate != 0) { + dsp->noiseCounter++; + } + if(dsp->noiseCounter >= dsp->noiseRate && dsp->noiseRate != 0) { + int bit = (dsp->noiseSample & 1) ^ ((dsp->noiseSample >> 1) & 1); + dsp->noiseSample = ((dsp->noiseSample >> 1) & 0x3fff) | (bit << 14); + dsp->noiseSample = ((int16_t) ((dsp->noiseSample & 0x7fff) << 1)) >> 1; + dsp->noiseCounter = 0; + } +} + +uint8_t dsp_read(Dsp* dsp, uint8_t adr) { + return dsp->ram[adr]; +} + +void dsp_write(Dsp* dsp, uint8_t adr, uint8_t val) { + int ch = adr >> 4; + switch(adr) { + case 0x00: case 0x10: case 0x20: case 0x30: case 0x40: case 0x50: case 0x60: case 0x70: { + dsp->channel[ch].volumeL = val; + break; + } + case 0x01: case 0x11: case 0x21: case 0x31: case 0x41: case 0x51: case 0x61: case 0x71: { + dsp->channel[ch].volumeR = val; + break; + } + case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52: case 0x62: case 0x72: { + dsp->channel[ch].pitch = (dsp->channel[ch].pitch & 0x3f00) | val; + break; + } + case 0x03: case 0x13: case 0x23: case 0x33: case 0x43: case 0x53: case 0x63: case 0x73: { + dsp->channel[ch].pitch = ((dsp->channel[ch].pitch & 0x00ff) | (val << 8)) & 0x3fff; + break; + } + case 0x04: case 0x14: case 0x24: case 0x34: case 0x44: case 0x54: case 0x64: case 0x74: { + dsp->channel[ch].srcn = val; + break; + } + case 0x05: case 0x15: case 0x25: case 0x35: case 0x45: case 0x55: case 0x65: case 0x75: { + dsp->channel[ch].adsrRates[0] = rateValues[(val & 0xf) * 2 + 1]; + dsp->channel[ch].adsrRates[1] = rateValues[((val & 0x70) >> 4) * 2 + 16]; + dsp->channel[ch].useGain = (val & 0x80) == 0; + break; + } + case 0x06: case 0x16: case 0x26: case 0x36: case 0x46: case 0x56: case 0x66: case 0x76: { + dsp->channel[ch].adsrRates[2] = rateValues[val & 0x1f]; + dsp->channel[ch].sustainLevel = (((val & 0xe0) >> 5) + 1) * 0x100; + break; + } + case 0x07: case 0x17: case 0x27: case 0x37: case 0x47: case 0x57: case 0x67: case 0x77: { + dsp->channel[ch].directGain = (val & 0x80) == 0; + if(val & 0x80) { + dsp->channel[ch].gainMode = (val & 0x60) >> 5; + dsp->channel[ch].adsrRates[3] = rateValues[val & 0x1f]; + } else { + dsp->channel[ch].gainValue = (val & 0x7f) * 16; + } + break; + } + case 0x0c: { + dsp->masterVolumeL = val; + break; + } + case 0x1c: { + dsp->masterVolumeR = val; + break; + } + case 0x2c: { + dsp->echoVolumeL = val; + break; + } + case 0x3c: { + dsp->echoVolumeR = val; + break; + } + case 0x4c: { + for(int ch = 0; ch < 8; ch++) { + dsp->channel[ch].keyOn = val & (1 << ch); +#if MY_CHANGES + + if (dsp->channel[ch].keyOn) { + dsp->channel[ch].keyOn = false; + // restart current sample + dsp->channel[ch].previousFlags = 0; + uint16_t samplePointer = dsp->dirPage + 4 * dsp->channel[ch].srcn; + dsp->channel[ch].decodeOffset = dsp->apu_ram[samplePointer]; + dsp->channel[ch].decodeOffset |= dsp->apu_ram[(samplePointer + 1) & 0xffff] << 8; + memset(dsp->channel[ch].decodeBuffer, 0, sizeof(dsp->channel[ch].decodeBuffer)); + dsp->channel[ch].gain = 0; + dsp->channel[ch].adsrState = dsp->channel[ch].useGain ? 3 : 0; + } +#endif + } + break; + } + case 0x5c: { + for(int ch = 0; ch < 8; ch++) { + dsp->channel[ch].keyOff = val & (1 << ch); +#if MY_CHANGES + if (dsp->channel[ch].keyOff) { + // go to release + dsp->channel[ch].adsrState = 4; + } +#endif + } + + + break; + } + case 0x6c: { + dsp->reset = val & 0x80; + dsp->mute = val & 0x40; + dsp->echoWrites = (val & 0x20) == 0; + dsp->noiseRate = rateValues[val & 0x1f]; + break; + } + case 0x7c: { + val = 0; // any write clears ENDx + break; + } + case 0x0d: { + dsp->feedbackVolume = val; + break; + } + case 0x2d: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].pitchModulation = val & (1 << i); + } + break; + } + case 0x3d: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].useNoise = val & (1 << i); + } + break; + } + case 0x4d: { + for(int i = 0; i < 8; i++) { + dsp->channel[i].echoEnable = val & (1 << i); + } + break; + } + case 0x5d: { + dsp->dirPage = val << 8; + break; + } + case 0x6d: { + dsp->echoBufferAdr = val << 8; + break; + } + case 0x7d: { + dsp->echoDelay = (val & 0xf) * 512; // 2048-byte steps, stereo sample is 4 bytes + if(dsp->echoDelay == 0) dsp->echoDelay = 1; + break; + } + case 0x0f: case 0x1f: case 0x2f: case 0x3f: case 0x4f: case 0x5f: case 0x6f: case 0x7f: { + dsp->firValues[ch] = val; + break; + } + } + dsp->ram[adr] = val; +} + +void dsp_getSamples(Dsp* dsp, int16_t* sampleData, int samplesPerFrame) { + // resample from 534 samples per frame to wanted value + double adder = 534.0 / samplesPerFrame; + double location = 0.0; + for(int i = 0; i < samplesPerFrame; i++) { + sampleData[i * 2] = dsp->sampleBuffer[((int) location) * 2]; + sampleData[i * 2 + 1] = dsp->sampleBuffer[((int) location) * 2 + 1]; + location += adder; + } + dsp->sampleOffset = 0; +} diff --git a/snes/dsp.h b/snes/dsp.h new file mode 100644 index 00000000..1ead71d9 --- /dev/null +++ b/snes/dsp.h @@ -0,0 +1,101 @@ + +#ifndef DSP_H +#define DSP_H + +#include +#include +#include +#include +#include + +typedef struct Dsp Dsp; + +#include "saveload.h" + +typedef struct DspChannel { + // pitch + uint16_t pitch; + uint16_t pitchCounter; + bool pitchModulation; + // brr decoding + int16_t decodeBuffer[19]; // 16 samples per brr-block, +3 for interpolation + uint8_t srcn; + uint16_t decodeOffset; + uint8_t previousFlags; // from last sample + int16_t old; + int16_t older; + bool useNoise; + // adsr, envelope, gain + uint16_t adsrRates[4]; // attack, decay, sustain, gain + uint16_t rateCounter; + uint8_t adsrState; // 0: attack, 1: decay, 2: sustain, 3: gain, 4: release + uint16_t sustainLevel; + bool useGain; + uint8_t gainMode; + bool directGain; + uint16_t gainValue; // for direct gain + uint16_t gain; + // keyon/off + bool keyOn; + bool keyOff; + // output + int16_t sampleOut; // final sample, to be multiplied by channel volume + int8_t volumeL; + int8_t volumeR; + bool echoEnable; +} DspChannel; + +struct Dsp { + uint8_t *apu_ram; + // mirror ram + uint8_t ram[0x80]; + // 8 channels + DspChannel channel[8]; + // overarching + uint16_t dirPage; + bool evenCycle; + bool mute; + bool reset; + int8_t masterVolumeL; + int8_t masterVolumeR; + // noise + int16_t noiseSample; + uint16_t noiseRate; + uint16_t noiseCounter; + // echo + bool echoWrites; + int8_t echoVolumeL; + int8_t echoVolumeR; + int8_t feedbackVolume; + uint16_t echoBufferAdr; + uint16_t echoDelay; + uint16_t echoRemain; + uint16_t echoBufferIndex; + uint8_t firBufferIndex; + int8_t firValues[8]; + int16_t firBufferL[8]; + int16_t firBufferR[8]; + // sample buffer (1 frame at 32040 Hz: 534 samples, *2 for stereo) + int16_t sampleBuffer[534 * 2]; + uint16_t sampleOffset; // current offset in samplebuffer +}; + + +#include "../dsp_regs.h" + +typedef struct DspRegWriteHistory { + uint32_t count; + enum DspReg addr[256]; + uint8_t val[256]; +} DspRegWriteHistory; + +Dsp* dsp_init(uint8_t *apu_ram); +void dsp_free(Dsp* dsp); +void dsp_reset(Dsp* dsp); +void dsp_cycle(Dsp* dsp); +uint8_t dsp_read(Dsp* dsp, uint8_t adr); +void dsp_write(Dsp* dsp, uint8_t adr, uint8_t val); +void dsp_getSamples(Dsp* dsp, int16_t* sampleData, int samplesPerFrame); +void dsp_saveload(Dsp *dsp, SaveLoadFunc *func, void *ctx); + +#endif diff --git a/snes/input.cpp b/snes/input.cpp new file mode 100644 index 00000000..8e9b6b0f --- /dev/null +++ b/snes/input.cpp @@ -0,0 +1,40 @@ + +#include +#include +#include +#include +#include + +#include "input.h" +#include "snes.h" + +Input* input_init(Snes* snes) { + Input* input = (Input * )malloc(sizeof(Input)); + input->snes = snes; + // TODO: handle (where?) + input->type = 1; + input->currentState = 0; + return input; +} + +void input_free(Input* input) { + free(input); +} + +void input_reset(Input* input) { + input->latchLine = false; + input->latchedState = 0; +} + +void input_cycle(Input* input) { + if(input->latchLine) { + input->latchedState = input->currentState; + } +} + +uint8_t input_read(Input* input) { + uint8_t ret = input->latchedState & 1; + input->latchedState >>= 1; + input->latchedState |= 0x8000; + return ret; +} diff --git a/snes/input.h b/snes/input.h new file mode 100644 index 00000000..3d6803f2 --- /dev/null +++ b/snes/input.h @@ -0,0 +1,31 @@ + +#ifndef INPUT_H +#define INPUT_H + +#include +#include +#include +#include +#include + +typedef struct Input Input; + +#include "snes.h" + +struct Input { + Snes* snes; + uint8_t type; + // latchline + bool latchLine; + // for controller + uint16_t currentState; // actual state + uint16_t latchedState; +}; + +Input* input_init(Snes* snes); +void input_free(Input* input); +void input_reset(Input* input); +void input_cycle(Input* input); +uint8_t input_read(Input* input); + +#endif diff --git a/snes/ppu.cpp b/snes/ppu.cpp new file mode 100644 index 00000000..bfd92446 --- /dev/null +++ b/snes/ppu.cpp @@ -0,0 +1,1047 @@ + +#include +#include +#include +#include +#include +#include +#include "ppu.h" +#include "snes.h" + +// array for layer definitions per mode: +// 0-7: mode 0-7; 8: mode 1 + l3prio; 9: mode 7 + extbg + +// 0-3; layers 1-4; 4: sprites; 5: nonexistent +static const int layersPerMode[10][12] = { + {4, 0, 1, 4, 0, 1, 4, 2, 3, 4, 2, 3}, + {4, 0, 1, 4, 0, 1, 4, 2, 4, 2, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5}, + {4, 0, 4, 4, 0, 4, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 0, 4, 5, 5, 5, 5, 5, 5, 5}, + {2, 4, 0, 1, 4, 0, 1, 4, 4, 2, 5, 5}, + {4, 4, 1, 4, 0, 4, 1, 5, 5, 5, 5, 5} +}; + +static const int prioritysPerMode[10][12] = { + {3, 1, 1, 2, 0, 0, 1, 1, 1, 0, 0, 0}, + {3, 1, 1, 2, 0, 0, 1, 1, 0, 0, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5}, + {3, 1, 2, 1, 0, 0, 5, 5, 5, 5, 5, 5}, + {3, 2, 1, 0, 0, 5, 5, 5, 5, 5, 5, 5}, + {1, 3, 1, 1, 2, 0, 0, 1, 0, 0, 5, 5}, + {3, 2, 1, 1, 0, 0, 0, 5, 5, 5, 5, 5} +}; + +static const int layerCountPerMode[10] = { + 12, 10, 8, 8, 8, 8, 6, 5, 10, 7 +}; + +static const int bitDepthsPerMode[10][4] = { + {2, 2, 2, 2}, + {4, 4, 2, 5}, + {4, 4, 5, 5}, + {8, 4, 5, 5}, + {8, 2, 5, 5}, + {4, 2, 5, 5}, + {4, 5, 5, 5}, + {8, 5, 5, 5}, + {4, 4, 2, 5}, + {8, 7, 5, 5} +}; + +static const int spriteSizes[8][2] = { + {8, 16}, {8, 32}, {8, 64}, {16, 32}, + {16, 64}, {32, 64}, {16, 32}, {16, 32} +}; + +static void ppu_handlePixel(Ppu* ppu, int x, int y); +static int ppu_getPixel(Ppu* ppu, int x, int y, bool sub, int* r, int* g, int* b); +static uint16_t ppu_getOffsetValue(Ppu* ppu, int col, int row); +static int ppu_getPixelForBgLayer(Ppu* ppu, int x, int y, int layer, bool priority); +static void ppu_handleOPT(Ppu* ppu, int layer, int* lx, int* ly); +static void ppu_calculateMode7Starts(Ppu* ppu, int y); +static int ppu_getPixelForMode7(Ppu* ppu, int x, int layer, bool priority); +static bool ppu_getWindowState(Ppu* ppu, int layer, int x); +static void ppu_evaluateSprites(Ppu* ppu, int line); +static uint16_t ppu_getVramRemap(Ppu* ppu); + +Ppu* ppu_init(Snes* snes) { + Ppu* ppu = (Ppu * )malloc(sizeof(Ppu)); + ppu->snes = snes; + return ppu; +} + +void ppu_free(Ppu* ppu) { + free(ppu); +} + +void ppu_reset(Ppu* ppu) { + memset(ppu->vram, 0, sizeof(ppu->vram)); + ppu->vramPointer = 0; + ppu->vramIncrementOnHigh = false; + ppu->vramIncrement = 1; + ppu->vramRemapMode = 0; + ppu->vramReadBuffer = 0; + memset(ppu->cgram, 0, sizeof(ppu->cgram)); + ppu->cgramPointer = 0; + ppu->cgramSecondWrite = false; + ppu->cgramBuffer = 0; + memset(ppu->oam, 0, sizeof(ppu->oam)); + memset(ppu->highOam, 0, sizeof(ppu->highOam)); + ppu->oamAdr = 0; + ppu->oamAdrWritten = 0; + ppu->oamInHigh = false; + ppu->oamInHighWritten = false; + ppu->oamSecondWrite = false; + ppu->oamBuffer = 0; + ppu->objPriority = false; + ppu->objTileAdr1 = 0; + ppu->objTileAdr2 = 0; + ppu->objSize = 0; + memset(ppu->objPixelBuffer, 0, sizeof(ppu->objPixelBuffer)); + memset(ppu->objPriorityBuffer, 0, sizeof(ppu->objPriorityBuffer)); + ppu->timeOver = false; + ppu->rangeOver = false; + ppu->objInterlace = false; + for(int i = 0; i < 4; i++) { + ppu->bgLayer[i].hScroll = 0; + ppu->bgLayer[i].vScroll = 0; + ppu->bgLayer[i].tilemapWider = false; + ppu->bgLayer[i].tilemapHigher = false; + ppu->bgLayer[i].tilemapAdr = 0; + ppu->bgLayer[i].tileAdr = 0; + ppu->bgLayer[i].bigTiles = false; + ppu->bgLayer[i].mosaicEnabled = false; + } + ppu->scrollPrev = 0; + ppu->scrollPrev2 = 0; + ppu->mosaicSize = 1; + ppu->mosaicStartLine = 1; + for(int i = 0; i < 5; i++) { + ppu->layer[i].mainScreenEnabled = false; + ppu->layer[i].subScreenEnabled = false; + ppu->layer[i].mainScreenWindowed = false; + ppu->layer[i].subScreenWindowed = false; + } + memset(ppu->m7matrix, 0, sizeof(ppu->m7matrix)); + ppu->m7prev = 0; + ppu->m7largeField = false; + ppu->m7charFill = false; + ppu->m7xFlip = false; + ppu->m7yFlip = false; + ppu->m7extBg = false; + ppu->m7startX = 0; + ppu->m7startY = 0; + for(int i = 0; i < 6; i++) { + ppu->windowLayer[i].window1enabled = false; + ppu->windowLayer[i].window2enabled = false; + ppu->windowLayer[i].window1inversed = false; + ppu->windowLayer[i].window2inversed = false; + ppu->windowLayer[i].maskLogic = 0; + } + ppu->window1left = 0; + ppu->window1right = 0; + ppu->window2left = 0; + ppu->window2right = 0; + ppu->clipMode = 0; + ppu->preventMathMode = 0; + ppu->addSubscreen = false; + ppu->subtractColor = false; + ppu->halfColor = false; + memset(ppu->mathEnabled, 0, sizeof(ppu->mathEnabled)); + ppu->fixedColorR = 0; + ppu->fixedColorG = 0; + ppu->fixedColorB = 0; + ppu->forcedBlank = true; + ppu->brightness = 0; + ppu->mode = 0; + ppu->bg3priority = false; + ppu->evenFrame = false; + ppu->pseudoHires = false; + ppu->overscan = false; + ppu->frameOverscan = false; + ppu->interlace = false; + ppu->frameInterlace = false; + ppu->directColor = false; + ppu->hCount = 0; + ppu->vCount = 0; + ppu->hCountSecond = false; + ppu->vCountSecond = false; + ppu->countersLatched = false; + ppu->ppu1openBus = 0; + ppu->ppu2openBus = 0; + memset(ppu->pixelBuffer, 0, sizeof(ppu->pixelBuffer)); +} + +void ppu_saveload(Ppu *ppu, SaveLoadFunc *func, void *ctx) { + func(ctx, &ppu->vram, offsetof(Ppu, pixelBuffer) - offsetof(Ppu, vram)); +} + +bool ppu_checkOverscan(Ppu* ppu) { + // called at (0,225) + ppu->frameOverscan = ppu->overscan; // set if we have a overscan-frame + return ppu->frameOverscan; +} + +void ppu_handleVblank(Ppu* ppu) { + // called either right after ppu_checkOverscan at (0,225), or at (0,240) + if(!ppu->forcedBlank) { + ppu->oamAdr = ppu->oamAdrWritten; + ppu->oamInHigh = ppu->oamInHighWritten; + ppu->oamSecondWrite = false; + } + ppu->frameInterlace = ppu->interlace; // set if we have a interlaced frame +} + +void ppu_runLine(Ppu* ppu, int line) { + if(line == 0) { + // pre-render line + // TODO: this now happens halfway into the first line + ppu->mosaicStartLine = 1; + ppu->rangeOver = false; + ppu->timeOver = false; + ppu->evenFrame = !ppu->evenFrame; + } else { + // evaluate sprites + memset(ppu->objPixelBuffer, 0, sizeof(ppu->objPixelBuffer)); + if(!ppu->forcedBlank) ppu_evaluateSprites(ppu, line - 1); + // actual line + if(ppu->mode == 7) ppu_calculateMode7Starts(ppu, line); + for(int x = 0; x < 256; x++) { + ppu_handlePixel(ppu, x, line); + } + } +} + +static void ppu_handlePixel(Ppu* ppu, int x, int y) { + int r = 0, r2 = 0; + int g = 0, g2 = 0; + int b = 0, b2 = 0; + if(!ppu->forcedBlank) { + int mainLayer = ppu_getPixel(ppu, x, y, false, &r, &g, &b); + + bool colorWindowState = ppu_getWindowState(ppu, 5, x); + if( + ppu->clipMode == 3 || + (ppu->clipMode == 2 && colorWindowState) || + (ppu->clipMode == 1 && !colorWindowState) + ) { + r = g = b = 0; + } + int secondLayer = 5; // backdrop + bool mathEnabled = mainLayer < 6 && ppu->mathEnabled[mainLayer] && !( + ppu->preventMathMode == 3 || + (ppu->preventMathMode == 2 && colorWindowState) || + (ppu->preventMathMode == 1 && !colorWindowState) + ); + if((mathEnabled && ppu->addSubscreen) || ppu->pseudoHires || ppu->mode == 5 || ppu->mode == 6) { + secondLayer = ppu_getPixel(ppu, x, y, true, &r2, &g2, &b2); + } + // TODO: subscreen pixels can be clipped to black as well + // TODO: math for subscreen pixels (add/sub sub to main) + if(mathEnabled) { + if(ppu->subtractColor) { + r -= (ppu->addSubscreen && secondLayer != 5) ? r2 : ppu->fixedColorR; + g -= (ppu->addSubscreen && secondLayer != 5) ? g2 : ppu->fixedColorG; + b -= (ppu->addSubscreen && secondLayer != 5) ? b2 : ppu->fixedColorB; + } else { + r += (ppu->addSubscreen && secondLayer != 5) ? r2 : ppu->fixedColorR; + g += (ppu->addSubscreen && secondLayer != 5) ? g2 : ppu->fixedColorG; + b += (ppu->addSubscreen && secondLayer != 5) ? b2 : ppu->fixedColorB; + } + if(ppu->halfColor && (secondLayer != 5 || !ppu->addSubscreen)) { + r >>= 1; + g >>= 1; + b >>= 1; + } + if(r > 31) r = 31; + if(g > 31) g = 31; + if(b > 31) b = 31; + if(r < 0) r = 0; + if(g < 0) g = 0; + if(b < 0) b = 0; + } + if(!(ppu->pseudoHires || ppu->mode == 5 || ppu->mode == 6)) { + r2 = r; g2 = g; b2 = b; + } + } + int row = (y - 1) + (ppu->evenFrame ? 0 : 239); + ppu->pixelBuffer[row * 2048 + x * 8 + 1] = ((b2 << 3) | (b2 >> 2)) * ppu->brightness / 15; + ppu->pixelBuffer[row * 2048 + x * 8 + 2] = ((g2 << 3) | (g2 >> 2)) * ppu->brightness / 15; + ppu->pixelBuffer[row * 2048 + x * 8 + 3] = ((r2 << 3) | (r2 >> 2)) * ppu->brightness / 15; + ppu->pixelBuffer[row * 2048 + x * 8 + 5] = ((b << 3) | (b >> 2)) * ppu->brightness / 15; + ppu->pixelBuffer[row * 2048 + x * 8 + 6] = ((g << 3) | (g >> 2)) * ppu->brightness / 15; + ppu->pixelBuffer[row * 2048 + x * 8 + 7] = ((r << 3) | (r >> 2)) * ppu->brightness / 15; +} + +static int ppu_getPixel(Ppu* ppu, int x, int y, bool sub, int* r, int* g, int* b) { + // figure out which color is on this location on main- or subscreen, sets it in r, g, b + // returns which layer it is: 0-3 for bg layer, 4 or 6 for sprites (depending on palette), 5 for backdrop + int actMode = ppu->mode == 1 && ppu->bg3priority ? 8 : ppu->mode; + actMode = ppu->mode == 7 && ppu->m7extBg ? 9 : actMode; + int layer = 5; + int pixel = 0; + for(int i = 0; i < layerCountPerMode[actMode]; i++) { + int curLayer = layersPerMode[actMode][i]; + int curPriority = prioritysPerMode[actMode][i]; + bool layerActive = false; + if(!sub) { + layerActive = ppu->layer[curLayer].mainScreenEnabled && ( + !ppu->layer[curLayer].mainScreenWindowed || !ppu_getWindowState(ppu, curLayer, x) + ); + } else { + layerActive = ppu->layer[curLayer].subScreenEnabled && ( + !ppu->layer[curLayer].subScreenWindowed || !ppu_getWindowState(ppu, curLayer, x) + ); + } + if(layerActive) { + if(curLayer < 4) { + // bg layer + int lx = x; + int ly = y; + if(ppu->bgLayer[curLayer].mosaicEnabled && ppu->mosaicSize > 1) { + lx -= lx % ppu->mosaicSize; + ly -= (ly - ppu->mosaicStartLine) % ppu->mosaicSize; + } + if(ppu->mode == 7) { + pixel = ppu_getPixelForMode7(ppu, lx, curLayer, curPriority); + } else { + lx += ppu->bgLayer[curLayer].hScroll; + if(ppu->mode == 5 || ppu->mode == 6) { + lx *= 2; + lx += (sub || ppu->bgLayer[curLayer].mosaicEnabled) ? 0 : 1; + if(ppu->interlace) { + ly *= 2; + ly += (ppu->evenFrame || ppu->bgLayer[curLayer].mosaicEnabled) ? 0 : 1; + } + } + ly += ppu->bgLayer[curLayer].vScroll; + if(ppu->mode == 2 || ppu->mode == 4 || ppu->mode == 6) { + ppu_handleOPT(ppu, curLayer, &lx, &ly); + } + pixel = ppu_getPixelForBgLayer( + ppu, lx & 0x3ff, ly & 0x3ff, + curLayer, curPriority + ); + } + } else { + // get a pixel from the sprite buffer + pixel = 0; + if(ppu->objPriorityBuffer[x] == curPriority) pixel = ppu->objPixelBuffer[x]; + } + } + if(pixel > 0) { + layer = curLayer; + break; + } + } + if(ppu->directColor && layer < 4 && bitDepthsPerMode[actMode][layer] == 8) { + *r = ((pixel & 0x7) << 2) | ((pixel & 0x100) >> 7); + *g = ((pixel & 0x38) >> 1) | ((pixel & 0x200) >> 8); + *b = ((pixel & 0xc0) >> 3) | ((pixel & 0x400) >> 8); + } else { + uint16_t color = ppu->cgram[pixel & 0xff]; + *r = color & 0x1f; + *g = (color >> 5) & 0x1f; + *b = (color >> 10) & 0x1f; + } + if(layer == 4 && pixel < 0xc0) layer = 6; // sprites with palette color < 0xc0 + return layer; +} + +static void ppu_handleOPT(Ppu* ppu, int layer, int* lx, int* ly) { + int x = *lx; + int y = *ly; + int column = 0; + if(ppu->mode == 6) { + column = ((x - (x & 0xf)) - ((ppu->bgLayer[layer].hScroll * 2) & 0xfff0)) >> 4; + } else { + column = ((x - (x & 0x7)) - (ppu->bgLayer[layer].hScroll & 0xfff8)) >> 3; + } + if(column > 0) { + // fetch offset values from layer 3 tilemap + int valid = layer == 0 ? 0x2000 : 0x4000; + uint16_t hOffset = ppu_getOffsetValue(ppu, column - 1, 0); + uint16_t vOffset = 0; + if(ppu->mode == 4) { + if(hOffset & 0x8000) { + vOffset = hOffset; + hOffset = 0; + } + } else { + vOffset = ppu_getOffsetValue(ppu, column - 1, 1); + } + if(ppu->mode == 6) { + // TODO: not sure if correct + if(hOffset & valid) *lx = (((hOffset & 0x3f8) + (column * 8)) * 2) | (x & 0xf); + } else { + if(hOffset & valid) *lx = ((hOffset & 0x3f8) + (column * 8)) | (x & 0x7); + } + // TODO: not sure if correct for interlace + if(vOffset & valid) *ly = (vOffset & 0x3ff) + (y - ppu->bgLayer[layer].vScroll); + } +} + +static uint16_t ppu_getOffsetValue(Ppu* ppu, int col, int row) { + int x = col * 8 + ppu->bgLayer[2].hScroll; + int y = row * 8 + ppu->bgLayer[2].vScroll; + int tileBits = ppu->bgLayer[2].bigTiles ? 4 : 3; + int tileHighBit = ppu->bgLayer[2].bigTiles ? 0x200 : 0x100; + uint16_t tilemapAdr = ppu->bgLayer[2].tilemapAdr + (((y >> tileBits) & 0x1f) << 5 | ((x >> tileBits) & 0x1f)); + if((x & tileHighBit) && ppu->bgLayer[2].tilemapWider) tilemapAdr += 0x400; + if((y & tileHighBit) && ppu->bgLayer[2].tilemapHigher) tilemapAdr += ppu->bgLayer[2].tilemapWider ? 0x800 : 0x400; + return ppu->vram[tilemapAdr & 0x7fff]; +} + +static int ppu_getPixelForBgLayer(Ppu* ppu, int x, int y, int layer, bool priority) { + BgLayer *layerp = &ppu->bgLayer[layer]; + // figure out address of tilemap word and read it + bool wideTiles = layerp->bigTiles || ppu->mode == 5 || ppu->mode == 6; + int tileBitsX = wideTiles ? 4 : 3; + int tileHighBitX = wideTiles ? 0x200 : 0x100; + int tileBitsY = layerp->bigTiles ? 4 : 3; + int tileHighBitY = layerp->bigTiles ? 0x200 : 0x100; + uint16_t tilemapAdr = layerp->tilemapAdr + (((y >> tileBitsY) & 0x1f) << 5 | ((x >> tileBitsX) & 0x1f)); + if((x & tileHighBitX) && layerp->tilemapWider) tilemapAdr += 0x400; + if((y & tileHighBitY) && layerp->tilemapHigher) tilemapAdr += layerp->tilemapWider ? 0x800 : 0x400; + uint16_t tile = ppu->vram[tilemapAdr & 0x7fff]; + // check priority, get palette + if(((bool) (tile & 0x2000)) != priority) return 0; // wrong priority + int paletteNum = (tile & 0x1c00) >> 10; + // figure out position within tile + int row = (tile & 0x8000) ? 7 - (y & 0x7) : (y & 0x7); + int col = (tile & 0x4000) ? (x & 0x7) : 7 - (x & 0x7); + int tileNum = tile & 0x3ff; + if(wideTiles) { + // if unflipped right half of tile, or flipped left half of tile + if(((bool) (x & 8)) ^ ((bool) (tile & 0x4000))) tileNum += 1; + } + if(layerp->bigTiles) { + // if unflipped bottom half of tile, or flipped upper half of tile + if(((bool) (y & 8)) ^ ((bool) (tile & 0x8000))) tileNum += 0x10; + } + // read tiledata, ajust palette for mode 0 + int bitDepth = bitDepthsPerMode[ppu->mode][layer]; + if(ppu->mode == 0) paletteNum += 8 * layer; + // plane 1 (always) + int paletteSize = 4; + uint16_t plane1 = ppu->vram[(layerp->tileAdr + ((tileNum & 0x3ff) * 4 * bitDepth) + row) & 0x7fff]; + int pixel = (plane1 >> col) & 1; + pixel |= ((plane1 >> (8 + col)) & 1) << 1; + // plane 2 (for 4bpp, 8bpp) + if(bitDepth > 2) { + paletteSize = 16; + uint16_t plane2 = ppu->vram[(layerp->tileAdr + ((tileNum & 0x3ff) * 4 * bitDepth) + 8 + row) & 0x7fff]; + pixel |= ((plane2 >> col) & 1) << 2; + pixel |= ((plane2 >> (8 + col)) & 1) << 3; + } + // plane 3 & 4 (for 8bpp) + if(bitDepth > 4) { + paletteSize = 256; + uint16_t plane3 = ppu->vram[(layerp->tileAdr + ((tileNum & 0x3ff) * 4 * bitDepth) + 16 + row) & 0x7fff]; + pixel |= ((plane3 >> col) & 1) << 4; + pixel |= ((plane3 >> (8 + col)) & 1) << 5; + uint16_t plane4 = ppu->vram[(layerp->tileAdr + ((tileNum & 0x3ff) * 4 * bitDepth) + 24 + row) & 0x7fff]; + pixel |= ((plane4 >> col) & 1) << 6; + pixel |= ((plane4 >> (8 + col)) & 1) << 7; + } + // return cgram index, or 0 if transparent, palette number in bits 10-8 for 8-color layers + return pixel == 0 ? 0 : paletteSize * paletteNum + pixel; +} + +static void ppu_calculateMode7Starts(Ppu* ppu, int y) { + // expand 13-bit values to signed values + int hScroll = ((int16_t) (ppu->m7matrix[6] << 3)) >> 3; + int vScroll = ((int16_t) (ppu->m7matrix[7] << 3)) >> 3; + int xCenter = ((int16_t) (ppu->m7matrix[4] << 3)) >> 3; + int yCenter = ((int16_t) (ppu->m7matrix[5] << 3)) >> 3; + // do calculation + int clippedH = hScroll - xCenter; + int clippedV = vScroll - yCenter; + clippedH = (clippedH & 0x2000) ? (clippedH | ~1023) : (clippedH & 1023); + clippedV = (clippedV & 0x2000) ? (clippedV | ~1023) : (clippedV & 1023); + if(ppu->bgLayer[0].mosaicEnabled && ppu->mosaicSize > 1) { + y -= (y - ppu->mosaicStartLine) % ppu->mosaicSize; + } + uint8_t ry = ppu->m7yFlip ? 255 - y : y; + ppu->m7startX = ( + ((ppu->m7matrix[0] * clippedH) & ~63) + + ((ppu->m7matrix[1] * ry) & ~63) + + ((ppu->m7matrix[1] * clippedV) & ~63) + + (xCenter << 8) + ); + ppu->m7startY = ( + ((ppu->m7matrix[2] * clippedH) & ~63) + + ((ppu->m7matrix[3] * ry) & ~63) + + ((ppu->m7matrix[3] * clippedV) & ~63) + + (yCenter << 8) + ); +} + +static int ppu_getPixelForMode7(Ppu* ppu, int x, int layer, bool priority) { + uint8_t rx = ppu->m7xFlip ? 255 - x : x; + int xPos = (ppu->m7startX + ppu->m7matrix[0] * rx) >> 8; + int yPos = (ppu->m7startY + ppu->m7matrix[2] * rx) >> 8; + bool outsideMap = xPos < 0 || xPos >= 1024 || yPos < 0 || yPos >= 1024; + xPos &= 0x3ff; + yPos &= 0x3ff; + if(!ppu->m7largeField) outsideMap = false; + uint8_t tile = outsideMap ? 0 : ppu->vram[(yPos >> 3) * 128 + (xPos >> 3)] & 0xff; + uint8_t pixel = outsideMap && !ppu->m7charFill ? 0 : ppu->vram[tile * 64 + (yPos & 7) * 8 + (xPos & 7)] >> 8; + if(layer == 1) { + if(((bool) (pixel & 0x80)) != priority) return 0; + return pixel & 0x7f; + } + return pixel; +} + +static bool ppu_getWindowState(Ppu* ppu, int layer, int x) { + if(!ppu->windowLayer[layer].window1enabled && !ppu->windowLayer[layer].window2enabled) { + return false; + } + if(ppu->windowLayer[layer].window1enabled && !ppu->windowLayer[layer].window2enabled) { + bool test = x >= ppu->window1left && x <= ppu->window1right; + return ppu->windowLayer[layer].window1inversed ? !test : test; + } + if(!ppu->windowLayer[layer].window1enabled && ppu->windowLayer[layer].window2enabled) { + bool test = x >= ppu->window2left && x <= ppu->window2right; + return ppu->windowLayer[layer].window2inversed ? !test : test; + } + bool test1 = x >= ppu->window1left && x <= ppu->window1right; + bool test2 = x >= ppu->window2left && x <= ppu->window2right; + if(ppu->windowLayer[layer].window1inversed) test1 = !test1; + if(ppu->windowLayer[layer].window2inversed) test2 = !test2; + switch(ppu->windowLayer[layer].maskLogic) { + case 0: return test1 || test2; + case 1: return test1 && test2; + case 2: return test1 != test2; + case 3: return test1 == test2; + } + return false; +} + +static void ppu_evaluateSprites(Ppu* ppu, int line) { + // TODO: iterate over oam normally to determine in-range sprites, + // then iterate those in-range sprites in reverse for tile-fetching + // TODO: rectangular sprites, wierdness with sprites at -256 + uint8_t index = ppu->objPriority ? (ppu->oamAdr & 0xfe) : 0; + int spritesFound = 0; + int tilesFound = 0; + for(int i = 0; i < 128; i++) { + uint8_t y = ppu->oam[index] >> 8; + // check if the sprite is on this line and get the sprite size + uint8_t row = line - y; + int spriteSize = spriteSizes[ppu->objSize][(ppu->highOam[index >> 3] >> ((index & 7) + 1)) & 1]; + int spriteHeight = ppu->objInterlace ? spriteSize / 2 : spriteSize; + if(row < spriteHeight) { + // in y-range, get the x location, using the high bit as well + int x = ppu->oam[index] & 0xff; + x |= ((ppu->highOam[index >> 3] >> (index & 7)) & 1) << 8; + if(x > 255) x -= 512; + // if in x-range + if(x > -spriteSize) { + // break if we found 32 sprites already + spritesFound++; + if(spritesFound > 32) { + ppu->rangeOver = true; + break; + } + // update row according to obj-interlace + if(ppu->objInterlace) row = row * 2 + (ppu->evenFrame ? 0 : 1); + // get some data for the sprite and y-flip row if needed + int tile = ppu->oam[index + 1] & 0xff; + int palette = (ppu->oam[index + 1] & 0xe00) >> 9; + bool hFlipped = ppu->oam[index + 1] & 0x4000; + if(ppu->oam[index + 1] & 0x8000) row = spriteSize - 1 - row; + // fetch all tiles in x-range + for(int col = 0; col < spriteSize; col += 8) { + if(col + x > -8 && col + x < 256) { + // break if we found 34 8*1 slivers already + tilesFound++; + if(tilesFound > 34) { + ppu->timeOver = true; + break; + } + // figure out which tile this uses, looping within 16x16 pages, and get it's data + int usedCol = hFlipped ? spriteSize - 1 - col : col; + uint8_t usedTile = (((tile >> 4) + (row / 8)) << 4) | (((tile & 0xf) + (usedCol / 8)) & 0xf); + uint16_t objAdr = (ppu->oam[index + 1] & 0x100) ? ppu->objTileAdr2 : ppu->objTileAdr1; + uint16_t plane1 = ppu->vram[(objAdr + usedTile * 16 + (row & 0x7)) & 0x7fff]; + uint16_t plane2 = ppu->vram[(objAdr + usedTile * 16 + 8 + (row & 0x7)) & 0x7fff]; + // go over each pixel + for(int px = 0; px < 8; px++) { + int shift = hFlipped ? px : 7 - px; + int pixel = (plane1 >> shift) & 1; + pixel |= ((plane1 >> (8 + shift)) & 1) << 1; + pixel |= ((plane2 >> shift) & 1) << 2; + pixel |= ((plane2 >> (8 + shift)) & 1) << 3; + // draw it in the buffer if there is a pixel here, and the buffer there is still empty + int screenCol = col + x + px; + if(pixel > 0 && screenCol >= 0 && screenCol < 256 && ppu->objPixelBuffer[screenCol] == 0) { + ppu->objPixelBuffer[screenCol] = 0x80 + 16 * palette + pixel; + ppu->objPriorityBuffer[screenCol] = (ppu->oam[index + 1] & 0x3000) >> 12; + } + } + } + } + if(tilesFound > 34) break; // break out of sprite-loop if max tiles found + } + } + index += 2; + } +} + +static uint16_t ppu_getVramRemap(Ppu* ppu) { + uint16_t adr = ppu->vramPointer; + switch(ppu->vramRemapMode) { + case 0: return adr; + case 1: return (adr & 0xff00) | ((adr & 0xe0) >> 5) | ((adr & 0x1f) << 3); + case 2: return (adr & 0xfe00) | ((adr & 0x1c0) >> 6) | ((adr & 0x3f) << 3); + case 3: return (adr & 0xfc00) | ((adr & 0x380) >> 7) | ((adr & 0x7f) << 3); + } + return adr; +} + +uint8_t ppu_read(Ppu* ppu, uint8_t adr) { + switch(adr) { + case 0x04: case 0x14: case 0x24: + case 0x05: case 0x15: case 0x25: + case 0x06: case 0x16: case 0x26: + case 0x08: case 0x18: case 0x28: + case 0x09: case 0x19: case 0x29: + case 0x0a: case 0x1a: case 0x2a: { + return ppu->ppu1openBus; + } + case 0x34: + case 0x35: + case 0x36: { + int result = ppu->m7matrix[0] * (ppu->m7matrix[1] >> 8); + ppu->ppu1openBus = (result >> (8 * (adr - 0x34))) & 0xff; + return ppu->ppu1openBus; + } + case 0x37: { + // TODO: only when ppulatch is set + ppu->hCount = ppu->snes->hPos / 4; + ppu->vCount = ppu->snes->vPos; + ppu->countersLatched = true; + if (ppu->snes->disableHpos) + ppu->vCount = 192; + + return ppu->snes->openBus; + } + case 0x38: { + uint8_t ret = 0; + if(ppu->oamInHigh) { + ret = ppu->highOam[((ppu->oamAdr & 0xf) << 1) | (uint8_t)ppu->oamSecondWrite]; + if(ppu->oamSecondWrite) { + ppu->oamAdr++; + if(ppu->oamAdr == 0) ppu->oamInHigh = false; + } + } else { + if(!ppu->oamSecondWrite) { + ret = ppu->oam[ppu->oamAdr] & 0xff; + } else { + ret = ppu->oam[ppu->oamAdr++] >> 8; + if(ppu->oamAdr == 0) ppu->oamInHigh = true; + } + } + ppu->oamSecondWrite = !ppu->oamSecondWrite; + ppu->ppu1openBus = ret; + return ret; + } + case 0x39: { + uint16_t val = ppu->vramReadBuffer; + if(!ppu->vramIncrementOnHigh) { + ppu->vramReadBuffer = ppu->vram[ppu_getVramRemap(ppu) & 0x7fff]; + ppu->vramPointer += ppu->vramIncrement; + } + ppu->ppu1openBus = val & 0xff; + return val & 0xff; + } + case 0x3a: { + uint16_t val = ppu->vramReadBuffer; + if(ppu->vramIncrementOnHigh) { + ppu->vramReadBuffer = ppu->vram[ppu_getVramRemap(ppu) & 0x7fff]; + ppu->vramPointer += ppu->vramIncrement; + } + ppu->ppu1openBus = val >> 8; + return val >> 8; + } + case 0x3b: { + uint8_t ret = 0; + if(!ppu->cgramSecondWrite) { + ret = ppu->cgram[ppu->cgramPointer] & 0xff; + } else { + ret = ((ppu->cgram[ppu->cgramPointer++] >> 8) & 0x7f) | (ppu->ppu2openBus & 0x80); + } + ppu->cgramSecondWrite = !ppu->cgramSecondWrite; + ppu->ppu2openBus = ret; + return ret; + } + case 0x3c: { +#if 0 + uint8_t val = 0; + if(ppu->hCountSecond) { + val = ((ppu->hCount >> 8) & 1) | (ppu->ppu2openBus & 0xfe); + } else { + val = ppu->hCount & 0xff; + } +#else + uint8_t val = 0x17;// (ppu->ppu2openBus + ppu->cgramPointer * 7) * 0x31337 >> 8; +#endif + ppu->hCountSecond = !ppu->hCountSecond; + ppu->ppu2openBus = val; + return val; + } + case 0x3d: { + uint8_t val = 0; + uint16_t vCount = 192;// ppu->vCount + if(ppu->vCountSecond) { + val = ((vCount >> 8) & 1) | (ppu->ppu2openBus & 0xfe); + } else { + val = vCount & 0xff; + } + ppu->vCountSecond = !ppu->vCountSecond; + ppu->ppu2openBus = val; + return val; + } + case 0x3e: { + uint8_t val = 0x1; // ppu1 version (4 bit) + val |= ppu->ppu1openBus & 0x10; + val |= ppu->rangeOver << 6; + val |= ppu->timeOver << 7; + ppu->ppu1openBus = val; + return val; + } + case 0x3f: { + uint8_t val = 0x3; // ppu2 version (4 bit), bit 4: ntsc/pal + val |= ppu->ppu2openBus & 0x20; + val |= ppu->countersLatched << 6; + val |= ppu->evenFrame << 7; + ppu->countersLatched = false; // TODO: only when ppulatch is set + ppu->hCountSecond = false; + ppu->vCountSecond = false; + ppu->ppu2openBus = val; + return val; + } + default: { + return ppu->snes->openBus; + } + } +} + +void ppu_write(Ppu* ppu, uint8_t adr, uint8_t val) { + switch(adr) { + case 0x00: { + // TODO: oam address reset when written on first line of vblank, (and when forced blank is disabled?) + ppu->brightness = val & 0xf; + ppu->forcedBlank = val & 0x80; + break; + } + case 0x01: { + ppu->objSize = val >> 5; + ppu->objTileAdr1 = (val & 7) << 13; + ppu->objTileAdr2 = ppu->objTileAdr1 + (((val & 0x18) + 8) << 9); + break; + } + case 0x02: { + ppu->oamAdr = val; + ppu->oamAdrWritten = ppu->oamAdr; + ppu->oamInHigh = ppu->oamInHighWritten; + ppu->oamSecondWrite = false; + break; + } + case 0x03: { + ppu->objPriority = val & 0x80; + ppu->oamInHigh = val & 1; + ppu->oamInHighWritten = ppu->oamInHigh; + ppu->oamAdr = ppu->oamAdrWritten; + ppu->oamSecondWrite = false; + break; + } + case 0x04: { + if(ppu->oamInHigh) { + ppu->highOam[((ppu->oamAdr & 0xf) << 1) | (uint8_t)ppu->oamSecondWrite] = val; + if(ppu->oamSecondWrite) { + ppu->oamAdr++; + if(ppu->oamAdr == 0) ppu->oamInHigh = false; + } + } else { + if(!ppu->oamSecondWrite) { + ppu->oamBuffer = val; + } else { + ppu->oam[ppu->oamAdr++] = (val << 8) | ppu->oamBuffer; + if(ppu->oamAdr == 0) ppu->oamInHigh = true; + } + } + ppu->oamSecondWrite = !ppu->oamSecondWrite; + break; + } + case 0x05: { + ppu->mode = val & 0x7; + ppu->bg3priority = val & 0x8; + ppu->bgLayer[0].bigTiles = val & 0x10; + ppu->bgLayer[1].bigTiles = val & 0x20; + ppu->bgLayer[2].bigTiles = val & 0x40; + ppu->bgLayer[3].bigTiles = val & 0x80; + break; + } + case 0x06: { + // TODO: mosaic line reset specifics + ppu->bgLayer[0].mosaicEnabled = val & 0x1; + ppu->bgLayer[1].mosaicEnabled = val & 0x2; + ppu->bgLayer[2].mosaicEnabled = val & 0x4; + ppu->bgLayer[3].mosaicEnabled = val & 0x8; + ppu->mosaicSize = (val >> 4) + 1; + ppu->mosaicStartLine = 0;// ppu->snes->vPos; + break; + } + case 0x07: + case 0x08: + case 0x09: + case 0x0a: { + ppu->bgLayer[adr - 7].tilemapWider = val & 0x1; + ppu->bgLayer[adr - 7].tilemapHigher = val & 0x2; + ppu->bgLayer[adr - 7].tilemapAdr = (val & 0xfc) << 8; + break; + } + case 0x0b: { + ppu->bgLayer[0].tileAdr = (val & 0xf) << 12; + ppu->bgLayer[1].tileAdr = (val & 0xf0) << 8; + break; + } + case 0x0c: { + ppu->bgLayer[2].tileAdr = (val & 0xf) << 12; + ppu->bgLayer[3].tileAdr = (val & 0xf0) << 8; + break; + } + case 0x0d: { + ppu->m7matrix[6] = ((val << 8) | ppu->m7prev) & 0x1fff; + ppu->m7prev = val; + // fallthrough to normal layer BG-HOFS + } + case 0x0f: + case 0x11: + case 0x13: { + ppu->bgLayer[(adr - 0xd) / 2].hScroll = ((val << 8) | (ppu->scrollPrev & 0xf8) | (ppu->scrollPrev2 & 0x7)) & 0x3ff; + ppu->scrollPrev = val; + ppu->scrollPrev2 = val; + break; + } + case 0x0e: { + ppu->m7matrix[7] = ((val << 8) | ppu->m7prev) & 0x1fff; + ppu->m7prev = val; + // fallthrough to normal layer BG-VOFS + } + case 0x10: + case 0x12: + case 0x14: { + ppu->bgLayer[(adr - 0xe) / 2].vScroll = ((val << 8) | ppu->scrollPrev) & 0x3ff; + ppu->scrollPrev = val; + break; + } + case 0x15: { + if((val & 3) == 0) { + ppu->vramIncrement = 1; + } else if((val & 3) == 1) { + ppu->vramIncrement = 32; + } else { + ppu->vramIncrement = 128; + } + ppu->vramRemapMode = (val & 0xc) >> 2; + ppu->vramIncrementOnHigh = val & 0x80; + break; + } + case 0x16: { + ppu->vramPointer = (ppu->vramPointer & 0xff00) | val; + ppu->vramReadBuffer = ppu->vram[ppu_getVramRemap(ppu) & 0x7fff]; + break; + } + case 0x17: { + ppu->vramPointer = (ppu->vramPointer & 0x00ff) | (val << 8); + ppu->vramReadBuffer = ppu->vram[ppu_getVramRemap(ppu) & 0x7fff]; + break; + } + case 0x18: { + // TODO: vram access during rendering (also cgram and oam) + uint16_t vramAdr = ppu_getVramRemap(ppu); + if (val != 0xef) { + val += 0; + } + ppu->vram[vramAdr & 0x7fff] = (ppu->vram[vramAdr & 0x7fff] & 0xff00) | val; + if(!ppu->vramIncrementOnHigh) ppu->vramPointer += ppu->vramIncrement; + break; + } + case 0x19: { + uint16_t vramAdr = ppu_getVramRemap(ppu); + ppu->vram[vramAdr & 0x7fff] = (ppu->vram[vramAdr & 0x7fff] & 0x00ff) | (val << 8); + if(ppu->vramIncrementOnHigh) ppu->vramPointer += ppu->vramIncrement; + break; + } + case 0x1a: { + ppu->m7largeField = val & 0x80; + ppu->m7charFill = val & 0x40; + ppu->m7yFlip = val & 0x2; + ppu->m7xFlip = val & 0x1; + break; + } + case 0x1b: + case 0x1c: + case 0x1d: + case 0x1e: { + ppu->m7matrix[adr - 0x1b] = (val << 8) | ppu->m7prev; + ppu->m7prev = val; + break; + } + case 0x1f: + case 0x20: { + ppu->m7matrix[adr - 0x1b] = ((val << 8) | ppu->m7prev) & 0x1fff; + ppu->m7prev = val; + break; + } + case 0x21: { + ppu->cgramPointer = val; + ppu->cgramSecondWrite = false; + break; + } + case 0x22: { + if(!ppu->cgramSecondWrite) { + ppu->cgramBuffer = val; + } else { + ppu->cgram[ppu->cgramPointer++] = (val << 8) | ppu->cgramBuffer; + } + ppu->cgramSecondWrite = !ppu->cgramSecondWrite; + break; + } + case 0x23: + case 0x24: + case 0x25: { + ppu->windowLayer[(adr - 0x23) * 2].window1inversed = val & 0x1; + ppu->windowLayer[(adr - 0x23) * 2].window1enabled = val & 0x2; + ppu->windowLayer[(adr - 0x23) * 2].window2inversed = val & 0x4; + ppu->windowLayer[(adr - 0x23) * 2].window2enabled = val & 0x8; + ppu->windowLayer[(adr - 0x23) * 2 + 1].window1inversed = val & 0x10; + ppu->windowLayer[(adr - 0x23) * 2 + 1].window1enabled = val & 0x20; + ppu->windowLayer[(adr - 0x23) * 2 + 1].window2inversed = val & 0x40; + ppu->windowLayer[(adr - 0x23) * 2 + 1].window2enabled = val & 0x80; + break; + } + case 0x26: { + ppu->window1left = val; + break; + } + case 0x27: { + ppu->window1right = val; + break; + } + case 0x28: { + ppu->window2left = val; + break; + } + case 0x29: { + ppu->window2right = val; + break; + } + case 0x2a: { + ppu->windowLayer[0].maskLogic = val & 0x3; + ppu->windowLayer[1].maskLogic = (val >> 2) & 0x3; + ppu->windowLayer[2].maskLogic = (val >> 4) & 0x3; + ppu->windowLayer[3].maskLogic = (val >> 6) & 0x3; + break; + } + case 0x2b: { + ppu->windowLayer[4].maskLogic = val & 0x3; + ppu->windowLayer[5].maskLogic = (val >> 2) & 0x3; + break; + } + case 0x2c: { + ppu->layer[0].mainScreenEnabled = val & 0x1; + ppu->layer[1].mainScreenEnabled = val & 0x2; + ppu->layer[2].mainScreenEnabled = val & 0x4; + ppu->layer[3].mainScreenEnabled = val & 0x8; + ppu->layer[4].mainScreenEnabled = val & 0x10; + break; + } + case 0x2d: { + ppu->layer[0].subScreenEnabled = val & 0x1; + ppu->layer[1].subScreenEnabled = val & 0x2; + ppu->layer[2].subScreenEnabled = val & 0x4; + ppu->layer[3].subScreenEnabled = val & 0x8; + ppu->layer[4].subScreenEnabled = val & 0x10; + break; + } + case 0x2e: { + ppu->layer[0].mainScreenWindowed = val & 0x1; + ppu->layer[1].mainScreenWindowed = val & 0x2; + ppu->layer[2].mainScreenWindowed = val & 0x4; + ppu->layer[3].mainScreenWindowed = val & 0x8; + ppu->layer[4].mainScreenWindowed = val & 0x10; + break; + } + case 0x2f: { + ppu->layer[0].subScreenWindowed = val & 0x1; + ppu->layer[1].subScreenWindowed = val & 0x2; + ppu->layer[2].subScreenWindowed = val & 0x4; + ppu->layer[3].subScreenWindowed = val & 0x8; + ppu->layer[4].subScreenWindowed = val & 0x10; + break; + } + case 0x30: { + ppu->directColor = val & 0x1; + ppu->addSubscreen = val & 0x2; + ppu->preventMathMode = (val & 0x30) >> 4; + ppu->clipMode = (val & 0xc0) >> 6; + break; + } + case 0x31: { + ppu->subtractColor = val & 0x80; + ppu->halfColor = val & 0x40; + for(int i = 0; i < 6; i++) { + ppu->mathEnabled[i] = val & (1 << i); + } + break; + } + case 0x32: { + if(val & 0x80) ppu->fixedColorB = val & 0x1f; + if(val & 0x40) ppu->fixedColorG = val & 0x1f; + if(val & 0x20) ppu->fixedColorR = val & 0x1f; + break; + } + case 0x33: { + ppu->interlace = val & 0x1; + ppu->objInterlace = val & 0x2; + ppu->overscan = val & 0x4; + ppu->pseudoHires = val & 0x8; + ppu->m7extBg = val & 0x40; + break; + } + default: { + break; + } + } +} + +void ppu_putPixels(Ppu* ppu, uint8_t* pixels) { + for(int y = 0; y < (ppu->frameOverscan ? 239 : 224); y++) { + int dest = y * 2 + (ppu->frameOverscan ? 2 : 16); + int y1 = y, y2 = y + 239; + if(!ppu->frameInterlace) { + y1 = y + (ppu->evenFrame ? 0 : 239); + y2 = y1; + } + memcpy(pixels + (dest * 2048), &ppu->pixelBuffer[y1 * 2048], 2048); + memcpy(pixels + ((dest + 1) * 2048), &ppu->pixelBuffer[y2 * 2048], 2048); + } + // clear top 2 lines, and following 14 and last 16 lines if not overscanning + memset(pixels, 0, 2048 * 2); + if(!ppu->frameOverscan) { + memset(pixels + (2 * 2048), 0, 2048 * 14); + memset(pixels + (464 * 2048), 0, 2048 * 16); + } +} diff --git a/snes/ppu.h b/snes/ppu.h new file mode 100644 index 00000000..352d5665 --- /dev/null +++ b/snes/ppu.h @@ -0,0 +1,145 @@ + +#ifndef PPU_H +#define PPU_H + +#include +#include +#include +#include +#include + +typedef struct Ppu Ppu; + +#include "snes.h" + +typedef struct BgLayer { + uint16_t hScroll; + uint16_t vScroll; + bool tilemapWider; + bool tilemapHigher; + uint16_t tilemapAdr; + uint16_t tileAdr; + bool bigTiles; + bool mosaicEnabled; +} BgLayer; + +typedef struct Layer { + bool mainScreenEnabled; + bool subScreenEnabled; + bool mainScreenWindowed; + bool subScreenWindowed; +} Layer; + +typedef struct WindowLayer { + bool window1enabled; + bool window2enabled; + bool window1inversed; + bool window2inversed; + uint8_t maskLogic; +} WindowLayer; + +struct Ppu { + Snes* snes; + // vram access + uint16_t vram[0x8000]; + uint16_t vramPointer; + bool vramIncrementOnHigh; + uint16_t vramIncrement; + uint8_t vramRemapMode; + uint16_t vramReadBuffer; + // cgram access + uint16_t cgram[0x100]; + uint8_t cgramPointer; + bool cgramSecondWrite; + uint8_t cgramBuffer; + // oam access + uint16_t oam[0x100]; + uint8_t highOam[0x20]; + uint8_t oamAdr; + uint8_t oamAdrWritten; + bool oamInHigh; + bool oamInHighWritten; + bool oamSecondWrite; + uint8_t oamBuffer; + // object/sprites + bool objPriority; + uint16_t objTileAdr1; + uint16_t objTileAdr2; + uint8_t objSize; + uint8_t objPixelBuffer[256]; // line buffers + uint8_t objPriorityBuffer[256]; + bool timeOver; + bool rangeOver; + bool objInterlace; + // background layers + BgLayer bgLayer[4]; + uint8_t scrollPrev; + uint8_t scrollPrev2; + uint8_t mosaicSize; + uint8_t mosaicStartLine; + // layers + Layer layer[5]; + // mode 7 + int16_t m7matrix[8]; // a, b, c, d, x, y, h, v + uint8_t m7prev; + bool m7largeField; + bool m7charFill; + bool m7xFlip; + bool m7yFlip; + bool m7extBg; + // mode 7 internal + int32_t m7startX; + int32_t m7startY; + // windows + WindowLayer windowLayer[6]; + uint8_t window1left; + uint8_t window1right; + uint8_t window2left; + uint8_t window2right; + // color math + uint8_t clipMode; + uint8_t preventMathMode; + bool addSubscreen; + bool subtractColor; + bool halfColor; + bool mathEnabled[6]; + uint8_t fixedColorR; + uint8_t fixedColorG; + uint8_t fixedColorB; + // settings + bool forcedBlank; + uint8_t brightness; + uint8_t mode; + bool bg3priority; + bool evenFrame; + bool pseudoHires; + bool overscan; + bool frameOverscan; // if we are overscanning this frame (determined at 0,225) + bool interlace; + bool frameInterlace; // if we are interlacing this frame (determined at start vblank) + bool directColor; + // latching + uint16_t hCount; + uint16_t vCount; + bool hCountSecond; + bool vCountSecond; + bool countersLatched; + uint8_t ppu1openBus; + uint8_t ppu2openBus; + // pixel buffer (xbgr) + // times 2 for even and odd frame + uint8_t pixelBuffer[512 * 4 * 239 * 2]; +}; + +Ppu* ppu_init(Snes* snes); +void ppu_free(Ppu* ppu); +void ppu_reset(Ppu* ppu); +bool ppu_checkOverscan(Ppu* ppu); +void ppu_handleVblank(Ppu* ppu); +void ppu_runLine(Ppu* ppu, int line); +uint8_t ppu_read(Ppu* ppu, uint8_t adr); +void ppu_write(Ppu* ppu, uint8_t adr, uint8_t val); +void ppu_putPixels(Ppu* ppu, uint8_t* pixels); +void ppu_saveload(Ppu *ppu, SaveLoadFunc *func, void *ctx); + +#endif diff --git a/snes/saveload.h b/snes/saveload.h new file mode 100644 index 00000000..04db416b --- /dev/null +++ b/snes/saveload.h @@ -0,0 +1,5 @@ +#pragma once + +typedef void SaveLoadFunc(void *ctx, void *data, size_t data_size); + +#define SL(x) func(ctx, &x, sizeof(x)) \ No newline at end of file diff --git a/snes/snes.cpp b/snes/snes.cpp new file mode 100644 index 00000000..cb1a44ae --- /dev/null +++ b/snes/snes.cpp @@ -0,0 +1,586 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include "saveload.h" +#include "snes.h" +#include "cpu.h" +#include "apu.h" +#include "dma.h" +#include "ppu.h" +#include "cart.h" +#include "input.h" +#include "../tracing.h" +#include "../snes_regs.h" + +static const double apuCyclesPerMaster = (32040 * 32) / (1364 * 262 * 60.0); + +static void snes_runCycle(Snes* snes); +static void snes_runCpu(Snes* snes); +static void snes_catchupApu(Snes* snes); +static uint8_t snes_readReg(Snes* snes, uint16_t adr); +static void snes_writeReg(Snes* snes, uint16_t adr, uint8_t val); +static uint8_t snes_rread(Snes* snes, uint32_t adr); // wrapped by read, to set open bus +static int snes_getAccessTime(Snes* snes, uint32_t adr); +void zelda_apu_runcycles(); + +Snes* snes_init(uint8_t *ram) { + Snes* snes = (Snes * )malloc(sizeof(Snes)); + snes->ram = ram; + snes->cpu = cpu_init(snes, 0); + snes->apu = apu_init(); + snes->dma = dma_init(snes); + snes->ppu = ppu_init(snes); + snes->cart = cart_init(snes); + snes->input1 = input_init(snes); + snes->input2 = input_init(snes); + snes->debug_cycles = false; + snes->disableHpos = false; + return snes; +} + +void snes_free(Snes* snes) { + cpu_free(snes->cpu); + apu_free(snes->apu); + dma_free(snes->dma); + ppu_free(snes->ppu); + cart_free(snes->cart); + input_free(snes->input1); + input_free(snes->input2); + free(snes); +} + +void snes_saveload(Snes *snes, SaveLoadFunc *func, void *ctx) { + cpu_saveload(snes->cpu, func, ctx); + apu_saveload(snes->apu, func, ctx); + dma_saveload(snes->dma, func, ctx); + ppu_saveload(snes->ppu, func, ctx); + cart_saveload(snes->cart, func, ctx); + + func(ctx, &snes->hPos, offsetof(Snes, openBus) + 1 - offsetof(Snes, hPos)); + func(ctx, snes->ram, 0x20000); + func(ctx, &snes->ramAdr, 4); + + + snes->disableHpos = false; +} + +void snes_reset(Snes* snes, bool hard) { + cart_reset(snes->cart); // reset cart first, because resetting cpu will read from it (reset vector) + cpu_reset(snes->cpu); + apu_reset(snes->apu); + dma_reset(snes->dma); + ppu_reset(snes->ppu); + input_reset(snes->input1); + input_reset(snes->input2); + if (hard) memset(snes->ram, 0, 0x20000); + snes->ramAdr = 0; + snes->hPos = 0; + snes->vPos = 0; + snes->frames = 0; + snes->cpuCyclesLeft = 52; // 5 reads (8) + 2 IntOp (6) + snes->cpuMemOps = 0; + snes->apuCatchupCycles = 0.0; + snes->hIrqEnabled = false; + snes->vIrqEnabled = false; + snes->nmiEnabled = false; + snes->hTimer = 0x1ff; + snes->vTimer = 0x1ff; + snes->inNmi = false; + snes->inIrq = false; + snes->inVblank = false; + memset(snes->portAutoRead, 0, sizeof(snes->portAutoRead)); + snes->autoJoyRead = false; + snes->autoJoyTimer = 0; + snes->ppuLatch = false; + snes->multiplyA = 0xff; + snes->multiplyResult = 0xfe01; + snes->divideA = 0xffff; + snes->divideResult = 0x101; + snes->fastMem = false; + snes->openBus = 0; +} + +static uint8_t g_last_module; +bool didit; + +void snes_runFrame(Snes* snes) { + // runs a signle frame (run cycles until v/h pos is at 0,0) + do { + snes_runCycle(snes); + } while(!(snes->hPos == 0 && snes->vPos == 0)); +} + + +void snes_printCpuLine(Snes *snes) { + if (snes->debug_cycles) { + static FILE *fout; + + if (!fout) + fout = stdout; + char line[80]; + getProcessorStateCpu(snes, line); + fputs(line, fout); + fprintf(fout, " 0x%x", snes->ppu->vram[0]); + fputs("\n", fout); + fflush(fout); + } +} + +void snes_runGfxCycles(Snes *snes) { + // check for h/v timer irq's + if(snes->vIrqEnabled && snes->hIrqEnabled) { + if(snes->vPos == snes->vTimer && snes->hPos == (4 * snes->hTimer)) { + snes->inIrq = true; + snes->cpu->irqWanted = true; // request IRQ on CPU + } + } else if(snes->vIrqEnabled && !snes->hIrqEnabled) { + if(snes->vPos == snes->vTimer && snes->hPos == 0) { + snes->inIrq = true; + snes->cpu->irqWanted = true; // request IRQ on CPU + } + } else if(!snes->vIrqEnabled && snes->hIrqEnabled) { + if(snes->hPos == (4 * snes->hTimer)) { + snes->inIrq = true; + snes->cpu->irqWanted = true; // request IRQ on CPU + } + } + // handle positional stuff + // TODO: better timing? (especially Hpos) + if(snes->hPos == 0) { + // end of hblank, do most vPos-tests + bool startingVblank = false; + if(snes->vPos == 0) { + // end of vblank + snes->inVblank = false; + snes->inNmi = false; + dma_initHdma(snes->dma); + } else if(snes->vPos == 225) { + // ask the ppu if we start vblank now or at vPos 240 (overscan) + startingVblank = !ppu_checkOverscan(snes->ppu); + } else if(snes->vPos == 240){ + // if we are not yet in vblank, we had an overscan frame, set startingVblank + if(!snes->inVblank) startingVblank = true; + } + if(startingVblank) { + // if we are starting vblank + ppu_handleVblank(snes->ppu); + snes->inVblank = true; + snes->inNmi = true; + if(snes->autoJoyRead) { + // TODO: this starts a little after start of vblank + snes->autoJoyTimer = 4224; + snes_doAutoJoypad(snes); + } + if(snes->nmiEnabled) { + snes->cpu->nmiWanted = true; // request NMI on CPU + } + } + } else if(snes->hPos == 512) { + // render the line halfway of the screen for better compatibility + if(!snes->inVblank) ppu_runLine(snes->ppu, snes->vPos); + } else if(snes->hPos == 1024) { + // start of hblank + if(!snes->inVblank) dma_doHdma(snes->dma); + } + // handle autoJoyRead-timer + if(snes->autoJoyTimer > 0) snes->autoJoyTimer -= 2; + // increment position + // TODO: exact frame timing (line 240 on odd frame is 4 cycles shorter, + // even frames in interlace is 1 extra line) + if (!snes->disableHpos || !(snes->hPos < 536 || snes->hPos >= 576) || snes->hPos == 0 || snes->vPos == 0) + snes->hPos += 2; + if(snes->hPos == 1364) { + snes->hPos = 0; + snes->vPos++; + if(snes->vPos == 262) { + snes->vPos = 0; + snes->frames++; + snes_catchupApu(snes); // catch up the apu at the end of the frame + } + } +} + +static void snes_runCycle(Snes* snes) { + snes->apuCatchupCycles += apuCyclesPerMaster * 2.0; + input_cycle(snes->input1); + input_cycle(snes->input2); + // if not in dram refresh, if we are busy with hdma/dma, do that, else do cpu cycle + if(snes->hPos < 536 || snes->hPos >= 576) { + if(!dma_cycle(snes->dma)) { + snes_runCpu(snes); + } + } + snes_runGfxCycles(snes); +} + +static void snes_runCpu(Snes* snes) { + if(snes->cpuCyclesLeft == 0) { + snes->cpuMemOps = 0; + uint32_t pc = snes->cpu->pc | snes->cpu->k << 16; + if (snes->debug_cycles) { + char line[80]; + getProcessorStateCpu(snes, line); + puts(line); + } + int cycles = cpu_runOpcode(snes->cpu); + snes->cpuCyclesLeft += (cycles - snes->cpuMemOps) * 6; + } + snes->cpuCyclesLeft -= 2; +} + +static void snes_catchupApu(Snes* snes) { + int catchupCycles = (int) snes->apuCatchupCycles; + for(int i = 0; i < catchupCycles; i++) { + apu_cycle(snes->apu); + zelda_apu_runcycles(); + } + snes->apuCatchupCycles -= (double) catchupCycles; +} + +void snes_doAutoJoypad(Snes* snes) { + // TODO: improve? (now calls input_cycle) + memset(snes->portAutoRead, 0, sizeof(snes->portAutoRead)); + snes->input1->latchLine = true; + snes->input2->latchLine = true; + input_cycle(snes->input1); // latches the controllers + input_cycle(snes->input2); + snes->input1->latchLine = false; + snes->input2->latchLine = false; + for(int i = 0; i < 16; i++) { + uint8_t val = input_read(snes->input1); + snes->portAutoRead[0] |= ((val & 1) << (15 - i)); + snes->portAutoRead[2] |= (((val >> 1) & 1) << (15 - i)); + val = input_read(snes->input2); + snes->portAutoRead[1] |= ((val & 1) << (15 - i)); + snes->portAutoRead[3] |= (((val >> 1) & 1) << (15 - i)); + } +} + +uint8_t snes_readBBus(Snes* snes, uint8_t adr) { + if(adr < 0x40) { + return ppu_read(snes->ppu, adr); + } + if(adr < 0x80) { + if (kIsOrigEmu) + snes_catchupApu(snes); // catch up the apu before reading + else + apu_cycle(snes->apu);//spc_runOpcode(snes->apu->spc); + return snes->apu->outPorts[adr & 0x3]; + } + if(adr == 0x80) { + uint8_t ret = snes->ram[snes->ramAdr++]; + snes->ramAdr &= 0x1ffff; + return ret; + } + return snes->openBus; +} + +void snes_writeBBus(Snes* snes, uint8_t adr, uint8_t val) { + if(adr < 0x40) { + ppu_write(snes->ppu, adr, val); + return; + } + if(adr < 0x80) { + snes_catchupApu(snes); // catch up the apu before writing + snes->apu->inPorts[adr & 0x3] = val; + return; + } + switch(adr) { + case 0x80: { + snes->ram[snes->ramAdr++] = val; + snes->ramAdr &= 0x1ffff; + break; + } + case 0x81: { + snes->ramAdr = (snes->ramAdr & 0x1ff00) | val; + break; + } + case 0x82: { + snes->ramAdr = (snes->ramAdr & 0x100ff) | (val << 8); + break; + } + case 0x83: { + snes->ramAdr = (snes->ramAdr & 0x0ffff) | ((val & 1) << 16); + break; + } + } +} + +static uint8_t snes_readReg(Snes* snes, uint16_t adr) { + switch(adr) { + case 0x4210: { + uint8_t val = 0x2; // CPU version (4 bit) + val |= snes->inNmi << 7; + snes->inNmi = false; + return val | (snes->openBus & 0x70); + } + case 0x4211: { + uint8_t val = snes->inIrq << 7; + snes->inIrq = false; + snes->cpu->irqWanted = false; + return val | (snes->openBus & 0x7f); + } + case 0x4212: { + uint8_t val = (snes->autoJoyTimer > 0); + val |= (snes->hPos >= 1024) << 6; + val |= snes->inVblank << 7; + return val | (snes->openBus & 0x3e); + } + case 0x4213: { + return snes->ppuLatch << 7; // IO-port + } + case 0x4214: { + return snes->divideResult & 0xff; + } + case 0x4215: { + return snes->divideResult >> 8; + } + case 0x4216: { + return snes->multiplyResult & 0xff; + } + case 0x4217: { + return snes->multiplyResult >> 8; + } + case 0x4218: + case 0x421a: + case 0x421c: + case 0x421e: { + return snes->portAutoRead[(adr - 0x4218) / 2] & 0xff; + } + case 0x4219: + case 0x421b: + case 0x421d: + case 0x421f: { + return snes->portAutoRead[(adr - 0x4219) / 2] >> 8; + } + default: { + return snes->openBus; + } + } +} + +static void snes_writeReg(Snes* snes, uint16_t adr, uint8_t val) { + switch(adr) { + case 0x4200: { + snes->autoJoyRead = val & 0x1; + if(!snes->autoJoyRead) snes->autoJoyTimer = 0; + snes->hIrqEnabled = val & 0x10; + snes->vIrqEnabled = val & 0x20; + snes->nmiEnabled = val & 0x80; + if(!snes->hIrqEnabled && !snes->vIrqEnabled) { + snes->inIrq = false; + snes->cpu->irqWanted = false; + } + // TODO: enabling nmi during vblank with inNmi still set generates nmi + // enabling virq (and not h) on the vPos that vTimer is at generates irq (?) + break; + } + case 0x4201: { + if(!(val & 0x80) && snes->ppuLatch) { + // latch the ppu + ppu_read(snes->ppu, 0x37); + } + snes->ppuLatch = val & 0x80; + break; + } + case 0x4202: { + snes->multiplyA = val; + break; + } + case 0x4203: { + snes->multiplyResult = snes->multiplyA * val; + break; + } + case 0x4204: { + snes->divideA = (snes->divideA & 0xff00) | val; + break; + } + case 0x4205: { + snes->divideA = (snes->divideA & 0x00ff) | (val << 8); + break; + } + case 0x4206: { + if(val == 0) { + snes->divideResult = 0xffff; + snes->multiplyResult = snes->divideA; + } else { + snes->divideResult = snes->divideA / val; + snes->multiplyResult = snes->divideA % val; + } + break; + } + case 0x4207: { + snes->hTimer = (snes->hTimer & 0x100) | val; + break; + } + case 0x4208: { + snes->hTimer = (snes->hTimer & 0x0ff) | ((val & 1) << 8); + break; + } + case 0x4209: { + snes->vTimer = (snes->vTimer & 0x100) | val; + break; + } + case 0x420a: { + snes->vTimer = (snes->vTimer & 0x0ff) | ((val & 1) << 8); + break; + } + case 0x420b: { + dma_startDma(snes->dma, val, false); + break; + } + case 0x420c: { + dma_startDma(snes->dma, val, true); + break; + } + case 0x420d: { + snes->fastMem = val & 0x1; + break; + } + default: { + break; + } + } +} + +static uint8_t snes_rread(Snes* snes, uint32_t adr) { + uint8_t bank = adr >> 16; + adr &= 0xffff; + if((bank & 0x7f) < 0x40 && adr < 0x4380) { + if(adr < 0x2000) { + return snes->ram[adr]; // ram mirror + } + if(adr >= 0x2100 && adr < 0x2200) { + return snes_readBBus(snes, adr & 0xff); // B-bus + } + if(adr == 0x4016) { + return input_read(snes->input1) | (snes->openBus & 0xfc); + } + if(adr == 0x4017) { + return input_read(snes->input2) | (snes->openBus & 0xe0) | 0x1c; + } + if(adr >= 0x4200 && adr < 0x4220) { + return snes_readReg(snes, adr); // internal registers + } + if(adr >= 0x4300 && adr < 0x4380) { + return dma_read(snes->dma, adr); // dma registers + } + } else if ((bank & ~1) == 0x7e) { + return snes->ram[((bank & 1) << 16) | adr]; // ram + } + + // read from cart + return cart_read(snes->cart, bank, adr); +} + +int g_bp_addr = 0; + +void PrintState(); +void snes_write(Snes* snes, uint32_t adr, uint8_t val) { + snes->openBus = val; + uint8_t bank = adr >> 16; + adr &= 0xffff; + if(bank == 0x7e || bank == 0x7f) { + if ((adr & 0xffff) == g_bp_addr && g_bp_addr) { + printf("@0x%x: Writing1 0x%X to 0x%x (frame %d) %.2x %.2x %.2x\n", snes->cpu->k * 65536 + snes->cpu->pc, val, adr & 0xffff, snes->ram[0x1a], + snes->ram[snes->cpu->sp+1], snes->ram[snes->cpu->sp+2], snes->ram[snes->cpu->sp+3]); + } + + snes->ram[((bank & 1) << 16) | adr] = val; // ram + } else if(bank < 0x40 || (bank >= 0x80 && bank < 0xc0)) { + if (adr < 0x2000) { + if ((adr & 0xffff) == g_bp_addr && g_bp_addr) { + printf("@0x%x: Writing2 0x%X to 0x%x (frame %d) %.2x %.2x %.2x\n", snes->cpu->k * 65536 + snes->cpu->pc, val, adr & 0xffff, snes->ram[0x1a], + snes->ram[snes->cpu->sp+1], snes->ram[snes->cpu->sp+2], snes->ram[snes->cpu->sp+3]); + } + + snes->ram[adr] = val; // ram mirror + } else if(adr >= 0x2100 && adr < 0x2200) { + snes_writeBBus(snes, adr & 0xff, val); // B-bus + } else if(adr == 0x4016) { + snes->input1->latchLine = val & 1; + snes->input2->latchLine = val & 1; + } else if(adr >= 0x4200 && adr < 0x4220) { + snes_writeReg(snes, adr, val); // internal registers + } else if(adr >= 0x4300 && adr < 0x4380) { + dma_write(snes->dma, adr, val); // dma registers + } + } + cart_write(snes->cart, bank, adr, val); + // write to cart +} + +static int snes_getAccessTime(Snes* snes, uint32_t adr) { + // optimization + return 6; + + uint8_t bank = adr >> 16; + adr &= 0xffff; + if(bank >= 0x40 && bank < 0x80) { + return 8; // slow + } + if(bank >= 0xc0) { + return snes->fastMem ? 6 : 8; // depends on setting + } + // banks 0x00-0x3f and 0x80-0xcf + if(adr < 0x2000) { + return 8; // slow + } + if(adr < 0x4000) { + return 6; // fast + } + if(adr < 0x4200) { + return 12; // extra slow + } + if(adr < 0x6000) { + return 6; // fast + } + if(adr < 0x8000) { + return 8; // slow + } + // 0x8000-0xffff + return (snes->fastMem && bank >= 0x80) ? 6 : 8; // depends on setting in banks 80+ +} + +uint8_t snes_read(Snes* snes, uint32_t adr) { + uint8_t val = snes_rread(snes, adr); + snes->openBus = val; + return val; +} + +uint8_t snes_cpuRead(Snes* snes, uint32_t adr) { + snes->cpuMemOps++; + snes->cpuCyclesLeft += snes_getAccessTime(snes, adr); + return snes_read(snes, adr); +} + +void snes_cpuWrite(Snes* snes, uint32_t adr, uint8_t val) { + snes->cpuMemOps++; + snes->cpuCyclesLeft += snes_getAccessTime(snes, adr); + snes_write(snes, adr, val); +} + +// debugging + +void snes_debugCycle(Snes* snes, bool* cpuNext, bool* spcNext) { + // runs a normal cycle, catches up the apu, then looks if the next cycle will execute a CPU and/or a SPC opcode + snes_runCycle(snes); + snes_catchupApu(snes); + if(snes->dma->hdmaTimer > 0 || snes->dma->dmaBusy || (snes->hPos >= 536 && snes->hPos < 576)) { + *cpuNext = false; + } else { + *cpuNext = snes->cpuCyclesLeft == 0; + } + if(snes->apuCatchupCycles + (apuCyclesPerMaster * 2.0) >= 1.0) { + // we will run a apu cycle next call, see if it also starts a opcode + *spcNext = snes->apu->cpuCyclesLeft == 0; + } else { + *spcNext = false; + } +} diff --git a/snes/snes.h b/snes/snes.h new file mode 100644 index 00000000..22cd90a8 --- /dev/null +++ b/snes/snes.h @@ -0,0 +1,106 @@ + +#ifndef SNES_H +#define SNES_H + +#include +#include +#include +#include +#include + +typedef struct Snes Snes; + +#include "cpu.h" +#include "apu.h" +#include "dma.h" +#include "ppu.h" +#include "cart.h" +#include "input.h" + +enum { + kIsOrigEmu = 0 +}; + + +struct Snes { + Cpu* cpu; + Apu* apu; + Ppu* ppu; + Dma* dma; + Cart* cart; + // input + bool debug_cycles; + bool disableHpos; + Input* input1; + Input* input2; + + + // frame timing + + + uint16_t hPos; + uint16_t vPos; + uint32_t frames; + // cpu handling + uint8_t cpuCyclesLeft; + uint8_t cpuMemOps; + double apuCatchupCycles; + // nmi / irq + bool hIrqEnabled; + bool vIrqEnabled; + bool nmiEnabled; + uint16_t hTimer; + uint16_t vTimer; + bool inNmi; + bool inIrq; + bool inVblank; + // joypad handling + uint16_t portAutoRead[4]; // as read by auto-joypad read + bool autoJoyRead; + uint16_t autoJoyTimer; // times how long until reading is done + bool ppuLatch; + // multiplication/division + uint8_t multiplyA; + uint16_t multiplyResult; + uint16_t divideA; + uint16_t divideResult; + // misc + bool fastMem; + uint8_t openBus; + // ram + uint8_t *ram; + uint32_t ramAdr; +}; + +Snes* snes_init(uint8_t *ram); +void snes_free(Snes* snes); +void snes_reset(Snes* snes, bool hard); +void snes_runFrame(Snes* snes); +// used by dma, cpu +uint8_t snes_readBBus(Snes* snes, uint8_t adr); +void snes_writeBBus(Snes* snes, uint8_t adr, uint8_t val); +uint8_t snes_read(Snes* snes, uint32_t adr); +void snes_write(Snes* snes, uint32_t adr, uint8_t val); +uint8_t snes_cpuRead(Snes* snes, uint32_t adr); +void snes_cpuWrite(Snes* snes, uint32_t adr, uint8_t val); +// debugging +void snes_debugCycle(Snes* snes, bool* cpuNext, bool* spcNext); +void snes_printCpuLine(Snes *snes); +void snes_doAutoJoypad(Snes *snes); +// snes_other.c functions: + +bool snes_loadRom(Snes* snes, uint8_t* data, int length); +void snes_setButtonState(Snes* snes, int player, int button, bool pressed); +void snes_setPixels(Snes* snes, uint8_t* pixelData); +void snes_setSamples(Snes* snes, int16_t* sampleData, int samplesPerFrame); +void snes_saveload(Snes *snes, SaveLoadFunc *func, void *ctx); + +enum { + kSaveLoad_Save = 0, + kSaveLoad_Load = 1, + kSaveLoad_Replay = 2, +}; + + +#endif + diff --git a/snes/snes_other.cpp b/snes/snes_other.cpp new file mode 100644 index 00000000..25eaa96f --- /dev/null +++ b/snes/snes_other.cpp @@ -0,0 +1,220 @@ + +#include +#include +#include +#include +#include + +#include "snes.h" +#include "cart.h" +#include "ppu.h" +#include "dsp.h" + +typedef struct CartHeader { + // normal header + uint8_t headerVersion; // 1, 2, 3 + char name[22]; // $ffc0-$ffd4 (max 21 bytes + \0), $ffd4=$00: header V2 + uint8_t speed; // $ffd5.7-4 (always 2 or 3) + uint8_t type; // $ffd5.3-0 + uint8_t coprocessor; // $ffd6.7-4 + uint8_t chips; // $ffd6.3-0 + uint32_t romSize; // $ffd7 (0x400 << x) + uint32_t ramSize; // $ffd8 (0x400 << x) + uint8_t region; // $ffd9 (also NTSC/PAL) + uint8_t maker; // $ffda ($33: header V3) + uint8_t version; // $ffdb + uint16_t checksumComplement; // $ffdc,$ffdd + uint16_t checksum; // $ffde,$ffdf + // v2/v3 (v2 only exCoprocessor) + char makerCode[3]; // $ffb0,$ffb1: (2 chars + \0) + char gameCode[5]; // $ffb2-$ffb5: (4 chars + \0) + uint32_t flashSize; // $ffbc (0x400 << x) + uint32_t exRamSize; // $ffbd (0x400 << x) (used for GSU?) + uint8_t specialVersion; // $ffbe + uint8_t exCoprocessor; // $ffbf (if coprocessor = $f) + // calculated stuff + int16_t score; // score for header, to see which mapping is most likely + bool pal; // if this is a rom for PAL regions instead of NTSC + uint8_t cartType; // calculated type +} CartHeader; + +static void readHeader(uint8_t* data, int location, CartHeader* header); + +bool snes_loadRom(Snes* snes, uint8_t* data, int length) { + // if smaller than smallest possible, don't load + if(length < 0x8000) { + printf("Failed to load rom: rom to small (%d bytes)\n", length); + return false; + } + // check headers + CartHeader headers[4]; + memset(headers, 0, sizeof(headers)); + for(int i = 0; i < 4; i++) { + headers[i].score = -50; + } + if(length >= 0x8000) readHeader(data, 0x7fc0, &headers[0]); + if(length >= 0x8200) readHeader(data, 0x81c0, &headers[1]); + if(length >= 0x10000) readHeader(data, 0xffc0, &headers[2]); + if(length >= 0x10200) readHeader(data, 0x101c0, &headers[3]); + // see which it is + int max = 0; + int used = 0; + for(int i = 0; i < 4; i++) { + if(headers[i].score > max) { + max = headers[i].score; + used = i; + } + } + if(used & 1) { + // odd-numbered ones are for headered roms + data += 0x200; // move pointer past header + length -= 0x200; // and subtract from size + } + // check if we can load it + if(headers[used].cartType > 2) { + printf("Failed to load rom: unsupported type (%d)\n", headers[used].cartType); + return false; + } + // expand to a power of 2 + int newLength = 0x8000; + while(true) { + if(length <= newLength) { + break; + } + newLength *= 2; + } + uint8_t* newData = (uint8_t * )malloc(newLength); + memcpy(newData, data, length); + int test = 1; + while(length != newLength) { + if(length & test) { + memcpy(newData + length, newData + length - test, test); + length += test; + } + test *= 2; + } + // load it + printf("Loaded %s rom\n\"%s\"\n", headers[used].cartType == 2 ? "HiROM" : "LoROM", headers[used].name); + cart_load( + snes->cart, headers[used].cartType, + newData, newLength, headers[used].chips > 0 ? headers[used].ramSize : 0 + ); + snes_reset(snes, true); // reset after loading + free(newData); + return true; +} + +void snes_setButtonState(Snes* snes, int player, int button, bool pressed) { + // set key in constroller + if(player == 1) { + if(pressed) { + snes->input1->currentState |= 1 << button; + } else { + snes->input1->currentState &= ~(1 << button); + } + } else { + if(pressed) { + snes->input2->currentState |= 1 << button; + } else { + snes->input2->currentState &= ~(1 << button); + } + } +} + +void snes_setPixels(Snes* snes, uint8_t* pixelData) { + // size is 4 (rgba) * 512 (w) * 480 (h) + ppu_putPixels(snes->ppu, pixelData); +} + +void snes_setSamples(Snes* snes, int16_t* sampleData, int samplesPerFrame) { + // size is 2 (int16) * 2 (stereo) * samplesPerFrame + // sets samples in the sampleData + dsp_getSamples(snes->apu->dsp, sampleData, samplesPerFrame); +} + +static void readHeader(uint8_t* data, int location, CartHeader* header) { + // read name, TODO: non-ASCII names? + for(int i = 0; i < 21; i++) { + uint8_t ch = data[location + i]; + if(ch >= 0x20 && ch < 0x7f) { + header->name[i] = ch; + } else { + header->name[i] = '.'; + } + } + header->name[21] = 0; + // read rest + header->speed = data[location + 0x15] >> 4; + header->type = data[location + 0x15] & 0xf; + header->coprocessor = data[location + 0x16] >> 4; + header->chips = data[location + 0x16] & 0xf; + header->romSize = 0x400 << data[location + 0x17]; + header->ramSize = 0x400 << data[location + 0x18]; + header->region = data[location + 0x19]; + header->maker = data[location + 0x1a]; + header->version = data[location + 0x1b]; + header->checksumComplement = (data[location + 0x1d] << 8) + data[location + 0x1c]; + header->checksum = (data[location + 0x1f] << 8) + data[location + 0x1e]; + // read v3 and/or v2 + header->headerVersion = 1; + if(header->maker == 0x33) { + header->headerVersion = 3; + // maker code + for(int i = 0; i < 2; i++) { + uint8_t ch = data[location - 0x10 + i]; + if(ch >= 0x20 && ch < 0x7f) { + header->makerCode[i] = ch; + } else { + header->makerCode[i] = '.'; + } + } + header->makerCode[2] = 0; + // game code + for(int i = 0; i < 4; i++) { + uint8_t ch = data[location - 0xe + i]; + if(ch >= 0x20 && ch < 0x7f) { + header->gameCode[i] = ch; + } else { + header->gameCode[i] = '.'; + } + } + header->gameCode[4] = 0; + header->flashSize = 0x400 << data[location - 4]; + header->exRamSize = 0x400 << data[location - 3]; + header->specialVersion = data[location - 2]; + header->exCoprocessor = data[location - 1]; + } else if(data[location + 0x14] == 0) { + header->headerVersion = 2; + header->exCoprocessor = data[location - 1]; + } + // get region + header->pal = (header->region >= 0x2 && header->region <= 0xc) || header->region == 0x11; + header->cartType = location < 0x9000 ? 1 : 2; + // get score + // TODO: check name, maker/game-codes (if V3) for ASCII, more vectors, + // more first opcode, rom-sizes (matches?), type (matches header location?) + int score = 0; + score += (header->speed == 2 || header->speed == 3) ? 5 : -4; + score += (header->type <= 3 || header->type == 5) ? 5 : -2; + score += (header->coprocessor <= 5 || header->coprocessor >= 0xe) ? 5 : -2; + score += (header->chips <= 6 || header->chips == 9 || header->chips == 0xa) ? 5 : -2; + score += (header->region <= 0x14) ? 5 : -2; + score += (header->checksum + header->checksumComplement == 0xffff) ? 8 : -6; + uint16_t resetVector = data[location + 0x3c] | (data[location + 0x3d] << 8); + score += (resetVector >= 0x8000) ? 8 : -20; + // check first opcode after reset + uint8_t opcode = data[location + 0x40 - 0x8000 + (resetVector & 0x7fff)]; + if(opcode == 0x78 || opcode == 0x18) { + // sei, clc (for clc:xce) + score += 6; + } + if(opcode == 0x4c || opcode == 0x5c || opcode == 0x9c) { + // jmp abs, jml abl, stz abs + score += 3; + } + if(opcode == 0x00 || opcode == 0xff || opcode == 0xdb) { + // brk, sbc alx, stp + score -= 6; + } + header->score = score; +} diff --git a/snes/spc.cpp b/snes/spc.cpp new file mode 100644 index 00000000..e38a5085 --- /dev/null +++ b/snes/spc.cpp @@ -0,0 +1,1528 @@ + +#include +#include +#include +#include +#include +#include +#include "spc.h" +#include "apu.h" + +static const int cyclesPerOpcode[256] = { + 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, + 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 4, 6, + 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 5, 4, + 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 3, 8, + 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 6, 6, + 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 4, 5, 2, 2, 4, 3, + 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 5, 5, + 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 6, + 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 2, 4, 5, + 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 12,5, + 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 2, 4, 4, + 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 4, + 2, 8, 4, 5, 4, 5, 4, 7, 2, 5, 6, 4, 5, 2, 4, 9, + 2, 8, 4, 5, 5, 6, 6, 7, 4, 5, 5, 5, 2, 2, 6, 3, + 2, 8, 4, 5, 3, 4, 3, 6, 2, 4, 5, 3, 4, 3, 4, 3, + 2, 8, 4, 5, 4, 5, 5, 6, 3, 4, 5, 4, 2, 2, 4, 3 +}; + +static uint8_t spc_read(Spc* spc, uint16_t adr); +static void spc_write(Spc* spc, uint16_t adr, uint8_t val); +static uint8_t spc_readOpcode(Spc* spc); +static uint16_t spc_readOpcodeWord(Spc* spc); +static uint8_t spc_getFlags(Spc* spc); +static void spc_setFlags(Spc* spc, uint8_t value); +static void spc_setZN(Spc* spc, uint8_t value); +static void spc_doBranch(Spc* spc, uint8_t value, bool check); +static uint8_t spc_pullByte(Spc* spc); +static void spc_pushByte(Spc* spc, uint8_t value); +static uint16_t spc_pullWord(Spc* spc); +static void spc_pushWord(Spc* spc, uint16_t value); +static uint16_t spc_readWord(Spc* spc, uint16_t adrl, uint16_t adrh); +static void spc_writeWord(Spc* spc, uint16_t adrl, uint16_t adrh, uint16_t value); +static void spc_doOpcode(Spc* spc, uint8_t opcode); + +// addressing modes and opcode functions not declared, only used after defintions + +static uint8_t spc_read(Spc* spc, uint16_t adr) { + return apu_cpuRead(spc->apu, adr); +} + +static void spc_write(Spc* spc, uint16_t adr, uint8_t val) { + if (0 && adr == 0x5e) + printf("writing to vol_dirty %d\n", val); + apu_cpuWrite(spc->apu, adr, val); +} + +Spc* spc_init(Apu* apu) { + Spc* spc = (Spc * )malloc(sizeof(Spc)); + spc->apu = apu; + return spc; +} + +void spc_free(Spc* spc) { + free(spc); +} + +void spc_reset(Spc* spc) { + spc->a = 0; + spc->x = 0; + spc->y = 0; + spc->sp = 0; + spc->pc = spc_read(spc, 0xfffe) | (spc_read(spc, 0xffff) << 8); + spc->c = false; + spc->z = false; + spc->v = false; + spc->n = false; + spc->i = false; + spc->h = false; + spc->p = false; + spc->b = false; + spc->stopped = false; + spc->cyclesUsed = 0; +} + +void spc_saveload(Spc *spc, SaveLoadFunc *func, void *ctx) { + func(ctx, &spc->a, offsetof(Spc, cyclesUsed) - offsetof(Spc, a)); +} + +int spc_runOpcode(Spc* spc) { + spc->cyclesUsed = 0; + if(spc->stopped) return 1; + uint8_t opcode = spc_readOpcode(spc); + spc->cyclesUsed = cyclesPerOpcode[opcode]; + spc_doOpcode(spc, opcode); + return spc->cyclesUsed; +} + +static uint8_t spc_readOpcode(Spc* spc) { + return spc_read(spc, spc->pc++); +} + +static uint16_t spc_readOpcodeWord(Spc* spc) { + uint8_t low = spc_readOpcode(spc); + return low | (spc_readOpcode(spc) << 8); +} + +static uint8_t spc_getFlags(Spc* spc) { + uint8_t val = spc->n << 7; + val |= spc->v << 6; + val |= spc->p << 5; + val |= spc->b << 4; + val |= spc->h << 3; + val |= spc->i << 2; + val |= spc->z << 1; + val |= (uint8_t)spc->c; + return val; +} + +static void spc_setFlags(Spc* spc, uint8_t val) { + spc->n = val & 0x80; + spc->v = val & 0x40; + spc->p = val & 0x20; + spc->b = val & 0x10; + spc->h = val & 8; + spc->i = val & 4; + spc->z = val & 2; + spc->c = val & 1; +} + +static void spc_setZN(Spc* spc, uint8_t value) { + spc->z = value == 0; + spc->n = value & 0x80; +} + +static void spc_doBranch(Spc* spc, uint8_t value, bool check) { + if(check) { + spc->cyclesUsed += 2; // taken branch: 2 extra cycles + spc->pc += (int8_t) value; + } +} + +static uint8_t spc_pullByte(Spc* spc) { + spc->sp++; + return spc_read(spc, 0x100 | spc->sp); +} + +static void spc_pushByte(Spc* spc, uint8_t value) { + spc_write(spc, 0x100 | spc->sp, value); + spc->sp--; +} + +static uint16_t spc_pullWord(Spc* spc) { + uint8_t value = spc_pullByte(spc); + return value | (spc_pullByte(spc) << 8); +} + +static void spc_pushWord(Spc* spc, uint16_t value) { + spc_pushByte(spc, value >> 8); + spc_pushByte(spc, value & 0xff); +} + +static uint16_t spc_readWord(Spc* spc, uint16_t adrl, uint16_t adrh) { + uint8_t value = spc_read(spc, adrl); + return value | (spc_read(spc, adrh) << 8); +} + +static void spc_writeWord(Spc* spc, uint16_t adrl, uint16_t adrh, uint16_t value) { + spc_write(spc, adrl, value & 0xff); + spc_write(spc, adrh, value >> 8); +} + +// adressing modes + +static uint16_t spc_adrDp(Spc* spc) { + return spc_readOpcode(spc) | (spc->p << 8); +} + +static uint16_t spc_adrAbs(Spc* spc) { + return spc_readOpcodeWord(spc); +} + +static uint16_t spc_adrInd(Spc* spc) { + return spc->x | (spc->p << 8); +} + +static uint16_t spc_adrIdx(Spc* spc) { + uint8_t pointer = spc_readOpcode(spc); + return spc_readWord(spc, ((pointer + spc->x) & 0xff) | (spc->p << 8), ((pointer + spc->x + 1) & 0xff) | (spc->p << 8)); +} + +static uint16_t spc_adrImm(Spc* spc) { + return spc->pc++; +} + +static uint16_t spc_adrDpx(Spc* spc) { + return ((spc_readOpcode(spc) + spc->x) & 0xff) | (spc->p << 8); +} + +static uint16_t spc_adrDpy(Spc* spc) { + return ((spc_readOpcode(spc) + spc->y) & 0xff) | (spc->p << 8); +} + +static uint16_t spc_adrAbx(Spc* spc) { + return (spc_readOpcodeWord(spc) + spc->x) & 0xffff; +} + +static uint16_t spc_adrAby(Spc* spc) { + return (spc_readOpcodeWord(spc) + spc->y) & 0xffff; +} + +static uint16_t spc_adrIdy(Spc* spc) { + uint8_t pointer = spc_readOpcode(spc); + uint16_t adr = spc_readWord(spc, pointer | (spc->p << 8), ((pointer + 1) & 0xff) | (spc->p << 8)); + return (adr + spc->y) & 0xffff; +} + +static uint16_t spc_adrDpDp(Spc* spc, uint16_t* src) { + *src = spc_readOpcode(spc) | (spc->p << 8); + return spc_readOpcode(spc) | (spc->p << 8); +} + +static uint16_t spc_adrDpImm(Spc* spc, uint16_t* src) { + *src = spc->pc++; + return spc_readOpcode(spc) | (spc->p << 8); +} + +static uint16_t spc_adrIndInd(Spc* spc, uint16_t* src) { + *src = spc->y | (spc->p << 8); + return spc->x | (spc->p << 8); +} + +static uint8_t spc_adrAbsBit(Spc* spc, uint16_t* adr) { + uint16_t adrBit = spc_readOpcodeWord(spc); + *adr = adrBit & 0x1fff; + return adrBit >> 13; +} + +static uint16_t spc_adrDpWord(Spc* spc, uint16_t* low) { + uint8_t adr = spc_readOpcode(spc); + *low = adr | (spc->p << 8); + return ((adr + 1) & 0xff) | (spc->p << 8); +} + +static uint16_t spc_adrIndP(Spc* spc) { + return spc->x++ | (spc->p << 8); +} + +// opcode functions + +static void spc_and(Spc* spc, uint16_t adr) { + spc->a &= spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_andm(Spc* spc, uint16_t dst, uint16_t src) { + uint8_t value = spc_read(spc, src); + uint8_t result = spc_read(spc, dst) & value; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_or(Spc* spc, uint16_t adr) { + spc->a |= spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_orm(Spc* spc, uint16_t dst, uint16_t src) { + uint8_t value = spc_read(spc, src); + uint8_t result = spc_read(spc, dst) | value; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_eor(Spc* spc, uint16_t adr) { + spc->a ^= spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_eorm(Spc* spc, uint16_t dst, uint16_t src) { + uint8_t value = spc_read(spc, src); + uint8_t result = spc_read(spc, dst) ^ value; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_adc(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr); + int result = spc->a + value + spc->c; + spc->v = (spc->a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((spc->a & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc->a = result; + spc_setZN(spc, spc->a); +} + +static void spc_adcm(Spc* spc, uint16_t dst, uint16_t src) { + uint8_t value = spc_read(spc, src); + uint8_t applyOn = spc_read(spc, dst); + int result = applyOn + value + spc->c; + spc->v = (applyOn & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((applyOn & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_sbc(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->a + value + spc->c; + spc->v = (spc->a & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((spc->a & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc->a = result; + spc_setZN(spc, spc->a); +} + +static void spc_sbcm(Spc* spc, uint16_t dst, uint16_t src) { + uint8_t value = spc_read(spc, src) ^ 0xff; + uint8_t applyOn = spc_read(spc, dst); + int result = applyOn + value + spc->c; + spc->v = (applyOn & 0x80) == (value & 0x80) && (value & 0x80) != (result & 0x80); + spc->h = ((applyOn & 0xf) + (value & 0xf) + spc->c) > 0xf; + spc->c = result > 0xff; + spc_write(spc, dst, result); + spc_setZN(spc, result); +} + +static void spc_cmp(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->a + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_cmpx(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->x + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_cmpy(Spc* spc, uint16_t adr) { + uint8_t value = spc_read(spc, adr) ^ 0xff; + int result = spc->y + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_cmpm(Spc* spc, uint16_t dst, uint16_t src) { + uint8_t value = spc_read(spc, src) ^ 0xff; + int result = spc_read(spc, dst) + value + 1; + spc->c = result > 0xff; + spc_setZN(spc, result); +} + +static void spc_mov(Spc* spc, uint16_t adr) { + spc->a = spc_read(spc, adr); + spc_setZN(spc, spc->a); +} + +static void spc_movx(Spc* spc, uint16_t adr) { + spc->x = spc_read(spc, adr); + spc_setZN(spc, spc->x); +} + +static void spc_movy(Spc* spc, uint16_t adr) { + spc->y = spc_read(spc, adr); + spc_setZN(spc, spc->y); +} + +static void spc_movs(Spc* spc, uint16_t adr) { + spc_read(spc, adr); + spc_write(spc, adr, spc->a); +} + +static void spc_movsx(Spc* spc, uint16_t adr) { + spc_read(spc, adr); + spc_write(spc, adr, spc->x); +} + +static void spc_movsy(Spc* spc, uint16_t adr) { + spc_read(spc, adr); + spc_write(spc, adr, spc->y); +} + +static void spc_asl(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + spc->c = val & 0x80; + val <<= 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_lsr(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + spc->c = val & 1; + val >>= 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_rol(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + bool newC = val & 0x80; + val = (val << 1) | (uint8_t)spc->c; + spc->c = newC; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_ror(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr); + bool newC = val & 1; + val = (val >> 1) | (spc->c << 7); + spc->c = newC; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_inc(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr) + 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_dec(Spc* spc, uint16_t adr) { + uint8_t val = spc_read(spc, adr) - 1; + spc_write(spc, adr, val); + spc_setZN(spc, val); +} + +static void spc_doOpcode(Spc* spc, uint8_t opcode) { + switch(opcode) { + case 0x00: { // nop imp + // no operation + break; + } + case 0x01: + case 0x11: + case 0x21: + case 0x31: + case 0x41: + case 0x51: + case 0x61: + case 0x71: + case 0x81: + case 0x91: + case 0xa1: + case 0xb1: + case 0xc1: + case 0xd1: + case 0xe1: + case 0xf1: { // tcall imp + spc_pushWord(spc, spc->pc); + uint16_t adr = 0xffde - (2 * (opcode >> 4)); + spc->pc = spc_readWord(spc, adr, adr + 1); + break; + } + case 0x02: + case 0x22: + case 0x42: + case 0x62: + case 0x82: + case 0xa2: + case 0xc2: + case 0xe2: { // set1 dp + uint16_t adr = spc_adrDp(spc); + spc_write(spc, adr, spc_read(spc, adr) | (1 << (opcode >> 5))); + break; + } + case 0x12: + case 0x32: + case 0x52: + case 0x72: + case 0x92: + case 0xb2: + case 0xd2: + case 0xf2: { // clr1 dp + uint16_t adr = spc_adrDp(spc); + spc_write(spc, adr, spc_read(spc, adr) & ~(1 << (opcode >> 5))); + break; + } + case 0x03: + case 0x23: + case 0x43: + case 0x63: + case 0x83: + case 0xa3: + case 0xc3: + case 0xe3: { // bbs dp, rel + uint8_t val = spc_read(spc, spc_adrDp(spc)); + spc_doBranch(spc, spc_readOpcode(spc), val & (1 << (opcode >> 5))); + break; + } + case 0x13: + case 0x33: + case 0x53: + case 0x73: + case 0x93: + case 0xb3: + case 0xd3: + case 0xf3: { // bbc dp, rel + uint8_t val = spc_read(spc, spc_adrDp(spc)); + spc_doBranch(spc, spc_readOpcode(spc), (val & (1 << (opcode >> 5))) == 0); + break; + } + case 0x04: { // or dp + spc_or(spc, spc_adrDp(spc)); + break; + } + case 0x05: { // or abs + spc_or(spc, spc_adrAbs(spc)); + break; + } + case 0x06: { // or ind + spc_or(spc, spc_adrInd(spc)); + break; + } + case 0x07: { // or idx + spc_or(spc, spc_adrIdx(spc)); + break; + } + case 0x08: { // or imm + spc_or(spc, spc_adrImm(spc)); + break; + } + case 0x09: { // orm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_orm(spc, dst, src); + break; + } + case 0x0a: { // or1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c | ((spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x0b: { // asl dp + spc_asl(spc, spc_adrDp(spc)); + break; + } + case 0x0c: { // asl abs + spc_asl(spc, spc_adrAbs(spc)); + break; + } + case 0x0d: { // pushp imp + spc_pushByte(spc, spc_getFlags(spc)); + break; + } + case 0x0e: { // tset1 abs + uint16_t adr = spc_adrAbs(spc); + uint8_t val = spc_read(spc, adr); + uint8_t result = spc->a + (val ^ 0xff) + 1; + spc_setZN(spc, result); + spc_write(spc, adr, val | spc->a); + break; + } + case 0x0f: { // brk imp + spc_pushWord(spc, spc->pc); + spc_pushByte(spc, spc_getFlags(spc)); + spc->i = false; + spc->b = true; + spc->pc = spc_readWord(spc, 0xffde, 0xffdf); + break; + } + case 0x10: { // bpl rel + spc_doBranch(spc, spc_readOpcode(spc), !spc->n); + break; + } + case 0x14: { // or dpx + spc_or(spc, spc_adrDpx(spc)); + break; + } + case 0x15: { // or abx + spc_or(spc, spc_adrAbx(spc)); + break; + } + case 0x16: { // or aby + spc_or(spc, spc_adrAby(spc)); + break; + } + case 0x17: { // or idy + spc_or(spc, spc_adrIdy(spc)); + break; + } + case 0x18: { // orm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_orm(spc, dst, src); + break; + } + case 0x19: { // orm ind, ind + uint16_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_orm(spc, dst, src); + break; + } + case 0x1a: { // decw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_readWord(spc, low, high) - 1; + spc->z = value == 0; + spc->n = value & 0x8000; + spc_writeWord(spc, low, high, value); + break; + } + case 0x1b: { // asl dpx + spc_asl(spc, spc_adrDpx(spc)); + break; + } + case 0x1c: { // asla imp + spc->c = spc->a & 0x80; + spc->a <<= 1; + spc_setZN(spc, spc->a); + break; + } + case 0x1d: { // decx imp + spc->x--; + spc_setZN(spc, spc->x); + break; + } + case 0x1e: { // cmpx abs + spc_cmpx(spc, spc_adrAbs(spc)); + break; + } + case 0x1f: { // jmp iax + uint16_t pointer = spc_readOpcodeWord(spc); + spc->pc = spc_readWord(spc, (pointer + spc->x) & 0xffff, (pointer + spc->x + 1) & 0xffff); + break; + } + case 0x20: { // clrp imp + spc->p = false; + break; + } + case 0x24: { // and dp + spc_and(spc, spc_adrDp(spc)); + break; + } + case 0x25: { // and abs + spc_and(spc, spc_adrAbs(spc)); + break; + } + case 0x26: { // and ind + spc_and(spc, spc_adrInd(spc)); + break; + } + case 0x27: { // and idx + spc_and(spc, spc_adrIdx(spc)); + break; + } + case 0x28: { // and imm + spc_and(spc, spc_adrImm(spc)); + break; + } + case 0x29: { // andm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_andm(spc, dst, src); + break; + } + case 0x2a: { // or1n abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c | (~(spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x2b: { // rol dp + spc_rol(spc, spc_adrDp(spc)); + break; + } + case 0x2c: { // rol abs + spc_rol(spc, spc_adrAbs(spc)); + break; + } + case 0x2d: { // pusha imp + spc_pushByte(spc, spc->a); + break; + } + case 0x2e: { // cbne dp, rel + uint8_t val = spc_read(spc, spc_adrDp(spc)) ^ 0xff; + uint8_t result = spc->a + val + 1; + spc_doBranch(spc, spc_readOpcode(spc), result != 0); + break; + } + case 0x2f: { // bra rel + spc->pc += (int8_t) spc_readOpcode(spc); + break; + } + case 0x30: { // bmi rel + spc_doBranch(spc, spc_readOpcode(spc), spc->n); + break; + } + case 0x34: { // and dpx + spc_and(spc, spc_adrDpx(spc)); + break; + } + case 0x35: { // and abx + spc_and(spc, spc_adrAbx(spc)); + break; + } + case 0x36: { // and aby + spc_and(spc, spc_adrAby(spc)); + break; + } + case 0x37: { // and idy + spc_and(spc, spc_adrIdy(spc)); + break; + } + case 0x38: { // andm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_andm(spc, dst, src); + break; + } + case 0x39: { // andm ind, ind + uint16_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_andm(spc, dst, src); + break; + } + case 0x3a: { // incw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_readWord(spc, low, high) + 1; + spc->z = value == 0; + spc->n = value & 0x8000; + spc_writeWord(spc, low, high, value); + break; + } + case 0x3b: { // rol dpx + spc_rol(spc, spc_adrDpx(spc)); + break; + } + case 0x3c: { // rola imp + bool newC = spc->a & 0x80; + spc->a = (spc->a << 1) | (uint8_t)spc->c; + spc->c = newC; + spc_setZN(spc, spc->a); + break; + } + case 0x3d: { // incx imp + spc->x++; + spc_setZN(spc, spc->x); + break; + } + case 0x3e: { // cmpx dp + spc_cmpx(spc, spc_adrDp(spc)); + break; + } + case 0x3f: { // call abs + uint16_t dst = spc_readOpcodeWord(spc); + spc_pushWord(spc, spc->pc); + spc->pc = dst; + break; + } + case 0x40: { // setp imp + spc->p = true; + break; + } + case 0x44: { // eor dp + spc_eor(spc, spc_adrDp(spc)); + break; + } + case 0x45: { // eor abs + spc_eor(spc, spc_adrAbs(spc)); + break; + } + case 0x46: { // eor ind + spc_eor(spc, spc_adrInd(spc)); + break; + } + case 0x47: { // eor idx + spc_eor(spc, spc_adrIdx(spc)); + break; + } + case 0x48: { // eor imm + spc_eor(spc, spc_adrImm(spc)); + break; + } + case 0x49: { // eorm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_eorm(spc, dst, src); + break; + } + case 0x4a: { // and1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c & ((spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x4b: { // lsr dp + spc_lsr(spc, spc_adrDp(spc)); + break; + } + case 0x4c: { // lsr abs + spc_lsr(spc, spc_adrAbs(spc)); + break; + } + case 0x4d: { // pushx imp + spc_pushByte(spc, spc->x); + break; + } + case 0x4e: { // tclr1 abs + uint16_t adr = spc_adrAbs(spc); + uint8_t val = spc_read(spc, adr); + uint8_t result = spc->a + (val ^ 0xff) + 1; + spc_setZN(spc, result); + spc_write(spc, adr, val & ~spc->a); + break; + } + case 0x4f: { // pcall dp + uint8_t dst = spc_readOpcode(spc); + spc_pushWord(spc, spc->pc); + spc->pc = 0xff00 | dst; + break; + } + case 0x50: { // bvc rel + spc_doBranch(spc, spc_readOpcode(spc), !spc->v); + break; + } + case 0x54: { // eor dpx + spc_eor(spc, spc_adrDpx(spc)); + break; + } + case 0x55: { // eor abx + spc_eor(spc, spc_adrAbx(spc)); + break; + } + case 0x56: { // eor aby + spc_eor(spc, spc_adrAby(spc)); + break; + } + case 0x57: { // eor idy + spc_eor(spc, spc_adrIdy(spc)); + break; + } + case 0x58: { // eorm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_eorm(spc, dst, src); + break; + } + case 0x59: { // eorm ind, ind + uint16_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_eorm(spc, dst, src); + break; + } + case 0x5a: { // cmpw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_readWord(spc, low, high) ^ 0xffff; + uint16_t ya = spc->a | (spc->y << 8); + int result = ya + value + 1; + spc->c = result > 0xffff; + spc->z = (result & 0xffff) == 0; + spc->n = result & 0x8000; + break; + } + case 0x5b: { // lsr dpx + spc_lsr(spc, spc_adrDpx(spc)); + break; + } + case 0x5c: { // lsra imp + spc->c = spc->a & 1; + spc->a >>= 1; + spc_setZN(spc, spc->a); + break; + } + case 0x5d: { // movxa imp + spc->x = spc->a; + spc_setZN(spc, spc->x); + break; + } + case 0x5e: { // cmpy abs + spc_cmpy(spc, spc_adrAbs(spc)); + break; + } + case 0x5f: { // jmp abs + spc->pc = spc_readOpcodeWord(spc); + break; + } + case 0x60: { // clrc imp + spc->c = false; + break; + } + case 0x64: { // cmp dp + spc_cmp(spc, spc_adrDp(spc)); + break; + } + case 0x65: { // cmp abs + spc_cmp(spc, spc_adrAbs(spc)); + break; + } + case 0x66: { // cmp ind + spc_cmp(spc, spc_adrInd(spc)); + break; + } + case 0x67: { // cmp idx + spc_cmp(spc, spc_adrIdx(spc)); + break; + } + case 0x68: { // cmp imm + spc_cmp(spc, spc_adrImm(spc)); + break; + } + case 0x69: { // cmpm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_cmpm(spc, dst, src); + break; + } + case 0x6a: { // and1n abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c & (~(spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x6b: { // ror dp + spc_ror(spc, spc_adrDp(spc)); + break; + } + case 0x6c: { // ror abs + spc_ror(spc, spc_adrAbs(spc)); + break; + } + case 0x6d: { // pushy imp + spc_pushByte(spc, spc->y); + break; + } + case 0x6e: { // dbnz dp, rel + uint16_t adr = spc_adrDp(spc); + uint8_t result = spc_read(spc, adr) - 1; + spc_write(spc, adr, result); + spc_doBranch(spc, spc_readOpcode(spc), result != 0); + break; + } + case 0x6f: { // ret imp + spc->pc = spc_pullWord(spc); + break; + } + case 0x70: { // bvs rel + spc_doBranch(spc, spc_readOpcode(spc), spc->v); + break; + } + case 0x74: { // cmp dpx + spc_cmp(spc, spc_adrDpx(spc)); + break; + } + case 0x75: { // cmp abx + spc_cmp(spc, spc_adrAbx(spc)); + break; + } + case 0x76: { // cmp aby + spc_cmp(spc, spc_adrAby(spc)); + break; + } + case 0x77: { // cmp idy + spc_cmp(spc, spc_adrIdy(spc)); + break; + } + case 0x78: { // cmpm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_cmpm(spc, dst, src); + break; + } + case 0x79: { // cmpm ind, ind + uint16_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_cmpm(spc, dst, src); + break; + } + case 0x7a: { // addw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_readWord(spc, low, high); + uint16_t ya = spc->a | (spc->y << 8); + int result = ya + value; + spc->v = (ya & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + spc->h = ((ya & 0xfff) + (value & 0xfff) + 1) > 0xfff; + spc->c = result > 0xffff; + spc->z = (result & 0xffff) == 0; + spc->n = result & 0x8000; + spc->a = result & 0xff; + spc->y = result >> 8; + break; + } + case 0x7b: { // ror dpx + spc_ror(spc, spc_adrDpx(spc)); + break; + } + case 0x7c: { // rora imp + bool newC = spc->a & 1; + spc->a = (spc->a >> 1) | (spc->c << 7); + spc->c = newC; + spc_setZN(spc, spc->a); + break; + } + case 0x7d: { // movax imp + spc->a = spc->x; + spc_setZN(spc, spc->a); + break; + } + case 0x7e: { // cmpy dp + spc_cmpy(spc, spc_adrDp(spc)); + break; + } + case 0x7f: { // reti imp + spc_setFlags(spc, spc_pullByte(spc)); + spc->pc = spc_pullWord(spc); + break; + } + case 0x80: { // setc imp + spc->c = true; + break; + } + case 0x84: { // adc dp + spc_adc(spc, spc_adrDp(spc)); + break; + } + case 0x85: { // adc abs + spc_adc(spc, spc_adrAbs(spc)); + break; + } + case 0x86: { // adc ind + spc_adc(spc, spc_adrInd(spc)); + break; + } + case 0x87: { // adc idx + spc_adc(spc, spc_adrIdx(spc)); + break; + } + case 0x88: { // adc imm + spc_adc(spc, spc_adrImm(spc)); + break; + } + case 0x89: { // adcm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_adcm(spc, dst, src); + break; + } + case 0x8a: { // eor1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = spc->c ^ ((spc_read(spc, adr) >> bit) & 1); + break; + } + case 0x8b: { // dec dp + spc_dec(spc, spc_adrDp(spc)); + break; + } + case 0x8c: { // dec abs + spc_dec(spc, spc_adrAbs(spc)); + break; + } + case 0x8d: { // movy imm + spc_movy(spc, spc_adrImm(spc)); + break; + } + case 0x8e: { // popp imp + spc_setFlags(spc, spc_pullByte(spc)); + break; + } + case 0x8f: { // movm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + uint8_t val = spc_read(spc, src); + spc_read(spc, dst); + spc_write(spc, dst, val); + break; + } + case 0x90: { // bcc rel + spc_doBranch(spc, spc_readOpcode(spc), !spc->c); + break; + } + case 0x94: { // adc dpx + spc_adc(spc, spc_adrDpx(spc)); + break; + } + case 0x95: { // adc abx + spc_adc(spc, spc_adrAbx(spc)); + break; + } + case 0x96: { // adc aby + spc_adc(spc, spc_adrAby(spc)); + break; + } + case 0x97: { // adc idy + spc_adc(spc, spc_adrIdy(spc)); + break; + } + case 0x98: { // adcm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_adcm(spc, dst, src); + break; + } + case 0x99: { // adcm ind, ind + uint16_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_adcm(spc, dst, src); + break; + } + case 0x9a: { // subw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t value = spc_readWord(spc, low, high) ^ 0xffff; + uint16_t ya = spc->a | (spc->y << 8); + int result = ya + value + 1; + spc->v = (ya & 0x8000) == (value & 0x8000) && (value & 0x8000) != (result & 0x8000); + spc->h = ((ya & 0xfff) + (value & 0xfff) + 1) > 0xfff; + spc->c = result > 0xffff; + spc->z = (result & 0xffff) == 0; + spc->n = result & 0x8000; + spc->a = result & 0xff; + spc->y = result >> 8; + break; + } + case 0x9b: { // dec dpx + spc_dec(spc, spc_adrDpx(spc)); + break; + } + case 0x9c: { // deca imp + spc->a--; + spc_setZN(spc, spc->a); + break; + } + case 0x9d: { // movxp imp + spc->x = spc->sp; + spc_setZN(spc, spc->x); + break; + } + case 0x9e: { // div imp + // TODO: proper division algorithm + uint16_t value = spc->a | (spc->y << 8); + int result = 0xffff; + int mod = spc->a; + if(spc->x != 0) { + result = value / spc->x; + mod = value % spc->x; + } + spc->v = result > 0xff; + spc->h = (spc->x & 0xf) <= (spc->y & 0xf); + spc->a = result; + spc->y = mod; + spc_setZN(spc, spc->a); + break; + } + case 0x9f: { // xcn imp + spc->a = (spc->a >> 4) | (spc->a << 4); + spc_setZN(spc, spc->a); + break; + } + case 0xa0: { // ei imp + spc->i = true; + break; + } + case 0xa4: { // sbc dp + spc_sbc(spc, spc_adrDp(spc)); + break; + } + case 0xa5: { // sbc abs + spc_sbc(spc, spc_adrAbs(spc)); + break; + } + case 0xa6: { // sbc ind + spc_sbc(spc, spc_adrInd(spc)); + break; + } + case 0xa7: { // sbc idx + spc_sbc(spc, spc_adrIdx(spc)); + break; + } + case 0xa8: { // sbc imm + spc_sbc(spc, spc_adrImm(spc)); + break; + } + case 0xa9: { // sbcm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + spc_sbcm(spc, dst, src); + break; + } + case 0xaa: { // mov1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + spc->c = (spc_read(spc, adr) >> bit) & 1; + break; + } + case 0xab: { // inc dp + spc_inc(spc, spc_adrDp(spc)); + break; + } + case 0xac: { // inc abs + spc_inc(spc, spc_adrAbs(spc)); + break; + } + case 0xad: { // cmpy imm + spc_cmpy(spc, spc_adrImm(spc)); + break; + } + case 0xae: { // popa imp + spc->a = spc_pullByte(spc); + break; + } + case 0xaf: { // movs ind+ + uint16_t adr = spc_adrIndP(spc); + spc_write(spc, adr, spc->a); + break; + } + case 0xb0: { // bcs rel + spc_doBranch(spc, spc_readOpcode(spc), spc->c); + break; + } + case 0xb4: { // sbc dpx + spc_sbc(spc, spc_adrDpx(spc)); + break; + } + case 0xb5: { // sbc abx + spc_sbc(spc, spc_adrAbx(spc)); + break; + } + case 0xb6: { // sbc aby + spc_sbc(spc, spc_adrAby(spc)); + break; + } + case 0xb7: { // sbc idy + spc_sbc(spc, spc_adrIdy(spc)); + break; + } + case 0xb8: { // sbcm dp, imm + uint16_t src = 0; + uint16_t dst = spc_adrDpImm(spc, &src); + spc_sbcm(spc, dst, src); + break; + } + case 0xb9: { // sbcm ind, ind + uint16_t src = 0; + uint16_t dst = spc_adrIndInd(spc, &src); + spc_sbcm(spc, dst, src); + break; + } + case 0xba: { // movw dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + uint16_t val = spc_readWord(spc, low, high); + spc->a = val & 0xff; + spc->y = val >> 8; + spc->z = val == 0; + spc->n = val & 0x8000; + break; + } + case 0xbb: { // inc dpx + spc_inc(spc, spc_adrDpx(spc)); + break; + } + case 0xbc: { // inca imp + spc->a++; + spc_setZN(spc, spc->a); + break; + } + case 0xbd: { // movpx imp + spc->sp = spc->x; + break; + } + case 0xbe: { // das imp + if(spc->a > 0x99 || !spc->c) { + spc->a -= 0x60; + spc->c = false; + } + if((spc->a & 0xf) > 9 || !spc->h) { + spc->a -= 6; + } + spc_setZN(spc, spc->a); + break; + } + case 0xbf: { // mov ind+ + uint16_t adr = spc_adrIndP(spc); + spc->a = spc_read(spc, adr); + spc_setZN(spc, spc->a); + break; + } + case 0xc0: { // di imp + spc->i = false; + break; + } + case 0xc4: { // movs dp + spc_movs(spc, spc_adrDp(spc)); + break; + } + case 0xc5: { // movs abs + spc_movs(spc, spc_adrAbs(spc)); + break; + } + case 0xc6: { // movs ind + spc_movs(spc, spc_adrInd(spc)); + break; + } + case 0xc7: { // movs idx + spc_movs(spc, spc_adrIdx(spc)); + break; + } + case 0xc8: { // cmpx imm + spc_cmpx(spc, spc_adrImm(spc)); + break; + } + case 0xc9: { // movsx abs + spc_movsx(spc, spc_adrAbs(spc)); + break; + } + case 0xca: { // mov1s abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + uint8_t result = (spc_read(spc, adr) & (~(1 << bit))) | (spc->c << bit); + spc_write(spc, adr, result); + break; + } + case 0xcb: { // movsy dp + spc_movsy(spc, spc_adrDp(spc)); + break; + } + case 0xcc: { // movsy abs + spc_movsy(spc, spc_adrAbs(spc)); + break; + } + case 0xcd: { // movx imm + spc_movx(spc, spc_adrImm(spc)); + break; + } + case 0xce: { // popx imp + spc->x = spc_pullByte(spc); + break; + } + case 0xcf: { // mul imp + uint16_t result = spc->a * spc->y; + spc->a = result & 0xff; + spc->y = result >> 8; + spc_setZN(spc, spc->y); + break; + } + case 0xd0: { // bne rel + spc_doBranch(spc, spc_readOpcode(spc), !spc->z); + break; + } + case 0xd4: { // movs dpx + spc_movs(spc, spc_adrDpx(spc)); + break; + } + case 0xd5: { // movs abx + spc_movs(spc, spc_adrAbx(spc)); + break; + } + case 0xd6: { // movs aby + spc_movs(spc, spc_adrAby(spc)); + break; + } + case 0xd7: { // movs idy + spc_movs(spc, spc_adrIdy(spc)); + break; + } + case 0xd8: { // movsx dp + spc_movsx(spc, spc_adrDp(spc)); + break; + } + case 0xd9: { // movsx dpy + spc_movsx(spc, spc_adrDpy(spc)); + break; + } + case 0xda: { // movws dp + uint16_t low = 0; + uint16_t high = spc_adrDpWord(spc, &low); + spc_read(spc, low); + spc_write(spc, low, spc->a); + spc_write(spc, high, spc->y); + break; + } + case 0xdb: { // movsy dpx + spc_movsy(spc, spc_adrDpx(spc)); + break; + } + case 0xdc: { // decy imp + spc->y--; + spc_setZN(spc, spc->y); + break; + } + case 0xdd: { // movay imp + spc->a = spc->y; + spc_setZN(spc, spc->a); + break; + } + case 0xde: { // cbne dpx, rel + uint8_t val = spc_read(spc, spc_adrDpx(spc)) ^ 0xff; + uint8_t result = spc->a + val + 1; + spc_doBranch(spc, spc_readOpcode(spc), result != 0); + break; + } + case 0xdf: { // daa imp + if(spc->a > 0x99 || spc->c) { + spc->a += 0x60; + spc->c = true; + } + if((spc->a & 0xf) > 9 || spc->h) { + spc->a += 6; + } + spc_setZN(spc, spc->a); + break; + } + case 0xe0: { // clrv imp + spc->v = false; + spc->h = false; + break; + } + case 0xe4: { // mov dp + spc_mov(spc, spc_adrDp(spc)); + break; + } + case 0xe5: { // mov abs + spc_mov(spc, spc_adrAbs(spc)); + break; + } + case 0xe6: { // mov ind + spc_mov(spc, spc_adrInd(spc)); + break; + } + case 0xe7: { // mov idx + spc_mov(spc, spc_adrIdx(spc)); + break; + } + case 0xe8: { // mov imm + spc_mov(spc, spc_adrImm(spc)); + break; + } + case 0xe9: { // movx abs + spc_movx(spc, spc_adrAbs(spc)); + break; + } + case 0xea: { // not1 abs.bit + uint16_t adr = 0; + uint8_t bit = spc_adrAbsBit(spc, &adr); + uint8_t result = spc_read(spc, adr) ^ (1 << bit); + spc_write(spc, adr, result); + break; + } + case 0xeb: { // movy dp + spc_movy(spc, spc_adrDp(spc)); + break; + } + case 0xec: { // movy abs + spc_movy(spc, spc_adrAbs(spc)); + break; + } + case 0xed: { // notc imp + spc->c = !spc->c; + break; + } + case 0xee: { // popy imp + spc->y = spc_pullByte(spc); + break; + } + case 0xef: { // sleep imp + spc->stopped = true; // no interrupts, so sleeping stops as well + break; + } + case 0xf0: { // beq rel + spc_doBranch(spc, spc_readOpcode(spc), spc->z); + break; + } + case 0xf4: { // mov dpx + spc_mov(spc, spc_adrDpx(spc)); + break; + } + case 0xf5: { // mov abx + spc_mov(spc, spc_adrAbx(spc)); + break; + } + case 0xf6: { // mov aby + spc_mov(spc, spc_adrAby(spc)); + break; + } + case 0xf7: { // mov idy + spc_mov(spc, spc_adrIdy(spc)); + break; + } + case 0xf8: { // movx dp + spc_movx(spc, spc_adrDp(spc)); + break; + } + case 0xf9: { // movx dpy + spc_movx(spc, spc_adrDpy(spc)); + break; + } + case 0xfa: { // movm dp, dp + uint16_t src = 0; + uint16_t dst = spc_adrDpDp(spc, &src); + uint8_t val = spc_read(spc, src); + spc_write(spc, dst, val); + break; + } + case 0xfb: { // movy dpx + spc_movy(spc, spc_adrDpx(spc)); + break; + } + case 0xfc: { // incy imp + spc->y++; + spc_setZN(spc, spc->y); + break; + } + case 0xfd: { // movya imp + spc->y = spc->a; + spc_setZN(spc, spc->y); + break; + } + case 0xfe: { // dbnzy rel + spc->y--; + spc_doBranch(spc, spc_readOpcode(spc), spc->y != 0); + break; + } + case 0xff: { // stop imp + spc->stopped = true; + break; + } + } +} diff --git a/snes/spc.h b/snes/spc.h new file mode 100644 index 00000000..4f9dfa98 --- /dev/null +++ b/snes/spc.h @@ -0,0 +1,45 @@ + +#ifndef SPC_H +#define SPC_H + +#include +#include +#include +#include +#include + +typedef struct Spc Spc; + +#include "apu.h" +#include "saveload.h" + +struct Spc { + Apu* apu; + // registers + uint8_t a; + uint8_t x; + uint8_t y; + uint8_t sp; + uint16_t pc; + // flags + bool c; + bool z; + bool v; + bool n; + bool i; + bool h; + bool p; + bool b; + // stopping + bool stopped; + // internal use + uint8_t cyclesUsed; // indicates how many cycles an opcode used +}; + +Spc* spc_init(Apu* apu); +void spc_free(Spc* spc); +void spc_reset(Spc* spc); +int spc_runOpcode(Spc* spc); +void spc_saveload(Spc *spc, SaveLoadFunc *func, void *ctx); + +#endif diff --git a/snes_regs.h b/snes_regs.h new file mode 100644 index 00000000..f8876511 --- /dev/null +++ b/snes_regs.h @@ -0,0 +1,211 @@ +#pragma once + +#define INIDISP 0x2100 +#define OBSEL 0x2101 +#define OAMADDL 0x2102 +#define OAMADDH 0x2103 +#define OAMDATA 0x2104 +#define BGMODE 0x2105 +#define MOSAIC 0x2106 +#define BG1SC 0x2107 +#define BG2SC 0x2108 +#define BG3SC 0x2109 +#define BG4SC 0x210a +#define BG12NBA 0x210b +#define BG34NBA 0x210c +#define BG1HOFS 0x210d +#define BG1VOFS 0x210e +#define BG2HOFS 0x210f +#define BG2VOFS 0x2110 +#define BG3HOFS 0x2111 +#define BG3VOFS 0x2112 +#define BG4HOFS 0x2113 +#define BG4VOFS 0x2114 +#define VMAIN 0x2115 +#define VMADDL 0x2116 +#define VMADDH 0x2117 +#define VMDATAL 0x2118 +#define VMDATAH 0x2119 +#define M7SEL 0x211a +#define M7A 0x211b +#define M7B 0x211c +#define M7C 0x211d +#define M7D 0x211e +#define M7X 0x211f +#define M7Y 0x2120 +#define CGADD 0x2121 +#define CGDATA 0x2122 +#define W12SEL 0x2123 +#define W34SEL 0x2124 +#define WOBJSEL 0x2125 +#define WH0 0x2126 +#define WH1 0x2127 +#define WH2 0x2128 +#define WH3 0x2129 +#define WBGLOG 0x212a +#define WOBJLOG 0x212b +#define TM 0x212c +#define TS 0x212d +#define TMW 0x212e +#define TSW 0x212f +#define CGWSEL 0x2130 +#define CGADSUB 0x2131 +#define COLDATA 0x2132 +#define SETINI 0x2133 +#define MPYL 0x2134 +#define MPYM 0x2135 +#define MPYH 0x2136 +#define SLHV 0x2137 +#define RDOAM 0x2138 +#define RDVRAML 0x2139 +#define RDVRAMH 0x213a +#define RDCGRAM 0x213b +#define OPHCT 0x213c +#define OPVCT 0x213d +#define STAT77 0x213e +#define STAT78 0x213f +#define APUI00 0x2140 +#define APUI01 0x2141 +#define APUI02 0x2142 +#define APUI03 0x2143 +#define WMDATA 0x2180 +#define WMADDL 0x2181 +#define WMADDM 0x2182 +#define WMADDH 0x2183 +#define JOYA 0x4016 +#define JOYB 0x4017 +#define NMITIMEN 0x4200 +#define WRIO 0x4201 +#define WRMPYA 0x4202 +#define WRMPYB 0x4203 +#define WRDIVL 0x4204 +#define WRDIVH 0x4205 +#define WRDIVB 0x4206 +#define HTIMEL 0x4207 +#define HTIMEH 0x4208 +#define VTIMEL 0x4209 +#define VTIMEH 0x420a +#define MDMAEN 0x420b +#define HDMAEN 0x420c +#define MEMSEL 0x420d +#define RDNMI 0x4210 +#define TIMEUP 0x4211 +#define HVBJOY 0x4212 +#define RDIO 0x4213 +#define RDDIVL 0x4214 +#define RDDIVH 0x4215 +#define RDMPYL 0x4216 +#define RDMPYH 0x4217 +#define JOY1L 0x4218 +#define JOY1H 0x4219 +#define JOY2L 0x421a +#define JOY2H 0x421b +#define JOY3L 0x421c +#define JOY3H 0x421d +#define JOY4L 0x421e +#define JOY4H 0x421f + +#define DMAP0 0x4300 +#define BBAD0 0x4301 +#define A1T0L 0x4302 +#define A1T0H 0x4303 +#define A1B0 0x4304 +#define DAS0L 0x4305 +#define DAS0H 0x4306 +#define DAS00 0x4307 +#define A2A0L 0x4308 +#define A2A0H 0x4309 +#define NTRL0 0x430a +#define UNUSED0 0x430b +#define MIRR0 0x430f +#define DMAP1 0x4310 +#define BBAD1 0x4311 +#define A1T1L 0x4312 +#define A1T1H 0x4313 +#define A1B1 0x4314 +#define DAS1L 0x4315 +#define DAS1H 0x4316 +#define DAS10 0x4317 +#define A2A1L 0x4318 +#define A2A1H 0x4319 +#define NTRL1 0x431a +#define UNUSED1 0x431b +#define MIRR1 0x431f +#define DMAP2 0x4320 +#define BBAD2 0x4321 +#define A1T2L 0x4322 +#define A1T2H 0x4323 +#define A1B2 0x4324 +#define DAS2L 0x4325 +#define DAS2H 0x4326 +#define DAS20 0x4327 +#define A2A2L 0x4328 +#define A2A2H 0x4329 +#define NTRL2 0x432a +#define UNUSED2 0x432b +#define MIRR2 0x432f +#define DMAP3 0x4330 +#define BBAD3 0x4331 +#define A1T3L 0x4332 +#define A1T3H 0x4333 +#define A1B3 0x4334 +#define DAS3L 0x4335 +#define DAS3H 0x4336 +#define DAS30 0x4337 +#define A2A3L 0x4338 +#define A2A3H 0x4339 +#define NTRL3 0x433a +#define UNUSED3 0x433b +#define MIRR3 0x433f +#define DMAP4 0x4340 +#define BBAD4 0x4341 +#define A1T4L 0x4342 +#define A1T4H 0x4343 +#define A1B4 0x4344 +#define DAS4L 0x4345 +#define DAS4H 0x4346 +#define DAS40 0x4347 +#define A2A4L 0x4348 +#define A2A4H 0x4349 +#define NTRL4 0x434a +#define UNUSED4 0x434b +#define MIRR4 0x434f +#define DMAP5 0x4350 +#define BBAD5 0x4351 +#define A1T5L 0x4352 +#define A1T5H 0x4353 +#define A1B5 0x4354 +#define DAS5L 0x4355 +#define DAS5H 0x4356 +#define DAS50 0x4357 +#define A2A5L 0x4358 +#define A2A5H 0x4359 +#define NTRL5 0x435a +#define UNUSED5 0x435b +#define MIRR5 0x435f +#define DMAP6 0x4360 +#define BBAD6 0x4361 +#define A1T6L 0x4362 +#define A1T6H 0x4363 +#define A1B6 0x4364 +#define DAS6L 0x4365 +#define DAS6H 0x4366 +#define DAS60 0x4367 +#define A2A6L 0x4368 +#define A2A6H 0x4369 +#define NTRL6 0x436a +#define UNUSED6 0x436b +#define MIRR6 0x436f +#define DMAP7 0x4370 +#define BBAD7 0x4371 +#define A1T7L 0x4372 +#define A1T7H 0x4373 +#define A1B7 0x4374 +#define DAS7L 0x4375 +#define DAS7H 0x4376 +#define DAS70 0x4377 +#define A2A7L 0x4378 +#define A2A7H 0x4379 +#define NTRL7 0x437a +#define UNUSED7 0x437b +#define MIRR7 0x437f diff --git a/spc_player.cpp b/spc_player.cpp new file mode 100644 index 00000000..8978004b --- /dev/null +++ b/spc_player.cpp @@ -0,0 +1,1310 @@ +#include +#include +#include +#include +#include +#include +#include "types.h" + +#include "snes/spc.h" +#include "tracing.h" + +#include "spc_player.h" +#include "dsp_regs.h" + +static void PlayNote(SpcPlayer *p, Channel *c, uint8 note); + +static void Dsp_Write(SpcPlayer *p, uint8_t reg, uint8 value) { + if (DspRegWriteHistory *hist = p->reg_write_history) { + if (hist->count < 256) { + hist->addr[hist->count] = (DspReg)reg; + hist->val[hist->count] = value; + hist->count++; + } + } + if (p->dsp) + dsp_write(p->dsp, reg, value); +} + +static void Not_Implemented() { + assert(0); + printf("Not Implemented\n"); +} + +static uint16 SpcDivHelper(int a, uint8 b) { + int org_a = a; + if (a & 0x100) + a = -a; + int q = b ? (a & 0xff) / b : 0xff; + int r = b ? (a & 0xff) % b : (a & 0xff); + int t = (q << 8) + (b ? ((r << 8) / b & 0xff) : 0xff); + return (org_a & 0x100) ? -t : t; +} + +static inline void Chan_DoAnyFade(uint16 *p, uint16 add, uint8 target, uint8 cont) { + if (!cont) + *p = target << 8; + else + *p += add; +} + +static void SetupEchoParameter_EDL(SpcPlayer *p, uint8 a) { + p->echo_parameter_EDL = a; + if (a != p->last_written_edl) { + a = (p->last_written_edl & 0xf) ^ 0xff; + if (p->echo_stored_time & 0x80) + a += p->echo_stored_time; + p->echo_stored_time = a; + + Dsp_Write(p, EON, 0); + Dsp_Write(p, EFB, 0); + Dsp_Write(p, EVOLR, 0); + Dsp_Write(p, EVOLL, 0); + Dsp_Write(p, FLG, p->reg_FLG | 0x20); + + p->last_written_edl = p->echo_parameter_EDL; + Dsp_Write(p, EDL, p->echo_parameter_EDL); + } + Dsp_Write(p, ESA, (p->echo_parameter_EDL * 8 ^ 0xff) + 0xd1); +} + +static void WriteVolumeToDsp(SpcPlayer *p, Channel *c, uint16 volume) { + static const uint8 kVolumeTable[22] = {0, 1, 3, 7, 13, 21, 30, 41, 52, 66, 81, 94, 103, 110, 115, 119, 122, 124, 125, 126, 127, 127}; + if (p->is_chan_on & p->cur_chan_bit) + return; + for (int i = 0; i < 2; i++) { + int j = volume >> 8; + uint8 t; + if (j >= 21) { + t = p->ram[j + 0x1178] + ((p->ram[j + 0x1179] - p->ram[j + 0x1178]) * (uint8)volume >> 8); + } else { + t = kVolumeTable[j] + ((kVolumeTable[j + 1] - kVolumeTable[j]) * (uint8)volume >> 8); + } + + + t = t * c->final_volume >> 8; + if ((c->pan_flag_with_phase_invert << i) & 0x80) + t = -t; + Dsp_Write(p, (DspReg)(V0VOLL + i + c->index * 16), t); + volume = 0x1400 - volume; + } +} + +static void WritePitch(SpcPlayer *p, Channel *c, uint16 pitch) { + static const uint16 kBaseNoteFreqs[13] = {2143, 2270, 2405, 2548, 2700, 2860, 3030, 3211, 3402, 3604, 3818, 4045, 4286}; + if ((pitch >> 8) >= 0x34) { + pitch += (pitch >> 8) - 0x34; + } else if ((pitch >> 8) < 0x13) { + pitch += (uint8)(((pitch >> 8) - 0x13) * 2) - 256; + } + + uint8 pp = (pitch >> 8) & 0x7f; + uint8 q = pp / 12, r = pp % 12; + uint16 t = kBaseNoteFreqs[r] + ((uint8)(kBaseNoteFreqs[r + 1] - kBaseNoteFreqs[r]) * (uint8)pitch >> 8); + t *= 2; + while (q != 6) + t >>= 1, q++; + + t = c->instrument_pitch_base * t >> 8; + if (!(p->cur_chan_bit & p->is_chan_on)) { + uint8 reg = c->index * 16; + Dsp_Write(p, (DspReg)(reg + V0PITCHL), t & 0xff); + Dsp_Write(p, (DspReg)(reg + V0PITCHH), t >> 8); + } +} + +static void Music_ResetChan(SpcPlayer *p) { + Channel *c = &p->channel[7]; + p->cur_chan_bit = 0x80; + do { + HIBYTE(c->channel_volume) = 0xff; + c->pan_flag_with_phase_invert = 10; + c->pan_value = 10 << 8; + c->instrument_id = 0; + c->fine_tune = 0; + c->channel_transposition = 0; + c->pitch_envelope_num_ticks = 0; + c->vib_depth = 0; + c->tremolo_depth = 0; + } while (c--, p->cur_chan_bit >>= 1); + p->master_volume_fade_ticks = 0; + p->echo_volume_fade_ticks = 0; + p->tempo_fade_num_ticks = 0; + p->global_transposition = 0; + p->block_count = 0; + p->percussion_base_id = 0; + HIBYTE(p->master_volume) = 0xc0; + HIBYTE(p->tempo) = 0x20; +} + +static void Channel_SetInstrument(SpcPlayer *p, Channel *c, uint8 instrument) { + c->instrument_id = instrument; + if (instrument & 0x80) + instrument = instrument + 54 + p->percussion_base_id; + const uint8 *ip = p->ram + instrument * 6 + 0x3d00; + if (p->is_chan_on & p->cur_chan_bit) + return; + uint8 reg = c->index * 16; + if (ip[0] & 0x80) { + // noise + p->reg_FLG = (p->reg_FLG & 0x20) | ip[0] & 0x1f; + p->reg_NON |= p->cur_chan_bit; + Dsp_Write(p, (DspReg)(reg + V0SRCN), 0); + } else { + Dsp_Write(p, reg + V0SRCN, ip[0]); + } + Dsp_Write(p, reg + V0ADSR1, ip[1]); + Dsp_Write(p, reg + V0ADSR2, ip[2]); + Dsp_Write(p, reg + V0GAIN, ip[3]); + c->instrument_pitch_base = ip[4] << 8 | ip[5]; +} + +static void ComputePitchAdd(Channel *c, uint8 pitch) { + c->pitch_target = pitch & 0x7f; + c->pitch_add_per_tick = SpcDivHelper(c->pitch_target - (c->pitch >> 8), c->pitch_slide_length); +} + +static void PitchSlideToNote_Check(SpcPlayer *p, Channel *c) { + if (c->pitch_slide_length || p->ram[c->pattern_order_ptr_for_chan] != 0xf9) + return; + + if (p->cur_chan_bit & p->is_chan_on) { + c->pattern_order_ptr_for_chan += 4; + return; + } + c->pattern_order_ptr_for_chan++; + c->pitch_slide_delay_left = p->ram[c->pattern_order_ptr_for_chan++]; + c->pitch_slide_length = p->ram[c->pattern_order_ptr_for_chan++]; + ComputePitchAdd(c, p->ram[c->pattern_order_ptr_for_chan++] + p->global_transposition + c->channel_transposition); +} + +static const uint8 kEffectByteLength[27] = {1, 1, 2, 3, 0, 1, 2, 1, 2, 1, 1, 3, 0, 1, 2, 3, 1, 3, 3, 0, 1, 3, 0, 3, 3, 3, 1}; + +static void HandleEffect(SpcPlayer *p, Channel *c, uint8 effect) { + uint8 arg = kEffectByteLength[effect - 0xe0] ? p->ram[c->pattern_order_ptr_for_chan++] : 0; + + switch (effect) { + case 0xe0: + Channel_SetInstrument(p, c, arg); + break; + case 0xe1: + c->pan_flag_with_phase_invert = arg; + c->pan_value = (arg & 0x1f) << 8; + break; + case 0xe2: + c->pan_num_ticks = arg; + c->pan_target_value = p->ram[c->pattern_order_ptr_for_chan++]; + c->pan_add_per_tick = SpcDivHelper(c->pan_target_value - (c->pan_value >> 8), arg); + break; + case 0xe3: // vibrato on + c->vibrato_delay_ticks = arg; + c->vibrato_rate = p->ram[c->pattern_order_ptr_for_chan++]; + c->vibrato_depth_target = c->vib_depth = p->ram[c->pattern_order_ptr_for_chan++]; + c->vibrato_fade_num_ticks = 0; + break; + case 0xe4: // vibrato off + c->vibrato_depth_target = c->vib_depth = 0; + c->vibrato_fade_num_ticks = 0; + break; + case 0xe5: + if (!p->pause_music_ctr && !p->byte_3E1) + p->master_volume = arg << 8; + break; + case 0xe6: + p->master_volume_fade_ticks = arg; + p->master_volume_fade_target = p->ram[c->pattern_order_ptr_for_chan++]; + p->master_volume_fade_add_per_tick = SpcDivHelper(p->master_volume_fade_target - (p->master_volume >> 8), arg); + break; + case 0xe7: + p->tempo = arg << 8; + break; + case 0xe8: + p->tempo_fade_num_ticks = arg; + p->tempo_fade_final = p->ram[c->pattern_order_ptr_for_chan++]; + p->tempo_fade_add = SpcDivHelper(p->tempo_fade_final - (p->tempo >> 8), arg); + break; + case 0xe9: + p->global_transposition = arg; + break; + case 0xea: + c->channel_transposition = arg; + break; + case 0xeb: + c->tremolo_delay_ticks = arg; + c->tremolo_rate = p->ram[c->pattern_order_ptr_for_chan++]; + c->tremolo_depth = p->ram[c->pattern_order_ptr_for_chan++]; + break; + case 0xec: + c->tremolo_depth = 0; + break; + case 0xed: + c->channel_volume = arg << 8; + break; + case 0xee: + c->volume_fade_ticks = arg; + c->volume_fade_target = p->ram[c->pattern_order_ptr_for_chan++]; + c->volume_fade_addpertick = SpcDivHelper(c->volume_fade_target - (c->channel_volume >> 8), arg); + break; + case 0xef: + c->pattern_start_ptr = p->ram[c->pattern_order_ptr_for_chan++] << 8 | arg; + c->subroutine_num_loops = p->ram[c->pattern_order_ptr_for_chan++]; + c->saved_pattern_ptr = c->pattern_order_ptr_for_chan; + c->pattern_order_ptr_for_chan = c->pattern_start_ptr; + break; + case 0xf0: + c->vibrato_fade_num_ticks = arg; + c->vibrato_fade_add_per_tick = arg ? c->vib_depth / arg : 0xff; + break; + case 0xf4: + c->fine_tune = arg; + break; + case 0xf5: + p->reg_EON = p->echo_channels = arg; + p->echo_volume_left = p->ram[c->pattern_order_ptr_for_chan++] << 8; + p->echo_volume_right = p->ram[c->pattern_order_ptr_for_chan++] << 8; + p->reg_FLG &= ~0x20; + break; + case 0xf6: // echo off + p->echo_volume_left = 0; + p->echo_volume_right = 0; + p->reg_FLG |= 0x20; + break; + case 0xf7: { + static const int8_t kEchoFirParameters[] = { + 127, 0, 0, 0, 0, 0, 0, 0, + 88, -65, -37, -16, -2, 7, 12, 12, + 12, 33, 43, 43, 19, -2, -13, -7, + 52, 51, 0, -39, -27, 1, -4, -21, + }; + SetupEchoParameter_EDL(p, arg); + p->reg_EFB = p->ram[c->pattern_order_ptr_for_chan++]; + const int8_t *ep = kEchoFirParameters + p->ram[c->pattern_order_ptr_for_chan++] * 8; + for (int i = 0; i < 8; i++) + Dsp_Write(p, FIR0 + i * 16, *ep++); + break; + } + case 0xf8: + p->echo_volume_fade_ticks = arg; + p->echo_volume_fade_target_left = p->ram[c->pattern_order_ptr_for_chan++]; + p->echo_volume_fade_target_right = p->ram[c->pattern_order_ptr_for_chan++]; + p->echo_volume_fade_add_left = SpcDivHelper(p->echo_volume_fade_target_left - (p->echo_volume_left >> 8), arg); + p->echo_volume_fade_add_right = SpcDivHelper(p->echo_volume_fade_target_right - (p->echo_volume_right >> 8), arg); + break; + case 0xf9: + c->pitch_slide_delay_left = arg; + c->pitch_slide_length = p->ram[c->pattern_order_ptr_for_chan++]; + ComputePitchAdd(c, p->ram[c->pattern_order_ptr_for_chan++] + p->global_transposition + c->channel_transposition); + break; + case 0xfa: + p->percussion_base_id = arg; + break; + default: + Not_Implemented(); + } +} + +static bool WantWriteKof(SpcPlayer *p, Channel *c) { + int loops = c->subroutine_num_loops; + int ptr = c->pattern_order_ptr_for_chan; + + for (;;) { + uint8 cmd = p->ram[ptr++]; + if (cmd == 0) { + if (loops == 0) + return true; + ptr = (--loops == 0) ? c->saved_pattern_ptr : c->pattern_start_ptr; + } else { + while (!(cmd & 0x80)) + cmd = p->ram[ptr++]; + if (cmd == 0xc8) + return false; + if (cmd == 0xef) { + ptr = p->ram[ptr + 0] | p->ram[ptr + 1] << 8; + } else if (cmd >= 0xe0) { + ptr += kEffectByteLength[cmd - 0xe0]; + } else { + return true; + } + } + } +} + +static void HandleTremolo(SpcPlayer *p, Channel *c) { + Not_Implemented(); +} + +static void CalcVibratoAddPitch(SpcPlayer *p, Channel *c, uint16 pitch, uint8 value) { + int t = value << 2; + t ^= (t & 0x100) ? 0xff : 0; + int r = (c->vib_depth >= 0xf1) ? + (uint8)t * (c->vib_depth & 0xf) : + (uint8)t * c->vib_depth >> 8; + WritePitch(p, c, pitch + (value & 0x80 ? -r : r)); +} + +static void HandlePanAndSweep(SpcPlayer *p, Channel *c) { + p->did_affect_volumepitch_flag = 0; + if (c->tremolo_depth) { + c->tremolo_hold_count = c->tremolo_delay_ticks; + HandleTremolo(p, c); + } + + uint16 volume = c->pan_value; + + if (c->pan_num_ticks) { + p->did_affect_volumepitch_flag = 0x80; + volume += p->main_tempo_accum * (int16_t)c->pan_add_per_tick / 256; + } + + if (p->did_affect_volumepitch_flag) + WriteVolumeToDsp(p, c, volume); + + p->did_affect_volumepitch_flag = 0; + uint16 pitch = c->pitch; + if (c->pitch_slide_length && !c->pitch_slide_delay_left) { + p->did_affect_volumepitch_flag |= 0x80; + pitch += p->main_tempo_accum * (int16_t)c->pitch_add_per_tick / 256; + } + + if (c->vib_depth && c->vibrato_delay_ticks == c->vibrato_hold_count) { + CalcVibratoAddPitch(p, c, pitch, (p->main_tempo_accum * c->vibrato_rate >> 8) + c->vibrato_count); + return; + } + + if (p->did_affect_volumepitch_flag) + WritePitch(p, c, pitch); +} + +static void HandleNoteTick(SpcPlayer *p, Channel *c) { + if (c->note_keyoff_ticks_left != 0 && (--c->note_keyoff_ticks_left == 0 || c->note_ticks_left == 2)) { + if (WantWriteKof(p, c) && !(p->cur_chan_bit & p->is_chan_on)) + Dsp_Write(p, KOF, p->cur_chan_bit); + } + + p->did_affect_volumepitch_flag = 0; + if (c->pitch_slide_length) { + if (c->pitch_slide_delay_left) { + c->pitch_slide_delay_left--; + } else if (!(p->is_chan_on & p->cur_chan_bit)) { + p->did_affect_volumepitch_flag = 0x80; + Chan_DoAnyFade(&c->pitch, c->pitch_add_per_tick, c->pitch_target, --c->pitch_slide_length); + } + } + + uint16 pitch = c->pitch; + + if (c->vib_depth) { + if (c->vibrato_delay_ticks == c->vibrato_hold_count) { + if (c->vibrato_change_count == c->vibrato_fade_num_ticks) { + c->vib_depth = c->vibrato_depth_target; + } else { + c->vib_depth = (c->vibrato_change_count++ == 0 ? 0 : c->vib_depth) + c->vibrato_fade_add_per_tick; + } + c->vibrato_count += c->vibrato_rate; + CalcVibratoAddPitch(p, c, pitch, c->vibrato_count); + return; + } + c->vibrato_hold_count++; + } + + if (p->did_affect_volumepitch_flag) + WritePitch(p, c, pitch); +} + +void CalcFinalVolume(SpcPlayer *p, Channel *c, uint8 vol) { + int t = (p->master_volume >> 8) * vol >> 8; + t = t * c->channel_volume_master >> 8; + t = t * (c->channel_volume >> 8) >> 8; + c->final_volume = t * t >> 8; +} + +void CalcTremolo(SpcPlayer *p, Channel *c) { + Not_Implemented(); +} + +static void Chan_HandleTick(SpcPlayer *p, Channel *c) { + if (c->volume_fade_ticks) { + c->volume_fade_ticks--; + p->vol_dirty |= p->cur_chan_bit; + Chan_DoAnyFade(&c->channel_volume, c->volume_fade_addpertick, c->volume_fade_target, true); + } + if (c->tremolo_depth) { + if (c->tremolo_delay_ticks == c->tremolo_hold_count) { + p->vol_dirty |= p->cur_chan_bit; + if (c->tremolo_count & 0x80 && c->tremolo_depth == 0xff) { + c->tremolo_count = 0x80; + } else { + c->tremolo_count += c->tremolo_rate; + } + CalcTremolo(p, c); + } else { + c->tremolo_hold_count++; + CalcFinalVolume(p, c, 0xff); + } + } else { + CalcFinalVolume(p, c, 0xff); + } + + if (c->pan_num_ticks) { + c->pan_num_ticks--; + p->vol_dirty |= p->cur_chan_bit; + Chan_DoAnyFade(&c->pan_value, c->pan_add_per_tick, c->pan_target_value, true); + } + + if (p->vol_dirty & p->cur_chan_bit) + WriteVolumeToDsp(p, c, c->pan_value); +} + +static void Port0_HandleMusic(SpcPlayer *p) { + Channel *c; + uint8 a = p->new_value_from_snes[0]; + int t; + + if (a == 0) { +handle_cmd_00: + if (p->port_to_snes[0] == 0) + return; + if (p->pause_music_ctr != 0 && --p->pause_music_ctr == 0) + goto HandleCmd_0xf0_PauseMusic; + if (p->counter_sf0c == 0) + goto label_a; + if (--p->counter_sf0c != 0) { + Music_ResetChan(p); + return; + } +next_phrase: + for (;;) { + t = WORD(p->ram[p->music_ptr_toplevel]); + p->music_ptr_toplevel += 2; + if ((t >> 8) != 0) + break; + if (t == 0) + goto HandleCmd_0xf0_PauseMusic; + if (t == 0x80) { + p->fast_forward = 0x80; + } else if (t == 0x81) { + p->fast_forward = 0; + } else { + if (sign8(--p->block_count)) + p->block_count = t; + t = WORD(p->ram[p->music_ptr_toplevel]); + p->music_ptr_toplevel += 2; + if (p->block_count != 0) + p->music_ptr_toplevel = t; + } + } + for (int i = 0; i < 8; i++) + p->channel[i].pattern_order_ptr_for_chan = WORD(p->ram[t]), t += 2; + + c = p->channel, p->cur_chan_bit = 1; + do { + if (HIBYTE(c->pattern_order_ptr_for_chan) && c->instrument_id == 0) + Channel_SetInstrument(p, c, 0); + c->subroutine_num_loops = 0; + c->volume_fade_ticks = 0; + c->pan_num_ticks = 0; + c->note_ticks_left = 1; + } while (c++, p->cur_chan_bit <<= 1); +label_a: + p->vol_dirty = 0; + c = p->channel, p->cur_chan_bit = 1; + do { + if (!HIBYTE(c->pattern_order_ptr_for_chan)) + continue; + if (!--c->note_ticks_left) { + for (;;) { + uint8 cmd = p->ram[c->pattern_order_ptr_for_chan++]; + if (cmd == 0) { + if (!c->subroutine_num_loops) + goto next_phrase; + c->pattern_order_ptr_for_chan = (--c->subroutine_num_loops == 0) ? c->saved_pattern_ptr : c->pattern_start_ptr; + continue; + } + if (!(cmd & 0x80)) { + static const uint8 kNoteVol[16] = { 25, 50, 76, 101, 114, 127, 140, 152, 165, 178, 191, 203, 216, 229, 242, 252 }; + static const uint8 kNoteGateOffPct[8] = { 50, 101, 127, 152, 178, 203, 229, 252 }; + c->note_length = cmd; + cmd = p->ram[c->pattern_order_ptr_for_chan++]; + if (!(cmd & 0x80)) { + c->note_gate_off_fixedpt = kNoteGateOffPct[cmd >> 4 & 7]; + c->channel_volume_master = kNoteVol[cmd & 0xf]; + cmd = p->ram[c->pattern_order_ptr_for_chan++]; + } + } + if (cmd >= 0xe0) { + HandleEffect(p, c, cmd); + continue; + } + if (!p->fast_forward && !(p->is_chan_on & p->cur_chan_bit)) + PlayNote(p, c, cmd); + c->note_ticks_left = c->note_length; + t = c->note_ticks_left * c->note_gate_off_fixedpt >> 8; + c->note_keyoff_ticks_left = (t != 0) ? t : 1; + PitchSlideToNote_Check(p, c); + break; + } + } else if (!p->fast_forward) { + HandleNoteTick(p, c); + PitchSlideToNote_Check(p, c); + } + } while (c++, p->cur_chan_bit <<= 1); + if (p->tempo_fade_num_ticks) + p->tempo = (--p->tempo_fade_num_ticks == 0) ? p->tempo_fade_final << 8 : p->tempo + p->tempo_fade_add; + if (p->echo_volume_fade_ticks) { + p->echo_volume_left += p->echo_volume_fade_add_left; + p->echo_volume_right += p->echo_volume_fade_add_right; + if (--p->echo_volume_fade_ticks == 0) { + p->echo_volume_left = p->echo_volume_fade_target_left << 8; + p->echo_volume_right = p->echo_volume_fade_target_right << 8; + } + } + if (p->master_volume_fade_ticks) { + p->master_volume = (--p->master_volume_fade_ticks == 0) ? p->master_volume_fade_target << 8 : p->master_volume + p->master_volume_fade_add_per_tick; + p->vol_dirty = 0xff; + } + c = p->channel, p->cur_chan_bit = 1; + do { + if (HIBYTE(c->pattern_order_ptr_for_chan)) + Chan_HandleTick(p, c); + } while (c++, p->cur_chan_bit <<= 1); + } else if (a == 0xff) { + // Load new music + Not_Implemented(); + } else if (a == 0xf1) { // continue music + p->master_volume_fade_ticks = 0x80; + p->pause_music_ctr = 0x80; + p->master_volume_fade_target = 0; + p->master_volume_fade_add_per_tick = SpcDivHelper(0 - (p->master_volume >> 8), 0x80); + + goto handle_cmd_00; + } else if (a == 0xf2) { + if (p->byte_3E1 != 0) + return; + p->byte_3E1 = HIBYTE(p->master_volume); + HIBYTE(p->master_volume) = 0x70; + goto handle_cmd_00; + } else if (a == 0xf3) { + if (p->byte_3E1 == 0) + return; + HIBYTE(p->master_volume) = p->byte_3E1; + p->byte_3E1 = 0; + goto handle_cmd_00; + } else if (a == 0xf0) { +HandleCmd_0xf0_PauseMusic: + p->key_OFF = p->is_chan_on ^ 0xff; + p->port_to_snes[0] = 0; + p->cur_chan_bit = 0; + } else { + p->pause_music_ctr = 0; + p->byte_3E1 = 0; + p->port_to_snes[0] = a; + p->music_ptr_toplevel = WORD(p->ram[0xD000 + (a - 1) * 2]); + p->counter_sf0c = 2; + p->key_OFF |= p->is_chan_on ^ 0xff; + } + +} + +static inline uint8 Asl(uint8 *p) { + uint8 old = *p; + *p <<= 1; + return old >> 7; +} + +static void Sfx_TurnOffChannel(SpcPlayer *p, Channel *c) { + c->sfx_which_sound = 0; + p->is_chan_on &= ~p->current_bit; + p->port1_active &= ~p->current_bit; + p->port2_active &= ~p->current_bit; + p->port3_active &= ~p->current_bit; + Channel_SetInstrument(p, c, c->instrument_id); + if (p->echo_channels & p->current_bit && !(p->reg_EON & p->current_bit)) { + p->reg_EON |= p->current_bit; + Dsp_Write(p, EON, p->reg_EON); + p->sfx_channels_echo_mask2 &= ~p->current_bit; + } +} + +static void Write_KeyOn(SpcPlayer *p, uint8 bit) { + Dsp_Write(p, KOF, 0); + Dsp_Write(p, KON, bit); +} + +static void PlayNote(SpcPlayer *p, Channel *c, uint8 note) { + if (note >= 0xca) { + Channel_SetInstrument(p, c, note); + note = 0xa4; + } + +// if (c->index == 0) { +// if (note == 0xc8) { +// printf("-+-\n"); +// } else if (note == 0xc9) { +// printf("---\n"); +// } +// } + + if (note >= 0xc8 || p->is_chan_on & p->cur_chan_bit) + return; + + static const char *const kNoteNames[] = { "C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#", "A-", "A#", "B-" }; + if (c->index==0) + printf("%s%d\n", kNoteNames[(note & 0x7f) % 12], (note & 0x7f) / 12 + 1); + + c->pitch = ((note & 0x7f) + p->global_transposition + c->channel_transposition) << 8 | c->fine_tune; + c->vibrato_count = c->vibrato_fade_num_ticks << 7; + c->vibrato_hold_count = 0; + c->vibrato_change_count = 0; + c->tremolo_count = 0; + c->tremolo_hold_count = 0; + p->vol_dirty |= p->cur_chan_bit; + p->key_ON |= p->cur_chan_bit; + c->pitch_slide_length = c->pitch_envelope_num_ticks; + if (c->pitch_slide_length) { + c->pitch_slide_delay_left = c->pitch_envelope_delay; + if (!c->pitch_envelope_direction) + c->pitch -= c->pitch_envelope_slide_value << 8; + ComputePitchAdd(c, (c->pitch >> 8) + c->pitch_envelope_slide_value); + } + WritePitch(p, c, c->pitch); +} + +static void Sfx_MaybeDisableEcho(SpcPlayer *p) { + if (!(p->port_to_snes[0] & 0x10) || p->current_bit & p->sfx_channels_echo_mask2) { + if (p->current_bit & p->reg_EON) { + p->reg_EON ^= p->current_bit; + Dsp_Write(p, EON, p->reg_EON); + } + } +} + +static void Sfx_ChannelTick(SpcPlayer *p, Channel *c, bool is_continue) { + uint8 cmd; + + if (is_continue) { + Sfx_MaybeDisableEcho(p); + p->sfx_channel_index = c->index * 2; + p->sfx_sound_ptr_cur = c->sfx_sound_ptr; + if (--c->sfx_note_length_left) + goto note_continue; + p->sfx_sound_ptr_cur++; + } + + for (;;) { + p->dsp_register_index = p->sfx_channel_index * 8; + + cmd = p->ram[p->sfx_sound_ptr_cur]; + if (cmd == 0) { + Sfx_TurnOffChannel(p, c); + return; + } + + if (!(cmd & 0x80)) { + c->sfx_note_length = cmd; + cmd = p->ram[++p->sfx_sound_ptr_cur]; + if (!(cmd & 0x80)) { + if (p->port1_active & p->current_bit) { + if (cmd == 0 || !p->channel_67_volume) { + uint8 volume = cmd; + Dsp_Write(p, p->dsp_register_index + V0VOLL, cmd); + cmd = p->ram[++p->sfx_sound_ptr_cur]; + if (cmd & 0x80) { + Dsp_Write(p, p->dsp_register_index + V0VOLR, volume); + } else { + Dsp_Write(p, p->dsp_register_index + V0VOLR, cmd); + cmd = p->ram[++p->sfx_sound_ptr_cur]; + } + } else { + cmd = p->ram[++p->sfx_sound_ptr_cur]; + } + } else { + c->final_volume = cmd * 2; + c->pan_flag_with_phase_invert = 10; + WriteVolumeToDsp(p, c, (p->sfx_start_arg_pan & 0x80 ? 16 : p->sfx_start_arg_pan & 0x40 ? 4 : 10) << 8); + cmd = p->ram[++p->sfx_sound_ptr_cur]; + } + } + } + // cmd_parsed + if (cmd == 0xe0) { + const uint8 *ip = p->ram + 0x3E00 + (p->ram[++p->sfx_sound_ptr_cur] * 9); + uint8 reg = c->index * 16; + Dsp_Write(p, reg + V0VOLL, ip[0]); + Dsp_Write(p, reg + V0VOLR, ip[1]); + Dsp_Write(p, reg + V0PITCHL, ip[2]); + Dsp_Write(p, reg + V0PITCHH, ip[3]); + Dsp_Write(p, reg + V0SRCN, ip[4]); + Dsp_Write(p, reg + V0ADSR1, ip[5]); + Dsp_Write(p, reg + V0ADSR2, ip[6]); + Dsp_Write(p, reg + V0GAIN, ip[7]); + c->instrument_pitch_base = ip[8] << 8; + p->sfx_sound_ptr_cur++; + } else if (cmd == 0xf9 || cmd == 0xf1) { + if (cmd == 0xf9) { + PlayNote(p, c, p->ram[++p->sfx_sound_ptr_cur]); + Write_KeyOn(p, p->current_bit); + } + c->pitch_slide_delay_left = p->ram[++p->sfx_sound_ptr_cur]; + c->pitch_slide_length = p->ram[++p->sfx_sound_ptr_cur]; + ComputePitchAdd(c, p->ram[++p->sfx_sound_ptr_cur]); + c->sfx_note_length_left = c->sfx_note_length; + goto note_continue; + } else if (cmd == 0xff) { + p->sfx_sound_ptr_cur = c->sfx_sound_ptr = WORD(p->ram[0x17C0 + (c->sfx_which_sound - 1) * 2]); + } else { + PlayNote(p, c, cmd); + Write_KeyOn(p, p->current_bit); + c->sfx_note_length_left = c->sfx_note_length; +note_continue: + p->did_affect_volumepitch_flag = 0; + if (c->pitch_slide_length) { + p->did_affect_volumepitch_flag = 0x80; + Chan_DoAnyFade(&c->pitch, c->pitch_add_per_tick, c->pitch_target, --c->pitch_slide_length); + p->cur_chan_bit = 0; // force change through + WritePitch(p, c, c->pitch); + } else if (c->sfx_note_length_left == 2) { + Dsp_Write(p, KOF, p->current_bit); + } + break; + } + } + c->sfx_sound_ptr = p->sfx_sound_ptr_cur; +} + +static void Port1_Play_Inner(SpcPlayer *p) { + p->port1_counter = 0; + Channel *c = &p->channel[7]; + c->sfx_which_sound = p->new_value_from_snes[1]; + c->sfx_arr_countdown = 3; + c->pitch_envelope_num_ticks = 0; + p->port1_active = 0x80; + p->is_chan_on |= 0x80; + Dsp_Write(p, KOF, 0x80); + p->new_value_from_snes[1] = p->ram[0x1800 + p->new_value_from_snes[1] - 1]; + if (!p->new_value_from_snes[1]) + return; + c--; + c->sfx_which_sound = p->new_value_from_snes[1]; + c->sfx_arr_countdown = 3; + c->pitch_envelope_num_ticks = 0; + p->port1_active = 0x40; + p->is_chan_on |= 0x40; + Dsp_Write(p, KOF, 0x40); + p->port1_active = 0xc0; + p->sfx_channels_echo_mask2 |= 0xc0; + p->port2_active &= 0x3f; + p->port3_active &= 0x3f; +} + +static void Port1_StartNewSound(SpcPlayer *p) { + if (p->port1_counter != 0) { + if (--p->port1_counter == 0) { + p->new_value_from_snes[1] = 5; + Port1_Play_Inner(p); + p->new_value_from_snes[1] = 0; + return; + } + p->channel_67_volume = p->port1_counter >> 1; + Dsp_Write(p, V7VOLL, p->channel_67_volume); + Dsp_Write(p, V7VOLR, p->channel_67_volume); + Dsp_Write(p, V6VOLL, p->channel_67_volume); + Dsp_Write(p, V6VOLR, p->channel_67_volume); + } + p->port1_current_bit = p->port1_active; + if (!p->port1_current_bit) + return; + Channel *c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (Asl(&p->port1_current_bit)) { + p->sfx_channel_index = c->index * 2; + p->dsp_register_index = c->index * 16; + p->sfx_start_arg_pan = c->sfx_pan; + if (!c->sfx_arr_countdown) { + if (c->sfx_which_sound) + Sfx_ChannelTick(p, c, true); + } else { + p->sfx_channel_index = c->index * 2; + if (!--c->sfx_arr_countdown) { + p->sfx_sound_ptr_cur = c->sfx_sound_ptr = WORD(p->ram[0x17C0 + (c->sfx_which_sound - 1) * 2]); + Sfx_ChannelTick(p, c, false); + } + } + } + } while (c--, (p->current_bit >>= 1) != 0x10); +} + +static void Port1_HandleCmd(SpcPlayer *p) { + uint8 a = p->new_value_from_snes[1]; + if (!(a & 0x80)) { + if (a != 0) { + p->port_to_snes[1] = a; + if (a != 5 || p->port1_active) + Port1_Play_Inner(p); + } + } else { + p->port_to_snes[1] = a; + if (p->port1_active) + p->port1_counter = 0x78; + } +} + +static void Port2_StartNewSound(SpcPlayer *p) { + p->port2_current_bit = p->port2_active; + if (!p->port2_current_bit) + return; + Channel *c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (Asl(&p->port2_current_bit)) { + p->sfx_channel_index = c->index * 2; + p->dsp_register_index = c->index * 16; + p->sfx_start_arg_pan = c->sfx_pan; + if (!c->sfx_arr_countdown) { + if (c->sfx_which_sound) + Sfx_ChannelTick(p, c, true); + } else { + p->sfx_channel_index = c->index * 2; + if (!--c->sfx_arr_countdown) { + p->sfx_sound_ptr_cur = c->sfx_sound_ptr = WORD(p->ram[0x1820 + (c->sfx_which_sound - 1) * 2]); + Sfx_ChannelTick(p, c, false); + } + } + } + } while (c--, p->current_bit >>= 1); +} + +static Channel *Port2_AllocateChan(SpcPlayer *p) { + p->sfx_play_echo_flag = p->ram[0x18dd + (p->new_value_from_snes[2] & 0x3f) - 1]; + Channel *c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (p->port2_active & p->current_bit && c->sfx_which_sound + c->sfx_pan == p->new_value_from_snes[2]) + goto found_channel; + } while (c--, p->current_bit >>= 1); + c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (!(p->is_chan_on & p->current_bit)) + goto found_channel; + } while (c--, p->current_bit >>= 1); + assert(0); // unreachable +found_channel: + p->sfx_channel_index2 = p->sfx_channel_index = c->index * 2; + p->sfx_channel_bit = p->current_bit; + p->is_chan_on |= p->current_bit; + if (p->sfx_play_echo_flag) + p->sfx_channels_echo_mask2 |= p->current_bit; + Sfx_MaybeDisableEcho(p); + return c; +} + +static void Port2_HandleCmd(SpcPlayer *p) { + while (p->new_value_from_snes[2] != 0 && p->is_chan_on != 0xff) { + Channel *c = Port2_AllocateChan(p); + c->sfx_pan = p->new_value_from_snes[2] & 0xc0; + c->sfx_which_sound = p->new_value_from_snes[2] & 0x3f; + c->sfx_arr_countdown = 3; + c->pitch_envelope_num_ticks = 0; + p->port2_active |= p->current_bit; + Dsp_Write(p, KOF, p->current_bit); + p->new_value_from_snes[2] = p->ram[0x189e + c->sfx_which_sound - 1]; + } +} + + +static void Port3_StartNewSound(SpcPlayer *p) { + p->port3_current_bit = p->port3_active; + if (!p->port3_current_bit) + return; + Channel *c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (Asl(&p->port3_current_bit)) { + p->sfx_channel_index = c->index * 2; + p->dsp_register_index = c->index * 16; + p->sfx_start_arg_pan = c->sfx_pan; + if (!c->sfx_arr_countdown) { + if (c->sfx_which_sound) + Sfx_ChannelTick(p, c, true); + } else { + p->sfx_channel_index = c->index * 2; + if (!--c->sfx_arr_countdown) { + p->sfx_sound_ptr_cur = c->sfx_sound_ptr = WORD(p->ram[0x191C + (c->sfx_which_sound - 1) * 2]); + Sfx_ChannelTick(p, c, false); + } + } + } + } while (c--, p->current_bit >>= 1); +} + +static Channel *Port3_AllocateChan(SpcPlayer *p) { + p->sfx_play_echo_flag = p->ram[0x19d8 + (p->new_value_from_snes[3] & 0x3f)]; + Channel *c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (p->port3_active & p->current_bit && c->sfx_which_sound + c->sfx_pan == p->new_value_from_snes[3]) + goto found_channel; + } while (c--, p->current_bit >>= 1); + c = &p->channel[7]; + p->current_bit = 0x80; + do { + if (!(p->is_chan_on & p->current_bit)) + goto found_channel; + } while (c--, p->current_bit >>= 1); + assert(0); // unreachable +found_channel: + p->sfx_channel_index2 = p->sfx_channel_index = c->index * 2; + p->sfx_channel_bit = p->current_bit; + p->is_chan_on |= p->current_bit; + if (p->sfx_play_echo_flag) + p->sfx_channels_echo_mask2 |= p->current_bit; + Sfx_MaybeDisableEcho(p); + return c; +} + +static void Port3_HandleCmd(SpcPlayer *p) { + while (p->new_value_from_snes[3] != 0 && p->is_chan_on != 0xff) { + Channel *c = Port3_AllocateChan(p); + c->sfx_pan = p->new_value_from_snes[3] & 0xc0; + c->sfx_which_sound = p->new_value_from_snes[3] & 0x3f; + c->sfx_arr_countdown = 3; + c->pitch_envelope_num_ticks = 0; + p->port3_active |= p->current_bit; + Dsp_Write(p, KOF, p->current_bit); + p->new_value_from_snes[3] = p->ram[0x199a + c->sfx_which_sound - 1]; + } +} + +static void ReadPortFromSnes(SpcPlayer *p, int port) { + uint8 old = p->last_value_from_snes[port]; + p->last_value_from_snes[port] = p->input_ports[port]; + if (p->input_ports[port] != old) + p->new_value_from_snes[port] = p->input_ports[port]; + else + p->new_value_from_snes[port] = 0; +} + +static void Spc_Loop_Part1(SpcPlayer *p) { + static const uint8 kRegAddrs0[10] = {EVOLL, EVOLR, EFB, EON, FLG, KON, KOF, NON, PMON, KOF}; + + Dsp_Write(p, KOF, p->key_OFF); + Dsp_Write(p, PMON, p->reg_PMON); + Dsp_Write(p, NON, p->reg_NON); + Dsp_Write(p, KOF, 0); + Dsp_Write(p, KON, p->key_ON); + if (!(p->echo_stored_time & 0x80)) { + Dsp_Write(p, FLG, p->reg_FLG); + if (p->echo_stored_time == p->echo_parameter_EDL) { + Dsp_Write(p, EON, p->reg_EON); + Dsp_Write(p, EFB, p->reg_EFB); + Dsp_Write(p, EVOLR, p->echo_volume_right >> 8); + Dsp_Write(p, EVOLL, p->echo_volume_left >> 8); + } + } + p->key_OFF = p->key_ON = 0; +} + +static void Spc_Loop_Part2(SpcPlayer *p, uint8 ticks) { + int t = p->sfx_timer_accum + (uint8)(ticks * 0x38); + p->sfx_timer_accum = t; + if (t >= 256) { + Port1_StartNewSound(p); + Port1_HandleCmd(p); + ReadPortFromSnes(p, 1); + + Port2_StartNewSound(p); + Port2_HandleCmd(p); + ReadPortFromSnes(p, 2); + + Port3_StartNewSound(p); + Port3_HandleCmd(p); + ReadPortFromSnes(p, 3); + + if (p->echo_stored_time != p->echo_parameter_EDL && !(++p->echo_fract_incr & 1)) + p->echo_stored_time++; + } + + t = p->main_tempo_accum + (uint8)(ticks * HIBYTE(p->tempo)); + p->main_tempo_accum = t; + if (t >= 256) { + Port0_HandleMusic(p); + ReadPortFromSnes(p, 0); + } else if (p->port_to_snes[0]) { + Channel *c = p->channel; + for (p->cur_chan_bit = 1; p->cur_chan_bit != 0; p->cur_chan_bit <<= 1, c++) { + if (HIBYTE(c->pattern_order_ptr_for_chan)) + HandlePanAndSweep(p, c); + } + } +} + +static void Interrupt_Reset(SpcPlayer *p) { + dsp_reset(p->dsp); + + memset(&p->new_value_from_snes, 0, sizeof(SpcPlayer) - offsetof(SpcPlayer, new_value_from_snes)); + for (int i = 0; i < 8; i++) + p->channel[i].index = i; + SetupEchoParameter_EDL(p, 1); + p->reg_FLG |= 0x20; + Dsp_Write(p, MVOLL, 0x60); + Dsp_Write(p, MVOLR, 0x60); + Dsp_Write(p, DIR, 0x3c); + HIBYTE(p->tempo) = 16; + p->timer_cycles = 0; +} + +SpcPlayer *SpcPlayer_Create() { + SpcPlayer *p = (SpcPlayer *)malloc(sizeof(SpcPlayer)); + p->dsp = dsp_init(p->ram); + p->reg_write_history = 0; + return p; +} + +void SpcPlayer_Initialize(SpcPlayer *p) { + Interrupt_Reset(p); + Spc_Loop_Part1(p); +} + +void SpcPlayer_CopyVariablesToRam(SpcPlayer *p) { + Channel *c = p->channel; + for (int i = 0; i < 8; i++, c++) { + for (const MemMap *m = &kChannel_Maps[0]; m != &kChannel_Maps[countof(kChannel_Maps)]; m++) + memcpy(&p->ram[(m->org_off & 0x7fff) + i * 2], (uint8 *)c + m->off, m->org_off & 0x8000 ? 2 : 1); + } + for (const MemMap2 *m = &kSpcPlayer_Maps[0]; m != &kSpcPlayer_Maps[countof(kSpcPlayer_Maps)]; m++) + memcpy(&p->ram[m->org_off], (uint8 *)p + m->off, m->size); +} + +void SpcPlayer_CopyVariablesFromRam(SpcPlayer *p) { + Channel *c = p->channel; + for (int i = 0; i < 8; i++, c++) { + for (const MemMap *m = &kChannel_Maps[0]; m != &kChannel_Maps[countof(kChannel_Maps)]; m++) + memcpy((uint8 *)c + m->off, &p->ram[(m->org_off & 0x7fff) + i * 2], m->org_off & 0x8000 ? 2 : 1); + } + for (const MemMap2 *m = &kSpcPlayer_Maps[0]; m != &kSpcPlayer_Maps[countof(kSpcPlayer_Maps)]; m++) + memcpy((uint8 *)p + m->off, &p->ram[m->org_off], m->size); +} + + +void SpcPlayer_GenerateSamples(SpcPlayer *p) { + assert(p->timer_cycles <= 64); + + assert(p->dsp->sampleOffset <= 534); + + for (;;) { + if (p->timer_cycles >= 64) { + Spc_Loop_Part2(p, p->timer_cycles >> 6); + Spc_Loop_Part1(p); + p->timer_cycles &= 63; + } + + // sample rate 32000 + int n = 534 - p->dsp->sampleOffset; + if (n > (64 - p->timer_cycles)) + n = (64 - p->timer_cycles); + + p->timer_cycles += n; + + for (int i = 0; i < n; i++) + dsp_cycle(p->dsp); + + if (p->dsp->sampleOffset == 534) + break; + } +} + +void SpcPlayer_Upload(SpcPlayer *p, const uint8_t *data) { + Dsp_Write(p, EVOLL, 0); + Dsp_Write(p, EVOLR, 0); + Dsp_Write(p, KOF, 0xff); + + for (;;) { + int numbytes = *(uint16 *)(data); + if (numbytes == 0) + break; + int target = *(uint16 *)(data + 2); + data += 4; + do { + p->ram[target++ & 0xffff] = *data++; + } while (--numbytes); + } + p->pause_music_ctr = 0; + p->port_to_snes[0] = 0; + p->port1_active = 0; + p->port2_active = 0; + p->port3_active = 0; + p->is_chan_on = 0; + p->input_ports[0] = p->input_ports[1] = p->input_ports[2] = p->input_ports[3] = 0; +} + +// ======================================= + +DspRegWriteHistory my_write_hist; +SpcPlayer my_spc, my_spc_snapshot; +static int loop_ctr; + +bool CompareSpcImpls(SpcPlayer *p, SpcPlayer *p_org, Apu *apu) { + SpcPlayer_CopyVariablesToRam(p); + memcpy(p->ram + 0x18, apu->ram + 0x18, 2); //lfsr_value + memcpy(p->ram + 0x110, apu->ram + 0x110, 256-16); // stack + memcpy(p->ram + 0xf1, apu->ram + 0xf1, 15); // dsp regs + memcpy(p->ram + 0x10, apu->ram + 0x10, 8); // temp regs + p->ram[0x44] = apu->ram[0x44]; // chn + int errs = 0; + for (int i = 0; i != 0xc000; i++) { // skip compare echo etc + if (p->ram[i] != apu->ram[i]) { + if (errs < 16) { + if (errs == 0) + printf("@%d\n", loop_ctr); + printf("%.4X: %.2X != %.2X (mine, theirs) orig %.2X\n", i, p->ram[i], apu->ram[i], p_org->ram[i]); + errs++; + } + } + } + + int n = my_write_hist.count < apu->hist.count ? apu->hist.count : my_write_hist.count; + for (int i = 0; i != n; i++) { + if (i >= my_write_hist.count || i >= apu->hist.count || my_write_hist.addr[i] != apu->hist.addr[i] || my_write_hist.val[i] != apu->hist.val[i]) { + if (errs == 0) + printf("@%d\n", loop_ctr); + printf("%d: ", i); + if (i >= my_write_hist.count) printf("[??: ??]"); else printf("[%.2x: %.2x]", my_write_hist.addr[i], my_write_hist.val[i]); + printf(" != "); + if (i >= apu->hist.count) printf("[??: ??]"); else printf("[%.2x: %.2x]", apu->hist.addr[i], apu->hist.val[i]); + printf("\n"); + errs++; + } + } + + if (errs) { + printf("Total %d errors\n", errs); + return false; + } + + apu->hist.count = 0; + my_write_hist.count = 0; + loop_ctr++; + return true; +} + +void RunAudioPlayer() { + if(SDL_Init(SDL_INIT_AUDIO) != 0) { + printf("Failed to init SDL: %s\n", SDL_GetError()); + return; + } + + SDL_AudioSpec want, have; + SDL_AudioDeviceID device; + SDL_memset(&want, 0, sizeof(want)); + want.freq = 44100; + want.format = AUDIO_S16; + want.channels = 2; + want.samples = 2048; + want.callback = NULL; // use queue + device = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0); + if(device == 0) { + printf("Failed to open audio device: %s\n", SDL_GetError()); + return; + } + int16_t* audioBuffer = (int16_t*)malloc(735 * 4); // *2 for stereo, *2 for sizeof(int16) + SDL_PauseAudioDevice(device, 0); + + memset(&my_spc, 0, sizeof(my_spc)); + FILE *f = fopen("lightworld.spc", "rb"); + fread(my_spc.ram, 1, 65536, f); + fclose(f); + + my_spc.reg_write_history = &my_write_hist; + + bool run_both = 0;// false;// false; + + if (!run_both) { + SpcPlayer *p = &my_spc; + Dsp *dsp = dsp_init(p->ram); + dsp_reset(dsp); + p->dsp = dsp; + SpcPlayer_Initialize(p); + + p->input_ports[0] = 4; + + for (;;) { + SpcPlayer_GenerateSamples(p); + + int16_t audioBuffer[736 * 2]; + dsp_getSamples(p->dsp, audioBuffer, 736); + SDL_QueueAudio(device, audioBuffer, 736 * 4); + while (SDL_GetQueuedAudioSize(device) >= 736 * 4 * 3/* 44100 * 4 * 300*/) + SDL_Delay(1); + + } + + } else { + SpcPlayer *p = &my_spc; + Dsp *dsp = dsp_init(p->ram); + dsp_reset(dsp); + p->dsp = dsp; + + Apu *apu = apu_init(); + apu_reset(apu); + apu->spc->pc = 0x800; + + memcpy(apu->ram, my_spc.ram, 65536); + + CompareSpcImpls(&my_spc, &my_spc_snapshot, apu); + + uint64_t cycle_counter = 0; + int tgt = 0x878; + uint8 ticks_next = 0; + bool apu_debug = false; + bool is_initialize = true; + for (;;) { + if (apu_debug && apu->cpuCyclesLeft == 0) { + char line[80]; + getProcessorStateSpc(apu, line); + puts(line); + } + + apu_cycle(apu); + + if (((apu->cycles - 1) & 0x1f) == 0) + dsp_cycle(p->dsp); + + + if (apu->spc->pc == tgt) { + tgt ^= 0x878 ^ 0x879; + if (tgt == 0x878) { + uint8 ticks = ticks_next; + ticks_next = apu->spc->y; + my_spc_snapshot = my_spc; + for (;;) { + my_write_hist.count = 0; + if (is_initialize) + SpcPlayer_Initialize(&my_spc); + else { + Spc_Loop_Part2(&my_spc, ticks); + Spc_Loop_Part1(&my_spc); + } + is_initialize = false; + if (CompareSpcImpls(&my_spc, &my_spc_snapshot,apu)) + break; + my_spc = my_spc_snapshot; + } + + if (cycle_counter == 0) + apu->inPorts[0] = my_spc.input_ports[0] = 2;// 2 + cycle_counter / 1000; + cycle_counter++; + } + } + + if (p->dsp->sampleOffset == 534) { + int16_t audioBuffer[736 * 2]; + dsp_getSamples(p->dsp, audioBuffer, 736); + SDL_QueueAudio(device, audioBuffer, 736 * 4); + while (SDL_GetQueuedAudioSize(device) >= 736 * 4 * 3/* 44100 * 4 * 300*/) { + SDL_Delay(1); + } + } + } + } +} \ No newline at end of file diff --git a/spc_player.h b/spc_player.h new file mode 100644 index 00000000..02ae414a --- /dev/null +++ b/spc_player.h @@ -0,0 +1,277 @@ +#include +struct DspRegWriteHistory; +struct Dsp; + +struct Channel { + uint16 pattern_order_ptr_for_chan; + uint8 note_ticks_left; + uint8 note_keyoff_ticks_left; + uint8 subroutine_num_loops; + uint8 volume_fade_ticks; + uint8 pan_num_ticks; + uint8 pitch_slide_length; + uint8 pitch_slide_delay_left; + uint8 vibrato_hold_count; + uint8 vib_depth; + uint8 tremolo_hold_count; + uint8 tremolo_depth; + uint8 vibrato_change_count; + uint8 note_length; + uint8 note_gate_off_fixedpt; + uint8 channel_volume_master; + uint8 instrument_id; + uint16 instrument_pitch_base; + uint16 saved_pattern_ptr; + uint16 pattern_start_ptr; + uint8 pitch_envelope_num_ticks; + uint8 pitch_envelope_delay; + uint8 pitch_envelope_direction; + uint8 pitch_envelope_slide_value; + uint8 vibrato_count; + uint8 vibrato_rate; + uint8 vibrato_delay_ticks; + uint8 vibrato_fade_num_ticks; + uint8 vibrato_fade_add_per_tick; + uint8 vibrato_depth_target; + uint8 tremolo_count; + uint8 tremolo_rate; + uint8 tremolo_delay_ticks; + uint8 channel_transposition; + uint16 channel_volume; + uint16 volume_fade_addpertick; + uint8 volume_fade_target; + uint8 final_volume; + uint16 pan_value; + uint16 pan_add_per_tick; + uint8 pan_target_value; + uint8 pan_flag_with_phase_invert; + uint16 pitch; + uint16 pitch_add_per_tick; + uint8 pitch_target; + uint8 fine_tune; + uint16 sfx_sound_ptr; + uint8 sfx_which_sound; + uint8 sfx_arr_countdown; + uint8 sfx_note_length_left; + uint8 sfx_note_length; + uint8 sfx_pan; + uint8 index; +}; +struct SpcPlayer { + DspRegWriteHistory *reg_write_history; + uint8 timer_cycles; + Dsp *dsp; + uint8 new_value_from_snes[4]; + uint8 port_to_snes[4]; + uint8 last_value_from_snes[4]; + uint8 counter_sf0c; + uint16 _always_zero; + uint16 temp_accum; + uint8 ttt; + uint8 did_affect_volumepitch_flag; + uint16 addr0; + uint16 addr1; + uint16 lfsr_value; + uint8 is_chan_on; + uint8 fast_forward; + uint8 sfx_start_arg_pan; + uint16 sfx_sound_ptr_cur; + uint16 music_ptr_toplevel; + uint8 block_count; + uint8 sfx_timer_accum; + uint8 chn; + uint8 key_ON; + uint8 key_OFF; + uint8 cur_chan_bit; + uint8 reg_FLG; + uint8 reg_NON; + uint8 reg_EON; + uint8 reg_PMON; + uint8 echo_stored_time; + uint8 echo_parameter_EDL; + uint8 reg_EFB; + uint8 global_transposition; + uint8 main_tempo_accum; + uint16 tempo; + uint8 tempo_fade_num_ticks; + uint8 tempo_fade_final; + uint16 tempo_fade_add; + uint16 master_volume; + uint8 master_volume_fade_ticks; + uint8 master_volume_fade_target; + uint16 master_volume_fade_add_per_tick; + uint8 vol_dirty; + uint8 percussion_base_id; + uint16 echo_volume_left; + uint16 echo_volume_right; + uint16 echo_volume_fade_add_left; + uint16 echo_volume_fade_add_right; + uint8 echo_volume_fade_ticks; + uint8 echo_volume_fade_target_left; + uint8 echo_volume_fade_target_right; + uint8 sfx_channel_index; + uint8 current_bit; + uint8 dsp_register_index; + uint8 echo_channels; + uint8 byte_3C4; + uint8 byte_3C5; + uint8 echo_fract_incr; + uint8 sfx_channel_index2; + uint8 sfx_channel_bit; + uint8 pause_music_ctr; + uint8 port2_active; + uint8 port2_current_bit; + uint8 port3_active; + uint8 port3_current_bit; + uint8 port1_active; + uint8 port1_current_bit; + uint8 byte_3E1; + uint8 sfx_play_echo_flag; + uint8 sfx_channels_echo_mask2; + uint8 port1_counter; + uint8 channel_67_volume; + uint8 cutk_always_zero; + uint8 last_written_edl; + uint8 input_ports[4]; + Channel channel[8]; + uint8 ram[65536]; // rest of ram +}; +struct MemMap { +uint16 off, org_off; +}; +struct MemMap2 { +uint16 off, org_off, size; +}; +const MemMap kChannel_Maps[] = { +{offsetof(Channel, pattern_order_ptr_for_chan), 0x8030}, +{offsetof(Channel, note_ticks_left), 0x70}, +{offsetof(Channel, note_keyoff_ticks_left), 0x71}, +{offsetof(Channel, subroutine_num_loops), 0x80}, +{offsetof(Channel, volume_fade_ticks), 0x90}, +{offsetof(Channel, pan_num_ticks), 0x91}, +{offsetof(Channel, pitch_slide_length), 0xa0}, +{offsetof(Channel, pitch_slide_delay_left), 0xa1}, +{offsetof(Channel, vibrato_hold_count), 0xb0}, +{offsetof(Channel, vib_depth), 0xb1}, +{offsetof(Channel, tremolo_hold_count), 0xc0}, +{offsetof(Channel, tremolo_depth), 0xc1}, +{offsetof(Channel, vibrato_change_count), 0x100}, +{offsetof(Channel, note_length), 0x200}, +{offsetof(Channel, note_gate_off_fixedpt), 0x201}, +{offsetof(Channel, channel_volume_master), 0x210}, +{offsetof(Channel, instrument_id), 0x211}, +{offsetof(Channel, instrument_pitch_base), 0x8220}, +{offsetof(Channel, saved_pattern_ptr), 0x8230}, +{offsetof(Channel, pattern_start_ptr), 0x8240}, +{offsetof(Channel, pitch_envelope_num_ticks), 0x280}, +{offsetof(Channel, pitch_envelope_delay), 0x281}, +{offsetof(Channel, pitch_envelope_direction), 0x290}, +{offsetof(Channel, pitch_envelope_slide_value), 0x291}, +{offsetof(Channel, vibrato_count), 0x2a0}, +{offsetof(Channel, vibrato_rate), 0x2a1}, +{offsetof(Channel, vibrato_delay_ticks), 0x2b0}, +{offsetof(Channel, vibrato_fade_num_ticks), 0x2b1}, +{offsetof(Channel, vibrato_fade_add_per_tick), 0x2c0}, +{offsetof(Channel, vibrato_depth_target), 0x2c1}, +{offsetof(Channel, tremolo_count), 0x2d0}, +{offsetof(Channel, tremolo_rate), 0x2d1}, +{offsetof(Channel, tremolo_delay_ticks), 0x2e0}, +{offsetof(Channel, channel_transposition), 0x2f0}, +{offsetof(Channel, channel_volume), 0x8300}, +{offsetof(Channel, volume_fade_addpertick), 0x8310}, +{offsetof(Channel, volume_fade_target), 0x320}, +{offsetof(Channel, final_volume), 0x321}, +{offsetof(Channel, pan_value), 0x8330}, +{offsetof(Channel, pan_add_per_tick), 0x8340}, +{offsetof(Channel, pan_target_value), 0x350}, +{offsetof(Channel, pan_flag_with_phase_invert), 0x351}, +{offsetof(Channel, pitch), 0x8360}, +{offsetof(Channel, pitch_add_per_tick), 0x8370}, +{offsetof(Channel, pitch_target), 0x380}, +{offsetof(Channel, fine_tune), 0x381}, +{offsetof(Channel, sfx_sound_ptr), 0x8390}, +{offsetof(Channel, sfx_which_sound), 0x3a0}, +{offsetof(Channel, sfx_arr_countdown), 0x3a1}, +{offsetof(Channel, sfx_note_length_left), 0x3b0}, +{offsetof(Channel, sfx_note_length), 0x3b1}, +{offsetof(Channel, sfx_pan), 0x3d0}, +}; +const MemMap2 kSpcPlayer_Maps[] = { +{offsetof(SpcPlayer, new_value_from_snes), 0x0, 4}, +{offsetof(SpcPlayer, port_to_snes), 0x4, 4}, +{offsetof(SpcPlayer, last_value_from_snes), 0x8, 4}, +{offsetof(SpcPlayer, counter_sf0c), 0xc, 1}, +{offsetof(SpcPlayer, _always_zero), 0xe, 2}, +{offsetof(SpcPlayer, temp_accum), 0x10, 2}, +{offsetof(SpcPlayer, ttt), 0x12, 1}, +{offsetof(SpcPlayer, did_affect_volumepitch_flag), 0x13, 1}, +{offsetof(SpcPlayer, addr0), 0x14, 2}, +{offsetof(SpcPlayer, addr1), 0x16, 2}, +{offsetof(SpcPlayer, lfsr_value), 0x18, 2}, +{offsetof(SpcPlayer, is_chan_on), 0x1a, 1}, +{offsetof(SpcPlayer, fast_forward), 0x1b, 1}, +{offsetof(SpcPlayer, sfx_start_arg_pan), 0x20, 1}, +{offsetof(SpcPlayer, sfx_sound_ptr_cur), 0x2c, 2}, +{offsetof(SpcPlayer, music_ptr_toplevel), 0x40, 2}, +{offsetof(SpcPlayer, block_count), 0x42, 1}, +{offsetof(SpcPlayer, sfx_timer_accum), 0x43, 1}, +{offsetof(SpcPlayer, chn), 0x44, 1}, +{offsetof(SpcPlayer, key_ON), 0x45, 1}, +{offsetof(SpcPlayer, key_OFF), 0x46, 1}, +{offsetof(SpcPlayer, cur_chan_bit), 0x47, 1}, +{offsetof(SpcPlayer, reg_FLG), 0x48, 1}, +{offsetof(SpcPlayer, reg_NON), 0x49, 1}, +{offsetof(SpcPlayer, reg_EON), 0x4a, 1}, +{offsetof(SpcPlayer, reg_PMON), 0x4b, 1}, +{offsetof(SpcPlayer, echo_stored_time), 0x4c, 1}, +{offsetof(SpcPlayer, echo_parameter_EDL), 0x4d, 1}, +{offsetof(SpcPlayer, reg_EFB), 0x4e, 1}, +{offsetof(SpcPlayer, global_transposition), 0x50, 1}, +{offsetof(SpcPlayer, main_tempo_accum), 0x51, 1}, +{offsetof(SpcPlayer, tempo), 0x52, 2}, +{offsetof(SpcPlayer, tempo_fade_num_ticks), 0x54, 1}, +{offsetof(SpcPlayer, tempo_fade_final), 0x55, 1}, +{offsetof(SpcPlayer, tempo_fade_add), 0x56, 2}, +{offsetof(SpcPlayer, master_volume), 0x58, 2}, +{offsetof(SpcPlayer, master_volume_fade_ticks), 0x5a, 1}, +{offsetof(SpcPlayer, master_volume_fade_target), 0x5b, 1}, +{offsetof(SpcPlayer, master_volume_fade_add_per_tick), 0x5c, 2}, +{offsetof(SpcPlayer, vol_dirty), 0x5e, 1}, +{offsetof(SpcPlayer, percussion_base_id), 0x5f, 1}, +{offsetof(SpcPlayer, echo_volume_left), 0x60, 2}, +{offsetof(SpcPlayer, echo_volume_right), 0x62, 2}, +{offsetof(SpcPlayer, echo_volume_fade_add_left), 0x64, 2}, +{offsetof(SpcPlayer, echo_volume_fade_add_right), 0x66, 2}, +{offsetof(SpcPlayer, echo_volume_fade_ticks), 0x68, 1}, +{offsetof(SpcPlayer, echo_volume_fade_target_left), 0x69, 1}, +{offsetof(SpcPlayer, echo_volume_fade_target_right), 0x6a, 1}, +{offsetof(SpcPlayer, sfx_channel_index), 0x3c0, 1}, +{offsetof(SpcPlayer, current_bit), 0x3c1, 1}, +{offsetof(SpcPlayer, dsp_register_index), 0x3c2, 1}, +{offsetof(SpcPlayer, echo_channels), 0x3c3, 1}, +{offsetof(SpcPlayer, byte_3C4), 0x3c4, 1}, +{offsetof(SpcPlayer, byte_3C5), 0x3c5, 1}, +{offsetof(SpcPlayer, echo_fract_incr), 0x3c7, 1}, +{offsetof(SpcPlayer, sfx_channel_index2), 0x3c8, 1}, +{offsetof(SpcPlayer, sfx_channel_bit), 0x3c9, 1}, +{offsetof(SpcPlayer, pause_music_ctr), 0x3ca, 1}, +{offsetof(SpcPlayer, port2_active), 0x3cb, 1}, +{offsetof(SpcPlayer, port2_current_bit), 0x3cc, 1}, +{offsetof(SpcPlayer, port3_active), 0x3cd, 1}, +{offsetof(SpcPlayer, port3_current_bit), 0x3ce, 1}, +{offsetof(SpcPlayer, port1_active), 0x3cf, 1}, +{offsetof(SpcPlayer, port1_current_bit), 0x3e0, 1}, +{offsetof(SpcPlayer, byte_3E1), 0x3e1, 1}, +{offsetof(SpcPlayer, sfx_play_echo_flag), 0x3e2, 1}, +{offsetof(SpcPlayer, sfx_channels_echo_mask2), 0x3e3, 1}, +{offsetof(SpcPlayer, port1_counter), 0x3e4, 1}, +{offsetof(SpcPlayer, channel_67_volume), 0x3e5, 1}, +{offsetof(SpcPlayer, cutk_always_zero), 0x3ff, 1}, +}; + +SpcPlayer *SpcPlayer_Create(); +void SpcPlayer_GenerateSamples(SpcPlayer *p); +void SpcPlayer_Initialize(SpcPlayer *p); +void SpcPlayer_Upload(SpcPlayer *p, const uint8_t *data); +void SpcPlayer_CopyVariablesFromRam(SpcPlayer *p); +void SpcPlayer_CopyVariablesToRam(SpcPlayer *p); diff --git a/sprite.cpp b/sprite.cpp new file mode 100644 index 00000000..18f9e9c3 --- /dev/null +++ b/sprite.cpp @@ -0,0 +1,4403 @@ +#include "sprite.h" +#include "dungeon.h" +#include "hud.h" +#include "load_gfx.h" +#include "overworld.h" +#include "variables.h" +#include "tagalong.h" +#include "overlord.h" +#include "ancilla.h" +#include "player.h" +#include "misc.h" +#include "overlord.h" +#include "tile_detect.h" +#include "tables/generated_dungeon_sprites.h" +#include "sprite_main.h" + +static const uint16 kOamGetBufferPos_Tab0[6] = {0x171, 0x201, 0x31, 0xc1, 0x141, 0x1d1}; +static const uint16 kOamGetBufferPos_Tab1[48] = { + 0x30, 0x50, 0x80, 0xb0, 0xe0, 0x110, 0x140, 0x170, 0x1d0, 0x1d4, 0x1dc, 0x1e0, 0x1e4, 0x1ec, 0x1f0, 0x1f8, + 0, 4, 8, 0xc, 0x10, 0x14, 0x18, 0x1c, 0x30, 0x38, 0x50, 0x68, 0x80, 0x98, 0xb0, 0xc8, + 0x120, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1a0, 0x1b8, +}; +static const uint8 kSprite2_ReturnIfRecoiling_Masks[6] = {3, 1, 0, 0, 0xc, 3}; +static const int8 kSpriteHitbox_XLo[32] = { + 2, 3, 0, -3, -6, 0, 2, -8, 0, -4, -8, 0, -8, -16, 2, 2, + 2, 2, 2, -8, 2, 2, -16, -8, -12, 4, -4, -12, 5, -32, -2, 4, +}; +static const int8 kSpriteHitbox_XHi[32] = { + 0, 0, 0, -1, -1, 0, 0, -1, 0, -1, -1, 0, -1, -1, 0, 0, + 0, 0, 0, -1, 0, 0, -1, -1, -1, 0, -1, -1, 0, -1, -1, 0, +}; +static const uint8 kSpriteHitbox_XSize[32] = { + 12, 1, 16, 20, 20, 8, 4, 32, 48, 24, 32, 32, 32, 48, 12, 12, + 60, 124, 12, 32, 4, 12, 48, 32, 40, 8, 24, 24, 5, 80, 4, 8, +}; +static const int8 kSpriteHitbox_YLo[32] = { + 0, 3, 4, -4, -8, 2, 0, -16, 12, -4, -8, 0, -10, -16, 2, 2, + 2, 2, -3, -12, 2, 10, 0, -12, 16, 4, -4, -12, 3, -16, -8, 10, +}; +static const int8 kSpriteHitbox_YHi[32] = { + 0, 0, 0, -1, -1, 0, 0, -1, 0, -1, -1, 0, -1, -1, 0, 0, + 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, -1, -1, 0, -1, -1, 0, +}; +static const uint8 kSpriteHitbox_YSize[32] = { + 14, 1, 16, 21, 24, 4, 8, 40, 20, 24, 40, 29, 36, 48, 60, 124, + 12, 12, 17, 28, 4, 2, 28, 20, 10, 4, 24, 16, 5, 48, 8, 12, +}; +static const uint8 kSpriteDamage_Tab2[4] = {6, 4, 0, 0}; +static const uint8 kSpriteDamage_Tab3[4] = {4, 6, 0, 2}; +static const uint8 kSprite_Func21_Sfx[9] = {0x1f, 0x1f, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f}; +static const int8 kSparkleGarnish_XY[4] = {-4, 12, 3, 8}; +static const uint8 kSpriteStunned_Main_Func1_Masks[7] = {0x7f, 0xf, 3, 1, 0, 0, 0}; +static const uint8 kSprite_Func7_Tab[4] = {8, 4, 2, 1}; +static const int8 kSprite_Func5_X[54] = { + 8, 8, 2, 14, 8, 8, -2, 10, 8, 8, 1, 14, 4, 4, 4, 4, + 4, 4, -2, 10, 8, 8, -25, 40, 8, 8, 2, 14, 8, 8, -8, 23, + 8, 8, -20, 36, 8, 8, -1, 16, 8, 8, -1, 16, 8, 8, -8, 24, + 8, 8, -8, 24, 8, 3, +}; +static const int8 kSprite_Func5_Y[54] = { + 6, 20, 13, 13, 0, 8, 4, 4, 1, 14, 8, 8, 4, 4, 4, 4, + -2, 10, 4, 4, -25, 40, 8, 8, 3, 16, 10, 10, -8, 25, 8, 8, + -20, 36, 8, 8, -1, 16, 8, 8, 14, 3, 8, 8, -8, 24, 8, 8, + -8, 32, 8, 8, 12, 4, +}; +static const uint8 kSprite_SimplifiedTileAttr[256] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; +static const int8 kSprite_Func5_Tab3[256] = { + 0, 1, 2, 3, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 1, 2, -1, -1, -1, -1, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, -1, -1, -1, -1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; +static const int8 kSlopedTile[32] = { + 7, 6, 5, 4, 3, 2, 1, 0, + 0, 1, 2, 3, 4, 5, 6, 7, + 0, 1, 2, 3, 4, 5, 6, 7, + 7, 6, 5, 4, 3, 2, 1, 0, +}; +static const uint8 kSprite_Func1_Tab[8] = {15, 15, 24, 15, 15, 19, 15, 15}; +static const uint8 kSprite_Func1_Tab2[8] = {6, 6, 6, 12, 6, 6, 6, 15}; +static const uint8 kSprite_Func14_Damage[12] = {1, 2, 3, 4, 2, 3, 4, 5, 1, 1, 2, 3}; +static const uint8 kEnemyDamages[128] = { + 0, 1, 32, 255, 252, 251, 0, 0, 0, 2, 64, 4, 0, 0, 0, 0, + 0, 4, 64, 2, 3, 0, 0, 0, 0, 8, 64, 4, 0, 0, 0, 0, + 0, 16, 64, 8, 0, 0, 0, 0, 0, 16, 64, 8, 0, 0, 0, 0, + 0, 4, 64, 16, 0, 0, 0, 0, 0, 255, 64, 255, 252, 251, 0, 0, + 0, 4, 64, 255, 252, 251, 32, 0, 0, 100, 24, 100, 0, 0, 0, 0, + 0, 249, 250, 255, 100, 0, 0, 0, 0, 8, 64, 253, 4, 16, 0, 0, + 0, 8, 64, 254, 4, 0, 0, 0, 0, 16, 64, 253, 0, 0, 0, 0, + 0, 254, 64, 16, 0, 0, 0, 0, 0, 32, 64, 255, 0, 0, 0, 250, +}; +static const uint8 kSpriteInit_Flags2[243] = { + 1, 2, 1, 0x82, 0x81, 0x84, 0x84, 0x84, 2, 0xf, 2, 1, 0x20, 3, 4, 0x84, + 1, 5, 4, 1, 0x80, 4, 0xa2, 0x83, 4, 2, 0x82, 0x62, 0x82, 0x80, 0x80, 0x85, + 1, 0xa5, 3, 4, 4, 0x83, 2, 1, 0x82, 0xa2, 0xa2, 0xa3, 0xaa, 0xa3, 0xa4, 0x82, + 0x82, 0x83, 0x82, 0x80, 0x82, 0x82, 0xa5, 0x80, 0xa4, 0x82, 0x81, 0x82, 0x82, 0x82, 0x81, 6, + 8, 8, 8, 8, 6, 8, 8, 8, 6, 7, 7, 2, 2, 0x22, 1, 1, + 0x20, 0x82, 7, 0x85, 0xf, 0x21, 5, 0x83, 2, 1, 1, 1, 1, 7, 7, 7, + 7, 0, 0x85, 0x83, 3, 0xa4, 0, 0, 0, 0, 9, 4, 0xa0, 0, 1, 0, + 0, 3, 0x8b, 0x86, 0xc2, 0x82, 0x81, 4, 0x82, 0x21, 6, 3, 1, 3, 3, 3, + 0, 0, 4, 5, 5, 3, 1, 2, 0, 0, 0, 2, 7, 0, 1, 1, + 0x87, 6, 0, 0x83, 2, 0x22, 0x22, 0x22, 0x22, 4, 3, 5, 1, 1, 4, 1, + 2, 8, 8, 0x80, 0x21, 3, 3, 3, 2, 2, 8, 0x8f, 0xa1, 0x81, 0x80, 0x80, + 0x80, 0x80, 0xa1, 0x80, 0x81, 0x81, 0x86, 0x81, 0x82, 0x82, 0x80, 0x80, 0x83, 6, 0, 0, + 5, 4, 6, 5, 2, 0, 0, 5, 4, 4, 7, 0xb, 0xc, 0xc, 6, 6, + 3, 0xa4, 4, 0x82, 0x81, 0x83, 0x10, 0x10, 0x81, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x81, + 0x82, 0x83, 0x83, 0x81, 0x82, 0x81, 0x82, 0xa0, 0xa1, 0xa3, 0xa1, 0xa1, 0xa1, 0x83, 0x85, 0x83, + 0x83, 0x83, 0x83, +}; +static const uint8 kSpriteInit_Health[243] = { + 12, 6, 255, 3, 3, 3, 3, 3, 2, 12, 4, 255, 0, 3, 12, 2, + 0, 20, 4, 4, 0, 255, 0, 2, 3, 8, 0, 0, 0, 0, 0, 0, + 8, 3, 8, 2, 2, 0, 3, 255, 0, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 0, 3, 3, 3, 0, 3, 0, 0, 0, 0, 3, 2, 255, + 2, 6, 4, 8, 6, 8, 6, 4, 8, 8, 8, 4, 4, 2, 2, 2, + 255, 8, 255, 48, 16, 8, 8, 255, 2, 0, 0, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 4, 4, 255, 255, 255, 255, 16, 3, 0, 2, 4, 1, + 255, 4, 255, 0, 0, 0, 0, 255, 0, 0, 96, 255, 24, 255, 255, 255, + 3, 4, 255, 16, 8, 8, 0, 255, 32, 32, 32, 32, 32, 8, 8, 4, + 8, 64, 48, 255, 2, 255, 255, 255, 255, 16, 4, 2, 4, 4, 8, 8, + 8, 16, 64, 64, 8, 4, 8, 4, 4, 8, 12, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 48, 255, + 255, 255, 255, 8, 0, 0, 0, 32, 0, 8, 5, 40, 40, 40, 90, 16, + 24, 64, 0, 4, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; +const uint8 kSpriteInit_BumpDamage[243] = { + 0x83, 0x83, 0x81, 2, 2, 2, 2, 2, 1, 0x13, 1, 1, 1, 1, 8, 1, + 1, 8, 5, 3, 0x40, 4, 0, 2, 3, 0x85, 0, 1, 0, 0x40, 0, 0, + 6, 0, 5, 3, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 2, 2, + 0, 1, 1, 3, 1, 3, 1, 1, 3, 3, 3, 1, 3, 1, 1, 1, + 1, 1, 1, 0x11, 0x14, 1, 1, 2, 5, 0, 0, 4, 4, 8, 8, 8, + 8, 4, 0, 4, 3, 2, 2, 2, 2, 2, 3, 1, 0, 0, 1, 0x80, + 5, 1, 0, 0, 0, 0x40, 0, 4, 0, 0, 0x14, 4, 6, 4, 4, 4, + 4, 3, 4, 4, 4, 1, 4, 4, 0x15, 5, 4, 5, 0x15, 0x15, 3, 5, + 0, 5, 0x15, 5, 5, 6, 6, 6, 6, 5, 3, 6, 5, 5, 3, 3, + 3, 6, 0x17, 0x15, 0x15, 5, 5, 1, 0x85, 0x83, 5, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x17, 0x17, 5, + 5, 5, 4, 3, 2, 0x10, 0, 6, 0, 5, 7, 0x17, 0x17, 0x17, 0x15, 7, + 6, 0x10, 0, 3, 3, 0, 0x19, 0x19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; +static const uint8 kSpriteInit_Flags3[243] = { + 0x19, 0xb, 0x1b, 0x4b, 0x41, 0x41, 0x41, 0x4d, 0x1d, 1, 0x1d, 0x19, 0x8d, 0x1b, 9, 0x9d, + 0x3d, 1, 9, 0x11, 0x40, 1, 0x4d, 0x19, 7, 0x1d, 0x59, 0x80, 0x4d, 0x40, 1, 0x49, + 0x1b, 0x41, 3, 0x13, 0x15, 0x41, 0x18, 0x1b, 0x41, 0x47, 0xf, 0x49, 0x4b, 0x4d, 0x41, 0x47, + 0x49, 0x4d, 0x49, 0x40, 0x4d, 0x47, 0x49, 0x41, 0x74, 0x47, 0x5b, 0x58, 0x51, 0x49, 0x1d, 0x5d, + 3, 0x19, 0x1b, 0x17, 0x19, 0x17, 0x19, 0x1b, 0x17, 0x17, 0x17, 0x1b, 0xd, 9, 0x19, 0x19, + 0x49, 0x5d, 0x5b, 0x49, 0xd, 3, 0x13, 0x41, 0x1b, 0x5b, 0x5d, 0x43, 0x43, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x49, 1, 0, 0x41, 0x4d, 0x4d, 0x4d, 0x4d, 0x1d, 9, 0xc4, 0xd, 0xd, 9, + 3, 3, 0x4b, 0x47, 0x47, 0x49, 0x49, 0x41, 0x47, 0x36, 0x8b, 0x49, 0x1d, 0x49, 0x43, 0x43, + 0x43, 0xb, 0x41, 0xd, 7, 0xb, 0x1d, 0x43, 0xd, 0x43, 0xd, 0x1d, 0x4d, 0x4d, 0x1b, 0x1b, + 0xa, 0xb, 0, 5, 0xd, 1, 1, 1, 1, 0xb, 5, 1, 1, 1, 7, 0x17, + 0x19, 0xd, 0xd, 0x80, 0x4d, 0x19, 0x17, 0x19, 0xb, 9, 0xd, 0x4a, 0x12, 0x49, 0xc3, 0xc3, + 0xc3, 0xc3, 0x76, 0x40, 0x59, 0x41, 0x58, 0x4f, 0x73, 0x5b, 0x44, 0x41, 0x51, 0xa, 0xb, 0xb, + 0x4b, 0, 0x40, 0x5b, 0xd, 0, 0, 0xd, 0x4b, 0xb, 0x59, 0x41, 0xb, 0xd, 1, 0xd, + 0xd, 0, 0x50, 0x4c, 0x44, 0x51, 1, 1, 0xf2, 0xf8, 0xf4, 0xf2, 0xd4, 0xd4, 0xd4, 0xf8, + 0xf8, 0xf4, 0xf4, 0xd8, 0xf8, 0xd8, 0xdf, 0xc8, 0x69, 0xc1, 0xd2, 0xd2, 0xdc, 0xc7, 0xc1, 0xc7, + 0xc7, 0xc7, 0xc1, +}; +static const uint8 kSpriteInit_Flags4[243] = { + 0, 0, 0, 0x43, 0x43, 0x43, 0x43, 0x43, 0, 0, 0, 0, 0x1c, 0, 0, 2, + 1, 3, 0, 0, 3, 0xc0, 7, 0, 0, 0, 7, 0x45, 0x43, 0, 0x40, 0xd, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0xd, 7, + 7, 7, 7, 3, 7, 7, 7, 0x40, 3, 7, 0xd, 0, 7, 7, 0, 0, + 9, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0, 0, 0, 0, + 0x80, 0x12, 9, 9, 0, 0x40, 0, 0xc, 0, 0, 0, 0x40, 0x40, 0x10, 0x10, 0x2e, + 0x2e, 0x40, 0x1e, 0x53, 0, 0xa, 0, 0, 0, 0, 0x12, 0x12, 0x40, 0, 0, 0x40, + 0x19, 0, 0, 0xa, 0xd, 0xa, 0xa, 0x80, 0xa, 0x41, 0, 0x40, 0, 0x49, 0, 0, + 0xc0, 0, 0x40, 0, 0, 0x40, 0, 0, 9, 0x80, 0xc0, 0, 0x40, 0, 0, 0x80, + 0, 0, 0x18, 0x5a, 0, 0xd4, 0xd4, 0xd4, 0xd4, 0, 0x40, 0, 0x80, 0x80, 0x40, 0x40, + 0x40, 0, 9, 0x1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa, 0x1b, 0x1b, + 0x1b, 0x1b, 0x41, 0, 3, 7, 7, 3, 0xa, 0, 1, 0xa, 0xa, 9, 0, 0, + 0, 0, 9, 0, 0, 0x40, 0x40, 0, 0, 0, 0, 0x89, 0x80, 0x80, 0, 0x1c, + 0, 0x40, 0, 0, 0x1c, 7, 3, 3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x43, 0x44, 0x43, 0x40, 0xc0, 0xc0, 0xc7, 0xc3, 0xc3, 0xc0, 0x1b, 8, 0x1b, + 0x1b, 0x1b, 3, +}; +static const uint8 kSpriteInit_Flags[243] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa, 0, 1, 0x30, 0, 0, 0x20, + 0x10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0x20, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x68, + 0x60, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 0, 0, 0x70, 0, 0, 0, 0x90, 0x90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x60, 0x60, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0, 2, 0, 0, 0x70, 0, 0, + 0, 0, 0, 0, 0, 0, 0xb0, 0, 0xc2, 0, 0x20, 0, 2, 0, 0, 0, + 0, 0, 2, 0, 0xb0, 0, 0, 0, 0, 0, 0, 0, 0xa0, 0xa0, 0, 0, + 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc2, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0xa, 0xa, 0x10, 0x10, 0x10, 0x10, 0, 0, 0, 0x10, + 0x10, 0x10, 0x10, 0, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, +}; +static const uint8 kSpriteInit_Flags5[243] = { + 0x83, 0x96, 0x84, 0x80, 0x80, 0x80, 0x80, 0x80, 2, 0, 2, 0x80, 0xa0, 0x83, 0x97, 0x80, + 0x80, 0x94, 0x91, 7, 0, 0x80, 0, 0x80, 0x92, 0x96, 0x80, 0xa0, 0, 0, 0, 0x80, + 4, 0x80, 0x82, 6, 6, 0, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0, 0, 0x80, 0x80, 0x90, + 0x80, 0x91, 0x91, 0x91, 0x97, 0x91, 0x95, 0x95, 0x93, 0x97, 0x14, 0x91, 0x92, 0x81, 0x82, 0x82, + 0x80, 0x85, 0x80, 0x80, 0x80, 4, 4, 0x80, 0x91, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0, 0x80, 0x80, 0x82, 0x8a, 0x80, 0x80, 0x80, 0x80, 0x92, 0x91, 0x80, 0x82, 0x81, 0x81, + 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x97, 0x80, 0x80, 0x80, + 0x80, 0xc2, 0x80, 0x15, 0x15, 0x17, 6, 0, 0x80, 0, 0xc0, 0x13, 0x40, 0, 2, 6, + 0x10, 0x14, 0, 0, 0x40, 0, 0, 0, 0, 0x13, 0x46, 0x11, 0x80, 0x80, 0, 0, + 0, 0x10, 0, 0, 0, 0x16, 0x16, 0x16, 0x81, 0x87, 0x82, 0, 0x80, 0x80, 0, 0, + 0, 0, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x80, 0, 0, 0, 0x17, 0, 0x12, 0, 0, 0, 0, 0, 0x10, + 0x17, 0, 0x40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0, 0, + 0, 0, 0, +}; +static const uint8 kSpriteInit_DeflBits[243] = { + 0, 0, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0, 0x81, 0, 0, 0x48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0x48, 0x24, 0x80, 0, 0, + 0, 0x20, 0, 0, 0, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, + 0x80, 0, 0, 0, 0, 0, 0, 0x80, 0, 0x80, 0, 2, 0, 0, 0, 4, + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x84, 0, 0x81, 5, 1, 0x40, 8, 0xa0, 0, 0, 0, 0, 0, 0x84, 0x84, 0x84, + 0x84, 8, 0x80, 0x80, 0x80, 0, 0x80, 0x80, 0x80, 0x80, 0, 8, 0x80, 0, 0, 0, + 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 4, 0, 0, + 0, 0, 0x80, 4, 4, 0, 0, 0x48, 0, 0, 4, 0, 1, 1, 0, 0, + 0x80, 0, 0, 0, 0x40, 8, 8, 8, 8, 0, 0, 0, 0x80, 0x80, 0, 0, + 0, 4, 1, 5, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0x80, 0x80, + 0x80, 0x80, 0x82, 0x80, 0, 0, 0x80, 0, 0, 0x80, 0x80, 0, 0, 1, 1, 0x40, + 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 5, 0x80, 0x80, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0x82, 0x82, 8, 0x80, 0x20, 0x80, + 0x80, 0x80, 0x20, +}; +static const int8 kPlayerDamages[30] = { + 2, 1, 1, 4, 4, 4, 0, 0, 0, 8, 4, 2, 8, 8, 8, 16, + 8, 4, 32, 16, 8, 32, 24, 16, 24, 16, 8, 64, 48, 24, +}; +static const uint8 kPlayerActionBoxRun_YHi[4] = {0xff, 0, 0, 0}; +static const uint8 kPlayerActionBoxRun_YLo[4] = {(uint8)-8, 16, 8, 8}; +static const uint8 kPlayerActionBoxRun_XHi[4] = {0, 0, 0xff, 0}; +static const uint8 kPlayerActionBoxRun_XLo[4] = {0, 0, (uint8)-8, 8}; +static const int8 kPlayer_SetupActionHitBox_Tab0[65] = { + 0, 2, 0, 0, -8, 0, 2, 0, 2, 2, 1, 1, 0, 0, 0, 0, + 0, 2, 4, 4, 0, 0, -4, -4, -6, 2, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 4, 4, 2, 2, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, -10, 0, 2, 2, 0, 0, 0, 0, 0, 0, + 0, +}; +static const int8 kPlayer_SetupActionHitBox_Tab1[65] = { + 15, 4, 8, 8, 8, 8, 12, 8, 4, 4, 6, 6, 0, 0, 0, 0, + 0, 4, 16, 12, 8, 8, 12, 11, 12, 4, 6, 6, 0, 0, 0, 0, + 0, 8, 8, 8, 10, 14, 15, 4, 4, 4, 6, 6, 0, 0, 0, 0, + 0, 8, 8, 8, 10, 14, 15, 4, 4, 4, 6, 6, 0, 0, 0, 0, + 0, +}; +static const int8 kPlayer_SetupActionHitBox_Tab2[65] = { + 0, 2, 0, 2, 4, 4, 4, 7, 2, 2, 1, 1, 0, 0, 0, 0, + 0, 2, 0, 2, -4, -3, -8, 0, 0, 2, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -4, 1, 2, 2, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -4, 1, 2, 2, 1, 1, 0, 0, 0, 0, + 0, +}; +static const int8 kPlayer_SetupActionHitBox_Tab3[65] = { + 15, 4, 8, 2, 12, 8, 12, 8, 4, 4, 6, 6, 0, 0, 0, 0, + 0, 4, 8, 4, 12, 12, 12, 4, 8, 4, 6, 4, 0, 0, 0, 0, + 0, 8, 8, 8, 8, 8, 12, 4, 4, 4, 6, 6, 0, 0, 0, 0, + 0, 8, 8, 8, 8, 8, 12, 4, 4, 4, 6, 6, 0, 0, 0, 0, + 0, +}; +static const int8 kPlayer_SetupActionHitBox_Tab4[13] = { + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1 +}; +static const uint8 kSprite_PrepAndDrawSingleLarge_Tab1[236] = { + 200, 0, 107, 0, 0, 0, 0, 0, 0, 203, 0, 8, 10, 11, 0, 0, + 13, 0, 0, 86, 0, 0, 15, 17, 0, 19, 0, 0, 0, 0, 20, 0, + 21, 27, 0, 42, 42, 248, 0, 182, 0, 0, 0, 170, 0, 0, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 243, 243, 0, 187, 39, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 63, 0, 0, 0, 64, 64, + 68, 0, 0, 0, 0, 71, 70, 0, 0, 72, 74, 101, 101, 0, 0, 0, + 0, 0, 143, 0, 0, 76, 78, 78, 78, 78, 0, 48, 36, 50, 56, 60, + 129, 0, 82, 0, 0, 0, 0, 0, 0, 92, 0, 98, 94, 0, 0, 0, + 101, 102, 0, 0, 0, 0, 110, 14, 0, 59, 66, 0, 0, 117, 120, 123, + 0, 0, 207, 0, 132, 141, 141, 141, 141, 0, 148, 117, 160, 0, 0, 162, + 166, 0, 0, 0, 177, 0, 181, 0, 189, 0, 0, 0, 105, 0, 0, 0, + 0, 0, 92, 0, 214, 230, 0, 0, 0, 219, 218, 233, 0, 0, 190, 192, + 106, 0, 249, 215, 0, 0, 0, 216, 0, 0, 222, 227, 0, 0, 0, 235, + 0, 0, 0, 0, 0, 0, 244, 244, 29, 31, 31, 31, 32, 32, 32, 33, + 34, 35, 35, 37, 40, 106, 246, 41, 0, 0, 205, 206, +}; +static const uint8 kSprite_PrepAndDrawSingleLarge_Tab2[251] = { + 0xa0, 0xa2, 0xa0, 0xa2, 0x80, 0x82, 0x80, 0x82, 0xea, 0xec, 0x84, 0x4e, 0x61, 0xbd, 0x8c, 0x20, + 0x22, 0xc0, 0xc2, 0xe6, 0xe4, 0x82, 0xaa, 0x84, 0xac, 0x80, 0xa0, 0xca, 0xaf, 0x29, 0x39, 0xb, + 0x6e, 0x60, 0x62, 0x63, 0x4c, 0xea, 0xec, 0x24, 0x6b, 0x24, 0x22, 0x24, 0x26, 0x20, 0x30, 0x21, + 0x2a, 0x24, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0x84, 0x80, 0x82, 0x6e, + 0x40, 0x42, 0xe6, 0xe8, 0x80, 0x82, 0xc8, 0x8d, 0xe3, 0xe5, 0xc5, 0xe1, 4, 0x24, 0xe, 0x2e, + 0xc, 0xa, 0x9c, 0xc7, 0xb6, 0xb7, 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0xe4, 0xf4, 2, 2, + 0, 4, 0xc6, 0xcc, 0xce, 0x28, 0x84, 0x82, 0x80, 0xe5, 0x24, 0, 2, 4, 0xa0, 0xaa, + 0xa4, 0xa6, 0xac, 0xa2, 0xa8, 0xa6, 0x88, 0x86, 0x8e, 0xae, 0x8a, 0x42, 0x44, 0x42, 0x44, 0x64, + 0x66, 0xcc, 0xcc, 0xca, 0x87, 0x97, 0x8e, 0xae, 0xac, 0x8c, 0x8e, 0xaa, 0xac, 0xd2, 0xf3, 0x84, + 0xa2, 0x84, 0xa4, 0xe7, 0x8a, 0xa8, 0x8a, 0xa8, 0x88, 0xa0, 0xa4, 0xa2, 0xa6, 0xa6, 0xa6, 0xa6, + 0x7e, 0x7f, 0x8a, 0x88, 0x8c, 0xa6, 0x86, 0x8e, 0xac, 0x86, 0xbb, 0xac, 0xa9, 0xb9, 0xaa, 0xba, + 0xbc, 0x8a, 0x8e, 0x8a, 0x86, 0xa, 0xc2, 0xc4, 0xe2, 0xe4, 0xc6, 0xea, 0xec, 0xff, 0xe6, 0xc6, + 0xcc, 0xec, 0xce, 0xee, 0x4c, 0x6c, 0x4e, 0x6e, 0xc8, 0xc4, 0xc6, 0x88, 0x8c, 0x24, 0xe0, 0xae, + 0xc0, 0xc8, 0xc4, 0xc6, 0xe2, 0xe0, 0xee, 0xae, 0xa0, 0x80, 0xee, 0xc0, 0xc2, 0xbf, 0x8c, 0xaa, + 0x86, 0xa8, 0xa6, 0x2c, 0x28, 6, 0xdf, 0xcf, 0xa9, 0x46, 0x46, 0xea, 0xc0, 0xc2, 0xe0, 0xe8, + 0xe2, 0xe6, 0xe4, 0xb, 0x8e, 0xa0, 0xec, 0xea, 0xe9, 0x48, 0x58, +}; +static const uint8 kOverworldAreaSprcollSizes[192] = { + 4, 4, 2, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 4, 4, 2, 4, 4, + 4, 4, 2, 4, 4, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 4, 2, 2, 2, 4, 4, 2, 4, 4, 2, 2, 2, 4, 4, 2, + 4, 4, 2, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 4, 4, 2, 4, 4, + 4, 4, 2, 4, 4, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 4, 2, 2, 2, 4, 4, 2, 4, 4, 2, 2, 2, 4, 4, 2, + 4, 4, 2, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 2, 4, 4, 2, 4, 4, + 4, 4, 2, 4, 4, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 4, 2, 2, 2, 4, 4, 2, 4, 4, 2, 2, 2, 4, 4, 2, +}; +static const uint16 kOam_ResetRegionBases[6] = {0x30, 0x1d0, 0, 0x30, 0x120, 0x140}; +static const uint8 kGarnish_OamMemSize[23] = { + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 8, 4, 4, 4, 8, 16, +}; +static HandlerFuncK *const kGarnish_Funcs[22] = { + &Garnish01_FireSnakeTail, + &Garnish02_MothulaBeamTrail, + &Garnish03_FallingTile, + &Garnish04_LaserTrail, + &Garnish_SimpleSparkle, + &Garnish06_ZoroTrail, + &Garnish07_BabasuFlash, + &Garnish08_KholdstareTrail, + &Garnish09_LightningTrail, + &Garnish0A_CannonSmoke, + &Garnish_WaterTrail, + &Garnish0C_TrinexxIceBreath, + NULL, + &Garnish0E_TrinexxFireBreath, + &Garnish0F_BlindLaserTrail, + &Garnish10_GanonBatFlame, + &Garnish11_WitheringGanonBatFlame, + &Garnish12_Sparkle, + &Garnish13_PyramidDebris, + &Garnish14_KakKidDashDust, + &Garnish15_ArrghusSplash, + &Garnish16_ThrownItemDebris, +}; +static const uint8 kSpriteFall_Tab1[32] = { + 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, +}; +static const uint8 kSpriteFall_Tab2[32] = { + 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, +}; +static const uint8 kSpriteFall_Tab3[16] = {0xff, 0x3f, 0x1f, 0xf, 0xf, 7, 3, 1, 0xff, 0x3f, 0x1f, 0xf, 7, 3, 1, 0}; +static const int8 kSpriteFall_Tab4[4] = {0, 4, 8, 0}; +static const DrawMultipleData kSpriteDrawFall0Data[12] = { + {0, 0, 0x0146, 2}, + {0, 0, 0x0148, 2}, + {0, 0, 0x014a, 2}, + {4, 4, 0x014c, 0}, + {4, 4, 0x00b7, 0}, + {4, 4, 0x0080, 0}, + {0, 0, 0x016c, 2}, + {0, 0, 0x016e, 2}, + {0, 0, 0x014e, 2}, + {4, 4, 0x015c, 0}, + {4, 4, 0x00b7, 0}, + {4, 4, 0x0080, 0}, +}; +static const int8 kSpriteDrawFall1_X[56] = { + -4, 4, -4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + -4, 12, -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + -4, 12, -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, +}; +static const int8 kSpriteDrawFall1_Y[56] = { + -4, -4, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + -4, -4, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + -4, -4, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, +}; +static const uint8 kSpriteDrawFall1_Char[56] = { + 0xae, 0xa8, 0xa6, 0xaf, 0xaa, 0, 0, 0, 0xac, 0, 0, 0, 0xbe, 0, 0, 0, + 0xa8, 0xae, 0xaf, 0xa6, 0xaa, 0, 0, 0, 0xac, 0, 0, 0, 0xbe, 0, 0, 0, + 0xa6, 0xaf, 0xae, 0xa8, 0xaa, 0, 0, 0, 0xac, 0, 0, 0, 0xbe, 0, 0, 0, + 0xb6, 0, 0, 0, 0x80, 0, 0, 0, +}; +static const uint8 kSpriteDrawFall1_Flags[56] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0, 0, 0x40, 0, 0, 0, 0x40, 0, 0, 0, + 0x80, 0x80, 0x80, 0x80, 0x80, 0, 0, 0, 0x80, 0, 0, 0, 0x80, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, +}; +static const uint8 kSpriteDrawFall1_Ext[56] = { + 0, 2, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const int8 kSpriteDistress_X[4] = {-3, 2, 7, 11}; +static const int8 kSpriteDistress_Y[4] = {-5, -7, -7, -5}; +static const uint8 kPikitDropItems[4] = {0xdc, 0xe1, 0xd9, 0xe6}; +static const uint8 kPrizeMasks[7] = { 1, 1, 1, 0, 1, 1, 1 }; +static const uint8 kPrizeItems[56] = { + 0xd8, 0xd8, 0xd8, 0xd8, 0xd9, 0xd8, 0xd8, 0xd9, 0xda, 0xd9, 0xda, 0xdb, 0xda, 0xd9, 0xda, 0xda, + 0xe0, 0xdf, 0xdf, 0xda, 0xe0, 0xdf, 0xd8, 0xdf, 0xdc, 0xdc, 0xdc, 0xdd, 0xdc, 0xdc, 0xde, 0xdc, + 0xe1, 0xd8, 0xe1, 0xe2, 0xe1, 0xd8, 0xe1, 0xe2, 0xdf, 0xd9, 0xd8, 0xe1, 0xdf, 0xdc, 0xd9, 0xd8, + 0xd8, 0xe3, 0xe0, 0xdb, 0xde, 0xd8, 0xdb, 0xe2, +}; +static const uint8 kPrizeZ[15] = {0, 0x24, 0x24, 0x24, 0x20, 0x20, 0x20, 0x24, 0x24, 0x24, 0x24, 0, 0x24, 0x20, 0x20}; +static const int8 kPerishOverlay_X[32] = { + 0, 0, 0, 8, 0, 8, 0, 8, 8, 8, 0, 8, 0, 8, 0, 8, + 0, 8, 0, 8, 0, 8, 0, 8, -3, 11, -3, 11, -6, 14, -6, 14, +}; +static const int8 kPerishOverlay_Y[32] = { + 0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, + 0, 0, 8, 8, 0, 0, 8, 8, -3, -3, 11, 11, -6, -6, 14, 14, +}; +static const uint8 kPerishOverlay_Char[32] = { + 0, 0xb9, 0, 0, 0xb4, 0xb5, 0xb5, 0xb4, 0xb9, 0, 0, 0, 0xb5, 0xb4, 0xb4, 0xb5, + 0xa8, 0xa8, 0xb8, 0xb8, 0xa8, 0xa8, 0xb8, 0xb8, 0xa9, 0xa9, 0xa9, 0xa9, 0x9b, 0x9b, 0x9b, 0x9b, +}; +static const uint8 kPerishOverlay_Flags[32] = { + 4, 4, 4, 4, 4, 4, 0xc4, 0xc4, 0x44, 4, 4, 4, 0x44, 0x44, 0x84, 0x84, + 4, 0x44, 4, 0x44, 4, 0x44, 4, 0x44, 0x44, 4, 0xc4, 0x84, 4, 0x44, 0x84, 0xc4, +}; +static HandlerFuncK *const kSprite_ExecuteSingle[12] = { + &Sprite_inactiveSprite, + &SpriteModule_Fall1, + &SpriteModule_Poof, + &SpriteModule_Drown, + &SpriteModule_Explode, + &SpriteModule_Fall2, + &SpriteModule_Die, + &SpriteModule_Burn, + &SpriteModule_Initialize, + &SpriteActive_Main, + &SpriteModule_Carried, + &SpriteModule_Stunned, +}; +// it's not my job to tell you what to think, my job is to think about what you tell me' +#define R0 WORD(g_ram[0]) +#define R2 WORD(g_ram[2]) +static const uint8 kSpawnSecretItems[22] = { + 0xd9, 0x3e, 0x79, 0xd9, 0xdc, 0xd8, 0xda, 0xe4, 0xe1, 0xdc, 0xd8, 0xdf, 0xe0, 0xb, 0x42, 0xd3, + 0x41, 0xd4, 0xd9, 0xe3, 0xd8, 0, +}; +static const uint8 kSpawnSecretItem_SpawnFlag[22] = { + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, +}; +static const uint8 kSpawnSecretItem_XLo[22] = { + 4, 0, 4, 4, 0, 4, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, + 0, 0, 4, 0, 4, 4, +}; +static const uint8 kSpawnSecretItem_IgnoreProj[22] = { + 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 1, 1, 1, 1, +}; +static const uint8 kSpawnSecretItem_ZVel[22] = { + 16, 0, 0, 16, 0, 0, 16, 16, 16, 16, 0, 16, 10, 16, 0, 0, + 0, 0, 16, 0, 0, 0, +}; +static const uint8 kSprite_ReturnIfLifted_Dirs[4] = {4, 6, 0, 2}; +static const uint8 kAbsorbable_Tab1[15] = {0, 1, 1, 1, 2, 2, 2, 0, 1, 1, 2, 2, 1, 2, 2}; +static const uint8 kAbsorbable_Tab2[19] = {0, 0, 0, 0, 1, 2, 3, 0, 0, 4, 5, 0, 0, 0, 0, 2, 4, 6, 2}; +static const int16 kNumberedAbsorbable_X[18] = { 0, 0, 8, 0, 0, 8, 0, 0, 8, 0, 0, 2, 0, 0, 2, 0, 0, 0, }; +static const int16 kNumberedAbsorbable_Y[18] = { 0, 0, 8, 0, 0, 8, 0, 0, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, }; +static const uint8 kNumberedAbsorbable_Char[18] = { 0x6e, 0x6e, 0x68, 0x6e, 0x6e, 0x78, 0x6e, 0x6e, 0x79, 0x63, 0x73, 0x69, 0x63, 0x73, 0x6a, 0x63, 0x73, 0x73, }; +static const uint8 kNumberedAbsorbable_Ext[18] = { 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; +static const uint8 kRupeesAbsorption[3] = {1, 5, 20}; +const uint8 kAbsorptionSfx[15] = {0xb, 0xa, 0xa, 0xa, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0xb, 0x2f, 0x2f, 0xb}; +static const uint8 kBombsAbsorption[3] = {1, 4, 8}; +const uint8 kAbsorbBigKey[2] = {0x40, 0x20}; +static int AllocOverlord(); +static int Overworld_AllocSprite(uint8 type); +uint16 Sprite_GetX(int k) { + return sprite_x_lo[k] | sprite_x_hi[k] << 8; +} + +uint16 Sprite_GetY(int k) { + return sprite_y_lo[k] | sprite_y_hi[k] << 8; +} + +void Sprite_SetX(int k, uint16 x) { + sprite_x_lo[k] = x; + sprite_x_hi[k] = x >> 8; +} + +void Sprite_SetY(int k, uint16 y) { + sprite_y_lo[k] = y; + sprite_y_hi[k] = y >> 8; +} + +void Sprite_ApproachTargetSpeed(int k, uint8 x, uint8 y) { + if (sprite_x_vel[k] - x) + sprite_x_vel[k] += sign8(sprite_x_vel[k] - x) ? 1 : -1; + if (sprite_y_vel[k] - y) + sprite_y_vel[k] += sign8(sprite_y_vel[k] - y) ? 1 : -1; +} + +void SpriteAddXY(int k, int xv, int yv) { + Sprite_SetX(k, Sprite_GetX(k) + xv); + Sprite_SetY(k, Sprite_GetY(k) + yv); +} + +void Sprite_MoveXYZ(int k) { + Sprite_MoveZ(k); + Sprite_MoveX(k); + Sprite_MoveY(k); +} + +void Sprite_Invert_XY_Speeds(int k) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; +} + +int Sprite_SpawnSimpleSparkleGarnishEx(int k, uint16 x, uint16 y, int limit) { + int j = GarnishAllocLimit(limit); + if (j >= 0) { + garnish_type[j] = 5; + garnish_active = 5; + Garnish_SetX(j, Sprite_GetX(k) + x); + Garnish_SetY(j, Sprite_GetY(k) + y - sprite_z[k] + 16); + garnish_countdown[j] = 31; + garnish_sprite[j] = k; + garnish_floor[j] = sprite_floor[k]; + } + g_ram[15] = j; + return j; +} + +static int AllocOverlord() { + int i = 7; + while (i >= 0 && overlord_type[i] != 0) + i--; + return i; +} + +static int Overworld_AllocSprite(uint8 type) { + int i = (type == 0x58) ? 4 : + (type == 0xd0) ? 5 : + (type == 0xeb || type == 0x53 || type == 0xf3) ? 14 : 13; + for (; i >= 0; i--) { + if (sprite_state[i] == 0 || sprite_type[i] == 0x41 && sprite_C[i] != 0) + break; + } + return i; +} + +uint16 Garnish_GetX(int k) { + return garnish_x_lo[k] | garnish_x_hi[k] << 8; +} + +uint16 Garnish_GetY(int k) { + return garnish_y_lo[k] | garnish_y_hi[k] << 8; +} + +void Garnish_SparkleCommon(int k, uint8 shift) { + static const uint8 kGarnishSparkle_Char[4] = {0x83, 0xc7, 0x80, 0xb7}; + uint8 t = garnish_countdown[k] >> shift; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kGarnishSparkle_Char[t]; + int j = garnish_sprite[k]; + oam->flags = (sprite_oam_flags[j] | sprite_obj_prio[j]) & 0xf0 | 4; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Garnish_DustCommon(int k, uint8 shift) { + static const uint8 kRunningManDust_Char[3] = {0xdf, 0xcf, 0xa9}; + tmp_counter = garnish_countdown[k] >> shift; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kRunningManDust_Char[tmp_counter]; + oam->flags = 0x24; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void SpriteModule_Explode(int k) { + static const DrawMultipleData kSpriteExplode_Dmd[32] = { + { 0, 0, 0x0060, 2}, + { 0, 0, 0x0060, 2}, + { 0, 0, 0x0060, 2}, + { 0, 0, 0x0060, 2}, + {-5, -5, 0x0062, 2}, + { 5, -5, 0x4062, 2}, + {-5, 5, 0x8062, 2}, + { 5, 5, 0xc062, 2}, + {-8, -8, 0x0062, 2}, + { 8, -8, 0x4062, 2}, + {-8, 8, 0x8062, 2}, + { 8, 8, 0xc062, 2}, + {-8, -8, 0x0064, 2}, + { 8, -8, 0x4064, 2}, + {-8, 8, 0x8064, 2}, + { 8, 8, 0xc064, 2}, + {-8, -8, 0x0066, 2}, + { 8, -8, 0x4066, 2}, + {-8, 8, 0x8066, 2}, + { 8, 8, 0xc066, 2}, + {-8, -8, 0x0068, 2}, + { 8, -8, 0x0068, 2}, + {-8, 8, 0x0068, 2}, + { 8, 8, 0x0068, 2}, + {-8, -8, 0x006a, 2}, + { 8, -8, 0x406a, 2}, + {-8, 8, 0x806a, 2}, + { 8, 8, 0xc06a, 2}, + {-8, -8, 0x004e, 2}, + { 8, -8, 0x404e, 2}, + {-8, 8, 0x804e, 2}, + { 8, 8, 0xc04e, 2}, + }; + + if (sprite_A[k]) { + if (!sprite_delay_main[k]) { + sprite_state[k] = 0; + for (int j = 15; j >= 0; j--) { + if (sprite_state[j] == 4) + return; + } + load_chr_halfslot_even_odd = 1; + if (!Sprite_CheckIfScreenIsClear()) + flag_block_link_menu = 0; + } else { + Sprite_DrawMultiple(k, &kSpriteExplode_Dmd[((sprite_delay_main[k] >> 2) ^ 7) * 4], 4, NULL); + } + return; + } + sprite_floor[k] = 2; + + if (sprite_delay_main[k] == 32) { + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + if (player_near_pit_state != 2 && Sprite_CheckIfScreenIsClear()) { + if (sprite_type[k] >= 0xd6) { + music_control = 0x13; + } else if (sprite_type[k] == 0x7a) { + PrepareDungeonExitFromBossFight(); + } else { + SpriteExplode_SpawnEA(k); + return; + } + } + } + + if (sprite_delay_main[k] >= 64 && (sprite_delay_main[k] >= 0x70 || !(sprite_delay_main[k] & 1))) + SpriteActive_Main(k); + + uint8 type = sprite_type[k]; + if (sprite_delay_main[k] >= 0xc0) + return; + if ((sprite_delay_main[k] & 3) == 0) + SpriteSfx_QueueSfx2WithPan(k, 0xc); + if (sprite_delay_main[k] & ((type == 0x92) ? 3 : 7)) + return; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1c, &info); + if (j >= 0) { + static const int8 kSpriteExplode_RandomXY[16] = {0, 4, 8, 12, -4, -8, -12, 0, 0, 8, 16, 24, -24, -16, -8, 0}; + load_chr_halfslot_even_odd = 11; + sprite_state[j] = 4; + sprite_flags2[j] = 3; + sprite_oam_flags[j] = 0xc; + int xoff = kSpriteExplode_RandomXY[(GetRandomNumber() & 7) | ((type == 0x92) ? 8 : 0)]; + int yoff = kSpriteExplode_RandomXY[(GetRandomNumber() & 7) | ((type == 0x92) ? 8 : 0)]; + Sprite_SetX(j, info.r0_x + xoff); + Sprite_SetY(j, info.r2_y + yoff - info.r4_z); + sprite_delay_main[j] = 31; + sprite_A[j] = 31; + } + // endif_1 +} + +void SpriteDeath_MainEx(int k, bool second_entry) { + if (!second_entry) { + uint8 type = sprite_type[k]; + if (type == 0xec) { + ThrowableScenery_ScatterIntoDebris(k); + return; + } + if (type == 0x53 || type == 0x54 || type == 0x92 || type == 0x4a && sprite_C[k] >= 2) { + SpriteActive_Main(k); + return; + } + if (sprite_delay_main[k] == 0) { + Sprite_DoTheDeath(k); + return; + } + } + if (sign8(sprite_flags3[k])) { + SpriteActive_Main(k); + return; + } + if (!((frame_counter & 3) | submodule_index | flag_unk1)) + sprite_delay_main[k]++; + SpriteDeath_DrawPoof(k); + + if (sprite_type[k] != 0x40 && sprite_delay_main[k] < 10) + return; + oam_cur_ptr += 16; + oam_ext_cur_ptr += 4; + uint8 bak = sprite_flags2[k]; + sprite_flags2[k] -= 4; + SpriteActive_Main(k); + sprite_flags2[k] = bak; +} + +void SpriteModule_Burn(int k) { + static const uint8 kFlame_Gfx[32] = { + 5, 4, 3, 1, 2, 0, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, + 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, + }; + sprite_hit_timer[k] = 0; + int j = sprite_delay_main[k] - 1; + if (j == 0) { + Sprite_DoTheDeath(k); + return; + } + uint8 bak = sprite_graphics[k]; + uint8 bak1 = sprite_oam_flags[k]; + sprite_graphics[k] = kFlame_Gfx[j >> 3]; + sprite_oam_flags[k] = 3; + Flame_Draw(k); + sprite_oam_flags[k] = bak1; + sprite_graphics[k] = bak; + + oam_cur_ptr += 8; + oam_ext_cur_ptr += 2; + if (sprite_delay_main[k] >= 0x10) { + uint8 bak = sprite_flags2[k]; + sprite_flags2[k] -= 2; + SpriteActive_Main(k); + sprite_flags2[k] = bak; + } +} + +void Sprite_HitTimer31(int k) { + if (sprite_type[k] != 0x7a || is_in_dark_world) + return; + if (sprite_health[k] <= sprite_give_damage[k]) { + dialogue_message_index = 0x140; + Sprite_ShowMessageMinimal(); + } +} + +void SpriteStunned_MainEx(int k, bool second_entry) { + if (second_entry) + goto ThrownSprite_TileAndSpriteInteraction; + Sprite_DrawRippleIfInWater(k); + SpriteStunned_Main_Func1(k); + if (Sprite_ReturnIfPaused(k)) + return; + if (sprite_F[k]) { + if (sign8(sprite_F[k])) + sprite_F[k] = 0; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + } + if (sprite_delay_main[k] < 0x20) + Sprite_CheckDamageFromLink(k); + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_MoveXY(k); + if (!sprite_E[k]) { + Sprite_CheckTileCollision(k); + if (!sprite_state[k]) + return; + ThrownSprite_TileAndSpriteInteraction: + if (sprite_wallcoll[k] & 0xf) { + Sprite_ApplyRicochet(k); + if (sprite_state[k] == 11) + SpriteSfx_QueueSfx2WithPan(k, 5); + } + } + Sprite_CheckTileProperty(k, 0x68); + + if (kSpriteInit_Flags3[sprite_type[k]] & 0x10) { + sprite_flags3[k] |= 0x10; + if (sprite_tiletype == 32) + sprite_flags3[k] &= ~0x10; + } + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + uint8 z = sprite_z[k] - 1; + if (z >= 0xf0) { + sprite_z[k] = 0; + if (sprite_type[k] == 0xe8 && sign8(sprite_z_vel[k] - 0xe8)) { + sprite_state[k] = 6; + sprite_delay_main[k] = 8; + sprite_flags2[k] = 3; + return; + } + ThrowableScenery_TransmuteIfValid(k); + uint8 a = sprite_tiletype; + if (sprite_tiletype == 32 && !(a = sprite_flags[k] >> 1, sprite_flags[k] & 1)) { // wtf + Sprite_Func8(k); + return; + } + if (a == 9) { + z = sprite_z_vel[k]; + sprite_z_vel[k] = 0; + int j; + SpriteSpawnInfo info; + + if (sign8(z - 0xf0) && (j = Sprite_SpawnDynamically(k, 0xec, &info)) >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_Func22(j); + } + } else if (a == 8) { + if (sprite_type[k] == 0xd2 || (GetRandomNumber() & 1)) + Sprite_SpawnLeapingFish(k); + Sprite_Func22(k); + return; + } + z = sprite_z_vel[k]; + if (sign8(z)) { + z = (uint8)(-z) >> 1; + sprite_z_vel[k] = z < 9 ? 0 : z; + } + sprite_x_vel[k] = (int8)sprite_x_vel[k] >> 1; + if (sprite_x_vel[k] == 255) + sprite_x_vel[k] = 0; + sprite_y_vel[k] = (int8)sprite_y_vel[k] >> 1; + if (sprite_y_vel[k] == 255) + sprite_y_vel[k] = 0; + } + if (sprite_state[k] != 11 || sprite_unk5[k] != 0) { + if (Sprite_ReturnIfLifted(k)) + return; + if (sprite_type[k] != 0x4a) + ThrownSprite_CheckDamageToSprites(k); + } +} + +void Ancilla_SpawnFallingPrize(uint8 item) { // 85a51d + AncillaAdd_FallingPrize(0x29, item, 4); +} + +bool Sprite_CheckDamageToAndFromLink(int k) { // 85ab93 + Sprite_CheckDamageFromLink(k); + return Sprite_CheckDamageToLink(k); +} + +uint8 Sprite_CheckTileCollision(int k) { // 85b88d + Sprite_CheckTileCollision2(k); + return sprite_wallcoll[k]; +} + +bool Sprite_TrackBodyToHead(int k) { // 85dca2 + if (sprite_head_dir[k] != sprite_D[k]) { + if (frame_counter & 0x1f) + return false; + if (!((sprite_head_dir[k] ^ sprite_D[k]) & 2)) { + sprite_D[k] = (((k ^ frame_counter) >> 5 | 2) & 3) ^ (sprite_head_dir[k] & 2); + return false; + } + } + sprite_D[k] = sprite_head_dir[k]; + return true; +} + +void Sprite_DrawMultiple(int k, const DrawMultipleData *src, int n, PrepOamCoordsRet *info) { // 85df6c + PrepOamCoordsRet info_buf; + if (!info) + info = &info_buf; + if (Sprite_PrepOamCoordOrDoubleRet(k, info)) + return; + word_7E0CFE = 0; + uint8 a = sprite_state[k]; + if (a == 10) + a = sprite_unk4[k]; + if (a == 11) + BYTE(word_7E0CFE) = sprite_unk5[k]; + OamEnt *oam = GetOamCurPtr(); + do { + uint16 x = src->x + info->x; + uint16 y = src->y + info->y; + oam->x = x; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + uint16 d = src->char_flags ^ WORD(info->r4); + if (word_7E0CFE >= 1) + d = d & ~0xE00 | 0x400; + WORD(oam->charnum) = d; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1) | src->ext; + } while (src++, oam++, --n); +} + +void Sprite_DrawMultiplePlayerDeferred(int k, const DrawMultipleData *src, int n, PrepOamCoordsRet *info) { // 85df75 + Oam_AllocateDeferToPlayer(k); + Sprite_DrawMultiple(k, src, n, info); +} + +int Sprite_ShowSolicitedMessage(int k, uint16 msg) { // 85e1a7 + static const uint8 kShowMessageFacing_Tab0[4] = {4, 6, 0, 2}; + dialogue_message_index = msg; + if (!Sprite_CheckDamageToLink_same_layer(k) || + Sprite_CheckIfLinkIsBusy() || + !(filtered_joypad_L & 0x80) || + sprite_delay_aux4[k] || link_auxiliary_state == 2) + return sprite_D[k]; + uint8 dir = Sprite_DirectionToFaceLink(k, NULL); + if (link_direction_facing != kShowMessageFacing_Tab0[dir]) + return sprite_D[k]; + Sprite_ShowMessageUnconditional(dialogue_message_index); + sprite_delay_aux4[k] = 64; + return dir ^ 0x103; +} + +int Sprite_ShowMessageOnContact(int k, uint16 msg) { // 85e1f0 + dialogue_message_index = msg; + if (!Sprite_CheckDamageToLink_same_layer(k) || link_auxiliary_state == 2) + return sprite_D[k]; + Sprite_ShowMessageUnconditional(dialogue_message_index); + return Sprite_DirectionToFaceLink(k, NULL) ^ 0x103; +} + +void Sprite_ShowMessageUnconditional(uint16 msg) { // 85e219 + dialogue_message_index = msg; + byte_7E0223 = 0; + messaging_module = 0; + submodule_index = 2; + saved_module_for_menu = main_module_index; + main_module_index = 14; + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); + link_auxiliary_state = 0; + link_incapacitated_timer = 0; + if (link_player_handler_state == kPlayerState_RecoilWall) + link_player_handler_state = kPlayerState_Ground; +} + +bool Sprite_TutorialGuard_ShowMessageOnContact(int k, uint16 msg) { // 85fa59 + dialogue_message_index = msg; + uint8 bak2 = sprite_flags2[k]; + uint8 bak4 = sprite_flags4[k]; + sprite_flags2[k] = 0x80; + sprite_flags4[k] = 0x07; + bool rv = Sprite_CheckDamageToLink_same_layer(k); + sprite_flags2[k] = bak2; + sprite_flags4[k] = bak4; + if (!rv) + return rv; + Sprite_NullifyHookshotDrag(); + link_is_running = 0; + link_speed_setting = 0; + if (!link_auxiliary_state) + Sprite_ShowMessageMinimal(); + return rv; +} + +void Sprite_ShowMessageMinimal() { // 85fa8e + byte_7E0223 = 0; + messaging_module = 0; + submodule_index = 2; + saved_module_for_menu = main_module_index; + main_module_index = 14; +} + +void Prepare_ApplyRumbleToSprites() { // 8680fa + static const int8 kApplyRumble_X[4] = { -32, -32, -32, 16 }; + static const int8 kApplyRumble_Y[4] = { -32, 32, -24, -24 }; + static const uint8 kApplyRumble_WH[6] = { 0x50, 0x50, 0x20, 0x20, 0x50, 0x50 }; + int j = link_direction_facing >> 1; + SpriteHitBox hb; + uint16 x = link_x_coord + kApplyRumble_X[j]; + uint16 y = link_y_coord + kApplyRumble_Y[j]; + hb.r0_xlo = x; + hb.r8_xhi = x >> 8; + hb.r1_ylo = y; + hb.r9_yhi = y >> 8; + hb.r2 = kApplyRumble_WH[j]; + hb.r3 = kApplyRumble_WH[j + 2]; + Entity_ApplyRumbleToSprites(&hb); +} + +void Sprite_SpawnImmediatelySmashedTerrain(uint8 what, uint16 x, uint16 y) { // 86812d + uint8 bak1 = flag_is_sprite_to_pick_up; + uint8 bak2 = byte_7E0FB2; + int k = Sprite_SpawnThrowableTerrain_silently(what, x, y); + if (k >= 0) + ThrowableScenery_TransmuteToDebris(k); + byte_7E0FB2 = bak2; + flag_is_sprite_to_pick_up = bak1; +} + +void Sprite_SpawnThrowableTerrain(uint8 what, uint16 x, uint16 y) { // 86814b + sound_effect_1 = Link_CalculateSfxPan() | 29; + Sprite_SpawnThrowableTerrain_silently(what, x, y); +} + +int Sprite_SpawnThrowableTerrain_silently(uint8 what, uint16 x, uint16 y) { // 868156 + int k = 15; + for (; k >= 0 && sprite_state[k] != 0; k--); + if (k < 0) + return k; + sprite_state[k] = 10; + sprite_type[k] = 0xEC; + Sprite_SetX(k, x); + Sprite_SetY(k, y); + SpritePrep_LoadProperties(k); + sprite_floor[k] = link_is_on_lower_level; + sprite_C[k] = what; + if (what >= 6) + sprite_flags2[k] = 0xa6; + // oob read, this array has only 6 elements. + uint8 flags = kThrowableScenery_Flags[what]; + if (what == 2) { + if (player_is_indoors) + sprite_oam_flags[k] = 0x80, flags = 0x50; // wtf + } + sprite_oam_flags[k] = flags; + sprite_unk4[k] = 9; + flag_is_sprite_to_pick_up = 2; + byte_7E0FB2 = 2; + sprite_delay_main[k] = 16; + sprite_floor[k] = link_is_on_lower_level; + sprite_graphics[k] = 0; + if (BYTE(dung_secrets_unk1) != 255) { + if (!(BYTE(dung_secrets_unk1) | player_is_indoors) && (uint8)(sprite_C[k] - 2) < 2) + Overworld_SubstituteAlternateSecret(); + if (dung_secrets_unk1 & 0x80) { + sprite_graphics[k] = dung_secrets_unk1 & 0x7f; + BYTE(dung_secrets_unk1) = 0; + } + Sprite_SpawnSecret(k); + } + return k; +} + +void Sprite_SpawnSecret(int k) { // 868264 + if (!player_is_indoors && (GetRandomNumber() & 8)) + return; + int b = BYTE(dung_secrets_unk1); + if (b == 0) + return; + if (b == 4) + b = 19 + (GetRandomNumber() & 3); + if (!kSpawnSecretItems[b - 1]) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, kSpawnSecretItems[b - 1], &info); + if (j < 0) + return; + sprite_ai_state[j] = kSpawnSecretItem_SpawnFlag[b - 1]; + sprite_ignore_projectile[j] = kSpawnSecretItem_IgnoreProj[b - 1]; + sprite_z_vel[j] = kSpawnSecretItem_ZVel[b - 1]; + Sprite_SetX(j, info.r0_x + kSpawnSecretItem_XLo[b - 1]); + Sprite_SetY(j, info.r2_y); + sprite_z[j] = info.r4_z; + sprite_graphics[j] = 0; + sprite_delay_aux4[j] = 32; + sprite_delay_aux2[j] = 48; + uint8 type = sprite_type[j]; + if (type == 0xe4) { + SpritePrep_SmallKey(j); + sprite_stunned[j] = 255; + } else if (type == 0xb) { + sound_effect_1 = 0x30; + if (BYTE(dungeon_room_index2) == 1) + sprite_subtype[j] = 1; + sprite_stunned[j] = 255; + } else if (type == 0x41 || type == 0x42) { + sound_effect_2 = 4; + sprite_give_damage[j] = 0; + sprite_hit_timer[j] = 160; + } else if (type == 0x3e) { + sprite_oam_flags[j] = 9; + } else { + sprite_stunned[j] = 255; + if (type == 0x79) + sprite_A[j] = 32; + } +} + +void Sprite_Main() { // 868328 + if (!player_is_indoors) { + ancilla_floor[0] = 0; + ancilla_floor[1] = 0; + ancilla_floor[2] = 0; + ancilla_floor[3] = 0; + ancilla_floor[4] = 0; + Sprite_ProximityActivation(); + } + is_in_dark_world = (savegame_is_darkworld != 0); + if (submodule_index == 0) + drag_player_x = drag_player_y = 0; + Oam_ResetRegionBases(); + Garnish_ExecuteUpperSlots(); + Follower_Main(); + byte_7E0FB2 = flag_is_sprite_to_pick_up; + flag_is_sprite_to_pick_up = 0; + HIBYTE(dungmap_var8) = 0x80; + + if (set_when_damaging_enemies & 0x7f) + set_when_damaging_enemies--; + else + set_when_damaging_enemies = 0; + byte_7E0379 = 0; + link_unk_master_sword = 0; + link_prevent_from_moving = 0; + if (sprite_alert_flag) + sprite_alert_flag--; + Ancilla_Main(); + Overlord_Main(); + archery_game_out_of_arrows = 0; + for (int i = 15; i >= 0; i--) { + cur_object_index = i; + Sprite_ExecuteSingle(i); + } + Garnish_ExecuteLowerSlots(); + byte_7E069E[0] = byte_7E069E[1] = 0; + ExecuteCachedSprites(); + if (load_chr_halfslot_even_odd) + byte_7E0FC6 = load_chr_halfslot_even_odd; +} + +void Oam_ResetRegionBases() { // 8683d3 + memcpy(oam_region_base, kOam_ResetRegionBases, 12); +} + +void Sprite_TimersAndOam(int k) { // 8683f2 + Sprite_Get16BitCoords(k); + + uint8 num = ((sprite_flags2[k] & 0x1f) + 1) * 4; + + if (sort_sprites_setting) { + if (sprite_floor[k]) + Oam_AllocateFromRegionF(num); + else + Oam_AllocateFromRegionD(num); + } else { + Oam_AllocateFromRegionA(num); + } + + if (!(submodule_index | flag_unk1)) { + if (sprite_delay_main[k]) + sprite_delay_main[k]--; + if (sprite_delay_aux1[k]) + sprite_delay_aux1[k]--; + if (sprite_delay_aux2[k]) + sprite_delay_aux2[k]--; + if (sprite_delay_aux3[k]) + sprite_delay_aux3[k]--; + + uint8 timer = sprite_hit_timer[k] & 0x7f; + if (timer) { + if (sprite_state[k] >= 9) { + if (timer == 31) { + Sprite_HitTimer31(k); + } else if (timer == 24) { + Sprite_MiniMoldorm_Recoil(k); + } + } + if (sprite_give_damage[k] < 251) + sprite_obj_prio[k] = sprite_hit_timer[k] * 2 & 0xe; + sprite_hit_timer[k]--; + } else { + sprite_hit_timer[k] = 0; + sprite_obj_prio[k] = 0; + } + if (sprite_delay_aux4[k]) + sprite_delay_aux4[k]--; + } + + static const uint8 kSpritePrios[4] = {0x20, 0x10, 0x30, 0x30}; + int floor = link_is_on_lower_level; + if (floor != 3) + floor = sprite_floor[k]; + sprite_obj_prio[k] = sprite_obj_prio[k] & 0xcf | kSpritePrios[floor]; +} + +void Sprite_Get16BitCoords(int k) { // 8684c1 + cur_sprite_x = sprite_x_lo[k] | sprite_x_hi[k] << 8; + cur_sprite_y = sprite_y_lo[k] | sprite_y_hi[k] << 8; +} + +void Sprite_ExecuteSingle(int k) { // 8684e2 + uint8 st = sprite_state[k]; + if (st != 0) + Sprite_TimersAndOam(k); + kSprite_ExecuteSingle[st](k); +} + +void Sprite_inactiveSprite(int k) { // 868510 + if (!player_is_indoors) { + sprite_N_word[k] = 0xffff; + } else { + sprite_N[k] = 0xff; + } +} + +void SpriteModule_Fall1(int k) { // 86852e + if (!sprite_delay_main[k]) { + sprite_state[k] = 0; + Sprite_ManuallySetDeathFlagUW(k); + } else { + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteFall_Draw(k, &info); + } +} + +void SpriteModule_Drown(int k) { // 86859c + static const DrawMultipleData kSpriteDrown_Dmd[8] = { + {-7, -7, 0x0480, 0}, + {14, -6, 0x0483, 0}, + {-6, -6, 0x04cf, 0}, + {13, -5, 0x04df, 0}, + {-4, -4, 0x04ae, 0}, + {12, -4, 0x44af, 0}, + { 0, 0, 0x04e7, 2}, + { 0, 0, 0x04e7, 2}, + }; + static const uint8 kSpriteDrown_Oam_Flags[4] = {0, 0x40, 0xc0, 0x80}; + static const uint8 kSpriteDrown_Oam_Char[11] = {0xc0, 0xc0, 0xc0, 0xc0, 0xcd, 0xcd, 0xcd, 0xcb, 0xcb, 0xcb, 0xcb}; + + if (sprite_ai_state[k]) { + if (sprite_A[k] == 6) + Oam_AllocateFromRegionC(8); + sprite_flags3[k] ^= 16; + SpriteDraw_SingleLarge(k); + OamEnt *oam = GetOamCurPtr(); + int j = sprite_delay_main[k]; + if (j == 1) + sprite_state[k] = 0; + if (j != 0) { + assert((j >> 1) < 11); + oam->charnum = kSpriteDrown_Oam_Char[j >> 1]; + oam->flags = 0x24; + return; + } + oam->charnum = 0x8a; + oam->flags = kSpriteDrown_Oam_Flags[sprite_subtype2[k] >> 2 & 3] | 0x24; + + if (Sprite_ReturnIfPaused(k)) + return; + sprite_subtype2[k]++; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_delay_main[k] = 18; + sprite_flags3[k] &= ~0x10; + } + } else { + if (Sprite_ReturnIfPaused(k)) + return; + if (!(frame_counter & 1)) + sprite_delay_main[k]++; + sprite_oam_flags[k] = 0; + sprite_hit_timer[k] = 0; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + Sprite_DrawMultiple(k, &kSpriteDrown_Dmd[(sprite_delay_main[k] << 1 & 0xf8) >> 2], 2, NULL); + } +} + +void Sprite_DrawDistress_custom(uint16 xin, uint16 yin, uint8 time) { // 86a733 + Oam_AllocateFromRegionA(0x10); + if (!(time & 0x18)) + return; + int i = 3; + OamEnt *oam = GetOamCurPtr(); + do { + uint16 x = xin + kSpriteDistress_X[i]; + uint16 y = yin + kSpriteDistress_Y[i]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0x83; + oam->flags = 0x22; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } while (oam++, --i >= 0); +} + +void Sprite_CheckIfLifted_permissive(int k) { // 86aa0c + Sprite_ReturnIfLiftedPermissive(k); +} + +void Entity_ApplyRumbleToSprites(SpriteHitBox *hb) { // 86ad03 + for (int j = 15; j >= 0; j--) { + if (!(sprite_defl_bits[j] & 2) || sprite_E[j] == 0) + continue; + if (byte_7E0FC6 != 0xe) { + Sprite_SetupHitBox(j, hb); + if (!CheckIfHitBoxesOverlap(hb)) + continue; + } + sprite_E[j] = 0; + sound_effect_2 = 0x30; + sprite_z_vel[j] = 0x30; + sprite_x_vel[j] = 0x10; + sprite_delay_aux3[j] = 0x30; + sprite_stunned[j] = 255; + if (sprite_type[j] == 0xd8) + Sprite_TransmuteToBomb(j); + } +} + +void Sprite_ZeroVelocity_XY(int k) { // 86cf5d + sprite_x_vel[k] = sprite_y_vel[k] = 0; +} + +bool Sprite_HandleDraggingByAncilla(int k) { // 86cf64 + int j = sprite_B[k]; + if (j-- == 0) + return false; + if (ancilla_type[j] == 0) { + Sprite_HandleAbsorptionByPlayer(k); + } else { + sprite_x_lo[k] = ancilla_x_lo[j]; + sprite_x_hi[k] = ancilla_x_hi[j]; + sprite_y_lo[k] = ancilla_y_lo[j]; + sprite_y_hi[k] = ancilla_y_hi[j]; + sprite_z[k] = 0; + } + return true; +} + +bool Sprite_ReturnIfPhasingOut(int k) { // 86d0ed + if (!sprite_stunned[k] || (submodule_index | flag_unk1)) + return false; + if (!(frame_counter & 1)) + sprite_stunned[k]--; + uint8 a = sprite_stunned[k]; + if (a == 0) + sprite_state[k] = 0; + else if (a >= 0x28 || (a & 1) != 0) + return false; + PrepOamCoordsRet info; + Sprite_PrepOamCoordOrDoubleRet(k, &info); + return true; +} + +void Sprite_CheckAbsorptionByPlayer(int k) { // 86d116 + if (!sprite_delay_aux4[k] && Sprite_CheckDamageToPlayer_1(k)) + Sprite_HandleAbsorptionByPlayer(k); +} + +void Sprite_HandleAbsorptionByPlayer(int k) { // 86d13c + sprite_state[k] = 0; + int t = sprite_type[k] - 0xd8; + SpriteSfx_QueueSfx3WithPan(k, kAbsorptionSfx[t]); + switch(t) { + case 0: + link_hearts_filler += 8; + break; + case 1: case 2: case 3: + link_rupees_goal += kRupeesAbsorption[t - 1]; + break; + case 4: case 5: case 6: + link_bomb_filler += kBombsAbsorption[t - 4]; + break; + case 7: + link_magic_filler += 0x10; + break; + case 8: + link_magic_filler = 0x80; + break; + case 9: + link_arrow_filler += (sprite_head_dir[k] == 0) ? 5 : sprite_head_dir[k]; + break; + case 10: + link_arrow_filler += 10; + break; + case 11: + SpriteSfx_QueueSfx2WithPan(k, 0x31); + link_hearts_filler += 56; + break; + case 12: + link_num_keys += 1; + goto after_getkey; + case 13: + item_receipt_method = 0; + Link_ReceiveItem(0x32, 0); + after_getkey: + sprite_N[k] = sprite_subtype[k]; + dung_savegame_state_bits |= kAbsorbBigKey[sprite_die_action[k]] << 8; + Sprite_ManuallySetDeathFlagUW(k); + break; + case 14: + link_shield_type = sprite_subtype[k]; + break; + } +} + +bool SpriteDraw_AbsorbableTransient(int k, bool transient) { // 86d22f + if (transient && Sprite_ReturnIfPhasingOut(k)) + return false; + if (sort_sprites_setting == 0 && player_is_indoors != 0) + sprite_obj_prio[k] = 0x30; + if (byte_7E0FC6 >= 3) + return false; + if (sprite_delay_aux2[k] != 0) + Oam_AllocateFromRegionC(12); + if (sprite_E[k] != 0) + return true; + uint8 j = sprite_type[k]; + assert(j >= 0xd8 && j < 0xd8 + 19); + uint8 a = kAbsorbable_Tab2[j - 0xd8]; + if (a != 0) { + Sprite_DrawNumberedAbsorbable(k, a); + return false; + } + uint8 t = kAbsorbable_Tab1[j - 0xd8]; + if (t == 0) { + SpriteDraw_SingleSmall(k); + return false; + } + if (t == 2) { + if (sprite_type[k] == 0xe6) { + if (sprite_subtype[k] == 1) + goto draw_key; + sprite_graphics[k] = 1; + } + SpriteDraw_SingleLarge(k); + return false; + } +draw_key: + Sprite_DrawThinAndTall(k); + return false; +} + +void Sprite_DrawNumberedAbsorbable(int k, int a) { // 86d2fa + a = (a - 1) * 3; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int n = (sprite_head_dir[k] < 1) ? 2 : 1; + do { + int j = n + a; + uint16 x = info.x + kNumberedAbsorbable_X[j]; + uint16 y = info.y + kNumberedAbsorbable_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kNumberedAbsorbable_Char[j]; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = kNumberedAbsorbable_Ext[j] | (x >> 8 & 1); + } while (oam++, --n >= 0); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_BounceOffWall(int k) { // 86d9c0 + if (sprite_wallcoll[k] & 3) + sprite_x_vel[k] = -sprite_x_vel[k]; + if (sprite_wallcoll[k] & 12) + sprite_y_vel[k] = -sprite_y_vel[k]; +} + +void Sprite_InvertSpeed_XY(int k) { // 86d9d5 + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; +} + +bool Sprite_ReturnIfInactive(int k) { // 86d9ec + return (sprite_state[k] != 9 || flag_unk1 || submodule_index || !(sprite_defl_bits[k] & 0x80) && sprite_pause[k]); +} + +bool Sprite_ReturnIfPaused(int k) { // 86d9f3 + return (flag_unk1 || submodule_index || !(sprite_defl_bits[k] & 0x80) && sprite_pause[k]); +} + +void SpriteDraw_SingleLarge(int k) { // 86dc10 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Sprite_PrepAndDrawSingleLargeNoPrep(k, &info); +} + +void Sprite_PrepAndDrawSingleLargeNoPrep(int k, PrepOamCoordsRet *info) { // 86dc13 + OamEnt *oam = GetOamCurPtr(); + oam->x = info->x; + if ((uint16)(info->y + 0x10) < 0x100) { + oam->y = info->y; + oam->charnum = kSprite_PrepAndDrawSingleLarge_Tab2[kSprite_PrepAndDrawSingleLarge_Tab1[sprite_type[k]] + sprite_graphics[k]]; + oam->flags = info->flags; + } + bytewise_extended_oam[oam - oam_buf] = 2 | ((info->x >= 256) ? 1: 0); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow(k, info); +} + +void SpriteDraw_Shadow_custom(int k, PrepOamCoordsRet *info, uint8 a) { // 86dc5c + uint16 y = Sprite_GetY(k) + a; + info->y = y; + if (sprite_pause[k] || sprite_state[k] == 10 && sprite_unk3[k] == 3) + return; + y -= BG2VOFS_copy2; + info->y = y; + if ((uint16)(y + 0x10) >= 0x100) + return; + OamEnt *oam = GetOamCurPtr() + (sprite_flags2[k] & 0x1f); + oam->x = info->x; + if (sprite_flags3[k] & 0x20) { + oam->y = y + 1; + oam->charnum = 0x38; + oam->flags = (info->flags & 0x30) | 8; + bytewise_extended_oam[oam - oam_buf] = (info->x >> 8 & 1); + } else { + oam->y = y; + oam->charnum = 0x6c; + oam->flags = (info->flags & 0x30) | 8; + bytewise_extended_oam[oam - oam_buf] = (info->x >> 8 & 1) | 2; + } +} + +void SpriteDraw_Shadow(int k, PrepOamCoordsRet *oam) { // 86dc64 + SpriteDraw_Shadow_custom(k, oam, 10); +} + +void SpriteDraw_SingleSmall(int k) { // 86dcef + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = info.x; + if ((uint16)(info.y + 0x10) < 0x100) { + oam->y = info.y; + oam->charnum = kSprite_PrepAndDrawSingleLarge_Tab2[kSprite_PrepAndDrawSingleLarge_Tab1[sprite_type[k]] + sprite_graphics[k]]; + oam->flags = info.flags; + } + bytewise_extended_oam[oam - oam_buf] = 0 | (info.x >= 256); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &info, 2); +} + +void Sprite_DrawThinAndTall(int k) { // 86dd40 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + oam[1].x = oam[0].x = info.x; + bytewise_extended_oam[oam - oam_buf + 1] = bytewise_extended_oam[oam - oam_buf] = (info.x >= 256); + oam[0].y = ClampYForOam(info.y); + oam[1].y = ClampYForOam(info.y + 8); + uint8 a = kSprite_PrepAndDrawSingleLarge_Tab2[kSprite_PrepAndDrawSingleLarge_Tab1[sprite_type[k]] + sprite_graphics[k]]; + oam[0].charnum = a; + oam[1].charnum = a + 0x10; + oam[0].flags = oam[1].flags = info.flags; + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow(k, &info); +} + +void SpriteModule_Carried(int k) { // 86de83 + + + static const uint8 kSpriteHeld_ZForFrame[6] = {3, 2, 1, 3, 2, 1}; + static const int8 kSpriteHeld_X[16] = {0, 0, 0, 0, 0, 0, 0, 0, -13, -10, -5, 0, 13, 10, 5, 0}; + static const uint8 kSpriteHeld_Z[16] = {13, 14, 15, 16, 0, 10, 22, 16, 8, 11, 14, 16, 8, 11, 14, 16}; + sprite_room[k] = overworld_area_index; + if (sprite_unk3[k] != 3) { + if (sprite_delay_main[k] == 0) { + sprite_delay_main[k] = (sprite_C[k] == 6) ? 8 : 4; + sprite_unk3[k]++; + } + } else { + sprite_flags3[k] &= ~0x10; + } + + uint8 t = sprite_delay_aux4[k] - 1; + uint8 r0 = t < 63 && (t & 2); + int j = link_direction_facing * 2 + sprite_unk3[k]; + + int t0 = (uint8)link_x_coord + (uint8)kSpriteHeld_X[j]; + int t1 = (uint8)t0 + (t0 >> 8 & 1) + r0; + int t2 = HIBYTE(link_x_coord) + (t1 >> 8 & 1) + (t0 >> 8 & 1) + (uint8)(kSpriteHeld_X[j]>>8); + sprite_x_lo[k] = t1; + sprite_x_hi[k] = t2; + + // Sprite_SetX(k, link_x_coord + kSpriteHeld_X[j] + r0); + sprite_z[k] = kSpriteHeld_Z[j]; + int an = link_animation_steps < 6 ? link_animation_steps : 0; + uint16 z = link_z_coord + 1 + kSpriteHeld_ZForFrame[an]; + Sprite_SetY(k, link_y_coord + 8 - z); + sprite_floor[k] = link_is_on_lower_level & 1; + CarriedSprite_CheckForThrow(k); + Sprite_Get16BitCoords(k); + if (sprite_unk4[k] != 11) { + SpriteActive_Main(k); + if (sprite_delay_aux4[k] == 1) { + sprite_state[k] = 9; + sprite_B[k] = 0; + sprite_delay_aux4[k] = 96; + sprite_z_vel[k] = 32; + sprite_flags3[k] |= 0x10; + link_picking_throw_state = 2; + } + } else { + SpriteStunned_Main_Func1(k); + } +} + +void CarriedSprite_CheckForThrow(int k) { // 86df6d + static const int8 kSpriteHeld_Throw_Xvel[4] = {0, 0, -62, 63}; + static const int8 kSpriteHeld_Throw_Yvel[4] = {-62, 63, 0, 0}; + static const uint8 kSpriteHeld_Throw_Zvel[4] = {4, 4, 4, 4}; + + if (main_module_index == 14) + return; + + if (player_near_pit_state != 2) { + uint8 t = (link_auxiliary_state & 1) | link_is_in_deep_water | link_is_bunny_mirror | + link_pose_for_item | (link_disable_sprite_damage ? 0 : link_incapacitated_timer); + if (!t) { + if (sprite_unk3[k] != 3 || !((filtered_joypad_H | filtered_joypad_L) & 0x80)) + return; + filtered_joypad_L &= 0x7f; + } + } + + SpriteSfx_QueueSfx3WithPan(k, 0x13); + link_picking_throw_state = 2; + sprite_state[k] = sprite_unk4[k]; + sprite_z_vel[k] = 0; + sprite_unk3[k] = 0; + sprite_flags3[k] = sprite_flags3[k] & ~0x10 | kSpriteInit_Flags3[sprite_type[k]] & 0x10; + int j = link_direction_facing >> 1; + sprite_x_vel[k] = kSpriteHeld_Throw_Xvel[j]; + sprite_y_vel[k] = kSpriteHeld_Throw_Yvel[j]; + sprite_z_vel[k] = kSpriteHeld_Throw_Zvel[j]; + sprite_delay_aux4[k] = 0; +} + +void SpriteModule_Stunned(int k) { // 86dffa + SpriteStunned_MainEx(k, false); +} + +void ThrownSprite_TileAndSpriteInteraction(int k) { // 86e02a + SpriteStunned_MainEx(k, true); +} + +void Sprite_Func8(int k) { // 86e0ab + sprite_state[k] = 1; + sprite_delay_main[k] = 0x1f; + sound_effect_1 = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x20); +} + +void Sprite_Func22(int k) { // 86e0f6 + sound_effect_1 = Sprite_CalculateSfxPan(k) | 0x28; + sprite_state[k] = 3; + sprite_delay_main[k] = 15; + sprite_ai_state[k] = 0; + GetRandomNumber(); // wtf + sprite_flags2[k] = 3; +} + +void ThrowableScenery_InteractWithSpritesAndTiles(int k) { // 86e164 + Sprite_MoveXY(k); + if (!sprite_E[k]) + Sprite_CheckTileCollision(k); + ThrownSprite_TileAndSpriteInteraction(k); +} + +void ThrownSprite_CheckDamageToSprites(int k) { // 86e172 + if (sprite_delay_aux4[k] || !(sprite_x_vel[k] | sprite_y_vel[k])) + return; + for (int i = 15; i >= 0; i--) { + if (i != cur_object_index && sprite_type[k] != 0xd2 && sprite_state[i] >= 9 && + ((i ^ frame_counter) & 3 | sprite_ignore_projectile[i] | sprite_hit_timer[i]) == 0 && sprite_floor[k] == sprite_floor[i]) + ThrownSprite_CheckDamageToSingleSprite(k, i); + } +} + +void ThrownSprite_CheckDamageToSingleSprite(int k, int j) { // 86e1b2 + SpriteHitBox hb; + hb.r0_xlo = sprite_x_lo[k]; + hb.r8_xhi = sprite_x_hi[k]; + hb.r2 = 15; + int t = sprite_y_lo[k] - sprite_z[k]; + int u = (t & 0xff) + 8; + hb.r1_ylo = u; + hb.r9_yhi = sprite_y_hi[k] + (u >> 8) - (t < 0); + hb.r3 = 8; + Sprite_SetupHitBox(j, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + return; + if (sprite_type[j] == 0x3f) { + Sprite_PlaceWeaponTink(k); + } else { + uint8 a = (sprite_type[k] == 0xec && sprite_C[k] == 2 && !player_is_indoors) ? 1 : 3; + Ancilla_CheckDamageToSprite_preset(j, a); + + sprite_x_recoil[j] = sprite_x_vel[k] * 2; + sprite_y_recoil[j] = sprite_y_vel[k] * 2; + sprite_delay_aux4[k] = 16; + } + Sprite_ApplyRicochet(k); +} + +void Sprite_ApplyRicochet(int k) { // 86e229 + Sprite_InvertSpeed_XY(k); + Sprite_HalveSpeed_XY(k); + ThrowableScenery_TransmuteIfValid(k); +} + +void ThrowableScenery_TransmuteIfValid(int k) { // 86e22f + if (sprite_type[k] != 0xec) + return; + repulsespark_timer = 0; + ThrowableScenery_TransmuteToDebris(k); +} + +void ThrowableScenery_TransmuteToDebris(int k) { // 86e239 + uint8 a = sprite_graphics[k]; + if (a != 0) { + BYTE(dung_secrets_unk1) = a; + Sprite_SpawnSecret(k); + BYTE(dung_secrets_unk1) = 0; + } + a = player_is_indoors ? 0 : sprite_C[k]; + sound_effect_1 = 0; + SpriteSfx_QueueSfx2WithPan(k, kSprite_Func21_Sfx[a]); + Sprite_ScheduleForBreakage(k); +} + +void Sprite_ScheduleForBreakage(int k) { // 86e25a + sprite_delay_main[k] = 31; + sprite_state[k] = 6; + sprite_flags2[k] += 4; +} + +void Sprite_HalveSpeed_XY(int k) { // 86e26e + sprite_x_vel[k] = (int8)sprite_x_vel[k] >> 1; + sprite_y_vel[k] = (int8)sprite_y_vel[k] >> 1; +} + +void Sprite_SpawnLeapingFish(int k) { // 86e286 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xd2, &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ai_state[j] = 2; + sprite_delay_main[j] = 48; + if (sprite_type[k] == 0xd2) + sprite_A[j] = 0xd2; +} + +void SpriteStunned_Main_Func1(int k) { // 86e2ba + SpriteActive_Main(k); + if (sprite_unk5[k]) { + if (sprite_delay_main[k] < 32) + sprite_oam_flags[k] = sprite_oam_flags[k] & 0xf1 | 4; + uint8 t = ((k << 4) ^ frame_counter) | submodule_index; + if (t & kSpriteStunned_Main_Func1_Masks[sprite_delay_main[k] >> 4]) + return; + uint16 x = kSparkleGarnish_XY[GetRandomNumber() & 3]; + uint16 y = kSparkleGarnish_XY[GetRandomNumber() & 3]; + Sprite_GarnishSpawn_Sparkle(k, x, y); + } else { + if ((frame_counter & 1) | submodule_index | flag_unk1) + return; + uint8 t = sprite_stunned[k]; + if (t) { + sprite_stunned[k]--; + if (t < 0x38) { + sprite_x_vel[k] = (t & 1) ? -8 : 8; + Sprite_MoveX(k); + } + return; + } + sprite_state[k] = 9; + sprite_x_recoil[k] = 0; + sprite_y_recoil[k] = 0; + } +} + +void SpriteModule_Poof(int k) { // 86e393 + static const int8 kSpritePoof_X[16] = {-6, 10, 1, 13, -6, 10, 1, 13, -7, 4, -5, 6, -1, 1, -2, 0}; + static const int8 kSpritePoof_Y[16] = {-6, -4, 10, 9, -6, -4, 10, 9, -8, -10, 4, 3, -1, -2, 0, 1}; + static const uint8 kSpritePoof_Char[16] = {0x9b, 0x9b, 0x9b, 0x9b, 0xb3, 0xb3, 0xb3, 0xb3, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a}; + static const uint8 kSpritePoof_Flags[16] = {0x24, 0xa4, 0x24, 0xa4, 0xe4, 0x64, 0xa4, 0x24, 0x24, 0xe4, 0xe4, 0xe4, 0x24, 0xe4, 0xe4, 0xe4}; + static const uint8 kSpritePoof_Ext[16] = {0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2}; + // Frozen sprite pulverized by hammer + if (sprite_delay_main[k] == 0) { + if (sprite_type[k] == 0xd && sprite_head_dir[k] != 0) { + // buzz blob? + int bakx = Sprite_GetX(k); + PrepareEnemyDrop(k, 0xd); + Sprite_SetX(k, bakx); + sprite_z_vel[k] = 0; + sprite_ignore_projectile[k] = 0; + } else { + if (sprite_die_action[k] == 0) { + ForcePrizeDrop(k, 2, 2); + } else { + Sprite_DoTheDeath(k); + } + } + } else { + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int j = ((sprite_delay_main[k] >> 1) & ~3) + 3; + for (int i = 3; i >= 0; i--, j--, oam++) { + oam->x = kSpritePoof_X[j] + BYTE(dungmap_var7); + oam->y = kSpritePoof_Y[j] + HIBYTE(dungmap_var7); + oam->charnum = kSpritePoof_Char[j]; + oam->flags = kSpritePoof_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = kSpritePoof_Ext[j]; + } + Sprite_CorrectOamEntries(k, 3, 0xff); + } +} + +void Sprite_PrepOamCoord(int k, PrepOamCoordsRet *ret) { // 86e416 + Sprite_PrepOamCoordOrDoubleRet(k, ret); +} + +bool Sprite_PrepOamCoordOrDoubleRet(int k, PrepOamCoordsRet *ret) { // 86e41e + sprite_pause[k] = 0; + uint16 x = cur_sprite_x - BG2HOFS_copy2; + uint16 y = cur_sprite_y - BG2VOFS_copy2; + bool out_of_bounds = false; + R0 = x; + R2 = y - sprite_z[k]; + ret->flags = sprite_oam_flags[k] ^ sprite_obj_prio[k]; + ret->r4 = 0; + if ((uint16)(x + 0x40) >= 0x170 || (uint16)(y + 0x40) >= 0x170 && !(sprite_flags4[k] & 0x20)) { + sprite_pause[k]++; + if (!(sprite_defl_bits[k] & 0x80)) + Sprite_KillSelf(k); + out_of_bounds = true; + } + ret->x = R0; + ret->y = R2; + BYTE(dungmap_var7) = ret->x; + HIBYTE(dungmap_var7) = ret->y; + return out_of_bounds; +} + +void Sprite_CheckTileCollision2(int k) { // 86e4ab + sprite_wallcoll[k] = 0; + if (sign8(sprite_flags4[k]) || !dung_hdr_collision) { + Sprite_CheckTileCollisionSingleLayer(k); + return; + } + byte_7E0FB6 = sprite_floor[k]; + sprite_floor[k] = 1; + Sprite_CheckTileCollisionSingleLayer(k); + if (dung_hdr_collision == 4) { + sprite_floor[k] = byte_7E0FB6; + return; + } + sprite_floor[k] = 0; + Sprite_CheckTileCollisionSingleLayer(k); + byte_7FFABC[k] = sprite_tiletype; +} + +void Sprite_CheckTileCollisionSingleLayer(int k) { // 86e4db + if (sprite_flags2[k] & 0x20) { + if (Sprite_CheckTileProperty(k, 0x6a)) + sprite_wallcoll[k]++; + return; + } + + if (sign8(sprite_flags4[k]) || dung_hdr_collision == 0) { + if (sprite_y_vel[k]) + Sprite_CheckForTileInDirection_vertical(k, sign8(sprite_y_vel[k]) ? 0 : 1); + if (sprite_x_vel[k]) + Sprite_CheckForTileInDirection_horizontal(k, sign8(sprite_x_vel[k]) ? 2 : 3); + } else { + Sprite_CheckForTileInDirection_vertical(k, 1); + Sprite_CheckForTileInDirection_vertical(k, 0); + Sprite_CheckForTileInDirection_horizontal(k, 3); + Sprite_CheckForTileInDirection_horizontal(k, 2); + } + + if (sign8(sprite_flags5[k]) || sprite_z[k]) + return; + + Sprite_CheckTileProperty(k, 0x68); + sprite_I[k] = sprite_tiletype; + if (sprite_tiletype == 0x1c) { + if (sort_sprites_setting && sprite_state[k] == 11) + sprite_floor[k] = 1; + } else if (sprite_tiletype == 0x20) { + if (sprite_flags[k] & 1) { + if (!player_is_indoors) { + Sprite_Func8(k); + } else { + sprite_state[k] = 5; + if (sprite_type[k] == 0x13 || sprite_type[k] == 0x26) { + sprite_oam_flags[k] &= ~1; + sprite_delay_main[k] = 63; + } else { + sprite_delay_main[k] = 95; + } + } + } + } else if (sprite_tiletype == 0xc) { + if (byte_7FFABC[k] == 0x1c) { + SpriteFall_AdjustPosition(k); + sprite_wallcoll[k] |= 0x20; + } + } else if (sprite_tiletype >= 0x68 && sprite_tiletype < 0x6c) { + Sprite_ApplyConveyor(k, sprite_tiletype); + } else if (sprite_tiletype == 8) { + if (dung_hdr_collision == 4) + Sprite_ApplyConveyor(k, 0x6a); + } +} + +void Sprite_CheckForTileInDirection_horizontal(int k, int yy) { // 86e5b8 + if (!Sprite_CheckTileInDirection(k, yy)) + return; + sprite_wallcoll[k] |= kSprite_Func7_Tab[yy]; + if ((sprite_subtype[k] & 7) < 5) { + int8 n = sprite_F[k] ? 3 : 1; + SpriteAddXY(k, (yy & 1) ? -n : n, 0); + } +} + +void Sprite_CheckForTileInDirection_vertical(int k, int yy) { // 86e5ee + if (!Sprite_CheckTileInDirection(k, yy)) + return; + sprite_wallcoll[k] |= kSprite_Func7_Tab[yy]; + if ((sprite_subtype[k] & 7) < 5) { + int8 n = sprite_F[k] ? 3 : 1; + SpriteAddXY(k, 0, (yy & 1) ? -n : n); + } +} + +void SpriteFall_AdjustPosition(int k) { // 86e624 + SpriteAddXY(k, dung_floor_x_vel, dung_floor_y_vel); +} + +bool Sprite_CheckTileInDirection(int k, int yy) { // 86e72f + uint8 t = (sprite_flags[k] & 0xf0); + yy = 2 * ((t >> 2) + yy); + return Sprite_CheckTileProperty(k, yy); +} + +bool Sprite_CheckTileProperty(int k, int j) { // 86e73c + uint16 x, y; + bool in_bounds; + j >>= 1; + + if (player_is_indoors) { + x = (cur_sprite_x + 8 & 0x1ff) + kSprite_Func5_X[j] - 8; + y = (cur_sprite_y + 8 & 0x1ff) + kSprite_Func5_Y[j] - 8; + in_bounds = (x < 0x200) && (y < 0x200); + } else { + x = cur_sprite_x + kSprite_Func5_X[j]; + y = cur_sprite_y + kSprite_Func5_Y[j]; + in_bounds = (uint16)(x - sprcoll_x_base) < sprcoll_x_size && + (uint16)(y - sprcoll_y_base) < sprcoll_y_size; + } + if (!in_bounds) { + if (sprite_flags2[k] & 0x40) { + sprite_state[k] = 0; + return false; + } else { + return true; + } + } + + int b = Sprite_GetTileAttribute(k, &x, y); + + if (sprite_defl_bits[k] & 8) { + uint8 a = kSprite_SimplifiedTileAttr[b]; + if (a == 4) { + if (!player_is_indoors) + sprite_E[k] = 4; + } else if (a >= 1) { + return (sprite_tiletype >= 0x10 && sprite_tiletype < 0x14) ? Entity_CheckSlopedTileCollision(x, y) : true; + } + return false; + } + + if (sprite_flags5[k] & 0x40) { + uint8 type = sprite_type[k]; + if ((type == 0xd2 || type == 0x8a) && b == 9) + return false; + if (type == 0x94 && !sprite_E[k] || type == 0xe3 || type == 0x8c || type == 0x9a || type == 0x81) + return (b != 8) && (b != 9); + } + + if (kSprite_Func5_Tab3[b] == 0) + return false; + + if (sprite_tiletype >= 0x10 && sprite_tiletype < 0x14) + return Entity_CheckSlopedTileCollision(x, y); + + if (sprite_tiletype == 0x44) { + if (sprite_F[k] && !sign8(sprite_give_damage[k])) { + Ancilla_CheckDamageToSprite_preset(k, 4); + if (sprite_hit_timer[k]) { + sprite_hit_timer[k] = 153; + sprite_F[k] = 0; + } + } + } else if (sprite_tiletype == 0x20) { + return !(sprite_flags[k] & 1) || !sprite_F[k]; + } + return true; +} + +uint8 GetTileAttribute(uint8 floor, uint16 *x, uint16 y) { // 86e87b + uint8 tiletype; + if (player_is_indoors) { + int t = (floor >= 1) ? 0x1000 : 0; + t += (*x & 0x1f8) >> 3; + t += (y & 0x1f8) << 3; + tiletype = dung_bg2_attr_table[t]; + } else { + tiletype = Overworld_GetTileAttributeAtLocation(*x >>= 3, y); + } + sprite_tiletype = tiletype; + return tiletype; +} + +uint8 Sprite_GetTileAttribute(int k, uint16 *x, uint16 y) { // 86e883 + return GetTileAttribute(sprite_floor[k], x, y); +} + +bool Entity_CheckSlopedTileCollision(uint16 x, uint16 y) { // 86e8fe + uint8 a = y & 7; + uint8 r6 = sprite_tiletype - 0x10; + uint8 b = kSlopedTile[r6 * 8 + (x & 7)]; + return (r6 < 2) ? (b >= a) : (a >= b); +} + +void Sprite_MoveXY(int k) { // 86e92c + Sprite_MoveX(k); + Sprite_MoveY(k); +} + +void Sprite_MoveX(int k) { // 86e932 + if (sprite_x_vel[k] != 0) { + uint32 t = sprite_x_subpixel[k] + (sprite_x_lo[k] << 8) + (sprite_x_hi[k] << 16) + ((int8)sprite_x_vel[k] << 4); + sprite_x_subpixel[k] = t, sprite_x_lo[k] = t >> 8, sprite_x_hi[k] = t >> 16; + } +} + +void Sprite_MoveY(int k) { // 86e93e + if (sprite_y_vel[k] != 0) { + uint32 t = sprite_y_subpixel[k] + (sprite_y_lo[k] << 8) + (sprite_y_hi[k] << 16) + ((int8)sprite_y_vel[k] << 4); + sprite_y_subpixel[k] = t, sprite_y_lo[k] = t >> 8, sprite_y_hi[k] = t >> 16; + } +} + +void Sprite_MoveZ(int k) { // 86e96c + uint16 z = (sprite_z[k] << 8 | sprite_z_subpos[k]) + ((int8)sprite_z_vel[k] << 4); + sprite_z_subpos[k] = z; + sprite_z[k] = z >> 8; +} + +ProjectSpeedRet Sprite_ProjectSpeedTowardsLink(int k, uint8 vel) { // 86e991 + if (vel == 0) { + ProjectSpeedRet rv = { 0, 0, 0, 0 }; + return rv; + } + PairU8 below = Sprite_IsBelowLink(k); + uint8 r12 = sign8(below.b) ? -below.b : below.b; + + PairU8 right = Sprite_IsRightOfLink(k); + uint8 r13 = sign8(right.b) ? -right.b : right.b; + uint8 t; + bool swapped = false; + if (r13 < r12) { + swapped = true; + t = r12, r12 = r13, r13 = t; + } + uint8 xvel = vel, yvel = 0; + t = 0; + do { + t += r12; + if (t >= r13) + t -= r13, yvel++; + } while (--vel); + if (swapped) + t = xvel, xvel = yvel, yvel = t; + ProjectSpeedRet rv = { + (uint8)(right.a ? -xvel : xvel), + (uint8)(below.a ? -yvel : yvel), + right.b, + below.b + + }; + return rv; +} + +void Sprite_ApplySpeedTowardsLink(int k, uint8 vel) { // 86ea04 + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, vel); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; +} + +ProjectSpeedRet Sprite_ProjectSpeedTowardsLocation(int k, uint16 x, uint16 y, uint8 vel) { // 86ea2d + if (vel == 0) { + ProjectSpeedRet rv = { 0, 0, 0, 0 }; + return rv; + } + PairU8 below = Sprite_IsBelowLocation(k, y); + uint8 r12 = sign8(below.b) ? -below.b : below.b; + + PairU8 right = Sprite_IsRightOfLocation(k, x); + uint8 r13 = sign8(right.b) ? -right.b : right.b; + uint8 t; + bool swapped = false; + if (r13 < r12) { + swapped = true; + t = r12, r12 = r13, r13 = t; + } + uint8 xvel = vel, yvel = 0; + t = 0; + do { + t += r12; + if (t >= r13) + t -= r13, yvel++; + } while (--vel); + if (swapped) + t = xvel, xvel = yvel, yvel = t; + ProjectSpeedRet rv = { + (uint8)(right.a ? -xvel : xvel), + (uint8)(below.a ? -yvel : yvel), + right.b, + below.b + }; + return rv; +} + +uint8 Sprite_DirectionToFaceLink(int k, PointU8 *coords_out) { // 86eaa4 + PairU8 below = Sprite_IsBelowLink(k); + PairU8 right = Sprite_IsRightOfLink(k); + uint8 ym = sign8(below.b) ? -below.b : below.b; + tmp_counter = ym; + uint8 xm = sign8(right.b) ? -right.b : right.b; + if (coords_out) + coords_out->x = right.b, coords_out->y = below.b; + return (xm >= ym) ? right.a : below.a + 2; +} + +PairU8 Sprite_IsRightOfLink(int k) { // 86ead1 + uint16 x = link_x_coord - Sprite_GetX(k); + PairU8 rv = { (uint8)(sign16(x) ? 1 : 0), (uint8)x }; + return rv; +} + +PairU8 Sprite_IsBelowLink(int k) { // 86eae8 + int t = BYTE(link_y_coord) + 8; + int u = (t & 0xff) + sprite_z[k]; + int v = (u & 0xff) - sprite_y_lo[k]; + int w = HIBYTE(link_y_coord) - sprite_y_hi[k] - (v < 0); + uint8 y = (w & 0xff) + (t >> 8) + (u >> 8); + PairU8 rv = { (uint8)(sign8(y) ? 1 : 0), (uint8)v }; + return rv; +} + +PairU8 Sprite_IsRightOfLocation(int k, uint16 x) { // 86eb0a + uint16 xv = x - Sprite_GetX(k); + PairU8 rv = { (uint8)(sign16(xv) ? 1 : 0), (uint8)xv }; + return rv; +} + +PairU8 Sprite_IsBelowLocation(int k, uint16 y) { // 86eb1d + uint16 yv = y - Sprite_GetY(k); + PairU8 rv = { (uint8)(sign16(yv) ? 1 : 0), (uint8)yv }; + return rv; +} + +uint8 Sprite_DirectionToFaceLocation(int k, uint16 x, uint16 y) { // 86eb30 + PairU8 below = Sprite_IsBelowLocation(k, y); + PairU8 right = Sprite_IsRightOfLocation(k, x); + uint8 ym = sign8(below.b) ? -below.b : below.b; + tmp_counter = ym; + uint8 xm = sign8(right.b) ? -right.b : right.b; + return (xm >= ym) ? right.a : below.a + 2; +} + +void Guard_ParrySwordAttacks(int k) { // 86eb5e + if (link_is_on_lower_level != sprite_floor[k] || link_incapacitated_timer | link_auxiliary_state || sign8(sprite_hit_timer[k])) + return; + SpriteHitBox hb; + Sprite_DoHitBoxesFast(k, &hb); + if (link_position_mode & 0x10 || player_oam_y_offset == 0x80) { + Sprite_AttemptDamageToLinkWithCollisionCheck(k); + return; + } + Player_SetupActionHitBox(&hb); + if (sign8(button_b_frames) || !CheckIfHitBoxesOverlap(&hb)) { + Sprite_SetupHitBox(k, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + Sprite_AttemptDamageToLinkWithCollisionCheck(k); + else + Sprite_AttemptZapDamage(k); + return; + } + if (sprite_type[k] != 0x6a) + sprite_F[k] = kSprite_Func1_Tab[GetRandomNumber() & 7]; + link_incapacitated_timer = kSprite_Func1_Tab2[GetRandomNumber() & 7]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, sign8(button_b_frames - 9) ? 32 : 24); + sprite_x_recoil[k] = -pt.x; + sprite_y_recoil[k] = -pt.y; + Sprite_ApplyRecoilToLink(k, sign8(button_b_frames - 9) ? 8 : 16); + Link_PlaceWeaponTink(); + set_when_damaging_enemies = 0x90; +} + +void Sprite_AttemptZapDamage(int k) { // 86ec02 + uint8 a = sprite_type[k]; + if ((a == 0x7a || a == 0xd && (a = link_sword_type) < 4 || (a == 0x24 || a == 0x23) && sprite_delay_main[k] != 0) && sprite_state[k] == 9) { + if (!countdown_for_blink) { + sprite_delay_aux1[k] = 64; + link_electrocute_on_touch = 64; + Sprite_AttemptDamageToLinkPlusRecoil(k); + } + } else { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, sign8(button_b_frames - 9) ? 0x50 : 0x40); + sprite_x_recoil[k] = -pt.x; + sprite_y_recoil[k] = -pt.y; + Sprite_CalculateSwordDamage(k); + } +} + +void Ancilla_CheckDamageToSprite_preset(int k, int a) { // 86ece0 + if (a == 15 && sprite_z[k] != 0) + return; + + if (a != 0 && a != 7) { + Sprite_Func15(k, a); + return; + } + Sprite_Func15(k, a); + if (sprite_give_damage[k] || repulsespark_timer) + return; + // Called when hitting enemy which is frozen + repulsespark_timer = 5; + int j = byte_7E0FB6; + repulsespark_x_lo = ancilla_x_lo[j] + 4; + repulsespark_y_lo = ancilla_y_lo[j]; + repulsespark_floor_status = link_is_on_lower_level; + sound_effect_1 = 0; + SpriteSfx_QueueSfx2WithPan(k, 5); +} + +void Sprite_Func15(int k, int a) { // 86ed25 + damage_type_determiner = a; + Sprite_ApplyCalculatedDamage(k, a == 8 ? 0x35 : 0x20); +} + +void Sprite_CalculateSwordDamage(int k) { // 86ed3f + if (sprite_flags3[k] & 0x40) + return; + sprite_unk1[k] = link_is_running; + uint8 a = link_sword_type - 1; + if (!link_is_running) + a |= sign8(button_b_frames) ? 4 : sign8(button_b_frames - 9) ? 0 : 8; + damage_type_determiner = kSprite_Func14_Damage[a]; + if (link_item_in_hand & 10) + damage_type_determiner = 3; + link_sword_delay_timer = 4; + set_when_damaging_enemies = 16; + Sprite_ApplyCalculatedDamage(k, 0x9d); +} + +void Sprite_ApplyCalculatedDamage(int k, int a) { // 86ed89 + if ((sprite_flags3[k] & 0x40) || sprite_type[k] >= 0xD8) + return; + uint8 dmg = kEnemyDamages[damage_type_determiner * 8 | enemy_damage_data[sprite_type[k] * 16 | damage_type_determiner]]; + AgahnimBalls_DamageAgahnim(k, dmg, a); +} + +void AgahnimBalls_DamageAgahnim(int k, uint8 dmg, uint8 r0_hit_timer) { // 86edc5 + if (dmg == 249) { + Sprite_Func18(k, 0xe3); + return; + } + if (dmg == 250) { + Sprite_Func18(k, 0x8f); + sprite_ai_state[k] = 2; + sprite_z_vel[k] = 32; + sprite_oam_flags[k] = 8; + sprite_F[k] = 0; + sprite_hit_timer[k] = 0; + sprite_health[k] = 0; + sprite_bump_damage[k] = 1; + sprite_flags5[k] = 1; + return; + } + if (dmg >= sprite_give_damage[k]) + sprite_give_damage[k] = dmg; + if (dmg == 0) { + if (damage_type_determiner != 10) { + if (sprite_flags[k] & 4) + goto flag4; + link_sword_delay_timer = 0; + } + sprite_hit_timer[k] = 0; + sprite_give_damage[k] = 0; + return; + } + if (dmg >= 254 && sprite_state[k] == 11) { + sprite_hit_timer[k] = 0; + sprite_give_damage[k] = 0; + return; + } + if (sprite_type[k] == 0x9a && sprite_give_damage[k] < 0xf0) { + sprite_state[k] = 9; + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 15; + SpriteSfx_QueueSfx2WithPan(k, 0x28); + return; + } + if (sprite_type[k] == 0x1b) { + SpriteSfx_QueueSfx2WithPan(k, 5); + Sprite_ScheduleForBreakage(k); + Sprite_PlaceWeaponTink(k); + return; + } + sprite_hit_timer[k] = r0_hit_timer; + if (sprite_type[k] != 0x92 || sprite_C[k] >= 3) { + uint8 sfx = sprite_flags[k] & 2 ? 0x21 : + sprite_flags5[k] & 0x10 ? 0x1c : 8; + sound_effect_2 = sfx | Sprite_CalculateSfxPan(k); + } +flag4: + uint8 type = sprite_type[k]; + sprite_F[k] = (damage_type_determiner >= 13) ? 0 : + (type == 9) ? 20 : + (type == 0x53 || type == 0x18) ? 11 : 15; +} + +void Sprite_Func18(int k, uint8 new_type) { // 86edcb + sprite_type[k] = new_type; + SpritePrep_LoadProperties(k); + Sprite_SpawnPoofGarnish(k); + sound_effect_2 = 0; + SpriteSfx_QueueSfx3WithPan(k, 0x32); + sprite_hit_timer[k] = 0; + sprite_give_damage[k] = 0; +} + +void Sprite_MiniMoldorm_Recoil(int k) { // 86eec8 + if (sprite_state[k] < 9) + return; + tmp_counter = sprite_state[k]; + + uint8 dmg = sprite_give_damage[k]; + if (dmg == 253) { + sprite_give_damage[k] = 0; + SpriteSfx_QueueSfx3WithPan(k, 9); + sprite_state[k] = 7; + sprite_delay_main[k] = 0x70; + sprite_flags2[k] += 2; + sprite_give_damage[k] = 0; + return; + } + + if (dmg >= 251) { + sprite_give_damage[k] = 0; + if (sprite_state[k] == 11) + return; + sprite_unk5[k] = (dmg == 254); + if (sprite_unk5[k]) { + sprite_defl_bits[k] |= 8; + sprite_flags5[k] &= ~0x80; + SpriteSfx_QueueSfx2WithPan(k, 15); + sprite_z_vel[k] = 24; + sprite_bump_damage[k] &= ~0x80; + Sprite_ZeroVelocity_XY(k); + } + sprite_state[k] = 11; + sprite_delay_main[k] = 64; + static const uint8 kHitTimer24StunValues[5] = {0x20, 0x80, 0, 0, 0xff}; + sprite_stunned[k] = kHitTimer24StunValues[(uint8)(dmg + 5)]; + if (sprite_type[k] == 0x23) + sprite_type[k] = 0x24; + return; + } + + int t = sprite_health[k] - sprite_give_damage[k]; + sprite_health[k] = t; + sprite_give_damage[k] = 0; + if (t > 0) + return; + + if (sprite_die_action[k] == 0) { + if (sprite_state[k] == 11) + sprite_die_action[k] = 3; + if (sprite_unk1[k] != 0) { + sprite_unk1[k] = 0; + sprite_flags5[k] = 0; + } + } + + uint8 type = sprite_type[k]; + if (type != 0x1b) + SpriteSfx_QueueSfx3WithPan(k, 9); + + if (type == 0x40) + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x40; + else if (type == 0xec) { + if (sprite_C[k] == 2) + ThrowableScenery_TransmuteToDebris(k); + return; + } + + if (sprite_state[k] == 10) { + link_state_bits = 0; + link_picking_throw_state = 0; + } + sprite_state[k] = 6; + + if (type == 0xc) { + Sprite_Func3(k); + } else if (type == 0x92) { + Sprite_KillFriends(); + sprite_delay_main[k] = 255; + goto out_common; + } else if (type == 0xcb) { + sprite_ai_state[k] = 128; + sprite_delay_main[k] = 128; + sprite_state[k] = 9; + goto out_common; + } else if (type == 0xcc || type == 0xcd) { + sprite_ai_state[k] = 128; + sprite_delay_main[k] = 96; + sprite_state[k] = 9; + goto out_common; + } else if (type == 0x53) { + sprite_delay_main[k] = 35; + sprite_hit_timer[k] = 0; + goto out_common2; + } else if (type == 0x54) { + sprite_ai_state[k] = 5; + sprite_delay_main[k] = 0xc0; + sprite_hit_timer[k] = 0xc0; + goto out_common; + } else if (type == 0x9) { + sprite_ai_state[k] = 3; + sprite_delay_aux4[k] = 160; + sprite_state[k] = 9; + goto out_common; + } else if (type == 0x7a) { + Sprite_KillFriends(); + sprite_state[k] = 9; + sprite_ignore_projectile[k] = 9; + if (is_in_dark_world == 0) { + sprite_ai_state[k] = 10; + sprite_delay_main[k] = 255; + sprite_z_vel[k] = 32; + } else { + sprite_delay_main[k] = 255; + sprite_ai_state[k] = 8; + sprite_ai_state[1] = 9; + sprite_ai_state[2] = 9; + sprite_graphics[1] = 0; + sprite_graphics[2] = 0; + } + goto out_common; + } else if (type == 0x23 && sprite_C[k] == 0) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 32; + sprite_state[k] = 9; + sprite_hit_timer[k] = 0; + } else if (type == 0xf) { + sprite_hit_timer[k] = 0; + sprite_delay_main[k] = 15; + } else if (!(sprite_flags[k] & 2)) { + sprite_delay_main[k] = sprite_hit_timer[k] & 0x80 ? 31 : 15; + sprite_flags2[k] += 4; + if (tmp_counter == 11) + sprite_flags5[k] = 1; + } else { + if (type != 0xa2) + Sprite_KillFriends(); + sprite_state[k] = 4; + sprite_A[k] = 0; + sprite_delay_main[k] = 255; + sprite_hit_timer[k] = 255; + out_common: + flag_block_link_menu++; + out_common2: + sound_effect_2 = 0; + SpriteSfx_QueueSfx3WithPan(k, 0x22); + } +} + +void Sprite_Func3(int k) { // 86efda + sprite_state[k] = 6; + sprite_delay_main[k] = 31; + sprite_flags2[k] = 3; +} + +bool Sprite_CheckDamageToLink(int k) { // 86f145 + if (link_disable_sprite_damage) + return false; + return Sprite_CheckDamageToPlayer_1(k); +} + +bool Sprite_CheckDamageToPlayer_1(int k) { // 86f14a + if ((k ^ frame_counter) & 3 | sprite_hit_timer[k]) + return false; + return Sprite_CheckDamageToLink_same_layer(k); +} + +bool Sprite_CheckDamageToLink_same_layer(int k) { // 86f154 + if (link_is_on_lower_level != sprite_floor[k]) + return false; + return Sprite_CheckDamageToLink_ignore_layer(k); +} + +bool Sprite_CheckDamageToLink_ignore_layer(int k) { // 86f15c + uint8 carry, t; + if (sprite_flags4[k]) { + SpriteHitBox hitbox; + Link_SetupHitBox(&hitbox); + Sprite_SetupHitBox(k, &hitbox); + carry = CheckIfHitBoxesOverlap(&hitbox); + } else { + carry = Sprite_SetupHitBox00(k); + } + + if (sign8(sprite_flags2[k])) + return carry; + + if (!carry || link_auxiliary_state) + return false; + + if (link_is_bunny_mirror || sign8(link_state_bits) || !(sprite_flags5[k] & 0x20) || !link_shield_type) + goto if_3; + sprite_state[k] = 0; + + t = button_b_frames ? kSpriteDamage_Tab2[link_direction_facing >> 1] : link_direction_facing; + if (t != kSpriteDamage_Tab3[sprite_D[k]]) { +if_3: + Sprite_AttemptDamageToLinkPlusRecoil(k); + if (sprite_type[k] == 0xc) + Sprite_Func3(k); + return true; + } + SpriteSfx_QueueSfx2WithPan(k, 6); + Sprite_PlaceRupulseSpark_2(k); + if (sprite_type[k] == 0x95) { + SpriteSfx_QueueSfx3WithPan(k, 0x26); + return false; + } else if (sprite_type[k] == 0x9B) { + Sprite_Invert_XY_Speeds(k); + sprite_D[k] ^= 1; + sprite_ai_state[k]++; + sprite_state[k] = 9; + return false; + } else if (sprite_type[k] == 0x1B) { // arrow + Sprite_ScheduleForBreakage(k); + return false; // unk ret val + } else if (sprite_type[k] == 0xc) { + Sprite_Func3(k); + return true; + } else { + return false; // unk ret val + } +} + +bool Sprite_SetupHitBox00(int k) { // 86f1f6 + return (uint16)(link_x_coord - cur_sprite_x + 11) < 23 && + (uint16)(link_y_coord - cur_sprite_y + sprite_z[k] + 16) < 24; +} + +bool Sprite_ReturnIfLifted(int k) { // 86f228 + if (submodule_index | button_b_frames | flag_unk1 || sprite_floor[k] != link_is_on_lower_level) + return false; + for (int j = 15; j >= 0; j--) + if (sprite_state[j] == 10) + return false; + if (sprite_type[k] != 0xb && sprite_type[k] != 0x4a && (sprite_x_vel[k] | sprite_y_vel[k]) != 0) + return false; + if (link_is_running) + return false; + return Sprite_ReturnIfLiftedPermissive(k); +} + +bool Sprite_ReturnIfLiftedPermissive(int k) { // 86f257 + if (link_is_running) + return false; + if ((uint8)(flag_is_sprite_to_pick_up_cached - 1) != cur_object_index) { + SpriteHitBox hb; + Link_SetupHitBox_conditional(&hb); + Sprite_SetupHitBox(k, &hb); + if (CheckIfHitBoxesOverlap(&hb)) + byte_7E0FB2 = flag_is_sprite_to_pick_up = k + 1; + return false; + } else { + BYTE(filtered_joypad_L) = 0; + sprite_E[k] = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x1d); + sprite_unk4[k] = sprite_state[k]; + sprite_state[k] = 10; + sprite_delay_main[k] = 16; + sprite_unk3[k] = 0; + sprite_I[k] = 0; + link_direction_facing = kSprite_ReturnIfLifted_Dirs[Sprite_DirectionToFaceLink(k, NULL)]; + return true; + } +} + +uint8 Sprite_CheckDamageFromLink(int k) { // 86f2b4 + if (sprite_hit_timer[k] & 0x80 || sprite_floor[k] != link_is_on_lower_level || player_oam_y_offset == 0x80) + return 0; + + SpriteHitBox hb; + Player_SetupActionHitBox(&hb); + Sprite_SetupHitBox(k, &hb); + if (!CheckIfHitBoxesOverlap(&hb)) + return 0; + + set_when_damaging_enemies = 0; + if (link_position_mode & 0x10) + return kCheckDamageFromPlayer_Carry | kCheckDamageFromPlayer_Ne; + + if (link_item_in_hand & 10) { + if (sprite_type[k] >= 0xd6) + return 0; + if (sprite_state[k] == 11 && sprite_unk5[k] != 0) { + sprite_state[k] = 2; + sprite_delay_main[k] = 32; + sprite_flags2[k] = (sprite_flags2[k] & 0xe0) | 3; + SpriteSfx_QueueSfx2WithPan(k, 0x1f); + return kCheckDamageFromPlayer_Carry | kCheckDamageFromPlayer_Ne; + } + } + uint8 type = sprite_type[k]; + if (type == 0x7b) { + if (!sign8(button_b_frames - 9)) + return 0; + } else if (type == 9) { + if (!sprite_A[k]) { + Sprite_ApplyRecoilToLink(k, 48); + set_when_damaging_enemies = 144; + link_incapacitated_timer = 16; + SpriteSfx_QueueSfx2WithPan(k, 0x21); + sprite_delay_aux1[k] = 48; + sound_effect_2 = Sprite_CalculateSfxPan(k); + Link_PlaceWeaponTink(); + return kCheckDamageFromPlayer_Carry; + } + } else if (type == 0x92) { + if (sprite_C[k] >= 3) + goto is_many; + goto getting_out; + } else if (type == 0x26 || type == 0x13 || type == 2) { + bool cond = (type == 0x13 && kSpriteDamage_Tab3[sprite_D[k]] == link_direction_facing) || (type == 2); + Sprite_AttemptZapDamage(k); + Sprite_ApplyRecoilToLink(k, 32); + set_when_damaging_enemies = 16; + link_incapacitated_timer = 16; + if (cond) { + sprite_hit_timer[k] = 0; + Link_PlaceWeaponTink(); + } + return 0; // what return value? + } else if (type == 0xcb || type == 0xcd || type == 0xcc || type == 0xd6 || type == 0xd7 || type == 0xce || type == 0x54) { +is_many: + Sprite_ApplyRecoilToLink(k, 32); + set_when_damaging_enemies = 144; + link_incapacitated_timer = 16; + } + if (!(sprite_defl_bits[k] & 4)) { + Sprite_AttemptZapDamage(k); + return kCheckDamageFromPlayer_Carry; + } +getting_out: + if (!set_when_damaging_enemies) { + Sprite_ApplyRecoilToLink(k, 4); + link_incapacitated_timer = 16; + set_when_damaging_enemies = 16; + } + Link_PlaceWeaponTink(); + return kCheckDamageFromPlayer_Carry; +} + +void Sprite_AttemptDamageToLinkWithCollisionCheck(int k) { // 86f3ca + if ((k ^ frame_counter) & 1) + return; + SpriteHitBox hb; + Sprite_DoHitBoxesFast(k, &hb); + Link_SetupHitBox_conditional(&hb); + if (CheckIfHitBoxesOverlap(&hb)) + Sprite_AttemptDamageToLinkPlusRecoil(k); +} + +void Sprite_AttemptDamageToLinkPlusRecoil(int k) { // 86f3db + if (countdown_for_blink | link_disable_sprite_damage) + return; + link_incapacitated_timer = 19; + Sprite_ApplyRecoilToLink(k, 24); + link_auxiliary_state = 1; + link_give_damage = kPlayerDamages[3 * (sprite_bump_damage[k] & 0xf) + link_armor]; + if (sprite_type[k] == 0x61 && sprite_C[k]) { + link_actual_vel_x = sprite_x_vel[k] * 2; + link_actual_vel_y = sprite_y_vel[k] * 2; + } +} + +void Player_SetupActionHitBox(SpriteHitBox *hb) { // 86f5e0 + if (link_is_running) { + int j = link_direction_facing >> 1; + int x = link_x_coord + (kPlayerActionBoxRun_XLo[j] | kPlayerActionBoxRun_XHi[j] << 8); + int y = link_y_coord + (kPlayerActionBoxRun_YLo[j] | kPlayerActionBoxRun_YHi[j] << 8); + hb->r0_xlo = x; + hb->r8_xhi = x >> 8; + hb->r1_ylo = y; + hb->r9_yhi = y >> 8; + hb->r2 = hb->r3 = 16; + } else { + int t = 0; + if (!(link_item_in_hand & 10) && !(link_position_mode & 0x10)) { + if (sign8(button_b_frames)) { + int x = link_x_coord - 14; + int y = link_y_coord - 10; + hb->r0_xlo = x; + hb->r8_xhi = x >> 8; + hb->r1_ylo = y; + hb->r9_yhi = y >> 8; + hb->r2 = 44; + hb->r3 = 45; + return; + } else if (kPlayer_SetupActionHitBox_Tab4[button_b_frames]) { + hb->r8_xhi = 0x80; + return; + } + t = link_direction_facing * 8 + button_b_frames + 1; + } + int x = link_x_coord + (int8)(kPlayer_SetupActionHitBox_Tab0[t] + player_oam_x_offset); + int y = link_y_coord + (int8)(kPlayer_SetupActionHitBox_Tab2[t] + player_oam_y_offset); + hb->r0_xlo = x; + hb->r8_xhi = x >> 8; + hb->r1_ylo = y; + hb->r9_yhi = y >> 8; + hb->r2 = kPlayer_SetupActionHitBox_Tab1[t]; + hb->r3 = kPlayer_SetupActionHitBox_Tab3[t]; + } +} + +void Sprite_DoHitBoxesFast(int k, SpriteHitBox *hb) { // 86f645 + if (HIBYTE(dungmap_var8) == 0x80) { + hb->r10_spr_xhi = 0x80; + return; + } + int t; + t = Sprite_GetX(k) + (int8)HIBYTE(dungmap_var8); + hb->r4_spr_xlo = t; + hb->r10_spr_xhi = t >> 8; + t = Sprite_GetY(k) + (int8)BYTE(dungmap_var8); + hb->r5_spr_ylo = t; + hb->r11_spr_yhi = t >> 8; + hb->r6_spr_xsize = hb->r7_spr_ysize = (sprite_type[k] == 0x6a) ? 16 : 3; +} + +void Sprite_ApplyRecoilToLink(int k, uint8 vel) { // 86f688 + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, vel); + link_actual_vel_x = pt.x; + link_actual_vel_y = pt.y; + g_ram[0xc7] = link_actual_vel_z = vel >> 1; + link_z_coord = 0; +} + +void Link_PlaceWeaponTink() { // 86f69f + if (repulsespark_timer) + return; + repulsespark_timer = 5; + int t = (uint8)link_x_coord + player_oam_x_offset; + repulsespark_x_lo = t; + t = (uint8)link_y_coord + player_oam_y_offset + (t >> 8); // carry wtf + repulsespark_y_lo = t; + repulsespark_floor_status = link_is_on_lower_level; + sound_effect_1 = Link_CalculateSfxPan() | 5; +} + +void Sprite_PlaceWeaponTink(int k) { // 86f6ca + if (repulsespark_timer) + return; + SpriteSfx_QueueSfx2WithPan(k, 5); + Sprite_PlaceRupulseSpark_2(k); +} + +void Sprite_PlaceRupulseSpark_2(int k) { // 86f6d5 + uint16 x = Sprite_GetX(k) - BG2HOFS_copy2; + uint16 y = Sprite_GetY(k) - BG2VOFS_copy2; + if (x & ~0xff || y & ~0xff) + return; + repulsespark_x_lo = sprite_x_lo[k]; + repulsespark_y_lo = sprite_y_lo[k]; + repulsespark_timer = 5; + repulsespark_floor_status = sprite_floor[k]; +} + +void Link_SetupHitBox_conditional(SpriteHitBox *hb) { // 86f705 + if (link_disable_sprite_damage) + hb->r9_yhi = 0x80; + else + Link_SetupHitBox(hb); +} + +void Link_SetupHitBox(SpriteHitBox *hb) { // 86f70a + hb->r3 = hb->r2 = 8; + uint16 x = link_x_coord + 4; + hb->r0_xlo = x; + hb->r8_xhi = x >> 8; + uint16 y = link_y_coord + 8; + hb->r1_ylo = y; + hb->r9_yhi = y >> 8; +} + +void Sprite_SetupHitBox(int k, SpriteHitBox *hb) { // 86f7ef + if (sign8(sprite_z[k])) { + hb->r10_spr_xhi = 0x80; + return; + } + int i = sprite_flags4[k] & 0x1f; + int t, u; + + t = sprite_x_lo[k] + (uint8)kSpriteHitbox_XLo[i]; + hb->r4_spr_xlo = t; + t = sprite_x_hi[k] + (uint8)kSpriteHitbox_XHi[i] + (t >> 8); + hb->r10_spr_xhi = t; + + t = sprite_y_lo[k] + (uint8)kSpriteHitbox_YLo[i]; + u = t >> 8; + t = (t & 0xff) - sprite_z[k]; + hb->r5_spr_ylo = t; + t = sprite_y_hi[k] - (t < 0); + hb->r11_spr_yhi = t + u + (uint8)kSpriteHitbox_YHi[i]; + + hb->r6_spr_xsize = kSpriteHitbox_XSize[i]; + hb->r7_spr_ysize = kSpriteHitbox_YSize[i]; +} + +// Returns the carry flag +bool CheckIfHitBoxesOverlap(SpriteHitBox *hb) { // 86f836 + int t, u; + uint8 r15, r12; + + if (hb->r8_xhi == 0x80 || hb->r10_spr_xhi == 0x80) + return false; + + t = hb->r5_spr_ylo - hb->r1_ylo; + r15 = t + hb->r7_spr_ysize; + r12 = hb->r11_spr_yhi - hb->r9_yhi - (t < 0); + t = r12 + (((t & 0xff) + 0x80) >> 8); + if (t & 0xff) + return (t >= 0x100); + if ((uint8)(hb->r3 + hb->r7_spr_ysize) < r15) + return false; + + t = hb->r4_spr_xlo - hb->r0_xlo; + r15 = t + hb->r6_spr_xsize; + r12 = hb->r10_spr_xhi - hb->r8_xhi - (t < 0); + t = r12 + (((t & 0xff) + 0x80) >> 8); + if (t & 0xff) + return (t >= 0x100); + if ((uint8)(hb->r2 + hb->r6_spr_xsize) < r15) + return false; + + return true; +} + +void Oam_AllocateDeferToPlayer(int k) { // 86f86c + if (sprite_floor[k] != link_is_on_lower_level) + return; + PairU8 right = Sprite_IsRightOfLink(k); + if ((uint8)(right.b + 0x10) >= 0x20) + return; + PairU8 below = Sprite_IsBelowLink(k); + if ((uint8)(below.b + 0x20) >= 0x48) + return; + uint8 nslots = ((sprite_flags2[k] & 0x1f) + 1) << 2; + if (below.a) + Oam_AllocateFromRegionC(nslots); + else + Oam_AllocateFromRegionB(nslots); +} + +void SpriteModule_Die(int k) { // 86f8a2 + SpriteDeath_MainEx(k, false); +} + +void Sprite_DoTheDeath(int k) { // 86f923 + uint8 type = sprite_type[k]; + // This is how Vitreous knows whether to come out of his slime pool + if (type == 0xBE) + sprite_G[0]--; + + if (type == 0xaa && sprite_E[k] != 0) { + uint8 bak = sprite_subtype[k]; + PrepareEnemyDrop(k, kPikitDropItems[sprite_E[k] - 1]); + sprite_subtype[k] = bak; + if (bak == 1) { + sprite_oam_flags[k] = 9; + sprite_flags3[k] = 0xf0; + } + sprite_head_dir[k]++; + return; + } + + // Resets the music in the village when the crazy green guards are killed. + if (type == 0x45 && sram_progress_indicator == 2 && BYTE(overworld_area_index) == 0x18) + music_control = 7; + + uint8 drop_item = sprite_die_action[k]; + if (drop_item != 0) { + sprite_subtype[k] = sprite_N[k]; + sprite_N[k] = 255; + uint8 arg = (drop_item == 1) ? 0xe4 : // small key, big key or rupee + (drop_item == 3) ? 0xd9 : 0xe5; + PrepareEnemyDrop(k, arg); + return; + } + + uint8 prize = sprite_flags5[k] & 0xf; + if (prize-- != 0) { + uint8 luck = item_drop_luck; + if (luck != 0) { + if (++luck_kill_counter >= 10) + item_drop_luck = 0; + if (luck == 1) { + ForcePrizeDrop(k, prize, 1); + return; + } + } else { + if (!(GetRandomNumber() & kPrizeMasks[prize])) { + ForcePrizeDrop(k, prize, prize); + return; + } + } + } + sprite_state[k] = 0; + SpriteDeath_Func4(k); +} + +void ForcePrizeDrop(int k, uint8 prize, uint8 slot) { // 86f9bc + prize = prize * 8 | prizes_arr1[slot]; + prizes_arr1[slot] = (prizes_arr1[slot] + 1) & 7; + PrepareEnemyDrop(k, kPrizeItems[prize]); +} + +void PrepareEnemyDrop(int k, uint8 item) { // 86f9d1 + sprite_type[k] = item; + if (item == 0xe5) + SpritePrep_BigKey_load_graphics(k); + else if (item == 0xe4) + SpritePrep_KeySetItemDrop(k); + + sprite_state[k] = 9; + uint8 zbak = sprite_z[k]; + SpritePrep_LoadProperties(k); + sprite_ignore_projectile[k]++; + + uint8 pz = kPrizeZ[sprite_type[k] - 0xd8]; + sprite_z_vel[k] = pz & 0xf0; + Sprite_SetX(k, Sprite_GetX(k) + (pz & 0xf)); + sprite_z[k] = zbak; + sprite_delay_aux4[k] = 21; + sprite_stunned[k] = 255; + SpriteDeath_Func4(k); +} + +void SpriteDeath_Func4(int k) { // 86fa25 + if (sprite_type[k] == 0xa2 && Sprite_CheckIfScreenIsClear()) + Ancilla_SpawnFallingPrize(4); + Sprite_ManuallySetDeathFlagUW(k); + num_sprites_killed++; + if (sprite_type[k] == 0x40) { + // evil barrier + sprite_state[k] = 9; + sprite_graphics[k] = 4; + SpriteDeath_MainEx(k, true); + } +} + +void SpriteDeath_DrawPoof(int k) { // 86fb2a + if (dung_hdr_collision == 4) + sprite_obj_prio[k] = 0x30; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + uint8 r12 = (sprite_flags3[k] & 0x20) >> 3; + int i = ((sprite_delay_main[k] & 0x1c) ^ 0x1c) + 3, n = 3; + do { + if (kPerishOverlay_Char[i]) { + oam->charnum = kPerishOverlay_Char[i]; + oam->y = HIBYTE(dungmap_var7) - r12 + kPerishOverlay_Y[i]; + oam->x = BYTE(dungmap_var7) - r12 + kPerishOverlay_X[i]; + oam->flags = (info.flags & 0x30) | kPerishOverlay_Flags[i]; + } + } while (oam++, i--, --n >= 0); + Sprite_CorrectOamEntries(k, 3, 0); +} + +void SpriteModule_Fall2(int k) { // 86fbea + uint8 delay = sprite_delay_main[k]; + if (!delay) { + sprite_state[k] = 0; + Sprite_ManuallySetDeathFlagUW(k); + return; + } + + if (delay >= 0x40) { + if (sprite_oam_flags[k] != 5) { + if (!(delay & 7 | submodule_index | flag_unk1)) + SpriteSfx_QueueSfx3WithPan(k, 0x31); + SpriteActive_Main(k); + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Sprite_DrawDistress_custom(info.x, info.y - 8, delay + 20); + return; + } + sprite_delay_main[k] = delay = 63; + } + + if (delay == 61) + SpriteSfx_QueueSfx2WithPan(k, 0x20); + + int j = delay >> 1; + + if (sprite_type[k] == 0x26 || sprite_type[k] == 0x13) { + sprite_graphics[k] = kSpriteFall_Tab2[j]; + SpriteDraw_FallingHelmaBeetle(k); + } else { + uint8 t = kSpriteFall_Tab1[j]; + if (t < 12) + t += kSpriteFall_Tab4[sprite_D[k]]; + sprite_graphics[k] = t; + SpriteDraw_FallingHumanoid(k); + } + if (frame_counter & kSpriteFall_Tab3[sprite_delay_main[k] >> 3] | submodule_index) + return; + Sprite_CheckTileProperty(k, 0x68); + if (sprite_tiletype != 0x20) { + sprite_y_recoil[k] = 0; + sprite_x_recoil[k] = 0; + } + sprite_y_vel[k] = (int8)sprite_y_recoil[k] >> 2; + sprite_x_vel[k] = (int8)sprite_x_recoil[k] >> 2; + Sprite_MoveXY(k); +} + +void SpriteDraw_FallingHelmaBeetle(int k) { // 86fd17 + PrepOamCoordsRet info; + const DrawMultipleData *src = kSpriteDrawFall0Data + sprite_graphics[k]; + if (sprite_type[k] == 0x13) + src += 6; + Sprite_DrawMultiple(k, src, 1, &info); +} + +void SpriteDraw_FallingHumanoid(int k) { // 86fe5b + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + + int q = sprite_graphics[k]; + OamEnt *oam = GetOamCurPtr(); + int n = (q < 12 && (q & 3) == 0) ? 3 : 0, nn = n; + do { + int i = q * 4 + n; + oam->x = info.x + kSpriteDrawFall1_X[i]; + oam->y = info.y + kSpriteDrawFall1_Y[i]; + oam->charnum = kSpriteDrawFall1_Char[i]; + oam->flags = info.flags ^ kSpriteDrawFall1_Flags[i]; + bytewise_extended_oam[oam - oam_buf] = kSpriteDrawFall1_Ext[i]; + } while (oam++, --n >= 0); + Sprite_CorrectOamEntries(k, nn, 0xff); +} + +void Sprite_CorrectOamEntries(int k, int n, uint8 islarge) { // 86febc + OamEnt *oam = GetOamCurPtr(); + uint8 *extp = &g_ram[oam_ext_cur_ptr]; + uint16 spr_x = Sprite_GetX(k); + uint16 spr_y = Sprite_GetY(k); + uint8 scrollx = spr_x - BG2HOFS_copy2; + uint8 scrolly = spr_y - BG2VOFS_copy2; + do { + uint16 x = spr_x + (int8)(oam->x - scrollx); + uint16 y = spr_y + (int8)(oam->y - scrolly); + uint8 ext = sign8(islarge) ? (*extp & 2) : islarge; + *extp = ext + ((uint16)(x - BG2HOFS_copy2) >= 0x100); + if ((uint16)(y + 0x10 - BG2VOFS_copy2) >= 0x100) + oam->y = 0xf0; + } while (oam++, extp++, --n >= 0); +} + +bool Sprite_ReturnIfRecoiling(int k) { // 86ff78 + if (!sprite_F[k]) + return false; + if (!(sprite_F[k] & 0x7f)) { + sprite_F[k] = 0; + return false; + } + uint8 yvbak = sprite_y_vel[k]; + uint8 xvbak = sprite_x_vel[k]; + if (!--sprite_F[k] && ((uint8)(sprite_x_recoil[k] + 0x20) >= 0x40 || (uint8)(sprite_y_recoil[k] + 0x20) >= 0x40)) + sprite_F[k] = 144; + + int i = sprite_F[k]; + uint8 t; + if (!sign8(i) && !(frame_counter & kSprite2_ReturnIfRecoiling_Masks[i>>2])) { + sprite_y_vel[k] = sprite_y_recoil[k]; + sprite_x_vel[k] = sprite_x_recoil[k]; + if (!sign8(sprite_bump_damage[k]) && (t = (Sprite_CheckTileCollision(k) & 0xf))) { + if (t < 4) + sprite_x_recoil[k] = sprite_x_vel[k] = 0; + else + sprite_y_recoil[k] = sprite_y_vel[k] = 0; + } else { + Sprite_MoveXY(k); + } + } + sprite_y_vel[k] = yvbak; + sprite_x_vel[k] = xvbak; + return sprite_type[k] != 0x7a; +} + +bool Sprite_CheckIfLinkIsBusy() { // 87f4d0 + if (link_auxiliary_state | link_pose_for_item | (link_state_bits & 0x80)) + return true; + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 0x27) + return true; + } + return false; +} + +void Sprite_SetSpawnedCoordinates(int k, SpriteSpawnInfo *info) { // 89ae64 + sprite_x_lo[k] = info->r0_x; + sprite_x_hi[k] = info->r0_x >> 8; + sprite_y_lo[k] = info->r2_y; + sprite_y_hi[k] = info->r2_y >> 8; + sprite_z[k] = info->r4_z; +} + +bool Sprite_CheckIfScreenIsClear() { // 89af32 + for (int i = 15; i >= 0; i--) { + if (sprite_state[i] && !(sprite_flags4[i] & 0x40)) { + uint16 x = Sprite_GetX(i) - BG2HOFS_copy2; + uint16 y = Sprite_GetY(i) - BG2VOFS_copy2; + if (x < 256 && y < 256) + return false; + } + } + return Sprite_CheckIfOverlordsClear(); +} + +bool Sprite_CheckIfRoomIsClear() { // 89af61 + for (int i = 15; i >= 0; i--) { + if (sprite_state[i] && !(sprite_flags4[i] & 0x40)) + return false; + } + return Sprite_CheckIfOverlordsClear(); +} + +bool Sprite_CheckIfOverlordsClear() { // 89af76 + for (int i = 7; i >= 0; i--) { + if (overlord_type[i] == 0x14 || overlord_type[i] == 0x18) + return false; + } + return true; +} + +void Sprite_InitializeMirrorPortal() { // 89af89 + for (int k = 15; k >= 0; k--) { + if (sprite_state[k] && sprite_type[k] == 0x6c) + sprite_state[k] = 0; + } + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(0xff, 0x6c, &info); + if (j < 0) + j = 0; + + Sprite_SetX(j, bird_travel_x_hi[15] << 8 | bird_travel_x_lo[15]); + Sprite_SetY(j, (bird_travel_y_hi[15] << 8 | bird_travel_y_lo[15]) + 8); + + sprite_floor[j] = 0; + sprite_ignore_projectile[j] = 1; +} + +void Sprite_InitializeSlots() { // 89afd6 + for (int k = 15; k >= 0; k--) { + uint8 st = sprite_state[k], ty = sprite_type[k]; + if (st != 0) { + if (st == 10) { + if (ty != 0xec && ty != 0xd2) { + link_picking_throw_state = 0; + link_state_bits = 0; + sprite_state[k] = 0; + } + } else { + if (ty != 0x6c && sprite_room[k] != BYTE(overworld_area_index)) + sprite_state[k] = 0; + } + } + } + for (int k = 7; k >= 0; k--) { + if (overlord_type[k] && overlord_spawned_in_area[k] != BYTE(overworld_area_index)) + overlord_type[k] = 0; + } +} + +void Garnish_ExecuteUpperSlots() { // 89b08c + HandleScreenFlash(); + + if (garnish_active) { + for (int i = 29; i >= 15; i--) + Garnish_ExecuteSingle(i); + } +} + +void Garnish_ExecuteLowerSlots() { // 89b097 + if (garnish_active) { + for (int i = 14; i >= 0; i--) + Garnish_ExecuteSingle(i); + } +} + +void Garnish_ExecuteSingle(int k) { // 89b0b6 + cur_object_index = k; + uint8 type = garnish_type[k]; + if (type == 0) + return; + if ((type == 5 || (submodule_index | flag_unk1) == 0) && garnish_countdown[k] != 0 && --garnish_countdown[k] == 0) { + garnish_type[k] = 0; + return; + } + uint8 sprsize = kGarnish_OamMemSize[garnish_type[k]]; + if (sort_sprites_setting) { + if (garnish_floor[k]) + Oam_AllocateFromRegionF(sprsize); + else + Oam_AllocateFromRegionD(sprsize); + } else { + Oam_AllocateFromRegionA(sprsize); + } + kGarnish_Funcs[garnish_type[k] - 1](k); +} + +void Garnish15_ArrghusSplash(int k) { // 89b178 + static const int8 kArrghusSplash_X[8] = {-12, 20, -10, 10, -8, 8, -4, 4}; + static const int8 kArrghusSplash_Y[8] = {-4, -4, -2, -2, 0, 0, 0, 0}; + static const uint8 kArrghusSplash_Char[8] = {0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xac, 0xac}; + static const uint8 kArrghusSplash_Flags[8] = {0x34, 0x74, 0x34, 0x74, 0x34, 0x74, 0x34, 0x74}; + static const uint8 kArrghusSplash_Ext[8] = {0, 0, 2, 2, 2, 2, 2, 2}; + + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = (garnish_countdown[k] >> 1) & 6; + for (int i = 1; i >= 0; i--) { + int j = i + g; + oam->x = pt.x + kArrghusSplash_X[j]; + oam->y = pt.y + kArrghusSplash_Y[j]; + oam->charnum = kArrghusSplash_Char[j]; + oam->flags = kArrghusSplash_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = kArrghusSplash_Ext[j]; + oam++; + } +} + +void Garnish13_PyramidDebris(int k) { // 89b216 + OamEnt *oam = GetOamCurPtr(); + + int y = (garnish_y_lo[k] << 8) + garnish_y_subpixel[k] + ((int8)garnish_y_vel[k] << 4); + garnish_y_subpixel[k] = y; + garnish_y_lo[k] = y >> 8; + + int x = (garnish_x_lo[k] << 8) + garnish_x_subpixel[k] + ((int8)garnish_x_vel[k] << 4); + garnish_x_subpixel[k] = x; + garnish_x_lo[k] = x >> 8; + + garnish_y_vel[k] = garnish_y_vel[k] + 3; + uint8 t; + if ((t = garnish_x_lo[k] - BG2HOFS_copy2) >= 248) { + garnish_type[k] = 0; + return; + } + oam->x = t; + if ((t = garnish_y_lo[k] - BG2VOFS_copy2) >= 240) { + garnish_type[k] = 0; + return; + } + oam->y = t; + oam->charnum = 0x5c; + oam->flags = (frame_counter << 3) & 0xc0 | 0x34; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Garnish11_WitheringGanonBatFlame(int k) { // 89b2b2 + if ((submodule_index | flag_unk1) == 0) { + Garnish_SetY(k, Garnish_GetY(k) - 1); + } + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam[0].x = pt.x; + oam[0].y = pt.y; + oam[1].x = pt.x + 8; + oam[1].y = pt.y; + oam[0].charnum = 0xa4; + oam[1].charnum = 0xa5; + oam[0].flags = 0x22; + oam[1].flags = 0x22; + bytewise_extended_oam[oam - oam_buf] = 0; + bytewise_extended_oam[oam - oam_buf + 1] = 0; +} + +void Garnish10_GanonBatFlame(int k) { // 89b306 + static const uint8 kGanonBatFlame_Idx[32] = { + 7, 6, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, + 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, + }; + static const uint8 kGanonBatFlame_Char[7] = {0xac, 0xac, 0x66, 0x66, 0x8e, 0xa0, 0xa2}; + static const uint8 kGanonBatFlame_Flags[7] = {1, 0x41, 1, 0x41, 0, 0, 0}; + + if (garnish_countdown[k] == 8) + garnish_type[k] = 0x11; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + int j = kGanonBatFlame_Idx[garnish_countdown[k] >> 3]; + oam->charnum = kGanonBatFlame_Char[j]; + oam->flags = kGanonBatFlame_Flags[j] | 0x22; + bytewise_extended_oam[oam - oam_buf] = 2; + Garnish_CheckPlayerCollision(k, pt.x, pt.y); +} + +void Garnish0C_TrinexxIceBreath(int k) { // 89b34f + static const uint8 kTrinexxIce_Char[12] = {0xe8, 0xe8, 0xe6, 0xe6, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4}; + static const uint8 kTrinexxIce_Flags[4] = {0, 0x40, 0xc0, 0x80}; + + if (garnish_countdown[k] == 0x50 && (submodule_index | flag_unk1) == 0) { + Dungeon_UpdateTileMapWithCommonTile(Garnish_GetX(k), Garnish_GetY(k) - 16, 18); + } + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kTrinexxIce_Char[garnish_countdown[k] >> 4]; + oam->flags = kTrinexxIce_Flags[(garnish_countdown[k] >> 2) & 3] | 0x35; + bytewise_extended_oam[oam - oam_buf] = 2; +} + +void Garnish14_KakKidDashDust(int k) { // 89b3bc + Garnish_DustCommon(k, 2); +} + +void Garnish_WaterTrail(int k) { // 89b3c2 + Garnish_DustCommon(k, 3); +} + +void Garnish0A_CannonSmoke(int k) { // 89b3ee + static const uint8 kGarnish_CannonPoof_Char[2] = { 0x8a, 0x86 }; + static const uint8 kGarnish_CannonPoof_Flags[4] = { 0x20, 0x10, 0x30, 0x30 }; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kGarnish_CannonPoof_Char[garnish_countdown[k] >> 3]; + int j = garnish_sprite[k]; + oam->flags = kGarnish_CannonPoof_Flags[j] | 4; + bytewise_extended_oam[oam - oam_buf] = 2; +} + +void Garnish09_LightningTrail(int k) { // 89b429 + static const uint8 kLightningTrail_Char[8] = {0xcc, 0xec, 0xce, 0xee, 0xcc, 0xec, 0xce, 0xee}; + static const uint8 kLightningTrail_Flags[8] = {0x31, 0x31, 0x31, 0x31, 0x71, 0x71, 0x71, 0x71}; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + int j = garnish_sprite[k]; + oam->charnum = kLightningTrail_Char[j] - (BYTE(dungeon_room_index2) == 0x20 ? 0x80 : 0); + oam->flags = (frame_counter << 1) & 0xe | kLightningTrail_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = 2; + Garnish_CheckPlayerCollision(k, pt.x, pt.y); +} + +void Garnish_CheckPlayerCollision(int k, int x, int y) { // 89b459 + if ((k ^ frame_counter) & 7 | countdown_for_blink | link_disable_sprite_damage) + return; + + if ((uint8)(link_x_coord - BG2HOFS_copy2 - x + 12) < 24 && + (uint8)(link_y_coord - BG2VOFS_copy2 - y + 22) < 28) { + link_auxiliary_state = 1; + link_incapacitated_timer = 16; + link_give_damage = 16; + link_actual_vel_x ^= 255; + link_actual_vel_y ^= 255; + } +} + +void Garnish07_BabasuFlash(int k) { // 89b49e + static const uint8 kBabusuFlash_Char[4] = {0xa8, 0x8a, 0x86, 0x86}; + static const uint8 kBabusuFlash_Flags[4] = {0x2d, 0x2c, 0x2c, 0x2c}; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + int j = garnish_countdown[k] >> 3; + oam->charnum = kBabusuFlash_Char[j]; + oam->flags = kBabusuFlash_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = 2; +} + +void Garnish08_KholdstareTrail(int k) { // 89b4c6 + static const int8 kGarnish_Nebule_XY[3] = { -1, -1, 0 }; + static const uint8 kGarnish_Nebule_Char[3] = { 0x9c, 0x9d, 0x8d }; + + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + int i = garnish_countdown[k] >> 2; + oam->x = pt.x + kGarnish_Nebule_XY[i]; + oam->y = pt.y + kGarnish_Nebule_XY[i]; + oam->charnum = kGarnish_Nebule_Char[i]; + int j = garnish_sprite[k]; + oam->flags = (sprite_oam_flags[j] | sprite_obj_prio[j]) & ~1; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Garnish06_ZoroTrail(int k) { // 89b4fb + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = 0x75; + int j = garnish_sprite[k]; + oam->flags = sprite_oam_flags[j] | sprite_obj_prio[j]; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Garnish12_Sparkle(int k) { // 89b520 + Garnish_SparkleCommon(k, 2); +} + +void Garnish_SimpleSparkle(int k) { // 89b526 + Garnish_SparkleCommon(k, 3); +} + +void Garnish0E_TrinexxFireBreath(int k) { // 89b55d + static const uint8 kTrinexxLavaBubble_Char[4] = {0x83, 0xc7, 0x80, 0x9d}; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kTrinexxLavaBubble_Char[garnish_countdown[k] >> 3]; + int j = garnish_sprite[k]; + oam->flags = (sprite_oam_flags[j] | sprite_obj_prio[j]) & 0xf0 | 0xe; + bytewise_extended_oam[oam - oam_buf] = 0; + +} + +void Garnish0F_BlindLaserTrail(int k) { // 89b591 + static const uint8 kBlindLaserTrail_Char[4] = {0x61, 0x71, 0x70, 0x60}; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kBlindLaserTrail_Char[garnish_oam_flags[k] - 7]; + int j = garnish_sprite[k]; + oam->flags = sprite_oam_flags[j] | sprite_obj_prio[j]; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +void Garnish04_LaserTrail(int k) { // 89b5bb + static const uint8 kLaserBeamTrail_Char[2] = {0xd2, 0xf3}; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = kLaserBeamTrail_Char[garnish_oam_flags[k]]; + oam->flags = 0x25; + bytewise_extended_oam[oam - oam_buf] = 0; +} + +bool Garnish_ReturnIfPrepFails(int k, Point16U *pt) { // 89b5de + uint16 x = Garnish_GetX(k) - BG2HOFS_copy2; + uint16 y = Garnish_GetY(k) - BG2VOFS_copy2; + + if (x >= 256 || y >= 256) { + garnish_type[k] = 0; + return true; + } + pt->x = x; + pt->y = y - 16; + return false; +} + +void Garnish03_FallingTile(int k) { // 89b627 + static const uint8 kCrumbleTile_XY[5] = {4, 0, 0, 0, 0}; + static const uint8 kCrumbleTile_Char[5] = {0x80, 0xcc, 0xcc, 0xea, 0xca}; + static const uint8 kCrumbleTile_Flags[5] = {0x30, 0x31, 0x31, 0x31, 0x31}; + static const uint8 kCrumbleTile_Ext[5] = {0, 2, 2, 2, 2}; + + int j; + if ((j = garnish_countdown[k]) == 0x1e && (j = (submodule_index | flag_unk1)) == 0) + Dungeon_UpdateTileMapWithCommonTile(Garnish_GetX(k), Garnish_GetY(k) - 16, 4); + j >>= 3; + + uint16 x = Garnish_GetX(k) + kCrumbleTile_XY[j] - BG2HOFS_copy2; + uint16 y = Garnish_GetY(k) + kCrumbleTile_XY[j] - BG2VOFS_copy2; + + if (x < 256 && y < 256) { + OamEnt *oam = GetOamCurPtr(); + oam->x = x; + oam->y = y - 16; + oam->charnum = kCrumbleTile_Char[j]; + oam->flags = kCrumbleTile_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = kCrumbleTile_Ext[j]; + } +} + +void Garnish01_FireSnakeTail(int k) { // 89b6c0 + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + OamEnt *oam = GetOamCurPtr(); + oam->x = pt.x; + oam->y = pt.y; + oam->charnum = 0x28; + int j = garnish_sprite[k]; + oam->flags = sprite_oam_flags[j] | sprite_obj_prio[j]; + bytewise_extended_oam[oam - oam_buf] = 2; +} + +void Garnish02_MothulaBeamTrail(int k) { // 89b6e1 + OamEnt *oam = GetOamCurPtr(); + oam->x = garnish_x_lo[k] - BG2HOFS_copy2; + oam->y = garnish_y_lo[k] - BG2VOFS_copy2; + oam->charnum = 0xaa; + int j = garnish_sprite[k]; + oam->flags = sprite_oam_flags[j] | sprite_obj_prio[j]; + bytewise_extended_oam[oam - oam_buf] = 2; +} + +void Dungeon_ResetSprites() { // 89c114 + Dungeon_CacheTransSprites(); + link_picking_throw_state = 0; + link_state_bits = 0; + Sprite_DisableAll(); + sprcoll_x_size = sprcoll_y_size = 0xffff; + int j = FindInWordArray(dungeon_room_history, dungeon_room_index2, 4); + if (j < 0) { + uint16 blk = dungeon_room_history[3]; + dungeon_room_history[3] = dungeon_room_history[2]; + dungeon_room_history[2] = dungeon_room_history[1]; + dungeon_room_history[1] = dungeon_room_history[0]; + dungeon_room_history[0] = dungeon_room_index2; + if (blk != 0xffff) + sprite_where_in_room[blk] = 0; + } + Dungeon_LoadSprites(); +} + +void Dungeon_CacheTransSprites() { // 89c176 + if (!player_is_indoors) + return; + alt_sprites_flag = player_is_indoors; + for (int k = 15; k >= 0; k--) { + alt_sprite_state[k] = 0; + alt_sprite_type[k] = sprite_type[k]; + alt_sprite_x_lo[k] = sprite_x_lo[k]; + alt_sprite_graphics[k] = sprite_graphics[k]; + alt_sprite_x_hi[k] = sprite_x_hi[k]; + alt_sprite_y_lo[k] = sprite_y_lo[k]; + alt_sprite_y_hi[k] = sprite_y_hi[k]; + if (sprite_pause[k] != 0 || sprite_state[k] == 4 || sprite_state[k] == 10) + continue; + alt_sprite_state[k] = sprite_state[k]; + alt_sprite_A[k] = sprite_A[k]; + alt_sprite_head_dir[k] = sprite_head_dir[k]; + alt_sprite_oam_flags[k] = sprite_oam_flags[k]; + alt_sprite_obj_prio[k] = sprite_obj_prio[k]; + alt_sprite_D[k] = sprite_D[k]; + alt_sprite_flags2[k] = sprite_flags2[k]; + alt_sprite_floor[k] = sprite_floor[k]; + alt_sprite_spawned_flag[k] = sprite_ai_state[k]; + alt_sprite_flags3[k] = sprite_flags3[k]; + alt_sprite_B[k] = sprite_B[k]; + alt_sprite_C[k] = sprite_C[k]; + alt_sprite_E[k] = sprite_E[k]; + alt_sprite_subtype2[k] = sprite_subtype2[k]; + alt_sprite_height_above_shadow[k] = sprite_z[k]; + alt_sprite_delay_main[k] = sprite_delay_main[k]; + alt_sprite_I[k] = sprite_I[k]; + alt_sprite_maybe_ignore_projectile[k] = sprite_ignore_projectile[k]; + } +} + +void Sprite_DisableAll() { // 89c22f + for (int k = 15; k >= 0; k--) { + if (sprite_state[k] && (player_is_indoors || sprite_type[k] != 0x6c)) + sprite_state[k] = 0; + } + for (int k = 9; k >= 0; k--) + ancilla_type[k] = 0; + flag_is_ancilla_to_pick_up = 0; + sprite_limit_instance = 0; + byte_7E0B9B = 0; + byte_7E0B88 = 0; + archery_game_arrows_left = 0; + garnish_active = 0; + byte_7E0B9E = 0; + activate_bomb_trap_overlord = 0; + intro_times_pal_flash = 0; + byte_7E0FF8 = 0; + byte_7E0FFB = 0; + flag_block_link_menu = 0; + byte_7E0FFD = 0; + byte_7E0FC6 = 0; + byte_7E03FC = 0; + for (int k = 7; k >= 0; k--) + overlord_type[k] = 0; + for (int k = 29; k >= 0; k--) + garnish_type[k] = 0; +} + +void Dungeon_LoadSprites() { // 89c290 + const uint8 *src = kDungeonSprites + kDungeonSpriteOffs[dungeon_room_index2]; + byte_7E0FB1 = dungeon_room_index2 >> 3 & 0xfe; + byte_7E0FB0 = (dungeon_room_index2 & 0xf) << 1; + sort_sprites_setting = *src++; + for (int k = 0; *src != 0xff; src += 3) + k = Dungeon_LoadSingleSprite(k, src) + 1; +} + +void Sprite_ManuallySetDeathFlagUW(int k) { // 89c2f5 + if (!player_is_indoors || sprite_defl_bits[k] & 1 || sign8(sprite_N[k])) + return; + sprite_where_in_room[dungeon_room_index2] |= 1 << sprite_N[k]; +} + +int Dungeon_LoadSingleSprite(int k, const uint8 *src) { // 89c327 + uint8 y = src[0], x = src[1], type = src[2]; + if (type == 0xe4) { + if (y == 0xfe || y == 0xfd) { + sprite_die_action[k - 1] = (y == 0xfe) ? 1 : 2; + return k - 1; + } + } else if (x >= 0xe0) { + Dungeon_LoadSingleOverlord(src); + return k - 1; + } + if (!(kSpriteInit_DeflBits[type] & 1) && (sprite_where_in_room[dungeon_room_index2] & (1 << k))) + return k; + sprite_state[k] = 8; + tmp_counter = y; + sprite_floor[k] = (y >> 7); + Sprite_SetY(k, ((y << 4) & 0x1ff) + (byte_7E0FB1 << 8)); + byte_7E0FB6 = x; + Sprite_SetX(k, ((x << 4) & 0x1ff) + (byte_7E0FB0 << 8)); + sprite_type[k] = type; + tmp_counter = (tmp_counter & 0x60) >> 2; + sprite_subtype[k] = tmp_counter | byte_7E0FB6 >> 5; + sprite_N[k] = k; + sprite_die_action[k] = 0; + return k; +} + +void Dungeon_LoadSingleOverlord(const uint8 *src) { // 89c3e8 + int k = AllocOverlord(); + if (k < 0) + return; + uint8 y = src[0], x = src[1], type = src[2]; + overlord_type[k] = type; + overlord_floor[k] = (y >> 7); + int t = ((y << 4) & 0x1ff) + (byte_7E0FB1 << 8); + overlord_y_lo[k] = t; + overlord_y_hi[k] = t >> 8; + t = ((x << 4) & 0x1ff) + (byte_7E0FB0 << 8); + overlord_x_lo[k] = t; + overlord_x_hi[k] = t >> 8; + overlord_spawned_in_area[k] = overworld_area_index; + overlord_gen2[k] = 0; + overlord_gen1[k] = 0; + overlord_gen3[k] = 0; + if (overlord_type[k] == 10 || overlord_type[k] == 11) { + overlord_gen2[k] = 160; + } else if (overlord_type[k] == 3) { + overlord_gen2[k] = 255; + overlord_x_lo[k] -= 8; + } +} + +void Sprite_ResetAll() { // 89c44e + Sprite_DisableAll(); + Sprite_ResetAll_noDisable(); +} + +void Sprite_ResetAll_noDisable() { // 89c452 + byte_7E0FDD = 0; + sprite_alert_flag = 0; + byte_7E0FFD = 0; + byte_7E02F0 = 0; + byte_7E0FC6 = 0; + sprite_limit_instance = 0; + sort_sprites_setting = 0; + if (savegame_tagalong != 13) + super_bomb_indicator_unk2 = 0xfe; + memset(sprite_where_in_room, 0, 0x1000); + memset(overworld_sprite_was_loaded, 0, 0x200); + memset(dungeon_room_history, 0xff, 8); +} + +void Sprite_ReloadAll_Overworld() { // 89c499 + Sprite_DisableAll(); + Sprite_OverworldReloadAll_justLoad(); +} + +void Sprite_OverworldReloadAll_justLoad() { // 89c49d + Sprite_ResetAll_noDisable(); + Overworld_LoadSprites(); + Sprite_ActivateAllProxima(); +} + +void Overworld_LoadSprites() { // 89c4ac + sprcoll_x_base = (overworld_area_index & 7) << 9; + sprcoll_y_base = ((overworld_area_index & 0x3f) >> 2 & 0xe) << 8; + sprcoll_x_size = sprcoll_y_size = kOverworldAreaSprcollSizes[BYTE(overworld_area_index)] << 8; + const uint8 *src = GetOverworldSpritePtr(overworld_area_index); + uint8 b; + + for (; (b = src[0]) != 0xff; src += 3) { + if (src[2] == 0xf4) { + byte_7E0FFD++; + continue; + } + uint8 r2 = (src[0] >> 4) << 2; + uint8 r6 = (src[1] >> 4) + r2; + uint8 r5 = src[1] & 0xf | src[0] << 4; + sprite_where_in_overworld[r5 | r6 << 8] = src[2] + 1; + } +} + +void Sprite_ActivateAllProxima() { // 89c55e + uint16 bak0 = BG2HOFS_copy2; + uint8 bak1 = byte_7E069E[1]; + byte_7E069E[1] = 0xff; + for (int i = 21; i >= 0; i--) { + Sprite_ActivateWhenProximal(); + BG2HOFS_copy2 += 16; + } + byte_7E069E[1] = bak1; + BG2HOFS_copy2 = bak0; +} + +void Sprite_ProximityActivation() { // 89c58f + if (submodule_index != 0) { + Sprite_ActivateWhenProximal(); + Sprite_ActivateWhenProximalBig(); + } else { + if (!(spr_ranged_based_toggler & 1)) + Sprite_ActivateWhenProximal(); + if (spr_ranged_based_toggler & 1) + Sprite_ActivateWhenProximalBig(); + spr_ranged_based_toggler++; + } +} + +void Sprite_ActivateWhenProximal() { // 89c5bb + if (byte_7E069E[1]) { + uint16 x = BG2HOFS_copy2 + (sign8(byte_7E069E[1]) ? -0x10 : 0x110); + uint16 y = BG2VOFS_copy2 - 48; + for (int i = 21; i >= 0; i--, y += 16) + Sprite_Overworld_ProximityMotivatedLoad(x, y); + } +} + +void Sprite_ActivateWhenProximalBig() { // 89c5fa + if (byte_7E069E[0]) { + uint16 x = BG2HOFS_copy2 - 48; + uint16 y = BG2VOFS_copy2 + (sign8(byte_7E069E[0]) ? -0x10 : 0x110); + for (int i = 21; i >= 0; i--, x += 16) + Sprite_Overworld_ProximityMotivatedLoad(x, y); + } +} + +void Sprite_Overworld_ProximityMotivatedLoad(uint16 x, uint16 y) { // 89c6f5 + uint16 xt = (uint16)(x - sprcoll_x_base); + uint16 yt = (uint16)(y - sprcoll_y_base); + if (xt >= sprcoll_x_size || yt >= sprcoll_y_size) + return; + + uint8 r1 = (yt >> 8) * 4 | (xt >> 8); + uint8 r0 = y & 0xf0 | x >> 4 & 0xf; + Overworld_LoadProximaSpriteIfAlive(r1 << 8 | r0); +} + +void Overworld_LoadProximaSpriteIfAlive(uint16 blk) { // 89c739 + uint8 *p5 = sprite_where_in_overworld + blk; + uint8 sprite_to_spawn = *p5; + if (!sprite_to_spawn) + return; + + uint8 loadedmask = (0x80 >> (blk & 7)); + uint8 *loadedp = &overworld_sprite_was_loaded[blk >> 3]; + + if (*loadedp & loadedmask) + return; + + if (sprite_to_spawn >= 0xf4) { + // load overlord + int k = AllocOverlord(); + if (k < 0) + return; + *loadedp |= loadedmask; + overlord_offset_sprite_pos[k] = blk; + overlord_type[k] = sprite_to_spawn - 0xf3; + overlord_x_lo[k] = (blk << 4 & 0xf0) + (overlord_type[k] == 1 ? 8 : 0); + overlord_y_lo[k] = blk & 0xf0; + overlord_x_hi[k] = (blk >> 8 & 3) + HIBYTE(sprcoll_x_base); + overlord_y_hi[k] = (blk >> 10) + HIBYTE(sprcoll_y_base); + overlord_floor[k] = 0; + overlord_spawned_in_area[k] = overworld_area_index; + overlord_gen2[k] = 0; + overlord_gen1[k] = 0; + overlord_gen3[k] = 0; + } else { + // load regular sprite + int k = Overworld_AllocSprite(sprite_to_spawn); + if (k < 0) + return; + *loadedp |= loadedmask; + + sprite_N_word[k] = blk; + sprite_type[k] = sprite_to_spawn - 1; + sprite_state[k] = 8; + sprite_x_lo[k] = blk << 4 & 0xf0; + sprite_y_lo[k] = blk & 0xf0; + sprite_x_hi[k] = (blk >> 8 & 3) + HIBYTE(sprcoll_x_base); + sprite_y_hi[k] = (blk >> 10) + HIBYTE(sprcoll_y_base); + sprite_floor[k] = 0; + sprite_subtype[k] = 0; + sprite_die_action[k] = 0; + } +} + +void SpriteExplode_SpawnEA(int k) { // 89ee4c + tmp_counter = sprite_type[k]; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xea, &info, 14); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_z_vel[j] = 32; + sprite_floor[j] = link_is_on_lower_level; + sprite_A[j] = (j == 9) ? 2 : 6; + Sprite_SetY(j, info.r2_y + 3); + if (tmp_counter == 0xce) { + Sprite_SetY(j, info.r2_y + 16); + return; + } + if (tmp_counter == 0xcb) { + sprite_y_lo[j] = sprite_x_lo[j] = 0x78; + sprite_x_hi[j] = HIBYTE(link_x_coord); + sprite_y_hi[j] = HIBYTE(link_y_coord); + } +} + +void Sprite_KillFriends() { // 89ef56 + for(int j = 15; j >= 0; j--) { + if (j != cur_object_index && sprite_state[j] && !(sprite_defl_bits[j] & 2) && sprite_type[j] != 0x7a) { + sprite_state[j] = 6; + sprite_delay_main[j] = 15; + sprite_flags3[j] = 0; + sprite_flags5[j] = 0; + sprite_flags2[j] = 3; + } + } +} + +void Garnish16_ThrownItemDebris(int k) { // 89f0cb + static const int16 kScatterDebris_Draw_X[64] = { + 0, 8, 0, 8, -2, 9, -1, 9, -4, 9, -1, 10, -6, 9, -1, 12, + -7, 9, -2, 13, -9, 9, -3, 14, -4, -4, 9, 15, -3, -3, -3, 9, + -4, 4, 6, 10, -1, 4, 6, 7, 0, 2, 4, 7, 1, 1, 5, 7, + 0, -2, 8, 9, -1, -6, 9, 10, -2, -7, 12, 11, -3, -9, 4, 6, + }; + static const int8 kScatterDebris_Draw_Y[64] = { + 0, 0, 8, 8, 0, -1, 10, 10, 0, -3, 11, 7, 1, -4, 12, 8, + 1, -4, 13, 9, 2, -4, 16, 10, 14, 14, -4, 11, 16, 16, 16, -1, + 2, -5, 5, 1, 3, -7, 8, 2, 4, -8, 4, 10, -9, 4, 4, 12, + -10, 4, 8, 14, -12, 4, 8, 15, -15, 3, 8, 17, -17, 1, 18, 15, + }; + static const int8 kScatterDebris_Draw_Char[64] = { + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x48, 0x58, 0x58, 0x58, 0x48, 0x58, 0x58, 0x48, 0x48, 0x48, 0x58, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, + }; + static const uint8 kScatterDebris_Draw_Flags[64] = { + 0x80, 0, 0x80, 0x40, 0x80, 0x40, 0x80, 0, 0, 0xc0, 0, 0x80, 0x80, 0x40, 0x80, 0, + 0x80, 0xc0, 0, 0x80, 0, 0, 0x80, 0, 0x80, 0x80, 0x80, 0x80, 0, 0, 0, 0, + 0x40, 0x40, 0x40, 0, 0x40, 0x40, 0x40, 0, 0x40, 0x40, 0, 0, 0x80, 0, 0x40, 0x40, + 0x40, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0, 0x40, 0, 0, 0, + }; + Point16U pt; + if (Garnish_ReturnIfPrepFails(k, &pt)) + return; + uint8 r5 = garnish_oam_flags[k]; + if (byte_7E0FC6 >= 3) + return; + if (garnish_sprite[k] == 3) { + ScatterDebris_Draw(k, pt); + return; + } + OamEnt *oam = GetOamCurPtr(); + tmp_counter = garnish_sprite[k]; + uint8 base = ((garnish_countdown[k] >> 2) ^ 7) << 2; + if (tmp_counter == 4 || tmp_counter == 2 && !player_is_indoors) + base += 0x20; + + for (int i = 3; i >= 0; i--) { + int j = i + base; + uint16 x = pt.x + kScatterDebris_Draw_X[j]; + oam->x = x; + oam->y = pt.y + kScatterDebris_Draw_Y[j]; + oam->charnum = (tmp_counter == 0) ? 0x4E : (tmp_counter >= 0x80) ? 0xF2 : kScatterDebris_Draw_Char[j]; + oam->flags = kScatterDebris_Draw_Flags[j] | r5; + bytewise_extended_oam[oam - oam_buf] = (x >> 8) & 1; + oam++; + } +} + +void ScatterDebris_Draw(int k, Point16U pt) { // 89f198 + static const int8 kScatterDebris_Draw_X2[12] = {-8, 8, 16, -5, 8, 15, -1, 7, 11, 1, 3, 8}; + static const int8 kScatterDebris_Draw_Y2[12] = {7, 2, 12, 9, 2, 10, 11, 2, 11, 7, 3, 8}; + static const uint8 kScatterDebris_Draw_Char2[12] = {0xe2, 0xe2, 0xe2, 0xe2, 0xf2, 0xf2, 0xf2, 0xe2, 0xe2, 0xf2, 0xe2, 0xe2}; + static const uint8 kScatterDebris_Draw_Flags2[12] = {0, 0, 0, 0, 0x80, 0x40, 0, 0x80, 0x40, 0, 0, 0}; + + if (garnish_countdown[k] == 16) + garnish_type[k] = 0; + + OamEnt *oam = GetOamCurPtr(); + int base = ((garnish_countdown[k] & 0xf) >> 2) * 3; + + for (int i = 2; i >= 0; i--) { + int j = i + base; + uint16 x = pt.x + kScatterDebris_Draw_X2[j]; + oam->x = x; + oam->y = pt.y + kScatterDebris_Draw_Y2[j]; + oam->charnum = kScatterDebris_Draw_Char2[j]; + oam->flags = kScatterDebris_Draw_Flags2[j] | 0x22; + bytewise_extended_oam[oam - oam_buf] = (x >> 8) & 1; + oam++; + } +} + +void Sprite_KillSelf(int k) { // 89f1f8 + if (!(sprite_defl_bits[k] & 0x40) && player_is_indoors) + return; + sprite_state[k] = 0; + uint16 blk = sprite_N_word[k]; + g_ram[0] = blk; // Sprite_PrepOamCoordOrDoubleRet reads this! + WORD(g_ram[1]) = (blk >> 3) + 0xef80; // Sprite_PrepOamCoordOrDoubleRet reads this! + uint8 loadedmask = (0x80 >> (blk & 7)); + uint16 addr = 0xEF80 + (blk >> 3); // warning: blk may be bad, seen with cannon balls in 2nd dungeon + + uint8 *loadedp = &g_ram[addr + 0x10000]; + + if (blk < 0xffff) + *loadedp &= ~loadedmask; + if (!player_is_indoors) + sprite_N_word[k] = 0xffff; + else + sprite_N[k] = 0xff; +} + +void SpritePrep_LoadProperties(int k) { // 8db818 + SpritePrep_ResetProperties(k); + int j = sprite_type[k]; + sprite_flags2[k] = kSpriteInit_Flags2[j]; + sprite_health[k] = kSpriteInit_Health[j]; + sprite_flags4[k] = kSpriteInit_Flags4[j]; + sprite_flags5[k] = kSpriteInit_Flags5[j]; + sprite_defl_bits[k] = kSpriteInit_DeflBits[j]; + sprite_bump_damage[k] = kSpriteInit_BumpDamage[j]; + sprite_flags[k] = kSpriteInit_Flags[j]; + sprite_room[k] = player_is_indoors ? dungeon_room_index2 : overworld_area_index; + sprite_flags3[k] = kSpriteInit_Flags3[j]; + sprite_oam_flags[k] = kSpriteInit_Flags3[j] & 0xf; +} + +void SpritePrep_LoadPalette(int k) { // 8db85c + int f = kSpriteInit_Flags3[sprite_type[k]]; + sprite_flags3[k] = f; + sprite_oam_flags[k] = f & 15; +} + +void SpritePrep_ResetProperties(int k) { // 8db871 + sprite_pause[k] = 0; + sprite_E[k] = 0; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + sprite_z_vel[k] = 0; + sprite_x_subpixel[k] = 0; + sprite_y_subpixel[k] = 0; + sprite_z_subpos[k] = 0; + sprite_ai_state[k] = 0; + sprite_graphics[k] = 0; + sprite_D[k] = 0; + sprite_delay_main[k] = 0; + sprite_delay_aux1[k] = 0; + sprite_delay_aux2[k] = 0; + sprite_delay_aux4[k] = 0; + sprite_head_dir[k] = 0; + sprite_anim_clock[k] = 0; + sprite_G[k] = 0; + sprite_hit_timer[k] = 0; + sprite_wallcoll[k] = 0; + sprite_z[k] = 0; + sprite_health[k] = 0; + sprite_F[k] = 0; + sprite_x_recoil[k] = 0; + sprite_y_recoil[k] = 0; + sprite_A[k] = 0; + sprite_B[k] = 0; + sprite_C[k] = 0; + sprite_unk2[k] = 0; + sprite_subtype2[k] = 0; + sprite_ignore_projectile[k] = 0; + sprite_obj_prio[k] = 0; + sprite_oam_flags[k] = 0; + sprite_stunned[k] = 0; + sprite_give_damage[k] = 0; + sprite_unk3[k] = 0; + sprite_unk4[k] = 0; + sprite_unk5[k] = 0; + sprite_unk1[k] = 0; + sprite_I[k] = 0; +} + +uint8 Oam_AllocateFromRegionA(uint8 num) { // 8dba80 + return Oam_GetBufferPosition(num, 0); +} + +uint8 Oam_AllocateFromRegionB(uint8 num) { // 8dba84 + return Oam_GetBufferPosition(num, 2); +} + +uint8 Oam_AllocateFromRegionC(uint8 num) { // 8dba88 + return Oam_GetBufferPosition(num, 4); +} + +uint8 Oam_AllocateFromRegionD(uint8 num) { // 8dba8c + return Oam_GetBufferPosition(num, 6); +} + +uint8 Oam_AllocateFromRegionE(uint8 num) { // 8dba90 + return Oam_GetBufferPosition(num, 8); +} + +uint8 Oam_AllocateFromRegionF(uint8 num) { // 8dba94 + return Oam_GetBufferPosition(num, 10); +} + +uint8 Oam_GetBufferPosition(uint8 num, uint8 y) { // 8dbb0a + y >>= 1; + uint16 p = oam_region_base[y], pstart = p; + p += num; + if (p >= kOamGetBufferPos_Tab0[y]) { + int j = oam_alloc_arr1[y]++ & 7; + pstart = kOamGetBufferPos_Tab1[y * 8 + j]; + } else { + oam_region_base[y] = p; + } + oam_ext_cur_ptr = 0xa20 + (pstart >> 2); + oam_cur_ptr = 0x800 + pstart; + return oam_cur_ptr; +} + +void Sprite_NullifyHookshotDrag() { // 8ff540 + for (int i = 4; i >= 0; i--) { + if (!(ancilla_type[i] & 0x1f) && related_to_hookshot) { + related_to_hookshot = 0; + break; + } + } + link_x_coord_safe_return_hi = link_x_coord >> 8; + link_y_coord_safe_return_hi = link_y_coord >> 8; + link_x_coord = link_x_coord_prev; + link_y_coord = link_y_coord_prev; + HandleIndoorCameraAndDoors(); +} + +void Overworld_SubstituteAlternateSecret() { // 9afbdb + static const uint8 kSecretSubst_Tab0[64] = { + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 4, 4, 6, 0, 0, 15, 15, 4, 5, 5, 4, 6, 6, + 15, 15, 4, 5, 5, 7, 6, 6, 31, 31, 4, 7, 7, 4, 6, 6, + 6, 7, 2, 0, 0, 0, 0, 0, 6, 6, 2, 0, 0, 0, 0, 0, + }; + static const uint8 kSecretSubst_Tab2[16] = { 1, 1, 1, 1, 15, 1, 1, 18, 16, 1, 1, 1, 17, 1, 1, 3 }; + static const uint8 kSecretSubst_Tab1[16] = { 0, 0, 0, 0, 2, 0, 0, 8, 16, 0, 0, 0, 1, 0, 0, 0 }; + if (GetRandomNumber() & 1) + return; + int n = 0; + for (int j = 15; j >= 0; j--) { + if (sprite_state[j] && sprite_type[j] != 0x6c) + n++; + } + if (n >= 4 || sram_progress_indicator < 2) + return; + int j = (overworld_secret_subst_ctr++ & 7) + (is_in_dark_world ? 8 : 0); + if (!(kSecretSubst_Tab0[BYTE(overworld_area_index) & 0x3f] & kSecretSubst_Tab1[j])) + BYTE(dung_secrets_unk1) = kSecretSubst_Tab2[j]; +} + +void Sprite_ApplyConveyor(int k, int j) { // 9d8010 + if (!(frame_counter & 1)) + return; + static const int8 kConveyorAdjustment_X[] = {0, 0, -1, 1}; + static const int8 kConveyorAdjustment_Y[] = {-1, 1, 0, 0}; + Sprite_SetX(k, Sprite_GetX(k) + kConveyorAdjustment_X[j - 0x68]); + Sprite_SetY(k, Sprite_GetY(k) + kConveyorAdjustment_Y[j - 0x68]); +} + +uint8 Sprite_BounceFromTileCollision(int k) { // 9dc751 + int j = Sprite_CheckTileCollision(k); + if (j & 3) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_G[k]++; + } + if (j & 12) { + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_G[k]++; + return sprite_G[k]; // wtf + } + return 0; +} + +void ExecuteCachedSprites() { // 9de9da + if (!player_is_indoors || submodule_index == 0 || submodule_index == 14 || alt_sprites_flag == 0) { + alt_sprites_flag = 0; + return; + } + for (int i = 15; i >= 0; i--) { + cur_object_index = i; + if (alt_sprite_state[i]) + UncacheAndExecuteSprite(i); + } +} + +void UncacheAndExecuteSprite(int k) { // 9dea00 + uint8 bak0 = sprite_state[k]; + uint8 bak1 = sprite_type[k]; + uint8 bak2 = sprite_x_lo[k]; + uint8 bak3 = sprite_x_hi[k]; + uint8 bak4 = sprite_y_lo[k]; + uint8 bak5 = sprite_y_hi[k]; + uint8 bak6 = sprite_graphics[k]; + uint8 bak7 = sprite_A[k]; + uint8 bak8 = sprite_head_dir[k]; + uint8 bak9 = sprite_oam_flags[k]; + uint8 bak10 = sprite_obj_prio[k]; + uint8 bak11 = sprite_D[k]; + uint8 bak12 = sprite_flags2[k]; + uint8 bak13 = sprite_floor[k]; + uint8 bak14 = sprite_ai_state[k]; + uint8 bak15 = sprite_flags3[k]; + uint8 bak16 = sprite_B[k]; + uint8 bak17 = sprite_C[k]; + uint8 bak18 = sprite_E[k]; + uint8 bak19 = sprite_subtype2[k]; + uint8 bak20 = sprite_z[k]; + uint8 bak21 = sprite_delay_main[k]; + uint8 bak22 = sprite_I[k]; + uint8 bak23 = sprite_ignore_projectile[k]; + sprite_state[k] = alt_sprite_state[k]; + sprite_type[k] = alt_sprite_type[k]; + sprite_x_lo[k] = alt_sprite_x_lo[k]; + sprite_x_hi[k] = alt_sprite_x_hi[k]; + sprite_y_lo[k] = alt_sprite_y_lo[k]; + sprite_y_hi[k] = alt_sprite_y_hi[k]; + sprite_graphics[k] = alt_sprite_graphics[k]; + sprite_A[k] = alt_sprite_A[k]; + sprite_head_dir[k] = alt_sprite_head_dir[k]; + sprite_oam_flags[k] = alt_sprite_oam_flags[k]; + sprite_obj_prio[k] = alt_sprite_obj_prio[k]; + sprite_D[k] = alt_sprite_D[k]; + sprite_flags2[k] = alt_sprite_flags2[k]; + sprite_floor[k] = alt_sprite_floor[k]; + sprite_ai_state[k] = alt_sprite_spawned_flag[k]; + sprite_flags3[k] = alt_sprite_flags3[k]; + sprite_B[k] = alt_sprite_B[k]; + sprite_C[k] = alt_sprite_C[k]; + sprite_E[k] = alt_sprite_E[k]; + sprite_subtype2[k] = alt_sprite_subtype2[k]; + sprite_z[k] = alt_sprite_height_above_shadow[k]; + sprite_delay_main[k] = alt_sprite_delay_main[k]; + sprite_I[k] = alt_sprite_I[k]; + sprite_ignore_projectile[k] = alt_sprite_maybe_ignore_projectile[k]; + Sprite_ExecuteSingle(k); + if (sprite_pause[k] != 0) + alt_sprite_state[k] = 0; + sprite_ignore_projectile[k] = bak23; + sprite_I[k] = bak22; + sprite_delay_main[k] = bak21; + sprite_z[k] = bak20; + sprite_subtype2[k] = bak19; + sprite_E[k] = bak18; + sprite_C[k] = bak17; + sprite_B[k] = bak16; + sprite_flags3[k] = bak15; + sprite_ai_state[k] = bak14; + sprite_floor[k] = bak13; + sprite_flags2[k] = bak12; + sprite_D[k] = bak11; + sprite_obj_prio[k] = bak10; + sprite_oam_flags[k] = bak9; + sprite_head_dir[k] = bak8; + sprite_A[k] = bak7; + sprite_graphics[k] = bak6; + sprite_y_hi[k] = bak5; + sprite_y_lo[k] = bak4; + sprite_x_hi[k] = bak3; + sprite_x_lo[k] = bak2; + sprite_type[k] = bak1; + sprite_state[k] = bak0; + +} + +uint8 Sprite_ConvertVelocityToAngle(uint8 x, uint8 y) { // 9df614 + static const uint8 kConvertVelocityToAngle_Tab0[32] = { + 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 15, 15, 15, 14, 14, 14, + 8, 8, 7, 7, 7, 6, 6, 6, 8, 8, 9, 9, 9, 10, 10, 10, + }; + static const uint8 kConvertVelocityToAngle_Tab1[32] = { + 4, 4, 3, 3, 3, 2, 2, 2, 12, 12, 13, 13, 13, 14, 14, 14, + 4, 4, 5, 5, 5, 6, 6, 6, 12, 12, 11, 11, 11, 10, 10, 10, + }; + int s = ((y >> 7) + (x >> 7) * 2) * 8; + if (sign8(x)) x = -x; + if (sign8(y)) y = -y; + if (x >= y) { + return kConvertVelocityToAngle_Tab0[(y >> 2) + s]; + } else { + return kConvertVelocityToAngle_Tab1[(x >> 2) + s]; + } +} + +int Sprite_SpawnDynamically(int k, uint8 what, SpriteSpawnInfo *info) { // 9df65d + return Sprite_SpawnDynamicallyEx(k, what, info, 15); +} + +int Sprite_SpawnDynamicallyEx(int k, uint8 what, SpriteSpawnInfo *info, int j) { // 9df65f + do { + if (sprite_state[j] == 0) { + sprite_type[j] = what; + sprite_state[j] = 9; + info->r0_x = Sprite_GetX(k); + info->r2_y = Sprite_GetY(k); + info->r4_z = sprite_z[k]; + info->r5_overlord_x = overlord_x_lo[k] | overlord_x_hi[k] << 8; + info->r7_overlord_y = overlord_y_lo[k] | overlord_y_hi[k] << 8; + SpritePrep_LoadProperties(j); + if (!player_is_indoors) { + sprite_N_word[j] = 0xffff; + } else { + sprite_N[j] = 0xff; + } + sprite_floor[j] = sprite_floor[k]; + sprite_D[j] = sprite_D[k]; + sprite_die_action[j] = 0; + sprite_subtype[j] = 0; + break; + } + } while (--j >= 0); + return j; +} + +void SpriteFall_Draw(int k, PrepOamCoordsRet *info) { // 9dffc5 + static const uint8 kSpriteFall_Char[8] = {0x83, 0x83, 0x83, 0x80, 0x80, 0x80, 0xb7, 0xb7}; + OamEnt *oam = GetOamCurPtr(); + oam->x = info->x + 4; + oam->y = info->y + 4; + oam->charnum = kSpriteFall_Char[sprite_delay_main[k] >> 2]; + oam->flags = info->flags & 0x30 | 0x04; + Sprite_CorrectOamEntries(k, 0, 0); +} + +void Sprite_GarnishSpawn_Sparkle_limited(int k, uint16 x, uint16 y) { // 9ea001 + Sprite_SpawnSimpleSparkleGarnishEx(k, x, y, 14); +} + +int Sprite_GarnishSpawn_Sparkle(int k, uint16 x, uint16 y) { // 9ea007 + return Sprite_SpawnSimpleSparkleGarnishEx(k, x, y, 29); +} + +void Sprite_BehaveAsBarrier(int k) { // 9ef4f3 + uint8 bak = sprite_flags4[k]; + sprite_flags4[k] = 0; + if (Sprite_CheckDamageToLink_same_layer(k)) + Sprite_HaltAllMovement(); + sprite_flags4[k] = bak; +} + +void Sprite_HaltAllMovement() { // 9ef508 + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); +} + +int ReleaseFairy() { // 9efe33 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(0, 0xe3, &info), i; + if (j >= 0) { + sprite_floor[j] = link_is_on_lower_level; + Sprite_SetX(j, link_x_coord + 8); + Sprite_SetY(j, link_y_coord + 16); + sprite_D[j] = 0; + sprite_delay_aux4[j] = 96; + } + return j; +} + +void Sprite_DrawRippleIfInWater(int k) { // 9eff8d + if (sprite_I[k] != 8 && sprite_I[k] != 9) + return; + + if (sprite_flags3[k] & 0x20) { + cur_sprite_x -= 4; + if (sprite_type[k] == 0xdf) + cur_sprite_y -= 7; + } + SpriteDraw_WaterRipple(k); + Sprite_Get16BitCoords(k); + Oam_AllocateFromRegionA(((sprite_flags2[k] & 0x1f) + 1) * 4); +} + diff --git a/sprite.h b/sprite.h new file mode 100644 index 00000000..0d4bda59 --- /dev/null +++ b/sprite.h @@ -0,0 +1,325 @@ +#pragma once +#include "types.h" +#include "variables.h" + + +struct PrepOamCoordsRet { + uint16 x, y; + uint8 r4; + uint8 flags; +}; + +struct SpriteHitBox { + uint8 r0_xlo; + uint8 r8_xhi; + uint8 r1_ylo; + uint8 r9_yhi; + uint8 r2, r3; + + uint8 r4_spr_xlo; + uint8 r10_spr_xhi; + + uint8 r5_spr_ylo; + uint8 r11_spr_yhi; + uint8 r6_spr_xsize; + uint8 r7_spr_ysize; +}; + +struct SpriteSpawnInfo { + uint16 r0_x; + uint16 r2_y; + uint8 r4_z; + uint16 r5_overlord_x; + uint16 r7_overlord_y; +}; + +extern const uint8 kAbsorbBigKey[2]; + + + +struct DrawMultipleData { + int8 x, y; + uint16 char_flags; + uint8 ext; +}; + + + + + + + + + + + + + + + + + + + + +enum { + kCheckDamageFromPlayer_Carry = 1, + kCheckDamageFromPlayer_Ne = 2, +}; + + + + + + + + + + + + + +static inline uint8 ClampYForOam(uint16 y) { + return (uint16)(y + 0x10) < 0x100 ? y : 0xf0; +} + + + + + +extern const uint8 kAbsorptionSfx[15]; +extern const uint8 kSpriteInit_BumpDamage[243]; +extern const uint16 kSinusLookupTable[256]; +extern const uint8 kThrowableScenery_Flags[9]; +extern const uint8 kWishPond2_OamFlags[76]; + + + + +uint16 Sprite_GetX(int k); +uint16 Sprite_GetY(int k); +void Sprite_SetX(int k, uint16 x); +void Sprite_SetY(int k, uint16 y); +void Sprite_ApproachTargetSpeed(int k, uint8 x, uint8 y); +void SpriteAddXY(int k, int xv, int yv); +void Sprite_MoveXYZ(int k); +void Sprite_Invert_XY_Speeds(int k); +int Sprite_SpawnSimpleSparkleGarnishEx(int k, uint16 x, uint16 y, int limit); +uint16 Garnish_GetX(int k); +uint16 Garnish_GetY(int k); +void Garnish_SparkleCommon(int k, uint8 shift); +void Garnish_DustCommon(int k, uint8 shift); +void SpriteModule_Explode(int k); +void SpriteDeath_MainEx(int k, bool second_entry); +void SpriteModule_Burn(int k); +void Sprite_HitTimer31(int k); +void SpriteStunned_MainEx(int k, bool second_entry); +void Ancilla_SpawnFallingPrize(uint8 item); +bool Sprite_CheckDamageToAndFromLink(int k); +uint8 Sprite_CheckTileCollision(int k); +bool Sprite_TrackBodyToHead(int k); +void Sprite_DrawMultiple(int k, const DrawMultipleData *src, int n, PrepOamCoordsRet *info); +void Sprite_DrawMultiplePlayerDeferred(int k, const DrawMultipleData *src, int n, PrepOamCoordsRet *info); +int Sprite_ShowSolicitedMessage(int k, uint16 msg); +int Sprite_ShowMessageOnContact(int k, uint16 msg); +void Sprite_ShowMessageUnconditional(uint16 msg); +bool Sprite_TutorialGuard_ShowMessageOnContact(int k, uint16 msg); +void Sprite_ShowMessageMinimal(); +void Prepare_ApplyRumbleToSprites(); +void Sprite_SpawnImmediatelySmashedTerrain(uint8 what, uint16 x, uint16 y); +void Sprite_SpawnThrowableTerrain(uint8 what, uint16 x, uint16 y); +int Sprite_SpawnThrowableTerrain_silently(uint8 what, uint16 x, uint16 y); +void Sprite_SpawnSecret(int k); +void Sprite_Main(); +void Oam_ResetRegionBases(); +void Sprite_TimersAndOam(int k); +void Sprite_Get16BitCoords(int k); +void Sprite_ExecuteSingle(int k); +void Sprite_inactiveSprite(int k); +void SpriteModule_Fall1(int k); +void SpriteModule_Drown(int k); +void Sprite_DrawDistress_custom(uint16 xin, uint16 yin, uint8 time); +void Sprite_CheckIfLifted_permissive(int k); +void Entity_ApplyRumbleToSprites(SpriteHitBox *hb); +void Sprite_ZeroVelocity_XY(int k); +bool Sprite_HandleDraggingByAncilla(int k); +bool Sprite_ReturnIfPhasingOut(int k); +void Sprite_CheckAbsorptionByPlayer(int k); +void Sprite_HandleAbsorptionByPlayer(int k); +bool SpriteDraw_AbsorbableTransient(int k, bool transient); +void Sprite_DrawNumberedAbsorbable(int k, int a); +void Sprite_BounceOffWall(int k); +void Sprite_InvertSpeed_XY(int k); +bool Sprite_ReturnIfInactive(int k); +bool Sprite_ReturnIfPaused(int k); +void SpriteDraw_SingleLarge(int k); +void Sprite_PrepAndDrawSingleLargeNoPrep(int k, PrepOamCoordsRet *info); +void SpriteDraw_Shadow_custom(int k, PrepOamCoordsRet *info, uint8 a); +void SpriteDraw_Shadow(int k, PrepOamCoordsRet *oam); +void SpriteDraw_SingleSmall(int k); +void Sprite_DrawThinAndTall(int k); +void SpriteModule_Carried(int k); +void CarriedSprite_CheckForThrow(int k); +void SpriteModule_Stunned(int k); +void ThrownSprite_TileAndSpriteInteraction(int k); +void Sprite_Func8(int k); +void Sprite_Func22(int k); +void ThrowableScenery_InteractWithSpritesAndTiles(int k); +void ThrownSprite_CheckDamageToSprites(int k); +void ThrownSprite_CheckDamageToSingleSprite(int k, int j); +void Sprite_ApplyRicochet(int k); +void ThrowableScenery_TransmuteIfValid(int k); +void ThrowableScenery_TransmuteToDebris(int k); +void Sprite_ScheduleForBreakage(int k); +void Sprite_HalveSpeed_XY(int k); +void Sprite_SpawnLeapingFish(int k); +void SpriteStunned_Main_Func1(int k); +void SpriteModule_Poof(int k); +void Sprite_PrepOamCoord(int k, PrepOamCoordsRet *ret); +bool Sprite_PrepOamCoordOrDoubleRet(int k, PrepOamCoordsRet *ret); +void Sprite_CheckTileCollision2(int k); +void Sprite_CheckTileCollisionSingleLayer(int k); +void Sprite_CheckForTileInDirection_horizontal(int k, int yy); +void Sprite_CheckForTileInDirection_vertical(int k, int yy); +void SpriteFall_AdjustPosition(int k); +bool Sprite_CheckTileInDirection(int k, int yy); +bool Sprite_CheckTileProperty(int k, int j); +uint8 GetTileAttribute(uint8 floor, uint16 *x, uint16 y); +uint8 Sprite_GetTileAttribute(int k, uint16 *x, uint16 y); +bool Entity_CheckSlopedTileCollision(uint16 x, uint16 y); +void Sprite_MoveXY(int k); +void Sprite_MoveX(int k); +void Sprite_MoveY(int k); +void Sprite_MoveZ(int k); +ProjectSpeedRet Sprite_ProjectSpeedTowardsLink(int k, uint8 vel); +void Sprite_ApplySpeedTowardsLink(int k, uint8 vel); +ProjectSpeedRet Sprite_ProjectSpeedTowardsLocation(int k, uint16 x, uint16 y, uint8 vel); +uint8 Sprite_DirectionToFaceLink(int k, PointU8 *coords_out); +PairU8 Sprite_IsRightOfLink(int k); +PairU8 Sprite_IsBelowLink(int k); +PairU8 Sprite_IsRightOfLocation(int k, uint16 x); +PairU8 Sprite_IsBelowLocation(int k, uint16 y); +uint8 Sprite_DirectionToFaceLocation(int k, uint16 x, uint16 y); +void Guard_ParrySwordAttacks(int k); +void Sprite_AttemptZapDamage(int k); +void Ancilla_CheckDamageToSprite_preset(int k, int a); +void Sprite_Func15(int k, int a); +void Sprite_CalculateSwordDamage(int k); +void Sprite_ApplyCalculatedDamage(int k, int a); +void AgahnimBalls_DamageAgahnim(int k, uint8 dmg, uint8 r0_hit_timer); +void Sprite_Func18(int k, uint8 new_type); +void Sprite_MiniMoldorm_Recoil(int k); +void Sprite_Func3(int k); +bool Sprite_CheckDamageToLink(int k); +bool Sprite_CheckDamageToPlayer_1(int k); +bool Sprite_CheckDamageToLink_same_layer(int k); +bool Sprite_CheckDamageToLink_ignore_layer(int k); +bool Sprite_SetupHitBox00(int k); +bool Sprite_ReturnIfLifted(int k); +bool Sprite_ReturnIfLiftedPermissive(int k); +uint8 Sprite_CheckDamageFromLink(int k); +void Sprite_AttemptDamageToLinkWithCollisionCheck(int k); +void Sprite_AttemptDamageToLinkPlusRecoil(int k); +void Player_SetupActionHitBox(SpriteHitBox *hb); +void Sprite_DoHitBoxesFast(int k, SpriteHitBox *hb); +void Sprite_ApplyRecoilToLink(int k, uint8 vel); +void Link_PlaceWeaponTink(); +void Sprite_PlaceWeaponTink(int k); +void Sprite_PlaceRupulseSpark_2(int k); +void Link_SetupHitBox_conditional(SpriteHitBox *hb); +void Link_SetupHitBox(SpriteHitBox *hb); +void Sprite_SetupHitBox(int k, SpriteHitBox *hb); +bool CheckIfHitBoxesOverlap(SpriteHitBox *hb); +void Oam_AllocateDeferToPlayer(int k); +void SpriteModule_Die(int k); +void Sprite_DoTheDeath(int k); +void ForcePrizeDrop(int k, uint8 prize, uint8 slot); +void PrepareEnemyDrop(int k, uint8 item); +void SpriteDeath_Func4(int k); +void SpriteDeath_DrawPoof(int k); +void SpriteModule_Fall2(int k); +void SpriteDraw_FallingHelmaBeetle(int k); +void SpriteDraw_FallingHumanoid(int k); +void Sprite_CorrectOamEntries(int k, int n, uint8 islarge); +bool Sprite_ReturnIfRecoiling(int k); +bool Sprite_CheckIfLinkIsBusy(); +void Sprite_SetSpawnedCoordinates(int k, SpriteSpawnInfo *info); +bool Sprite_CheckIfScreenIsClear(); +bool Sprite_CheckIfRoomIsClear(); +bool Sprite_CheckIfOverlordsClear(); +void Sprite_InitializeMirrorPortal(); +void Sprite_InitializeSlots(); +void Garnish_ExecuteUpperSlots(); +void Garnish_ExecuteLowerSlots(); +void Garnish_ExecuteSingle(int k); +void Garnish15_ArrghusSplash(int k); +void Garnish13_PyramidDebris(int k); +void Garnish11_WitheringGanonBatFlame(int k); +void Garnish10_GanonBatFlame(int k); +void Garnish0C_TrinexxIceBreath(int k); +void Garnish14_KakKidDashDust(int k); +void Garnish_WaterTrail(int k); +void Garnish0A_CannonSmoke(int k); +void Garnish09_LightningTrail(int k); +void Garnish_CheckPlayerCollision(int k, int x, int y); +void Garnish07_BabasuFlash(int k); +void Garnish08_KholdstareTrail(int k); +void Garnish06_ZoroTrail(int k); +void Garnish12_Sparkle(int k); +void Garnish_SimpleSparkle(int k); +void Garnish0E_TrinexxFireBreath(int k); +void Garnish0F_BlindLaserTrail(int k); +void Garnish04_LaserTrail(int k); +bool Garnish_ReturnIfPrepFails(int k, Point16U *pt); +void Garnish03_FallingTile(int k); +void Garnish01_FireSnakeTail(int k); +void Garnish02_MothulaBeamTrail(int k); +void Dungeon_ResetSprites(); +void Dungeon_CacheTransSprites(); +void Sprite_DisableAll(); +void Dungeon_LoadSprites(); +void Sprite_ManuallySetDeathFlagUW(int k); +int Dungeon_LoadSingleSprite(int k, const uint8 *src); +void Dungeon_LoadSingleOverlord(const uint8 *src); +void Sprite_ResetAll(); +void Sprite_ResetAll_noDisable(); +void Sprite_ReloadAll_Overworld(); +void Sprite_OverworldReloadAll_justLoad(); +void Overworld_LoadSprites(); +void Sprite_ActivateAllProxima(); +void Sprite_ProximityActivation(); +void Sprite_ActivateWhenProximal(); +void Sprite_ActivateWhenProximalBig(); +void Sprite_Overworld_ProximityMotivatedLoad(uint16 x, uint16 y); +void Overworld_LoadProximaSpriteIfAlive(uint16 blk); +void SpriteExplode_SpawnEA(int k); +void Sprite_KillFriends(); +void Garnish16_ThrownItemDebris(int k); +void ScatterDebris_Draw(int k, Point16U pt); +void Sprite_KillSelf(int k); +void SpritePrep_LoadProperties(int k); +void SpritePrep_LoadPalette(int k); +void SpritePrep_ResetProperties(int k); +uint8 Oam_AllocateFromRegionA(uint8 num); +uint8 Oam_AllocateFromRegionB(uint8 num); +uint8 Oam_AllocateFromRegionC(uint8 num); +uint8 Oam_AllocateFromRegionD(uint8 num); +uint8 Oam_AllocateFromRegionE(uint8 num); +uint8 Oam_AllocateFromRegionF(uint8 num); +uint8 Oam_GetBufferPosition(uint8 num, uint8 y); +void Sprite_NullifyHookshotDrag(); +void Overworld_SubstituteAlternateSecret(); +void Sprite_ApplyConveyor(int k, int j); +uint8 Sprite_BounceFromTileCollision(int k); +void ExecuteCachedSprites(); +void UncacheAndExecuteSprite(int k); +uint8 Sprite_ConvertVelocityToAngle(uint8 x, uint8 y); +int Sprite_SpawnDynamically(int k, uint8 what, SpriteSpawnInfo *info); +int Sprite_SpawnDynamicallyEx(int k, uint8 what, SpriteSpawnInfo *info, int j); +void SpriteFall_Draw(int k, PrepOamCoordsRet *info); +void Sprite_GarnishSpawn_Sparkle_limited(int k, uint16 x, uint16 y); +int Sprite_GarnishSpawn_Sparkle(int k, uint16 x, uint16 y); +void Sprite_BehaveAsBarrier(int k); +void Sprite_HaltAllMovement(); +int ReleaseFairy(); +void Sprite_DrawRippleIfInWater(int k); diff --git a/sprite_main.cpp b/sprite_main.cpp new file mode 100644 index 00000000..ef808b44 --- /dev/null +++ b/sprite_main.cpp @@ -0,0 +1,26166 @@ +#include "sprite_main.h" +#include "sprite.h" +#include "tagalong.h" +#include "ancilla.h" +#include "overworld.h" +#include "load_gfx.h" +#include "hud.h" +#include "dungeon.h" +#include "player.h" +#include "misc.h" + +#define byte_7FFE01 (*(uint8*)(g_ram+0x1FE01)) +static const int8 kSpriteKeese_Tab2[16] = {0, 8, 11, 14, 16, 14, 11, 8, 0, -8, -11, -14, -16, -14, -11, -8}; +static const int8 kSpriteKeese_Tab3[16] = {-16, -14, -11, -8, 0, 8, 11, 14, 16, 14, 11, 8, 0, -9, -11, -14}; +static const int8 kZazak_Yvel[4] = {0, 0, 16, -16}; +static const int8 kFluteBoyAnimal_Xvel[4] = {16, -16, 0, 0}; +static const int8 kDesertBarrier_Xv[4] = {16, -16, 0, 0}; +static const int8 kDesertBarrier_Yv[4] = {0, 0, 16, -16}; +static const uint8 kCrystalSwitchPal[2] = {2, 4}; +static const uint8 kZazak_Dir2[8] = {2, 3, 2, 3, 0, 1, 0, 1}; +#define moldorm_x_lo ((uint8*)(g_ram+0x1FC00)) +#define moldorm_x_hi ((uint8*)(g_ram+0x1FC80)) +#define moldorm_y_lo ((uint8*)(g_ram+0x1FD00)) +#define moldorm_y_hi ((uint8*)(g_ram+0x1FD80)) +static const int8 kBadPullDownSwitch_X[5] = {-4, 12, 0, -4, 4}; +static const int8 kBadPullDownSwitch_Y[5] = {-3, -3, 0, 5, 5}; +static const uint8 kBadPullDownSwitch_Char[5] = {0xd2, 0xd2, 0xc4, 0xe4, 0xe4}; +static const uint8 kBadPullDownSwitch_Flags[5] = {0x40, 0, 0, 0x40, 0}; +static const uint8 kBadPullDownSwitch_Ext[5] = {0, 0, 2, 2, 2}; +static const uint8 kBadPullSwitch_Tab5[6] = {0, 1, 2, 3, 4, 5}; +static const uint8 kBadPullSwitch_Tab4[12] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 5}; +static const uint8 kThief_Gfx[12] = {11, 8, 2, 5, 9, 6, 0, 3, 10, 7, 1, 4}; +#define word_7FFE00 (*(uint16*)(g_ram+0x1FE00)) +#define word_7FFE02 (*(uint16*)(g_ram+0x1FE02)) +#define word_7FFE04 (*(uint16*)(g_ram+0x1FE04)) +#define word_7FFE06 (*(uint16*)(g_ram+0x1FE06)) +static const int16 kTutorialSoldier_X[20] = { + 4, 0, -6, -6, 2, 0, 0, -7, -7, -7, 0, 0, 0xf, 0xf, 0xf, 6, + 0xe, -4, 4, 0, +}; +static const int16 kTutorialSoldier_Y[20] = { + 0, -10, -4, 12, 12, 0, -9, -11, -3, 5, 0, -9, -11, -3, 5, -11, + 5, 0, 0, -9, +}; +static const uint8 kTutorialSoldier_Char[20] = { + 0x46, 0x40, 0, 0x28, 0x29, 0x4e, 0x42, 0x39, 0x2a, 0x3a, 0x4e, 0x42, 0x39, 0x2a, 0x3a, 0x26, + 0x38, 0x64, 0x64, 0x44, +}; +static const uint8 kTutorialSoldier_Flags[20] = { + 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0, + 0x40, 0, 0x40, 0, +}; +static const uint8 kTutorialSoldier_Ext[20] = { + 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, + 0, 2, 2, 2, +}; +static const uint8 kSprite_TutorialEntities_Tab[4] = {2, 1, 0, 3}; +static const uint8 kSoldier_DirectionLockSettings[4] = {3, 2, 0, 1}; +static const uint8 kWishPond_X[8] = {0, 4, 8, 12, 16, 20, 24, 0}; +static const uint8 kWishPond_Y[8] = {0, 8, 16, 24, 32, 40, 4, 36}; +const uint8 kWishPond2_OamFlags[76] = { + 5, 0xff, 5, 5, 5, 5, 5, 1, 2, 1, 1, 1, 2, 2, 2, 4, + 4, 4, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 4, 4, 2, 1, + 6, 1, 2, 1, 2, 2, 1, 2, 2, 4, 1, 1, 4, 2, 1, 4, + 2, 2, 4, 4, 4, 2, 1, 4, 1, 2, 2, 1, 2, 2, 1, 1, + 4, 4, 1, 2, 2, 4, 4, 4, 2, 5, 2, 1, +}; +static const uint8 kWishPondItemOffs[32] = { + 0, 4, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 22, 23, 24, 25, 28, 30, 31, 32, 33, 33, 37, 40, 42, 42, 42, 42 +}; +static const uint8 kWishPondItemData[50] = { + 0x3a, 0x3a, 0x3b, 0x3b, 0x0c, 0x2a, 0x0a, 0x27, 0x29, 0x0d, 0x07, 0x08, 0x0f, 0x10, 0x11, 0x12, + 0x09, 0x13, 0x14, 0x4a, 0x21, 0x1d, 0x15, 0x18, 0x19, 0x31, 0x1a, 0x1a, 0x1b, 0x1c, 0x4b, 0x1e, + 0x1f, 0x49, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x22, 0x23, 0x29, 0x16, 0x2b, 0x2c, 0x2d, 0x3d, 0x3c, 0x48 +}; +static const DrawMultipleData kUncleDraw_Table[48] = { + { 0, -10, 0x0e00, 2}, + { 0, 0, 0x0c06, 2}, + { 0, -10, 0x0e00, 2}, + { 0, 0, 0x0c06, 2}, + { 0, -10, 0x0e00, 2}, + { 0, 0, 0x0c06, 2}, + { 0, -10, 0x0e02, 2}, + { 0, 0, 0x0c06, 2}, + { 0, -10, 0x0e02, 2}, + { 0, 0, 0x0c06, 2}, + { 0, -10, 0x0e02, 2}, + { 0, 0, 0x0c06, 2}, + { -7, 2, 0x0d07, 2}, + { -7, 2, 0x0d07, 2}, + { 10, 12, 0x8d05, 0}, + { 10, 4, 0x8d15, 0}, + { 0, -10, 0x0e00, 2}, + { 0, 0, 0x0c04, 2}, + { -7, 1, 0x0d07, 2}, + { -7, 1, 0x0d07, 2}, + { 10, 13, 0x8d05, 0}, + { 10, 5, 0x8d15, 0}, + { 0, -9, 0x0e00, 2}, + { 0, 1, 0x4c04, 2}, + { -7, 8, 0x8d05, 0}, + { 1, 8, 0x8d06, 0}, + { 0, -10, 0x0e02, 2}, + { -6, -1, 0x4d07, 2}, + { 0, 0, 0x0c23, 2}, + { 0, 0, 0x0c23, 2}, + { -9, 7, 0x8d05, 0}, + { -1, 7, 0x8d06, 0}, + { 0, -9, 0x0e02, 2}, + { -6, 0, 0x4d07, 2}, + { 0, 1, 0x0c25, 2}, + { 0, 1, 0x0c25, 2}, + {-10, -17, 0x0d07, 2}, + { 15, -12, 0x8d15, 0}, + { 15, -4, 0x8d05, 0}, + { 0, -28, 0x0e08, 2}, + { -8, -19, 0x0c20, 2}, + { 8, -19, 0x4c20, 2}, + { 0, -28, 0x0e08, 2}, + { 0, -28, 0x0e08, 2}, + { -8, -19, 0x0c20, 2}, + { 8, -19, 0x4c20, 2}, + { -8, -19, 0x0c20, 2}, + { 8, -19, 0x4c20, 2}, +}; +static const uint8 kUncleDraw_Dma3[8] = {8, 8, 0, 0, 6, 6, 0, 0}; +static const uint8 kUncleDraw_Dma4[8] = {0, 0, 0, 0, 4, 4, 0, 0x8b}; // wtf +static const uint8 kUncle_LeaveHouse_Delay[2] = {64, 224}; +static const uint8 kUncle_LeaveHouse_Dir[2] = {2, 1}; +static const int8 kUncle_LeaveHouse_Xvel[4] = {0, 0, -12, 12}; +static const int8 kUncle_LeaveHouse_Yvel[4] = {-12, 12, 0, 0}; +static const DrawMultipleData kPriest_Dmd[20] = { + { 0, -8, 0x0e20, 2}, + { 0, 0, 0x0e26, 2}, + { 0, -8, 0x0e20, 2}, + { 0, 0, 0x4e26, 2}, + { 0, -8, 0x0e0e, 2}, + { 0, 0, 0x0e24, 2}, + { 0, -8, 0x0e0e, 2}, + { 0, 0, 0x0e24, 2}, + { 0, -8, 0x0e22, 2}, + { 0, 0, 0x0e28, 2}, + { 0, -8, 0x0e22, 2}, + { 0, 0, 0x0e2a, 2}, + { 0, -8, 0x4e22, 2}, + { 0, 0, 0x4e28, 2}, + { 0, -8, 0x4e22, 2}, + { 0, 0, 0x4e2a, 2}, + {-7, 1, 0x0e0a, 2}, + { 3, 3, 0x0e0c, 2}, + {-7, 1, 0x0e0a, 2}, + { 3, 3, 0x0e0c, 2}, +}; +static const DrawMultipleData kSageMantle_Dmd[4] = { + {0, 0, 0x162c, 2}, + {16, 0, 0x562c, 2}, + {0, 16, 0x062e, 2}, + {16, 16, 0x462e, 2}, +}; +static const uint8 kCrystalMaiden_Dma[16] = {0x20, 0xc0, 0x20, 0xc0, 0, 0xa0, 0, 0xa0, 0x40, 0x80, 0x40, 0x60, 0x40, 0x80, 0x40, 0x60}; +static const DrawMultipleData kCrystalMaiden_SpriteData[16] = { + {1, -7, 0x0120, 2}, + {1, 3, 0x0122, 2}, + {1, -7, 0x0120, 2}, + {1, 3, 0x4122, 2}, + {1, -7, 0x0120, 2}, + {1, 3, 0x0122, 2}, + {1, -7, 0x0120, 2}, + {1, 3, 0x4122, 2}, + {1, -7, 0x0120, 2}, + {1, 3, 0x0122, 2}, + {1, -7, 0x0120, 2}, + {1, 3, 0x0122, 2}, + {1, -7, 0x4120, 2}, + {1, 3, 0x4122, 2}, + {1, -7, 0x4120, 2}, + {1, 3, 0x4122, 2}, +}; +static const int8 kZelda_Xvel[4] = {0, 0, -9, 9}; +static const int8 kZelda_Yvel[4] = {-9, 9, 0, 0}; +static const int8 kHeartRefill_AccelX[2] = {1, -1}; +static const int8 kHeartRefill_VelTarget[2] = {10, -10}; +static const DrawMultipleData kFakeSword_Dmd[2] = { + {4, 0, 0x00f4, 0}, + {4, 8, 0x00f5, 0}, +}; +static const uint8 kThrowableScenery_Char[12] = {0x42, 0x44, 0x46, 0, 0x46, 0x44, 0x42, 0x44, 0x44, 0, 0x46, 0x44}; +const uint8 kThrowableScenery_Flags[9] = { 0xc, 0xc, 0xc, 0, 0, 0, 0xb0, 0x08, 0xb4 }; +static const int16 kThrowableScenery_DrawLarge_X[4] = {-8, 8, -8, 8}; +static const int16 kThrowableScenery_DrawLarge_Y[4] = {-14, -14, 2, 2}; +static const uint8 kThrowableScenery_DrawLarge_Flags[4] = {0, 0x40, 0x80, 0xc0}; +static const int16 kThrowableScenery_DrawLarge_X2[3] = {-6, 0, 6}; +static const uint8 kThrowableScenery_DrawLarge_OamFlags[2] = {0xc, 0}; +static const int8 kScatterDebris_X[4] = {-8, 8, -8, 8}; +static const int8 kScatterDebris_Y[4] = {-8, -8, 8, 8}; +static const uint8 kMovableMantle_X[6] = {0, 0x10, 0x20, 0, 0x10, 0x20}; +static const uint8 kMovableMantle_Y[6] = {0, 0, 0, 0x10, 0x10, 0x10}; +static const uint8 kMovableMantle_Char[6] = {0xc, 0xe, 0xc, 0x2c, 0x2e, 0x2c}; +static const uint8 kMovableMantle_Flags[6] = {0x31, 0x31, 0x71, 0x31, 0x31, 0x71}; +static const uint8 kSprite_SimplifiedTileAttr[256] = { + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; +static const uint8 kSoldier_Gfx[4] = {8, 0, 12, 5}; +static const uint8 kSoldier_Delay[4] = {0x60, 0xc0, 0xff, 0x40}; +static const uint8 kSoldier_Draw1_Char[4] = {0x42, 0x42, 0x40, 0x44}; +static const uint8 kSoldier_Draw1_Flags[4] = {0x40, 0, 0, 0}; +static const int8 kSoldier_Draw1_Yd[26] = { + 7, 8, 7, 8, 8, 7, 8, 7, 8, 7, 8, 8, 7, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +}; +static const int8 kSoldier_Draw2_Xd[104] = { + -4, 4, 10, 10, -4, 4, 10, 10, -4, 4, 10, 10, -4, 4, 10, 10, + -4, -4, 0, 0, -4, -4, 0, 0, -3, -3, 0, 0, -3, -3, -4, 4, + -3, -3, -4, 4, -3, -3, -4, 4, -3, -3, -4, 4, 12, 12, 0, 0, + 12, 12, 0, 0, 11, 11, 0, 0, -4, 4, 0, 0, -4, 4, 0, 0, + -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -4, 4, 0, 0, -4, 4, 0, 0, -4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const int8 kSoldier_Draw2_Yd[104] = { + 0, 0, 2, 10, 0, 0, 2, 10, 0, 0, 1, 9, 0, 0, 2, 10, + -2, 6, 1, 1, -2, 6, 2, 2, -2, 6, 1, 1, -5, 3, 0, 0, + -4, 4, 0, 0, -4, 4, 0, 0, -5, 3, 0, 0, -2, 6, 1, 1, + -2, 6, 2, 2, -2, 6, 1, 1, 0, 0, 8, 8, 0, 0, 8, 8, + 0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, + 0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, 0, 0, 8, 8, + 0, 0, 8, 8, 0, 0, 8, 8, +}; +static const uint8 kSoldier_Draw2_Char[104] = { + 0x48, 0x49, 0x6d, 0x7d, 0x49, 0x48, 0x6d, 0x7d, 0x46, 0x46, 0x6d, 0x7d, 0x4b, 0x46, 0x6d, 0x7d, + 0x4d, 0x5d, 0x4e, 0x4e, 0x4d, 0x5d, 0x60, 0x60, 0x4d, 0x5d, 0x62, 0x62, 0x6d, 0x7d, 0x64, 0x64, + 0x6d, 0x7d, 0x66, 0x67, 0x6d, 0x7d, 0x67, 0x66, 0x6d, 0x7d, 0x64, 0x69, 0x4d, 0x5d, 0x4e, 0x4e, + 0x4d, 0x5d, 0x60, 0x60, 0x4d, 0x5d, 0x62, 0x62, 2, 3, 0x20, 0x20, 2, 0xc, 0x20, 0x20, + 2, 0xc, 0x20, 0x20, 8, 8, 0x20, 0x20, 0xe, 0xe, 0x20, 0x20, 0xe, 0xe, 0x20, 0x20, + 5, 6, 0x20, 0x20, 0x22, 6, 0x20, 0x20, 0x22, 6, 0x20, 0x20, 8, 8, 0x20, 0x20, + 0xe, 0xe, 0x20, 0x20, 0xe, 0xe, 0x20, 0x20, +}; +static const uint8 kSoldier_Draw2_Flags[104] = { + 0, 0, 0, 0, 0x40, 0x40, 0, 0, 0, 0x40, 0, 0, 0, 0x40, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, + 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; +static const uint8 kSoldier_Draw2_Ext[104] = { + 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, + 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, + 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, +}; +static const uint8 kSoldier_Draw2_OamIdx[4] = {12, 12, 12, 4}; +static const int8 kSoldier_Draw3_Xd[28] = { + -3, -3, -4, -4, -4, -4, -4, -4, -11, -3, -11, -3, -16, -8, 12, 12, + 12, 12, 12, 12, 12, 12, 21, 13, 21, 13, 24, 16, +}; +static const int8 kSoldier_Draw3_Yd[28] = { + 11, 19, 11, 19, 10, 18, 14, 22, 8, 8, 8, 8, 6, 6, -10, -2, + -9, -1, -9, -1, -16, -8, 8, 8, 8, 8, 6, 6, +}; +static const uint8 kSoldier_Draw3_Char[28] = { + 0x7b, 0x6b, 0x7b, 0x6b, 0x7b, 0x6b, 0x7b, 0x6b, 0x6c, 0x7c, 0x6c, 0x7c, 0x6c, 0x7c, 0x6b, 0x7b, + 0x6b, 0x7b, 0x6b, 0x7b, 0x6b, 0x7b, 0x6c, 0x7c, 0x6c, 0x7c, 0x6c, 0x7c, +}; +static const uint8 kSoldier_Draw3_Flags[28] = { + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; +static const uint8 kSoldier_Draw3_OamIdx[4] = {4, 4, 4, 20}; +static const int8 kSoldier_Xvel[4] = {8, -8, 0, 0}; +static const int8 kSoldier_Yvel[4] = {0, 0, 8, -8}; +static const uint8 kSoldier_Gfx2[32] = { + 11, 12, 13, 12, 4, 5, 6, 5, 0, 1, 2, 3, 7, 8, 9, 10, + 17, 18, 17, 18, 7, 8, 7, 8, 3, 4, 3, 4, 13, 14, 13, 14, +}; +static const int8 kSoldierB_Xvel[8] = {1, 1, -1, -1, -1, -1, 1, 1}; +static const int8 kSoldierB_Yvel[8] = {-1, 1, 1, -1, -1, 1, 1, -1}; +static const int8 kSoldierB_Xvel2[8] = {8, 0, -8, 0, -8, 0, 8, 0}; +static const int8 kSoldierB_Yvel2[8] = {0, 8, 0, -8, 0, 8, 0, -8}; +static const uint8 kSoldierB_Dir[8] = {0, 2, 1, 3, 1, 2, 0, 3}; +static const uint8 kSoldierB_Mask2[8] = {1, 4, 2, 8, 2, 4, 1, 8}; +static const uint8 kSoldierB_Mask[8] = {8, 1, 4, 2, 8, 2, 4, 1}; +static const uint8 kSoldierB_NextB2[8] = {1, 2, 3, 0, 5, 6, 7, 4}; +static const uint8 kSoldierB_NextB[8] = {3, 0, 1, 2, 7, 4, 5, 6}; +static const uint8 kSoldier_HeadDirs[32] = { + 0, 2, 2, 2, 0, 3, 3, 3, 1, 3, 3, 3, 1, 2, 2, 2, + 2, 0, 0, 0, 2, 1, 1, 1, 3, 1, 1, 1, 3, 0, 0, 0, +}; +static const uint8 kSoldier_Tab1[4] = {13, 13, 12, 12}; +static const uint8 kSoldier_DrawShadow[4] = {0xc, 0xc, 0xa, 0xa}; +static const int8 kSoldier_SetTowardsVel[6] = {14, -14, 0, 0, 14, -14}; +static const uint8 kSprite_SpawnProbeStaggered_Tab[4] = {0x10, 0x30, 0, 0x20}; +static const int8 kSpawnProbe_Xvel[64] = { + -16, -16, -16, -16, -16, -16, -16, -16, -16, -14, -12, -10, -8, -6, -4, -2, + 0, 2, 4, 6, 8, 10, 12, 14, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 14, 12, 10, 8, 6, 4, 2, 0, + -2, -4, -6, -8, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, +}; +static const int8 kSpawnProbe_Yvel[64] = { + 0, 2, 4, 6, 8, 10, 12, 14, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 14, 12, 10, 8, 6, 4, 2, 0, + -2, -4, -6, -8, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -14, -12, -10, -8, -6, -4, -2, 0, +}; +int ctr; +bool foo = false; +static const uint8 kChainBallTrooper_Tab1[4] = {0x0d, 0x60, 0x22, 0x10}; // wtf +static const uint8 kFlailTrooperGfx[32] = { + 0x10, 0x11, 0x12, 0x13, 0x10, 0x11, 0x12, 0x13, 6, 7, 8, 9, 6, 7, 8, 9, + 0, 1, 2, 3, 0, 1, 4, 5, 0xa, 0xb, 0xc, 0xd, 0xa, 0xb, 0xe, 0xf, +}; +static const uint8 kJavelinTrooper_Tab2[64] = { + 25, 25, 24, 24, 23, 23, 23, 23, 19, 19, 18, 18, 17, 17, 17, 17, + 16, 16, 15, 15, 14, 14, 14, 14, 22, 22, 21, 21, 20, 20, 20, 20, + 20, 20, 18, 18, 18, 16, 16, 16, 21, 21, 8, 8, 8, 6, 6, 6, + 22, 22, 4, 4, 4, 3, 3, 3, 23, 23, 15, 15, 15, 11, 11, 11, +}; +static const int8 kSprite_Recruit_Xvel[8] = {12, -12, 0, 0, 18, -18, 0, 0}; +static const int8 kSprite_Recruit_Yvel[8] = {0, 0, 0xc, -0xc, 0, 0, 0x12, -0x12}; +static const int8 kSprite_Recruit_Gfx[8] = {0, 2, 4, 6, 1, 3, 5, 7}; +static const uint8 kRecruit_Moving_HeadDir[8] = {2, 3, 2, 3, 0, 1, 0, 1}; +static const int16 kRecruit_Draw_X[8] = {2, 2, -2, -2, 0, 0, 0, 0}; +static const uint8 kRecruit_Draw_Char[8] = {0x8a, 0x8c, 0x8a, 0x8c, 0x86, 0x88, 0x8e, 0xa0}; +static const uint8 kRecruit_Draw_Flags[8] = {0x40, 0x40, 0, 0, 0, 0, 0, 0}; +static const uint8 kSprite_Zora_SurfacingGfx[16] = {4, 3, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0}; +static const uint8 kChainBallTrooperHead_Char[4] = {2, 2, 0, 4}; +static const uint8 kChainBallTrooperHead_Flags[4] = {0x40, 0, 0, 0}; +static const int8 kFlailTrooperBody_X[72] = { + -4, 4, 12, -4, 4, 13, -4, 4, 13, -4, 4, 13, -4, 4, 13, -4, + 4, 13, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 4, -4, 4, + -6, -4, 4, -5, -4, 4, -5, -4, 4, -6, -4, 4, -5, -4, 4, -6, + 0, 0, 4, 0, 0, 3, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, + 0, 0, -4, 4, 4, -4, 4, 4, +}; +static const int8 kFlailTrooperBody_Y[72] = { + 0, 0, -4, 0, 0, -4, 0, 0, -3, 0, 0, -2, 0, 0, -3, 0, + 0, -2, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 2, 0, 0, + -2, 0, 0, -2, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, + 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +}; +static const uint8 kFlailTrooperBody_Char[72] = { + 0x46, 6, 0x2f, 0x46, 6, 0x2f, 0x48, 0xd, 0x2f, 0x48, 0xd, 0x2f, 0x49, 0xc, 0x2f, 0x49, + 0xc, 0x2f, 8, 8, 0x2f, 8, 8, 0x2f, 0x22, 0x22, 0x2f, 0x22, 0x22, 0x2f, 0xa, 0x64, + 0x2f, 0xa, 0x64, 0x2f, 0x2c, 0x67, 0x2f, 0x2c, 0x67, 0x2f, 0x2d, 0x66, 0x2f, 0x2d, 0x66, 0x2f, + 8, 8, 0x2f, 8, 8, 0x2f, 0x22, 0x22, 0x2f, 0x22, 0x22, 0x2f, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x46, 0x4b, 0x4b, 0x69, 0x64, 0x64, +}; +static const uint8 kFlailTrooperBody_Flags[72] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0, 0x40, + 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, + 0x40, 0, 0x40, 0x40, 0, 0, 0x40, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0, + 0, 0, 0, 0x40, 0x40, 0, 0x40, 0x40, +}; +static const uint8 kFlailTrooperBody_Ext[72] = { + 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, + 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, + 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, + 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, +}; +static const uint8 kFlailTrooperBody_Num[24] = { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 1, 1, 1, 1, +}; +static const uint8 kFlailTrooperBody_SprOffs[24] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 8, 8, 8, +}; +const uint16 kSinusLookupTable[256] = { + 0, 3, 6, 9, 12, 15, 18, 21, 25, 28, 31, 34, 37, 40, 40, 46, + 49, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, + 97, 100, 103, 106, 109, 112, 115, 117, 120, 123, 126, 128, 131, 134, 136, 139, + 142, 144, 147, 149, 152, 155, 157, 159, 162, 164, 167, 169, 171, 174, 176, 178, + 181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209, 211, + 212, 214, 216, 217, 219, 221, 222, 224, 225, 227, 228, 230, 231, 232, 234, 235, + 236, 237, 238, 239, 241, 242, 243, 244, 244, 245, 246, 247, 248, 249, 249, 250, + 251, 251, 252, 252, 253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, + 256, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 252, 251, + 251, 250, 249, 249, 248, 247, 246, 245, 244, 244, 243, 242, 241, 239, 238, 237, + 236, 235, 234, 232, 231, 230, 228, 227, 225, 224, 222, 221, 219, 217, 216, 214, + 212, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, + 181, 178, 176, 174, 171, 169, 167, 164, 162, 159, 157, 155, 152, 149, 147, 144, + 142, 139, 136, 134, 131, 128, 126, 123, 120, 117, 115, 112, 109, 106, 103, 100, + 97, 95, 92, 89, 86, 83, 80, 77, 74, 71, 68, 65, 62, 59, 56, 53, + 49, 46, 43, 40, 37, 34, 31, 28, 25, 21, 18, 15, 12, 9, 6, 3, +}; +static const uint8 kFlailTrooperWeapon_Tab4[4] = {0x33, 0x66, 0x99, 0xcc}; +static const uint8 kFlailTrooperWeapon_Tab0[32] = { + 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, + 0x30, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, +}; +static const int8 kFlailTrooperWeapon_Tab1[4] = {4, 4, 12, -5}; +static const int8 kFlailTrooperWeapon_Tab2[4] = {-2, -2, -6, -4}; +static const uint8 kFlailTrooperAttackDir[4] = {3, 1, 2, 0}; +static const uint8 kSprite_WarpVortex_Flags[4] = {0, 0x40, 0xc0, 0x80}; +static const int8 kSpriteRope_Gfx[8] = {0, 0, 2, 3, 2, 3, 1, 1}; +static const int8 kSpriteRope_Flags[8] = {0, 0x40, 0, 0, 0x40, 0x40, 0, 0x40}; +static const int8 kSpriteRope_Tab1[8] = {4, 5, 2, 3, 0, 1, 6, 7}; +static const int8 kSpriteRope_Xvel[8] = {8, -8, 0, 0, 16, -16, 0, 0}; +static const int8 kSpriteRope_Yvel[8] = {0, 0, 8, -8, 0, 0, 0x10, -0x10}; +static const int8 kSpriteRope_Tab0[4] = {2, 3, 1, 0}; +static const uint8 kSpawnBee_InitDelay[4] = {64, 64, 255, 255}; +static const int8 kSpawnBee_InitVel[8] = {15, 5, -5, -15, 20, 10, -10, -20}; +static const DrawMultipleData kLargeShadow_Dmd[15] = { + {-6, 19, 0x086c, 2}, + { 0, 19, 0x086c, 2}, + { 6, 19, 0x086c, 2}, + {-5, 19, 0x086c, 2}, + { 0, 19, 0x086c, 2}, + { 5, 19, 0x086c, 2}, + {-4, 19, 0x086c, 2}, + { 0, 19, 0x086c, 2}, + { 4, 19, 0x086c, 2}, + {-3, 19, 0x086c, 2}, + { 0, 19, 0x086c, 2}, + { 3, 19, 0x086c, 2}, + {-2, 19, 0x086c, 2}, + { 0, 19, 0x086c, 2}, + { 2, 19, 0x086c, 2}, +}; +static const uint8 kHelmasaur_Tab0[32] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1, +}; +static const uint8 kFluteBoyAnimal_OamFlags[2] = {0x40, 0}; +static const uint8 kFluteBoyAnimal_Gfx[3] = {0, 1, 2}; +static const uint8 kGibo_OamFlags[4] = {0, 0x40, 0xc0, 0x80}; +static const uint8 kGibo_OamFlags2[2] = {11, 7}; +#define chainchomp_x_hist ((uint16*)(g_ram+0x1FC00)) +#define chainchomp_y_hist ((uint16*)(g_ram+0x1FD00)) +static const uint8 kBlindHead_Draw_Char[16] = {0x86, 0x86, 0x84, 0x82, 0x80, 0x82, 0x84, 0x86, 0x86, 0x86, 0x88, 0x8a, 0x8c, 0x8a, 0x88, 0x86}; +static const uint8 kBlindHead_Draw_Flags[16] = {0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0, 0, 0}; +static const uint8 kGanon_G_Func2[16] = { 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, 1 }; +static const int8 kGanon_Draw_X[204] = { + 18, -8, 8, -8, 8, -18, -18, 18, -8, 8, -8, 8, 18, -8, 8, -8, + 8, -18, -18, 18, -8, 8, -8, 8, 16, -8, 8, -8, 8, -18, -18, 16, + -8, 8, -11, 11, 16, -8, 8, -8, 8, -18, -18, 16, -8, 8, -11, 11, + 16, -8, 8, -8, 8, -18, -18, 16, -8, 8, -11, 11, 18, -8, 8, -8, + 8, -18, -18, 18, -8, 8, -8, 8, 18, -8, 8, -8, 8, -18, -18, 18, + -8, 8, -8, 8, 18, -8, 8, -8, 8, -18, -18, 18, -8, 8, -11, 11, + -8, 8, -8, 8, -8, 8, -8, 8, -18, -18, 18, 18, -8, 8, -8, 8, + -8, 8, -8, 8, -18, -18, 18, 18, -8, 8, -8, 8, -8, 8, -10, 10, + -18, -18, 18, 18, -8, 8, -8, 8, -8, 8, -10, 10, -18, -18, 18, 18, + -8, 8, -8, 8, -8, 8, -10, 10, -18, -18, 18, 18, -8, 8, -8, 8, + -8, 8, -8, 8, -18, -18, 18, 18, -8, 8, -8, 8, -8, 8, -8, 8, + -18, -18, 18, 18, -7, -8, 8, -8, 8, -9, 8, -14, -14, -8, 8, 8, + -8, 8, -8, 8, -18, -18, 18, 18, -8, 8, -11, 11, +}; +static const int8 kGanon_Draw_Y[204] = { + -8, -16, -16, -13, -13, -9, -1, -16, 3, 3, 8, 8, -8, -16, -16, -13, + -13, -9, -1, -16, 3, 3, 8, 8, 5, -10, -10, -13, -13, -7, 1, -3, + 3, 3, 8, 8, 5, -10, -10, -13, -13, -7, 1, -3, 3, 3, 8, 8, + 5, -10, -10, -13, -13, -7, 1, -3, 3, 3, 8, 8, -1, -16, -16, -13, + -13, -9, -1, -9, 3, 3, 8, 8, -10, -16, -16, -13, -13, -18, -10, -18, + 3, 3, 8, 8, 1, -10, -10, -13, -13, -7, 1, -7, 3, 3, 8, 8, + -12, -12, 4, 4, -18, -18, 10, 10, -16, -8, -4, 4, -12, -12, 4, 4, + -18, -18, 10, 10, -16, -8, -4, 4, -12, -12, 4, 4, -12, -12, 10, 10, + -4, 4, -4, 4, -12, -12, 4, 4, -12, -12, 10, 10, -4, 4, -4, 4, + -12, -12, 4, 4, -12, -12, 10, 10, -4, 4, -4, 4, -12, -12, 4, 4, + -18, -18, 10, 10, -4, 4, -4, 4, -12, -12, 4, 4, -18, -18, 10, 10, + -16, -8, -16, -8, -7, -12, -12, 4, 4, 7, 13, -11, -4, -16, -16, -16, + -10, -10, -13, -13, -7, -7, -7, -7, 3, 3, 8, 8, +}; +static const uint8 kGanon_Draw_Char[204] = { + 0x16, 0, 0, 2, 2, 8, 0x18, 6, 0x22, 0x22, 0x20, 0x20, 0x46, 0, 0, 2, + 2, 8, 0x18, 0x36, 0x22, 0x22, 0x20, 0x20, 0x1a, 0, 0, 4, 4, 0x38, 0x48, 0xa, + 0x24, 0x24, 0x20, 0x20, 0x1a, 0x40, 0x42, 4, 4, 0x38, 0x48, 0xa, 0x24, 0x24, 0x20, 0x20, + 0x1a, 0x42, 0x40, 4, 4, 0x38, 0x48, 0xa, 0x24, 0x24, 0x20, 0x20, 0x18, 0, 0, 2, + 2, 8, 0x18, 8, 0x22, 0x22, 0x20, 0x20, 0x16, 0x6a, 0x6a, 0xe, 0xe, 6, 0x16, 6, + 0x22, 0x22, 0x20, 0x20, 0x48, 0, 0, 4, 4, 0x38, 0x48, 0x38, 0x24, 0x24, 0x20, 0x20, + 0x4e, 0x4e, 0x6e, 0x6e, 0x6c, 0x6c, 0xa2, 0xa2, 0xc, 0x1c, 0x3c, 0x4c, 0x4e, 0x4e, 0x6e, 0x6e, + 0x6c, 0x6c, 0xa2, 0xa2, 0x3a, 0x4a, 0x3c, 0x4c, 0x84, 0x84, 0xa4, 0xa4, 0xa0, 0xa0, 0xa2, 0xa2, + 0x3c, 0x4c, 0x3c, 0x4c, 0x84, 0x84, 0xa4, 0xa4, 0x80, 0x82, 0xa2, 0xa2, 0x3c, 0x4c, 0x3c, 0x4c, + 0x84, 0x84, 0xa4, 0xa4, 0x82, 0x80, 0xa2, 0xa2, 0x3c, 0x4c, 0x3c, 0x4c, 0x4e, 0x4e, 0x6e, 0x6e, + 0x6c, 0x6c, 0xa2, 0xa2, 0x3c, 0x4c, 0x3c, 0x4c, 0x4e, 0x4e, 0x6e, 0x6e, 0x6c, 0x6c, 0xa2, 0xa2, + 0xc, 0x1c, 0xc, 0x1c, 0xe0, 0xc6, 0xc8, 0xe6, 0xe8, 0x20, 0x20, 8, 0x18, 0xc0, 0xc2, 0xc2, + 0, 0, 0xce, 0xce, 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xc4, 0xc4, +}; +static const uint8 kGanon_Draw_Flags[204] = { + 0x4c, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0x4c, 0x4c, 0xc, 0x4c, 0xa, + 0x4a, 0xc, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0x4c, 0x4c, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0xc, 0x4c, + 0xa, 0x4a, 0xc, 0x4c, 0x4c, 0xc, 0xc, 0xa, 0x4a, 0xc, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0x4c, + 0x4c, 0x4c, 0x4c, 0xa, 0x4a, 0xc, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0x4c, 0x4c, 0xc, 0x4c, 0xa, + 0x4a, 0xc, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0x4c, 0x4c, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0xc, 0x4c, + 0xa, 0x4a, 0xc, 0x4c, 0x4c, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0xc, 0x4c, 0xa, 0x4a, 0xc, 0x4c, + 0xa, 0x4a, 0xa, 0x4a, 0xc, 0x4c, 0xc, 0x4c, 0xc, 0xc, 0x4c, 0x4c, 0xa, 0x4a, 0xa, 0x4a, + 0xc, 0x4c, 0xc, 0x4c, 0xc, 0xc, 0x4c, 0x4c, 0xa, 0x4a, 0xa, 0x4a, 0xc, 0x4c, 0xc, 0x4c, + 0xc, 0xc, 0x4c, 0x4c, 0xa, 0x4a, 0xa, 0x4a, 0xc, 0xc, 0xc, 0x4c, 0xc, 0xc, 0x4c, 0x4c, + 0xa, 0x4a, 0xa, 0x4a, 0x4c, 0x4c, 0xc, 0x4c, 0xc, 0xc, 0x4c, 0x4c, 0xa, 0x4a, 0xa, 0x4a, + 0xc, 0x4c, 0xc, 0x4c, 0xc, 0xc, 0x4c, 0x4c, 0xa, 0x4a, 0xa, 0x4a, 0xc, 0x4c, 0xc, 0x4c, + 0xc, 0xc, 0x4c, 0x4c, 0xc, 0xa, 0xa, 0xa, 0xa, 0xc, 0x4c, 0xc, 0xc, 0xc, 0xc, 0xc, + 0xc, 0x4c, 0xa, 0x4a, 0xc, 0xc, 0x4c, 0x4c, 0xa, 0x4a, 0xc, 0x4c, +}; +static const uint8 kGanon_Draw_Char2[12] = { 0x40, 0x42, 0, 0, 0x42, 0x40, 0x82, 0x80, 0xa0, 0xa0, 0x80, 0x82 }; +static const uint8 kGanon_Draw_Flags2[12] = { 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0x40, 0, 0 }; +static HandlerFuncK *const kSpriteActiveRoutines[243] = { + &Sprite_Raven, + &Sprite_01_Vulture_bounce, + &Sprite_02_StalfosHead, + NULL, + &Sprite_PullSwitch_bounce, + &Sprite_PullSwitch_bounce, + &Sprite_PullSwitch_bounce, + &Sprite_PullSwitch_bounce, + &Sprite_08_Octorok, + &Sprite_09_Moldorm_bounce, + &Sprite_08_Octorok, + &Sprite_0B_Cucco, + &Sprite_0C_OctorokStone, + &Sprite_0D_Buzzblob, + &Sprite_0E_Snapdragon, + &Sprite_0F_Octoballoon, + &Sprite_10_OctoballoonBaby, + &Sprite_11_Hinox, + &Sprite_12_Moblin, + &Sprite_13_MiniHelmasaur, + &Sprite_14_ThievesTownGrate_bounce, + &Sprite_15_Antifairy, + &Sprite_16_Elder_bounce, + &Sprite_17_Hoarder, + &Sprite_18_MiniMoldorm, + &Sprite_19_Poe, + &Sprite_1A_Smithy, + &Sprite_1B_Arrow, + &Sprite_1C_Statue, + &Sprite_1D_FluteQuest, + &Sprite_1E_CrystalSwitch, + &Sprite_1F_SickKid, + &Sprite_20_Sluggula, + &Sprite_21_WaterSwitch, + &Sprite_22_Ropa, + &Sprite_23_RedBari, + &Sprite_23_RedBari, + &Sprite_25_TalkingTree_bounce, + &Sprite_26_HardhatBeetle, + &Sprite_27_Deadrock, + &Sprite_28_DarkWorldHintNPC, + &Sprite_HumanMulti_1, + &Sprite_SweepingLady, + &Sprite_2B_Hobo, + &Sprite_Lumberjacks, + &Sprite_2D_TelepathicTile_bounce, + &Sprite_2E_FluteKid, + &Sprite_MazeGameLady, + &Sprite_MazeGameGuy, + &Sprite_FortuneTeller, + &Sprite_QuarrelBros, + &Sprite_33_RupeePull_bounce, + &Sprite_YoungSnitchLady, + &Sprite_InnKeeper, + &Sprite_Witch, + &Sprite_37_Waterfall_bounce, + &Sprite_38_EyeStatue_bounce, + &Sprite_39_Locksmith, + &Sprite_3A_MagicBat_bounce, + &Sprite_DashItem, + &Sprite_TroughBoy, + &Sprite_OldSnitchLady, + &Sprite_17_Hoarder, + &Sprite_TutorialGuardOrBarrier_bounce, + &Sprite_TutorialGuardOrBarrier_bounce, + // Trampoline 48 entries + &Sprite_41_BlueGuard, + &Sprite_41_BlueGuard, + &Sprite_41_BlueGuard, + &Sprite_44_BluesainBolt, + &Sprite_45_UsainBolt, + &Sprite_46_BlueArcher, + &Sprite_47_GreenBushGuard, + &Sprite_48_RedJavelinGuard, + &Sprite_49_RedBushGuard, + &Sprite_4A_BombGuard, + &Sprite_4B_GreenKnifeGuard, + &Sprite_4C_Geldman, + &Sprite_4D_Toppo, + &Sprite_4E_Popo, + &Sprite_4E_Popo, + &Sprite_50_Cannonball, + &Sprite_51_ArmosStatue, + &Sprite_52_KingZora, + &Sprite_53_ArmosKnight, + &Sprite_54_Lanmolas, + &Sprite_55_Zora, + &Sprite_56_WalkingZora, + &Sprite_57_DesertStatue, + &Sprite_58_Crab, + &Sprite_59_LostWoodsBird, + &Sprite_5A_LostWoodsSquirrel, + &Sprite_5B_Spark_Clockwise, + &Sprite_5B_Spark_Clockwise, + &Sprite_5D_Roller_VerticalDownFirst, + &Sprite_5D_Roller_VerticalDownFirst, + &Sprite_5D_Roller_VerticalDownFirst, + &Sprite_5D_Roller_VerticalDownFirst, + &Sprite_61_Beamos, + &Sprite_62_MasterSword, + &Sprite_63_DebirandoPit, + &Sprite_64_Debirando, + &Sprite_65_ArcheryGame, + &Sprite_66_WallCannonVerticalLeft, + &Sprite_66_WallCannonVerticalLeft, + &Sprite_66_WallCannonVerticalLeft, + &Sprite_66_WallCannonVerticalLeft, + &Sprite_6A_BallNChain, + &Sprite_CannonTrooper, + &Sprite_6C_MirrorPortal, + &Sprite_6D_Rat, + &Sprite_6E_Rope, + &Sprite_6F_Keese, + &Sprite_70_KingHelmasaurFireball_bounce, + &Sprite_71_Leever, + &Sprite_72_FairyPond, + &Sprite_73_UncleAndPriest_bounce, + &Sprite_RunningMan, + &Sprite_BottleVendor, + &Sprite_76_Zelda, + &Sprite_15_Antifairy, + &Sprite_78_MrsSahasrahla_bounce, + // Trampoline 68 entries + &Sprite_79_Bee, + &Sprite_7A_Agahnim, + &Sprite_7B_AgahnimBalls, + &Sprite_7C_GreenStalfos, + &Sprite_7D_BigSpike, + &Sprite_7E_Firebar_Clockwise, + &Sprite_7E_Firebar_Clockwise, + &Sprite_80_Firesnake, + &Sprite_81_Hover, + &Sprite_82_AntifairyCircle, + &Sprite_83_GreenEyegore, + &Sprite_83_GreenEyegore, + &Sprite_85_YellowStalfos, + &Sprite_86_Kodongo, + &Sprite_87_KodongoFire, + &Sprite_88_Mothula, + &Sprite_89_MothulaBeam, + &Sprite_8A_SpikeBlock, + &Sprite_8B_Gibdo, + &Sprite_8C_Arrghus, + &Sprite_8D_Arrghi, + &Sprite_8E_Terrorpin, + &Sprite_8F_Blob, + &Sprite_90_Wallmaster, + &Sprite_91_StalfosKnight, + &Sprite_92_HelmasaurKing, + &Sprite_93_Bumper, + &Sprite_94_Pirogusu, + &Sprite_95_LaserEyeLeft, + &Sprite_95_LaserEyeLeft, + &Sprite_95_LaserEyeLeft, + &Sprite_95_LaserEyeLeft, + &Sprite_99_Pengator, + &Sprite_9A_Kyameron, + &Sprite_9B_Wizzrobe, + &Sprite_9C_Zoro, + &Sprite_9C_Zoro, + &Sprite_9E_HauntedGroveOstritch, + &Sprite_9F_HauntedGroveRabbit, + &Sprite_A0_HauntedGroveBird, + &Sprite_A1_Freezor, + &Sprite_A2_Kholdstare, + &Sprite_A3_KholdstareShell, + &Sprite_A4_FallingIce, + &Sprite_Zazak_Main, + &Sprite_Zazak_Main, + &Sprite_A7_Stalfos, + &Sprite_A8_GreenZirro, + &Sprite_A8_GreenZirro, + &Sprite_AA_Pikit, + &Sprite_AB_CrystalMaiden, + &Sprite_AC_Apple, + &Sprite_AD_OldMan, + &Sprite_AE_Pipe_Down, + &Sprite_AE_Pipe_Down, + &Sprite_AE_Pipe_Down, + &Sprite_AE_Pipe_Down, + &Sprite_B2_PlayerBee, + &Sprite_B3_PedestalPlaque, + &Sprite_B4_PurpleChest, + &Sprite_B5_BombShop, + &Sprite_B6_Kiki, + &Sprite_B7_BlindMaiden, + &Sprite_B8_DialogueTester, + &Sprite_B9_BullyAndPinkBall, + &Sprite_BA_Whirlpool, + &Sprite_BB_Shopkeeper, + &Sprite_BC_Drunkard, + // Trampoline 4, starts at 187, 27 entries + &Sprite_BD_Vitreous, + &Sprite_BE_VitreousEye, + &Sprite_BF_Lightning, + &Sprite_C0_Catfish, + &Sprite_C1_CutsceneAgahnim, + &Sprite_C2_Boulder, + &Sprite_C3_Gibo, + &Sprite_C4_Thief, + &Sprite_C5_Medusa, + &Sprite_C6_4WayShooter, + &Sprite_C7_Pokey, + &Sprite_C8_BigFairy, + &Sprite_C9_Tektite, + &Sprite_CA_ChainChomp, + &Sprite_CB_TrinexxRockHead, + &Sprite_CC, + &Sprite_CD, + &Sprite_CE_Blind, + &Sprite_CF_Swamola, + &Sprite_D0_Lynel, + &Sprite_D1_BunnyBeam, + &Sprite_D2_FloppingFish, + &Sprite_D3_Stal, + &Sprite_D4_Landmine, + &Sprite_D5_DigGameGuy, + &Sprite_D6_Ganon, + &Sprite_D6_Ganon, + &Sprite_D8_Heart, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_D9_GreenRupee, + &Sprite_E3_Fairy, + &Sprite_E4_SmallKey, + &Sprite_E4_SmallKey, + &Sprite_D9_GreenRupee, + &Sprite_Mushroom, + &Sprite_FakeSword, + &Sprite_PotionShop, + &Sprite_HeartContainer, + &Sprite_HeartPiece, + &Sprite_EC_ThrownItem, + &Sprite_SomariaPlatform, + &Sprite_MovableMantleTrampoline, + &Sprite_SomariaPlatform, + &Sprite_SomariaPlatform, + &Sprite_SomariaPlatform, + &Sprite_F2_MedallionTablet_bounce, +}; +static HandlerFuncK *const kSpritePrep_Main[243] = { + &SpritePrep_Raven, + &SpritePrep_Vulture, + &SpritePrep_DoNothingA, + NULL, + &SpritePrep_Switch, + &SpritePrep_DoNothingA, + &SpritePrep_Switch, + &SpritePrep_SwitchFacingUp, + &SpritePrep_Octorok, + &SpritePrep_Moldorm_bounce, + &SpritePrep_Octorok, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_Octoballoon, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_MiniHelmasaur, + &SpritePrep_ThievesTownGrate, + &SpritePrep_Antifairy, + &SpritePrep_Sage, + &SpritePrep_DoNothingA, + &SpritePrep_MiniMoldorm_bounce, + &SpritePrep_Poe, + &SpritePrep_Smithy, + &SpritePrep_DoNothingA, + &SpritePrep_Statue, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_CrystalSwitch, + &SpritePrep_SickKid, + &SpritePrep_DoNothingA, + &SpritePrep_WaterLever, + &SpritePrep_DoNothingA, + &SpritePrep_Bari, + &SpritePrep_Bari, + &SpritePrep_TalkingTree, + &SpritePrep_HardhatBeetle, + &SpritePrep_DoNothingA, + &SpritePrep_Storyteller, + &SpritePrep_Adults, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_Hobo, + &SpritePrep_MagicBat, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_FluteKid, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_FortuneTeller, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_RupeePull, + &SpritePrep_Snitch_bounce_2, + &SpritePrep_Snitch_bounce_3, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_DoNothingA, + &SpritePrep_Locksmith, + &SpritePrep_MagicBat, + &SpritePrep_BonkItem, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_Snitch_bounce_1, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_AgahnimsBarrier, + &SpritePrep_StandardGuard, + &SpritePrep_StandardGuard, + &SpritePrep_StandardGuard, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_TrooperAndArcherSoldier, + &SpritePrep_WeakGuard, + &SpritePrep_Geldman, + &SpritePrep_Kyameron, + &SpritePrep_Popo, + &SpritePrep_Popo2, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingD, + &SpritePrep_KingZora, + &SpritePrep_ArmosKnight, + &SpritePrep_Lanmolas_bounce, + &SpritePrep_SwimmingZora, + &SpritePrep_WalkingZora, + &SpritePrep_DesertStatue, + &SpritePrep_DoNothingA, + &SpritePrep_LostWoodsBird, + &SpritePrep_LostWoodsSquirrel, + &SpritePrep_Spark, + &SpritePrep_Spark, + &SpritePrep_Roller_VerticalDownFirst, + &SpritePrep_RollerUpDown, + &SpritePrep_Roller_HorizontalRightFirst, + &SpritePrep_RollerLeftRight, + &SpritePrep_DoNothingA, + &SpritePrep_MasterSword, + &SpritePrep_DebirandoPit, + &SpritePrep_FireDebirando, + &SpritePrep_ArrowGame_bounce, + &SpritePrep_WallCannon, + &SpritePrep_WallCannon, + &SpritePrep_WallCannon, + &SpritePrep_WallCannon, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_Rat, + &SpritePrep_Rope, + &SpritePrep_Keese, + &SpritePrep_DoNothingG, + &SpritePrep_FairyPond, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_UncleAndPriest_bounce, + &SpritePrep_RunningMan, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_Zelda_bounce, + &SpritePrep_Antifairy, + &SpritePrep_MrsSahasrahla, + &SpritePrep_OverworldBonkItem, + &SpritePrep_Agahnim, + &SpritePrep_DoNothingG, + &SpritePrep_GreenStalfos, + &SpritePrep_BigSpike, + &SpritePrep_FireBar, + &SpritePrep_FireBar, + &SpritePrep_DoNothingG, + &SpritePrep_DoNothingG, + &SpritePrep_AntifairyCircle, + &SpritePrep_Eyegore, + &SpritePrep_Eyegore, + &SpritePrep_DoNothingG, + &SpritePrep_Kodongo, + &SpritePrep_DoNothingG, + &SpritePrep_Mothula, + &SpritePrep_DoNothingG, + &SpritePrep_Spike, + &SpritePrep_DoNothingG, + &SpritePrep_Arrghus, + &SpritePrep_Arrghi, + &SpritePrep_DoNothingG, + &SpritePrep_Blob, + &SpritePrep_DoNothingG, + &SpritePrep_DoNothingG, + &SpritePrep_HelmasaurKing, + &SpritePrep_Bumper, + &SpritePrep_DoNothingA, + &SpritePrep_LaserEye_bounce, + &SpritePrep_LaserEye_bounce, + &SpritePrep_LaserEye_bounce, + &SpritePrep_LaserEye_bounce, + &SpritePrep_DoNothingA, + &SpritePrep_Kyameron, + &SpritePrep_DoNothingA, + &SpritePrep_Zoro, + &SpritePrep_Babasu, + &SpritePrep_HauntedGroveOstritch, + &SpritePrep_HauntedGroveAnimal, + &SpritePrep_HauntedGroveAnimal, + &SpritePrep_MoveDown_8px, + &SpritePrep_Kholdstare, + &SpritePrep_KholdstareShell, + &SpritePrep_FallingIce, + &SpritePrep_Zazakku, + &SpritePrep_Zazakku, + &SpritePrep_Stalfos, + &SpritePrep_Bomber, + &SpritePrep_Bomber, + &SpritePrep_DoNothingC, + &SpritePrep_DoNothingH, + &SpritePrep_OverworldBonkItem, + &SpritePrep_OldMan_bounce, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_NiceBee, + &SpritePrep_PedestalPlaque, + &SpritePrep_PurpleChest, + &SpritePrep_BombShoppe, + &SpritePrep_Kiki, + &SpritePrep_BlindMaiden, + &SpritePrep_DoNothingA, + &SpritePrep_BullyAndVictim, + &SpritePrep_Whirlpool, + &SpritePrep_Shopkeeper, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_Vitreous, + &SpritePrep_MiniVitreous, + &SpritePrep_DoNothingA, + &SpritePrep_Catfish, + &SpritePrep_CutsceneAgahnim, + &SpritePrep_DoNothingA, + &SpritePrep_Gibo, + &SpritePrep_DoNothingA, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_Pokey, + &SpritePrep_BigFairy, + &SpritePrep_Tektite, + &SpritePrep_Chainchomp_bounce, + &SpritePrep_Trinexx, + &SpritePrep_Trinexx, + &SpritePrep_Trinexx, + &SpritePrep_Blind, + &SpritePrep_Swamola, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_RockStal, + &SpritePrep_IgnoreProjectiles, + &SpritePrep_DiggingGameGuy_bounce, + &SpritePrep_Ganon, + &SpritePrep_Ganon, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Absorbable, + &SpritePrep_Fairy, + &SpritePrep_SmallKey, + &SpritePrep_BigKey, + &SpritePrep_ShieldPickup, + &SpritePrep_Mushroom, + &SpritePrep_FakeSword, + &SpritePrep_PotionShop, + &SpritePrep_HeartContainer, + &SpritePrep_HeartPiece, + &SpritePrep_ThrowableScenery, + &SpritePrep_DoNothingA, + &SpritePrep_Mantle, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_DoNothingA, + &SpritePrep_MedallionTable, +}; +static inline uint8 ChainBallMult(uint16 a, uint8 b); +static inline uint8 GuruguruBarMult(uint16 a, uint8 b); +static inline int8 GuruguruBarSin(uint16 a, uint8 b); +static inline uint8 ArrgiMult(uint16 a, uint8 b); +static inline int8 ArrgiSin(uint16 a, uint8 b); +static inline uint8 HelmasaurMult(uint16 a, uint8 b); +static inline int8 HelmasaurSin(uint16 a, uint8 b); +static inline uint8 TrinexxMult(uint8 a, uint8 b); +static inline uint8 TrinexxHeadMult(uint16 a, uint8 b); +static inline int8 TrinexxHeadSin(uint16 a, uint8 b); +static inline uint8 GanonMult(uint16 a, uint8 b); +static inline int8 GanonSin(uint16 a, uint8 b); +void Sprite_PullSwitch_bounce(int k) { + if (sprite_type[k] == 5 || sprite_type[k] == 7) + PullSwitch_FacingUp(k); + else + PullSwitch_FacingDown(k); +} + +void GiantMoldorm_DrawSegment_AB(int k, int lookback) { + static const DrawMultipleData kGiantMoldorm_SegA_Dmd[8] = { + {-8, -8, 0x0084, 2}, + { 8, -8, 0x0086, 2}, + {-8, 8, 0x00a4, 2}, + { 8, 8, 0x00a6, 2}, + {-8, -8, 0x4086, 2}, + { 8, -8, 0x4084, 2}, + {-8, 8, 0x40a6, 2}, + { 8, 8, 0x40a4, 2}, + }; + int j = sprite_subtype2[k] - lookback & 0x7f; + cur_sprite_x = moldorm_x_lo[j] | moldorm_x_hi[j] << 8; + cur_sprite_y = moldorm_y_lo[j] | moldorm_y_hi[j] << 8; + oam_cur_ptr += 0x10; + oam_ext_cur_ptr += 4; + Sprite_DrawMultiple(k, &kGiantMoldorm_SegA_Dmd[(sprite_subtype2[k] >> 1 & 1) * 4], 4, NULL); +} + +void GiantMoldorm_DrawSegment_C_OrTail(int k, int lookback) { + static const uint8 kGiantMoldorm_OamFlags[4] = {0, 0x40, 0xc0, 0x80}; + int j = sprite_subtype2[k] - lookback & 0x7f; + cur_sprite_x = moldorm_x_lo[j] | moldorm_x_hi[j] << 8; + cur_sprite_y = moldorm_y_lo[j] | moldorm_y_hi[j] << 8; + uint8 bak = sprite_oam_flags[k]; + sprite_oam_flags[k] = (bak & 0x3f) | kGiantMoldorm_OamFlags[sprite_subtype2[k] >> 1 & 3]; + SpriteDraw_SingleLarge(k); + sprite_oam_flags[k] = bak; +} + +void Chicken_IncrSubtype2(int k, int j) { + sprite_subtype2[k] += j; + sprite_graphics[k] = (sprite_subtype2[k] >> 4) & 1; + Sprite_ReturnIfLifted(k); +} + +bool Octoballoon_Find() { + for (int i = 15; i >= 0; i--) { + if (sprite_state[i] && sprite_type[i] == 0x10) + return true; + } + return false; +} + +bool FluteBoy_CheckIfPlayerClose(int k) { + int xx = Sprite_GetX(k); + int yy = Sprite_GetY(k) - 16; + int x = link_x_coord - xx - (yy < 0); // zelda bug: carry + int y = link_y_coord - yy - (x < 0); + if (sign16(x)) x = ~x; + if (sign16(y)) y = ~y; + return (uint16)x < 48 && (uint16)y < 48; +} + +void FortuneTeller_LightOrDarkWorld(int k, bool dark_world) { + int j; + static const uint8 kFortuneTeller_Prices[4] = {10, 15, 20, 30}; + + switch (sprite_ai_state[k]) { + case 0: // WaitForInquiry + sprite_graphics[k] = 0; + sprite_A[k] = (j = (GetRandomNumber() & 3)) << 1; + if (link_rupees_goal < kFortuneTeller_Prices[j]) + sprite_ai_state[k] = 1; + else + sprite_ai_state[k] = 2; + break; + case 1: // NotEnoughRupees + Sprite_ShowSolicitedMessage(k, 0xf2); + break; + case 2: // AskIfPlayerWantsReading + if (Sprite_ShowSolicitedMessage(k, 0xf3) & 0x100) { + sprite_delay_main[k] = 255; + flag_is_link_immobilized = 1; + sprite_ai_state[k]=3; + } + break; + case 3: // ReactToPlayerResponse + if (!choice_in_multiselect_box) { + if (!sprite_delay_main[k]) + sprite_ai_state[k]++; + sprite_graphics[k] = frame_counter >> 4 & 1; + } else { + Sprite_ShowMessageUnconditional(0xf5); + sprite_ai_state[k] = 2; + flag_is_link_immobilized = 0; + } + break; + case 4: // FortuneTeller_PerformPseudoScience + FortuneTeller_PerformPseudoScience(k); + break; + case 5: // ShowCostMessage + if (!dark_world) + sprite_graphics[k] = 0; + j = kFortuneTeller_Prices[sprite_A[k]>>1]; + byte_7E1CF2[0] = (j / 10) | (j % 10)<< 4 ; + byte_7E1CF2[1] = 0; + Sprite_ShowMessageUnconditional(0xf4); + sprite_ai_state[k]++; + break; + case 6: // DeductPayment + link_rupees_goal -= kFortuneTeller_Prices[sprite_A[k]>>1]; + sprite_ai_state[k]++; + link_hearts_filler = 160; + flag_is_link_immobilized = 0; + break; + case 7: + break; + } +} + +int GarnishAllocForce() { + int k = 29; + while (garnish_type[k--] && k >= 0) {} + return k + 1; +} + +int GarnishAlloc() { + int k = 29; + while (garnish_type[k] && k >= 0) k--; + return k; +} + +int GarnishAllocLow() { + int k = 14; + while (garnish_type[k] && k >= 0) k--; + return k; +} + +int GarnishAllocLimit(int k) { + while (garnish_type[k] && k >= 0) k--; + return k; +} + +int GarnishAllocOverwriteOldLow() { + int k = 14; + while (garnish_type[k] && k >= 0) k--; + if (k < 0) { + if (sign8(--byte_7E0FF8)) + byte_7E0FF8 = 14; + k = byte_7E0FF8; + } + return k; +} + +int GarnishAllocOverwriteOld() { + int k = 29; + while (garnish_type[k] && k >= 0) k--; + if (k < 0) { + if (sign8(--byte_7E0FF8)) + byte_7E0FF8 = 29; + k = byte_7E0FF8; + } + return k; +} + +void Garnish_SetX(int k, uint16 x) { + garnish_x_lo[k] = x; + garnish_x_hi[k] = x >> 8; +} + +void Garnish_SetY(int k, uint16 y) { + garnish_y_lo[k] = y; + garnish_y_hi[k] = y >> 8; +} + +void Sprite_WishPond3(int k) { + int j; + + switch (sprite_ai_state[k]) { + case 0: + flag_is_link_immobilized = 0; + if (sprite_delay_main[k] || Sprite_CheckIfLinkIsBusy()) + return; + if (Sprite_ShowMessageOnContact(k, 0x14a) & 0x100) { + sprite_ai_state[k] = 1; + Link_ResetProperties_A(); + link_direction_facing = 0; + sprite_head_dir[k] = 0; + } + break; + case 1: + if (!choice_in_multiselect_box) { + Sprite_ShowMessageUnconditional(0x8a); + sprite_ai_state[k] = 2; + flag_is_link_immobilized = 1; + } else { + Sprite_ShowMessageUnconditional(0x14b); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 255; + } + break; + case 2: { + sprite_ai_state[k] = 3; + j = choice_in_multiselect_box; + sprite_C[k] = j; + uint8 item = (&link_item_bow)[j]; + (&link_item_bow)[j] = 0; + uint8 t = kWishPondItemData[kWishPondItemOffs[j] + ((j == 3 || j == 32) ? 1 : item) - 1]; + AncillaAdd_TossedPondItem(0x28, t, 4); + Hud_RefreshIcon(); + sprite_graphics[k] = t; + sprite_D[k] = item; + sprite_delay_main[k] = 255; + break; + } + case 3: + if (sprite_delay_main[k] == 0) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x72, &info); + assert(j >= 0); + Sprite_SetX(j, info.r0_x); + Sprite_SetY(j, info.r2_y - 80); + music_control = 0x1b; + last_music_control = 0; + sprite_B[j] = 1; + Palette_AssertTranslucencySwap(); + PaletteFilter_WishPonds(); + sprite_E[k] = j; + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 255; + } + break; + case 4: + if (!(frame_counter & 7)) { + PaletteFilter_SP5F(); + if (!BYTE(palette_filter_countdown)) { + Sprite_ShowMessageUnconditional(0x8b); + Palette_RevertTranslucencySwap(); + TS_copy = 0; + CGADSUB_copy = 0x20; + flag_update_cgram_in_nmi++; + sprite_ai_state[k] = 5; + } + } + break; + case 5: + if (!choice_in_multiselect_box) { + sprite_ai_state[k] = 6; + } else { + sprite_ai_state[k] = 11; + } + break; + case 6: + sprite_ai_state[k] = 7; + if (!savegame_is_darkworld) { + if (sprite_graphics[k] == 12) { + sprite_graphics[k] = 42; + sprite_head_dir[k] = 1; + } else if (sprite_graphics[k] == 4) { + sprite_graphics[k] = 5; + sprite_head_dir[k] = 2; + } else if (sprite_graphics[k] == 22) { + sprite_graphics[k] = 44; + sprite_head_dir[k] = 3; + } else { + Sprite_ShowMessageUnconditional(0x14d); + return; + } + } else { + if (sprite_graphics[k] == 58) { + sprite_graphics[k] = 59; + sprite_head_dir[k] = 4; + Sprite_ShowMessageUnconditional(0x14f); + return; + } else if (sprite_graphics[k] == 2) { + sprite_graphics[k] = 3; + sprite_head_dir[k] = 5; + } else if (sprite_graphics[k] == 22) { + sprite_graphics[k] = 44; + sprite_head_dir[k] = 3; + } else { + Sprite_ShowMessageUnconditional(0x14d); + return; + } + } + Sprite_ShowMessageUnconditional(0x8c); + break; + case 7: + if (sprite_C[k] == 3) + (&link_item_bow)[sprite_C[k]] = sprite_D[k]; + Palette_AssertTranslucencySwap(); + TS_copy = 2; + CGADSUB_copy = 0x30; + flag_update_cgram_in_nmi++; + sprite_ai_state[k] = 8; + break; + case 8: + if (!(frame_counter & 7)) { + PaletteFilter_SP5F(); + if (BYTE(palette_filter_countdown) == 30) { + sprite_state[sprite_E[k]] = 0; + } else if (BYTE(palette_filter_countdown) == 0) { + sprite_ai_state[k] = 9; + } + } + break; + case 9: + PaletteFilter_RestoreSP5F(); + Palette_RevertTranslucencySwap(); + item_receipt_method = 2; + Link_ReceiveItem(sprite_graphics[k], 0); + sprite_ai_state[k] = 10; + break; + case 10: { + static const uint8 kWishPondMsgs[5] = { 0x8f, 0x90, 0x92, 0x91, 0x93 }; + if (sprite_head_dir[k]) + Sprite_ShowMessageUnconditional(kWishPondMsgs[sprite_head_dir[k] - 1]); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 255; + break; + } + case 11: + Sprite_ShowMessageUnconditional(0x8d); + sprite_ai_state[k] = 12; + break; + case 12: + if (!choice_in_multiselect_box) + sprite_ai_state[k] = 13; + else + sprite_ai_state[k] = 6; + break; + case 13: + Sprite_ShowMessageUnconditional(0x8e); + sprite_ai_state[k] = 7; + break; + } +} + +int Sprite_SpawnSmallSplash(int k) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xec, &info, 14); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sound_effect_1 = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x28); + sprite_state[j] = 3; + sprite_delay_main[j] = 15; + sprite_ai_state[j] = 0; + sprite_flags2[j] = 3; + } + return j; +} + +void HeartUpgrade_CheckIfAlreadyObtained(int k) { + if (!player_is_indoors) { + if (BYTE(overworld_screen_index) == 0x3b && !(save_ow_event_info[0x3b] & 0x20) || + save_ow_event_info[BYTE(overworld_screen_index)] & 0x40) + sprite_state[k] = 0; + } else { + int j = sprite_x_hi[k] & 1; + if (dung_savegame_state_bits & (j ? 0x2000 : 0x4000)) + sprite_state[k] = 0; + } +} + +void Sprite_MovableMantleTrampoline(int k) { + MovableMantle_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + + if (savegame_tagalong != 1 || !link_item_torch || link_is_running || sprite_G[k] == 0x90 || sign8(link_actual_vel_x - 24)) + return; + + which_starting_point = 4; + sprite_subtype2[k]++; + + if (!(sprite_subtype2[k] & 1)) + sprite_G[k]++; + + if (sprite_G[k] < 8) + return; + if (sound_effect_1 == 0) + sound_effect_1 = 34; + sprite_x_vel[k] = 2; + Sprite_MoveXY(k); +} + +void Sprite_GoodOrBadArcheryTarget(int k) { + static const uint8 kArcheryGame_CashPrize[10] = {4, 8, 16, 32, 64, 99, 99, 99, 99, 99}; + if (sprite_A[k] == 1) { + // good target + if (sprite_G[k] >= 5) + sprite_B[k] = 6; + sprite_flags2[k] &= ~0x1f; + int j = sprite_delay_aux2[k] ? sprite_delay_aux2[k] : (sprite_subtype2[k] >> 3); + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | (j & 4) << 4; + BYTE(cur_sprite_y) -= 3; + SpriteDraw_SingleLarge(k); + if (sprite_delay_aux2[k]) { + if (sprite_delay_aux2[k] == 96 && !submodule_index) { + sprite_delay_main[0] = 112; + link_rupees_goal += kArcheryGame_CashPrize[sprite_B[k] - 1]; + } + sprite_flags2[k] |= 5; + ArcheryGame_DrawPrize(k); + } + } else { + // bad target + sprite_flags2[k] &= ~0x1f; + BYTE(cur_sprite_y) += 3; + SpriteDraw_SingleLarge(k); + } + if (Sprite_ReturnIfInactive(k)) + return; + + if (sprite_delay_aux3[k] == 1) + sound_effect_1 = 0x3c; + sprite_subtype2[k]++; + Sprite_MoveX(k); + if (!sprite_delay_aux1[k]) { + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (sprite_delay_main[k] == 0) { + if (Sprite_CheckTileCollision(k)) { + sprite_delay_main[k] = 16; + sprite_delay_aux2[k] = 0; + } + } else if (sprite_delay_main[k] == 1) { + static const int8 kArcheryTarget_X[2] = {-24, 8}; + sprite_x_lo[k] = kArcheryTarget_X[sprite_graphics[k]]; + sprite_x_hi[k] = link_x_coord >> 8; + sprite_delay_aux1[k] = 32; + sprite_G[k] = 0; + } + } +} + +static inline uint8 ChainBallMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +void ChainBallTrooper_Draw(int k) { + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteDraw_GuardHead(k, &info, 0x18 / 4); + SpriteDraw_BNCBody(k, &info, 0x14 / 4); + SpriteDraw_BNCFlail(k, &info); + + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &info, kSoldier_DrawShadow[sprite_D[k]]); +} + +void Sprite_CannonTrooper(int k) { + if (sprite_C[k] != 0) { + Sprite_Cannonball(k); + return; + } + assert(0); +} + +void Bee_PutInBottle(int k) { + Bee_HandleInteractions(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!choice_in_multiselect_box) { + int j = Sprite_Find_EmptyBottle(); + if (j >= 0) { + link_bottle_info[j] = 7 + sprite_head_dir[k]; + Hud_RefreshIcon(); + sprite_state[k] = 0; + return; + } + Sprite_ShowMessageUnconditional(0xca); + } + sprite_delay_aux4[k] = 64; + sprite_ai_state[k] = 1; +} + +static inline uint8 GuruguruBarMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +static inline int8 GuruguruBarSin(uint16 a, uint8 b) { + uint8 t = GuruguruBarMult(kSinusLookupTable[a & 0xff], b); + return (a & 0x100) ? -t : t; +} + +static inline uint8 ArrgiMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +static inline int8 ArrgiSin(uint16 a, uint8 b) { + uint8 t = ArrgiMult(kSinusLookupTable[a & 0xff], b); + return (a & 0x100) ? -t : t; +} + +static inline uint8 HelmasaurMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +static inline int8 HelmasaurSin(uint16 a, uint8 b) { + uint8 t = HelmasaurMult(kSinusLookupTable[a & 0xff], b); + return (a & 0x100) ? -t : t; +} + +void Sprite_Wizzbeam(int k) { + Wizzbeam_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_oam_flags[k] ^= 6; + sprite_subtype2[k]++; + if (!sprite_ai_state[k]) + Sprite_CheckDamageToLink(k); + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + sprite_state[k] = 0; +} + +void Kiki_LyingInwait(int k) { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (link_is_bunny_mirror | link_disable_sprite_damage | countdown_for_blink || savegame_tagalong == 10) + return; + if (save_ow_event_info[BYTE(overworld_screen_index)] & 0x20) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + savegame_tagalong = 10; + tagalong_var5 = 0; + LoadFollowerGraphics(); + Follower_Initialize(); + } +} + +int ChainChomp_OneMult(uint8 a, uint8 b) { + uint8 at = sign8(a) ? -a : a; + uint8 prod = at * b >> 8; + return sign8(a) ? ~prod : prod; +} + +static inline uint8 TrinexxMult(uint8 a, uint8 b) { + uint8 at = sign8(a) ? -a : a; + int p = at * b; + uint8 res = (p >> 8) + (p >> 7 & 1); + return sign8(a) ? -res : res; +} + +static inline uint8 TrinexxHeadMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +static inline int8 TrinexxHeadSin(uint16 a, uint8 b) { + uint8 t = TrinexxHeadMult(kSinusLookupTable[a & 0xff], b); + return (a & 0x100) ? -t : t; +} + +void Sprite_CC(int k) { + if (!sprite_E[k]) { + Sprite_Sidenexx(k); + return; + } + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_TrinexxFire_AddFireGarnish(k); + Sprite_CC_CD_Common(k); +} + +void Sprite_CD(int k) { + if (!sprite_E[k]) { + Sprite_Sidenexx(k); + return; + } + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + uint8 old_xvel = sprite_x_vel[k]; + sprite_x_vel[k] += sprite_C[k]; + Sprite_MoveXY(k); + sprite_x_vel[k] = old_xvel; + Sprite_CD_SpawnGarnish(k); + Sprite_CC_CD_Common(k); +} + +static inline uint8 GanonMult(uint16 a, uint8 b) { + if (a >= 256) + return b; + int p = a * b; + return (p >> 8) + (p >> 7 & 1); +} + +static inline int8 GanonSin(uint16 a, uint8 b) { + uint8 t = GanonMult(kSinusLookupTable[a & 0xff], b); + return (a & 0x100) ? -t : t; +} + +void SpritePrep_IncrXYLow8(int k) { + sprite_x_lo[k] += 8; + sprite_y_lo[k] += 8; +} + +void SpritePrep_FakeSword(int k) { +} + +void SpritePrep_MedallionTable(int k) { + sprite_ignore_projectile[k]++; + if (BYTE(overworld_screen_index) != 3) { + sprite_x_lo[k] += 8; + if (link_item_bombos_medallion) { + sprite_graphics[k] = 4; + sprite_ai_state[k] = 3; + } + } else { + if (link_item_ether_medallion) { + sprite_graphics[k] = 4; + sprite_ai_state[k] = 3; + } + } +} + +void Hobo_Draw(int k) { // 84ea60 + static const DrawMultipleData kHobo_Dmd[12] = { + {-5, 3, 0x00a6, 2}, + { 3, 3, 0x00a7, 2}, + {-5, 3, 0x00a6, 2}, + { 3, 3, 0x00a7, 2}, + {-5, 3, 0x00ab, 0}, + { 3, 3, 0x00a7, 2}, + {-5, 3, 0x00a6, 2}, + { 3, 3, 0x00a7, 2}, + { 5, -11, 0x008a, 2}, + {-5, 3, 0x00ab, 0}, + { 3, 3, 0x0088, 2}, + {-5, 3, 0x00a6, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kHobo_Dmd[sprite_graphics[k] * 4], 4, NULL); +} + +bool Landmine_CheckDetonationFromHammer(int k) { // 84ea81 + if (!(link_item_in_hand & 10) || player_oam_y_offset == 0x80) + return false; + SpriteHitBox hb; + Player_SetupActionHitBox(&hb); + Sprite_SetupHitBox(k, &hb); + return CheckIfHitBoxesOverlap(&hb); +} + +void Sprite_DrawLargeWaterTurbulence(int k) { // 84ebe5 + static const DrawMultipleData kWaterTurbulence_Dmd[6] = { + {-10, 14, 0x00c0, 2}, + { -5, 16, 0x40c0, 2}, + { -2, 18, 0x00c0, 2}, + { 2, 18, 0x40c0, 2}, + { 5, 16, 0x00c0, 2}, + { 10, 14, 0x40c0, 2}, + }; + uint8 bak = sprite_oam_flags[k]; + sprite_oam_flags[k] = (sprite_subtype2[k] >> 1 & 1) ? 0x44 : 4; + sprite_obj_prio[k] &= ~0xf; + Oam_AllocateFromRegionC(sprite_obj_prio[k]); // wtf????? + Sprite_DrawMultiple(k, kWaterTurbulence_Dmd, 6, NULL); + sprite_oam_flags[k] = bak; +} + +void Sprite_SpawnSparkleGarnish(int k) { // 858008 + static const int8 kSparkleGarnish_Coord[4] = {-4, 0, 4, 8}; + if (frame_counter & 3) + return; + int j = GarnishAllocForce(); + garnish_type[j] = 0x12; + garnish_active = 0x12; + int x = Sprite_GetX(k) + kSparkleGarnish_Coord[GetRandomNumber() & 3]; + int y = Sprite_GetY(k) + kSparkleGarnish_Coord[GetRandomNumber() & 3]; + garnish_x_lo[j] = x; + garnish_x_hi[j] = x >> 8; + garnish_y_lo[j] = y; + garnish_y_hi[j] = y >> 8; + garnish_sprite[j] = k; + garnish_countdown[j] = 15; +} + +void Sprite_70_KingHelmasaurFireball_bounce(int k) { // 85807f + static const uint8 kHelmasaurFireball_Char[3] = {0xcc, 0xcc, 0xca}; + static const uint8 kHelmasaurFireball_Flags[2] = {0x33, 0x73}; + static const uint8 kHelmasaurFireball_Gfx[4] = {2, 2, 1, 0}; + OamEnt *oam = GetOamCurPtr(); + uint8 flags = kHelmasaurFireball_Flags[++sprite_subtype2[k] >> 2 & 1]; + + if ((uint8)((oam->x = sprite_x_lo[k] - BG2HOFS_copy2) + 32) < 64 || + (uint8)((oam->y = sprite_y_lo[k] - BG2VOFS_copy2) + 16) < 32) { + sprite_state[k] = 0; + return; + } + oam->charnum = kHelmasaurFireball_Char[sprite_graphics[k]]; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = 2; + + if (Sprite_ReturnIfInactive(k)) + return; + if (!((k ^ frame_counter) & 3) && + (uint16)(link_x_coord - cur_sprite_x + 8) < 16 && + (uint16)(link_y_coord - cur_sprite_y + 16) < 16) { + Sprite_AttemptDamageToLinkPlusRecoil(k); + } + switch (sprite_ai_state[k]) { + case 0: // pre migrate down + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 18; + sprite_ai_state[k] = 1; + sprite_y_vel[k] = 36; + } + break; + case 1: // migrate down + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 31; + } + sprite_y_vel[k] -= 2; + Sprite_MoveY(k); + break; + case 2: // delay tri split + if (!sprite_delay_main[k]) + HelmasaurFireball_TriSplit(k); + else + sprite_graphics[k] = kHelmasaurFireball_Gfx[sprite_delay_main[k] >> 3]; + break; + case 3: // delay quad split + if (!sprite_delay_main[k]) { + HelmasaurFireball_QuadSplit(k); + } else if (sprite_head_dir[k] < 20) { + sprite_head_dir[k]++; + Sprite_MoveXY(k); + } + break; + case 4: // move + Sprite_MoveXY(k); + break; + } +} + +void Sprite_66_WallCannonVerticalLeft(int k) { // 858090 + static const int8 kWallCannon_Xvel[4] = {0, 0, -16, 16}; + static const int8 kWallCannon_Yvel[4] = {-16, 16, 0, 0}; + static const uint8 kWallCannon_Gfx[4] = {0, 0, 2, 2}; + static const uint8 kWallCannon_OamFlags[4] = {0x40, 0, 0, 0x80}; + static const int8 kWallCannon_Spawn_X[4] = {8, -8, 0, 0}; + static const int8 kWallCannon_Spawn_Y[4] = {0, 0, 8, -8}; + static const int8 kWallCannon_Spawn_Xvel[4] = {24, -24, 0, 0}; + static const int8 kWallCannon_Spawn_Yvel[4] = {0, 0, 24, -24}; + + int j = sprite_D[k]; + sprite_graphics[k] = kWallCannon_Gfx[j] + (sprite_delay_aux2[k] != 0); + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kWallCannon_OamFlags[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 128; + sprite_A[k] ^= 1; + } + j = sprite_A[k]; + sprite_x_vel[k] = kWallCannon_Xvel[j]; + sprite_y_vel[k] = kWallCannon_Yvel[j]; + Sprite_MoveXY(k); + + if (!((k << 2) + frame_counter & 31)) + sprite_delay_aux2[k] = 16; + if (sprite_delay_aux2[k] != 1 || sprite_pause[k]) + return; + SpriteSpawnInfo info; + j = Sprite_SpawnDynamicallyEx(k, 0x6B, &info, 13); + if (j >= 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x7); + sprite_C[j] = 1; + sprite_graphics[j] = 1; + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kWallCannon_Spawn_X[i]); + Sprite_SetY(j, info.r2_y + kWallCannon_Spawn_Y[i]); + sprite_x_vel[j] = kWallCannon_Spawn_Xvel[i]; + sprite_y_vel[j] = kWallCannon_Spawn_Yvel[i]; + sprite_flags2[j] = sprite_flags2[j] & 0xf0 | 1; + sprite_flags3[j] |= 0x47; + sprite_defl_bits[j] |= 0x44; + sprite_delay_main[j] = 32; + } +} + +void Sprite_65_ArcheryGame(int k) { // 8581ff + link_num_arrows = sprite_subtype[k]; + if (sprite_A[k] == 0) + ArcheryGame_Host(k); + else + Sprite_GoodOrBadArcheryTarget(k); +} + +void ArcheryGame_Host(int k) { // 858217 + if (!archery_game_arrows_left) + archery_game_out_of_arrows++; + ArcheryGameGuy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_flags4[k] = 0; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); + } + if (sprite_delay_main[k]) { + if (!(sprite_delay_main[k] & 7)) + SpriteSfx_QueueSfx2WithPan(k, 0x11); + sprite_graphics[k] = (sprite_delay_main[k] & 4) >> 2; + } else { + static const uint8 kArcheryGameGuy_Gfx[4] = {3, 4, 3, 2}; + sprite_graphics[k] = kArcheryGameGuy_Gfx[sprite_ai_state[k] ? (frame_counter >> 5 & 3) : 0]; + } + + switch (sprite_ai_state[k]) { + case 0: + sprite_flags4[k] = 10; + if (Sprite_CheckDamageToLink_same_layer(k) && filtered_joypad_L & 0x80) { + sprite_ai_state[k] = 1; + ArcheryGameGuy_ShowMsg(k, 0x85); + } + break; + case 1: + case 3: + if (!choice_in_multiselect_box && link_rupees_goal >= 20) { + sprite_head_dir[k] = 0; + byte_7E0B88 = 0; + sprite_ai_state[k] = 2; + ArcheryGameGuy_ShowMsg(k, 0x86); + } else { + sprite_ai_state[k] = 0; + ArcheryGameGuy_ShowMsg(k, 0x87); + } + break; + case 2: + ArcheryGame_Host_ProctorGame(k); + break; + } +} + +void ArcheryGameGuy_ShowMsg(int k, int msg) { // 8582bf + dialogue_message_index = msg; + Sprite_ShowMessageMinimal(); + sprite_delay_main[k] = 0; +} + +void ArcheryGame_Host_ProctorGame(int k) { // 8582d4 + static const uint8 kArcheryGame_NumSpr[6] = {5, 4, 3, 2, 1, 0}; + static const int8 kArcheryGame_X[18] = { 0, 0, 0, 0, 48, 48, 48, 48, 8, 8, 16, 16, 24, 24, 32, 32, 40, 40, }; + static const int8 kArcheryGame_Y[18] = {-8, 0, 8, 16, -8, 0, 8, 16, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8 }; + static const uint8 kArcheryGame_Char[18] = { 0x2b, 0x3b, 0x3b, 0x2b, 0x2b, 0x3b, 0x3b, 0x2b, 0x63, 0x73, 0x63, 0x73, 0x63, 0x73, 0x63, 0x73, 0x63, 0x73 }; + static const uint8 kArcheryGame_Flags[18] = { 0x33, 0x33, 0xb3, 0xb3, 0x73, 0x73, 0xf3, 0xf3, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32 }; + + if (!sprite_head_dir[k]) { + archery_game_arrows_left = 5; + Sprite_InitializeSecondaryItemMinigame(2); + sprite_delay_aux1[k] = 39; + link_rupees_goal -= 20; + sprite_head_dir[k]++; + } + Oam_AllocateFromRegionA(0x34); + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int i = sprite_delay_aux1[k] ? kArcheryGame_NumSpr[sprite_delay_aux1[k] >> 3] : archery_game_arrows_left; + i = i * 2 + 7; + do { + oam->x = info.x - 20 + kArcheryGame_X[i] + 1; + oam->y = info.y - 48 + kArcheryGame_Y[i] + 1; + oam->charnum = kArcheryGame_Char[i]; + oam->flags = kArcheryGame_Flags[i]; + bytewise_extended_oam[oam - oam_buf] = 0; + } while (oam++, --i >= 0); + + if (archery_game_arrows_left | sprite_delay_aux4[k] | + ancilla_type[0] | ancilla_type[1] | ancilla_type[2] | ancilla_type[3] | ancilla_type[4]) + return; + sprite_flags4[k] = 0xA; + if (Sprite_CheckDamageToLink_same_layer(k) && filtered_joypad_L & 0x80) { + ArcheryGameGuy_ShowMsg(k, 0x88); + sprite_ai_state[k] = 3; + } +} + +void ArcheryGame_DrawPrize(int k) { // 8584cf + static const int8 kGoodArcheryTarget_X[5] = {-8, -8, 0, 8, 16}; + static const int8 kGoodArcheryTarget_Y[5] = {-24, -16, -20, -20, -20}; + static const uint8 kGoodArcheryTarget_Draw_Char[3] = {0xb, 0x1b, 0xb6}; + static const int8 kGoodArcheryTarget_Draw_Flags[5] = {0x38, 0x38, 0x34, 0x35, 0x35}; + static const uint8 kGoodArcheryTarget_Draw_Char3[6] = {0x12, 0x32, 0x31, 3, 0x22, 0x33}; + static const uint8 kGoodArcheryTarget_Draw_Char4[6] = {0x7c, 0x7c, 0x22, 2, 0x12, 0x33}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr() + 1; + int b = sprite_B[k]; + for (int i = 4; i >= 0; i--, oam++) { + oam->x = info.x + kGoodArcheryTarget_X[i]; + oam->y = info.y + kGoodArcheryTarget_Y[i]; + oam->charnum = (i == 4) ? kGoodArcheryTarget_Draw_Char4[b - 1] : + (i == 3) ? kGoodArcheryTarget_Draw_Char3[b - 1] : kGoodArcheryTarget_Draw_Char[i]; + oam->flags = kGoodArcheryTarget_Draw_Flags[i] & (oam->charnum < 0x7c ? 0xff : 0xfe); + bytewise_extended_oam[oam - oam_buf] = 0; + } + Sprite_DrawDistress_custom(info.x, info.y, frame_counter); +} + +void Sprite_63_DebirandoPit(int k) { // 858531 + static const uint8 kDebirandoPit_OpeningGfx[4] = {5, 4, 3, 3}; + static const uint8 kDebirandoPit_ClosingGfx[4] = {3, 3, 4, 5}; + + PointU8 pt; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.y + 0x20) < 0x40 && (uint8)(pt.x + 0x20) < 0x40) + Oam_AllocateFromRegionB(16); + + DebirandoPit_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + int j = sprite_head_dir[k]; + if (sprite_state[j] == 6) { + sprite_state[k] = sprite_state[j]; + sprite_delay_main[k] = sprite_delay_main[j]; + sprite_flags2[k] += 4; + return; + } + if (sprite_graphics[k] < 3 && Sprite_CheckDamageToLink_same_layer(k)) { + Link_CancelDash(); + if (!(filtered_joypad_L & 16)) + link_prevent_from_moving = 1; + Sprite_ApplySpeedTowardsLink(k, 16); + uint8 v = sprite_y_vel[k]; + int t; + sprite_A[k] = (t = (sign8(v) ? (uint8)-v : v) + sprite_A[k]); + if (t >= 256) + drag_player_y = sign8(v) ? 1 : -1; + + v = sprite_x_vel[k]; + sprite_B[k] = (t = (sign8(v) ? (uint8)-v : v) + sprite_B[k]); + if (t >= 256) + drag_player_x = sign8(v) ? 1 : -1; + } + switch (sprite_ai_state[k]) { + case 0: // closed + sprite_graphics[k] = 6; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 63; + } + break; + case 1: // opening + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 255; + } else { + sprite_graphics[k] = kDebirandoPit_OpeningGfx[sprite_delay_main[k] >> 4]; + } + break; + case 2: // open + if (!(frame_counter & 15) && ++sprite_graphics[k] >= 3) + sprite_graphics[k] = 0; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 63; + sprite_ai_state[k] = 3; + } + break; + case 3: // closing + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + } else { + sprite_graphics[k] = kDebirandoPit_ClosingGfx[sprite_delay_main[k] >> 4]; + } + break; + } +} + +void DebirandoPit_Draw(int k) { // 8586e4 + static const int16 kDebirandoPit_Draw_X[24] = { + -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, 0, 8, 0, 8, + 0, 8, 0, 8, -8, 8, -8, 8, + }; + static const int16 kDebirandoPit_Draw_Y[24] = { + -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, 0, 0, 8, 8, + 0, 0, 8, 8, -8, -8, 8, 8, + }; + static const uint8 kDebirandoPit_Draw_Char[24] = { + 4, 4, 4, 4, 0x22, 0x22, 0x22, 0x22, 2, 2, 2, 2, 0x29, 0x29, 0x29, 0x29, + 0x39, 0x39, 0x39, 0x39, 0x2a, 0x2a, 0x2a, 0x2a, + }; + static const uint8 kDebirandoPit_Draw_Flags[24] = { + 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, + 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, + }; + static const uint8 kDebirandoPit_Draw_Ext[6] = {2, 2, 2, 0, 0, 2}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + int g = sprite_graphics[k]; + if (g == 6) + return; + OamEnt *oam = GetOamCurPtr(); + uint8 ext = kDebirandoPit_Draw_Ext[g]; + for (int i = 3; i >= 0; i--, oam++) { + int j = g * 4 + i; + uint16 x = info.x + kDebirandoPit_Draw_X[j]; + uint16 y = info.y + kDebirandoPit_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kDebirandoPit_Draw_Char[j]; + oam->flags = kDebirandoPit_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = ext | (x >> 8 & 1); + } +} + +void Sprite_64_Debirando(int k) { // 85874d + static const uint8 kDebirando_Emerge_Gfx[2] = {1, 0}; + static const uint8 kDebirando_Submerge_Gfx[2] = {0, 1}; + Debirando_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // under sand + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 31; + } + break; + case 1: // emerge + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 128; + } else { + sprite_graphics[k] = kDebirando_Emerge_Gfx[sprite_delay_main[k] >> 4]; + } + break; + case 2: // fireball + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 31; + sprite_ai_state[k]++; + } else { + if (!(sprite_delay_main[k] & 31 | sprite_G[k] | submodule_index | sprite_pause[k] | flag_unk1)) + Sprite_SpawnFireball(k); + sprite_graphics[k] = (++sprite_subtype2[k] >> 3 & 1) + 2; + } + break; + case 3: // submerge + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 223; + } else { + sprite_graphics[k] = kDebirando_Submerge_Gfx[sprite_delay_main[k] >> 4]; + } + break; + } +} + +void Debirando_Draw(int k) { // 858857 + if (!sprite_ai_state[k]) + return; + static const int8 kDebirando_Draw_X[16] = {0, 8, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}; + static const int8 kDebirando_Draw_Y[16] = {2, 2, 6, 6, -2, -2, 6, 6, -4, -4, -4, -4, -4, -4, -4, -4}; + static const uint8 kDebirando_Draw_Char[16] = {0, 0, 0xd8, 0xd8, 0, 0, 0xd9, 0xd9, 0, 0, 0, 0, 0x20, 0x20, 0x20, 0x20}; + static const uint8 kDebirando_Draw_Flags[16] = {1, 0x41, 0, 0x40, 1, 1, 0, 0x40, 1, 1, 1, 1, 1, 1, 1, 1}; + static const uint8 kDebirando_Draw_Ext[16] = {0, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int d = sprite_graphics[k] * 4; + for (int i = 3; i >= 0; i--, oam++) { + int j = d + i; + uint16 x = info.x + kDebirando_Draw_X[j]; + uint16 y = info.y + kDebirando_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kDebirando_Draw_Char[j]; + uint8 f = kDebirando_Draw_Flags[j]; + oam->flags = (f ^ info.flags) & ((f & 0xf) == 0 ? 0xf0 : 0xff); + bytewise_extended_oam[oam - oam_buf] = kDebirando_Draw_Ext[j] | (x >> 8 & 1); + } +} + +void Sprite_62_MasterSword(int k) { // 8588c5 + switch (sprite_subtype2[k]) { + case 0: MasterSword_Main(k); break; + case 1: Sprite_MasterSword_LightFountain(k); break; + case 2: Sprite_MasterSword_LightBeam(k); break; + case 3: Sprite_MasterSword_Prop(k); break; + case 4: Sprite_MasterSword_LightWell(k); break; + } +} + +void MasterSword_Main(int k) { // 8588d6 + if (main_module_index != 26 && save_ow_event_info[BYTE(overworld_screen_index)] & 0x40) { + sprite_state[k] = 0; + return; + } + if (sprite_ai_state[k] != 5) + MasterSword_Draw(k); + switch (sprite_ai_state[k]) { + case 0: // waiting + if (Sprite_CheckIfLinkIsBusy() || !Sprite_CheckDamageToLink_same_layer(k) || link_direction_facing != 2 || + !(filtered_joypad_L & 0x80) || (link_which_pendants & 7) != 7) + return; + + music_control = 10; + link_disable_sprite_damage = 1; + MasterSword_SpawnPendantProp(k, 9); + MasterSword_SpawnPendantProp(k, 11); + MasterSword_SpawnPendantProp(k, 15); + MasterSword_SpawnLightWell(k); + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 240; + break; + case 1: // pendants transfer + if (!sprite_delay_main[k]) { + MasterSword_SpawnLightFountain(k); + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 192; + } + link_unk_master_sword = 10; + flag_is_link_immobilized = 1; + break; + case 2: // light show + if (!sprite_delay_main[k]) { + MasterSword_SpawnLightBeam(k, 0, 0xff); + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 8; + } + link_unk_master_sword = 10; + flag_is_link_immobilized = 1; + break; + case 3: // + if (!sprite_delay_main[k]) { + MasterSword_SpawnLightBeam(k, 1, 0xff); + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 16; + } + link_unk_master_sword = 11; + flag_is_link_immobilized = 1; + break; + case 4: // give to player + if (!sprite_delay_main[k]) { + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x40; + item_receipt_method = 0; + Link_ReceiveItem(1, 0); + savegame_map_icons_indicator = 5; + link_unk_master_sword = 0; + sprite_ai_state[k] = 5; + } + break; + case 5: // stop + sprite_state[k] = 0; + break; + } +} + +void Sprite_MasterSword_LightFountain(int k) { // 8589dc + static const uint8 kMasterSword_Gfx1[9] = {0, 1, 1, 2, 2, 2, 1, 1, 0}; + static const uint8 kMasterSword_NumLightBeams[9] = {0, 0, 1, 1, 2, 2, 0, 0, 0}; + SpriteDraw_LightFountain(k); + sprite_A[k]++; + if (!sprite_A[k]) { + sprite_C[k]++; + sprite_state[k] = 0; + } + sprite_D[k] = sprite_A[k] >> 2 & 3; + int j = sprite_A[k] >> 5 & 7; + sprite_graphics[k] = kMasterSword_Gfx1[j]; + if (kMasterSword_NumLightBeams[j]) + MasterSword_SpawnLightBeam(k, sprite_A[k] >> 2 & 1, kMasterSword_NumLightBeams[j]); +} + +void Sprite_MasterSword_LightWell(int k) { // 858a16 + SpriteDraw_LightFountain(k); + sprite_A[k]++; + if (!sprite_A[k]) { + sprite_C[k]++; + sprite_state[k] = 0; + } + sprite_D[k] = sprite_A[k] >> 2 & 3; + sprite_graphics[k] = 0; +} + +void SpriteDraw_LightFountain(int k) { // 858a94 + static const DrawMultipleData kMasterSword_LightBall_Dmd[12] = { + {-6, 4, 0x0082, 2}, + {-6, 4, 0x4082, 2}, + {-6, 4, 0xc082, 2}, + {-6, 4, 0x8082, 2}, + {-6, 4, 0x00a0, 2}, + {-6, 4, 0x40a0, 2}, + {-6, 4, 0xc0a0, 2}, + {-6, 4, 0x80a0, 2}, + {-6, 4, 0x0080, 2}, + {-6, 4, 0x4080, 2}, + {-6, 4, 0xc080, 2}, + {-6, 4, 0x8080, 2}, + }; + Oam_AllocateFromRegionC(4); + Sprite_DrawMultiple(k, &kMasterSword_LightBall_Dmd[sprite_graphics[k] * 4 + sprite_D[k]], 1, NULL); +} + +void MasterSword_SpawnLightWell(int k) { // 858ab6 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x62, &info); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_subtype2[j] = 4; + sprite_oam_flags[j] = 5; + sprite_flags2[j] = 0; +} + +void MasterSword_SpawnLightFountain(int k) { // 858ad0 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x62, &info); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_subtype2[j] = 1; + sprite_oam_flags[j] = 5; + sprite_flags2[j] = 0; +} + +void Sprite_MasterSword_LightBeam(int k) { // 858aea + SpriteDraw_SingleLarge(k); + if (sprite_A[k]) { + Sprite_MoveXY(k); + if (frame_counter & 3) + return; + MasterSword_SpawnReplacementLightBeam(k); + } + if (!--sprite_B[k]) + sprite_state[k] = 0; +} + +void MasterSword_SpawnReplacementLightBeam(int k) { // 858b20 + SpriteSpawnInfo info; + int j; + if ((j = Sprite_SpawnDynamically(k, 0x62, &info)) < 0) + return; + Sprite_SetX(j, info.r0_x); + Sprite_SetY(j, info.r2_y); + sprite_subtype2[j] = 2; + sprite_B[j] = 3; + sprite_graphics[j] = sprite_graphics[k]; + sprite_oam_flags[j] = sprite_oam_flags[k]; + sprite_flags2[j] = 0; +} + +void MasterSword_SpawnLightBeam(int k, uint8 ain, uint8 yin) { // 858b62 + static const int8 kMasterSword_LightBeam_Xv0[2] = {0, -48}; + static const int8 kMasterSword_LightBeam_Xv1[2] = {0, 48}; + static const int8 kMasterSword_LightBeam_Xv2[2] = {-96, -48}; + static const int8 kMasterSword_LightBeam_Xv3[2] = {96, 48}; + static const int8 kMasterSword_LightBeam_Yv0[2] = {-96, -48}; + static const int8 kMasterSword_LightBeam_Yv1[2] = {96, 48}; + static const int8 kMasterSword_LightBeam_Yv2[2] = {0, 48}; + static const int8 kMasterSword_LightBeam_Yv3[2] = {0, -48}; + static const uint8 kMasterSword_LightBeam_Gfx0[2] = {1, 0}; + static const uint8 kMasterSword_LightBeam_Gfx2[2] = {3, 2}; + static const uint8 kMasterSword_LightBeam_Flags0[2] = {5, 0x45}; + static const uint8 kMasterSword_LightBeam_Flags2[2] = {5, 5}; + + SpriteSpawnInfo info; + int j; + if ((j = Sprite_SpawnDynamically(k, 0x62, &info)) < 0) + return; + Sprite_SetX(j, info.r0_x - 4); + Sprite_SetY(j, info.r2_y + 4); + sprite_subtype2[j] = 2; + sprite_A[j] = 2; + sprite_flags2[j] = 0; + sprite_x_vel[j] = kMasterSword_LightBeam_Xv0[ain]; + sprite_y_vel[j] = kMasterSword_LightBeam_Yv0[ain]; + sprite_graphics[j] = kMasterSword_LightBeam_Gfx0[ain]; + sprite_oam_flags[j] = kMasterSword_LightBeam_Flags0[ain]; + sprite_B[j] = yin; + + if ((j = Sprite_SpawnDynamically(k, 0x62, &info)) < 0) + return; + Sprite_SetX(j, info.r0_x - 4); + Sprite_SetY(j, info.r2_y + 4); + sprite_subtype2[j] = 2; + sprite_A[j] = 2; + sprite_flags2[j] = 0; + sprite_x_vel[j] = kMasterSword_LightBeam_Xv1[ain]; + sprite_y_vel[j] = kMasterSword_LightBeam_Yv1[ain]; + sprite_graphics[j] = kMasterSword_LightBeam_Gfx0[ain]; + sprite_oam_flags[j] = kMasterSword_LightBeam_Flags0[ain]; + sprite_B[j] = yin; + + if ((j = Sprite_SpawnDynamically(k, 0x62, &info)) < 0) + return; + Sprite_SetX(j, info.r0_x - 4); + Sprite_SetY(j, info.r2_y + 4); + sprite_subtype2[j] = 2; + sprite_A[j] = 2; + sprite_flags2[j] = 0; + sprite_x_vel[j] = kMasterSword_LightBeam_Xv2[ain]; + sprite_y_vel[j] = kMasterSword_LightBeam_Yv2[ain]; + sprite_graphics[j] = kMasterSword_LightBeam_Gfx2[ain]; + sprite_oam_flags[j] = kMasterSword_LightBeam_Flags2[ain]; + sprite_B[j] = yin; + + if ((j = Sprite_SpawnDynamically(k, 0x62, &info)) < 0) + return; + Sprite_SetX(j, info.r0_x - 4); + Sprite_SetY(j, info.r2_y + 4); + sprite_subtype2[j] = 2; + sprite_A[j] = 2; + sprite_flags2[j] = 0; + sprite_x_vel[j] = kMasterSword_LightBeam_Xv3[ain]; + sprite_y_vel[j] = kMasterSword_LightBeam_Yv3[ain]; + sprite_graphics[j] = kMasterSword_LightBeam_Gfx2[ain]; + sprite_oam_flags[j] = kMasterSword_LightBeam_Flags2[ain]; + sprite_B[j] = yin; +} + +void MasterSword_SpawnPendantProp(int k, uint8 ain) { // 858cd3 + static const int8 kMasterSword_Pendant_Xv[4] = {-4, 4, 0, 0}; + static const int8 kMasterSword_Pendant_Yv[4] = {-2, -2, -4, -4}; + SpriteSpawnInfo info; + int j; + if ((j = Sprite_SpawnDynamically(k, 0x62, &info)) < 0) + return; + sprite_oam_flags[j] = ain; + Sprite_SetX(j, link_x_coord); + Sprite_SetY(j, link_y_coord + 8); + sprite_graphics[j] = 4; + sprite_subtype2[j] = 3; + sprite_flags2[j] = 64; + sprite_delay_main[j] = 228; + int i = ain >> 1 & 3; + sprite_x_vel[j] = kMasterSword_Pendant_Xv[i]; + sprite_y_vel[j] = kMasterSword_Pendant_Yv[i]; +} + +void Sprite_MasterSword_Prop(int k) { // 858d29 + Oam_AllocateFromRegionB(4); + SpriteDraw_SingleLarge(k); + switch (sprite_ai_state[k]) { + case 0: // drifting away + Sprite_MoveXY(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 208; + sprite_A[k] = sprite_oam_flags[k]; + } + break; + case 1: // flashing + sprite_oam_flags[k] = (sprite_oam_flags[k] & ~0xe) | ((k << 1 ^ frame_counter) & 0xe); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_oam_flags[k] = sprite_A[k]; + } + break; + case 2: // fly + Sprite_MoveXY(k); + if (!sprite_delay_main[k]) { + sprite_x_vel[k] <<= 1; + sprite_y_vel[k] <<= 1; + sprite_delay_main[k] = 6; + } + sprite_E[k]++; + if (sprite_E[k] == 0) + sprite_state[k] = 0; + break; + } +} + +void MasterSword_Draw(int k) { // 858da8 + static const int8 kMasterSword_Draw_X[6] = {-8, 0, -8, 0, -8, 0}; + static const int8 kMasterSword_Draw_Y[6] = {-8, -8, 0, 0, 8, 8}; + static const uint8 kMasterSword_Draw_Char[6] = {0xc3, 0xc4, 0xd3, 0xd4, 0xe0, 0xf0}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + for (int i = 5; i >= 0; i--, oam++) { + oam->x = kMasterSword_Draw_X[i] + info.x; + oam->y = kMasterSword_Draw_Y[i] + info.y; + oam->charnum = kMasterSword_Draw_Char[i]; + oam->flags = info.flags; + } + Sprite_CorrectOamEntries(k, 5, 0); +} + +void Sprite_5D_Roller_VerticalDownFirst(int k) { // 858dde + static const int8 kSpikeRoller_XYvel[6] = {-16, 16, 0, 0, -16, 16}; + sprite_graphics[k] = sprite_subtype2[k] >> 1 & 1 | sprite_D[k] & 2; + SpikeRoller_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 112; + sprite_D[k] ^= 1; + } + int j = sprite_D[k]; + sprite_x_vel[k] = kSpikeRoller_XYvel[j]; + sprite_y_vel[k] = kSpikeRoller_XYvel[j + 2]; + Sprite_MoveXY(k); + sprite_subtype2[k]++; +} + +void SpikeRoller_Draw(int k) { // 858ee3 + static const uint8 kSpikeRoller_Draw_X[32] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, + }; + static const uint8 kSpikeRoller_Draw_Y[32] = { + 0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + static const uint8 kSpikeRoller_Draw_Char[32] = { + 0x8e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x8e, 0x8e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x8e, + 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, + }; + static const uint8 kSpikeRoller_Draw_Flags[32] = { + 0, 0, 0, 0x80, 0, 0, 0, 0x80, 0x40, 0x40, 0x40, 0xc0, 0x40, 0x40, 0x40, 0xc0, + 0, 0, 0, 0x40, 0, 0, 0, 0x40, 0x80, 0x80, 0x80, 0xc0, 0x80, 0x80, 0x80, 0xc0, + }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + uint8 chr = kSpikeRoller_Draw_Char[g * 8]; + + for (int i = sprite_ai_state[k] ? 7 : 3; i >= 0; i--, oam++) { + int j = g * 8 + i; + uint16 x = info.x + kSpikeRoller_Draw_X[j]; + uint16 y = info.y + kSpikeRoller_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = chr ? chr : kSpikeRoller_Draw_Char[j]; + chr = 0; + oam->flags = kSpikeRoller_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void Sprite_61_Beamos(int k) { // 858f54 + if (sprite_C[k] == 1) { + Sprite_Beamos_Laser(k); + return; + } else if (sprite_C[k] != 0) { + Sprite_Beamos_LaserHit(k); + return; + } + + Beamos_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckTileCollision(k); + Sprite_CheckDamageToLink(k); + switch (sprite_ai_state[k]) { + case 0: + if (!((k ^ frame_counter) & 3)) { + Sprite_SpawnProbeAlways(k, sprite_D[k]); + sprite_D[k]++; + } + sprite_D[k] &= 63; + break; + case 3: + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 80; + SpritePrep_LoadPalette(k); + } else { + if (sprite_delay_main[k] == 15) + Beamos_FireLaser(k); + sprite_oam_flags[k] ^= (sprite_delay_main[k] >> 1 & 0xe); + } + break; + default: + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 0; + break; + } +} + +void Beamos_FireLaser(int k) { // 858fc2 + if (sprite_limit_instance >= 4) + return; + SpriteSpawnInfo info; + int j, t; + if ((j = Sprite_SpawnDynamically(k, 0x61, &info)) < 0) + return; + SpriteSfx_QueueSfx3WithPan(k, 0x19); + Sprite_SetX(j, info.r0_x + (int8)BYTE(dungmap_var7)); + Sprite_SetY(j, info.r2_y + (int8)HIBYTE(dungmap_var7)); + Sprite_ApplySpeedTowardsLink(j, 0x20); + sprite_flags2[j] = 0x3f; + sprite_flags4[j] = 0x54; + sprite_C[j] = 1; + sprite_defl_bits[j] = 0x48; + sprite_oam_flags[j] = 3; + sprite_bump_damage[j] = 4; + sprite_delay_aux1[j] = 12; + sprite_graphics[j] = t = sprite_limit_instance++; + for (int i = 0; i < 32; i++) { + beamos_x_lo[t * 32 + i] = sprite_x_lo[j]; + beamos_x_hi[t * 32 + i] = sprite_x_hi[j]; + beamos_y_lo[t * 32 + i] = sprite_y_lo[j]; + beamos_y_hi[t * 32 + i] = sprite_y_hi[j]; + } +} + +void Beamos_Draw(int k) { // 859068 + static const int8 kBeamos_Draw_Y[2] = {-16, 0}; + static const int8 kBeamos_Draw_Char[2] = {0x48, 0x68}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + int spr_offs = 0; + if (sprite_D[k] < 0x20) { + Oam_AllocateFromRegionB(12); + spr_offs = 1; + } else { + Oam_AllocateFromRegionC(12); + } + OamEnt *oam = GetOamCurPtr() + spr_offs; + for (int i = 1; i >= 0; i--, oam++) { + uint16 x = info.x; + uint16 y = info.y + kBeamos_Draw_Y[i]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kBeamos_Draw_Char[i]; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } + SpriteDraw_Beamos_Eyeball(k, &info); +} + +void SpriteDraw_Beamos_Eyeball(int k, PrepOamCoordsRet *info) { // 859151 + static const int8 kBeamosEyeball_Draw_X[32] = { + -1, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, + 17, 15, 14, 13, 12, 11, 10, 8, 7, 5, 4, 3, 2, 1, 0, -2, + }; + static const int8 kBeamosEyeball_Draw_Y[32] = { + 11, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 14, 14, 13, 12, 11, + 10, 9, 8, 7, 7, 6, 6, 6, 6, 6, 6, 7, 7, 8, 9, 10, + }; + static const uint8 kBeamosEyeball_Draw_Char[32] = { + 0x5b, 0x5b, 0x5a, 0x5a, 0x4b, 0x4b, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x5a, 0x5a, 0x5b, 0x5b, + 0x5b, 0x5b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x5b, 0x5b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + }; + static const uint8 kBeamosEyeball_Draw_Flags[32] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, + }; + int n = (sprite_D[k] < 0x20) ? 0 : 2; + OamEnt *oam = GetOamCurPtr() + n; + int i = sprite_D[k] >> 1; + BYTE(dungmap_var7) = kBeamosEyeball_Draw_X[i] - 3; + oam->x = BYTE(dungmap_var7) + info->x; + HIBYTE(dungmap_var7) = kBeamosEyeball_Draw_Y[i] - 18; + oam->y = HIBYTE(dungmap_var7) + info->y; + oam->charnum = kBeamosEyeball_Draw_Char[i]; + oam->flags = info->flags&0x31|0xA|kBeamosEyeball_Draw_Flags[i]; + oam_cur_ptr += n * 4; + oam_ext_cur_ptr += n; + Sprite_CorrectOamEntries(k, 0, 0); +} + +void Sprite_Beamos_Laser(int k) { // 8591b5 + + + if (sprite_delay_aux1[k]) + return; + BeamosLaser_Draw(k); + if (!sprite_state[k]) { + sprite_limit_instance--; + return; + } + if (Sprite_ReturnIfInactive(k)) + return; + for (int i = 3; i >= 0; i--) { + int t = (sprite_subtype2[k]++ & 31) + sprite_graphics[k] * 32; + beamos_y_hi[t] = sprite_y_hi[k]; + beamos_y_lo[t] = sprite_y_lo[k]; + beamos_x_hi[t] = sprite_x_hi[k]; + beamos_x_lo[t] = sprite_x_lo[k]; + Sprite_MoveXY(k); + } + + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] == 1) { + sprite_state[k] = 0; + sprite_limit_instance--; + } + return; + } + if (!Sprite_CheckDamageToLink_same_layer(k) && !Sprite_CheckTileCollision(k)) + return; + SpriteSfx_QueueSfx3WithPan(k, 0x26); + sprite_delay_main[k] = 16; + Sprite_ZeroVelocity_XY(k); + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x61, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_delay_main[j] = 16; + sprite_flags2[j] = 3; + sprite_C[j] = 2; + sprite_flags3[j] = 0x40; + } + sprite_y_hi[k] = 128; +} + +void BeamosLaser_Draw(int k) { // 85925b + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 31; i >= 0; i--, oam++) { + int j = g * 32 + i; + uint16 x = (beamos_x_lo[j] | beamos_x_hi[j] << 8) - BG2HOFS_copy2; + uint16 y = (beamos_y_lo[j] | beamos_y_hi[j] << 8) - BG2VOFS_copy2; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0x5c; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } +} + +void Sprite_Beamos_LaserHit(int k) { // 8592da + static const int8 kBeamosLaserHit_Draw_X[4] = {-4, 4, -4, 4}; + static const int8 kBeamosLaserHit_Draw_Y[4] = {-4, -4, 4, 4}; + static const uint8 kBeamosLaserHit_Draw_Flags[4] = {6, 0x46, 0x86, 0xc6}; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + for (int i = 3; i >= 0; i--, oam++) { + uint16 x = info.x + kBeamosLaserHit_Draw_X[i]; + uint16 y = info.y + kBeamosLaserHit_Draw_Y[i]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0xd6; + oam->flags = kBeamosLaserHit_Draw_Flags[i] | info.flags & 0x30; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } +} + +void Sprite_5B_Spark_Clockwise(int k) { // 85933f + static const uint8 kSpark_OamFlags[4] = {0, 0x40, 0x80, 0xc0}; + static const uint8 kSpark_directions[8] = {1, 3, 2, 0, 7, 5, 6, 4}; + int j; + + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!(frame_counter & 1)) + sprite_oam_flags[k] ^= 6; + if (!sprite_ai_state[k]) { + sprite_ai_state[k] = 1; + sprite_x_vel[k] = sprite_y_vel[k] = 1; + uint8 coll = Sprite_CheckTileCollision(k); + sprite_x_vel[k] = sprite_y_vel[k] = -1; + coll |= Sprite_CheckTileCollision(k); + if (coll < 4) + j = (coll & 1) ? 0 : 1; + else + j = (coll & 4) ? 2 : 3; + sprite_D[k] = kSpark_directions[(sprite_type[k] != 0x5c) * 4 + j]; + } + + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kSpark_OamFlags[frame_counter >> 2 & 3]; + Sprite_MoveXY(k); + Sprite_CheckDamageToLink(k); + j = sprite_D[k]; + sprite_x_vel[k] = kSoldierB_Xvel[j]; + sprite_y_vel[k] = kSoldierB_Yvel[j]; + Sprite_CheckTileCollision(k); + + j = sprite_D[k]; + if (sprite_delay_aux2[k]) { + if (sprite_delay_aux2[k] == 6) + j = kSoldierB_NextB[j]; + } else { + if (!(sprite_wallcoll[k] & kSoldierB_Mask[j])) + sprite_delay_aux2[k] = 10; + } + if (sprite_wallcoll[k] & kSoldierB_Mask2[j]) + j = kSoldierB_NextB2[j]; + sprite_D[k] = j; + sprite_x_vel[k] = kSoldierB_Xvel2[j] * 2; + sprite_y_vel[k] = kSoldierB_Yvel2[j] * 2; +} + +void Sprite_59_LostWoodsBird(int k) { // 85940e + if (sprite_delay_aux1[k]) + return; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | (sign8(sprite_x_vel[k]) ? 0 : 0x40); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + switch (sprite_ai_state[k]) { + case 0: + sprite_graphics[k] = 0; + if (sign8(--sprite_z_vel[k] - 0xf1)) + sprite_ai_state[k] = 1; + break; + case 1: + sprite_z_vel[k] += 2; + if (!sign8(sprite_z_vel[k] - 0x10)) + sprite_ai_state[k] = 0; + sprite_graphics[k] = ++sprite_subtype2[k] >> 1 & 1; + break; + } +} + +void Sprite_5A_LostWoodsSquirrel(int k) { // 859468 + if (sprite_delay_aux1[k]) + return; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | (sign8(sprite_x_vel[k]) ? 0 : 0x40); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 16; + sprite_delay_main[k] = 12; + } + sprite_graphics[k] = sprite_delay_main[k] ? 1 : 0; +} + +void Sprite_58_Crab(int k) { // 8594b5 + static const int8 kCrab_Xvel[4] = {28, -28, 0, 0}; + static const int8 kCrab_Yvel[4] = {0, 0, 12, -12}; + Crab_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k) || !sprite_delay_main[k]) { + sprite_delay_main[k] = (GetRandomNumber() & 63) + 32; + sprite_D[k] = sprite_delay_main[k] & 3; + } + int j = sprite_D[k]; + sprite_x_vel[k] = kCrab_Xvel[j & 3]; + sprite_y_vel[k] = kCrab_Yvel[j & 3]; + sprite_graphics[k] = (++sprite_subtype2[k] >> (j < 2 ? 1 : 3)) & 1; +} + +void Crab_Draw(int k) { // 859510 + static const int16 kCrab_Draw_X[4] = {-8, 8, -8, 8}; + static const uint8 kCrab_Draw_Char[4] = {0x8e, 0x8e, 0xae, 0xae}; + static const int8 kCrab_Draw_Flags[4] = {0, 0x40, 0, 0x40}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int d = sprite_graphics[k] * 2; + for (int i = 1; i >= 0; i--, oam++) { + int j = d + i; + uint16 x = info.x + kCrab_Draw_X[j]; + uint16 y = info.y; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kCrab_Draw_Char[j]; + oam->flags = kCrab_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } + SpriteDraw_Shadow(k, &info); +} + +void Sprite_57_DesertStatue(int k) { // 85956d + static const uint8 kDesertBarrier_NextD[4] = {3, 2, 0, 1}; + DesertBarrier_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + bool dmg = Sprite_CheckDamageToLink_same_layer(k); + if (dmg) { + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + } + if (sprite_delay_main[k] || sign8(sprite_ai_state[k])) + return; + + if (sprite_ai_state[k] == 0) { + if (!byte_7E02F0) + return; + sprite_ai_state[k] = byte_7E02F0; + sprite_delay_main[k] = 128; + sound_effect_ambient = 7; + } + + if (dmg && !link_incapacitated_timer) { + link_incapacitated_timer = 16; + Sprite_ApplySpeedTowardsLink(k, 32); + } + + int j = sprite_D[k]; + sprite_x_vel[k] = kDesertBarrier_Xv[j]; + sprite_y_vel[k] = kDesertBarrier_Yv[j]; + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + sprite_D[k] = kDesertBarrier_NextD[sprite_D[k]]; + flag_is_link_immobilized = 1; + if (!(++sprite_subtype2[k] & 1)) { + if (++sprite_G[k] == 130) { + sprite_ai_state[k] = 128; + flag_is_link_immobilized = 0; + } + } +} + +void DesertBarrier_Draw(int k) { // 859626 + static const DrawMultipleData kDesertBarrier_Dmd[4] = { + {-8, -8, 0x008e, 2}, + { 8, -8, 0x408e, 2}, + {-8, 8, 0x00ae, 2}, + { 8, 8, 0x40ae, 2}, + }; + if (sprite_delay_main[k] == 1) { + sound_effect_2 = 0x1b; + sound_effect_ambient = 5; + } + BYTE(cur_sprite_x) += (sprite_delay_main[k] >> 1) & 1; + PointU8 pt; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 0x20) < 0x40 && (uint8)(pt.y + 0x20) < 0x40) + Oam_AllocateFromRegionB(16); + Sprite_DrawMultiple(k, kDesertBarrier_Dmd, 4, NULL); +} + +void Sprite_55_Zora(int k) { // 85967b + if (sprite_E[k]) + Sprite_Fireball(k); + else + Sprite_Zora_Main(k); +} + +void Sprite_Fireball(int k) { // 859683 + static const uint8 kSprite_ZoraFireball_Offs[4] = {3, 2, 0, 0}; + static const int8 kSprite_ZoraFireball_X[4] = {4, 4, -4, 16}; + static const int8 kSprite_ZoraFireball_Y[4] = {0, 16, 8, 8}; + static const uint8 kSprite_ZoraFireball_W[4] = {8, 8, 4, 4}; + static const uint8 kSprite_ZoraFireball_H[4] = {4, 4, 8, 8}; + + sprite_ignore_projectile[k] = sprite_E[k]; + if (sprite_delay_main[k]) + Oam_AllocateFromRegionC(4); + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + Fireball_SpawnTrailGarnish(k); + if (Sprite_CheckDamageToLink(k)) { + sprite_state[k] = 0; + return; + } + Sprite_MoveXY(k); + if (player_is_indoors && !sprite_delay_aux1[k] && !((k ^ frame_counter) & 3) && Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + return; + } + + if ((link_is_bunny_mirror | link_disable_sprite_damage) || sign8(link_state_bits) || link_shield_type < 2 || + link_is_on_lower_level != sprite_floor[k]) + return; + SpriteHitBox hb; + Sprite_SetupHitBox(k, &hb); + int j = link_direction_facing >> 1; + if (button_b_frames) + j = kSprite_ZoraFireball_Offs[j]; + int x = link_x_coord + kSprite_ZoraFireball_X[j], y = link_y_coord + kSprite_ZoraFireball_Y[j]; + hb.r0_xlo = x; + hb.r8_xhi = x >> 8; + hb.r2 = kSprite_ZoraFireball_W[j]; + hb.r1_ylo = y; + hb.r9_yhi = y >> 8; + hb.r3 = kSprite_ZoraFireball_H[j]; + if (CheckIfHitBoxesOverlap(&hb)) { + Sprite_PlaceRupulseSpark_2(k); + sprite_state[k] = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x6); + } +} + +void Sprite_Zora_Main(int k) { // 859725 + static const int8 kSprite_Zora_Surface_XY[8] = {-32, -24, -16, -8, 8, 16, 24, 32}; + static const uint8 kSprite_Zora_AttackGfx[8] = {5, 5, 6, 10, 6, 5, 5, 5}; + static const uint8 kSprite_Zora_SubmergeGfx[12] = {12, 11, 9, 8, 7, 0, 0, 0, 0, 0, 0, 0}; + PrepOamCoordsRet info; + if (!sprite_ai_state[k]) + Sprite_PrepOamCoord(k, &info); + else + Zora_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // choose surfacing location + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + Sprite_SetX(k, (sprite_A[k] | sprite_B[k] << 8) + kSprite_Zora_Surface_XY[GetRandomNumber() & 7]); + Sprite_SetY(k, (sprite_C[k] | sprite_head_dir[k] << 8) + kSprite_Zora_Surface_XY[GetRandomNumber() & 7]); + Sprite_Get16BitCoords(k); + Sprite_CheckTileCollision(k); + if (sprite_tiletype == 8) { + sprite_delay_main[k] = 127; + sprite_ai_state[k]++; + sprite_flags3[k] |= 0x40; + } + } + break; + case 1: // surfacing + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 127; + sprite_flags3[k] &= ~0x40; + } else { + sprite_graphics[k] = kSprite_Zora_SurfacingGfx[sprite_delay_main[k] >> 3]; + } + break; + case 2: // attack + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 23; + } else { + if (sprite_delay_main[k] == 48) + Sprite_SpawnFireball(k); + sprite_graphics[k] = kSprite_Zora_AttackGfx[sprite_delay_main[k] >> 4]; + } + break; + case 3: // submerging + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 128; + sprite_graphics[k] = 0; + sprite_ai_state[k] = 0; + } else { + sprite_graphics[k] = kSprite_Zora_SubmergeGfx[sprite_delay_main[k] >> 2]; + } + break; + } +} + +void Zora_Draw(int k) { // 8598f5 + static const int8 kZora_Draw_X[26] = { + 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 11, 0, 4, -8, 18, -8, 18, + }; + static const int8 kZora_Draw_Y[26] = { + 4, 4, 0, 0, 0, 0, 0, -3, 0, -3, -3, -3, -3, -3, -3, -3, + -6, -6, -8, -9, -3, 5, -10, -11, -10, -11, + }; + static const uint8 kZora_Draw_Char[26] = { + 0xa8, 0xa8, 0x88, 0x88, 0x88, 0x88, 0x88, 0xa4, 0x88, 0xa4, 0xa4, 0xa4, 0xa6, 0xa6, 0xa4, 0xc0, + 0x8a, 0x8a, 0xae, 0xaf, 0xa6, 0x8d, 0xcf, 0xcf, 0xdf, 0xdf, + }; + static const uint8 kZora_Draw_Flags[26] = { + 0x25, 0x25, 0x25, 0x25, 0xe5, 0xe5, 0x25, 0x20, 0xe5, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, + 0x25, 0x25, 0x24, 0x64, 0x20, 0x26, 0x24, 0x64, 0x24, 0x64, + }; + static const uint8 kZora_Draw_Ext[26] = { + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, + }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int d = sprite_graphics[k] * 2; + for (int i = 1; i >= 0; i--, oam++) { + int j = d + i; + uint16 x = info.x + kZora_Draw_X[j]; + uint16 y = info.y + kZora_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kZora_Draw_Char[j]; + uint8 f = kZora_Draw_Flags[j]; + oam->flags = f | (f & 0xf ? 0 : info.flags); + bytewise_extended_oam[oam - oam_buf] = kZora_Draw_Ext[j] | (x >> 8 & 1); + } +} + +void Sprite_52_KingZora(int k) { // 85995b + ZoraKing_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // WaitingForPlayer + if ((uint16)(link_x_coord - cur_sprite_x + 16) < 32 && (uint16)(link_y_coord - cur_sprite_y + 48) < 96) { + Link_CancelDash(); + sprite_delay_main[k] = 127; + sound_effect_1 = 0x35; + sprite_ai_state[k] = 1; + for (int j = 15; j >= 0; j--) { + if (j != k && !(sprite_defl_bits[j] & 0x80)) { + if (sprite_state[j] == 10) { + link_state_bits = 0; + link_picking_throw_state = 0; + } + Sprite_KillSelf(j); + } + } + } + break; + case 1: // RumblingGround + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 127; + bg1_x_offset = 0; + sprite_graphics[k] = 4; + } else { + bg1_x_offset = sprite_delay_main[k] & 1 ? -1 : 1; + flag_is_link_immobilized = 1; + } + break; + case 2: { // Surfacing + static const uint8 kZoraKing_Surfacing_Gfx[16] = {0, 0, 0, 3, 9, 8, 7, 6, 9, 8, 7, 6, 5, 4, 5, 4}; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 127; + } else { + if (sprite_delay_main[k] == 28) { + sprite_delay_aux2[k] = 15; + Sprite_SpawnBigSplash(k); + } + sprite_graphics[k] = kZoraKing_Surfacing_Gfx[sprite_delay_main[k] >> 3]; + } + break; + } + case 3: { // Dialogue + static const uint8 kZoraKing_Dialogue_Gfx[8] = {0, 0, 1, 2, 1, 2, 0, 0}; + int j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 36; + return; + } + sprite_graphics[k] = kZoraKing_Dialogue_Gfx[j >> 4]; + if (j == 80) { + dialogue_message_index = 0x142; + Sprite_ShowMessageMinimal(); + } else if (j == 79) { + if (choice_in_multiselect_box == 0) { + dialogue_message_index = 0x143; + Sprite_ShowMessageMinimal(); + } else { + dialogue_message_index = 0x146; + Sprite_ShowMessageMinimal(); + sprite_delay_main[k] = 0x30; + } + } else if (j == 78) { + if (choice_in_multiselect_box == 0 && link_rupees_goal >= 500) { + link_rupees_goal -= 500; + dialogue_message_index = 0x144; + Sprite_ShowMessageMinimal(); + sprite_E[k] = 1; + } else { + dialogue_message_index = 0x145; + Sprite_ShowMessageMinimal(); + sprite_delay_main[k] = 0x30; + } + } else if (j == 77) { + if (sprite_E[k]) + Sprite_Zora_RegurgitateFlippers(k); + } + break; + } + case 4: { // Submerge + static const uint8 kZoraKing_Submerge_Gfx[21] = { + 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 10, 10, 10, 10, 3, + 3, 3, 3, 3, 3, + }; + int j = sprite_delay_main[k]; + if (!j) { + Sprite_KillSelf(k); + flag_is_link_immobilized = 0; + } else { + if (j == 29) { + sprite_delay_aux2[k] = 15; + Sprite_SpawnBigSplash(k); + } + sprite_graphics[k] = kZoraKing_Submerge_Gfx[sprite_delay_main[k] >> 1]; + } + break; + } + } +} + +void Sprite_SpawnBigSplash(int k) { // 859b40 + static const int8 kSpawnSplashRing_X[8] = {-8, -5, 4, 13, 16, 13, 4, -5}; + static const int8 kSpawnSplashRing_Y[8] = {4, -5, -8, -5, 4, 13, 16, 13}; + static const int8 kSpawnSplashRing_Xvel[8] = {-8, -6, 0, 6, 8, 6, 0, -6}; + static const int8 kSpawnSplashRing_Yvel[8] = {0, -6, -8, -6, 0, 6, 8, 6}; + SpriteSfx_QueueSfx2WithPan(k, 0x24); + + for (int i = 7; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 8, &info); + if (j >= 0) { + sprite_state[j] = 3; + Sprite_SetX(j, info.r0_x + kSpawnSplashRing_X[i] - 4); + Sprite_SetY(j, info.r2_y + kSpawnSplashRing_Y[i] - 4); + sprite_x_vel[j] = kSpawnSplashRing_Xvel[i]; + sprite_y_vel[j] = kSpawnSplashRing_Yvel[i]; + sprite_A[j] = i; + sprite_z_vel[j] = (GetRandomNumber() & 15) + 24; + sprite_ai_state[j] = 1; + sprite_z[j] = 0; + sprite_flags3[j] |= 0x40; + sprite_ignore_projectile[j] = sprite_flags3[j]; + } + } +} + +void ZoraKing_Draw(int k) { // 859cab + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + + if (sprite_ai_state[k] >= 2) { + static const int8 kZoraKing_Draw_X0[52] = { + -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, -8, 8, -8, 8, -8, 8, -8, 8, + -8, 8, -8, 8, -8, 8, -8, 8, -9, 9, -9, 9, -10, 10, -10, 10, + -11, 11, -11, 11, + }; + static const int8 kZoraKing_Draw_Y0[52] = { + -18, -18, -2, -2, -18, -18, -2, -2, -18, -18, -2, -2, -12, -12, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, -8, -8, 8, 8, -8, -8, 8, 8, + -8, -8, 8, 8, -8, -8, 8, 8, -5, -5, 5, 5, -5, -5, 5, 5, + -5, -5, 5, 5, + }; + static const uint8 kZoraKing_Draw_Char0[52] = { + 0xc0, 0xc0, 0xe0, 0xe0, 0xc2, 0xea, 0xe2, 0xe2, 0xea, 0xc2, 0xe2, 0xe2, 0xc0, 0xc0, 0xe4, 0xe6, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xc4, 0xc6, 0xe4, 0xe6, 0xc6, 0xc4, 0xe6, 0xe4, + 0xe6, 0xe4, 0xc6, 0xc4, 0xe4, 0xe6, 0xc4, 0xc6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, + }; + static const uint8 kZoraKing_Draw_Flags0[52] = { + 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 5, 5, + 5, 5, 5, 5, 0xc5, 0xc5, 0xc5, 0xc5, 5, 5, 5, 5, 0x45, 0x45, 0x45, 0x45, + 0xc5, 0xc5, 0xc5, 0xc5, 0x85, 0x85, 0x85, 0x85, 4, 0x44, 0x84, 0xc4, 4, 0x44, 0x84, 0xc4, + 4, 0x44, 0x84, 0xc4, + }; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 3; i >= 0; i--, oam++) { + int j = g * 4 + i; + oam->x = kZoraKing_Draw_X0[j] + info.x; + oam->y = kZoraKing_Draw_Y0[j] + info.y; + oam->charnum = kZoraKing_Draw_Char0[j]; + uint8 f = kZoraKing_Draw_Flags0[j]; + oam->flags = (f & 0xf ? f : f | info.flags) | 0x20; + } + Sprite_CorrectOamEntries(k, 3, 2); + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + } + + if (!sprite_delay_aux2[k]) + return; + + static const int8 kZoraKing_Draw_X1[8] = {-23, 23, 23, 23, -20, -15, 13, 18}; + static const int8 kZoraKing_Draw_Y1[8] = {-8, -8, -8, -8, -7, 0, 0, -7}; + static const uint8 kZoraKing_Draw_Char1[8] = {0xae, 0xae, 0xae, 0xae, 0xac, 0xac, 0xac, 0xac}; + static const uint8 kZoraKing_Draw_Flags1[8] = {0, 0x40, 0x40, 0x40, 0, 0, 0x40, 0x40}; + Oam_AllocateFromRegionC(0x10); + OamEnt *oam = GetOamCurPtr(); + int g = (sprite_delay_aux2[k] >> 1) & 4; + for (int i = 3; i >= 0; i--, oam++) { + int j = g + i; + oam->x = kZoraKing_Draw_X1[j] + info.x; + oam->y = kZoraKing_Draw_Y1[j] + info.y; + oam->charnum = kZoraKing_Draw_Char1[j]; + oam->flags = kZoraKing_Draw_Flags1[j] | 0x24; + bytewise_extended_oam[oam - oam_buf] = 2; + } +} + +void Sprite_56_WalkingZora(int k) { // 859d4a + if (sprite_F[k]) { + sprite_F[k] = 0; + sprite_B[k] = 3; + sprite_G[k] = 192; + sprite_x_vel[k] = (int8)sprite_x_recoil[k] >> 1; + sprite_y_vel[k] = (int8)sprite_y_recoil[k] >> 1; + } + PrepOamCoordsRet info; + switch(sprite_B[k]) { + case 0: // Waiting + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 127; + sprite_B[k]++; + sprite_flags3[k] |= 64; + } + break; + case 1: // Surfacing + Zora_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_flags3[k] &= ~0x40; + SpriteSfx_QueueSfx2WithPan(k, 0x28); + sprite_B[k]++; + sprite_z_vel[k] = 48; + sprite_head_dir[k] = sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + } else { + sprite_graphics[k] = kSprite_Zora_SurfacingGfx[sprite_delay_main[k] >> 3]; + } + break; + case 2: // Ambulating + sprite_graphics[k] = kSprite_Recruit_Gfx[(sprite_subtype2[k] >> 1 & 4) + sprite_D[k]]; + WalkingZora_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k] - 1)) { + if (sign8(sprite_z_vel[k] + 16)) + Sprite_ZeroVelocity_XY(k); + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + if (!((k ^ frame_counter) & 15)) { + int j = Sprite_DirectionToFaceLink(k, NULL); + sprite_head_dir[k] = j; + if (!((k ^ frame_counter) & 31)) { + sprite_D[k] = j; + Sprite_ApplySpeedTowardsLink(k, 8); + } + } + } + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if (sign8(sprite_z[k] - 1)) { + WalkingZora_AdjustShadow(k); + if (sprite_tiletype == 8) { + Sprite_KillSelf(k); + SpriteSfx_QueueSfx2WithPan(k, 0x28); + sprite_state[k] = 3; + sprite_delay_main[k] = 15; + sprite_ai_state[k] = 0; + sprite_flags2[k] = 3; + } + } + sprite_subtype2[k]++; + break; + case 3: // Depressed + Sprite_CheckDamageFromLink(k); + if (!(frame_counter & 3) && !--sprite_G[k]) { + sprite_B[k] = 2; + if (sprite_state[k] == 10) { + link_state_bits = 0; + link_picking_throw_state = 0; + } + sprite_state[k] = 9; + } + if (sprite_G[k] < 48 && !(frame_counter & 1)) + Sprite_SetX(k, Sprite_GetX(k) + (frame_counter & 2 ? -1 : 1)); + sprite_graphics[k] = 0; + sprite_wallcoll[k] = 0; + WalkingZora_DrawWaterRipples(k); + sprite_flags2[k] -= 2; + SpriteDraw_SingleLarge(k); + sprite_flags2[k] += 2; + sprite_anim_clock[k] = 0; + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_MoveXY(k); + ThrownSprite_TileAndSpriteInteraction(k); + WalkingZora_AdjustShadow(k); + break; + } +} + +void WalkingZora_AdjustShadow(int k) { // 859edb + sprite_anim_clock[k] = (sprite_z[k] == 0 && sprite_tiletype == 9); +} + +void WalkingZora_Draw(int k) { // 859f08 + static const uint8 kWalkingZora_Draw_Char[4] = {0xce, 0xce, 0xa4, 0xee}; + static const uint8 kWalkingZora_Draw_Flags[4] = {0x40, 0, 0, 0}; + static const uint8 kWalkingZora_Draw_Char2[8] = {0xcc, 0xec, 0xcc, 0xec, 0xe8, 0xe8, 0xca, 0xca}; + static const uint8 kWalkingZora_Draw_Flags2[8] = {0x40, 0x40, 0, 0, 0, 0x40, 0, 0x40}; + + PrepOamCoordsRet info; + WalkingZora_DrawWaterRipples(k); + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + if (g == 0 || g == 2) + info.y--; + + int i = sprite_head_dir[k]; + oam->x = info.x; + oam->y = ClampYForOam(info.y - 6); + oam->charnum = kWalkingZora_Draw_Char[i]; + oam->flags = info.flags | kWalkingZora_Draw_Flags[i]; + bytewise_extended_oam[oam - oam_buf] = 2 | (info.x >> 8 & 1); + oam++; + + oam->x = info.x; + oam->y = ClampYForOam(info.y + 2); + oam->charnum = kWalkingZora_Draw_Char2[g]; + oam->flags = info.flags | kWalkingZora_Draw_Flags2[g]; + bytewise_extended_oam[oam - oam_buf] = 2 | (info.x >> 8 & 1); + + if (!sprite_anim_clock[k]) + SpriteDraw_Shadow(k, &info); +} + +void WalkingZora_DrawWaterRipples(int k) { // 859fe0 + if (sprite_anim_clock[k]) + SpriteDraw_WaterRipple_WithOamAdjust(k); +} + +void SpriteDraw_WaterRipple_WithOamAdjust(int k) { // 859fe5 + SpriteDraw_WaterRipple(k); + oam_cur_ptr += 8; + oam_ext_cur_ptr += 2; +} + +void SpriteDraw_WaterRipple(int k) { // 859ffa + static const DrawMultipleData kWaterRipple_Dmd[6] = { + {0, 10, 0x01d8, 0}, + {8, 10, 0x41d8, 0}, + {0, 10, 0x01d9, 0}, + {8, 10, 0x41d9, 0}, + {0, 10, 0x01da, 0}, + {8, 10, 0x41da, 0}, + }; + static const uint8 kWaterRipple_Idx[4] = {0, 1, 2, 1}; + Sprite_DrawMultiple(k, &kWaterRipple_Dmd[kWaterRipple_Idx[frame_counter >> 2 & 3] * 2], 2, NULL); + OamEnt *oam = GetOamCurPtr(); + uint8 t = (oam[0].flags & 0x30) | 0x4; + oam[0].flags = t; + oam[1].flags = t | 0x40; +} + +void Sprite_53_ArmosKnight(int k) { // 85a036 + static const uint8 kArmosKnight_Gfx1[5] = {5, 4, 3, 2, 1}; + static const int8 kArmosKnight_Xv[2] = {16, -16}; + + sprite_obj_prio[k] |= 0x30; + ArmosKnight_Draw(k); + if (Sprite_ReturnIfPaused(k)) + return; + if (sprite_state[k] != 9) { + if (sprite_delay_main[k]) { + sprite_graphics[k] = kArmosKnight_Gfx1[sprite_delay_main[k] >> 3]; + return; + } + if (--byte_7E0FF8 == 1) { + for (int j = 5; j >= 0; j--) { + sprite_health[j] = 48; + sprite_x_vel[j] = sprite_y_vel[j] = sprite_z_vel[j] = 0; + } + } + sprite_state[k] = 0; + if (Sprite_CheckIfScreenIsClear()) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xea, &info); + assert(j >= 0); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_z_vel[j] = 32; + sprite_A[j] = 1; + } + return; + } + Sprite_MoveXY(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 4; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 0; + sprite_z[k] = 0; + if (byte_7E0FF8 != 1 && sprite_A[k]) { + sprite_z_vel[k] = 48; + SpriteSfx_QueueSfx3WithPan(k, 0x16); + } + } + if (sprite_F[k]) { + Sprite_ZeroVelocity_XY(k); + sprite_ai_state[k] = 0; + sprite_G[k] = 0; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!sprite_A[k]) { + if (!sprite_delay_main[k]) { + sprite_A[k]++; + sprite_flags2[k] = (sprite_flags2[k] & 0x7f) - 2; + sprite_defl_bits[k] &= ~4; + sprite_flags3[k] &= ~0x40; + } else { + if (sprite_delay_main[k] == 64) { + sound_effect_1 = 0x35; + } else if (sprite_delay_main[k] < 64) { + int j = ((sprite_delay_main[k] >> 1) ^ k) & 1; + sprite_x_vel[k] = kArmosKnight_Xv[j]; + Sprite_MoveX(k); + sprite_x_vel[k] = 0; + } + Sprite_CheckDamageFromLink(k); + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + } + } + } else if (byte_7E0FF8 == 1) { + Sprite_ArmosCrusher(k); + } else { + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_ai_state[k]) { + uint16 x = overlord_y_hi[k] << 8 | overlord_x_hi[k]; + uint16 y = overlord_floor[k] << 8 | overlord_gen2[k]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 16); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + Sprite_Get16BitCoords(k); + if ((uint16)(x - cur_sprite_x + 2) < 4 && (uint16)(y - cur_sprite_y + 2) < 4) + sprite_ai_state[k] = 1; + } else { + sprite_x_lo[k] = overlord_x_hi[k]; + sprite_x_hi[k] = overlord_y_hi[k]; + sprite_y_lo[k] = overlord_gen2[k]; + sprite_y_hi[k] = overlord_floor[k]; + } + } +} + +void ArmosKnight_Draw(int k) { // 85a274 + static const int8 kArmosKnight_Draw_X[24] = { + -8, 8, -8, 8, -10, 10, -10, 10, -10, 10, -10, 10, -12, 12, -12, 12, + -14, 14, -14, 14, -16, 24, -16, 24, + }; + static const int8 kArmosKnight_Draw_Y[24] = { + -8, -8, 8, 8, -10, -10, 10, 10, -10, -10, 10, 10, -12, -12, 12, 12, + -14, -14, 14, 14, -16, -16, 24, 24, + }; + static const uint8 kArmosKnight_Draw_Char[24] = { + 0xc0, 0xc2, 0xe0, 0xe2, 0xc0, 0xc2, 0xe0, 0xe2, 0xc4, 0xc4, 0xc4, 0xc4, 0xc6, 0xc6, 0xc6, 0xc6, + 0xc8, 0xc8, 0xc8, 0xc8, 0xd8, 0xd8, 0xd8, 0xd8, + }; + static const uint8 kArmosKnight_Draw_Flags[24] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0, 0xc0, 0x80, 0x40, 0, 0xc0, 0x80, + 0x40, 0, 0xc0, 0x80, 0x40, 0, 0xc0, 0x80, + }; + static const uint8 kArmosKnight_Draw_Ext[24] = { + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 0, 0, 0, 0, + }; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + if (!sprite_A[k] && submodule_index != 7) + Oam_AllocateDeferToPlayer(k); + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 3; i >= 0; i--, oam++) { + int j = g * 4 + i; + uint16 x = info.x + kArmosKnight_Draw_X[j]; + uint16 y = info.y + kArmosKnight_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kArmosKnight_Draw_Char[j]; + oam->flags = kArmosKnight_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = kArmosKnight_Draw_Ext[j] | (x >> 8 & 1); + } + if (g != 0) + return; + if (sprite_A[k]) { + int spr_idx = 76 + k * 2; + oam_cur_ptr = 0x800 + spr_idx * 4; + oam_ext_cur_ptr = 0xA20 + spr_idx; + } + oam = GetOamCurPtr(); + int z = sprite_z[k]; + z = ((z >= 32) ? 32 : z) >> 3; + uint16 y = Sprite_GetY(k) - BG2VOFS_copy2; + oam[4].x = info.x - 8 + z; + oam[5].x = info.x + 8 - z; + if ((uint16)(y + 12 + 16) < 0x100) { + oam[5].y = oam[4].y = y + 12; + } else { + oam[5].y = oam[4].y = 0xf0; + } + oam[5].charnum = oam[4].charnum = 0xe4; + oam[4].flags = 0x25; + oam[5].flags = 0x25 | 0x40; + bytewise_extended_oam[oam + 4 - oam_buf] = 2; + bytewise_extended_oam[oam + 5 - oam_buf] = 2; +} + +void Sprite_54_Lanmolas(int k) { // 85a3a2 + static const uint8 kLanmola_RandB[8] = {0x58, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0x98}; + static const uint8 kLanmola_RandC[8] = {0x68, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xa8, 0x80}; + static const int8 kLanmola_ZVel[2] = {2, -2}; + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + Lanmola_Draw(k); + if (Sprite_ReturnIfPaused(k)) + return; + switch(sprite_ai_state[k]) { + case 0: + if (!(sprite_delay_main[k] | sprite_pause[k])) { + sprite_delay_main[k] = 127; + sprite_ai_state[k] = 1; + SpriteSfx_QueueSfx2WithPan(k, 0x35); + } + break; + case 1: + if (!sprite_delay_main[k]) { + Lanmola_SpawnShrapnel(k); + sound_effect_ambient = 0x13; + sprite_B[k] = kLanmola_RandB[GetRandomNumber() & 7]; + sprite_C[k] = kLanmola_RandC[GetRandomNumber() & 7]; + sprite_ai_state[k] = 2; + sprite_z_vel[k] = 24; + sprite_anim_clock[k] = 0; + sprite_G[k] = 0; +lbl_a: + sprite_D[k] = sprite_x_lo[k]; + sprite_wallcoll[k] = sprite_y_lo[k]; + sprite_delay_aux1[k] = 74; + } + break; + case 2: { + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveZ(k); + if (!sprite_anim_clock[k]) { + if (!--sprite_z_vel[k]) + sprite_anim_clock[k]++; + } else if ((frame_counter & 1) == 0) { + int j = sprite_G[k] & 1; + if ((sprite_z_vel[k] += kLanmola_ZVel[j]) == (uint8)kDesertBarrier_Xv[j]) + sprite_G[k]++; + } + uint16 x = Sprite_GetX(k), y = Sprite_GetY(k); + uint16 x2 = sprite_x_hi[k] << 8 | sprite_B[k]; + uint16 y2 = sprite_y_hi[k] << 8 | sprite_C[k]; + if ((uint16)(x - x2 + 2) < 4 && (uint16)(y - y2 + 2) < 4) + sprite_ai_state[k] = 3; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x2, y2, 10); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + Sprite_MoveXY(k); + break; + } + case 3: + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] + 20)) + sprite_z_vel[k] -= 1; + if (sign8(sprite_z[k])) { + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 128; + goto lbl_a; + } + break; + case 4: + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_x_lo[k] = kLanmola_RandB[GetRandomNumber() & 7]; + sprite_y_lo[k] = kLanmola_RandC[GetRandomNumber() & 7]; + } + break; + case 5: + if (!sprite_delay_main[k]) { + sprite_state[k] = 0; + if (Sprite_CheckIfScreenIsClear()) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xEA, &info); + assert(j >= 0); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_z_vel[j] = 32; + sprite_A[j] = 3; + } + } + if (sprite_delay_main[k] >= 32 && sprite_delay_main[k] < 160 && !(sprite_delay_main[k] & 15)) { + int i = ((sprite_subtype2[k] - garnish_y_lo[k] * 8) & 0x3f) + k * 0x40; + uint8 xlo = moldorm_x_lo[i] - BG2HOFS_copy2; + uint8 ylo = moldorm_y_lo[i] - beamos_x_hi[i] - BG2VOFS_copy2; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x00, &info); + if (j >= 0) { + load_chr_halfslot_even_odd = 11; + sprite_state[j] = 4; + sprite_delay_main[j] = 31; + sprite_A[j] = 31; + Sprite_SetX(j, BG2HOFS_copy2 + xlo); + Sprite_SetY(j, BG2VOFS_copy2 + ylo); + sprite_flags2[j] = 3; + sprite_oam_flags[j] = 0xc; + SpriteSfx_QueueSfx2WithPan(k, 0xc); + if (!sign8(garnish_y_lo[k])) + garnish_y_lo[k]--; + } + } + break; + } +} + +void Lanmola_Draw(int k) { // 85a64a + static const uint8 kLanmola_SprOffs[4] = {76, 60, 44, 28}; + static const uint8 kLanmola_Draw_Char1[16] = {0xc4, 0xe2, 0xc2, 0xe0, 0xc0, 0xe0, 0xc2, 0xe2, 0xc4, 0xe2, 0xc2, 0xe0, 0xc0, 0xe0, 0xc2, 0xe2}; + static const uint8 kLanmola_Draw_Char0[16] = {0xcc, 0xe4, 0xca, 0xe6, 0xc8, 0xe6, 0xca, 0xe4, 0xcc, 0xe4, 0xca, 0xe6, 0xc8, 0xe6, 0xca, 0xe4}; + static const uint8 kLanmola_Draw_Flags[16] = {0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40}; + + int spr_offs = kLanmola_SprOffs[k]; + oam_cur_ptr = 0x800 + spr_offs * 4; + oam_ext_cur_ptr = 0xA20 + spr_offs; + sprite_graphics[k] = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k] - sprite_z_vel[k]); + uint8 r2 = sprite_subtype2[k], r5 = r2; + int j = k * 64 + r2; + moldorm_x_lo[j] = sprite_x_lo[k]; + moldorm_y_lo[j] = sprite_y_lo[k]; + beamos_x_hi[j] = sprite_z[k]; + beamos_y_hi[j] = sprite_graphics[k]; + if (sprite_state[k] == 9 && !(submodule_index | flag_unk1)) + sprite_subtype2[k] = sprite_subtype2[k] + 1 & 63; + uint8 r3 = sprite_oam_flags[k] | sprite_obj_prio[k]; + uint8 n = garnish_y_lo[k]; + if (sign8(n)) + return; + j = sign8(sprite_y_vel[k]) ? 1 : 0; + int oam_step = (j ? -1 : 1); + OamEnt *oam = GetOamCurPtr() + (j ? 7 : 0); + uint8 i = n; + do { + int j = r2 + k * 64; + r2 = r2 - 8 & 63; + oam->x = moldorm_x_lo[j] - BG2HOFS_copy2; + if (!sign8(beamos_x_hi[j])) + oam->y = moldorm_y_lo[j] - beamos_x_hi[j] - BG2VOFS_copy2; + j = beamos_y_hi[j]; + if (n != 7 || i != 0) { + oam->charnum = (n == i) ? kLanmola_Draw_Char1[j] : 0xc6; + } else { + oam->charnum = kLanmola_Draw_Char0[j]; + } + oam->flags = kLanmola_Draw_Flags[j] | r3; + bytewise_extended_oam[oam - oam_buf] = 2; + } while (oam += oam_step, !sign8(--i)); + oam = GetOamCurPtr() + 8; + i = n; + do { + int j = r5 + k * 64; + r5 = r5 - 8 & 63; + oam->x = moldorm_x_lo[j] - BG2HOFS_copy2; + if (!sign8(beamos_x_hi[j])) + oam->y = moldorm_y_lo[j] + 10 - BG2VOFS_copy2; + oam->charnum = 0x6c; + oam->flags = 0x34; + bytewise_extended_oam[oam - oam_buf] = 2; + } while (oam++, !sign8(--i)); + + if (sprite_ai_state[k] == 1) { + static const uint8 kLanmola_Draw_Idx2[16] = {4, 5, 4, 5, 4, 5, 4, 5, 4, 3, 2, 2, 1, 1, 0, 0}; + static const uint8 kLanmola_Draw_Char2[6] = {0xee, 0xee, 0xec, 0xec, 0xce, 0xce}; + static const uint8 kLanmola_Draw_Flags2[6] = {0, 0x40, 0, 0x40, 0, 0x40}; + Oam_AllocateFromRegionB(4); + OamEnt *oam = GetOamCurPtr(); + oam->x = sprite_x_lo[k] - BG2HOFS_copy2; + oam->y = sprite_y_lo[k] - BG2VOFS_copy2; + j = kLanmola_Draw_Idx2[sprite_delay_main[k] >> 3]; + oam->charnum = kLanmola_Draw_Char2[j]; + oam->flags = kLanmola_Draw_Flags2[j] | 0x31; + bytewise_extended_oam[oam - oam_buf] = 2; + } else if (sprite_ai_state[k] != 5 && sprite_delay_aux1[k] != 0) { + static const int8 kLanmola_Draw_X4[8] = {-8, 8, -10, 10, -16, 16, -24, 32}; + static const int8 kLanmola_Draw_Y4[8] = {0, 0, -1, -1, -1, -1, 3, 3}; + static const uint8 kLanmola_Draw_Char4[8] = {0xe8, 0xe8, 0xe8, 0xe8, 0xea, 0xea, 0xea, 0xea}; + static const uint8 kLanmola_Draw_Flags4[8] = {0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40}; + static const uint8 kLanmola_Draw_Ext4[8] = {2, 2, 2, 2, 2, 2, 0, 0}; + + if (((sprite_y_vel[k] >> 6) ^ sprite_ai_state[k]) & 2) + Oam_AllocateFromRegionB(8); + else + Oam_AllocateFromRegionC(8); + OamEnt *oam = GetOamCurPtr(); + uint8 r6 = (((sprite_delay_aux1[k] >> 2) & 3) ^ 3) * 2; + uint8 x = sprite_D[k] - BG2HOFS_copy2; + uint8 y = sprite_wallcoll[k] - BG2VOFS_copy2; + for (int i = 1; i >= 0; i--, oam++) { + int j = i + r6; + oam->x = x + kLanmola_Draw_X4[j]; + oam->y = y + kLanmola_Draw_Y4[j]; + oam->charnum = kLanmola_Draw_Char4[j]; + oam->flags = kLanmola_Draw_Flags4[j] | 0x31; + bytewise_extended_oam[oam - oam_buf] = kLanmola_Draw_Ext4[j]; + } + } +} + +void Sprite_6D_Rat(int k) { // 85a8b0 + static const uint8 kSpriteRat_Tab0[16] = {0, 0, 3, 3, 1, 2, 4, 5, 1, 2, 4, 5, 0, 0, 3, 3}; + static const uint8 kSpriteRat_Tab1[16] = {0, 0x40, 0, 0x40, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x80, 0xc0, 0x80, 0xc0}; + static const uint8 kSpriteRat_Tab2[8] = {10, 11, 6, 7, 2, 3, 14, 15}; + static const uint8 kSpriteRat_Tab4[8] = {8, 9, 4, 5, 0, 1, 12, 13}; + static const int8 kSpriteRat_Xvel[4] = {24, -24, 0, 0}; + static const int8 kSpriteRat_Yvel[4] = {0, 0, 24, -24}; + static const uint8 kSpriteRat_Tab3[4] = {2, 3, 1, 0}; + + int j = sprite_A[k]; + sprite_graphics[k] = kSpriteRat_Tab0[j]; + sprite_oam_flags[k] = (sprite_oam_flags[k] & 0x3f) | kSpriteRat_Tab1[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if (sprite_ai_state[k] != 0) { + if (sprite_delay_main[k] == 0) { + if (is_in_dark_world == 0) + SpriteSfx_QueueSfx3WithPan(k, 0x17); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 80; + } + j = sprite_D[k]; + if (sprite_wallcoll[k] != 0) + sprite_D[k] = j = kSpriteRat_Tab3[j]; + sprite_x_vel[k] = kSpriteRat_Xvel[j]; + sprite_y_vel[k] = kSpriteRat_Yvel[j]; + sprite_A[k] = kSpriteRat_Tab4[sprite_D[k] * 2 + (frame_counter >> 2 & 1)]; + } else { + Sprite_ZeroVelocity_XY(k); + if (sprite_delay_main[k] == 0) { + uint8 a = GetRandomNumber(); + sprite_D[k] = a & 3; + sprite_ai_state[k]++; + sprite_delay_main[k] = (a & 0x7f) + 0x40; + } + sprite_A[k] = kSpriteRat_Tab2[sprite_D[k] * 2 + (frame_counter >> 3 & 1)]; + } +} + +void Sprite_6E_Rope(int k) { // 85a973 + int j; + j = sprite_A[k]; + sprite_graphics[k] = kSpriteRope_Gfx[j]; + sprite_oam_flags[k] = (sprite_oam_flags[k] & 0x3f) | kSpriteRope_Flags[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_E[k]) { + OamEnt *oam = GetOamCurPtr(); + oam[0].flags |= 0x30; + + uint8 old_z = sprite_z[k]; + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] - 0xc0)) + sprite_z_vel[k] -= 2; + if (!sign8(old_z ^ sprite_z[k]) || !sign8(sprite_z[k])) + return; + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + sprite_E[k] = 0; + sprite_flags3[k] &= ~0x10; + } else { + sprite_flags2[k] = 0; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if (sprite_ai_state[k] != 0) { + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + } + j = sprite_D[k]; + if (sprite_wallcoll[k] != 0) + sprite_D[k] = j = kSpriteRope_Tab0[j]; + + j += sprite_G[k]; + sprite_x_vel[k] = kSpriteRope_Xvel[j]; + sprite_y_vel[k] = kSpriteRope_Yvel[j]; + + int i = frame_counter; + if (j < 4) + i >>= 1; + + sprite_A[k] = kSpriteRope_Tab1[sprite_D[k] * 2 + (i >> 1 & 1)]; + } else { + Sprite_ZeroVelocity_XY(k); + if (sprite_delay_main[k] == 0) { + sprite_G[k] = 0; + uint8 a = GetRandomNumber(); + sprite_D[k] = a & 3; + sprite_ai_state[k]++; + sprite_delay_main[k] = (a & 0x7f) + 0x40; + + PointU8 pt; + uint8 dir = Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.y + 0x10) < 0x20 || (uint8)(pt.x + 0x18) < 0x20) { + sprite_G[k] = 4; + sprite_D[k] = dir; + } + } + sprite_A[k] = kSpriteRope_Tab1[sprite_D[k] * 2 + (frame_counter >> 3 & 1)]; + } + } +} + +void Sprite_6F_Keese(int k) { // 85aa8b + static const int8 kSpriteKeese_Tab1[2] = {1, -1}; + static const int8 kSpriteKeese_Tab0[4] = {2, 10, 6, 14}; + + sprite_obj_prio[k] |= 0x30; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + if (sprite_ai_state[k]) { + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 64; + sprite_graphics[k] = 0; + Sprite_ZeroVelocity_XY(k); + } else { + if ((sprite_delay_main[k] & 7) == 0) { + sprite_A[k] += kSpriteKeese_Tab1[sprite_B[k] & 1]; + if (!(GetRandomNumber() & 3)) + sprite_B[k]++; + } + int j = sprite_A[k] & 0xf; + sprite_x_vel[k] = kSpriteKeese_Tab2[j]; + sprite_y_vel[k] = kSpriteKeese_Tab3[j]; + sprite_graphics[k] = ((frame_counter >> 2) & 1) + 1; + } + } else { + if ((k ^ frame_counter) & 3 | sprite_delay_main[k]) + return; + + PointU8 pt; + uint8 dir = Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.y + 0x28) >= 0x50 || (uint8)(pt.x + 0x28) >= 0x50) + return; + SpriteSfx_QueueSfx3WithPan(k, 0x1e); + sprite_ai_state[k]++; + sprite_delay_main[k] = 64; + sprite_B[k] = 64; + sprite_A[k] = kSpriteKeese_Tab0[dir]; + } +} + +void Sprite_Cannonball(int k) { // 85ab54 + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + if (sprite_delay_main[k] == 30) { + Sprite_SpawnPoofGarnish(k); + } else if (sprite_delay_main[k] == 0 && Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + sprite_x_lo[k] += 4; + sprite_y_lo[k] += 4; + Sprite_PlaceRupulseSpark_2(k); + SpriteSfx_QueueSfx2WithPan(k, 0x5); + } + Sprite_CheckDamageToAndFromLink(k); +} + +void Sprite_SpawnPoofGarnish(int j) { // 85ab9c + int k = GarnishAllocForce(); + garnish_type[k] = 10; + garnish_active = 10; + garnish_x_lo[k] = sprite_x_lo[j]; + garnish_x_hi[k] = sprite_x_hi[j]; + int y = Sprite_GetY(j) + 16; + garnish_y_lo[k] = y; + garnish_y_hi[k] = y >> 8; + garnish_sprite[k] = sprite_floor[j]; + garnish_countdown[k] = 15; +} + +void Sprite_6C_MirrorPortal(int k) { // 85af75 + if (savegame_is_darkworld) { + sprite_state[k] = 0; + } else { + if (BYTE(overworld_screen_index) >= 0x80) + return; + + if (submodule_index != 0x23 && byte_7E0FC6 < 3) + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + int j = frame_counter >> 2 & 3; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kSprite_WarpVortex_Flags[j]; + if (Sprite_CheckIfLinkIsBusy()) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + if (sprite_A[k] && (link_disable_sprite_damage | countdown_for_blink) == 0 && !flag_is_link_immobilized) { + submodule_index = 0x23; + link_triggered_by_whirlpool_sprite = 1; + subsubmodule_index = 0; + link_actual_vel_y = 0; + link_actual_vel_x = 0; + link_player_handler_state = kPlayerState_Mirror; + last_light_vs_dark_world = overworld_screen_index & 0x40; + sprite_state[k] = 0; + } + } else { + sprite_A[k] = 1; + } + } + if (++sprite_B[k] == 0) + sprite_A[k] = 1; + sprite_x_lo[k] = bird_travel_x_lo[15]; + sprite_x_hi[k] = bird_travel_x_hi[15]; + int t = (bird_travel_y_lo[15] | (bird_travel_y_hi[15] << 8)) + 8; + sprite_y_lo[k] = t; + sprite_y_hi[k] = t >> 8; +} + +void Sprite_6A_BallNChain(int k) { // 85b01b + ChainBallTrooper_Draw(k); + if (sprite_ai_state[k] < 2) + HIBYTE(dungmap_var8) = 0x80; + if (Sprite_ReturnIfInactive(k)) + return; + Guard_ParrySwordAttacks(k); + + int t = sprite_B[k] << 8 | sprite_A[k]; + t += kChainBallTrooper_Tab1[sprite_ai_state[k]]; + sprite_A[k] = t; + sprite_B[k] = t >> 8 & 1; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckTileCollision(k); + Sprite_MoveXY(k); + Sprite_CheckDamageToLink(k); + + PointU8 pt = { 0, 0 }; + + if (((k ^ frame_counter) & 0xf) == 0) + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, &pt); + + switch (sprite_ai_state[k]) { + case 0: + if (((k ^ frame_counter) & 0xf) == 0) { + sprite_D[k] = sprite_head_dir[k]; + if ((uint8)(pt.y + 0x40) < 0x68 && (uint8)(pt.x + 0x30) < 0x60) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 24; + return; + } + Sprite_ApplySpeedTowardsLink(k, 8); + } + BallNChain_Animate(k); + break; + case 1: + Sprite_ZeroVelocity_XY(k); + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 48; + sprite_ai_state[k]++; + } + break; + case 2: + if (!sprite_delay_main[k] && + sprite_head_dir[k] == kFlailTrooperAttackDir[(sprite_A[k] >> 7 & 1) + sprite_B[k] * 2]) { + sprite_ai_state[k]++; + sprite_delay_aux2[k] = 31; + } +attack_common: + sprite_subtype2[k]++; + BallNChain_Animate(k); + if (((k ^ frame_counter) & 0xf) == 0) + SpriteSfx_QueueSfx3WithPan(k, 6); + break; + case 3: + Sprite_ZeroVelocity_XY(k); + t = sprite_delay_aux2[k]; + if (t == 0) + sprite_ai_state[k] = 0; + else if (t >= 0x10) + goto attack_common; + sprite_subtype2[k]++; + BallNChain_Animate(k); + break; + } +} + +void BallNChain_Animate(int k) { // 85b0ab + sprite_graphics[k] = kFlailTrooperGfx[sprite_D[k] * 8 + (++sprite_subtype2[k] >> 2 & 7)]; +} + +void SpriteDraw_GuardHead(int k, PrepOamCoordsRet *info, int spr_offs) { // 85b160 + int j = sprite_head_dir[k]; + OamEnt *oam = GetOamCurPtr() + spr_offs; + uint16 x = info->x, y = info->y - 9; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kChainBallTrooperHead_Char[j]; + oam->flags = info->flags | kChainBallTrooperHead_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); +} + +void SpriteDraw_BNCBody(int k, PrepOamCoordsRet *info, int spr_offs) { // 85b3cb + int g = sprite_graphics[k]; + spr_offs += kFlailTrooperBody_SprOffs[g] >> 2; + OamEnt *oam = GetOamCurPtr() + spr_offs; + int n = kFlailTrooperBody_Num[g]; + do { + int j = g * 3 + n; + uint16 x = info->x + kFlailTrooperBody_X[j]; + uint16 y = info->y + kFlailTrooperBody_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kFlailTrooperBody_Char[j]; + oam->flags = info->flags | kFlailTrooperBody_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = kFlailTrooperBody_Ext[j] | (x >> 8 & 1); + if (n == 2) + oam++; + } while (oam++, --n >= 0); +} + +void SpriteDraw_BNCFlail(int k, PrepOamCoordsRet *info) { // 85b468 + OamEnt *oam = GetOamCurPtr(); + + BYTE(dungmap_var7) = info->x; + HIBYTE(dungmap_var7) = info->y; + + uint8 t; + uint16 r0 = sprite_A[k] | sprite_B[k] << 8; + uint8 qq = sprite_ai_state[k] < 2 ? 0 : kFlailTrooperWeapon_Tab0[sprite_delay_aux2[k]]; + uint8 r12 = kFlailTrooperWeapon_Tab1[sprite_D[k]]; + uint8 r13 = kFlailTrooperWeapon_Tab2[sprite_D[k]]; + + uint16 r10 = (r0 & 0x1ff) >> 6; + uint16 r2 = (r0 + 0x80) & 0x1ff; + + uint8 r14 = ChainBallMult(kSinusLookupTable[r0 & 0xff], qq); + uint8 r4 = (r0 & 0x100) ? -r14 : r14; + + uint8 r15 = ChainBallMult(kSinusLookupTable[r2 & 0xff], qq); + uint8 r6 = (r2 & 0x100) ? -r15 : r15; + + HIBYTE(dungmap_var8) = r4 - 4 + r12; + BYTE(dungmap_var8) = r6 - 4 + r13; + + oam[0].x = HIBYTE(dungmap_var8) + BYTE(dungmap_var7); + oam[0].y = BYTE(dungmap_var8) + HIBYTE(dungmap_var7); + + oam[0].charnum = 0x2a; + oam[0].flags = 0x2d; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + + for (int i = 3; i >= 0; i--, oam++) { + t = (kFlailTrooperWeapon_Tab4[i] * r14) >> 8; + t = sign8(r4) ? -t : t; + oam->x = t + BYTE(dungmap_var7) + r12; + t = (kFlailTrooperWeapon_Tab4[i] * r15) >> 8; + t = sign8(r6) ? -t : t; + oam->y = t + HIBYTE(dungmap_var7) + r13; + oam->charnum = 0x3f; + oam->flags = 0x2d; + bytewise_extended_oam[oam - oam_buf] = 0; + } + Sprite_CorrectOamEntries(k, 4, 0xff); +} + +void Sprite_50_Cannonball(int k) { // 85b648 + if (!sprite_ai_state[k]) + SpriteDraw_SingleLarge(k); + else + SpriteDraw_BigCannonball(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = ++sprite_subtype2[k] >> 2 & 1; + Sprite_MoveXY(k); + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] == 1) + sprite_state[k] = 0; + return; + } + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_aux2[k] && Sprite_CheckTileCollision(k)) + sprite_delay_main[k] = 16; +} + +void SpriteDraw_BigCannonball(int k) { // 85b6a4 + static const int8 kMetalBallLarge_X[4] = {-8, 8, -8, 8}; + static const int8 kMetalBallLarge_Y[4] = {-8, -8, 8, 8}; + static const uint8 kMetalBallLarge_Char[8] = {0x84, 0x88, 0x88, 0x88, 0x86, 0x88, 0x88, 0x88}; + static const uint8 kMetalBallLarge_Flags[4] = {0, 0, 0xc0, 0x80}; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 3; i >= 0; i--, oam++) { + uint16 x = info.x + kMetalBallLarge_X[i]; + uint16 y = info.y + kMetalBallLarge_Y[i]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kMetalBallLarge_Char[g * 4 + i]; + oam->flags = kMetalBallLarge_Flags[i] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } + +} + +void Sprite_51_ArmosStatue(int k) { // 85b703 + Armos_Draw(k); + if (sprite_F[k]) + Sprite_ZeroVelocity_XY(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + Sprite_ZeroVelocity_XY(k); + } + if (!sprite_ai_state[k]) { + sprite_flags3[k] |= 0x40; + if (sprite_delay_main[k] == 1) { + sprite_flags3[k] &= ~0x40; + sprite_ai_state[k]++; + sprite_flags2[k] &= ~0x80; + sprite_flags3[k] &= ~0x40; + sprite_oam_flags[k] = 0xb; + } else { + if (!((k ^ frame_counter) & 3) && + (uint16)(link_x_coord - cur_sprite_x + 31) < 62 && + (uint16)(link_y_coord + 8 - cur_sprite_y + 48) < 88 && !sprite_delay_main[k]) { + sprite_delay_main[k] = 48; + SpriteSfx_QueueSfx2WithPan(k, 0x22); + } + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + } + if (sprite_delay_main[k]) + sprite_oam_flags[k] ^= (sprite_delay_main[k] >> 1) & 0xe; + } + } else { + Sprite_CheckDamageToAndFromLink(k); + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if ((sprite_delay_main[k] | sprite_z[k]) == 0) { + sprite_delay_main[k] = 8; + sprite_z_vel[k] = 16; + Sprite_ApplySpeedTowardsLink(k, 12); + } + } +} + +void Armos_Draw(int k) { // 85b7ef + static const DrawMultipleData kArmos_Dmd[2] = { + {0, -16, 0x00c0, 2}, + {0, 0, 0x00e0, 2}, + }; + PrepOamCoordsRet info; + if (!sprite_ai_state[k]) { + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + } + Sprite_DrawMultiple(k, &kArmos_Dmd[0], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_4E_Popo(int k) { // 85b80a + Bot_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_subtype2[k]++; + sprite_A[k] = sprite_subtype2[k] >> 4 & 3; + Sprite_CheckDamageToAndFromLink(k); + switch (sprite_ai_state[k]) { + case 0: + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 105; + } + break; + case 1: + sprite_subtype2[k]++; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = (GetRandomNumber() & 63) + 128; + sprite_ai_state[k]++; + int j = GetRandomNumber() & 15; + sprite_x_vel[k] = kSpriteKeese_Tab2[j] << 2; + sprite_y_vel[k] = kSpriteKeese_Tab3[j] << 2; + } + break; + case 2: + sprite_subtype2[k]++; + if (sprite_delay_main[k]) { + if ((k ^ frame_counter) & sprite_B[k]) { + Sprite_CheckTileCollision(k); + return; + } + Sprite_MoveXY(k); + if (!sprite_wallcoll[k]) { + Sprite_CheckTileCollision(k); + return; + } + } + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 80; + break; + } +} + +void Bot_Draw(int k) { // 85b89a + static const uint8 kBot_Gfx[4] = {0, 1, 0, 1}; + static const uint8 kBot_OamFlags[4] = {0, 0, 0x40, 0x40}; + int j = sprite_A[k]; + sprite_graphics[k] = kBot_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kBot_OamFlags[j]; + SpriteDraw_SingleLarge(k); +} + +void Sprite_4C_Geldman(int k) { // 85b8b3 + static const uint8 kGerudoMan_EmergeGfx[8] = {3, 2, 0, 0, 0, 0, 0, 0}; + static const uint8 kGerudoMan_PursueGfx[2] = {4, 5}; + static const uint8 kGerudoMan_SubmergeGfx[5] = {0, 1, 2, 3, 3}; + PrepOamCoordsRet info; + if (sprite_ai_state[k] < 2) + Sprite_PrepOamCoord(k, &info); + else + GerudoMan_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_ignore_projectile[k] = 1; + switch (sprite_ai_state[k]) { + case 0: // return + if (!sprite_delay_main[k]) { + sprite_x_lo[k] = sprite_A[k]; + sprite_x_hi[k] = sprite_B[k]; + sprite_y_lo[k] = sprite_C[k]; + sprite_y_hi[k] = sprite_head_dir[k]; + sprite_ai_state[k] = 1; + } + break; + case 1: // wait + if (!((k ^ frame_counter) & 7) && + (uint16)(link_x_coord - cur_sprite_x + 0x30) < 0x60 && + (uint16)(link_y_coord - cur_sprite_y + 0x30) < 0x60) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 31; + } + break; + case 2: // emerge + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 96; + Sprite_ApplySpeedTowardsLink(k, 16); + } else { + sprite_graphics[k] = kGerudoMan_EmergeGfx[sprite_delay_main[k] >> 2]; + } + break; + case 3: // pursue + sprite_ignore_projectile[k] = 0; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 8; + } else { + sprite_graphics[k] = kGerudoMan_PursueGfx[sprite_delay_main[k] >> 2 & 1]; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + } + break; + case 4: // submerge + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 16; + } else { + sprite_graphics[k] = kGerudoMan_SubmergeGfx[sprite_delay_main[k] >> 1]; + } + break; + } +} + +void GerudoMan_Draw(int k) { // 85ba24 + static const int8 kGerudoMan_Draw_X[18] = { 4, 4, 4, 4, 4, 4, -8, 8, 8, -8, 8, 8, -16, 0, 16, -16, 0, 16 }; + static const int8 kGerudoMan_Draw_Y[18] = { 8, 8, 8, 8, 8, 8, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + static const uint8 kGerudoMan_Draw_Char[18] = { + 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa4, 0xa2, 0xa0, 0xa0, 0xa2, 0xa4, + }; + static const uint8 kGerudoMan_Draw_Flags[18] = { + 0, 0, 0, 0x40, 0x40, 0x40, 0, 0x40, 0x40, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0, 0, 0, + }; + static const uint8 kGerudoMan_Draw_Ext[18] = { 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 2; i >= 0; i--, oam++) { + int j = g * 3 + i; + uint16 x = info.x + kGerudoMan_Draw_X[j]; + uint16 y = info.y + kGerudoMan_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kGerudoMan_Draw_Char[j]; + oam->flags = kGerudoMan_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = kGerudoMan_Draw_Ext[j] | (x >> 8 & 1); + } +} + +void Sprite_4D_Toppo(int k) { // 85ba85 + static const int8 kToppo_XOffs[4] = {-32, 32, 0, 0}; + static const int8 kToppo_YOffs[4] = {0, 0, -32, 32}; + + if (sprite_ai_state[k]) { + sprite_obj_prio[k] |= 0x30; + Toppo_Draw(k); + } + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // Toppo_Hiding + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 8; + int j = GetRandomNumber() & 3; + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_head_dir[k] << 8; + Sprite_SetX(k, x + kToppo_XOffs[j]); + Sprite_SetY(k, y + kToppo_YOffs[j]); + } + break; + case 1: // Toppo_RustleGrass + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 16; + } else { + sprite_graphics[k] = sprite_delay_main[k] >> 2 & 1; + Toppo_VerifyTile(k); + } + break; + case 2: // Toppo_PokingOut + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_z_vel[k] = 64; + } + sprite_graphics[k] = 2; + Toppo_VerifyTile(k); + break; + case 3: // Toppo_Leaping + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 16; + Toppo_VerifyTile(k); + } + break; + case 4: // Toppo_Retreat + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + } else { + sprite_graphics[k] = sprite_delay_main[k] >> 2 & 1; + } + Toppo_VerifyTile(k); + break; + case 5: // Toppo_Flustered + Toppo_Flustered(k); + break; + } +} + +void Toppo_VerifyTile(int k) { // 85bb72 + uint16 x = Sprite_GetX(k); + if (GetTileAttribute(0, &x, Sprite_GetY(k)) != 0x40) + sprite_ai_state[k] = 5; +} + +void Toppo_Draw(int k) { // 85bbff + static const int8 kToppo_Draw_X[15] = {0, 8, 8, 0, 8, 8, 0, 0, 8, 0, 0, 0, 0, 0, 0}; + static const int8 kToppo_Draw_Y[15] = {8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0}; + static const uint8 kToppo_Draw_Char[15] = {0xc8, 0xc8, 0xc8, 0xca, 0xca, 0xca, 0xc0, 0xc8, 0xc8, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2}; + static const uint8 kToppo_Draw_Flags[15] = {0, 0x40, 0x40, 0, 0x40, 0x40, 0, 0, 0x40, 0, 0, 0, 0x40, 0x40, 0x40}; + static const uint8 kToppo_Draw_Ext[15] = {0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2}; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + uint16 ybase = Sprite_GetY(k) - BG2VOFS_copy2; + for (int i = 2; i >= 0; i--, oam++) { + int j = i + g * 3; + uint8 ext = kToppo_Draw_Ext[j]; + uint16 x = info.x + kToppo_Draw_X[j]; + uint16 y = (ext ? info.y : ybase) + kToppo_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kToppo_Draw_Char[j]; + uint8 flags = kToppo_Draw_Flags[j] | info.flags; + if (ext == 0) + flags = flags & ~0xf | 2; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = ext | (x >> 8 & 1); + } +} + +void Sprite_4B_GreenKnifeGuard(int k) { // 85bca2 + sprite_graphics[k] = kSprite_Recruit_Gfx[sprite_D[k] + (sprite_subtype2[k] >> 1 & 4) ]; + Recruit_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if (sprite_ai_state[k] != 0) { + GreenKnifeGuard_Moving(k); + return; + } + if (sprite_delay_main[k] != 0) + return; + + sprite_delay_main[k] = (GetRandomNumber() & 0x3f) + 0x30; + sprite_ai_state[k]++; + sprite_D[k] = sprite_head_dir[k]; + PointU8 out; + int j = sprite_D[k]; + if (j == Sprite_DirectionToFaceLink(k, &out) && + (((uint8)(out.x + 0x10) < 0x20) || ((uint8)(out.y + 0x10) < 0x20))) { + j += 4; + sprite_delay_main[k] = 128; + } + sprite_x_vel[k] = kSprite_Recruit_Xvel[j]; + sprite_y_vel[k] = kSprite_Recruit_Yvel[j]; +} + +void GreenKnifeGuard_Moving(int k) { // 85bd1e + uint8 t = 0x10; + + if (sprite_wallcoll[k] == 0) { + if (sprite_delay_main[k] != 0) + goto out; + t = 0x30; + } + sprite_delay_main[k] = t; + Sprite_ZeroVelocity_XY(k); + sprite_head_dir[k] = kRecruit_Moving_HeadDir[sprite_D[k] * 2 | (GetRandomNumber() & 1)]; + sprite_ai_state[k] = 0; +out: + sprite_subtype2[k] += (sprite_delay_aux1[k] != 0) ? 2 : 1; +} + +void Recruit_Draw(int k) { // 85bd7e + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int r6 = sprite_graphics[k]; + int hd = sprite_head_dir[k]; + uint16 x = info.x; + uint16 y = info.y - 11; + oam->x = x; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + oam->charnum = kSoldier_Draw1_Char[hd]; + oam->flags = kSoldier_Draw1_Flags[hd] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + + oam++; + + x = info.x + kRecruit_Draw_X[r6]; + y = info.y; + oam->x = x; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + oam->charnum = kRecruit_Draw_Char[r6]; + oam->flags = kRecruit_Draw_Flags[r6] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_4A_BombGuard(int k) { // 85be0a + if (sprite_C[k] == 0) { + BombGuard(k); + return; + } + if (sprite_C[k] < 2) { + SpriteBomb_ExplosionIncoming(k); + return; + } + + if (sprite_C[k] == 2) { + for (int j = 15; j >= 0; j--) { + if (j != cur_object_index && sprite_state[j] >= 9 && !((frame_counter ^ j) & 7 | sprite_hit_timer[j])) + SpriteBomb_CheckDamageToSprite(k, j); + } + Sprite_CheckDamageToLink(k); + } + SpriteDraw_SpriteBombExplosion(k); + if (!sprite_delay_aux1[k]) + sprite_state[k] = 0; +} + +void SpriteBomb_CheckDamageToSprite(int k, int j) { // 85be49 + int x = Sprite_GetX(k) - 16, y = Sprite_GetY(k) - 16; + SpriteHitBox hb; + hb.r0_xlo = x; + hb.r8_xhi = x >> 8; + hb.r3 = hb.r2 = 48; + hb.r1_ylo = y; + hb.r9_yhi = y >> 8; + Sprite_SetupHitBox(j, &hb); + if (!CheckIfHitBoxesOverlap(&hb) || sprite_type[j] == 0x11) + return; + Ancilla_CheckDamageToSprite_preset(j, 8); + x = Sprite_GetX(j); + y = Sprite_GetY(j) - sprite_z[j]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 32); + sprite_y_recoil[j] = pt.y; + sprite_x_recoil[j] = pt.x; +} + +void SpriteBomb_ExplosionIncoming(int k) { // 85bed3 + if (sprite_E[k]) + sprite_obj_prio[k] |= 48; + SpriteDraw_SingleLarge(k); + if (sprite_hit_timer[k] || sprite_delay_aux1[k] == 1) { + sprite_hit_timer[k] = 0; + if (sprite_state[k] == 10) + link_state_bits = 0, link_picking_throw_state = 0; + SpriteSfx_QueueSfx2WithPan(k, 0xc); + sprite_C[k]++; + sprite_flags4[k] = 9; + sprite_oam_flags[k] = 2; + sprite_delay_aux1[k] = 31; + sprite_state[k] = 6; + sprite_flags2[k] = 3; + return; + } + if (sprite_delay_aux1[k] < 64) + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0xe | (sprite_delay_aux1[k] >> 1) & 0xe; + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_aux3[k]) + Sprite_CheckDamageFromLink(k); + Sprite_MoveXY(k); + if (player_is_indoors) + Sprite_CheckTileCollision(k); + ThrownSprite_TileAndSpriteInteraction(k); +} + +void BombGuard(int k) { // 85bf51 + BombTrooper_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_head_dir[k] = sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + if (sprite_ai_state[k] == 0) { + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 112; + } + } else { + int j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + return; + } + sprite_subtype2[k] = (j >= 80); + if (j == 32) + BombGuard_CreateBomb(k); + sprite_graphics[k] = kJavelinTrooper_Tab2[(sprite_D[k] << 3 | j >> 4) + 32]; + } +} + +void BombGuard_CreateBomb(int k) { // 85bfc1 + static const int8 kBombTrooperBomb_X[4] = {0, 1, 9, -8}; + static const int8 kBombTrooperBomb_Y[4] = {-12, -12, -15, -13}; + static const int8 kBombTrooperBomb_Zvel[16] = {32, 40, 48, 56, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x4a, &info); + if (j >= 0) { + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kBombTrooperBomb_X[i]); + Sprite_SetY(j, info.r2_y + kBombTrooperBomb_Y[i]); + Sprite_ApplySpeedTowardsLink(j, 16); + PointU8 pt; + sprite_C[j] = 1; + Sprite_DirectionToFaceLink(j, &pt); + if (sign8(pt.x)) + pt.x = -pt.x; + if (sign8(pt.y)) + pt.y = -pt.y; + sprite_z_vel[j] = kBombTrooperBomb_Zvel[(pt.y | pt.x) >> 4]; + sprite_flags3[j] = sprite_flags3[k] & 0xee | 0x18; + sprite_oam_flags[j] = 8; + sprite_delay_aux1[j] = 255; + sprite_health[j] = 0; + SpriteSfx_QueueSfx3WithPan(j, 0x13); + } +} + +void BombTrooper_Draw(int k) { // 85c04b + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteDraw_GuardHead(k, &info, 2); + SpriteDraw_BNCBody(k, &info, 1); + if (sprite_graphics[k] < 20) + SpriteDraw_BombGuard_Arm(k, &info); + SpriteDraw_Shadow_custom(k, &info, 10); +} + +void SpriteDraw_BombGuard_Arm(int k, PrepOamCoordsRet *info) { // 85c089 + static const int8 kBombTrooper_DrawArm_X[8] = {-1, 1, 2, 0, 9, 9, -8, -8}; + static const int8 kBombTrooper_DrawArm_Y[8] = {-12, -12, -12, -12, -16, -14, -12, -14}; + OamEnt *oam = GetOamCurPtr(); + int j = sprite_D[k] * 2 | sprite_subtype2[k]; + uint16 x = info->x + kBombTrooper_DrawArm_X[j]; + uint16 y = info->y + kBombTrooper_DrawArm_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0x6e; + oam->flags = info->flags & 0x30 | 0x8; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); +} + +void SpriteDraw_SpriteBombExplosion(int k) { // 85c113 + static const int8 kEnemyBombExplosion_X[16] = {-12, 12, -12, 12, -8, 8, -8, 8, -8, 8, -8, 8, 0, 0, 0, 0}; + static const int8 kEnemyBombExplosion_Y[16] = {-12, -12, 12, 12, -8, -8, 8, 8, -8, -8, 8, 8, 0, 0, 0, 0}; + static const uint8 kEnemyBombExplosion_Char[16] = {0x88, 0x88, 0x88, 0x88, 0x8a, 0x8a, 0x8a, 0x8a, 0x84, 0x84, 0x84, 0x84, 0x86, 0x86, 0x86, 0x86}; + static const uint8 kEnemyBombExplosion_Flags[16] = {0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0, 0, 0}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int base = sprite_delay_aux1[k] >> 1 & 0xc; + for (int i = 3; i >= 0; i--, oam++) { + int j = base + i; + oam->x = kEnemyBombExplosion_X[j] + info.x; + oam->y = kEnemyBombExplosion_Y[j] + info.y; + oam->charnum = kEnemyBombExplosion_Char[j]; + oam->flags = kEnemyBombExplosion_Flags[j] | info.flags; + } + Sprite_CorrectOamEntries(k, 3, 2); +} + +void Sprite_41_BlueGuard(int k) { // 85c155 + if (sprite_C[k]) + Probe(k); + else + Guard_Main(k); +} + +void Probe(int k) { // 85c15d + SpriteAddXY(k, (int8)sprite_x_vel[k], (int8)sprite_y_vel[k]); + bool is_close; + if (sprite_type[sprite_C[k] - 1] == 0xce) { + // parent is blind the thief? + uint16 x = cur_sprite_x - link_x_coord + 16; + uint16 y = link_y_coord - cur_sprite_y + 24; + is_close = (x < 32 && y < 32); + } else { + if (Probe_CheckTileSolidity(k) && sprite_tiletype != 9 || link_cape_mode != 0) { + sprite_state[k] = 0; + return; + } + uint16 x = cur_sprite_x - link_x_coord; + uint16 y = cur_sprite_y - link_y_coord; + is_close = (x < 16 && y < 16 && sprite_floor[k] == link_is_on_lower_level); + } + if (is_close) { + int p = sprite_C[k] - 1; + if (sprite_ai_state[p] != 3) { + sprite_ai_state[p] = 3; + if (sprite_type[p] != 0xce) { + sprite_delay_main[p] = 16; + sprite_subtype2[p] = 0; + } + } + sprite_state[k] = 0; + } else { + PrepOamCoordsRet oam; + if (Sprite_PrepOamCoordOrDoubleRet(k, &oam)) + return; + if ((oam.x | oam.y) >= 256) + sprite_state[k] = 0; + } +} + +void Guard_Main(int k) { // 85c227 + uint8 bak1 = sprite_graphics[k]; + uint8 bak2 = sprite_D[k]; + + if (sprite_delay_aux1[k]) { + sprite_D[k] = kSoldier_DirectionLockSettings[bak2]; + sprite_graphics[k] = kSoldier_Gfx[bak2]; + } + Guard_HandleAllAnimation(k); + sprite_D[k] = bak2; + sprite_graphics[k] = bak1; + + if (sprite_state[k] == 5) { + if (submodule_index == 0) { + sprite_subtype2[k]++; + Guard_TickAndUpdateBody(k); + sprite_subtype2[k]++; + Guard_TickAndUpdateBody(k); + } + return; + } + if (Sprite_ReturnIfInactive(k)) + return; + Guard_ParrySwordAttacks(k); + if ((Sprite_CheckDamageToLink(k) || sprite_alert_flag) && sprite_ai_state[k] < 3) { + sprite_ai_state[k] = 3; + Guard_SetTimerAndAssertTileHitBox(k, 0x20); + } else if (sprite_F[k] != 0 && sprite_F[k] >= 4) { + sprite_ai_state[k] = 4; + Guard_SetTimerAndAssertTileHitBox(k, 0x80); + } + if (Sprite_ReturnIfRecoiling(k)) + return; + if ((sprite_subtype[k] & 7) < 5) { + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + } else { + Sprite_MoveXY(k); + } + if (sprite_ai_state[k] != 4) + sprite_G[k] = 0; + + switch (sprite_ai_state[k]) { + case 0: + Sprite_ZeroVelocity_XY(k); + if (sprite_delay_main[k]) + break; + sprite_ai_state[k]++; + if (sprite_subtype[k] && (sprite_subtype[k] & 7) < 5) { + sprite_delay_main[k] = kSoldier_Delay[sprite_subtype[k] >> 3 & 3]; + sprite_D[k] ^= 1; + sprite_subtype2[k] = 0; + } else { + sprite_delay_main[k] = (GetRandomNumber() & 0x3f) + 0x28; // note: adc + uint8 t = sprite_D[k], u = GetRandomNumber() & 3; + sprite_D[k] = u; + if (t == u || (t ^ u) & 2) + return; + } + sprite_delay_aux1[k] = 12; + break; + case 1: { + Sprite_Guard_SendOutProbe(k); + if ((sprite_subtype[k] & 7) >= 5) { + Guard_ShootProbeAndStuff(k); + return; + } + if (!sprite_delay_main[k]) { + Sprite_ZeroVelocity_XY(k); + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 160; + return; + } + if (!(sprite_subtype2[k] & 1)) + sprite_delay_main[k]++; + if (sprite_wallcoll[k] & 0xf) { + sprite_D[k] ^= 1; + Guard_SetGlanceTo12(k); + } + int dir = sprite_D[k]; + sprite_x_vel[k] = kSoldier_Xvel[dir]; + sprite_y_vel[k] = kSoldier_Yvel[dir]; + sprite_head_dir[k] = dir; + Guard_TickAndUpdateBody(k); + break; + } + case 2: { + Sprite_ZeroVelocity_XY(k); + Sprite_Guard_SendOutProbe(k); + if (sprite_delay_main[k] == 0) { + sprite_delay_main[k] = 0x20; + sprite_ai_state[k] = 0; + } else if (sprite_delay_main[k] < 0x80) { + int t = sprite_D[k] * 8 | (sprite_delay_main[k] >> 3 & 7); + sprite_head_dir[k] = kSoldier_HeadDirs[t]; + } + break; + } + case 3: + Sprite_ZeroVelocity_XY(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 4; + Guard_SetTimerAndAssertTileHitBox(k, 255); + } + break; + case 4: + if (sprite_delay_main[k]) { + Soldier_Func12(k); + } else { + sprite_anim_clock[k] = kSoldier_Tab1[sprite_D[k]]; + Sprite_ZeroVelocity_XY(k); + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 160; + } + break; + } +} + +void Guard_SetGlanceTo12(int k) { // 85c32b + sprite_delay_aux1[k] = 12; +} + +void Guard_ShootProbeAndStuff(int k) { // 85c3a1 + int i = sprite_B[k]; + sprite_x_vel[k] = kSoldierB_Xvel[i]; + sprite_y_vel[k] = kSoldierB_Yvel[i]; + Sprite_CheckTileCollision(k); + if (sprite_delay_aux2[k]) { + if (sprite_delay_aux2[k] == 44) + sprite_B[k] = i = kSoldierB_NextB[i]; + } else if (!(sprite_wallcoll[k] & kSoldierB_Mask[i])) { + sprite_delay_aux2[k] = 88; + } + if (sprite_wallcoll[k] & kSoldierB_Mask2[i]) + sprite_B[k] = i = kSoldierB_NextB2[i]; + sprite_x_vel[k] = kSoldierB_Xvel2[i]; + sprite_y_vel[k] = kSoldierB_Yvel2[i]; + sprite_head_dir[k] = sprite_D[k] = kSoldierB_Dir[i]; + Guard_TickAndUpdateBody(k); +} + +void Guard_TickAndUpdateBody(int k) { // 85c454 + sprite_subtype2[k]++; + int t = sprite_D[k] * 4 + (sprite_subtype2[k] >> 3 & 3); + sprite_graphics[k] = kSoldier_Gfx2[t]; +} + +void Guard_SetTimerAndAssertTileHitBox(int k, uint8 a) { // 85c4d7 + sprite_delay_main[k] = a; + sprite_subtype[k] = 0; + sprite_flags[k] = sprite_flags[k] & 0xf | 0x60; +} + +void Soldier_Func12(int k) { // 85c500 + if (((k ^ frame_counter) & 0x1f) == 0) { + if (!sprite_G[k]) { + sprite_G[k] = 1; + SpriteSfx_QueueSfx3WithPan(k, 4); + } + Sprite_ApplySpeedTowardsLink(k, 16); + sprite_D[k] = sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + } + Guard_ApplySpeedInDirection(k); + sprite_subtype2[k]++; + Guard_TickAndUpdateBody(k); +} + +void Guard_ApplySpeedInDirection(int k) { // 85c542 + if (!sprite_wallcoll[k]) + return; + int i; + if (sprite_wallcoll[k] & 3) { + i = 2 + Sprite_IsBelowLink(k).a; + } else { + i = Sprite_IsRightOfLink(k).a; + } + sprite_x_vel[k] = kSoldier_SetTowardsVel[i]; + sprite_y_vel[k] = kSoldier_SetTowardsVel[i + 2]; +} + +void Sprite_Guard_SendOutProbe(int k) { // 85c5f2 + if ((k + frame_counter & 3) | sprite_pause[k]) + return; + uint8 a = sprite_anim_clock[k]++; + uint8 r15 = ((a & 0x1f) + kSprite_SpawnProbeStaggered_Tab[sprite_D[k]]) & 0x3f; + Sprite_SpawnProbeAlways(k, r15); +} + +void Sprite_SpawnProbeAlways(int k, uint8 r15) { // 85c612 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x41, &info, 10); + if (j < 0) + return; + int t = info.r0_x + 8; + sprite_x_lo[j] = t; + sprite_x_hi[j] = t >> 8; + t = info.r2_y + 4; + sprite_y_lo[j] = t; + sprite_y_hi[j] = t >> 8; + sprite_D[j] = r15; + sprite_x_vel[j] = kSpawnProbe_Xvel[r15]; + sprite_y_vel[j] = kSpawnProbe_Yvel[r15]; + sprite_flags2[j] = sprite_flags2[j] & 0xf0 | 0xa0; + sprite_C[j] = k + 1; + sprite_ignore_projectile[j] = k + 1; + sprite_flags4[j] = 0x40; + sprite_flags3[j] = 0x40; + sprite_defl_bits[j] = 2; +} + +void Guard_HandleAllAnimation(int k) { // 85c680 + PrepOamCoordsRet poc; + if (Sprite_PrepOamCoordOrDoubleRet(k, &poc)) + return; + Guard_AnimateHead(k, 0, &poc); + Guard_AnimateBody(k, kSoldier_Draw2_OamIdx[sprite_D[k]] >> 2, &poc); + Guard_AnimateWeapon(k, &poc); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &poc, kSoldier_DrawShadow[sprite_D[k]]); +} + +void Guard_AnimateHead(int k, int oam_offs, const PrepOamCoordsRet *poc) { // 85c6de + OamEnt *oam = GetOamCurPtr() + oam_offs; + oam->x = poc->x; + int dir = sprite_head_dir[k]; + uint16 y = poc->y - kSoldier_Draw1_Yd[sprite_graphics[k]]; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + oam->charnum = kSoldier_Draw1_Char[dir]; + oam->flags = kSoldier_Draw1_Flags[dir] | poc->flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (poc->x & 0x100) >> 8; +} + +void Guard_AnimateBody(int k, int oam_idx, const PrepOamCoordsRet *poc) { // 85ca09 + int g = sprite_graphics[k] * 4; + uint8 type = sprite_type[k]; + OamEnt *oam = GetOamCurPtr() + oam_idx; + for (int i = 3; i >= 0; i--) { + int j = i + g; + if (type >= 0x46 && (!kSoldier_Draw2_Ext[j] || i == 3 && kSoldier_Draw2_Char[j] == 0x20)) + continue; + uint16 x = poc->x + kSoldier_Draw2_Xd[j]; + uint16 y = poc->y + kSoldier_Draw2_Yd[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kSoldier_Draw2_Char[j]; + bool flag = true; + uint8 p = 8; + if (oam->charnum == 0x20) { + p = 2; + if (type == 0x46) + oam->y = 0xf0; + } else { + flag = kSoldier_Draw2_Ext[j] == 0; + } + uint8 flags = kSoldier_Draw2_Flags[j] | poc->flags; + oam->flags = flag ? (flags & 0xf1 | p) : flags; + bytewise_extended_oam[oam - oam_buf] = kSoldier_Draw2_Ext[j] | (x & 0x100) >> 8; + oam++; + } +} + +void Guard_AnimateWeapon(int k, const PrepOamCoordsRet *poc) { // 85cb64 + int oam_idx = kSoldier_Draw3_OamIdx[sprite_D[k]] >> 2; + int g = sprite_graphics[k] * 2; + uint8 type = sprite_type[k]; + OamEnt *oam = GetOamCurPtr() + oam_idx; + for (int i = 1; i >= 0; i--, oam++) { + int j = i + g; + uint16 x = poc->x + kSoldier_Draw3_Xd[j]; + uint16 y = poc->y + kSoldier_Draw3_Yd[j]; + oam->x = x; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + dungmap_var8 = kSoldier_Draw3_Xd[j] << 8 | (uint8)kSoldier_Draw3_Yd[j]; + oam->charnum = kSoldier_Draw3_Char[j] + (type < 0x43 ? 3 : 0); + oam->flags = kSoldier_Draw3_Flags[j] | poc->flags; + bytewise_extended_oam[oam - oam_buf] = (x & 0x100) >> 8; + } +} + +void Sprite_45_UsainBolt(int k) { // 85cbe0 + Guard_HandleAllAnimation(k); + if (Sprite_ReturnIfInactive(k)) + return; + BoltGuard_TriggerChaseTheme(k); + Guard_ParrySwordAttacks(k); + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + Sprite_CheckDamageToLink(k); + if (!((k ^ frame_counter) & 15)) { + sprite_head_dir[k] = sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + Sprite_ApplySpeedTowardsLink(k, 18); + Guard_ApplySpeedInDirection(k); + } + sprite_subtype2[k]++; + Guard_TickAndUpdateBody(k); +} + +void BoltGuard_TriggerChaseTheme(int k) { // 85cc3c + if (sprite_G[k] != 16 && sprite_G[k]++ == 15) { + SpriteSfx_QueueSfx3WithPan(k, 0x4); + if (sram_progress_indicator == 2 && BYTE(overworld_area_index) == 24) + music_control = 12; + } +} + +void Sprite_44_BluesainBolt(int k) { // 85cc65 + PsychoTrooper_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + BoltGuard_TriggerChaseTheme(k); + Guard_ParrySwordAttacks(k); + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + Sprite_CheckDamageToLink(k); + if (!((k ^ frame_counter) & 15)) { + sprite_D[k] = sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + Sprite_ApplySpeedTowardsLink(k, 18); + Guard_ApplySpeedInDirection(k); + } + sprite_graphics[k] = kFlailTrooperGfx[++sprite_subtype2[k] >> 1 & 7 | sprite_D[k] << 3]; +} + +void PsychoTrooper_Draw(int k) { // 85ccd5 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteDraw_GuardHead(k, &info, 3); + SpriteDraw_BNCBody(k, &info, 2); + SpriteDraw_GuardSpear(k, &info, 0); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &info, kSoldier_DrawShadow[sprite_D[k]]); +} + +void SpriteDraw_GuardSpear(int k, PrepOamCoordsRet *info, int spr_offs) { // 85cd54 + static const int8 kSolderThrowing_Draw_X[16] = {15, 7, 17, 9, -8, 0, -10, -2, 13, 13, 13, 13, -4, -4, -4, -4}; + static const int8 kSolderThrowing_Draw_Y[16] = {-2, -2, -2, -2, -2, -2, -2, -2, 8, 0, 10, 2, -14, -6, -16, -8}; + static const uint8 kSolderThrowing_Draw_Char[16] = {0x6f, 0x7f, 0x6f, 0x7f, 0x6f, 0x7f, 0x6f, 0x7f, 0x6e, 0x7e, 0x6e, 0x7e, 0x6e, 0x7e, 0x6e, 0x7e}; + static const uint8 kSolderThrowing_Draw_Flags[16] = {0x40, 0x40, 0x40, 0x40, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0, 0, 0, 0}; + + OamEnt *oam = GetOamCurPtr() + spr_offs; + uint8 r6 = sprite_D[k] * 4 + (((sprite_A[k] ^ 1) << 1) & 2); + for (int i = 1; i >= 0; i--, oam++) { + int j = r6 + i; + uint16 x = info->x + kSolderThrowing_Draw_X[j]; + uint16 y = info->y + kSolderThrowing_Draw_Y[j]; + HIBYTE(dungmap_var8) = kSolderThrowing_Draw_X[j]; + BYTE(dungmap_var8) = kSolderThrowing_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kSolderThrowing_Draw_Char[j] - (sprite_type[k] >= 0x48 ? 3 : 0); + oam->flags = (kSolderThrowing_Draw_Flags[j] | info->flags) & 0xf1 | 8; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } +} + +void Sprite_48_RedJavelinGuard(int k) { // 85cde1 + static const uint8 kJavelinTrooper_Gfx[4] = {12, 0, 18, 8}; + uint8 bak0 = sprite_graphics[k]; + int j = sprite_D[k]; + if (sprite_delay_aux1[k] != 0) { + sprite_D[k] = kSoldier_DirectionLockSettings[j]; + sprite_graphics[k] = kJavelinTrooper_Gfx[j]; + } + JavelinTrooper_Draw(k); + sprite_D[k] = j; + sprite_graphics[k] = bak0; + SoldierThrowing_Common(k); +} + +void Sprite_46_BlueArcher(int k) { // 85cdff + uint8 bak0 = sprite_graphics[k]; + int j = sprite_D[k]; + if (sprite_delay_aux1[k] != 0) { + sprite_D[k] = kSoldier_DirectionLockSettings[j]; + sprite_graphics[k] = kSoldier_Gfx[j]; + } + ArcherSoldier_Draw(k); + sprite_D[k] = j; + sprite_graphics[k] = bak0; + SoldierThrowing_Common(k); +} + +void SoldierThrowing_Common(int k) { // 85ce23 + int j; + + static const uint8 kSolderThrowing_DirFlags[4] = {3, 3, 12, 12}; + static const int8 kSolderThrowing_Xd[8] = {-80, 80, 0, -8, -80, 80, -8, 8}; + static const int8 kSolderThrowing_Yd[8] = {8, 8, -80, 80, 8, 8, -80, 80}; + + if (Sprite_ReturnIfInactive(k)) + return; + + if ((Sprite_CheckDamageToAndFromLink(k) || sprite_alert_flag) && sprite_ai_state[k] < 3) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 32; + } + if (sprite_F[k] >= 4) { + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 60; + sprite_subtype2[k] = 0; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + switch (sprite_ai_state[k]) { + case 0: // resting + Sprite_ZeroVelocity_XY(k); + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 0x50 + (GetRandomNumber() & 0x7f); + uint8 jbak = sprite_D[k]; + sprite_D[k] = GetRandomNumber() & 3; + if (sprite_D[k] != jbak && !((sprite_D[k] ^ jbak) & 2)) + sprite_delay_aux1[k] = 12; + } + break; + case 1: // walking + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 160; + return; + } + Sprite_Guard_SendOutProbe(k); + if (sprite_wallcoll[k] & 0xf) { + sprite_D[k] ^= 1; + Guard_SetGlanceTo12(k); + } + j = sprite_D[k]; + sprite_x_vel[k] = kSoldier_Xvel[j]; + sprite_y_vel[k] = kSoldier_Yvel[j]; + sprite_head_dir[k] = j; +agitated_jump_to: + sprite_subtype2[k]++; + if (!(sprite_subtype2[k] & 0xf) && ++sprite_A[k] == 2) + sprite_A[k] = 0; + sprite_graphics[k] = kSoldier_Gfx2[sprite_D[k] * 4 + sprite_A[k] + (sprite_type[k] == 0x48 ? 16 : 0)]; + break; + case 2: // looking + Sprite_ZeroVelocity_XY(k); + Sprite_Guard_SendOutProbe(k); + if (sprite_delay_main[k] == 0) { + sprite_delay_main[k] = 32; + sprite_ai_state[k] = 0; + } else if (sprite_delay_main[k] < 0x80) { + int t = sprite_D[k] * 8 | (sprite_delay_main[k] >> 3 & 7); + sprite_head_dir[k] = kSoldier_HeadDirs[t]; + } + break; + case 3: // noticed player + Sprite_ZeroVelocity_XY(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 60; + sprite_subtype2[k] = 0; + } + break; + case 4: // agitated + j = sprite_D[k]; + if (sprite_wallcoll[k] & kSolderThrowing_DirFlags[j] || !sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 24; + return; + } + if (!((frame_counter ^ k) & 7)) { + sprite_D[k] = sprite_head_dir[k] = j = Sprite_DirectionToFaceLink(k, NULL); + if (sprite_type[k] == 0x48) + j += 4; + uint16 x = link_x_coord + kSolderThrowing_Xd[j]; + uint16 y = link_y_coord + kSolderThrowing_Yd[j]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 24); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + if ((uint8)(pt.xdiff + 6) < 12 && (uint8)(pt.ydiff + 6) < 12) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 24; + return; + } + } + sprite_subtype2[k]++; + goto agitated_jump_to; + case 5: // attack + sprite_anim_clock[k] = kSoldier_Tab1[sprite_D[k]]; + Sprite_ZeroVelocity_XY(k); + if ((j = sprite_delay_main[k]) == 0) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 160; + return; + } + sprite_subtype2[k] = (j >= 40) ? 255 : 0; + if (j == 12) + Guard_LaunchProjectile(k); + sprite_graphics[k] = kJavelinTrooper_Tab2[sprite_D[k] * 8 + (j >> 3) + (sprite_type[k] == 0x48 ? 32 : 0)]; + break; + } +} + +void Guard_LaunchProjectile(int k) { // 85d0c5 + static const int8 kJavelinProjectile_X[8] = {16, -8, 3, 11, 12, -4, 12, -4}; + static const int8 kJavelinProjectile_Y[8] = {2, 2, 16, -8, -2, -2, 2, -8}; + static const int8 kJavelinProjectile_Xvel[8] = {48, -48, 0, 0, 32, -32, 0, 0}; + static const int8 kJavelinProjectile_Yvel[8] = {0, 0, 48, -48, 0, 0, 32, -32}; + static const uint8 kJavelinProjectile_Flags4[4] = {5, 5, 6, 6}; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1b, &info); + if (j < 0) + return; + SpriteSfx_QueueSfx3WithPan(k, 0x5); + int i = sprite_D[k] + (sprite_type[k] >= 0x48 ? 4 : 0); + + Sprite_SetX(j, info.r0_x + kJavelinProjectile_X[i]); + Sprite_SetY(j, info.r2_y + kJavelinProjectile_Y[i]); + sprite_x_vel[j] = kJavelinProjectile_Xvel[i]; + sprite_y_vel[j] = kJavelinProjectile_Yvel[i]; + i &= 3; + sprite_D[j] = i; + sprite_flags4[j] = kJavelinProjectile_Flags4[i]; + sprite_z[j] = 0; + sprite_A[j] = (sprite_type[k] >= 0x48); + if (sprite_A[j] && link_shield_type == 0) + sprite_flags5[j] &= ~0x20; +} + +void BushJavelinSoldier_Draw(int k) { // 85d141 + uint8 bak0 = sprite_graphics[k]; + sprite_graphics[k] = 0; + uint8 bak1 = sprite_oam_flags[k]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0xf1 | 2; + uint16 bak2 = cur_sprite_y; + cur_sprite_y += 8; + SpriteDraw_SingleLarge(k); + cur_sprite_y = bak2; + sprite_oam_flags[k] = bak1; + sprite_graphics[k] = bak0; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Guard_AnimateHead(k, 0x10 / 4, &info); + SpriteDraw_BNCBody(k, &info, 0xC / 4); + if (sprite_graphics[k] < 20) + SpriteDraw_GuardSpear(k, &info, 4 / 4); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &info, kSoldier_DrawShadow[sprite_D[k]]); + +} + +void JavelinTrooper_Draw(int k) { // 85d192 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteDraw_GuardHead(k, &info, 3); + SpriteDraw_BNCBody(k, &info, 2); + if (sprite_graphics[k] < 20) + SpriteDraw_GuardSpear(k, &info, 0); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &info, kSoldier_DrawShadow[sprite_D[k]]); +} + +void Sprite_49_RedBushGuard(int k) { // 85d1ac + if (sprite_ai_state[k]) { + if (sprite_ai_state[k] == 2) + BushJavelinSoldier_Draw(k); + else + BushSoldierCommon_Draw(k); + } + Sprite_BushGuard_Main(k); +} + +void Sprite_47_GreenBushGuard(int k) { // 85d1bf + if (sprite_ai_state[k]) { + if (sprite_graphics[k] >= 14) + ArcherSoldier_Draw(k); + else + BushSoldierCommon_Draw(k); + } + Sprite_BushGuard_Main(k); +} + +void Sprite_BushGuard_Main(int k) { // 85d1d3 + int j; + static const uint8 kBushSoldier_Gfx[32] = { + 4, 4, 4, 4, 4, 4, 4, 4, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + }; + static const uint8 kBushSoldier_Gfx2[16] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 3, 4, 4, 4, 4, 4}; + if (Sprite_ReturnIfInactive(k)) + return; + sprite_ignore_projectile[k] = 1; + switch (sprite_ai_state[k]) { + case 0: + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 64; + } + break; + case 1: + Sprite_CheckDamageFromLink(k); + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 48; + sprite_head_dir[k] = sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL);; + } else { + if (sprite_delay_main[k] == 0x20) + BushGuard_SpawnFoliage(k); + sprite_graphics[k] = kBushSoldier_Gfx[sprite_delay_main[k] >> 2]; + } + break; + case 2: + sprite_ignore_projectile[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 48; + goto case_3; + } + sprite_A[k] = j < 40 ? 0xff : 0x00; + if (j == 16) + Guard_LaunchProjectile(k); + sprite_graphics[k] = kJavelinTrooper_Tab2[sprite_D[k] * 8 + (j >> 3) + (sprite_type[k] == 0x49 ? 32 : 0)]; + break; + case 3: + case_3: + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 64; + } else { + sprite_graphics[k] = kBushSoldier_Gfx2[sprite_delay_main[k] >> 2]; + } + break; + } +} + +void BushGuard_SpawnFoliage(int k) { // 85d252 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xec, &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_state[j] = 6; + sprite_delay_main[j] = 32; + sprite_flags2[j] += 3; + sprite_C[j] = 2; +} + +void BushSoldierCommon_Draw(int k) { // 85d321 + static const int8 kBushSoldierCommon_Y[14] = {8, 8, 8, 8, 2, 8, 0, 8, -3, 8, -3, 8, -3, 8}; + static const uint8 kBushSoldierCommon_Char[14] = {0x20, 0x20, 0x20, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x20, 0x42, 0x20, 0x42, 0x20}; + static const uint8 kBushSoldierCommon_Flags[14] = {9, 3, 0x49, 0x43, 9, 3, 0x49, 0x43, 9, 3, 0x49, 0x43, 9, 3}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k] * 2; + for (int i = 1; i >= 0; i--, oam++) { + int j = g + i; + uint16 x = info.x; + uint16 y = info.y + kBushSoldierCommon_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kBushSoldierCommon_Char[j]; + uint8 flags = kBushSoldierCommon_Flags[j] | 0x20; + if (i == 0) + flags = flags & ~0xe | info.flags; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void ArcherSoldier_Draw(int k) { // 85d38c + static const uint8 kArcherSoldier_WeaponOamOffs[4] = {0, 0, 0, 16}; + static const uint8 kArcherSoldier_HeadOamOffs[4] = {16, 16, 16, 0}; + static const uint8 kArcherSoldier_BodyOamOffs[4] = {20, 20, 20, 4}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Guard_AnimateHead(k, kArcherSoldier_HeadOamOffs[sprite_D[k]] >> 2, &info); + Guard_AnimateBody(k, kArcherSoldier_BodyOamOffs[sprite_D[k]] >> 2, &info); + SpriteDraw_Archer_Weapon(k, kArcherSoldier_WeaponOamOffs[sprite_D[k]] >> 2, &info); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow_custom(k, &info, kSoldier_DrawShadow[sprite_D[k]]); +} + +void SpriteDraw_Archer_Weapon(int k, int spr_offs, PrepOamCoordsRet *info) { // 85d4d4 + static const uint8 kArcherSoldier_Tab1[4] = {9, 3, 0, 6}; + static const int8 kArcherSoldier_Draw_X[48] = { + -1, 7, 3, 3, -1, 7, 3, 3, -1, 7, 7, 7, -5, -5, -10, -2, + -4, -4, -6, 2, -5, -5, -5, -5, 6, 14, 11, 11, 6, 14, 11, 11, + 6, 14, 14, 14, 11, 11, 18, 10, 12, 12, 14, 6, 11, 11, 11, 11, + }; + static const int8 kArcherSoldier_Draw_Y[48] = { + 7, 7, 3, 11, 6, 6, 1, 9, 7, 7, 7, 7, -2, 6, 2, 2, + -2, 6, 2, 2, -2, 6, 6, 6, -6, -6, -12, -4, -6, -6, -9, -1, + -6, -6, -6, -6, -2, 6, 2, 2, -2, 6, 2, 2, -2, 6, 6, 6, + }; + static const uint8 kArcherSoldier_Draw_Char[48] = { + 0xa, 0xa, 0x2a, 0x2b, 0x1a, 0x1a, 0x2a, 0x2b, 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0x3d, 0x3a, + 0x1b, 0x1b, 0x3d, 0x3a, 0xb, 0xb, 0xb, 0xb, 0xa, 0xa, 0x2b, 0x2a, 0xa, 0xa, 0x2b, 0x2a, + 0xa, 0xa, 0xa, 0xa, 0xb, 0xb, 0x3d, 0x3a, 0x1b, 0x1b, 0x3d, 0x3a, 0xb, 0xb, 0xb, 0xb, + }; + static const uint8 kArcherSoldier_Draw_Flags[48] = { + 0xd, 0x4d, 8, 8, 0xd, 0x4d, 8, 8, 0xd, 0x4d, 0x4d, 0x4d, 0xd, 0x8d, 0x48, 0x48, + 0xd, 0x8d, 0x48, 0x48, 0xd, 0x8d, 0x8d, 0x8d, 0x8d, 0xcd, 0x88, 0x88, 0x8d, 0xcd, 0x88, 0x88, + 0x8d, 0xcd, 0xcd, 0xcd, 0x4d, 0xcd, 8, 8, 0x4d, 0xcd, 8, 8, 0x4d, 0xcd, 0xcd, 0xcd, + }; + OamEnt *oam = GetOamCurPtr() + spr_offs; + int base = sprite_graphics[k] - 14; + if (base < 0) + base = kArcherSoldier_Tab1[sprite_D[k]]; + for (int i = 3; i >= 0; i--, oam++) { + int j = base * 4 + i; + uint16 x = info->x + kArcherSoldier_Draw_X[j]; + uint16 y = info->y + kArcherSoldier_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kArcherSoldier_Draw_Char[j]; + oam->flags = kArcherSoldier_Draw_Flags[j] | 0x20; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } +} + +void TutorialSoldier_Draw(int k) { // 85d64b + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int d = sprite_graphics[k] * 5; + for (int i = 4; i >= 0; i--, oam++) { + int j = d + i; + uint16 x = info.x + kTutorialSoldier_X[j]; + uint16 y = info.y + kTutorialSoldier_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kTutorialSoldier_Char[j]; + uint8 flags = kTutorialSoldier_Flags[j] | info.flags; + if (oam->charnum < 0x40) + flags = (flags & 0xf1) | 8; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = kTutorialSoldier_Ext[j] | (x >> 8 & 1); + } + SpriteDraw_Shadow_custom(k, &info, 12); +} + +void PullSwitch_FacingUp(int k) { // 85d6d4 + static const uint8 kBadPullSwitch_Tab1[10] = {8, 24, 4, 4, 4, 4, 4, 4, 2, 10}; + static const uint8 kBadPullSwitch_Tab0[10] = {6, 7, 8, 8, 8, 8, 8, 9, 9, 9}; + PullSwitch_HandleUpPulling(k); + int j = sprite_graphics[k]; + if (j != 0 && j != 11) { + link_unk_master_sword = kBadPullSwitch_Tab0[j - 1]; + link_y_coord = Sprite_GetY(k) - 19; + link_x_coord = Sprite_GetX(k); + if (sprite_delay_main[k] == 0) { + sprite_graphics[k] = ++j; + if (j == 11) { + sound_effect_2 = 0x1b; + dung_flag_statechange_waterpuzzle = 1; + } + sprite_delay_main[k] = kBadPullSwitch_Tab1[j - 2]; + } + } + if (sprite_type[k] != 7) + BadPullDownSwitch_Draw(k); + else + BadPullUpSwitch_Draw(k); +} + +void PullSwitch_HandleUpPulling(int k) { // 85d743 + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + link_actual_vel_y = 0; + link_actual_vel_x = 0; + Sprite_RepelDash(); + bitmask_of_dragstate = 0; + uint8 y = link_y_coord - sprite_y_lo[k]; + if (!sign8(y - 2)) { + link_y_coord = Sprite_GetY(k) + 9; + } else if (sign8(y - 244)) { + byte_7E0379++; + if (joypad1L_last & 0x80 && !(joypad1H_last & 3) && sprite_graphics[k] == 0) { + sprite_graphics[k] = 1; + sprite_delay_main[k] = 8; + SpriteSfx_QueueSfx2WithPan(k, 0x22); + } + link_y_coord = Sprite_GetY(k) - 21; + } else { + if (sign8(link_x_coord - sprite_x_lo[k])) + link_x_coord = Sprite_GetX(k) - 16; + else + link_x_coord = Sprite_GetX(k) + 14; + } +} + +void BadPullDownSwitch_Draw(int k) { // 85d7f9 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Oam_AllocateDeferToPlayer(k); + OamEnt *oam = GetOamCurPtr(); + uint8 yoff = kBadPullSwitch_Tab5[kBadPullSwitch_Tab4[sprite_graphics[k]]]; + for (int i = 4; i >= 0; i--, oam++) { + oam->x = info.x + kBadPullDownSwitch_X[i]; + oam->y = info.y + kBadPullDownSwitch_Y[i] - (i == 2 ? yoff : 0); + oam->charnum = kBadPullDownSwitch_Char[i]; + oam->flags = kBadPullDownSwitch_Flags[i] | 0x21; + bytewise_extended_oam[oam - oam_buf] = kBadPullDownSwitch_Ext[i]; + } + Sprite_CorrectOamEntries(k, 4, 0xff); +} + +void BadPullUpSwitch_Draw(int k) { // 85d858 + static const uint8 kBadPullUpSwitch_Tab2[2] = {0xa2, 0xa4}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Oam_AllocateDeferToPlayer(k); + OamEnt *oam = GetOamCurPtr(); + uint8 yoff = kBadPullSwitch_Tab5[kBadPullSwitch_Tab4[sprite_graphics[k]]]; + for (int i = 1; i >= 0; i--, oam++) { + uint16 x = info.x; + uint16 y = info.y - ((i == 0) ? yoff : 0); + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kBadPullUpSwitch_Tab2[i]; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void PullSwitch_FacingDown(int k) { // 85d8b5 + static const uint8 kGoodPullSwitch_Tab1[12] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; + static const uint8 kGoodPullSwitch_Tab0[12] = {1, 1, 2, 2, 3, 3, 1, 1, 4, 4, 5, 5}; + static const uint8 kGoodPullSwitch_YOffs[12] = {9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14}; + PullSwitch_HandleDownPulling(k); + int j = sprite_graphics[k]; + if (j != 0 && j != 13) { + link_unk_master_sword = kGoodPullSwitch_Tab0[j - 1]; + link_y_coord = Sprite_GetY(k) + kGoodPullSwitch_YOffs[j - 1]; + link_x_coord = Sprite_GetX(k); + if (sprite_delay_main[k] == 0) { + sprite_graphics[k] = ++j; + if (j == 13) { + if (sprite_type[k] == 6) { + activate_bomb_trap_overlord = 1; + sound_effect_1 = 0x3c; + } else { + dung_flag_statechange_waterpuzzle = 1; + sound_effect_2 = 0x1b; + } + } + sprite_delay_main[k] = kGoodPullSwitch_Tab1[j - 2]; + } + } + GoodPullSwitch_Draw(k); + if (sprite_pause[k]) + sprite_graphics[k] = 0; +} + +void GoodPullSwitch_Draw(int k) { // 85d953 + static const uint8 kGoodPullSwitch_Tab2[14] = {1, 1, 2, 3, 2, 3, 4, 5, 6, 7, 6, 7, 7, 7}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Oam_AllocateDeferToPlayer(k); + OamEnt *oam = GetOamCurPtr(); + uint8 t = kGoodPullSwitch_Tab2[sprite_graphics[k]]; + oam[0].x = oam[1].x = info.x; + oam[0].y = info.y - 1; + oam[1].y = info.y - 1 + t; + oam[0].charnum = 0xee; + oam[1].charnum = 0xce; + oam[0].flags = oam[1].flags = info.flags; + Sprite_CorrectOamEntries(k, 1, 2); +} + +void PullSwitch_HandleDownPulling(int k) { // 85d999 + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + link_actual_vel_y = 0; + link_actual_vel_x = 0; + Sprite_RepelDash(); + bitmask_of_dragstate = 0; + uint8 y = link_y_coord - sprite_y_lo[k]; + if (!sign8(y - 2)) { + byte_7E0379++; + if (joypad1L_last & 0x80 && !(joypad1H_last & 3)) { + link_unk_master_sword++; + if ((joypad1H_last & 4) && sprite_graphics[k] == 0) { + sprite_graphics[k] = 1; + sprite_delay_main[k] = 12; + SpriteSfx_QueueSfx2WithPan(k, 0x22); + } + } + link_y_coord = Sprite_GetY(k) + 9; + } else if (sign8(y - 244)) { + link_y_coord = Sprite_GetY(k) - 21; + } else { + if (sign8(link_x_coord - sprite_x_lo[k])) + link_x_coord = Sprite_GetX(k) - 16; + else + link_x_coord = Sprite_GetX(k) + 14; + } +} + +void Priest_SpawnMantle(int k) { // 85db27 + sprite_state[15]++; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x73, &info); + sprite_state[15] = 0; + sprite_flags2[j] = sprite_flags2[j] & 0xf0 | 0x3; + sprite_x_lo[j] = 0xF0; + sprite_x_hi[j] = 4; + sprite_y_lo[j] = 0x37; + sprite_y_hi[j] = 2; + sprite_E[j] = 2; + sprite_flags4[j] = 11; + sprite_defl_bits[j] |= 0x20; + sprite_subtype2[j] = 1; + if (link_y_coord < Sprite_GetY(j)) + sprite_C[j] = 1; +} + +void Sprite_SanctuaryMantle(int k) { // 85db9b + SageMantle_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + + if (sprite_C[k]) { + sprite_A[k] = 0x40; + goto lbl2; + } + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Sprite_RepelDash(); + sprite_delay_aux1[k] = 7; +lbl: + sprite_subtype2[k] = 0; + bitmask_of_dragstate = 0x81; + link_speed_setting = 8; +lbl2: + switch (sprite_ai_state[k]) { + case 0: { + uint16 x = Sprite_GetX(k); + Sprite_SetX(k, x + 19); + uint8 dir = Sprite_DirectionToFaceLink(k, NULL); + Sprite_SetX(k, x); + if (dir == 1 || dir == 3) { + sprite_A[k]++; + if (sprite_A[k] >= 64) { + sprite_ai_state[k]++; + flag_is_link_immobilized = 1; + } + } + break; + } + case 1: + SpriteSfx_QueueSfx3WithPan(k, 24); + sprite_ai_state[k]++; + sprite_delay_main[k] = 168; + sprite_x_vel[k] = 3; + sprite_delay_aux1[k] = 2; + break; + case 2: + Sprite_MoveXY(k); + if (sprite_delay_main[k] == 0) { + flag_is_link_immobilized = 0; + sprite_x_vel[k] = 0; + sprite_C[k] = 0; + } else { + sprite_delay_aux1[k] = 2; + } + break; + } + } else { // no collision + if (sprite_delay_aux1[k]) + goto lbl; + switch (sprite_subtype2[k]) { + case 0: + sprite_A[k] = 0; + bitmask_of_dragstate = 0; + link_speed_setting = 0; + sprite_subtype2[k]++; + break; + case 1: + break; + } + } +} + +void SageMantle_Draw(int k) { // 85dc8a + if (sprite_C[k] == 0) + Oam_AllocateFromRegionB(0x10); + Sprite_DrawMultiple(k, kSageMantle_Dmd, 4, NULL); +} + +void Sprite_Priest(int k) { // 85dce6 + if (sprite_A[k] == 0) + Priest_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (Sprite_TrackBodyToHead(k)) + Sprite_MoveXY(k); + switch (sprite_subtype2[k]) { + case 0: Priest_Dying(k); break; + case 1: Priest_RunRescueCutscene(k); break; + case 2: Priest_Chillin(k); break; + } +} + +void Priest_Dying(int k) { // 85dd0a + sprite_head_dir[k] = 4; + sprite_D[k] = 4; + switch (sprite_ai_state[k]) { + case 0: // Priest_LyingOnGround + if (Sprite_ShowSolicitedMessage(k, 0x1b) & 0x100) { + sprite_ai_state[k]++; + sprite_graphics[k]++; + sram_progress_flags |= 0x2; + sprite_delay_aux2[k] = 128; + } + break; + case 1: // Priest_FinalWords + sprite_graphics[k] = 0; + if (sprite_delay_aux2[k] == 0) + sprite_ai_state[k]++; + sprite_A[k] = frame_counter & 2; + if (!(sprite_delay_aux2[k] & 7)) + SpriteSfx_QueueSfx2WithPan(k, 0x33); + break; + case 2: // Priest_Die + sprite_state[k] = 0; + break; + } +} + +void Priest_RunRescueCutscene(int k) { // 85dd63 + int j; + switch (sprite_ai_state[k]) { + case 0: + sprite_head_dir[k] = 0; + sprite_D[k] = 0; + if (sprite_delay_main[k] == 0) { + Sprite_ShowMessageUnconditional(0x17); + sprite_ai_state[k]++; + byte_7FFE01 = 1; + Priest_SpawnRescuedPrincess(); + flag_is_link_immobilized = 1; + savegame_map_icons_indicator = 1; + } + break; + case 1: + if (byte_7FFE01 == 2) { + Sprite_ShowMessageUnconditional(0x18); + sprite_ai_state[k]++; + } + break; + case 2: + if (choice_in_multiselect_box == 0) { + sprite_ai_state[k]++; + flag_is_link_immobilized = 0; + } else { + sprite_ai_state[k] = 1; + } + break; + case 3: + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + j = Sprite_ShowSolicitedMessage(k, 0x16); + if (j & 0x100) + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + break; + } +} + +void Priest_Chillin(int k) { // 85dde5 + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + int m = (link_which_pendants & 7) == 7 ? 0x1a : + savegame_map_icons_indicator >= 3 ? 0x19 : 0x16; + int j = Sprite_ShowSolicitedMessage(k, m); + if (j & 0x100) { + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + link_hearts_filler = 0xa0; + } +} + +void Sprite_Uncle(int k) { // 85de2c + Uncle_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_subtype2[k] == 0) + Uncle_AtHouse(k); + else + Uncle_InPassage(k); +} + +void Uncle_AtHouse(int k) { // 85de3e + Sprite_MoveXY(k); + switch (sprite_ai_state[k]) { + case 0: // Uncle_TriggerTelepathy + link_x_coord_prev = 0x940; + link_y_coord_prev = 0x215a; + Sprite_ShowMessageUnconditional(0x1f); + sprite_ai_state[k]++; + break; + case 1: // Uncle_AwakenLink + if (frame_counter & 3) + break; + if (COLDATA_copy0 != 32) { + COLDATA_copy0--; + COLDATA_copy1--; + break; + } + link_pose_during_opening++; + player_sleep_in_bed_state++; + link_y_coord = 0x2157; + flag_is_link_immobilized = 1; + sprite_ai_state[k]++; + break; + case 2: // Uncle_DeclareCurfew + Sprite_ShowMessageUnconditional(0x0d); + music_control = 3; + sprite_graphics[k] = 1; + sprite_ai_state[k]++; + break; + case 3: // Uncle_Embark + sprite_graphics[k] = frame_counter >> 3 & 1; + if (!sprite_delay_main[k]) { + int j = sprite_A[k]; + if (j == 2) { + sprite_ai_state[k]++; + } else { + sprite_A[k]++; + if (!j) + sprite_y_lo[k] -= 2; + sprite_delay_main[k] = kUncle_LeaveHouse_Delay[j]; + sprite_D[k] = j = kUncle_LeaveHouse_Dir[j]; + sprite_x_vel[k] = kUncle_LeaveHouse_Xvel[j]; + sprite_y_vel[k] = kUncle_LeaveHouse_Yvel[j]; + } + } + break; + case 4: // Uncle_ApplyTelepathyFollower + savegame_tagalong = 5; + word_7E02CD = 0xdf3; + sram_progress_flags |= 0x10; + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + break; + } +} + +void Uncle_InPassage(int k) { // 85df19 + switch (sprite_ai_state[k]) { + case 0: // RemoveZeldaTelepathTagalong + if (Sprite_CheckDamageToLink_same_layer(k)) + Link_CancelDash(); + if (Sprite_ShowMessageOnContact(k, 0xe) & 0x100) { + savegame_tagalong = 0; + sprite_ai_state[k]++; + } + break; + case 1: // GiveSwordAndShield + item_receipt_method = 0; + Link_ReceiveItem(0, 0); + sprite_ai_state[k]++; + sprite_graphics[k] = 1; + which_starting_point = 3; + sram_progress_flags |= 1; + sram_progress_indicator = 1; + break; + } +} + +void Sprite_QuarrelBros(int k) { // 85e013 + QuarrelBros_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + if (!(dungeon_room_index & 1)) { + Sprite_ShowSolicitedMessage(k, 0x131); + } else if (!(dung_door_opened & 0xff00)) { + Sprite_ShowSolicitedMessage(k, 0x12f); + } else { + Sprite_ShowSolicitedMessage(k, 0x130); + } + Sprite_BehaveAsBarrier(k); +} + +void QuarrelBros_Draw(int k) { // 85e17f + static const DrawMultipleData kQuarrelBros_Dmd[16] = { + {0, -12, 0x0004, 2}, + {0, 0, 0x000a, 2}, + {0, -11, 0x0004, 2}, + {0, 1, 0x400a, 2}, + {0, -12, 0x0004, 2}, + {0, 0, 0x000a, 2}, + {0, -11, 0x0004, 2}, + {0, 1, 0x400a, 2}, + {0, -12, 0x0008, 2}, + {0, 0, 0x000a, 2}, + {0, -11, 0x0008, 2}, + {0, 1, 0x400a, 2}, + {0, -12, 0x4008, 2}, + {0, 0, 0x000a, 2}, + {0, -11, 0x4008, 2}, + {0, 1, 0x400a, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kQuarrelBros_Dmd[sprite_graphics[k] * 2 + sprite_D[k] * 4], 2, &info); + SpriteDraw_Shadow(k, &info); + +} + +void Sprite_YoungSnitchLady(int k) { // 85e2f2 + Sprite_OldSnitchLady(k); +} + +void YoungSnitchLady_Draw(int k) { // 85e37f + static const DrawMultipleData kYoungSnitchLady_Dmd[16] = { + {0, -8, 0x0026, 2}, + {0, 0, 0x00e8, 2}, + {0, -7, 0x0026, 2}, + {0, 1, 0x40e8, 2}, + {0, -8, 0x0024, 2}, + {0, 0, 0x00c2, 2}, + {0, -7, 0x0024, 2}, + {0, 1, 0x40c2, 2}, + {0, -8, 0x0028, 2}, + {0, 0, 0x00e4, 2}, + {0, -7, 0x0028, 2}, + {0, 1, 0x00e6, 2}, + {0, -8, 0x4028, 2}, + {0, 0, 0x40e4, 2}, + {0, -7, 0x4028, 2}, + {0, 1, 0x40e6, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kYoungSnitchLady_Dmd[sprite_graphics[k] * 2 + sprite_D[k] * 4], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_InnKeeper(int k) { // 85e3af + InnKeeper_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + Sprite_ShowSolicitedMessage(k, link_item_flippers ? 0x183 : 0x182); +} + +void InnKeeper_Draw(int k) { // 85e3dc + static const DrawMultipleData kInnKeeper_Dmd[2] = { + {0, -8, 0x00c4, 2}, + {0, 0, 0x00ca, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, kInnKeeper_Dmd, 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_Witch(int k) { // 85e3fb + Witch_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + uint8 bak0 = sprite_flags4[k]; + sprite_flags4[k] = 2; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); + } + sprite_flags4[k] = bak0; + if (!frame_counter) + sprite_A[k] = (GetRandomNumber() & 1) + 2; + int shift = sprite_A[k] + 1; + sprite_graphics[k] = (frame_counter >> shift) & 7; + if (Sprite_CheckIfLinkIsBusy()) + return; + switch (sprite_ai_state[k]) { + case 0: // main + if (link_item_mushroom == 0) { + if (save_dung_info[0x109] & 0x80) + Sprite_ShowSolicitedMessage(k, 0x4b); + else + Sprite_ShowSolicitedMessage(k, 0x4a); + } else if (link_item_mushroom == 1) { + if (!(joypad1H_last & 0x40)) { + Sprite_ShowSolicitedMessage(k, 0x4c); + } else if (Sprite_CheckDamageToLink_same_layer(k) && hud_cur_item == 5) { + Witch_AcceptShroom(k); + } + } else { + Sprite_ShowSolicitedMessage(k, 0x4a); + } + break; + case 1: // grant cane of byrna + sprite_ai_state[k] = 0; + item_receipt_method = 0; + Link_ReceiveItem(0x18, 0); + break; + } +} + +void Witch_AcceptShroom(int k) { // 85e4cf + link_item_mushroom = 0; + save_dung_info[0x109] |= 0x80; + sound_effect_1 = 0; + Hud_RefreshIcon(); + Sprite_ShowMessageUnconditional(0x4b); + SpriteSfx_QueueSfx1WithPan(k, 0xd); + flag_overworld_area_did_change = 0; +} + +void Witch_Draw(int k) { // 85e55d + static const OamEntSigned kWitch_DrawDataA[16] = { + {-3, 8, 0xae, 0x00}, + {-3, 16, 0xbe, 0x00}, + {-2, 8, 0xae, 0x00}, + {-2, 16, 0xbe, 0x00}, + {-1, 8, 0xaf, 0x00}, + {-1, 16, 0xbf, 0x00}, + { 0, 9, 0xaf, 0x00}, + { 0, 17, 0xbf, 0x00}, + { 1, 10, 0xaf, 0x00}, + { 1, 18, 0xbf, 0x00}, + { 0, 11, 0xaf, 0x00}, + { 0, 18, 0xbf, 0x00}, + {-1, 10, 0xae, 0x00}, + {-1, 18, 0xbe, 0x00}, + {-3, 9, 0xae, 0x00}, + {-3, 17, 0xbe, 0x00}, + }; + static const OamEntSigned kWitch_DrawDataB[3] = { + { 0, -4, 0x80, 0x00}, + {-11, 15, 0x86, 0x04}, + { -3, 15, 0x86, 0x44}, + }; + static const OamEntSigned kWitch_DrawDataC[2] = { + {0, 4, 0x84, 0x00}, + {0, 4, 0x82, 0x00}, + }; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Oam_AllocateDeferToPlayer(k); + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + + oam[0].x = BYTE(dungmap_var7) + kWitch_DrawDataA[g * 2].x; + oam[0].y = HIBYTE(dungmap_var7) + kWitch_DrawDataA[g * 2].y; + WORD(oam[0].charnum) = WORD(info.r4) | WORD(kWitch_DrawDataA[g * 2].charnum); + + oam[1].x = BYTE(dungmap_var7) + kWitch_DrawDataA[g * 2 + 1].x; + oam[1].y = HIBYTE(dungmap_var7) + kWitch_DrawDataA[g * 2 + 1].y; + WORD(oam[1].charnum) = WORD(info.r4) | WORD(kWitch_DrawDataA[g * 2+1].charnum); + for (int i = 0; i < 3; i++) { + oam[i+2].x = BYTE(dungmap_var7) + kWitch_DrawDataB[i].x; + oam[i+2].y = HIBYTE(dungmap_var7) + kWitch_DrawDataB[i].y; + WORD(oam[i+2].charnum) = WORD(info.r4) ^ WORD(kWitch_DrawDataB[i].charnum); + } + int i = (uint16)(g - 3) < 3; + oam[5].x = BYTE(dungmap_var7) + kWitch_DrawDataC[i].x; + oam[5].y = HIBYTE(dungmap_var7) + kWitch_DrawDataC[i].y; + WORD(oam[5].charnum) = WORD(info.r4) | WORD(kWitch_DrawDataC[i].charnum); + + int e = oam - oam_buf; + WORD(bytewise_extended_oam[e]) = 0; + WORD(bytewise_extended_oam[e+2]) = 0x202; + WORD(bytewise_extended_oam[e+4]) = 0x202; + Sprite_CorrectOamEntries(k, 5, 0xff); +} + +void SpritePrep_Snitches(int k) { // 85e67d + sprite_D[k] = 2; + sprite_head_dir[k] = 2; + sprite_ignore_projectile[k]++; + sprite_A[k] = sprite_x_lo[k]; + sprite_B[k] = sprite_x_hi[k]; + sprite_x_vel[k] = -9; +} + +void Sprite_OldSnitchLady(int k) { // 85e6aa + static const int8 kOldSnitchLady_Xd[2] = {-32, 32}; + static const int8 kOldSnitchLady_Xvel[4] = {0, 0, -9, 9}; + static const int8 kOldSnitchLady_Yvel[4] = {-9, 9, 0, 0}; + + int j; + + if (sprite_type[k] == 0x34) { + if (sprite_ai_state[k] < 2) + YoungSnitchLady_Draw(k); + } else { + if (sprite_subtype[k]) { + Sprite_ChickenLady(k); + return; + } + if (sprite_ai_state[k] < 3) + Lady_Draw(k); + } + + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_ai_state[k] < 3) { + if (player_is_indoors) { + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + Sprite_ShowSolicitedMessage(k, 0xad); + return; + } + if (!sprite_ai_state[k] && Sprite_CheckDamageToLink_same_layer(k)) { + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + sprite_delay_main[k] = 1; + } else { + if (Sprite_TrackBodyToHead(k)) + Sprite_MoveXY(k); + else + sprite_delay_main[k] = 1; + } + } + + switch (sprite_ai_state[k]) { + case 0: { + if (sprite_delay_main[k] == 0) { + uint16 t = (sprite_A[k] | sprite_B[k] << 8) + kOldSnitchLady_Xd[sprite_C[k]]; + if (t == Sprite_GetX(k)) { + sprite_head_dir[k] = (j = sprite_D[k] ^ 1); + sprite_x_vel[k] = kOldSnitchLady_Xvel[j]; + sprite_y_vel[k] = kOldSnitchLady_Yvel[j]; + sprite_C[k] ^= 1; + } + } + sprite_graphics[k] = (k ^ frame_counter) >> 4 & 1; + uint8 bak0 = sprite_flags4[k]; + sprite_flags4[k] = 3; + j = Sprite_ShowMessageOnContact(k, 0x2f); + sprite_flags4[k] = bak0; + if (j & 0x100) { + sprite_D[k] = j; + Snitch_SpawnGuard(k); + sprite_ai_state[k] = 1; + } + break; + } + case 1: { + uint16 ovx = overlord_x_lo[byte_7E0FDE] | overlord_x_hi[byte_7E0FDE] << 8; + uint16 ovy = overlord_y_lo[byte_7E0FDE] | overlord_y_hi[byte_7E0FDE] << 8; + if (ovy >= Sprite_GetY(k)) { + sprite_ai_state[k] = 2; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + sprite_flags4[k] = 2; + uint16 pos = ((ovy - overworld_offset_base_y) & overworld_offset_mask_y) * 8; + pos += (((ovx >> 3) - overworld_offset_base_x) & overworld_offset_mask_x); + Overworld_DrawWoodenDoor(pos, false); + sprite_delay_main[k] = 16; + } else { + flag_is_link_immobilized = 1; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, ovx, ovy, 64); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + sprite_D[k] = 0; + sprite_head_dir[k] = 0; + sprite_graphics[k] = (k ^ frame_counter) >> 3 & 1; + } + break; + } + case 2: + if (sprite_delay_main[k] == 0) { + uint16 ovx = overlord_x_lo[byte_7E0FDE] | overlord_x_hi[byte_7E0FDE] << 8; + uint16 ovy = overlord_y_lo[byte_7E0FDE] | overlord_y_hi[byte_7E0FDE] << 8; + Sprite_SetX(k, ovx); + Sprite_SetY(k, ovy); + uint16 pos = ((ovy - overworld_offset_base_y) & overworld_offset_mask_y) * 8; + pos += (((ovx >> 3) - overworld_offset_base_x) & overworld_offset_mask_x); + Overworld_DrawWoodenDoor(pos, true); + sprite_ai_state[k] = 3; + } + Sprite_MoveXY(k); + break; + case 3: + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + break; + } +} + +void SpritePrep_RunningMan(int k) { // 85e896 + sprite_head_dir[k] = 2; + sprite_D[k] = 2; + sprite_ignore_projectile[k]++; +} + +void Sprite_RunningMan(int k) { // 85e8b2 + static const int8 kRunningMan_Xvel2[2] = {-24, 24}; + static const int8 kRunningMan_Xvel[4] = {0, 0, -54, 54}; + static const int8 kRunningMan_Yvel[4] = {-54, 54, 0, 0}; + static const int8 kRunningMan_Dir[4] = {3, 1, 3, -1}; + static const uint8 kRunningMan_A[4] = {120, 24, 128, 3}; + int j; + RunningMan_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_TrackBodyToHead(k); + Sprite_BehaveAsBarrier(k); + sprite_subtype[k] = 255; + Sprite_CheckTileCollision(k); + uint8 bak0 = sprite_flags4[k]; + sprite_flags4[k] = 7; + if (Sprite_CheckDamageToLink_same_layer(k)) { + sprite_C[k] = sprite_ai_state[k]; + sprite_ai_state[k] = 3; + } + sprite_flags4[k] = bak0; + switch (sprite_ai_state[k]) { + case 0: // chill + Sprite_TrackBodyToHead(k); + j = Sprite_DirectionToFaceLink(k, NULL); + sprite_head_dir[k] = j ^ 3; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Link_CancelDash(); + sprite_D[k] = j ^ 3; + sprite_head_dir[k] = j | 2; + sprite_ai_state[k] = (j & 1) + 1; + sprite_x_vel[k] = kRunningMan_Xvel2[j & 1]; + sprite_delay_main[k] = 32; + } else { + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + } + break; + case 1: // run left + case 2: // run right + if (sprite_delay_main[k] != 0) { + sprite_graphics[k] = frame_counter >> 3 & 1; + Sprite_MoveXY(k); + } else { + RunningBoy_SpawnDustGarnish(k); + sprite_graphics[k] = frame_counter >> 2 & 1; + j = sprite_head_dir[k]; + sprite_x_vel[k] = kRunningMan_Xvel[j]; + sprite_y_vel[k] = kRunningMan_Yvel[j]; + Sprite_MoveXY(k); + if (sprite_A[k]) { + sprite_A[k]--; + break; + } + if (sprite_ai_state[k] == 1) { // left + sprite_A[k] = 255; + sprite_head_dir[k] = 2; + } else { + j = sprite_B[k]++; + sprite_A[k] = kRunningMan_A[j]; + if (kRunningMan_Dir[j] < 0) { + sprite_ai_state[k] = 0; + sprite_subtype2[k] = 0; + } else { + sprite_head_dir[k] = kRunningMan_Dir[j]; + } + } + } + break; + case 3: // caught + Sprite_ShowMessageUnconditional(0xa6); + if (link_player_handler_state >= kPlayerState_RecoilWall) // wtf + sprite_D[k] = link_player_handler_state; + sprite_ai_state[k] = sprite_C[k]; + break; + + } +} + +void RunningMan_Draw(int k) { // 85ea4d + static const DrawMultipleData kRunningMan_Dmd[16] = { + {0, -8, 0x002c, 2}, + {0, 0, 0x08ee, 2}, + {0, -7, 0x002c, 2}, + {0, 1, 0x48ee, 2}, + {0, -8, 0x002a, 2}, + {0, 0, 0x08ca, 2}, + {0, -7, 0x002a, 2}, + {0, 1, 0x48ca, 2}, + {0, -8, 0x002e, 2}, + {0, 0, 0x08cc, 2}, + {0, -7, 0x002e, 2}, + {0, 1, 0x08ce, 2}, + {0, -8, 0x402e, 2}, + {0, 0, 0x48cc, 2}, + {0, -7, 0x402e, 2}, + {0, 1, 0x48ce, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kRunningMan_Dmd[(sprite_D[k] * 4 + sprite_graphics[k] * 2) & 0xf], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_BottleVendor(int k) { // 85ea79 + int j; + + sprite_A[k] = BottleVendor_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + BottleMerchant_DetectFish(k); + Sprite_BehaveAsBarrier(k); + if (Sprite_CheckIfLinkIsBusy()) + return; + if (GetRandomNumber() == 0) { + sprite_delay_main[k] = 20; + sprite_graphics[k] = 1; + } else if (!sprite_delay_main[k]) { + sprite_graphics[k] = 0; + } + switch (sprite_ai_state[k]) { + case 0: // base + if (!sprite_A[k] && sprite_E[k]) + sprite_ai_state[k] = 3; + else if (sram_progress_indicator_3 & 2) + Sprite_ShowSolicitedMessage(k, 0xd4); + else if (Sprite_ShowSolicitedMessage(k, 0xd1) & 0x100) + sprite_ai_state[k] = 1; + break; + case 1: // selling + if (choice_in_multiselect_box == 0 && link_rupees_goal >= 100) { + Sprite_ShowMessageUnconditional(0xd2); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0xd3); + sprite_ai_state[k] = 0; + } + break; + case 2: // giving + item_receipt_method = 0; + Link_ReceiveItem(0x16, 0); + sram_progress_indicator_3 |= 2; + link_rupees_goal -= 100; + sprite_ai_state[k] = 0; + break; + case 3: // buying + if (!sign8(sprite_E[k])) + Sprite_ShowMessageUnconditional(0xd5); + else + Sprite_ShowMessageUnconditional(0xd6); + sprite_ai_state[k] = 4; + break; + case 4: // reward + j = sprite_E[k]; + if (!sign8(j)) { + sprite_state[j - 1] = 0; + BottleMerchant_BuyBee(k); + } else { + sprite_state[j & 0xf] = 0; + BottleMerchant_BuyFish(k); + } + sprite_E[k] = 0; + sprite_ai_state[k] = 0; + break; + } + +} + +uint8 BottleVendor_Draw(int k) { // 85eba7 + PrepOamCoordsRet info; + static const DrawMultipleData kBottleVendor_Dmd[4] = { + {0, -7, 0x00ac, 2}, + {0, 0, 0x0088, 2}, + {0, -6, 0x00ac, 2}, + {0, 0, 0x00a2, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kBottleVendor_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); + return (info.x | info.y) >> 8; +} + +void Priest_SpawnRescuedPrincess() { // 85ec4c + SpriteSpawnInfo info; + int k = Sprite_SpawnDynamically(0, 0x76, &info); + if (k < 0) + return; + sprite_D[k] = sprite_head_dir[k] = tagalong_layerbits[tagalong_var2] & 3; + Sprite_SetX(k, link_x_coord); + Sprite_SetY(k, link_y_coord); + sprite_subtype2[k] = 1; + savegame_tagalong = 0; + sprite_ignore_projectile[k]++; + sprite_flags4[k] = 3; +} + +void Sprite_76_Zelda(int k) { // 85ec9e + CrystalMaiden_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (Sprite_TrackBodyToHead(k)) + Sprite_MoveXY(k); + switch (sprite_subtype2[k]) { + case 0: Zelda_InCell(k); break; + case 1: Zelda_EnteringSanctuary(k); break; + case 2: Zelda_AtSanctuary(k); break; + } +} + +void Zelda_InCell(int k) { // 85ecbf + int j; + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + switch (sprite_ai_state[k]) { + case 0: // AwaitingRescue + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + sprite_ai_state[k]++; + flag_is_link_immobilized++; + j = sprite_head_dir[k]; + sprite_x_vel[k] = kZelda_Xvel[j]; + sprite_y_vel[k] = kZelda_Yvel[j]; + sprite_delay_main[k] = 16; + break; + case 1: // ApproachingPlayer + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + Sprite_ShowMessageUnconditional(0x1c); + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + music_control = 25; + } + sprite_graphics[k] = frame_counter >> 3 & 1; + break; + case 2: // TheWizardIsBadMkay + sprite_ai_state[k]++; + Sprite_ShowMessageUnconditional(0x25); + break; + case 3: // WaitUntilPlayerPaysAttention + if (choice_in_multiselect_box) { + sprite_ai_state[k] = 2; + } else { + sprite_ai_state[k]++; + Sprite_ShowMessageUnconditional(0x24); + } + break; + case 4: // TransitionToTagalong + flag_is_link_immobilized = 0; + which_starting_point = 2; + SavePalaceDeaths(); + savegame_tagalong = 1; + Dungeon_FlagRoomData_Quadrants(); + Sprite_BecomeFollower(k); + sprite_state[k] = 0; + music_control = 16; + break; + } +} + +void Zelda_EnteringSanctuary(int k) { // 85ed69 + static const uint8 kZelda_Delay0[4] = {38, 26, 44, 1}; + static const uint8 kZelda_Dir0[4] = {1, 3, 1, 2}; + int j; + switch (sprite_ai_state[k]) { + case 0: // walk to priest + if (sprite_delay_main[k] == 0) { + j = sprite_A[k]; + if (j >= 4) { + sprite_ai_state[k]++; + sprite_head_dir[k] = sprite_D[k] = 0; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + return; + } + sprite_delay_main[k] = kZelda_Delay0[j]; + sprite_D[k] = sprite_head_dir[k] = j = kZelda_Dir0[j]; + sprite_A[k]++; + sprite_x_vel[k] = kZelda_Xvel[j]; + sprite_y_vel[k] = kZelda_Yvel[j]; + } + sprite_graphics[k] = (frame_counter >> 3) & 1; + break; + case 1: // respond to priest + Sprite_ShowMessageUnconditional(0x1d); + sprite_ai_state[k]++; + byte_7FFE01 = 2; + which_starting_point = 1; + SavePalaceDeaths(); + sram_progress_indicator = 2; + Sprite_LoadGraphicsProperties_light_world_only(); + break; + case 2: // be careful + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + j = Sprite_ShowSolicitedMessage(k, 0x1e); + if (j & 0x100) + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + break; + } +} + +void Zelda_AtSanctuary(int k) { // 85ee0c + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + int m = (link_which_pendants & 7) == 7 ? 0x27 : + savegame_map_icons_indicator >= 3 ? 0x26 : 0x1e; + int j = Sprite_ShowSolicitedMessage(k, m); + if (j & 0x100) { + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + link_hearts_filler = 0xa0; + } +} + +void SpritePrep_Mushroom(int k) { // 85ee53 + if (link_item_mushroom >= 2) { + sprite_state[k] = 0; + } else { + sprite_graphics[k] = 0; + sprite_oam_flags[k] |= 8; + sprite_ignore_projectile[k]++; + } +} + +void Sprite_Mushroom(int k) { // 85ee78 + SpriteDraw_SingleLarge(k); + if (Sprite_CheckIfLinkIsBusy()) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + sprite_state[k] = 0; + item_receipt_method = 0; + Link_ReceiveItem(0x29, 0); + } else if ((frame_counter & 0x1f) == 0) { + sprite_oam_flags[k] ^= 0x40; + } +} + +void Sprite_FakeSword(int k) { // 85eeaf + FakeSword_Draw(k); + if (Sprite_ReturnIfPaused(k)) + return; + if (sprite_unk3[k] == 3) { + if (!sprite_C[k]) { + sprite_C[k] = 1; + Sprite_ShowMessageUnconditional(0x6f); + } + } else { + Sprite_MoveXY(k); + ThrownSprite_TileAndSpriteInteraction(k); + } +} + +void FakeSword_Draw(int k) { // 85eee6 + Sprite_DrawMultiplePlayerDeferred(k, kFakeSword_Dmd, 2, NULL); +} + +void SpritePrep_HeartContainer(int k) { // 85ef01 + HeartUpgrade_CheckIfAlreadyObtained(k); +} + +void Sprite_HeartContainer(int k) { // 85ef47 + if (BYTE(cur_palace_index_x2) == 26) { + sprite_state[k] = 0; + return; + } + sprite_ignore_projectile[k] = sprite_G[k]; + if (!sprite_G[k]) { + DecodeAnimatedSpriteTile_variable(3); + Sprite_Get16BitCoords(k); + sprite_G[k] = 1; + } + + if (BYTE(dungeon_room_index2) == 6 && !sprite_z[k]) + SpriteDraw_WaterRipple_WithOamAdjust(k); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_z_vel[k] -= 2; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = (uint8)-sprite_z_vel[k] >> 2; + if (BYTE(dungeon_room_index2) == 6 && !sprite_subtype[k]) { + sprite_flags2[k] += 2; + sprite_subtype[k] = 1; + Sprite_SpawnWaterSplash(k); + } + } + if (Sprite_CheckIfLinkIsBusy()) + return; + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + sprite_state[k] = 0; + if (sprite_A[k]) { + item_receipt_method = 2; + Link_ReceiveItem(0x3e, 0); + dung_savegame_state_bits |= 0x8000; + return; + } + Link_CancelDash(); + item_receipt_method = 0; + Link_ReceiveItem(0x26, 0); + if (!player_is_indoors) + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x40; + else + dung_savegame_state_bits |= (sprite_x_hi[k] & 1) ? 0x2000 : 0x4000; +} + +void Sprite_HeartPiece(int k) { // 85f020 + static const uint16 kHeartPieceMsg[4] = {0x158, 0x155, 0x156, 0x157}; + if (!sprite_ai_state[k]) { + sprite_ai_state[k]++; + HeartUpgrade_CheckIfAlreadyObtained(k); + if (!sprite_state[k]) + return; + } + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckIfLinkIsBusy()) + return; + + if (Sprite_CheckTileCollision(k) & 3) + sprite_x_vel[k] = -sprite_x_vel[k]; + + sprite_z_vel[k]--; + Sprite_MoveZ(k); + Sprite_MoveXY(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = ((sprite_z_vel[k] ^ 255) & 248) >> 1; + sprite_x_vel[k] = (int8)sprite_x_vel[k] >> 1; + } + + if (sprite_delay_aux4[k] || !Sprite_CheckDamageToLink_same_layer(k)) + return; + + link_heart_pieces = link_heart_pieces + 1 & 3; + if (link_heart_pieces == 0) { + Link_CancelDash(); + item_receipt_method = 0; + Link_ReceiveItem(0x26, 0); + } else { + SpriteSfx_QueueSfx3WithPan(k, 0x2d); + Sprite_ShowMessageUnconditional(kHeartPieceMsg[link_heart_pieces]); + } + sprite_state[k] = 0; + HeartUpgrade_SetObtainedFlag(k); +} + +void HeartUpgrade_SetObtainedFlag(int k) { // 85f0c3 + if (!player_is_indoors) { + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x40; + } else { + int j = sprite_x_hi[k] & 1; + dung_savegame_state_bits |= (j ? 0x2000 : 0x4000); + } +} + +void Sprite_Aginah(int k) { // 85f0ea + if (!(sram_progress_flags & 0x20)) + goto default_msg; + if (link_sword_type >= 2) { + Sprite_ShowSolicitedMessage(k, 0x128); + } else if ((link_which_pendants & 7) == 7) { + Sprite_ShowSolicitedMessage(k, 0x126); + } else if ((link_which_pendants & 2) != 0) { + Sprite_ShowSolicitedMessage(k, 0x129); + } else if (link_item_book_of_mudora) { + Sprite_ShowSolicitedMessage(k, 0x127); + } else { +default_msg: + sram_progress_flags |= 0x20; + Sprite_ShowSolicitedMessage(k, 0x125); + } + sprite_graphics[k] = frame_counter >> 5 & 1; +} + +void Sprite_Sahasrahla(int k) { // 85f14d + switch (sprite_ai_state[k]) { + case 0: // dialogue + Sasha_Idle(k); + break; + case 1: // mark map + Sprite_ShowMessageUnconditional(0x33); + sprite_ai_state[k] = 0; + savegame_map_icons_indicator = 3; + break; + case 2: // grant boots + item_receipt_method = 0; + Link_ReceiveItem(0x4b, 0); + sprite_ai_state[k] = 3; + savegame_map_icons_indicator = 3; + break; + case 3: // shamelessly promote ice rod + Sprite_ShowMessageUnconditional(0x37); + sprite_ai_state[k] = 0; + break; + } +} + +void Sasha_Idle(int k) { // 85f160 + if (!(link_which_pendants & 4)) { + if (Sprite_ShowSolicitedMessage(k, 0x32) & 0x100) + sprite_ai_state[k] = 1; + } else if (!link_item_boots) { + int m = (savegame_map_icons_indicator >= 3) ? 0x38 : 0x39; + if (Sprite_ShowSolicitedMessage(k, m) & 0x100) + sprite_ai_state[k] = 2; + } else if (!link_item_ice_rod) { + Sprite_ShowSolicitedMessage(k, 0x37); + } else if ((link_which_pendants & 7) != 7) { + Sprite_ShowSolicitedMessage(k, 0x34); + } else if (link_sword_type < 2) { + Sprite_ShowSolicitedMessage(k, 0x30); + } else { + Sprite_ShowSolicitedMessage(k, 0x31); + } + sprite_graphics[k] = frame_counter >> 5 & 1; +} + +void Elder_Draw(int k) { // 85f23a + static const DrawMultipleData kElder_Dmd[4] = { + {0, -9, 0x00a0, 2}, + {0, 0, 0x00a2, 2}, + {0, -8, 0x00a0, 2}, + {0, 0, 0x40a4, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kElder_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_DustCloud(int k) { // 85f2b2 + static const uint8 kDustCloud_Gfx[9] = {0, 1, 2, 3, 4, 5, 1, 0, 0xff}; + DustCloud_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k]) + return; + sprite_delay_main[k] = 5; + if (!sign8(kDustCloud_Gfx[sprite_A[k]])) { + sprite_graphics[k] = kDustCloud_Gfx[sprite_A[k]]; + sprite_A[k]++; + } else { + sprite_state[k] = 0; + } +} + +int Sprite_SpawnDustCloud(int k) { // 85f2d6 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xF2, &info); + if (j >= 0) { + info.r2_y += (GetRandomNumber() & 15); + info.r0_x += (GetRandomNumber() & 15) - 8; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_subtype2[j] = 1; + } + return j; +} + +void MedallionTablet_Main(int k) { // 85f30c + MedallionTablet_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + link_position_mode &= ~0x20; + sprite_A[k] = 0; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Sprite_RepelDash(); + sprite_A[k]++; + } + if (Sprite_CheckIfLinkIsBusy()) + return; + switch (sprite_ai_state[k]) { + case 0: // wait for mudora + if (BYTE(overworld_screen_index) != 3) + BombosTablet(k); + else + EtherTablet(k); + break; + case 1: // delay + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 128; + } + break; + case 2: // crumbling + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 240; + } else { + if (sprite_delay_main[k] == 0x20 || sprite_delay_main[k] == 0x40 || sprite_delay_main[k] == 0x60) + sprite_graphics[k]++; + if (!(frame_counter & 7)) + Sprite_SpawnDustCloud(k); + } + break; + case 3: // final animstate + sprite_graphics[k] = 4; + break; + } +} + +void BombosTablet(int k) { // 85f355 + static const uint16 kMedallionTabletMsg[2] = {0x10d, 0x10f}; + if (link_direction_facing || Sprite_DirectionToFaceLink(k, NULL) != 2) + return; + if ((uint16)(cur_sprite_y + 16) < link_y_coord) + return; + if (filtered_joypad_H & 0x80 && link_sword_type == 2) + return; + + int j = 1; + if (!(hud_cur_item == 15 && (filtered_joypad_H & 0x40)) && (j = 0, !(filtered_joypad_L & 0x80))) + return; + if (j) { + player_handler_timer = 0; + link_position_mode = 32; + sound_effect_1 = 0; + if (!sign8(link_sword_type) && link_sword_type >= 2) { + sprite_ai_state[k]++; + BombosTablet_StartCutscene(); + sprite_delay_main[k] = 64; + } + } + Sprite_ShowMessageUnconditional(kMedallionTabletMsg[j]); +} + +void EtherTablet(int k) { // 85f3c4 + static const uint16 kMedallionTabletEtherMsg[2] = {0x10d, 0x10e}; + if (link_direction_facing || Sprite_DirectionToFaceLink(k, NULL) != 2) + return; + if ((uint8)(sprite_y_lo[k] + 16) < BYTE(link_y_coord)) + return; + if (filtered_joypad_H & 0x80 && link_sword_type == 2) + return; + + int j = 1; + if (!(hud_cur_item == 15 && (filtered_joypad_H & 0x40)) && (j = 0, !(filtered_joypad_L & 0x80))) + return; + + if (j) { + player_handler_timer = 0; + link_position_mode = 32; + sound_effect_1 = 0; + if (!sign8(link_sword_type) && link_sword_type >= 2) { + sprite_ai_state[k]++; + EtherTablet_StartCutscene(); + sprite_delay_main[k] = 64; + } + } + Sprite_ShowMessageUnconditional(kMedallionTabletEtherMsg[j]); +} + +void ElderWife_Draw(int k) { // 85f505 + static const DrawMultipleData kElderWife_Dmd[4] = { + {0, -5, 0x008e, 2}, + {0, 5, 0x0028, 2}, + {0, -4, 0x008e, 2}, + {0, 5, 0x4028, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kElderWife_Dmd[sprite_graphics[k] * 2], 2, NULL); +} + +void SpritePrep_PotionShop(int k) { // 85f529 + MagicShopAssistant_SpawnPowder(k); + MagicShopAssistant_SpawnGreenCauldron(k); + MagicShopAssistant_SpawnBlueCauldron(k); + MagicShopAssistant_SpawnRedCauldron(k); + sprite_ignore_projectile[k]++; +} + +void MagicShopAssistant_SpawnPowder(int k) { // 85f539 + if (!flag_overworld_area_did_change || link_item_mushroom == 2) + return; + if (save_dung_info[0x109] & 0x80) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xe9, &info); + sprite_subtype2[j] = 1; + Sprite_SetX(j, info.r0_x - 16); + Sprite_SetY(j, info.r2_y); + sprite_flags4[j] = 3; + sprite_defl_bits[j] |= 0x20; + } +} + +void MagicShopAssistant_SpawnGreenCauldron(int k) { // 85f58e + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xe9, &info); + sprite_subtype2[j] = 2; + Sprite_SetX(j, info.r0_x - 40); + Sprite_SetY(j, info.r2_y - 72); + sprite_flags4[j] = 3; + sprite_defl_bits[j] |= 0x20; +} + +void MagicShopAssistant_SpawnBlueCauldron(int k) { // 85f5bf + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xe9, &info); + sprite_subtype2[j] = 3; + Sprite_SetX(j, info.r0_x + 8); + Sprite_SetY(j, info.r2_y - 72); + sprite_flags4[j] = 3; + sprite_defl_bits[j] |= 0x20; +} + +void MagicShopAssistant_SpawnRedCauldron(int k) { // 85f5f0 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xe9, &info); + sprite_subtype2[j] = 4; + Sprite_SetX(j, info.r0_x - 88); + Sprite_SetY(j, info.r2_y - 72); + sprite_flags4[j] = 3; + sprite_defl_bits[j] |= 0x20; +} + +void Sprite_PotionShop(int k) { // 85f633 + switch(sprite_subtype2[k]) { + case 0: Sprite_MagicShopAssistant_Main(k); return; + case 1: Sprite_BagOfPowder(k); return; + case 2: Sprite_GreenCauldron(k); return; + case 3: Sprite_BlueCauldron(k); return; + case 4: Sprite_RedCauldron(k); return; + } +} + +void Sprite_BagOfPowder(int k) { // 85f644 + MagicPowderItem_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (!Sprite_CheckDamageToLink_same_layer(k) || !(filtered_joypad_L & 0x80)) + return; + Link_CancelDash(); + item_receipt_method = 0; + Link_ReceiveItem(0xd, 0); + sprite_state[k] = 0; +} + +void MagicPowderItem_Draw(int k) { // 85f67b + static const DrawMultipleData kMagicPowder_Dmd[2] = { + {0, 0, 0x04e6, 2}, + {0, 0, 0x04e6, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, kMagicPowder_Dmd, 2, NULL); +} + +void Sprite_GreenCauldron(int k) { // 85f68e + GreenPotionItem_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (sprite_delay_main[k]) + return; + if (!PotionCauldron_CheckBottles()) { + if (Sprite_ShowMessageOnContact(k, 0x4f) & 0x100) + PotionCauldron_GoBeep(k); + return; + } + if (!Sprite_CheckDamageToLink_same_layer(k) || !(filtered_joypad_L & 0x80)) + return; + if (link_rupees_goal < 60) { + Sprite_ShowMessageUnconditional(0x17c); + PotionCauldron_GoBeep(k); + return; + } + if (Sprite_Find_EmptyBottle() < 0) { + Sprite_ShowMessageUnconditional(0x50); + PotionCauldron_GoBeep(k); + return; + } + SpriteSfx_QueueSfx3WithPan(k, 0x1d); + sprite_delay_main[k] = 64; + link_rupees_goal -= 60; + item_receipt_method = 0; + Link_ReceiveItem(0x2f, 0); +} + +void GreenPotionItem_Draw(int k) { // 85f718 + static const DrawMultipleData kGreenPotionItem_Dmd[3] = { + { 0, 0, 0x08c0, 2}, + { 8, 18, 0x0a30, 0}, + {-1, 18, 0x0a22, 0}, + }; + Sprite_DrawMultiplePlayerDeferred(k, kGreenPotionItem_Dmd, 3, NULL); +} + +void Sprite_BlueCauldron(int k) { // 85f72b + BluePotionItem_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (sprite_delay_main[k]) + return; + if (!PotionCauldron_CheckBottles()) { + if (Sprite_ShowMessageOnContact(k, 0x4f) & 0x100) + PotionCauldron_GoBeep(k); + return; + } + if (!Sprite_CheckDamageToLink_same_layer(k) || !(filtered_joypad_L & 0x80)) + return; + if (link_rupees_goal < 160) { + Sprite_ShowMessageUnconditional(0x17c); + PotionCauldron_GoBeep(k); + return; + } + if (Sprite_Find_EmptyBottle() < 0) { + Sprite_ShowMessageUnconditional(0x50); + PotionCauldron_GoBeep(k); + return; + } + SpriteSfx_QueueSfx3WithPan(k, 0x1d); + sprite_delay_main[k] = 64; + link_rupees_goal -= 160; + item_receipt_method = 0; + Link_ReceiveItem(0x30, 0); +} + +void BluePotionItem_Draw(int k) { // 85f7bd + static const DrawMultipleData kBluePotionItem_Dmd[4] = { + { 0, 0, 0x04c0, 2}, + {13, 18, 0x0a30, 0}, + { 5, 18, 0x0a22, 0}, + {-3, 18, 0x0a31, 0}, + }; + Sprite_DrawMultiplePlayerDeferred(k, kBluePotionItem_Dmd, 4, NULL); +} + +void Sprite_RedCauldron(int k) { // 85f7d0 + RedPotionItem_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (sprite_delay_main[k]) + return; + if (!PotionCauldron_CheckBottles()) { + if (Sprite_ShowMessageOnContact(k, 0x4f) & 0x100) + PotionCauldron_GoBeep(k); + return; + } + if (!Sprite_CheckDamageToLink_same_layer(k) || !(filtered_joypad_L & 0x80)) + return; + if (link_rupees_goal < 120) { + Sprite_ShowMessageUnconditional(0x17c); + PotionCauldron_GoBeep(k); + return; + } + if (Sprite_Find_EmptyBottle() < 0) { + Sprite_ShowMessageUnconditional(0x50); + PotionCauldron_GoBeep(k); + return; + } + SpriteSfx_QueueSfx3WithPan(k, 0x1d); + sprite_delay_main[k] = 64; + link_rupees_goal -= 120; + item_receipt_method = 0; + Link_ReceiveItem(0x2e, 0); +} + +void PotionCauldron_GoBeep(int k) { // 85f846 + SpriteSfx_QueueSfx2WithPan(k, 0x3c); +} + +void RedPotionItem_Draw(int k) { // 85f86d + static const DrawMultipleData kRedPotionItem_Dmd[4] = { + { 0, 0, 0x02c0, 2}, + {13, 18, 0x0a30, 0}, + { 5, 18, 0x0a02, 0}, + {-3, 18, 0x0a31, 0}, + }; + Sprite_DrawMultiplePlayerDeferred(k, kRedPotionItem_Dmd, 4, NULL); +} + +bool PotionCauldron_CheckBottles() { // 85f880 + return (link_bottle_info[0] | link_bottle_info[1] | link_bottle_info[2] | link_bottle_info[3]) >= 2; +} + +void Sprite_MagicShopAssistant_Main(int k) { // 85f893 + Shopkeeper_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (Sprite_CheckIfLinkIsBusy()) + return; + if (sprite_ai_state[k]) { + link_hearts_filler = 160; + sprite_ai_state[k] = 0; + } + sprite_graphics[k] = frame_counter >> 5 & 1; + int msg; + if (link_bottle_info[0] >= 2 || link_bottle_info[1] >= 2 || link_bottle_info[2] >= 2 || link_bottle_info[3] >= 2 || !flag_overworld_area_did_change) + msg = 0x4e; + else + msg = 0x4d; + if (Sprite_ShowSolicitedMessage(k, msg) & 0x100) + sprite_ai_state[k] = 1; +} + +void Shopkeeper_Draw(int k) { // 85f91b + static const DrawMultipleData kShopkeeper_Dmd[4] = { + {0, -8, 0x0c00, 2}, + {0, 0, 0x0c10, 2}, + {0, -8, 0x0c00, 2}, + {0, 0, 0x4c10, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kShopkeeper_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_DashItem(int k) { // 85fbf7 + switch (sprite_graphics[k]) { + case 0: Sprite_BookOfMudora(k); break; + case 1: Sprite_BonkKey(k); break; + case 2: Sprite_LumberjackTree(k); break; + } +} + +void Sprite_BonkKey(int k) { // 85fc04 + Sprite_DrawThinAndTall(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) + sprite_ai_state[k] = 3; + Sprite_MoveXY(k); + sprite_z_vel[k]--; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_y_vel[k] = 0; + sprite_z[k] = 0; + sprite_z_vel[k] = (uint8)-sprite_z_vel[k] >> 2; + if (sprite_z_vel[k] & 254) + SpriteSfx_QueueSfx3WithPan(k, 0x14); + } + switch (sprite_ai_state[k]) { + case 0: // wait for dash + if ((uint16)(cur_sprite_x - link_x_coord + 16) < 33 && + (uint16)(cur_sprite_y - link_y_coord + 24) < 41 && (bg1_x_offset | bg1_y_offset)) + sprite_ai_state[k] = 1; + break; + case 1: // being falling + sprite_z_vel[k] = 32; + sprite_y_vel[k] = -5; + sound_effect_2 = 27; + sprite_ai_state[k] = 2; + break; + case 2: // falling + if (!sprite_z[k]) + sprite_floor[k] = link_is_on_lower_level; + break; + case 3: // give to player + link_num_keys++; + sprite_state[k] = 0; + dung_savegame_state_bits |= (sprite_die_action[k] ? 0x2000 : 0x4000); + SpriteSfx_QueueSfx3WithPan(k, 0x2f); + break; + } +} + +void Sprite_BookOfMudora(int k) { // 85fc9e + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) + sprite_ai_state[k] = 3; + Sprite_MoveXY(k); + sprite_z_vel[k]--; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_y_vel[k] = 0; + sprite_z[k] = 0; + sprite_z_vel[k] = (uint8)-sprite_z_vel[k] >> 2; + if (sprite_z_vel[k] & 254) + SpriteSfx_QueueSfx2WithPan(k, 0x21); + } + switch (sprite_ai_state[k]) { + case 0: // wait for dash + if (link_direction_facing == 0 && + (uint16)(cur_sprite_x - link_x_coord + 39) < 47 && + (uint16)(cur_sprite_y - link_y_coord + 40) < 46 && (bg1_x_offset | bg1_y_offset)) + sprite_ai_state[k] = 1; + break; + case 1: // being falling + sprite_z_vel[k] = 32; + sprite_y_vel[k] = -5; + sound_effect_2 = 27; + sprite_ai_state[k] = 2; + break; + case 2: // falling + if (!sprite_z[k]) + sprite_floor[k] = link_is_on_lower_level; + break; + case 3: // give to player + Link_CancelDash(); + item_receipt_method = 0; + Link_ReceiveItem(0x1d, 0); + sprite_state[k] = 0; + break; + } +} + +void Sprite_LumberjackTree(int k) { // 85fd4d + sprite_flags2[k] = 0x8f; + sprite_flags4[k] = 0x47; + DashTreeTop_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Sprite_RepelDash(); + } + Sprite_MoveXY(k); + sprite_z_vel[k]--; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = (uint8)-sprite_z_vel[k] >> 2; + } + switch (sprite_ai_state[k]) { + case 0: // wait for dash + sprite_subtype2[k] = 0; + if ((uint16)(cur_sprite_x - link_x_coord + 24) < 65 && + (uint16)(cur_sprite_y - link_y_coord + 32) < 81 && (bg1_x_offset | bg1_y_offset) & 0xff) { + sprite_z_vel[k] = 20; + sprite_ai_state[k] = 1; + } + break; + case 1: // spawn leaves + if (!sprite_z[k]) { + sprite_ai_state[k]++; + sound_effect_2 = 0x1b; + sprite_x_vel[k] = -4; + sprite_y_vel[k] = -4; + int j = LumberjackTree_SpawnLeaves(k); + sprite_x_vel[j] = 5; + sprite_y_vel[j] = 5; + j = LumberjackTree_SpawnLeaves(k); + sprite_x_vel[j] = 5; + sprite_y_vel[j] = -4; + j = LumberjackTree_SpawnLeaves(k); + sprite_x_vel[j] = -4; + sprite_y_vel[j] = 4; + } + break; + case 2: // dancing leaves + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 8; + if (sprite_subtype2[k] == 6) + sprite_state[k] = 0; + sprite_subtype2[k]++; + } + break; + } +} + +void DashTreeTop_Draw(int k) { // 85fe6f + static const uint16 kDashTreeTop_CharFlags[16] = {0x3100, 0x3102, 0x7102, 0x7100, 0x3120, 0x3122, 0x7122, 0x7120, 0x3104, 0x3106, 0x7106, 0x7104, 0x3124, 0x3126, 0x7126, 0x7124}; + static const int8 kDashTreeTop_X[16] = {10, 22, 30, 1, 34, 5, 13, 29, 0, 17, 27, 44, 15, 33, 18, 26}; + static const int8 kDashTreeTop_Y[16] = {0, 4, 2, 7, 10, 16, 24, 23, 34, 35, 30, 31, 46, 42, 10, 11}; + static const int8 kDashTreeTop_Char[6] = {8, 8, 0x28, 0x28, 0x2a, 0x2a}; + static const int8 kDashTreeTop_Flags[6] = {0x31, 0x71, 0x31, 0x71, 0x31, 0x71}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + + BYTE(dungmap_var7) -= 0x20; + HIBYTE(dungmap_var7) -= 0x20; + + if (!sprite_subtype2[k]) { + uint8 x = BYTE(dungmap_var7); + uint8 y = HIBYTE(dungmap_var7); + for (int i = 0; i < 16; i++) { + oam[i].x = x + (i & 3) * 0x10; + oam[i].y = y + (i >> 2) * 0x10; + WORD(oam[i].charnum) = kDashTreeTop_CharFlags[i]; + } + Sprite_CorrectOamEntries(k, 15, 2); + } else { + int j = sprite_subtype2[k] - 1; + for (int i = 15; i >= 0; i--, oam++) { + oam->x = BYTE(dungmap_var7) + kDashTreeTop_X[i]; + oam->y = HIBYTE(dungmap_var7) + kDashTreeTop_Y[i]; + oam->charnum = kDashTreeTop_Char[j]; + oam->flags = kDashTreeTop_Flags[j]; + } + Sprite_CorrectOamEntries(k, 15, 2); + } +} + +int LumberjackTree_SpawnLeaves(int k) { // 85ff39 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x3B, &info); + assert(j >= 0); + sprite_graphics[j] = 2; + sprite_z_vel[j] = sprite_z_vel[k]; + sprite_subtype2[j] = 1; + sprite_ai_state[j] = 2; + sprite_delay_main[j] = 8; + Sprite_SetSpawnedCoordinates(j, &info); + return j; +} + +void Sprite_TroughBoy(int k) { // 85ff66 + TroughBoy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + + if (savegame_map_icons_indicator < 3) { + if (Sprite_ShowSolicitedMessage(k, 0x147) & 0x100) + savegame_map_icons_indicator = 2; + } else { + Sprite_ShowSolicitedMessage(k, 0x148); + } +} + +void TroughBoy_Draw(int k) { // 85ffdf + static const DrawMultipleData kTroughBoy_Dmd[8] = { + {0, -8, 0x0882, 2}, + {0, 0, 0x0aaa, 2}, + {0, -8, 0x0882, 2}, + {0, 0, 0x0aaa, 2}, + {0, -8, 0x4880, 2}, + {0, 0, 0x0aaa, 2}, + {0, -8, 0x0880, 2}, + {0, 0, 0x0aaa, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kTroughBoy_Dmd[sprite_D[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void BottleMerchant_DetectFish(int k) { // 868000 + for (int i = 15; i >= 0; i--) { + if (sprite_state[i] && sprite_type[i] == 0xd2) { + SpriteHitBox hb; + hb.r0_xlo = sprite_x_lo[k]; + hb.r8_xhi = sprite_x_hi[k]; + hb.r2 = 16; + hb.r1_ylo = sprite_y_lo[k]; + hb.r9_yhi = sprite_y_hi[k]; + hb.r3 = 16; + Sprite_SetupHitBox(i, &hb); + if (CheckIfHitBoxesOverlap(&hb)) + sprite_E[k] = 0x80 | i; + return; + } + } +} + +void BottleMerchant_BuyFish(int k) { // 868054 + static const uint8 kBottleVendor_FishRewardType[5] = {0xdb, 0xe0, 0xde, 0xe2, 0xd9}; + static const int8 kBottleVendor_FishRewardXv[5] = {-6, -3, 0, 4, 7}; + static const int8 kBottleVendor_FishRewardYv[5] = {11, 14, 16, 14, 11}; + SpriteSpawnInfo info; + SpriteSfx_QueueSfx3WithPan(k, 0x13); + tmp_counter = 4; + do { + int j = Sprite_SpawnDynamically(k, kBottleVendor_FishRewardType[tmp_counter], &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_lo[j] = info.r0_x + 4; + sprite_stunned[j] = 0xff; + sprite_x_vel[j] = kBottleVendor_FishRewardXv[tmp_counter]; + sprite_y_vel[j] = kBottleVendor_FishRewardYv[tmp_counter]; + sprite_z_vel[j] = 32; + sprite_delay_aux4[j] = 32; + } while (!sign8(--tmp_counter)); +} + +void SpritePrep_ThrowableScenery(int k) { // 86850f +} + +void SpriteModule_Initialize(int k) { // 86864d + SpritePrep_LoadProperties(k); + sprite_state[k]++; + kSpritePrep_Main[sprite_type[k]](k); +} + +void SpritePrep_Mantle(int k) { // 868841 + sprite_y_lo[k] += 3; + sprite_x_lo[k] += 8; +} + +void SpritePrep_Switch(int k) { // 868859 + int j = BYTE(dungeon_room_index2); + if (j == 0xce || j == 4 || j == 0x3f) + sprite_oam_flags[k] = 0xD; +} + +void SpritePrep_SwitchFacingUp(int k) { // 86886d +} + +void SpritePrep_Snitch_bounce_1(int k) { // 86886e + SpritePrep_Snitches(k); +} + +void SpritePrep_DoNothingA(int k) { // 868873 +} + +void SpritePrep_Rat(int k) { // 868878 + static const uint8 kSpriteRat_BumpDamage[2] = {0, 5}; + static const uint8 kSpriteRat_Health[2] = {2, 8}; + int j = is_in_dark_world; + sprite_bump_damage[k] = kSpriteRat_BumpDamage[j]; + sprite_health[k] = kSpriteRat_Health[j]; +} + +void SpritePrep_Keese(int k) { // 86888e + static const uint8 kSpriteKeese_BumpDamage[2] = {0x80, 0x85}; + static const uint8 kSpriteKeese_Health[2] = {1, 4}; + static const uint8 kSpriteKeese_Flags5[2] = {0, 7}; + int j = is_in_dark_world; + sprite_bump_damage[k] = kSpriteKeese_BumpDamage[j]; + sprite_health[k] = kSpriteKeese_Health[j]; + sprite_flags5[k] = kSpriteKeese_Flags5[j]; +} + +void SpritePrep_Rope(int k) { // 8688aa + static const uint8 kSpriteRope_BumpDamage[2] = {1, 5}; + static const uint8 kSpriteRope_Health[2] = {4, 8}; + static const uint8 kSpriteRope_Flags5[2] = {1, 7}; + int j = is_in_dark_world; + sprite_bump_damage[k] = kSpriteRope_BumpDamage[j]; + sprite_health[k] = kSpriteRope_Health[j]; + sprite_flags5[k] = kSpriteRope_Flags5[j]; +} + +void SpritePrep_Swamola(int k) { // 8688c0 + SpritePrep_Swamola_InitializeSegments(k); + SpritePrep_Kyameron(k); +} + +void SpritePrep_Blind(int k) { // 8688c7 + if (Sprite_ReturnIfBossFinished(k)) + return; + SpritePrep_Blind_PrepareBattle(k); +} + +void SpritePrep_Ganon(int k) { // 8688cf + if (Sprite_ReturnIfBossFinished(k)) + return; + Ganon_HandleAnimation_Idle(k); + sprite_delay_main[k] = 128; + sprite_room[k] = 2; + music_control = 0x1e; +} + +void SpritePrep_Pokey(int k) { // 8688df + static const int8 kHokbok_InitXvel[4] = {16, -16, 16, -16}; + static const int8 kHokbok_InitYvel[4] = {16, 16, -16, -16}; + sprite_A[k] = 3; + sprite_B[k] = 8; + int j = GetRandomNumber() & 3; + sprite_x_vel[k] = kHokbok_InitXvel[j]; + sprite_y_vel[k] = kHokbok_InitYvel[j]; +} + +void SpritePrep_MiniVitreous(int k) { // 8688fd + Sprite_ReturnIfBossFinished(k); +} + +void SpritePrep_Gibo(int k) { // 868901 + sprite_z[k] = 16; + sprite_G[k] = 8; +} + +void SpritePrep_Octoballoon(int k) { // 868910 + static const uint8 kSprite_Octoballoon_Delay[4] = {192, 208, 224, 240}; + sprite_delay_main[k] = kSprite_Octoballoon_Delay[k & 3]; +} + +void SpritePrep_AgahnimsBarrier(int k) { // 86891b + if (save_ow_event_info[BYTE(overworld_screen_index)] & 0x40) + sprite_graphics[k] = 4; + SpritePrep_MoveDown_8px_Right8px(k); + sprite_y_lo[k] -= 12; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_Catfish(int k) { // 86892c + SpritePrep_MoveDown_8px_Right8px(k); + sprite_y_lo[k] -= 12; + SpritePrep_IgnoreProjectiles(k); +} + +void SpritePrep_CutsceneAgahnim(int k) { // 86893b + if (dung_savegame_state_bits & 0x4000) { + sprite_state[k] = 0; + } else { + CutsceneAgahnim_SpawnZeldaOnAltar(k); + sprite_ignore_projectile[k]++; + } +} + +void SpritePrep_Vitreous(int k) { // 86894d + if (Sprite_ReturnIfBossFinished(k)) + return; + SpritePrep_MoveDown_8px_Right8px(k); + sprite_y_lo[k] -= 16; + Vitreous_SpawnSmallerEyes(k); + sprite_ignore_projectile[k]++; +} + +void SpritePrep_Raven(int k) { // 868969 + static const uint8 kSpriteRaven_BumpDamage[2] = {0x81, 0x88}; + static const uint8 kSpriteRaven_Health[2] = {4, 8}; + static const uint8 kSpriteRaven_Flags5[2] = {6, 2}; + int j = is_in_dark_world; + sprite_bump_damage[k] = kSpriteRaven_BumpDamage[j]; + sprite_health[k] = kSpriteRaven_Health[j]; + sprite_flags5[k] = kSpriteRaven_Flags5[j]; + sprite_z[k] = 0; + sprite_A[k] = (sprite_x_lo[k] & 16) >> 4; + sprite_subtype[k] = 254; +} + +void SpritePrep_Vulture(int k) { // 86897e + sprite_z[k] = 0; + sprite_A[k] = (sprite_x_lo[k] & 16) >> 4; + sprite_subtype[k] = 254; +} + +void SpritePrep_Poe(int k) { // 868991 + sprite_z[k] = 12; + sprite_subtype[k] = 254; +} + +void SpritePrep_DoNothingC(int k) { // 86899b + // empty +} + +void SpritePrep_BlindMaiden(int k) { // 86899c + if (!(save_dung_info[0xac] & 0x800)) { + sprite_ignore_projectile[k]++; + if (savegame_tagalong != 6) { + savegame_tagalong = 6; + super_bomb_going_off = 0; + tagalong_var5 = 0; + LoadFollowerGraphics(); + Follower_Initialize(); + savegame_tagalong = 0; + return; + } + } + sprite_state[k] = 0; +} + +void SpritePrep_MiniMoldorm_bounce(int k) { // 8689d3 + int j = 32 * k; + for (int i = 0; i < 32; i++, j++) { + moldorm_x_lo[j] = sprite_x_lo[k]; + moldorm_x_hi[j] = sprite_x_hi[k]; + moldorm_y_lo[j] = sprite_y_lo[k]; + moldorm_y_hi[j] = sprite_y_hi[k]; + } +} + +void SpritePrep_Bomber(int k) { // 8689d8 + sprite_z[k] = 16; + sprite_subtype[k] = 254; +} + +void SpritePrep_BombShoppe(int k) { // 8689df + sprite_ignore_projectile[k]++; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xb5, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x - 24); + Sprite_SetY(j, info.r2_y - 24); + sprite_subtype2[j] = 1; + sprite_ignore_projectile[j] = 1; + } + if ((link_has_crystals & 5) == 5 && sram_progress_indicator_3 & 32) { + int j = Sprite_SpawnDynamically(k, 0xb5, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x - 56); + Sprite_SetY(j, info.r2_y - 24); + sprite_subtype2[j] = 2; + sprite_ignore_projectile[j] = 2; + } + } +} + +void SpritePrep_BullyAndVictim(int k) { // 868a51 + SpawnBully(k); + sprite_ignore_projectile[k]++; +} + +void SpritePrep_PurpleChest(int k) { // 868a59 + if (savegame_tagalong != 12 && !(sram_progress_indicator_3 & 16) && sram_progress_indicator_3 & 32) + sprite_ignore_projectile[k]++; + else + sprite_state[k] = 0; +} + +void SpritePrep_Smithy(int k) { // 868a79 + sprite_ignore_projectile[k]++; + if (savegame_is_darkworld & 64) { + if (sram_progress_indicator_3 & 32 || savegame_tagalong != 0) + sprite_state[k] = 0; + else + sprite_subtype2[k] = 2; + return; + } + Smithy_SpawnDumbBarrierSprite(k); + if (!(sram_progress_indicator_3 & 32)) { + sprite_x_lo[k] += 2; + sprite_y_lo[k] -= 3; + return; + } + sprite_x_lo[k] += 2; + sprite_y_lo[k] -= 3; + int j = Smithy_SpawnDwarfPal(k); + Smithy_SpawnDumbBarrierSprite(j); + sprite_E[j] = k; + sprite_E[k] = j; + + if (sram_progress_indicator_3 & 0x80) { + sprite_ai_state[k] = 5; + sprite_ai_state[j] = 5; + } +} + +void SpritePrep_Babasu(int k) { // 868af0 + SpritePrep_MoveDown_8px(k); + SpritePrep_Zoro(k); +} + +void SpritePrep_Zoro(int k) { // 868af3 + sprite_D[k] = (sprite_type[k] - 0x9c) << 1; + sprite_graphics[k]--; +} + +void SpritePrep_LaserEye_bounce(int k) { // 868b03 + int t = sprite_type[k]; + sprite_D[k] = t - 0x95; + if (t >= 0x97) { + sprite_x_lo[k] += 8; + sprite_head_dir[k] = sprite_x_lo[k] & 16 ^ 16; + if (!sprite_head_dir[k]) + sprite_y_lo[k] += (t & 1) ? -8 : 8; + } else { + sprite_head_dir[k] = sprite_y_lo[k] & 16; + if (!sprite_head_dir[k]) + sprite_x_lo[k] += (t & 1) ? -8 : 8; + } +} + +void SpritePrep_Popo(int k) { // 868b08 + sprite_B[k] = 7; +} + +void SpritePrep_Popo2(int k) { // 868b0c + sprite_B[k] = 15; +} + +void SpritePrep_Statue(int k) { // 868b12 + sprite_y_lo[k] += 7; +} + +void SpritePrep_Bari(int k) { // 868b1c + sprite_z[k] = 6; + if (BYTE(dungeon_room_index2) == 206) + sprite_C[k]--; + sprite_delay_aux1[k] = (GetRandomNumber() & 63) + 128; +} + +void SpritePrep_GreenStalfos(int k) { // 868b2e + sprite_z[k] = 9; +} + +void SpritePrep_WaterLever(int k) { // 868b34 + sprite_y_lo[k] += 5; +} + +void SpritePrep_FireDebirando(int k) { // 868b3e + sprite_type[k] = 0x63; + SpritePrep_LoadProperties(k); + sprite_G[k]--; + SpritePrep_DebirandoPit(k); +} + +void SpritePrep_DebirandoPit(int k) { // 868b4a + static const uint8 kDebirando_OamFlags[2] = {6, 8}; + sprite_G[k]++; + sprite_delay_main[k] = 0; + sprite_graphics[k] = 6; + SpritePrep_IgnoreProjectiles(k); + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x64, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_delay_main[j] = 96; + sprite_head_dir[k] = j; + sprite_G[j] = sprite_G[k]; + sprite_oam_flags[j] = kDebirando_OamFlags[sprite_G[j]]; + } +} + +void SpritePrep_WeakGuard(int k) { // 868b81 + sprite_D[k] = sprite_head_dir[k] = GetRandomNumber() & 3; + sprite_delay_main[k] = 16; +} + +void SpritePrep_WallCannon(int k) { // 868b93 + sprite_D[k] = sprite_type[k] - 0x66; + sprite_A[k] = sprite_D[k] & 2; +} + +void SpritePrep_ArrowGame_bounce(int k) { // 868ba2 + static const uint8 kArcheryGameGuy_X[8] = {0, 0x40, 0x80, 0xc0, 0x30, 0x60, 0x90, 0xc0}; + static const uint8 kArcheryGameGuy_Y[8] = {0, 0x4f, 0x4f, 0x4f, 0x5a, 0x5a, 0x5a, 0x5a}; + static const uint8 kArcheryGameGuy_A[8] = {0, 1, 1, 1, 2, 2, 2, 2}; + static const int8 kArcheryGameGuy_Xvel[2] = {-8, 12}; + static const uint8 kArcheryGameGuy_Flags4[2] = {0x1c, 0x15}; + byte_7E0B88 = 0; + sprite_y_lo[k] -= 9; + for (int i = 7; i != 0; i--) { + sprite_type[i] = 0x65; + sprite_state[i] = 9; + SpritePrep_LoadProperties(i); + sprite_x_hi[i] = (link_x_coord >> 8); + sprite_x_lo[i] = kArcheryGameGuy_X[i]; + sprite_y_hi[i] = (link_y_coord >> 8); + sprite_y_lo[i] = kArcheryGameGuy_Y[i]; + sprite_A[i] = kArcheryGameGuy_A[i]; + int j = kArcheryGameGuy_A[i] - 1; + sprite_graphics[i] = j; + sprite_x_vel[i] = kArcheryGameGuy_Xvel[j]; + sprite_flags4[i] = kArcheryGameGuy_Flags4[j]; + sprite_oam_flags[i] = 13; + sprite_floor[i] = link_is_on_lower_level; + sprite_subtype2[i] = GetRandomNumber(); + } + sprite_ignore_projectile[k]++; + sprite_subtype[k] = link_num_arrows; +} + +void SpritePrep_IgnoreProjectiles(int k) { // 868ba7 + sprite_ignore_projectile[k]++; +} + +void SpritePrep_HauntedGroveAnimal(int k) { // 868bab + sprite_D[k] = Sprite_IsRightOfLink(k).a; + SpritePrep_HauntedGroveOstritch(k); +} + +void SpritePrep_HauntedGroveOstritch(int k) { // 868bb2 + if (link_item_flute >= 2) + sprite_state[k] = 0; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_DiggingGameGuy_bounce(int k) { // 868bbf + if (link_y_coord < Sprite_GetY(k)) { + sprite_ai_state[k] = 5; + sprite_x_lo[k] -= 9; + sprite_graphics[k] = 1; + } + sprite_ignore_projectile[k]++; +} + +void SpritePrep_ThievesTownGrate(int k) { // 868bc4 + if (save_ow_event_info[0x58] & 0x20) + sprite_state[k] = 0; + sprite_ignore_projectile[k]++; + Sprite_SetX(k, Sprite_GetX(k) - 8); +} + +void SpritePrep_RupeePull(int k) { // 868bcf + sprite_ignore_projectile[k]++; + Sprite_SetX(k, Sprite_GetX(k) - 8); +} + +void SpritePrep_Shopkeeper(int k) { // 868bf1 + sprite_ignore_projectile[k]++; + sprite_flags2[k] |= 2; + sprite_oam_flags[k] |= 12; + sprite_flags3[k] |= 16; + static const uint8 kShopKeeperWhere[13] = {0xf, 0x10, 0, 6, 0x18, 0x12, 0x1e, 0xff, 0x1f, 0x23, 0x24, 0x25, 0x27}; + uint8 room = BYTE(dungeon_room_index); + int j = FindInByteArray(kShopKeeperWhere, room, 13); + switch (j) { + case 0: + ShopKeeper_SpawnShopItem(k, 0, 7); + ShopKeeper_SpawnShopItem(k, 1, 8); + ShopKeeper_SpawnShopItem(k, 2, 12); + break; + case 1: + ShopKeeper_SpawnShopItem(k, 0, 9); + ShopKeeper_SpawnShopItem(k, 1, 13); + ShopKeeper_SpawnShopItem(k, 2, 11); + break; + case 2: + sprite_subtype2[k] = 4; + minigame_credits = 0xff; + break; + case 3: + sprite_subtype2[k] = sprite_graphics[k] = 1; + minigame_credits = 0xff; + break; + case 4: + sprite_subtype2[k] = 3; + minigame_credits = 0xff; + break; + case 5: case 7: case 8: + ShopKeeper_SpawnShopItem(k, 0, 7); + ShopKeeper_SpawnShopItem(k, 1, 10); + ShopKeeper_SpawnShopItem(k, 2, 12); + break; + case 6: case 9: case 12: + sprite_subtype2[k] = 2; + break; + case 10: + sprite_subtype2[k] = 5; + break; + case 11: + sprite_subtype2[k] = 6; + break; + default: + assert(0); + } +} + +void SpritePrep_Storyteller(int k) { // 868c9e + static const uint8 kStoryTellerRooms[5] = {0xe, 0xe, 0x12, 0x1a, 0x14}; + int r = FindInByteArray(kStoryTellerRooms, BYTE(dungeon_room_index), 5); + if (r == 0 && sprite_x_hi[k] & 1) + r = 1; + sprite_subtype2[k] = r; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_Adults(int k) { // 868cc1 + static const uint8 kHumanMultiTypes[3] = {3, 0xe1, 0x19}; + sprite_ignore_projectile[k]++; + sprite_subtype2[k] = FindInByteArray(kHumanMultiTypes, BYTE(dungeon_room_index), 3); +} + +void SpritePrep_Whirlpool(int k) { // 868cd5 + sprite_ignore_projectile[k]++; + sprite_A[k] = 1; +} + +void SpritePrep_Sage(int k) { // 868cde + sprite_ignore_projectile[k]++; + if (BYTE(dungeon_room_index) == 10) { + sprite_subtype2[k]++; + sprite_oam_flags[k] = 11; + } +} + +void SpritePrep_BonkItem(int k) { // 868cf2 + static const uint16 kDashItemMask[2] = {0x4000, 0x2000}; + if (!player_is_indoors) { + sprite_graphics[k] = 2; + return; + } + sprite_floor[k] = 2; + if (dungeon_room_index == 0x107) { + if (link_item_book_of_mudora) + sprite_state[k] = 0; + else + DecodeAnimatedSpriteTile_variable(0xe); + } else { + int j = byte_7E0B9B++; + sprite_die_action[k] = j; + if (dung_savegame_state_bits & kDashItemMask[j]) + sprite_state[k] = 0; + sprite_graphics[k]++; + sprite_oam_flags[k] = 8; + sprite_flags3[k] |= 0x20; + } +} + +void SpritePrep_Kiki(int k) { // 868d46 + sprite_ignore_projectile[k]++; + if (save_ow_event_info[BYTE(overworld_screen_index)] & 0x20) + sprite_state[k] = 0; +} + +void SpritePrep_Locksmith(int k) { // 868d59 + sprite_ignore_projectile[k]++; + if (savegame_tagalong == 9) { + sprite_state[k] = 0; + return; + } + if (savegame_tagalong == 12) { + sprite_ai_state[k] = 2; + } + if (sram_progress_indicator_3 & 0x10) + sprite_ai_state[k] = 4; +} + +void SpritePrep_SickKid(int k) { // 868d7f + if (link_item_bug_net) + sprite_ai_state[k] = 3; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_Tektite(int k) { // 868d94 + static const uint8 kGanonHelpers_OamFlags[2] = {9, 7}; + static const uint8 kGanonHelpers_Health[2] = {8, 12}; + static const uint8 kGanonHelpers_BumpDamage[2] = {3, 5}; + int j; + sprite_A[k] = j = sprite_x_lo[k] >> 4 & 1; + sprite_oam_flags[k] = kGanonHelpers_OamFlags[j]; + sprite_health[k] = kGanonHelpers_Health[j]; + sprite_bump_damage[k] = kGanonHelpers_BumpDamage[j]; + Sprite_ApplySpeedTowardsLink(k, 16); + sprite_z_vel[k] = 32; + sprite_ai_state[k]++; +} + +void SpritePrep_Chainchomp_bounce(int k) { // 868dc1 + int i = k * 8; + for (int j = 5; j >= 0; j--, i++) { + chainchomp_x_hist[i] = cur_sprite_x; + chainchomp_y_hist[i] = cur_sprite_y; + } + sprite_A[k] = sprite_x_lo[k]; + sprite_B[k] = sprite_x_hi[k]; + sprite_C[k] = sprite_y_lo[k]; + sprite_G[k] = sprite_y_hi[k]; +} + +void SpritePrep_BigFairy(int k) { // 868dc6 + sprite_z[k] = 24; + SpritePrep_MoveDown_8px_Right8px(k); + sprite_ignore_projectile[k]++; +} + +void SpritePrep_MrsSahasrahla(int k) { // 868dd1 + sprite_y_lo[k] += 8; + SpritePrep_MagicBat(k); +} + +void SpritePrep_MagicBat(int k) { // 868dda + sprite_x_lo[k] += 8; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_FortuneTeller(int k) { // 868de0 + SpritePrep_IncrXYLow8(k); + sprite_ignore_projectile[k]++; +} + +void SpritePrep_FairyPond(int k) { // 868de9 + static const uint8 kLeever_OamFlags[2] = {10, 2}; + int j = sprite_x_lo[k] >> 4 & 1; + sprite_A[k] = j; + sprite_oam_flags[k] = kLeever_OamFlags[j]; +} + +void SpritePrep_Hobo(int k) { // 868dfd + for (int i = 15; i; i--) + SpritePrep_Hobo_SpawnSmoke(k); + for (int i = 15; i; i--) { + if (sprite_type[i] == 0x2b) + sprite_state[i] = 0; + } + SpritePrep_Hobo_SpawnFire(k); + if (sram_progress_indicator_3 & 1) + sprite_ai_state[0] = 3; + sprite_ignore_projectile[0] = 1; +} + +void SpritePrep_MasterSword(int k) { // 868e30 + sprite_x_lo[k] += 6; + sprite_y_lo[k] += 6; +} + +void SpritePrep_Roller_HorizontalRightFirst(int k) { // 868e42 + sprite_ai_state[k] = (~sprite_x_lo[k] & 16) >> 4; + if (sprite_ai_state[k]) + sprite_flags4[k]++; + sprite_D[k] = 0; +} + +void SpritePrep_RollerLeftRight(int k) { // 868e46 + sprite_ai_state[k] = (~sprite_x_lo[k] & 16) >> 4; + if (sprite_ai_state[k]) + sprite_flags4[k]++; + sprite_D[k] = 1; +} + +void SpritePrep_Roller_VerticalDownFirst(int k) { // 868e4f + sprite_ai_state[k] = (sprite_y_lo[k] & 16) >> 4; + if (sprite_ai_state[k]) + sprite_flags4[k]++; + sprite_D[k] = 2; +} + +void SpritePrep_RollerUpDown(int k) { // 868e53 + sprite_ai_state[k] = (sprite_y_lo[k] & 16) >> 4; + if (sprite_ai_state[k]) + sprite_flags4[k]++; + sprite_D[k] = 3; +} + +void SpritePrep_Kodongo(int k) { // 868e6b + sprite_x_lo[k] += 4; + Sprite_SetY(k, Sprite_GetY(k) - 5); + sprite_subtype[k]--; +} + +void SpritePrep_Spark(int k) { // 868e85 + sprite_subtype[k]--; +} + +void SpritePrep_LostWoodsBird(int k) { // 868ec1 + sprite_z_vel[k] = (GetRandomNumber() & 0x1f) - 0x10; + sprite_z[k] = 64; + SpritePrep_LostWoodsSquirrel(k); +} + +void SpritePrep_LostWoodsSquirrel(int k) { // 868ed2 + sprite_x_vel[k] = Sprite_IsRightOfLink(k).a ? -16 : 16; + sprite_ignore_projectile[k] = sprite_y_vel[k] = sign8(byte_7E069E[0]) ? 4 : -4; +} + +void SpritePrep_Antifairy(int k) { // 868ef2 + static const int8 kBubble_Xvel[2] = {16, -16}; + sprite_x_vel[k] = kBubble_Xvel[sprite_x_lo[k] >> 4 & 1]; + sprite_y_vel[k] = -16; +} + +void SpritePrep_FallingIce(int k) { // 868f08 + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_KingZora(int k) { // 868f0f + if (link_item_flippers) + sprite_state[k] = 0; + else + sprite_ignore_projectile[k]++; +} + +bool Sprite_ReturnIfBossFinished(int k) { // 868f1c + if (dung_savegame_state_bits & 0x8000) { + sprite_state[k] = 0; + return true; + } + for (int j = 15; j >= 0; j--) { + if (!(kSpriteInit_BumpDamage[sprite_type[j]] & 0x10)) + sprite_state[j] = 0; + } + return false; +} + +void SpritePrep_ArmosKnight(int k) { // 868f3f + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_delay_main[k] = 255; + byte_7E0FF8++; + SpritePrep_MoveDown_8px_Right8px(k); +} + +void SpritePrep_DesertStatue(int k) { // 868f4d + sprite_A[k] = sprite_limit_instance; + sprite_limit_instance++; + SpritePrep_MoveDown_8px_Right8px(k); + sprite_D[k] = (sprite_x_lo[k] < 0x30) ? 1 : (sprite_x_lo[k] < 0xe0) ? 3 : 2; +} + +void SpritePrep_DoNothingD(int k) { // 868f6c + // empty +} + +void SpritePrep_Octorok(int k) { // 868f71 + static const uint8 kOctorock_BumpDamage[2] = {3, 5}; + static const uint8 kOctorock_Health[2] = {2, 4}; + int j = is_in_dark_world; + sprite_health[k] = kOctorock_Health[j]; + sprite_bump_damage[k] = kOctorock_BumpDamage[j]; + sprite_delay_main[k] = GetRandomNumber() & 127; +} + +void SpritePrep_Moldorm_bounce(int k) { // 868f8a + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_ignore_projectile[k]++; + Sprite_InitializedSegmented(k); +} + +void SpritePrep_Lanmolas_bounce(int k) { // 868f95 + static const uint8 kLanmola_InitDelay[3] = {128, 192, 255}; + + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_delay_main[k] = kLanmola_InitDelay[k]; + sprite_z[k] = -1; + for (int i = 0; i < 64; i++) + beamos_x_hi[k * 0x40 + i] = 0xff; + garnish_y_lo[k] = 7; +} + +void SpritePrep_BigSpike(int k) { // 868f9d + SpritePrep_MoveDown_8px_Right8px(k); + SpritePrep_Kyameron(k); +} + +void SpritePrep_SwimmingZora(int k) { // 868fa2 + sprite_delay_main[k] = 64; + SpritePrep_Geldman(k); +} + +void SpritePrep_Geldman(int k) { // 868fa7 + sprite_x_lo[k] += 8; + SpritePrep_Kyameron(k); +} + +void SpritePrep_Kyameron(int k) { // 868fb0 + sprite_A[k] = sprite_x_lo[k]; + sprite_B[k] = sprite_x_hi[k]; + sprite_C[k] = sprite_y_lo[k]; + sprite_head_dir[k] = sprite_y_hi[k]; +} + +void SpritePrep_WalkingZora(int k) { // 868fc9 + sprite_delay_main[k] = 96; +} + +void SpritePrep_StandardGuard(int k) { // 868fd6 + static const uint8 kSpriteSoldier_Tab0[8] = {0, 2, 1, 3, 6, 4, 5, 7}; + + uint8 subtype = sprite_subtype[k]; + if (subtype != 0) { + if ((subtype & 7) >= 5) { + int j = ((subtype & 7) != 5) * 4 + (subtype >> 3 & 3); + sprite_B[k] = kSpriteSoldier_Tab0[j]; + sprite_flags[k] = sprite_flags[k] & 0xf | 0x50; + SpritePrep_TrooperAndArcherSoldier(k); + return; + } + sprite_D[k] = ((subtype & 7) - 1) ^ 1; + } + if (player_is_indoors) { + sprite_flags5[k] &= ~0x80; + return; + } + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 112; + sprite_D[k] = sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + SpritePrep_TrooperAndArcherSoldier(k); +} + +void SpritePrep_TrooperAndArcherSoldier(int k) { // 869001 + uint8 bak0 = submodule_index; + submodule_index = 0; + sprite_defl_bits[k] = (sprite_defl_bits[k] >> 1) | 0x80; + SpriteActive_Main(k); + SpriteActive_Main(k); + sprite_defl_bits[k] <<= 1; + submodule_index = bak0; +} + +void SpritePrep_TalkingTree(int k) { // 869043 + sprite_ignore_projectile[k]++; + Sprite_SetX(k, Sprite_GetX(k) - 8); + SpritePrep_TalkingTree_SpawnEyeball(k, 0); + SpritePrep_TalkingTree_SpawnEyeball(k, 1); +} + +void SpritePrep_CrystalSwitch(int k) { // 869064 + sprite_oam_flags[k] |= kCrystalSwitchPal[orange_blue_barrier_state & 1]; +} + +void SpritePrep_FluteKid(int k) { // 869075 + sprite_ignore_projectile[k]++; + sprite_subtype2[k] = savegame_is_darkworld >> 6 & 1; + if (sprite_subtype2[k]) { + if (sram_progress_indicator_3 & 8 || link_item_flute > 2) { + sprite_graphics[k] = 3; + sprite_ai_state[k] = 5; + } else if (link_item_flute == 2) { + sprite_graphics[k] = 1; + } + sprite_x_lo[k] += 8; + sprite_y_lo[k] -= 8; + } else { + if (link_item_flute >= 2) + sprite_state[k] = 0; + else + sprite_x_lo[k] += 7; + } +} + +void SpritePrep_MoveDown_8px(int k) { // 8690cc + sprite_y_lo[k] += 8; +} + +void SpritePrep_Zazakku(int k) { // 8690d5 + // empty +} + +void SpritePrep_PedestalPlaque(int k) { // 8690d6 + sprite_ignore_projectile[k]++; + if (BYTE(overworld_screen_index) == 48) + sprite_x_lo[k] += 7; +} + +void SpritePrep_Stalfos(int k) { // 8690e0 + sprite_subtype[k] = sprite_x_lo[k] & 16; + if (sprite_subtype[k]) + sprite_oam_flags[k] = 7; +} + +void SpritePrep_KholdstareShell(int k) { // 8690f0 + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_delay_aux1[k] = 192; + SpritePrep_MoveDown_8px_Right8px(k); +} + +void SpritePrep_Kholdstare(int k) { // 8690fa + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_ai_state[k] = 3; + SpritePrep_IgnoreProjectiles(k); + SpritePrep_MoveDown_8px_Right8px(k); +} + +void SpritePrep_Bumper(int k) { // 869107 + sprite_ignore_projectile[k]++; + SpritePrep_MoveDown_8px_Right8px(k); +} + +void SpritePrep_MoveDown_8px_Right8px(int k) { // 86910a + sprite_x_lo[k] += 8; + sprite_y_lo[k] += 8; +} + +void SpritePrep_HardhatBeetle(int k) { // 869122 + static const uint8 kHardHatBeetle_OamFlags[2] = {6, 8}; + static const uint8 kHardHatBeetle_Health[2] = {32, 6}; + static const uint8 kHardHatBeetle_A[2] = {16, 12}; + static const uint8 kHardHatBeetle_State[2] = {1, 3}; + static const uint8 kHardHatBeetle_Flags5[2] = {2, 6}; + static const uint8 kHardHatBeetle_BumpDamage[2] = {5, 3}; + int j = (sprite_x_lo[k] & 0x10) != 0; + sprite_oam_flags[k] = kHardHatBeetle_OamFlags[j]; + sprite_health[k] = kHardHatBeetle_Health[j]; + sprite_A[k] = kHardHatBeetle_A[j]; + sprite_ai_state[k] = kHardHatBeetle_State[j]; + sprite_flags5[k] = kHardHatBeetle_Flags5[j]; + sprite_bump_damage[k] = kHardHatBeetle_BumpDamage[j]; +} + +void SpritePrep_MiniHelmasaur(int k) { // 869151 + sprite_A[k] = 16; + sprite_ai_state[k] = 1; +} + +void SpritePrep_Fairy(int k) { // 86915c + sprite_A[k] = GetRandomNumber() & 1; + sprite_D[k] = sprite_A[k] ^ 1; + SpritePrep_Absorbable(k); +} + +void SpritePrep_Absorbable(int k) { // 86916a + if (!player_is_indoors) { + sprite_E[k]++; + sprite_ignore_projectile[k]++; + } +} + +void SpritePrep_OverworldBonkItem(int k) { // 86916e + sprite_E[k]++; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_ShieldPickup(int k) { // 869174 +} + +void SpritePrep_NiceBee(int k) { // 869175 + uint8 or_bottle = link_bottle_info[0] | link_bottle_info[1] | link_bottle_info[2] | link_bottle_info[3]; + if (or_bottle & 8) + sprite_state[k] = 0; + sprite_E[k]++; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_Agahnim(int k) { // 869195 + static const uint8 kAgahnim_OamFlags[2] = {11, 7}; + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_graphics[k] = 0; + sprite_D[k] = 3; + SpritePrep_MoveDown_8px_Right8px(k); + sprite_oam_flags[k] = kAgahnim_OamFlags[is_in_dark_world]; +} + +void SpritePrep_DoNothingG(int k) { // 8691ae + // empty +} + +void SpritePrep_FireBar(int k) { // 8691b4 + sprite_B[k]++; + sprite_ignore_projectile[k]++; +} + +void SpritePrep_Trinexx(int k) { // 8691ba + if (Sprite_ReturnIfBossFinished(k)) + return; + TrinexxComponents_Initialize(k); + for (int i = 15; i >= 0; i--) + alt_sprite_state[i] = 0; +} + +void SpritePrep_HelmasaurKing(int k) { // 8691c5 + if (Sprite_ReturnIfBossFinished(k)) + return; + HelmasaurKing_Initialize(k); + memset(alt_sprite_state, 0, 16); +} + +void SpritePrep_Spike(int k) { // 8691d7 + sprite_x_vel[k] = 32; + sprite_y_vel[k] = -16; + Sprite_MoveY(k); + sprite_y_vel[k] = 0; +} + +void SpritePrep_RockStal(int k) { // 8691dc + sprite_y_vel[k] = -16; + Sprite_MoveY(k); + sprite_y_vel[k] = 0; +} + +void SpritePrep_Blob(int k) { // 8691e8 + sprite_graphics[k] = 4; + SpritePrep_IgnoreProjectiles(k); +} + +void SpritePrep_Arrghus(int k) { // 8691f1 + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_z[k] = 24; +} + +void SpritePrep_Arrghi(int k) { // 8691fa + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_subtype2[k] = GetRandomNumber(); + if (k == 13) { + overlord_x_lo[2] = 0; + overlord_x_lo[3] = 0; + Arrghus_HandlePuffs(0); + } + sprite_x_lo[k] = overlord_x_lo[k + 7]; + sprite_x_hi[k] = overlord_y_lo[k + 7]; + sprite_y_lo[k] = overlord_gen1[k + 7]; + sprite_y_hi[k] = overlord_gen3[k + 7]; +} + +void SpritePrep_Mothula(int k) { // 86922f + if (Sprite_ReturnIfBossFinished(k)) + return; + sprite_delay_main[k] = 80; + sprite_ignore_projectile[k]++; + sprite_graphics[k] = 2; + BYTE(dung_floor_move_flags)++; + sprite_C[k] = 112; +} + +void SpritePrep_DoNothingH(int k) { // 86924d + // empty +} + +void SpritePrep_BigKey(int k) { // 86924e + sprite_x_lo[k] += 8; + sprite_subtype[k] = 0xff; + SpritePrep_BigKey_load_graphics(k); +} + +void SpritePrep_BigKey_load_graphics(int k) { // 869256 + DecodeAnimatedSpriteTile_variable(0x22); + SpritePrep_KeySetItemDrop(k); +} + +void SpritePrep_SmallKey(int k) { // 869262 + sprite_subtype[k] = 255; + sprite_die_action[k] = byte_7E0B9B++; +} + +void SpritePrep_KeySetItemDrop(int k) { // 869267 + sprite_die_action[k] = byte_7E0B9B; + byte_7E0B9B++; +} + +void SpriteActive_Main(int k) { // 869271 + uint8 type = sprite_type[k]; + kSpriteActiveRoutines[type](k); +} + +void Sprite_09_Moldorm_bounce(int k) { // 869469 + static const int8 kGiantMoldorm_Xvel[32] = { + 24, 22, 17, 9, 0, -9, -17, -22, -24, -22, -17, -9, 0, 9, 17, 22, + 36, 33, 25, 13, 0, -13, -25, -33, -36, -33, -25, -13, 0, 13, 25, 33, + }; + static const int8 kGiantMoldorm_Yvel[32] = { + 0, 9, 17, 22, 24, 22, 17, 9, 0, -9, -17, -22, -24, -22, -17, -9, + 0, 13, 25, 33, 36, 33, 25, 13, 0, -13, -25, -33, -36, -33, -25, -13, + }; + static const uint8 kGiantMoldorm_NextDir[16] = {8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7}; + GiantMoldorm_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_ai_state[k] == 3) { + // await death + if (!sprite_delay_aux4[k]) { + sprite_state[k] = 4; + sprite_A[k] = 0; + sprite_delay_main[k] = 224; + } else { + sprite_hit_timer[k] = sprite_delay_aux4[k] | 224; + } + return; + } + + Sprite_CheckDamageFromLink(k); + bool low_health = (sprite_health[k] < 3); + sprite_subtype2[k] += low_health ? 2 : 1; + if (!(frame_counter & (low_health ? 3 : 7))) + SpriteSfx_QueueSfx3WithPan(k, 0x31); + + if (sprite_F[k]) { + sprite_delay_aux2[k] = 64; + if (!(frame_counter & 3)) + sprite_F[k]--; + return; + } + + if (!link_incapacitated_timer && Sprite_CheckDamageToLink(k)) { + Link_CancelDash(); + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 0x28); + link_actual_vel_y = pt.y; + link_actual_vel_x = pt.x; + link_incapacitated_timer = 24; + sprite_delay_aux1[k] = 48; + sound_effect_2 = Sprite_CalculateSfxPan(k); + } + + int j = sprite_D[k] + low_health * 16; + sprite_x_vel[k] = kGiantMoldorm_Xvel[j]; + sprite_y_vel[k] = kGiantMoldorm_Yvel[j]; + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + sprite_D[k] = kGiantMoldorm_NextDir[sprite_D[k]]; + SpriteSfx_QueueSfx2WithPan(k, 0x21); + } + switch(sprite_ai_state[k]) { + case 0: // straight path + if (!sprite_delay_main[k]) { + j = 1; + if (++sprite_G[k] == 3) + sprite_G[k] = 0, j = 2; + sprite_ai_state[k] = j; + sprite_head_dir[k] = (GetRandomNumber() & 2) - 1; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 32; + } + break; + case 1: // spinning meander + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = (GetRandomNumber() & 15) + 8; + sprite_ai_state[k] = 0; + } else if (!(sprite_delay_main[k] & 3)) { + sprite_D[k] = (sprite_D[k] + sprite_head_dir[k]) & 0xf; + } + break; + case 2: // lunge at player + if (!((k ^ frame_counter) & 3)) { + Sprite_ApplySpeedTowardsLink(k, 0x1f); + uint8 dir = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k]) - sprite_D[k]; + if (dir == 0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + } else { + sprite_D[k] += sign8(dir) ? -1 : 1; + } + } + break; + } +} + +void Sprite_01_Vulture_bounce(int k) { // 869473 + static const uint8 kVulture_Gfx[4] = {1, 2, 3, 2}; + int j; + sprite_obj_prio[k] |= 0x30; + Vulture_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + switch (sprite_ai_state[k]) { + case 0: // dormant + if (++sprite_subtype2[k] == 160) { + sprite_ai_state[k] = 1; + SpriteSfx_QueueSfx3WithPan(k, 0x1e); + sprite_delay_main[k] = 16; + } + break; + case 1: { // circling + sprite_graphics[k] = kVulture_Gfx[frame_counter >> 1 & 3]; + if (sprite_delay_main[k]) { + sprite_z[k]++; + return; + } + if ((k ^ frame_counter) & 1) + return; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, (k & 0xf) + 24); + sprite_x_vel[k] = -pt.y; + sprite_y_vel[k] = pt.x; + if ((uint8)(pt.xdiff + 0x28) < 0x50 && (uint8)(pt.ydiff + 0x28) < 0x50) + return; + sprite_y_vel[k] += (int8)pt.y >> 2; + sprite_x_vel[k] += (int8)pt.x >> 2; + break; + } + } +} + +void Sprite_27_Deadrock(int k) { // 86948a + static const uint8 kDeadRock_Gfx[9] = {0, 1, 0, 1, 2, 2, 3, 3, 4}; + static const uint8 kDeadRock_OamFlags[9] = {0x40, 0x40, 0, 0, 0, 0x40, 0, 0x40, 0}; + static const int8 kDeadRock_Xvel[4] = {32, -32, 0, 0}; + static const int8 kDeadRock_Yvel[4] = {0, 0, 32, -32}; + int j = (sprite_delay_aux2[k] ? (sprite_delay_aux2[k] & 4) : (sprite_ai_state[k] != 2)) ? sprite_A[k] : 8; + sprite_graphics[k] = kDeadRock_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kDeadRock_OamFlags[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_F[k] && (Sprite_CheckDamageFromLink(k) & kCheckDamageFromPlayer_Carry) && !sound_effect_1) + SpriteSfx_QueueSfx2WithPan(k, 0xb); + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + } + if (sprite_F[k] == 14) { + sprite_ai_state[k] = 2; + sprite_delay_aux1[k] = 255; + sprite_delay_aux2[k] = 64; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // pick dir + if (!sprite_delay_main[k]) { + sprite_flags2[k] &= ~0x80; + sprite_defl_bits[k] &= ~4; + sprite_flags3[k] &= ~0x40; + sprite_ai_state[k]++; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 32; + if (++sprite_B[k] == 4) { + sprite_B[k] = 0; + j = Sprite_DirectionToFaceLink(k, NULL); + } else { + j = GetRandomNumber() & 3; + } +set_dir: + sprite_D[k] = j; + sprite_x_vel[k] = kDeadRock_Xvel[j]; + sprite_y_vel[k] = kDeadRock_Yvel[j]; + } + break; + case 1: // walk + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + } else { + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + j = sprite_D[k] ^ 1; + goto set_dir; + } + sprite_A[k] = sprite_D[k] << 1 | ++sprite_subtype2[k] >> 2 & 1; + } + break; + case 2: // petrified + sprite_flags2[k] |= 0x80; + sprite_defl_bits[k] |= 4; + sprite_flags3[k] |= 0x40; + if (!(frame_counter & 1)) { + if (sprite_delay_aux1[k] == 0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 16; + } else if (sprite_delay_aux1[k] == 0x20) { + sprite_delay_aux2[k] = 0x40; + } + } else { + sprite_delay_aux1[k]++; + } + break; + } +} + +void Sprite_20_Sluggula(int k) { // 8695d9 + static const uint8 kSluggula_Gfx[8] = {0, 1, 0, 1, 2, 3, 4, 5}; + static const uint8 kSluggula_OamFlags[8] = {0x40, 0x40, 0, 0, 0, 0, 0, 0}; + static const int8 kSluggula_XYvel[6] = {16, -16, 0, 0, 16, -16}; + int j = sprite_D[k] << 1 | (sprite_subtype2[k] & 8) >> 3; + sprite_graphics[k] = kSluggula_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 191 | kSluggula_OamFlags[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_subtype2[k]++; + switch(sprite_ai_state[k]) { + case 0: // normal + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 32; + sprite_D[k] = j = sprite_delay_main[k] & 3; +set_vel: + sprite_x_vel[k] = kSluggula_XYvel[j]; + sprite_y_vel[k] = kSluggula_XYvel[j + 2]; + } else if (sprite_delay_main[k] == 16 && !(GetRandomNumber() & 1)) { + Sluggula_DropBomb(k); + } + break; + case 1: // break from bombing + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + } + Sprite_MoveXY(k); + if (!Sprite_CheckTileCollision(k)) + return; + j = (sprite_D[k] ^= 1); + goto set_vel; + } +} + +void Sluggula_DropBomb(int k) { // 869673 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x4a, &info, 11); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_TransmuteToBomb(j); + } +} + +void Sprite_19_Poe(int k) { // 869688 + static const int8 kPoe_Accel[4] = {1, -1, 2, -2}; + static const int8 kPoe_ZvelTarget[2] = {8, -8}; + static const int8 kPoe_XvelTarget[4] = {16, -16, 28, -28}; + static const uint8 kPoe_OamFlags[2] = {0x40, 0}; + static const int8 kPoe_Yvel[2] = {8, -8}; + int j; + sprite_D[k] = j = sprite_x_vel[k] >> 7; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kPoe_OamFlags[j]; + if (!sprite_E[k]) + sprite_obj_prio[k] |= 0x30; + Poe_Draw(k); + oam_cur_ptr += 4; + oam_ext_cur_ptr++; + sprite_flags2[k]--; + SpriteDraw_SingleLarge(k); + sprite_flags2[k]++; + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sprite_E[k]) { + if (++sprite_z[k] == 12) + sprite_E[k] = 0; + return; + } + Sprite_CheckDamageToAndFromLink(k); + sprite_subtype2[k]++; + Sprite_MoveXY(k); + if (!(frame_counter & 1)) { + j = sprite_G[k] & 1; + sprite_z_vel[k] += kPoe_Accel[j]; + if (sprite_z_vel[k] == (uint8)kPoe_ZvelTarget[j]) + sprite_G[k]++; + } + Sprite_MoveZ(k); + sprite_y_vel[k] = 0; + switch(sprite_ai_state[k]) { + case 0: // select vertical dir + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + if (!(GetRandomNumber() & 12)) + sprite_head_dir[k] = Sprite_IsBelowLink(k).a; + else + sprite_head_dir[k] = GetRandomNumber() & 1; + } + break; + case 1: // roaming + if (!(frame_counter & 1)) { + int j = (sprite_anim_clock[k] & 1) + is_in_dark_world * 2; + sprite_x_vel[k] += kPoe_Accel[j]; + if (sprite_x_vel[k] == (uint8)kPoe_XvelTarget[j]) { + sprite_anim_clock[k]++; + sprite_ai_state[k] = 0; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 16; + } + } + sprite_y_vel[k] = kPoe_Yvel[sprite_head_dir[k]]; + break; + } +} + +void Poe_Draw(int k) { // 869786 + static const int8 kPoe_Draw_X[2] = {9, -1}; + static const uint8 kPoe_Draw_Char[4] = {0x7c, 0x80, 0xb7, 0x80}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + uint16 x = info.x + kPoe_Draw_X[sprite_D[k]]; + uint16 y = info.y + 9; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kPoe_Draw_Char[sprite_subtype2[k] >> 3 & 3]; + oam->flags = info.flags & 0xf0 | 2; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); +} + +void Sprite_18_MiniMoldorm(int k) { // 869808 + static const int8 kMoldorm_Xvel[16] = {24, 22, 17, 9, 0, -9, -17, -22, -24, -22, -17, -9, 0, 9, 17, 22}; + static const int8 kMoldorm_Yvel[16] = {0, 9, 17, 22, 24, 22, 17, 9, 0, -9, -17, -22, -24, -22, -17, -9}; + static const uint8 kMoldorm_NextDir[16] = {8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7}; + + Moldorm_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_F[k]) + SpritePrep_MiniMoldorm_bounce(k); + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_subtype2[k]++; + int j = sprite_D[k]; + sprite_x_vel[k] = kMoldorm_Xvel[j]; + sprite_y_vel[k] = kMoldorm_Yvel[j]; + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + if (GetRandomNumber() & 1) + sprite_head_dir[k] = -sprite_head_dir[k]; + sprite_D[k] = kMoldorm_NextDir[sprite_D[k]]; + } + switch (sprite_ai_state[k]) { + case 0: // configure + if (!sprite_delay_main[k]) { + if (++sprite_G[k] == 6) + sprite_G[k] = 0, sprite_ai_state[k] = 2; + else + sprite_ai_state[k] = 1; + sprite_head_dir[k] = (GetRandomNumber() & 2) - 1; + sprite_delay_main[k] = (GetRandomNumber() & 0x1f) + 0x20; + } + break; + case 1: // meander + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = (GetRandomNumber() & 15) + 8; + sprite_ai_state[k] = 0; + } else if ((sprite_delay_main[k] & 3) == 0) { + sprite_D[k] = (sprite_D[k] + sprite_head_dir[k]) & 0xf; + } + break; + case 2: // seek player + if (!((k ^ frame_counter) & 3)) { + Sprite_ApplySpeedTowardsLink(k, 31); + uint8 d = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k]) - sprite_D[k]; + if (d == 0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + } else { + sprite_D[k] = (sprite_D[k] + (sign8(d) ? -1 : 1)) & 0xf; + } + } + break; + } +} + +void Sprite_12_Moblin(int k) { // 8698e4 + static const int8 kMoblin_Xvel[4] = {16, -16, 0, 0}; + static const int8 kMoblin_Yvel[4] = {0, 0, 16, -16}; + static const uint8 kMoblin_Delay[4] = {0x10, 0x20, 0x30, 0x40}; + static const uint8 kMoblin_Gfx2[8] = {11, 10, 8, 9, 7, 5, 0, 2}; + static const uint8 kMoblin_Dirs[8] = {2, 3, 2, 3, 0, 1, 0, 1}; + static const uint8 kMoblin_Gfx[4] = {6, 4, 0, 2}; + int j; + Moblin_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision2(k); + switch(sprite_ai_state[k]) { + case 0: // select dir + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = kMoblin_Delay[GetRandomNumber() & 3]; + sprite_ai_state[k]++; + sprite_D[k] = sprite_head_dir[k]; + j = sprite_head_dir[k]; + sprite_x_vel[k] = kMoblin_Xvel[j]; + sprite_y_vel[k] = kMoblin_Yvel[j]; + } + break; + case 1: // walk + sprite_graphics[k] = (sprite_subtype2[k] & 1) + kMoblin_Gfx[sprite_D[k]]; + if (!sprite_wallcoll[k]) { + if (sprite_delay_main[k]) { + if (sign8(--sprite_E[k])) { + sprite_E[k] = 11; + sprite_subtype2[k]++; + } + return; + } + if (sprite_D[k] == Sprite_DirectionToFaceLink(k, NULL)) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 32; + Sprite_ZeroVelocity_XY(k); + sprite_z_vel[k] = 0; + return; + } + sprite_delay_main[k] = 0x10; + } else { + sprite_delay_main[k] = 0xc; + } + sprite_head_dir[k] = kMoblin_Dirs[sprite_D[k] << 1 | GetRandomNumber() & 1]; + sprite_ai_state[k] = 0; + if (++sprite_C[k] == 4) { + sprite_C[k] = 0; + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + } + Sprite_ZeroVelocity_XY(k); + sprite_z_vel[k] = 0; + break; + case 2: // throw spear + j = sprite_D[k]; + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 0; + if (sprite_delay_main[k] < 16) { + if (sprite_delay_main[k] == 15) { + Moblin_MaterializeSpear(k); + sprite_delay_aux1[k] = 32; + } + j += 4; + } + sprite_graphics[k] = kMoblin_Gfx2[j]; + break; + } +} + +void Moblin_MaterializeSpear(int k) { // 8699eb + static const int8 kMoblinSpear_X[4] = {11, -2, -3, 11}; + static const int8 kMoblinSpear_Y[4] = {-3, -3, 3, -11}; + static const int8 kMoblinSpear_Xvel[4] = {32, -32, 0, 0}; + static const int8 kMoblinSpear_Yvel[4] = {0, 0, 32, -32}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1b, &info), i; + if (j >= 0) { + sprite_A[j] = 3; + sprite_D[j] = i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kMoblinSpear_X[i]); + Sprite_SetY(j, info.r2_y + kMoblinSpear_Y[i]); + sprite_x_vel[j] = kMoblinSpear_Xvel[i]; + sprite_y_vel[j] = kMoblinSpear_Yvel[i]; + } +} + +void Moblin_Draw(int k) { // 869bc4 + static const DrawMultipleData kMoblin_Dmd[48] = { + {-2, 3, 0x8091, 0}, + {-2, 11, 0x8090, 0}, + { 0, -10, 0x0086, 2}, + { 0, 0, 0x008a, 2}, + {-2, 7, 0x8091, 0}, + {-2, 15, 0x8090, 0}, + { 0, -10, 0x0086, 2}, + { 0, 0, 0x408a, 2}, + { 0, -9, 0x0084, 2}, + { 0, 0, 0x00a0, 2}, + {11, -5, 0x0090, 0}, + {11, 3, 0x0091, 0}, + { 0, -9, 0x0084, 2}, + { 0, 0, 0x40a0, 2}, + {11, -8, 0x0090, 0}, + {11, 0, 0x0091, 0}, + {-4, 8, 0x0080, 0}, + { 4, 8, 0x0081, 0}, + { 0, -9, 0x0088, 2}, + { 0, 0, 0x00a6, 2}, + {-9, 6, 0x0080, 0}, + {-1, 6, 0x0081, 0}, + { 0, -8, 0x0088, 2}, + { 0, 0, 0x00a4, 2}, + {12, 8, 0x4080, 0}, + { 4, 8, 0x4081, 0}, + { 0, -9, 0x4088, 2}, + { 0, 0, 0x40a6, 2}, + {17, 6, 0x4080, 0}, + { 9, 6, 0x4081, 0}, + { 0, -8, 0x4088, 2}, + { 0, 0, 0x40a4, 2}, + {-3, -5, 0x8091, 0}, + {-3, 3, 0x8090, 0}, + { 0, -10, 0x0086, 2}, + { 0, 0, 0x00a8, 2}, + {11, -11, 0x0090, 0}, + {11, -3, 0x0091, 0}, + { 0, -9, 0x0084, 2}, + { 0, 0, 0x4082, 2}, + {-2, -3, 0x0080, 0}, + { 6, -3, 0x0081, 0}, + { 0, -9, 0x0088, 2}, + { 0, 0, 0x00a2, 2}, + {10, -3, 0x4080, 0}, + { 2, -3, 0x4081, 0}, + { 0, -9, 0x4088, 2}, + { 0, 0, 0x40a2, 2}, + }; + static const uint8 kMoblin_ObjOffs[12] = {2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2}; + static const uint8 kMoblin_HeadChar[4] = {0x88, 0x88, 0x86, 0x84}; + static const uint8 kMoblin_HeadFlags[4] = {0x40, 0, 0, 0}; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kMoblin_Dmd[sprite_graphics[k] * 4], 4, &info); + if (sprite_pause[k]) + return; + OamEnt *oam = GetOamCurPtr(); + if (sprite_delay_aux1[k]) { + for (int i = 0; i < 4; i++, oam++) { + if (!(bytewise_extended_oam[oam - oam_buf] & 2)) + oam->y = 0xf0; + } + } + oam = GetOamCurPtr() + kMoblin_ObjOffs[sprite_graphics[k]]; + int j = sprite_head_dir[k]; + oam->charnum = kMoblin_HeadChar[j]; + oam->flags = oam->flags &~0x40 | kMoblin_HeadFlags[j]; + SpriteDraw_Shadow(k, &info); +} + +void Sprite_0E_Snapdragon(int k) { // 869c24 + static const uint8 kSnapDragon_Delay[4] = {0x20, 0x30, 0x40, 0x50}; + static const uint8 kSnapDragon_Gfx[4] = {4, 0, 6, 2}; + static const int8 kSnapDragon_Xvel[8] = {8, -8, 8, -8, 16, -16, 16, -16}; + static const int8 kSnapDragon_Yvel[8] = {8, 8, -8, -8, 16, 16, -16, -16}; + int j; + sprite_graphics[k] = sprite_B[k] + kSnapDragon_Gfx[sprite_D[k]]; + SnapDragon_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_B[k] = 0; + switch(sprite_ai_state[k]) { + case 0: // resting + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = kSnapDragon_Delay[(GetRandomNumber() & 12) >> 2]; + if (sign8(--sprite_A[k])) { + sprite_A[k] = 3; + sprite_delay_main[k] = 96; + sprite_C[k]++; + sprite_D[k] = Sprite_IsBelowLink(k).a * 2 + Sprite_IsRightOfLink(k).a; + } else { + sprite_D[k] = GetRandomNumber() & 3; + } + } else if (sprite_delay_main[k] & 0x18) { + sprite_B[k]++; + } + break; + case 1: // attack + sprite_B[k]++; + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + sprite_D[k] ^= 3; + j = sprite_D[k] + (sprite_C[k] ? 4 : 0); + sprite_x_vel[k] = kSnapDragon_Xvel[j]; + sprite_y_vel[k] = kSnapDragon_Yvel[j]; + Sprite_MoveZ(k); + sprite_z_vel[k] -= 4; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_C[k] = 0; + sprite_delay_main[k] = 63; + } else { + sprite_z_vel[k] = 20; + } + } + break; + } +} + +void SnapDragon_Draw(int k) { // 869e02 + static const DrawMultipleData kSnapDragon_Dmd[32] = { + { 4, -8, 0x008f, 0}, + {12, -8, 0x009f, 0}, + {-4, 0, 0x008c, 2}, + { 4, 0, 0x008d, 2}, + { 4, -8, 0x002b, 0}, + {12, -8, 0x003b, 0}, + {-4, 0, 0x0028, 2}, + { 4, 0, 0x0029, 2}, + {-4, -8, 0x003c, 0}, + { 4, -8, 0x003d, 0}, + {-4, 0, 0x00aa, 2}, + { 4, 0, 0x00ab, 2}, + {-4, -8, 0x003e, 0}, + { 4, -8, 0x003f, 0}, + {-4, 0, 0x00ad, 2}, + { 4, 0, 0x00ae, 2}, + {-4, -8, 0x409f, 0}, + { 4, -8, 0x408f, 0}, + {-4, 0, 0x408d, 2}, + { 4, 0, 0x408c, 2}, + {-4, -8, 0x403b, 0}, + { 4, -8, 0x402b, 0}, + {-4, 0, 0x4029, 2}, + { 4, 0, 0x4028, 2}, + { 4, -8, 0x403d, 0}, + {12, -8, 0x403c, 0}, + {-4, 0, 0x40ab, 2}, + { 4, 0, 0x40aa, 2}, + { 4, -8, 0x403f, 0}, + {12, -8, 0x403e, 0}, + {-4, 0, 0x40ae, 2}, + { 4, 0, 0x40ad, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kSnapDragon_Dmd[sprite_graphics[k] * 4], 4, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_22_Ropa(int k) { // 869e1f + Ropa_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_subtype2[k]++; + sprite_graphics[k] = sprite_subtype2[k] >> 3 & 3; + switch(sprite_ai_state[k]) { + case 0: // stationary + if (!sprite_delay_main[k]) { + Sprite_ApplySpeedTowardsLink(k, 16); + sprite_z_vel[k] = (GetRandomNumber() & 15) + 20; + sprite_ai_state[k]++; + } + break; + case 1: // pounce + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + Sprite_ZeroVelocity_XY(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_delay_main[k] = 48; + sprite_ai_state[k] = 0; + } + break; + } +} + +void Ropa_Draw(int k) { // 869ee5 + static const DrawMultipleData kRopa_Dmd[12] = { + {0, -8, 0x0026, 0}, + {8, -8, 0x0027, 0}, + {0, 0, 0x0008, 2}, + {0, -8, 0x0036, 0}, + {8, -8, 0x0037, 0}, + {0, 0, 0x000a, 2}, + {0, -8, 0x4027, 0}, + {8, -8, 0x4026, 0}, + {0, 0, 0x4008, 2}, + {0, -8, 0x4037, 0}, + {8, -8, 0x4036, 0}, + {0, 0, 0x4008, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kRopa_Dmd[sprite_graphics[k] * 3], 3, &info); + SpriteDraw_Shadow(k, &info); + +} + +void Sprite_11_Hinox(int k) { // 869f05 + Hinox_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_F[k]) { + Hinox_FaceLink(k); + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 48; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: // select dir + if (!sprite_delay_main[k]) { + if (!(GetRandomNumber() & 3)) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 64; + } else { + if (++sprite_C[k] == 4) { + sprite_C[k] = 0; + Hinox_FaceLink(k); + } else { + static const uint8 kHinox_RandomDirs[8] = {2, 3, 3, 2, 0, 1, 1, 0}; + Hinox_SetDirection(k, kHinox_RandomDirs[sprite_D[k] * 2 + (GetRandomNumber() & 1)]); + } + } + } + break; + case 1: // walk + if (sprite_delay_main[k]) { + if (sign8(--sprite_A[k])) { + sprite_A[k] = 11; + sprite_subtype2[k]++; + } + Sprite_MoveXY(k); + if (!Sprite_CheckTileCollision(k)) { + static const uint8 kHinox_WalkGfx[4] = {6, 4, 0, 2}; + sprite_graphics[k] = kHinox_WalkGfx[sprite_D[k]] + (sprite_subtype2[k] & 1); + return; + } + } + sprite_delay_main[k] = 16; + sprite_ai_state[k] = 0; + break; + case 2: // throw bomb + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 2; + return; + } + if (sprite_delay_main[k] == 32) { + static const int8 kHinox_BombX[4] = {8, -8, -13, 13}; + static const int8 kHinox_BombY[4] = {-11, -11, -16, -16}; + static const int8 kHinox_BombXvel[4] = {24, -24, 0, 0}; + static const int8 kHinox_BombYvel[4] = {0, 0, 24, -24}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x4a, &info); + if (j >= 0) { + Sprite_TransmuteToBomb(j); + sprite_delay_aux1[j] = 64; + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kHinox_BombX[i]); + Sprite_SetY(j, info.r2_y + kHinox_BombY[i]); + sprite_x_vel[j] = kHinox_BombXvel[i]; + sprite_y_vel[j] = kHinox_BombYvel[i]; + sprite_z_vel[j] = 40; + } + } else { + static const uint8 kHinox_Gfx[8] = {11, 10, 8, 9, 7, 5, 1, 3}; + sprite_graphics[k] = kHinox_Gfx[sprite_D[k] + (sprite_delay_main[k] < 32 ? 4 : 0)]; + } + break; + } + +} + +void Hinox_ThrowBomb(int k) { // 869f4a + +} + +void Hinox_FaceLink(int k) { // 869fe1 + Hinox_SetDirection(k, Sprite_DirectionToFaceLink(k, NULL)); + sprite_x_vel[k] <<= 1; + sprite_y_vel[k] <<= 1; +} + +void Hinox_SetDirection(int k, uint8 dir) { // 86a004 + static const int8 kHinox_Xvel[4] = {8, -8, 0, 0}; + static const int8 kHinox_Yvel[4] = {0, 0, 8, -8}; + sprite_D[k] = dir; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 96; + sprite_ai_state[k]++; + sprite_x_vel[k] = kHinox_Xvel[dir]; + sprite_y_vel[k] = kHinox_Yvel[dir]; +} + +void Hinox_Draw(int k) { // 86a1f9 + static const DrawMultipleData kHinox_Dmd[46] = { + { 0, -13, 0x0600, 2}, + { -8, -5, 0x0624, 2}, + { 8, -5, 0x4624, 2}, + { 0, 1, 0x0606, 2}, + { 0, -13, 0x0600, 2}, + { -8, -5, 0x0624, 2}, + { 8, -5, 0x4624, 2}, + { 0, 1, 0x4606, 2}, + { -8, -6, 0x0624, 2}, + { 8, -6, 0x4624, 2}, + { 0, 0, 0x0606, 2}, + { 0, -13, 0x0604, 2}, + { -8, -6, 0x0624, 2}, + { 8, -6, 0x4624, 2}, + { 0, 0, 0x4606, 2}, + { 0, -13, 0x0604, 2}, + { -3, -13, 0x0602, 2}, + { 0, -8, 0x060c, 2}, + { 0, 0, 0x061c, 2}, + { -3, -12, 0x0602, 2}, + { 0, -8, 0x060e, 2}, + { 0, 0, 0x061e, 2}, + { 3, -13, 0x4602, 2}, + { 0, -8, 0x460c, 2}, + { 0, 0, 0x461c, 2}, + { 3, -12, 0x4602, 2}, + { 0, -8, 0x460e, 2}, + { 0, 0, 0x461e, 2}, + {-13, -16, 0x056e, 2}, + { 0, -13, 0x0600, 2}, + { -8, -5, 0x0620, 2}, + { 8, -5, 0x4624, 2}, + { 0, 1, 0x0606, 2}, + { -8, -5, 0x0624, 2}, + { 8, -5, 0x4620, 2}, + { 0, 1, 0x0606, 2}, + { 0, -13, 0x0604, 2}, + { 13, -16, 0x056e, 2}, + { -8, -11, 0x056e, 2}, + { -3, -13, 0x0602, 2}, + { 0, 0, 0x0622, 2}, + { 0, -8, 0x060c, 2}, + { 8, -11, 0x056e, 2}, + { 3, -13, 0x4602, 2}, + { 0, 0, 0x4622, 2}, + { 0, -8, 0x460c, 2}, + }; + PrepOamCoordsRet info; + static const uint8 kHinoxNum[12] = { 4, 4, 4, 4, 3, 3, 3, 3, 5, 5, 4, 4 }; + static const uint8 kHinoxOffs[12] = { 0, 4, 8, 12, 16, 19, 22, 25, 28, 33, 38, 42 }; + int j = sprite_graphics[k]; + Sprite_DrawMultiple(k, &kHinox_Dmd[kHinoxOffs[j]], kHinoxNum[j], &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_23_RedBari(int k) { // 86a23d + static const int8 kBari_Xvel2[16] = {0, 8, 11, 14, 16, 14, 11, 8, 0, -8, -11, -14, -16, -14, -11, -8}; + static const int8 kBari_Yvel2[16] = {-16, -14, -11, -8, 0, 8, 11, 14, 16, 14, 11, 8, 0, -9, -11, -14}; + static const uint8 kBari_Gfx[2] = {0, 3}; + int j; + + if (sign8(sprite_C[k])) { + if (sprite_head_dir[k] != 16) { + sprite_head_dir[k]++; + } else { + sprite_x_vel[k] = 255; + sprite_subtype[k] = 255; + Sprite_CheckTileCollision2(k); + sprite_subtype[k] = 0; + if (!sprite_tiletype) { + sprite_C[k] = 0; + sprite_ignore_projectile[k] = 0; + goto set_electrocute_delay; + } + sprite_ignore_projectile[k] = sprite_tiletype; + } + return; + } + if (sprite_C[k] != 0) { + SpriteDraw_SingleSmall(k); + } else if (sprite_graphics[k] >= 2) { + SpriteDraw_SingleLarge(k); + } else { + RedBari_Draw(k); + } + + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sprite_delay_aux2[k]) + goto recoil_from_split; + + if (sprite_ai_state[k] == 2) { + static const int8 kBari_Xvel[2] = {8, -8}; + sprite_ignore_projectile[k] = sprite_ai_state[k]; + sprite_x_vel[k] = kBari_Xvel[frame_counter >> 1 & 1]; + Sprite_MoveX(k); + if (!sprite_delay_main[k]) { + RedBari_Split(k); + sprite_state[k] = 0; + } + return; + } + + Sprite_CheckDamageToAndFromLink(k); + if (!((k ^ frame_counter) & 15)) { + sprite_A[k] += (sprite_B[k] & 1) ? -1 : 1; + if (!(GetRandomNumber() & 3)) + sprite_B[k]++; + } + j = sprite_A[k] & 15; + sprite_x_vel[k] = kBari_Xvel2[j]; + sprite_y_vel[k] = kBari_Yvel2[j]; + + if (!((k ^ frame_counter) & 3 | sprite_delay_main[k])) { +recoil_from_split: + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision2(k); + } + j = sprite_C[k]; + sprite_graphics[k] = (frame_counter >> 3 & 1) + kBari_Gfx[j]; + if (sprite_ai_state[k]) { + if (sprite_delay_main[k]) { + sprite_graphics[k] = (frame_counter >> 1 & 2) + kBari_Gfx[j]; + return; + } + sprite_ai_state[k] = 0; + } else if (sprite_delay_aux1[k]) { + return; + } else if (!(GetRandomNumber() & 1)) { + sprite_delay_main[k] = 128; + sprite_ai_state[k]++; + return; + } +set_electrocute_delay: + sprite_delay_aux1[k] = (GetRandomNumber() & 63) + 128; +} + +void RedBari_Split(int k) { // 86a34e + static const int8 kRedBari_SplitX[2] = {0, 8}; + static const int8 kRedBari_SplitXvel[2] = {-32, 32}; + + tmp_counter = 1; + do { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x23, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_flags3[j] = 0x33; + sprite_oam_flags[j] = 3; + sprite_flags4[j] = 1; + sprite_C[j] = 1; + Sprite_SetX(j, info.r0_x + kRedBari_SplitX[tmp_counter]); + sprite_x_vel[j] = kRedBari_SplitXvel[tmp_counter]; + sprite_delay_aux2[j] = 8; + sprite_delay_aux1[j] = 64; + } + } while (!sign8(--tmp_counter)); + +} + +void RedBari_Draw(int k) { // 86a3dc + static const DrawMultipleData kRedBari_Dmd[8] = { + {0, 0, 0x0022, 0}, + {8, 0, 0x4022, 0}, + {0, 8, 0x0032, 0}, + {8, 8, 0x4032, 0}, + {0, 0, 0x0023, 0}, + {8, 0, 0x4023, 0}, + {0, 8, 0x0033, 0}, + {8, 8, 0x4033, 0}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kRedBari_Dmd[sprite_graphics[k] * 4], 4, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_13_MiniHelmasaur(int k) { // 86a409 + static const uint8 kHelmasaur_Gfx[8] = {3, 4, 3, 4, 2, 2, 5, 5}; + static const uint8 kHelmasaur_OamFlags[8] = {0x40, 0x40, 0, 0, 0, 0x40, 0x40, 0}; + int j = sprite_subtype2[k] >> 2 & 1 | sprite_D[k] << 1; + sprite_graphics[k] = kHelmasaur_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kHelmasaur_OamFlags[j]; + if (!((k ^ frame_counter) & 15)) { + uint8 x = sprite_x_vel[k]; + if (sign8(x)) x = -x; + uint8 y = sprite_y_vel[k]; + if (sign8(y)) y = -y; + sprite_D[k] = (x >= y) ? (sprite_x_vel[k] >> 7) : (sprite_y_vel[k] >> 7) + 2; + } + SpriteDraw_SingleLarge(k); + HelmasaurHardHatBeetleCommon(k); +} + +void Sprite_26_HardhatBeetle(int k) { // 86a460 + sprite_graphics[k] = sprite_subtype2[k] >> 2 & 1; + HardHatBeetle_Draw(k); + HelmasaurHardHatBeetleCommon(k); +} + +void HelmasaurHardHatBeetleCommon(int k) { // 86a46d + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + if (sprite_wallcoll[k] & 15) { + if (sprite_wallcoll[k] & 3) + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + } else { + Sprite_MoveXY(k); + } + Sprite_CheckTileCollision(k); + if (!((k ^ frame_counter) & 31)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, sprite_A[k]); + sprite_B[k] = pt.y; + sprite_C[k] = pt.x; + } + if ((k ^ frame_counter) & sprite_ai_state[k]) + return; + sprite_y_vel[k] += sign8(sprite_y_vel[k] - sprite_B[k]) ? 1 : -1; + sprite_x_vel[k] += sign8(sprite_x_vel[k] - sprite_C[k]) ? 1 : -1; +} + +void HardHatBeetle_Draw(int k) { // 86a4f2 + static const DrawMultipleData kHardHatBeetle_Dmd[4] = { + {0, -4, 0x0140, 2}, + {0, 2, 0x0142, 2}, + {0, -5, 0x0140, 2}, + {0, 2, 0x0144, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kHardHatBeetle_Dmd[sprite_graphics[k] * 2], 2, &info); + if (sprite_flags3[k] & 0x10) + SpriteDraw_Shadow(k, &info); +} + +void Sprite_15_Antifairy(int k) { // 86a50c + SpriteDraw_Antfairy(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink(k) && sprite_delay_main[k] == 0) { + sprite_delay_main[k] = 16; + int t = link_magic_power - 8; + if (t < 0) + t = 0; + else + sound_effect_2 = 0x1d; + link_magic_power = t; + } + Sprite_MoveXY(k); + Sprite_BounceFromTileCollision(k); +} + +void Sprite_0B_Cucco(int k) { // 86a5c2 + if (sprite_x_vel[k] != 0) + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | (sign8(sprite_x_vel[k]) ? 0 : 0x40); + + SpriteDraw_SingleLarge(k); + if (sprite_head_dir[k] != 0) { + sprite_type[k] = 0x3d; + SpritePrep_LoadProperties(k); + sprite_subtype[k]++; + sprite_delay_main[k] = 48; + sound_effect_1 = 21; + sprite_ignore_projectile[k] = 21; + return; + } + if (sprite_state[k] == 10) { + sprite_ai_state[k] = 3; + if (submodule_index == 0) { + Chicken_IncrSubtype2(k, 3); + Cucco_DrawPANIC(k); + if (!(frame_counter & 0xf)) + BawkBawk(k); + } + } + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_C[k] != 0) { + sprite_oam_flags[k] |= 0x10; + Sprite_MoveXY(k); + sprite_z[k] = 12; + sprite_ignore_projectile[k] = 12; + if (((k ^ frame_counter) & 7) == 0) + Sprite_CheckDamageToLink(k); + Chicken_IncrSubtype2(k, 4); + } else { + sprite_health[k] = 255; + if (sprite_B[k] >= 35) + Cucco_SummonAvenger(k); + if (sprite_F[k] != 0) { + sprite_F[k] = 0; + if (sprite_B[k] < 35) { + sprite_B[k]++; + BawkBawk(k); + } + sprite_ai_state[k] = 2; + } + Sprite_CheckDamageFromLink(k); + switch (sprite_ai_state[k]) { + case 0: Cucco_Calm(k); break; + case 1: Chicken_Hopping(k); break; + case 2: Cucco_Flee(k); break; + case 3: Cucco_Carried(k); break; + } + } +} + +void Cucco_Calm(int k) { // 86a67f + if (sprite_delay_main[k] == 0) { + int j = GetRandomNumber() & 0xf; + sprite_x_vel[k] = kSpriteKeese_Tab2[j]; + sprite_y_vel[k] = kSpriteKeese_Tab3[j]; + sprite_delay_main[k] = (GetRandomNumber() & 0x1f) + 0x10; + sprite_ai_state[k]++; + } + sprite_graphics[k] = 0; + Sprite_ReturnIfLifted(k); +} + +void Chicken_Hopping(int k) { // 86a6b1 + if ((k ^ frame_counter) & 1 && Cucco_DoMovement_XY(k)) + sprite_ai_state[k] = 0; + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + if (sprite_delay_main[k] == 0) { + sprite_delay_main[k] = 32; + sprite_ai_state[k] = 0; + } + sprite_z_vel[k] = 10; + } + Chicken_IncrSubtype2(k, 4); +} + +void Cucco_Flee(int k) { // 86a6fc + Sprite_ReturnIfLifted(k); + Cucco_DoMovement_XY(k); + sprite_z[k] = 0; + if (!((k ^ frame_counter) & 0x1f)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 16); + sprite_x_vel[k] = -pt.x; + sprite_y_vel[k] = -pt.y; + } + Chicken_IncrSubtype2(k, 5); + Cucco_DrawPANIC(k); +} + +void Cucco_DrawPANIC(int k) { // 86a727 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Sprite_DrawDistress_custom(info.x, info.y, frame_counter); +} + +void Cucco_Carried(int k) { // 86a78e + Sprite_MoveZ(k); + if (Cucco_DoMovement_XY(k)) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; + Sprite_MoveXY(k); + Sprite_HalveSpeed_XY(k); + Sprite_HalveSpeed_XY(k); + BawkBawk(k); + } + sprite_z_vel[k]--; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_ai_state[k] = 2; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 16); + sprite_x_vel[k] = -pt.x; + sprite_y_vel[k] = -pt.y; + Chicken_IncrSubtype2(k, 5); + Cucco_DrawPANIC(k); + } else { + Chicken_IncrSubtype2(k, 4); + } +} + +uint8 Cucco_DoMovement_XY(int k) { // 86a7bb + Sprite_MoveXY(k); + return Sprite_CheckTileCollision(k); +} + +void Cucco_SummonAvenger(int k) { // 86a7d3 + static const uint8 kChicken_Avenger[2] = {0, 0xff}; + if ((k ^ frame_counter) & 0xf | player_is_indoors) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xB, &info, 10); + if (j < 0) + return; + SpriteSfx_QueueSfx3WithPan(j, 0x1e); + sprite_C[j] = 1; + uint8 t = GetRandomNumber(); + uint16 x = BG2HOFS_copy2, y = BG2VOFS_copy2; + if (t & 2) + x += t, y += kChicken_Avenger[t & 1]; + else + y += t, x += kChicken_Avenger[t & 1]; + Sprite_SetX(j, x); + Sprite_SetY(j, y); + Sprite_ApplySpeedTowardsLink(j, 32); + BawkBawk(k); +} + +void BawkBawk(int k) { // 86a84c + SpriteSfx_QueueSfx2WithPan(k, 0x30); +} + +void Sprite_17_Hoarder(int k) { // 86a86c + if (sprite_ai_state[k]) + Sprite_Hoarder_Frantic(k); + else + Sprite_Hoarder_Covered(k); +} + +void Sprite_Hoarder_Covered(int k) { // 86a874 + static const uint8 kRupeeCoveredGrab_Gfx[4] = {3, 4, 5, 4}; + static const int8 kRupeeCoveredGrab_Xvel[4] = {-12, 12, 0, 0}; + static const int8 kRupeeCoveredGrab_Yvel[4] = {0, 0, -12, 12}; + CoveredRupeeCrab_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = 0; + PointU8 pt; + uint8 dir = Sprite_DirectionToFaceLink(k, &pt); + if (sprite_delay_main[k]) + goto lbl; + if ((uint8)(pt.y + 0x30) < 0x60 && (uint8)(pt.x + 0x20) < 0x40) { + sprite_delay_main[k] = 32; +lbl:sprite_x_vel[k] = kRupeeCoveredGrab_Xvel[dir]; + sprite_y_vel[k] = kRupeeCoveredGrab_Yvel[dir]; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision2(k); + Sprite_CheckDamageFromLink(k); + sprite_graphics[k] = kRupeeCoveredGrab_Gfx[++sprite_subtype2[k] >> 1 & 3]; + } + if (sprite_type[k] != 0x3e || link_item_gloves >= 1) + Sprite_ReturnIfLiftedPermissive(k); // note, dont ret + if (sprite_state[k] != 9) { + sprite_C[k] = (sprite_type[k] == 0x17) ? 2 : 1; + sprite_type[k] = 0xec; + sprite_oam_flags[k] &= ~1; + sprite_graphics[k] = 0; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x3e, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_flags2[j] &= ~0x80; + sprite_delay_aux2[j] = 128; + sprite_oam_flags[j] = 9; + sprite_ai_state[j] = 9; + } + } +} + +void Sprite_Hoarder_Frantic(int k) { // 86a91d + static const uint8 kRupeeCrab_Gfx[4] = {0, 1, 0, 1}; + static const uint8 kRupeeCrab_OamFlags[4] = {0, 0, 0x40, 0}; + static const int8 kRupeeCrab_Xvel[4] = {-16, 16, -16, 16}; + static const int8 kRupeeCrab_Yvel[4] = {-16, -16, 16, 16}; + + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageFromLink(k); + if (!sprite_delay_aux2[k]) + Sprite_CheckDamageToLink(k); + int j = ++sprite_subtype2[k] >> 1 & 3; + sprite_graphics[k] = kRupeeCrab_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kRupeeCrab_OamFlags[j]; + if (sprite_wallcoll[k]) { + sprite_delay_aux4[k] = 16; + j = GetRandomNumber() & 3; + sprite_x_vel[k] = kRupeeCrab_Xvel[j]; + sprite_y_vel[k] = kRupeeCrab_Yvel[j]; + } else { + Sprite_MoveXY(k); + } + Sprite_CheckTileCollision2(k); + if (!sprite_delay_aux4[k] && !((k ^ frame_counter) & 31)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 16); + sprite_y_vel[k] = -pt.y; + sprite_x_vel[k] = -pt.x; + } + if (frame_counter & 1) + return; + + int end; + uint8 type; + if (++sprite_G[k] == 192) { + sprite_delay_main[k] = 15; + sprite_state[k] = 6; + sprite_flags2[k] += 4; + end = 1; + type = 0xd9; + } else { + if (sprite_G[k] & 15) + return; + end = 0; + type = sprite_head_dir[k] == 6 ? 0xdb : 0xd9; + } + SpriteSpawnInfo info; + j = Sprite_SpawnDynamicallyEx(k, type, &info, end); + if (j >= 0) { + sprite_head_dir[k]++; + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_SetX(j, info.r0_x + 8); + sprite_z_vel[j] = 32; + sprite_delay_aux4[j] = 16; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(j, 16); + sprite_y_vel[j] = ~pt.y; + sprite_x_vel[j] = ~pt.x; + SpriteSfx_QueueSfx3WithPan(k, 0x30); + } +} + +void CoveredRupeeCrab_Draw(int k) { // 86aa48 + static const int8 kCoveredRupeeCrab_DrawY[12] = {0, 0, 0, -3, 0, -5, 0, -6, 0, -6, 0, -6}; + static const uint8 kCoveredRupeeCrab_DrawChar[12] = {0x44, 0x44, 0xe8, 0x44, 0xe8, 0x44, 0xe6, 0x44, 0xe8, 0x44, 0xe6, 0x44}; + static const uint8 kCoveredRupeeCrab_DrawFlags[12] = {0, 0xc, 3, 0xc, 3, 0xc, 3, 0xc, 3, 0xc, 0x43, 0xc}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + if (byte_7E0FC6 >= 3) + return; + OamEnt *oam = GetOamCurPtr(); + uint8 r7 = (sprite_type[k] == 0x17) ? 2 : 0; + uint8 r6 = sprite_graphics[k] * 2; + for (int i = 1; i >= 0; i--, oam++) { + int j = i + r6; + uint16 x = info.x; + uint16 y = info.y + kCoveredRupeeCrab_DrawY[j]; + oam->x = x; + oam->y = ClampYForOam(y); + uint8 ch = kCoveredRupeeCrab_DrawChar[j]; + oam->charnum = ch + (ch == 0x44 ? r7 : 0); + oam->flags = (info.flags & ~1) | kCoveredRupeeCrab_DrawFlags[j]; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void Sprite_EC_ThrownItem(int k) { // 86aae0 + if (byte_7E0FC6 < 3) { + if (sort_sprites_setting && sprite_floor[k]) { + int spr_slot = 0x2c + (k & 3); + oam_cur_ptr = 0x0800 + spr_slot * 4; + oam_ext_cur_ptr = 0x0A20 + spr_slot; + } + sprite_ignore_projectile[k] = sprite_state[k]; + if (sprite_C[k] >= 6) { + SpriteDraw_ThrownItem_Gigantic(k); + } else { + SpriteDraw_SingleLarge(k); + OamEnt *oam = GetOamCurPtr(); + uint8 t = player_is_indoors + is_in_dark_world; + int j = sprite_C[k]; + oam->charnum = kThrowableScenery_Char[j + ((t >= 2) ? 6 : 0)]; + oam->flags = (oam->flags & 0xf0) | kThrowableScenery_Flags[j]; + sprite_oam_flags[k] = (sprite_oam_flags[k] & 0xc0) | (oam->flags & 0xf); + } + } + if (sprite_state[k] == 9) { + if (Sprite_ReturnIfInactive(k)) + return; + ThrowableScenery_InteractWithSpritesAndTiles(k); + } +} + +void SpriteDraw_ThrownItem_Gigantic(int k) { // 86ab76 + PrepOamCoordsRet info; + sprite_oam_flags[k] = kThrowableScenery_DrawLarge_OamFlags[sprite_C[k] - 6]; + + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + + OamEnt *oam = GetOamCurPtr(); + for (int i = 3; i >= 0; i--, oam++) { + uint16 x = info.x + kThrowableScenery_DrawLarge_X[i]; + uint16 y = info.y + kThrowableScenery_DrawLarge_Y[i]; + oam->x = x; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + oam->charnum = 0x4a; + oam->flags = kThrowableScenery_DrawLarge_Flags[i] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } + Oam_AllocateFromRegionB(12); + oam = GetOamCurPtr(); + info.y = Sprite_GetY(k) - BG2VOFS_copy2; + for (int i = 2; i >= 0; i--, oam++) { + uint16 x = info.x + kThrowableScenery_DrawLarge_X2[i]; + uint16 y = info.y + 12; + oam->x = x; + oam->y = (uint16)(y + 0x10) < 0x100 ? y : 0xf0; + oam->charnum = 0x6c; + oam->flags = 0x24; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void ThrowableScenery_ScatterIntoDebris(int k) { // 86ac41 + if (!sign8(sprite_C[k]) && sprite_C[k] >= 6) { + for (int i = 3; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xec, &info); + if (j >= 0) { + sprite_z[j] = sprite_z[k]; + Sprite_SetX(j, info.r0_x + kScatterDebris_X[i]); + Sprite_SetY(j, info.r2_y + kScatterDebris_Y[i]); + sprite_C[j] = 1; + Sprite_ScheduleForBreakage(j); + sprite_oam_flags[j] = (sprite_C[k] < 7) ? 12 : 0; + } + } + sprite_state[k] = 0; + } else { + sprite_state[k] = 0; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + int j = 29; + while (garnish_type[j--] && j >= 0) {} + j++; + garnish_type[j] = 22; + garnish_active = 22; + garnish_x_lo[j] = sprite_x_lo[k]; + garnish_x_hi[j] = sprite_x_hi[k]; + uint16 y = Sprite_GetY(k) - sprite_z[k] + 0x10; + garnish_y_lo[j] = (uint8)y; + garnish_y_hi[j] = (uint8)(y >> 8); + garnish_oam_flags[j] = info.flags; + garnish_floor[j] = sprite_floor[k]; + garnish_countdown[j] = 31; + garnish_sprite[j] = sprite_C[k]; + } +} + +void Sprite_TransmuteToBomb(int k) { // 86ad50 + sprite_type[k] = 0x4a; + sprite_C[k] = 1; + sprite_delay_aux1[k] = 255; + sprite_flags3[k] = 0x18; + sprite_oam_flags[k] = 8; + sprite_health[k] = 0; +} + +void Sprite_28_DarkWorldHintNPC(int k) { // 86ad6f + StoryTeller_1_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (!sprite_delay_main[k]) + sprite_graphics[k] = frame_counter >> 4 & 1; + + int type = sprite_subtype2[k]; + + switch(sprite_subtype2[k]) { + case 0: + switch (sprite_ai_state[k]) { + case 0: DarkWorldHintNPC_Idle(k); break; + case 1: + if (choice_in_multiselect_box == 0 && DarkWorldHintNPC_HandlePayment()) { + Sprite_ShowMessageUnconditional(0xff); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x100); + sprite_ai_state[k] = 0; + } + break; + case 2: DarkWorldHintNPC_RestoreHealth(k); break; + } + break; + case 1: + switch (sprite_ai_state[k]) { + case 0: DarkWorldHintNPC_Idle(k); break; + case 1: + if (choice_in_multiselect_box == 0 && DarkWorldHintNPC_HandlePayment()) { + Sprite_ShowMessageUnconditional(0x101); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x100); + sprite_ai_state[k] = 0; + } + break; + case 2: DarkWorldHintNPC_RestoreHealth(k); break; + } + break; + case 2: + switch (sprite_ai_state[k]) { + case 0: DarkWorldHintNPC_Idle(k); break; + case 1: + if (choice_in_multiselect_box == 0 && DarkWorldHintNPC_HandlePayment()) { + Sprite_ShowMessageUnconditional(0x102); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x100); + sprite_ai_state[k] = 0; + } + break; + case 2: DarkWorldHintNPC_RestoreHealth(k); break; + } + break; + case 3: + if (sprite_delay_main[k] == 0) { + if ((frame_counter & 0x3f) == 0) + sprite_oam_flags[k] ^= 0x40; + if (GetRandomNumber() == 0) + sprite_delay_main[k] = 32; + } + Sprite_ShowSolicitedMessage(k, 0x149); + break; + case 4: + sprite_graphics[k] = frame_counter >> 1 & 1; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) + sprite_z[k] = 0; + sprite_z_vel[k] += (sprite_z[k] >= 4) ? -1 : 1; + switch (sprite_ai_state[k]) { + case 0: DarkWorldHintNPC_Idle(k); break; + case 1: + if (choice_in_multiselect_box == 0 && DarkWorldHintNPC_HandlePayment()) { + Sprite_ShowMessageUnconditional(0x103); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x100); + sprite_ai_state[k] = 0; + } + break; + case 2: DarkWorldHintNPC_RestoreHealth(k); break; + } + break; + } +} + +void DarkWorldHintNPC_Idle(int k) { // 86ada7 + if (Sprite_ShowSolicitedMessage(k, 0xfe) & 0x100) + sprite_ai_state[k] = 1; +} + +void DarkWorldHintNPC_RestoreHealth(int k) { // 86adb5 + link_hearts_filler = 0xa0; + sprite_ai_state[k] = 0; +} + +bool DarkWorldHintNPC_HandlePayment() { // 86aeab + if (link_rupees_goal < 20) + return false; + link_rupees_goal -= 20; + return true; +} + +void StoryTeller_1_Draw(int k) { // 86af1a + static const DrawMultipleData kStoryTeller_Dmd[10] = { + {0, 0, 0x0a4a, 2}, + {0, 0, 0x4a6e, 2}, + {0, 0, 0x0a24, 2}, + {0, 0, 0x4a24, 2}, + {0, 0, 0x0804, 2}, + {0, 0, 0x4804, 2}, + {0, 0, 0x0a6a, 2}, + {0, 0, 0x0a6c, 2}, + {0, 0, 0x0a0e, 2}, + {0, 0, 0x0a2e, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kStoryTeller_Dmd[sprite_subtype2[k] * 2 + sprite_graphics[k]], 1, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_2E_FluteKid(int k) { // 86af3b + switch (sprite_head_dir[k]) { + case 0: + switch (sprite_subtype2[k]) { + case 0: FluteKid_Human(k); break; + case 1: Sprite_FluteKid_Stumpy(k); break; + } + break; + case 1: Sprite_FluteKid_Quaver(k); break; + } +} + +void FluteKid_Human(int k) { // 86af51 + if (sprite_ai_state[k] != 3) + sprite_C[k] = FluteBoy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_C[k] && !sprite_B[k]) { + sound_effect_ambient = 11; + sprite_B[k] = 11; + } + sprite_graphics[k] = frame_counter >> 5 & 1; + switch (sprite_ai_state[k]) { + case 0: // wait + if (link_item_flute >= 2 || FluteBoy_CheckIfPlayerClose(k)) { + sprite_ai_state[k] = 1; + sprite_D[k]++; + byte_7E0FDD++; + sprite_delay_main[k] = 176; + flag_is_link_immobilized = 1; + } + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 25; + FluteKid_SpawnQuaver(k); + } + break; + case 1: // prep phase out + flag_is_link_immobilized = 1; + if (!sprite_delay_main[k]) { + TS_copy = 2; + CGADSUB_copy = 48; + BYTE(palette_filter_countdown) = 0; + BYTE(darkening_or_lightening_screen) = 0; + Palette_AssertTranslucencySwap(); + sprite_ai_state[k] = 2; + sound_effect_ambient = 128; + SpriteSfx_QueueSfx2WithPan(k, 0x33); + } + break; + case 2: // phase out + if (!(frame_counter & 15)) { + PaletteFilter_SP5F(); + if (!BYTE(palette_filter_countdown)) + sprite_ai_state[k] = 3; + } + break; + case 3: // phased out + PaletteFilter_RestoreSP5F(); + Palette_RevertTranslucencySwap(); + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + break; + } +} + +void Sprite_FluteKid_Stumpy(int k) { // 86b040 + static const int8 kFluteAardvark_Gfx[20] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 3, 2, 3, 2, 3, 2, -1, + }; + static const int8 kFluteAardvark_Delay[19] = { + -1, -1, -1, 16, 2, 12, 6, 8, 10, 4, 14, 2, 10, 6, 6, 10, 2, 14, 2, + }; + FluteAardvark_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // + switch (link_item_flute & 3) { + case 0: // supplicate + if (Sprite_ShowSolicitedMessage(k, 0xe5) & 0x100) + sprite_ai_state[k] = 1; + break; + case 1: // give me flute + Sprite_ShowSolicitedMessage(k, 0xe8); + break; + case 2: // thanks + sprite_graphics[k] = 1; + if (Sprite_ShowSolicitedMessage(k, 0xe9) & 0x100) + sprite_ai_state[k] = 3; + break; + case 3: // already did + sprite_graphics[k] = 3; + break; + } + break; + case 1: // + if (!choice_in_multiselect_box) { + Sprite_ShowMessageUnconditional(0xe6); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0xe7); + sprite_ai_state[k] = 0; + } + break; + case 2: // grant shovel + item_receipt_method = 0; + Link_ReceiveItem(0x13, 0); + sprite_ai_state[k] = 0; + break; + case 3: // wait for music + if (hud_cur_item == 13 && joypad1H_last & 0x40) { + sprite_ai_state[k] = 4; + music_control = 0xf2; + sound_effect_1 = 0; + sound_effect_ambient = 23; + flag_is_link_immobilized++; + } + break; + case 4: // + if (!sprite_delay_main[k]) { + if (sprite_A[k] >= 3) + SpriteSfx_QueueSfx2WithPan(k, 0x33); + int j = sprite_A[k]++; + if (kFluteAardvark_Gfx[j] >= 0) { + sprite_graphics[k] = kFluteAardvark_Gfx[j]; + sprite_delay_main[k] = kFluteAardvark_Delay[j]; + } else { + music_control = 0xf3; + sprite_ai_state[k] = 5; + flag_is_link_immobilized = 0; + } + } + break; + case 5: // done + sprite_graphics[k] = 3; + sram_progress_indicator_3 |= 8; + break; + } +} + +void Sprite_FluteKid_Quaver(int k) { // 86b173 + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + if (!(frame_counter & 1)) + sprite_x_vel[k] += (frame_counter >> 5 ^ cur_object_index) & 1 ? -1 : 1; +} + +void FluteKid_SpawnQuaver(int k) { // 86b1a5 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x2e, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x + 4); + Sprite_SetY(j, info.r2_y - 4); + sprite_head_dir[j] = 1; + sprite_z_vel[j] = 8; + sprite_delay_main[j] = 96; + sprite_ignore_projectile[j] = 96; + } +} + +void Sprite_1A_Smithy(int k) { // 86b1ee + switch (sprite_subtype2[k]) { + case 0: Smithy_Main(k); break; + case 1: Smithy_Spark(k); break; + case 2: Smithy_Frog(k); break; + case 3: Smithy_Homecoming(k); break; + } +} + +void Smithy_Homecoming(int k) { // 86b1fd + ReturningSmithy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: { // ApproachTheBench + static const int8 kReturningSmithy_Delay[3] = {104, 12, 0}; + static const int8 kReturningSmithy_Dir[3] = {0, 2, -1}; + static const int8 kReturningSmithy_Xvel[4] = {0, 0, -13, 13}; + static const int8 kReturningSmithy_Yvel[4] = {-13, 13, 0, 0}; + Sprite_MoveXY(k); + sprite_graphics[k] = frame_counter >> 3 & 1; + if (sprite_delay_main[k]) + return; + int j = sprite_A[k]++; + sprite_delay_main[k] = kReturningSmithy_Delay[j]; + if ((j = kReturningSmithy_Dir[j]) >= 0) { + sprite_D[k] = j; + sprite_x_vel[k] = kReturningSmithy_Xvel[j]; + sprite_y_vel[k] = kReturningSmithy_Yvel[j]; + } else { + sprite_ai_state[k] = 1; + } + break; + } + case 1: // Thankful + Sprite_BehaveAsBarrier(k); + Sprite_ShowSolicitedMessage(k, 0xe3); + flag_is_link_immobilized = 0; + sprite_D[k] = 1; + sram_progress_indicator_3 |= 32; + break; + } +} + +void Smithy_Frog(int k) { // 86b274 + SmithyFrog_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + sprite_z_vel[k] -= 2; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 16; + } + if (!sprite_ai_state[k]) { + sprite_D[k] = 1; + if (Sprite_ShowSolicitedMessage(k, 0xe1) & 0x100) + sprite_ai_state[k] = 1; + } else { + savegame_tagalong = 7; + LoadFollowerGraphics(); + Sprite_BecomeFollower(k); // zelda bug: doesn't save X + sprite_state[k] = 0; + } +} + +void ReturningSmithy_Draw(int k) { // 86b308 + static const DrawMultipleData kReturningSmithy_Dmd[8] = { + {0, 0, 0x4122, 2}, + {0, 0, 0x0122, 2}, + {0, 0, 0x4122, 2}, + {0, 0, 0x0122, 2}, + {0, 0, 0x0122, 2}, + {0, 0, 0x0122, 2}, + {0, 0, 0x4122, 2}, + {0, 0, 0x4122, 2}, + }; + static const uint8 kReturningSmithy_Dma[8] = {0xc0, 0xc0, 0xa0, 0xa0, 0x80, 0x60, 0x80, 0x60}; + int j = sprite_D[k] * 2 + sprite_graphics[k]; + PrepOamCoordsRet info; + BYTE(dma_var7) = kReturningSmithy_Dma[j]; + Sprite_DrawMultiplePlayerDeferred(k, &kReturningSmithy_Dmd[j], 1, &info); + SpriteDraw_Shadow(k, &info); +} + +void SmithyFrog_Draw(int k) { // 86b339 + static const DrawMultipleData kSmithyFrog_Dmd[1] = { + {0, 0, 0x00c8, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, kSmithyFrog_Dmd, 1, &info); + SpriteDraw_Shadow(k, &info); +} + +void Smithy_Main(int k) { // 86b34e + Smithy_Draw(k); + sprite_z_vel[k] -= 2; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + } + if (Sprite_ReturnIfInactive(k)) + return; + + int j = sprite_ai_state[sprite_E[k]]; + int i = sprite_ai_state[k]; + if ((j == 5 || j == 7 || j == 9 || i == 5 || i == 7 || i == 9 || (i | j) == 0) && sprite_B[k]-- == 0) { + static const uint8 kSmithy_Gfx[8] = {0, 1, 2, 3, 3, 2, 1, 0}; + static const uint8 kSmithy_B[8] = {24, 4, 1, 16, 16, 5, 10, 16}; + j = sprite_A[k]; + sprite_A[k] = j + 1 & 7; + sprite_graphics[k] = kSmithy_Gfx[j]; + sprite_B[k] = kSmithy_B[j]; + if (j == 1) + sprite_z_vel[k] = 16; + if (j == 3) { + Smithy_SpawnSpark(k); + SpriteSfx_QueueSfx2WithPan(k, 0x5); + } + } + switch(sprite_ai_state[k]) { + case 0: // ConversationStart + sprite_C[k] = 0; + if (savegame_tagalong != 8) { + if (Smithy_ListenForHammer(k)) { + Sprite_ShowMessageUnconditional(0xe4); + sprite_delay_aux1[k] = 96; + sprite_C[k]++; + } else if (sram_progress_indicator_3 & 0x20) { + if (Sprite_ShowSolicitedMessage(k, 0xd8) & 0x100) { + sprite_ai_state[k]++; + sprite_C[k]++; + } + } else { + Sprite_ShowSolicitedMessage(k, 0xdf); + } + } else { + if (BYTE(link_y_coord) < 0xc2) { + Sprite_ShowMessageUnconditional(0xe0); + sprite_ai_state[k] = 10; + flag_is_link_immobilized++; + } + } + break; + case 1: // ProvideTemperingChoice + if (!choice_in_multiselect_box) { + Sprite_ShowMessageUnconditional(0xd9); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0xdc); + sprite_ai_state[k] = 0; + } + break; + case 2: // HandleTemperingChoice + if (choice_in_multiselect_box == 0) { + if (link_sword_type < 3) { + Sprite_ShowMessageUnconditional(0xda); + sprite_ai_state[k] = 3; + } else { + Sprite_ShowMessageUnconditional(0xdb); + sprite_ai_state[k] = 0; + } + } else { + Sprite_ShowMessageUnconditional(0xdc); + sprite_ai_state[k] = 0; + } + break; + case 3: // HandleTemperingCost + if (choice_in_multiselect_box || link_rupees_goal < 10) { + Sprite_ShowMessageUnconditional(0xdc); + sprite_ai_state[k] = 0; + } else { + link_rupees_goal -= 10; + Sprite_ShowMessageUnconditional(0xdd); + sprite_ai_state[sprite_E[k]] = 5; + sprite_ai_state[k] = 5; + flag_overworld_area_did_change = 0; + link_sword_type = 255; + sram_progress_indicator_3 |= 128; + } + break; + case 4: // TemperingSword + case 5: // + sprite_C[k] = 0; + if (Smithy_ListenForHammer(k)) { + Sprite_ShowMessageUnconditional(0xe4); + sprite_delay_aux1[k] = 96; + sprite_C[k]++; + } else if (flag_overworld_area_did_change) { + if (Sprite_ShowSolicitedMessage(k, 0xde) & 0x100) { + sprite_ai_state[k]++; + sprite_graphics[k] = 4; + } + } else { + Sprite_ShowSolicitedMessage(k, 0xe2); + } + break; + case 6: // Smithy_GiveTemperedSword + sprite_ai_state[k] = 0; + sprite_ai_state[sprite_E[k]] = 0; + item_receipt_method = 0; + Link_ReceiveItem(2, 0); + sram_progress_indicator_3 &= ~0x80; + break; + case 7: // + case 8: // + case 9: // + break; + case 10: { // Smithy_SpawnFriend + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1a, &info); + if (j >= 0) { + Sprite_SetX(j, link_x_coord); + Sprite_SetY(j, link_y_coord); + sprite_subtype2[j] = 3; + sprite_ignore_projectile[j] = 3; + } + sprite_ai_state[k] = 11; + savegame_tagalong = 0; + sprite_graphics[k] = 4; + break; + } + case 11: // Smithy_CopiouslyThankful + Sprite_ShowSolicitedMessage(k, 0xe3); + break; + + } +} + +bool Smithy_ListenForHammer(int k) { // 86b43d + return sprite_delay_aux1[k] == 0 && hud_cur_item == 12 && (link_item_in_hand & 2) && player_handler_timer == 2 && Sprite_CheckDamageToLink_same_layer(k); +} + +int Smithy_SpawnDwarfPal(int k) { // 86b5a6 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1a, &info); + if (j < 0) + return j; + Sprite_SetX(j, info.r0_x); + Sprite_SetY(j, info.r2_y); + sprite_x_lo[j] += 0x2C; + sprite_D[j] = 1; + sprite_A[j] = 4; + sprite_ignore_projectile[j] = 4; + return j; +} + +void Smithy_Draw(int k) { // 86b673 + static const DrawMultipleData kSmithy_Dmd[20] = { + { 1, 0, 0x4040, 2}, + {-11, -10, 0x4060, 2}, + { -1, 0, 0x0040, 2}, + { 11, -10, 0x0060, 2}, + { 1, 0, 0x4040, 2}, + { -3, -14, 0x4044, 2}, + { -1, 0, 0x0040, 2}, + { 3, -14, 0x0044, 2}, + { 1, 0, 0x4042, 2}, + { 11, -10, 0x0060, 2}, + { -1, 0, 0x0042, 2}, + {-11, -10, 0x4060, 2}, + { 1, 0, 0x4042, 2}, + { 13, 2, 0x4062, 2}, + { -1, 0, 0x0042, 2}, + {-13, 2, 0x0062, 2}, + { 0, 0, 0x4064, 2}, + { 0, 0, 0x4062, 2}, + { 0, 0, 0x0064, 2}, + { 0, 0, 0x0064, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kSmithy_Dmd[sprite_graphics[k] * 4 + sprite_D[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Smithy_Spark(int k) { // 86b6a3 + static const int8 kSmithySpark_Gfx[7] = {0, 1, 2, 1, 2, 1, -1}; + static const int8 kSmithySpark_Delay[6] = {4, 1, 3, 2, 1, 1}; + SmithySpark_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) { + int j = sprite_A[k]; + sprite_A[k] = j + 1 & 7; + if (sign8(kSmithySpark_Gfx[j])) { + sprite_state[k] = 0; + return; + } + sprite_graphics[k] = kSmithySpark_Gfx[j]; + sprite_delay_main[k] = kSmithySpark_Delay[j]; + } +} + +void Smithy_SpawnSpark(int k) { // 86b6cd + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x1a, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x); + Sprite_SetY(j, info.r2_y); + sprite_x_lo[j] += sprite_D[k] ? -15 : 15; + sprite_y_lo[j] += 2; + sprite_subtype2[j] = 1; + } +} + +void SmithySpark_Draw(int k) { // 86b72c + Oam_AllocateFromRegionB(8); + static const DrawMultipleData kSmithySpark_Dmd[6] = { + { 0, 3, 0x41aa, 2}, + { 0, -1, 0x41aa, 2}, + {-4, 0, 0x0190, 0}, + {12, 0, 0x4190, 0}, + {-5, -2, 0x0191, 0}, + {13, -2, 0x0191, 0}, + }; + Sprite_DrawMultiple(k, &kSmithySpark_Dmd[sprite_graphics[k] * 2], 2, NULL); +} + +void Sprite_1B_Arrow(int k) { // 86b754 + int j; + static const int8 kEnemyArrow_Xvel[8] = {0, 0, 16, 16, 0, 0, -16, -16}; + static const int8 kEnemyArrow_Yvel[8] = {16, 16, 0, 0, -16, -16, 0, 0}; + static const uint8 kEnemyArrow_Dirs[4] = {0, 2, 1, 3}; + + EnemyArrow_Draw(k); + if (Sprite_ReturnIfPaused(k)) + return; + if (sprite_state[k] == 9) { + j = sprite_delay_main[k]; + if (j != 0) { + if (--j == 0) { + sprite_state[k] = 0; + } else if (j >= 32 && !(j & 1)) { + j = (frame_counter << 1 & 4) | sprite_D[k]; + sprite_x_vel[k] = kEnemyArrow_Xvel[j]; + sprite_y_vel[k] = kEnemyArrow_Yvel[j]; + Sprite_MoveXY(k); + } + return; + } + Sprite_CheckDamageToLink_same_layer(k); + if (sprite_E[k] == 0 && Sprite_CheckTileCollision(k)) { + if (sprite_A[k]) { + SpriteSfx_QueueSfx2WithPan(k, 0x5); + Sprite_ScheduleForBreakage(k); + Sprite_PlaceWeaponTink(k); + } else { + sprite_delay_main[k] = 48; + sprite_A[k] = 2; + SpriteSfx_QueueSfx2WithPan(k, 0x8); + } + } else { + Sprite_MoveXY(k); + } + } else { + if (sprite_ai_state[k] == 0) { + Sprite_ApplyRicochet(k); + sprite_z_vel[k] = 24; + sprite_delay_main[k] = 255; + sprite_ai_state[k]++; + sprite_hit_timer[k] = 0; + } + sprite_D[k] = kEnemyArrow_Dirs[sprite_delay_main[k] >> 3 & 3]; + Sprite_MoveZ(k); + Sprite_MoveXY(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) + sprite_state[k] = 0; + } +} + +void EnemyArrow_Draw(int k) { // 86b867 + static const int16 kEnemyArrow_Draw_X[8] = {-8, 0, 0, 8, 0, 0, 0, 0}; + static const int16 kEnemyArrow_Draw_Y[8] = {0, 0, 0, 0, -8, 0, 0, 8}; + static const uint8 kEnemyArrow_Draw_Char[32] = { + 0x3a, 0x3d, 0x3d, 0x3a, 0x2a, 0x2b, 0x2b, 0x2a, 0x7c, 0x6c, 0x6c, 0x7c, 0x7b, 0x6b, 0x6b, 0x7b, + 0x3a, 0x3b, 0x3b, 0x3a, 0x2a, 0x3c, 0x3c, 0x2a, 0x81, 0x80, 0x80, 0x81, 0x91, 0x90, 0x90, 0x91, + }; + static const uint8 kEnemyArrow_Draw_Flags[32] = { + 8, 8, 0x48, 0x48, 8, 8, 0x88, 0x88, 9, 0x49, 9, 0x49, 9, 0x89, 9, 0x89, + 8, 0x88, 0xc8, 0x48, 8, 8, 0x88, 0x88, 0x49, 0x49, 9, 9, 0x89, 0x89, 9, 9, + }; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + uint8 r6 = sprite_D[k] * 2, r7 = sprite_A[k] * 8; + for (int i = 1; i >= 0; i--, oam++) { + int j = r6 + i; + uint16 x = info.x + kEnemyArrow_Draw_X[j]; + uint16 y = info.y + kEnemyArrow_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kEnemyArrow_Draw_Char[j + r7]; + oam->flags = kEnemyArrow_Draw_Flags[j + r7] | info.flags; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } +} + +void Sprite_1E_CrystalSwitch(int k) { // 86b8d0 + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0xe | kCrystalSwitchPal[orange_blue_barrier_state & 1]; + Oam_AllocateDeferToPlayer(k); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Sprite_RepelDash(); + } + if (sprite_delay_main[k] == 0) { + Sprite_GarnishSpawn_Sparkle(k, frame_counter & 7, GetRandomNumber() & 7); + sprite_delay_main[k] = 31; + } + if (sprite_F[k] == 0) { + if (sign8(button_b_frames - 9)) + Sprite_CheckDamageFromLink(k); + } else if (sprite_F[k]-- == 11) { + orange_blue_barrier_state ^= 1; + submodule_index = 22; + SpriteSfx_QueueSfx3WithPan(k, 0x25); + } +} + +void Sprite_1F_SickKid(int k) { // 86b94c + static const int8 kBugNetKid_Gfx[8] = {0, 1, 0, 1, 0, 1, 2, -1}; + static const uint8 kBugNetKid_Delay[7] = {8, 12, 8, 12, 8, 96, 16}; + int j; + BugNetKid_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // resting + if (Sprite_CheckIfLinkIsBusy() || !Sprite_CheckDamageToLink_same_layer(k)) + return; + if ((link_bottle_info[0] | link_bottle_info[1] | link_bottle_info[2] | link_bottle_info[3]) < 2) { + Sprite_ShowSolicitedMessage(k, 0x104); + } else { + flag_is_link_immobilized++; + sprite_ai_state[k] = 1; + } + break; + case 1: // perk + if (sprite_delay_main[k]) + return; + j = sprite_A[k]; + if (kBugNetKid_Gfx[j] >= 0) { + sprite_graphics[k] = kBugNetKid_Gfx[j]; + sprite_delay_main[k] = kBugNetKid_Delay[j]; + sprite_A[k] = j + 1; + } else { + Sprite_ShowMessageUnconditional(0x105); + sprite_ai_state[k] = 2; + } + break; + case 2: // grant + item_receipt_method = 0; + Link_ReceiveItem(0x21, 0); + flag_is_link_immobilized = 0; + sprite_ai_state[k] = 3; + break; + case 3: // back to rest + sprite_graphics[k] = 1; + Sprite_ShowSolicitedMessage(k, 0x106); + break; + } +} + +void Sprite_21_WaterSwitch(int k) { // 86b9fa + PushSwitch_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: + if (sprite_C[k]) { + if (!--sprite_B[k]) + sprite_ai_state[k] = 1; + if (!(frame_counter & 3)) + SpriteSfx_QueueSfx2WithPan(k, 0x22); + } else { + sprite_B[k] = 48; + } + break; + case 1: + if (!sprite_delay_main[k]) { + static const uint8 kPushSwitch_Delay[10] = {40, 6, 3, 3, 3, 5, 1, 1, 3, 12}; + static const uint8 kPushSwitch_Dir[10] = {0, 1, 2, 3, 4, 5, 5, 6, 7, 6}; + int j = ++sprite_A[k]; + if (j == 10) { + sprite_ai_state[k] = 2; + dung_flag_statechange_waterpuzzle++; + SpriteSfx_QueueSfx3WithPan(k, 0x25); + } else { + sprite_delay_main[k] = kPushSwitch_Delay[j]; + sprite_D[k] = kPushSwitch_Dir[j]; + SpriteSfx_QueueSfx2WithPan(k, 0x22); + } + } + break; + case 2: + break; + } +} + +void PushSwitch_Draw(int k) { // 86bb22 + static const OamEntSigned kPushSwitch_Oam[40] = { + { 4, 20, 0xdc, 0x20}, + { 4, 12, 0xdd, 0x20}, + { 4, 12, 0xdd, 0x20}, + { 4, 12, 0xdd, 0x20}, + { 0, 0, 0xca, 0x20}, + { 3, 12, 0xdd, 0x20}, + { 3, 20, 0xdc, 0x20}, + { 3, 20, 0xdc, 0x20}, + { 3, 20, 0xdc, 0x20}, + { 0, 0, 0xca, 0x20}, + { -8, 8, 0xea, 0x20}, + { 0, 8, 0xeb, 0x20}, + { -8, 16, 0xfa, 0x20}, + { 0, 16, 0xfb, 0x20}, + { 0, 0, 0xca, 0x20}, + {-12, 4, 0xcc, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { 0, 0, 0xca, 0x20}, + {-10, 4, 0xcc, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { 0, 0, 0xca, 0x20}, + { -8, 4, 0xcc, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { 0, 0, 0xca, 0x20}, + { 4, 3, 0xe2, 0x20}, + { -6, 4, 0xcc, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { 0, 0, 0xca, 0x20}, + { 4, 3, 0xf1, 0x20}, + { -6, 4, 0xcc, 0x20}, + { -4, 4, 0xcd, 0x20}, + { -4, 4, 0xcd, 0x20}, + { 0, 0, 0xca, 0x20}, + }; + static const uint8 kPushSwitch_WH[16] = {8, 6, 0x10, 0x10, 0x10, 8, 0x10, 8, 0x10, 8, 0x10, 8, 0x10, 3, 0x10, 8}; + Oam_AllocateDeferToPlayer(k); + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + uint8 flags; + sprite_oam_flags[k] = flags = overworld_palette_swap_flag ? sprite_oam_flags[k] | 0xe : sprite_oam_flags[k] & ~0xe; + uint8 r1 = sprite_B[k] >> 2 & 3; + + oam_cur_ptr += 4, oam_ext_cur_ptr += 1; + + OamEnt *oam = GetOamCurPtr(); + memcpy(oam, &kPushSwitch_Oam[sprite_D[k] * 5], 20); + + uint8 xv = -r1 + BYTE(dungmap_var7); + uint8 yv = HIBYTE(dungmap_var7) - (r1 >> 1); + + oam[0].x += xv; + oam[1].x += xv; + oam[2].x += xv; + oam[3].x += xv; + oam[4].x += BYTE(dungmap_var7); + + oam[0].y += yv; + oam[1].y += yv; + oam[2].y += yv; + oam[3].y += yv; + oam[4].y += HIBYTE(dungmap_var7); + + oam[0].flags |= flags; + oam[1].flags |= flags; + oam[2].flags |= flags; + oam[3].flags |= flags; + oam[4].flags |= flags; + + uint8 *ext = &g_ram[oam_ext_cur_ptr]; + ext[0] = ext[1] = ext[2] = ext[3] = 0; + ext[4] = 2; + + Sprite_CorrectOamEntries(k, 4, 0xff); + + if (sprite_floor[k] == link_is_on_lower_level) { + sprite_C[k] = 0; + int d = sprite_D[k]; + int x = Sprite_GetX(k) + (int8)kPushSwitch_Oam[d * 4].x; + int y = Sprite_GetY(k) + (int8)kPushSwitch_Oam[d * 4].y; + + SpriteHitBox hb; + hb.r4_spr_xlo = x; + hb.r10_spr_xhi = x >> 8; + hb.r5_spr_ylo = y; + hb.r11_spr_yhi = y >> 8; + hb.r6_spr_xsize = kPushSwitch_WH[d * 2 + 0]; + hb.r7_spr_ysize = kPushSwitch_WH[d * 2 + 1]; + Link_SetupHitBox(&hb); + if (CheckIfHitBoxesOverlap(&hb)) { + uint16 oldy = Sprite_GetY(k); + Sprite_SetY(k, oldy + 19); + uint8 new_dir = Sprite_DirectionToFaceLink(k, NULL); + Sprite_SetY(k, oldy); + if (new_dir == 0 && link_direction_facing == 4) + sprite_C[k]++; + } else { + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + } + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Sprite_RepelDash(); + } +} + +void Sprite_39_Locksmith(int k) { // 86bcac + uint8 bak; + int j; + + MiddleAgedMan_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + + switch (sprite_ai_state[k]) { + case 0: // chilling + Sprite_ShowSolicitedMessage(k, 0x107); + bak = sprite_x_lo[k]; + sprite_x_lo[k] -= 16; + Sprite_Get16BitCoords(k); + sprite_x_vel[k] = 1; + sprite_y_vel[k] = 1; + if (!Sprite_CheckTileCollision(k)) { + sprite_ai_state[k]++; + if (savegame_tagalong != 0) + sprite_ai_state[k] = 5; + } + sprite_x_lo[k] = bak; + break; + case 1: // transition to tagalong + savegame_tagalong = 9; + tagalong_var5 = 0; + LoadFollowerGraphics(); + Follower_Initialize(); + word_7E02CD = 0x40; + sprite_state[k] = 0; + break; + case 2: // offer chest + if (Sprite_CheckIfLinkIsBusy()) + return; + if (super_bomb_going_off) { + j = Sprite_ShowSolicitedMessage(k, 0x109); + } else { + j = Sprite_ShowMessageOnContact(k, 0x109); + } + if (j & 0x100) + sprite_ai_state[k] = 3; + break; + case 3: // react to secret keeping + if (!choice_in_multiselect_box) { + if (super_bomb_going_off) { + Sprite_ShowMessageUnconditional(0x10c); + sprite_ai_state[k] = 2; + } else { + item_receipt_method = 0; + Link_ReceiveItem(0x16, 0); + sram_progress_indicator_3 |= 0x10; + sprite_ai_state[k] = 4; + savegame_tagalong = 0; + } + } else { + Sprite_ShowMessageUnconditional(0x10a); + sprite_ai_state[k] = 2; + } + break; + case 4: // promise reminder + Sprite_ShowSolicitedMessage(k, 0x10b); + break; + case 5: // silence other tagalong + Sprite_ShowSolicitedMessage(k, 0x107); + break; + } +} + +void MiddleAgedMan_Draw(int k) { // 86bdac + static const DrawMultipleData kMiddleAgedMan_Dmd[2] = { + {0, -8, 0x00ea, 2}, + {0, 0, 0x00ec, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kMiddleAgedMan_Dmd[0], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_2B_Hobo(int k) { // 86bdc1 + switch (sprite_subtype2[k]) { + case 0: + Sprite_Hobo_Bum(k); + break; + case 1: + Sprite_Hobo_Bubble(k); + break; + case 2: + Sprite_Hobo_Fire(k); + break; + case 3: + Sprite_Hobo_Smoke(k); + break; + } +} + +void Sprite_Hobo_Bum(int k) { // 86bdd0 + Hobo_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_flags4[k] = 3; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); + } + switch(sprite_ai_state[k]) { + case 0: // sleeping + sprite_flags4[k] = 7; + if (Sprite_CheckDamageToLink_same_layer(k) && (filtered_joypad_L & 0x80)) { + sprite_ai_state[k] = 1; + int j = sprite_E[k]; + sprite_delay_main[j] = 4; + flag_is_link_immobilized = 1; + } + if (!sprite_delay_aux2[k]) { + sprite_delay_aux2[k] = 160; + sprite_E[k] = Hobo_SpawnBubble(k); + } + break; + case 1: // wake up + if (!sprite_delay_main[k]) { + static const int8 kHobo_Gfx[7] = {0, 1, 0, 1, 0, 1, 2}; + static const int8 kHobo_Delay[7] = {6, 2, 6, 6, 2, 100, 30}; + int j = sprite_A[k]; + if (j != 7) { + sprite_graphics[k] = kHobo_Gfx[j]; + sprite_delay_main[k] = kHobo_Delay[j]; + sprite_A[k]++; + } else { + Sprite_ShowMessageUnconditional(0xd7); + sprite_ai_state[k] = 2; + } + } + break; + case 2: // grant bottle + sprite_ai_state[k] = 3; + sprite_graphics[k] = 1; + save_ow_event_info[BYTE(overworld_screen_index)] |= 0x20; + item_receipt_method = 0; + Link_ReceiveItem(0x16, 0); + sram_progress_indicator_3 |= 1; + break; + case 3: // back to sleep + flag_is_link_immobilized = 0; + sprite_graphics[k] = 0; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 160; + Hobo_SpawnBubble(k); + } + break; + } +} + +void SpritePrep_Hobo_SpawnSmoke(int k) { // 86be9d + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x2b, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_subtype2[j] = 0; + sprite_ignore_projectile[j] = 0; + } +} + +void Sprite_Hobo_Bubble(int k) { // 86beb4 + Oam_AllocateFromRegionC(4); + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = (frame_counter >> 4 & 1) + 2; + if (!sprite_delay_aux1[k]) { + sprite_graphics[k]++; + Sprite_MoveZ(k); + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + } + if (sprite_delay_main[k] < 4) + sprite_graphics[k] = 3; +} + +int Hobo_SpawnBubble(int k) { // 86beed + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x2b, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_subtype2[j] = 1; + sprite_z_vel[j] = 2; + sprite_delay_main[j] = 96; + sprite_delay_aux1[j] = 96 >> 1; + sprite_ignore_projectile[j] = 96 >> 1; + sprite_flags2[j] = 0; + } + return j; +} + +void Sprite_Hobo_Fire(int k) { // 86bf15 + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = frame_counter >> 3 & 1; + sprite_oam_flags[k] &= ~0x40; + if (!sprite_delay_main[k]) { + Hobo_SpawnSmoke(k); + sprite_delay_main[k] = 47; + } +} + +void SpritePrep_Hobo_SpawnFire(int k) { // 86bf4b + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x2b, &info); + if (j >= 0) { + Sprite_SetX(j, 0x194); + Sprite_SetY(j, 0x03f); + sprite_subtype2[j] = 2; + sprite_ignore_projectile[j] = 2; + sprite_flags2[j] = 0; + sprite_oam_flags[j] = sprite_oam_flags[j] & ~0xE | 2; + } +} + +void Sprite_Hobo_Smoke(int k) { // 86bf81 + static const uint8 kHoboSmoke_OamFlags[4] = {0, 64, 128, 192}; + sprite_graphics[k] = 6; + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kHoboSmoke_OamFlags[frame_counter >> 4 & 3]; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; +} + +void Hobo_SpawnSmoke(int k) { // 86bfaf + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x2b, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_SetY(j, info.r2_y - 4); + sprite_subtype2[j] = 3; + sprite_z_vel[j] = 7; + sprite_delay_main[j] = 96; + sprite_ignore_projectile[j] = 96; + sprite_flags2[j] = 0; + } +} + +void Sprite_73_UncleAndPriest_bounce(int k) { // 86bfe0 + switch (sprite_E[k]) { + case 0: + Sprite_Uncle(k); + break; + case 1: + Sprite_Priest(k); + break; + case 2: + Sprite_SanctuaryMantle(k); + break; + } +} + +void SpritePrep_UncleAndPriest_bounce(int k) { // 86bfe5 + if (BYTE(dungeon_room_index) == 18) { + Priest_SpawnMantle(k); + if (sram_progress_indicator >= 3) + sram_progress_flags |= 2; + if (sram_progress_flags & 2) { + sprite_state[k] = 0; + return; + } + sprite_E[k] = 1; + sprite_flags2[k] = sprite_flags2[k] & 0xf0 | 0x2; + sprite_flags4[k] = 3; + int j; + if (link_sword_type >= 2) { + sprite_D[k] = 4; + sprite_graphics[k] = 0; + j = 0; + } else { + sprite_D[k] = sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + if (savegame_tagalong == 1) { + sram_progress_flags |= 0x4; + save_ow_event_info[0x1b] |= 0x20; + sprite_delay_main[k] = 170; + j = 1; + } else { + j = 2; + } + } + sprite_subtype2[k] = j; + static const int16 kUncleAndSage_Y[3] = {0, -9, 0}; + Sprite_SetX(k, Sprite_GetX(k) - 6); + Sprite_SetY(k, Sprite_GetY(k) + kUncleAndSage_Y[j]); + sprite_ignore_projectile[k]++; + byte_7FFE01 = 0; + } else if (BYTE(dungeon_room_index) == 4) { + if (!(sram_progress_flags & 0x10)) + sprite_x_lo[k] += 8; + else + sprite_state[k] = 0; + } else { + if (!(sram_progress_flags & 1)) { + sprite_D[k] = 3; + sprite_subtype2[k] = 1; + } else { + sprite_state[k] = 0; + } + } +} + +void SpritePrep_OldMan_bounce(int k) { // 86bff9 + sprite_ignore_projectile[k]++; + if (BYTE(dungeon_room_index) == 0xe4) { + sprite_subtype2[k] = 2; + return; + } + if (savegame_tagalong == 0) { + if (link_item_mirror == 2) + sprite_state[k] = 0; + savegame_tagalong = 4; + LoadFollowerGraphics(); + savegame_tagalong = 0; + } else { + sprite_state[k] = 0; + LoadFollowerGraphics(); + } +} + +void Sprite_TutorialGuardOrBarrier_bounce(int k) { // 86bffe + if (sprite_type[k] == 0x40) { + Sprite_EvilBarrier(k); + return; + } + int jbak = sprite_D[k]; + if (sprite_delay_aux1[k]) + sprite_D[k] = kSoldier_DirectionLockSettings[jbak]; + + sprite_graphics[k] = kSprite_TutorialEntities_Tab[sprite_D[k]]; + TutorialSoldier_Draw(k); + sprite_D[k] = jbak; + + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageFromLink(k); + + if (BYTE(overworld_area_index) == 0x1b && (sprite_y_lo[k] == 0x50 || sprite_y_lo[k] == 0x90)) { + Sprite_TutorialGuard_ShowMessageOnContact(k, sprite_y_lo[k] == 0x50 ? 0xB2 : 0xB3); + } else { + if (Sprite_TutorialGuard_ShowMessageOnContact(k, byte_7E0B69 + 0xf)) { + byte_7E0B69 = byte_7E0B69 != 6 ? byte_7E0B69 + 1 : 0; + } + } + Sprite_CheckDamageToAndFromLink(k); + if (((k ^ frame_counter) & 0x1f) == 0) { + uint8 jbak = sprite_D[k]; + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + if (sprite_D[k] != jbak && !((sprite_D[k] ^ jbak) & 2)) + sprite_delay_aux1[k] = 12; + } +} + +void Sprite_F2_MedallionTablet_bounce(int k) { // 86c00d + switch (sprite_subtype2[k]) { + case 0: + MedallionTablet_Main(k); + break; + case 1: + Sprite_DustCloud(k); + break; + } +} + +void Sprite_33_RupeePull_bounce(int k) { // 86c017 + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckIfLinkIsBusy()) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + link_need_for_pullforrupees_sprite = 1; + sprite_A[k] = 1; + } else { + if (sprite_A[k]) { + link_need_for_pullforrupees_sprite = 0; + if (link_state_bits & 1) { + sprite_state[k] = 0; + RupeePull_SpawnPrize(k); + Sprite_SpawnPoofGarnish(k); + } + } + } +} + +void Sprite_14_ThievesTownGrate_bounce(int k) { // 86c01c + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckIfLinkIsBusy()) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + link_need_for_pullforrupees_sprite = 1; + sprite_A[k] = 1; + } else { + if (!sprite_A[k]) + return; + link_need_for_pullforrupees_sprite = 0; + if (!(link_state_bits & 1)) + return; + SpriteSfx_QueueSfx2WithPan(k, 0x1f); + OpenGargoylesDomain(); + int j = Sprite_SpawnDustCloud(k); + Sprite_SetX(j, Sprite_GetX(k)); + Sprite_SetY(j, Sprite_GetY(k)); + sprite_state[k] = 0; + } +} + +void SpritePrep_Snitch_bounce_2(int k) { // 86c026 + SpritePrep_Snitches(k); +} + +void SpritePrep_Snitch_bounce_3(int k) { // 86c030 + SpritePrep_Snitches(k); +} + +void Sprite_37_Waterfall_bounce(int k) { // 86c03a + switch (sprite_subtype2[k]) { + case 0: Waterfall(k); break; + case 1: Sprite_BatCrash(k); break; + } +} + +void Sprite_38_EyeStatue_bounce(int k) { // 86c03f + if (!sprite_B[k]) { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_DirectionToFaceLink(k, NULL) == 2 && sprite_unk2[k] == 9) { + dung_flag_statechange_waterpuzzle++; + sprite_B[k] = 1; + } + } +} + +void Sprite_3A_MagicBat_bounce(int k) { // 86c044 + if (sprite_head_dir[k]) { + Sprite_MadBatterBolt(k); + return; + } + + if (sprite_ai_state[k]) + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + switch(sprite_ai_state[k]) { + case 0: // wait for summon + if (link_magic_consumption >= 2) + return; + if (!Sprite_CheckDamageToLink_same_layer(k)) + return; + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 0x1a) { + Sprite_SpawnSuperficialBombBlast(k); + SpriteSfx_QueueSfx1WithPan(k, 0xd); + sprite_ai_state[k]++; + sprite_A[k] = 20; + flag_is_link_immobilized = 1; + sprite_oam_flags[k] |= 32; + return; + } + } + break; + case 1: // RisingUp + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = --sprite_A[k]; + if (sprite_delay_main[k] != 1) { + static const int8 kMadBatter_RisingUp_XAccel[2] = {-8, 7}; + sprite_z_vel[k] = sprite_delay_main[k] >> 2; + sprite_x_vel[k] += kMadBatter_RisingUp_XAccel[sprite_A[k] & 1]; + sprite_graphics[k] ^= 1; + } else { + Sprite_ShowMessageUnconditional(0x110); + sprite_ai_state[k]++; + sprite_graphics[k] = 0; + sprite_z_vel[k] = 0; + sprite_x_vel[k] = 0; + sprite_delay_main[k] = 255; + } + } + break; + case 2: { // PseudoAttackPlayer + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_aux1[k] = 64; + } + static const int8 kMadBatter_PseudoAttack_OamFlags[8] = {0xa, 4, 2, 4, 2, 0xa, 4, 2}; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0xE | kMadBatter_PseudoAttack_OamFlags[sprite_delay_main[k] >> 1 & 7]; + if (sprite_delay_main[k] == 240) + Sprite_MagicBat_SpawnLightning(k); + break; + } + case 3: // DoublePlayerMagicPower + if (!sprite_delay_aux1[k]) { + Sprite_ShowMessageUnconditional(0x111); + Palette_Restore_BG_And_HUD(); + flag_update_cgram_in_nmi++; + sprite_ai_state[k]++; + link_magic_consumption = 1; + Hud_RefreshIcon(); + } else if (sprite_delay_aux1[k] == 0x10) { + intro_times_pal_flash = 0x10; + } + break; + case 4: // LaterBitches + Sprite_SpawnDummyDeathAnimation(k); + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + break; + } +} + +void SpritePrep_Zelda_bounce(int k) { // 86c06c + if (link_sword_type >= 2) { + sprite_state[k] = 0; + return; + } + sprite_ignore_projectile[k]++; + sprite_D[k] = sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + uint8 bak0 = savegame_tagalong; + savegame_tagalong = 1; + LoadFollowerGraphics(); + savegame_tagalong = bak0; + + if (BYTE(dungeon_room_index) == 0x12) { + sprite_subtype2[k] = 2; + if (!(sram_progress_flags & 4)) { + sprite_state[k] = 0; + } else { + Sprite_SetX(k, Sprite_GetX(k) + 6); + Sprite_SetY(k, Sprite_GetY(k) + 15); + sprite_flags4[k] = 3; + } + } else { + sprite_subtype2[k] = 0; + if (savegame_tagalong != 1 && (sram_progress_flags & 4)) + sprite_state[k] = 0; + } +} + +void Sprite_78_MrsSahasrahla_bounce(int k) { // 86c071 + ElderWife_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + switch (sprite_ai_state[k]) { + case 0: // initial + if (link_sword_type < 2) { + if (Sprite_ShowSolicitedMessage(k, 0x2b) & 0x100) + sprite_ai_state[k] = 1; + } else { + Sprite_ShowSolicitedMessage(k, 0x2e); + } + sprite_graphics[k] = frame_counter >> 4 & 1; + break; + case 1: // tell legend + Sprite_ShowMessageUnconditional(0x2c); + sprite_ai_state[k] = 2; + break; + case 2: // loop until player not dumb + if (choice_in_multiselect_box == 0) { + sprite_ai_state[k] = 3; + Sprite_ShowMessageUnconditional(0x2d); + } else { + Sprite_ShowMessageUnconditional(0x2c); + } + break; + case 3: // go away find old man + Sprite_ShowSolicitedMessage(k, 0x2d); + sprite_graphics[k] = frame_counter >> 4 & 1; + break; + } +} + +void Sprite_16_Elder_bounce(int k) { // 86c08a + Elder_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + switch (sprite_subtype2[k]) { + case 0: + Sprite_Sahasrahla(k); + break; + case 1: + Sprite_Aginah(k); + break; + } +} + +void SpritePrep_HeartPiece(int k) { // 86c0a8 + HeartUpgrade_CheckIfAlreadyObtained(k); +} + +void Sprite_2D_TelepathicTile_bounce(int k) { // 86c0b2 + assert(0); +} + +void Sprite_25_TalkingTree_bounce(int k) { // 86c0d5 + switch (sprite_subtype2[k]) { + case 0: TalkingTree_Mouth(k); break; + case 1: TalkingTree_Eye(k); break; + } +} + +void Sprite_1C_Statue(int k) { // 86c0e8 + static const uint8 kMovableStatue_Dir[4] = {4, 6, 0, 2}; + static const uint8 kMovableStatue_Joypad[4] = {1, 2, 4, 8}; + static const int8 kMovableStatue_Xvel[4] = {-16, 16, 0, 0}; + static const int8 kMovableStatue_Yvel[4] = {0, 0, -16, 16}; + int j; + if (sprite_D[k]) { + sprite_D[k] = 0; + link_speed_setting = 0; + bitmask_of_dragstate = 0; + } + if (sprite_delay_main[k]) { + sprite_D[k] = 1; + bitmask_of_dragstate = 129; + link_speed_setting = 8; + } + MovableStatue_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Statue_BlockSprites(k); + dung_flag_statechange_waterpuzzle = 0; + if (Statue_CheckForSwitch(k)) + dung_flag_statechange_waterpuzzle = 1; + Sprite_MoveXY(k); + Sprite_Get16BitCoords(k); + Sprite_CheckTileCollision2(k); + Sprite_ZeroVelocity_XY(k); + if (Sprite_CheckDamageToLink_same_layer(k)) { + sprite_delay_main[k] = 7; + Sprite_RepelDash(); + if (sprite_delay_aux1[k]) { + Sprite_NullifyHookshotDrag(); + return; + } + j = Sprite_DirectionToFaceLink(k, NULL); + sprite_x_vel[k] = kMovableStatue_Xvel[j]; + sprite_y_vel[k] = kMovableStatue_Yvel[j]; + } else { + if (!sprite_delay_main[k]) + sprite_delay_aux1[k] = 13; + if ((uint16)(cur_sprite_x - link_x_coord + 16) < 35 && + (uint16)(cur_sprite_y - link_y_coord + 12) < 36 && + link_direction_facing == kMovableStatue_Dir[j = Sprite_DirectionToFaceLink(k, NULL)] && + !link_is_running) { + link_is_near_moveable_statue = 1; + sprite_A[k] = 1; + if (!(link_grabbing_wall & 2) || !(kMovableStatue_Joypad[j] & joypad1H_last) || (link_x_vel | link_y_vel) == 0) + return; + j ^= 1; + sprite_x_vel[k] = kMovableStatue_Xvel[j]; + sprite_y_vel[k] = kMovableStatue_Yvel[j]; + } else { + if (sprite_A[k]) { + sprite_A[k] = 0; + link_speed_setting = 0; + link_grabbing_wall = 0; + link_is_near_moveable_statue = 0; + link_cant_change_direction &= ~1; + } + return; + } + } + if (!(link_grabbing_wall & 2)) + Sprite_NullifyHookshotDrag(); + if (!(sprite_wallcoll[k] & 15) && !sprite_delay_aux4[k]) { + SpriteSfx_QueueSfx2WithPan(k, 0x22); + sprite_delay_aux4[k] = 8; + } +} + +bool Statue_CheckForSwitch(int k) { // 86c203 + static const int8 kMovableStatue_SwitchX[4] = {3, 12, 3, 12}; + static const int8 kMovableStatue_SwitchY[4] = {3, 3, 12, 12}; + for (int j = 3; j >= 0; j--) { + uint16 x = Sprite_GetX(k) + kMovableStatue_SwitchX[j]; + uint16 y = Sprite_GetY(k) + kMovableStatue_SwitchY[j]; + uint8 t = GetTileAttribute(sprite_floor[k], &x, y); + if (t != 0x23 && t != 0x24 && t != 0x25 && t != 0x3b) + return false; + } + return true; +} + +void MovableStatue_Draw(int k) { // 86c264 + static const DrawMultipleData kMovableStatue_Dmd[3] = { + {0, -8, 0x00c2, 0}, + {8, -8, 0x40c2, 0}, + {0, 0, 0x00c0, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kMovableStatue_Dmd[0], 3, NULL); +} + +void Statue_BlockSprites(int k) { // 86c277 + for (int j = 15; j >= 0; j--) { + if (sprite_type[j] == 0x1c || j == k || (j ^ frame_counter) & 1 || sprite_state[j] < 9) + continue; + int x = Sprite_GetX(j), y = Sprite_GetY(j); + if ((uint16)(cur_sprite_x - x + 12) < 24 && + (uint16)(cur_sprite_y - y + 12) < 36) { + sprite_F[j] = 4; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 32); + sprite_y_recoil[j] = pt.y; + sprite_x_recoil[j] = pt.x; + } + } +} + +void Sprite_1D_FluteQuest(int k) { // 86c2e5 + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (BYTE(overworld_screen_index) == 0x18) { + if (link_item_flute == 3) + sprite_state[k] = 0; + } else { + if (link_item_flute & 2) + sprite_state[k] = 0; + } +} + +void Sprite_72_FairyPond(int k) { // 86c319 + if (sprite_A[k]) { + if (!--sprite_C[k]) + sprite_state[k] = 0; + sprite_graphics[k] = sprite_C[k] >> 3; + Oam_AllocateFromRegionC(4); + SpriteDraw_SingleSmall(k); + return; + } + if (sprite_B[k]) { + FaerieQueen_Draw(k); + sprite_graphics[k] = frame_counter >> 4 & 1; + if (frame_counter & 15) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x72, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x + kWishPond_X[GetRandomNumber() & 7]); + Sprite_SetY(j, info.r2_y + kWishPond_Y[GetRandomNumber() & 7]); + sprite_C[j] = 31; + sprite_A[j] = 31; + sprite_flags2[j] = 0; + sprite_flags3[j] = 0x48; + sprite_oam_flags[j] = 0x48 & 0xf; + sprite_B[j] = 1; + } + return; + } + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + Sprite_WishPond2(k); +} + +void Sprite_WishPond2(int k) { // 86c41d + WishPond2_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (BYTE(dungeon_room_index) != 21) + Sprite_WishPond3(k); + else + Sprite_HappinessPond(k); +} + +void Sprite_HappinessPond(int k) { // 86c44c + static const uint8 kHappinessPondCost[4] = {5, 20, 25, 50}; + static const uint8 kHappinessPondCostHex[4] = {5, 0x20, 0x25, 0x50}; + switch (sprite_ai_state[k]) { + case 0: + flag_is_link_immobilized = 0; + if (sprite_delay_main[k] || Sprite_CheckIfLinkIsBusy()) + return; + if (Sprite_ShowMessageOnContact(k, 0x89) & 0x100) { + sprite_ai_state[k] = 1; + Link_ResetProperties_A(); + Ancilla_TerminateSparkleObjects(); + link_direction_facing = 0; + } + break; + case 1: + if (choice_in_multiselect_box == 0) { + int i = (link_bomb_upgrades | link_arrow_upgrades) != 0; + sprite_graphics[k] = i * 2; + WORD(byte_7E1CF2[0]) = WORD(kHappinessPondCostHex[i * 2]); + Sprite_ShowMessageUnconditional(0x14e); + sprite_ai_state[k] = 2; + flag_is_link_immobilized = 1; + } else { +show_later_msg: + Sprite_ShowMessageUnconditional(0x14c); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 255; + } + break; + case 2: { + int i = sprite_graphics[k] + choice_in_multiselect_box; + byte_7E1CF2[1] = kHappinessPondCostHex[i]; + if (link_rupees_goal < kHappinessPondCost[i]) { + goto show_later_msg; + } else { + sprite_D[k] = kHappinessPondCost[i]; + sprite_head_dir[k] = i; + sprite_ai_state[k] = 3; + } + break; + } + case 3: { + sprite_delay_main[k] = 80; + int i = sprite_D[k]; + link_rupees_goal -= i; + link_rupees_in_pond += i; + AddHappinessPondRupees(sprite_head_dir[k]); + if (link_rupees_in_pond >= 100) { + link_rupees_in_pond -= 100; + sprite_ai_state[k] = 5; + return; + } + byte_7E1CF2[0] = (link_rupees_in_pond / 10) * 16 + (link_rupees_in_pond % 10); + sprite_ai_state[k] = 4; + break; + } + case 4: + if (sprite_delay_main[k] == 0) { + Sprite_ShowMessageUnconditional(0x94); + sprite_ai_state[k] = 13; + } + break; + case 5: + if (sprite_delay_main[k] == 0) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x72, &info); + assert(j >= 0); + Sprite_SetX(j, info.r0_x); + Sprite_SetY(j, info.r2_y - 80); + music_control = 0x1b; + last_music_control = 0; + sprite_B[j] = 1; + Palette_AssertTranslucencySwap(); + PaletteFilter_WishPonds(); + sprite_E[k] = j; + sprite_ai_state[k] = 6; + sprite_delay_main[k] = 255; + } + break; + case 6: + if (!(frame_counter & 7)) { + PaletteFilter_SP5F(); + if (!BYTE(palette_filter_countdown)) { + Sprite_ShowMessageUnconditional(0x95); + Palette_RevertTranslucencySwap(); + TS_copy = 0; + CGADSUB_copy = 0x20; + flag_update_cgram_in_nmi++; + sprite_ai_state[k] = 7; + } + } + break; + case 7: + if (!choice_in_multiselect_box) + sprite_ai_state[k] = 8; + else + sprite_ai_state[k] = 12; + break; + case 8: { + static const uint8 kMaxBombsForLevelHex[8] = {0x10, 0x15, 0x20, 0x25, 0x30, 0x35, 0x40, 0x50}; + int i = link_bomb_upgrades + 1; + if (i != 8) { + link_bomb_upgrades = i; + byte_7E1CF2[0] = link_bomb_filler = kMaxBombsForLevelHex[i]; + Sprite_ShowMessageUnconditional(0x96); + } else { + link_rupees_goal += 100; + Sprite_ShowMessageUnconditional(0x98); + } + sprite_ai_state[k] = 9; + break; + } + case 9: + Palette_AssertTranslucencySwap(); + TS_copy = 2; + CGADSUB_copy = 0x30; + flag_update_cgram_in_nmi++; + sprite_ai_state[k] = 10; + break; + case 10: + if (!(frame_counter & 7)) { + PaletteFilter_SP5F(); + if (BYTE(palette_filter_countdown) == 30) { + sprite_state[sprite_E[k]] = 0; + } else if (BYTE(palette_filter_countdown) == 0) { + sprite_ai_state[k] = 11; + } + } + break; + case 11: + PaletteFilter_RestoreSP5F(); + Palette_RevertTranslucencySwap(); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 255; + break; + case 12: { + static const uint8 kMaxArrowsForLevelHex[8] = {0x30, 0x35, 0x40, 0x45, 0x50, 0x55, 0x60, 0x70}; + int i = link_arrow_upgrades + 1; + if (i != 8) { + link_arrow_upgrades = i; + byte_7E1CF2[0] = link_arrow_filler = kMaxArrowsForLevelHex[i]; + Sprite_ShowMessageUnconditional(0x97); + } else { + link_rupees_goal += 100; + Sprite_ShowMessageUnconditional(0x98); + } + sprite_ai_state[k] = 9; + break; + } + case 13: + Sprite_ShowMessageUnconditional(0x154); + sprite_ai_state[k] = 14; + break; + case 14: { + static const uint16 kHappinessPondLuckMsg[4] = {0x150, 0x151, 0x152, 0x153}; + static const uint8 kHappinessPondLuck[4] = {1, 0, 0, 2}; + int i = GetRandomNumber() & 3; + item_drop_luck = kHappinessPondLuck[i]; + luck_kill_counter = 0; + Sprite_ShowMessageUnconditional(kHappinessPondLuckMsg[i]); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 255; + break; + } + } +} + +void WishPond2_Draw(int k) { // 86c4b5 + static const DrawMultipleData kWishPond2_Dmd[8] = { + {32, -64, 0x0024, 0}, + {32, -56, 0x0034, 0}, + {32, -64, 0x0024, 0}, + {32, -56, 0x0034, 0}, + {32, -64, 0x0024, 2}, + {32, -64, 0x0024, 2}, + {32, -64, 0x0024, 2}, + {32, -64, 0x0024, 2}, + }; + if (BYTE(dungeon_room_index) == 21) + return; + uint8 t = sprite_ai_state[k]; + if (t != 5 && t != 6 && t != 11 && t != 12) + return; + int g = sprite_graphics[k]; + uint8 f = kWishPond2_OamFlags[g]; + if (f == 0xff) + f = 5; + sprite_oam_flags[k] = (f & 7) * 2; + Sprite_DrawMultiple(k, &kWishPond2_Dmd[(kReceiveItem_Tab1[g] >> 1) * 4], 4, NULL); +} + +void FaerieQueen_Draw(int k) { // 86cb26 + static const uint8 kFaerieQueen_Draw_X[24] = { + 0, 16, 0, 8, 16, 24, 0, 8, 16, 24, 0, 16, 0, 16, 0, 8, 16, 24, 0, 8, 16, 24, 0, 16, + }; + static const uint8 kFaerieQueen_Draw_Y[24] = { + 0, 0, 16, 16, 16, 16, 24, 24, 24, 24, 32, 32, 0, 0, 16, 16, 16, 16, 24, 24, 24, 24, 32, 32, + }; + static const uint8 kFaerieQueen_Draw_Char[24] = { + 0xc7, 0xc7, 0xcf, 0xca, 0xca, 0xcf, 0xdf, 0xda, 0xda, 0xdf, 0xcb, 0xcb, 0xcd, 0xcd, 0xc9, 0xca, + 0xca, 0xc9, 0xd9, 0xda, 0xda, 0xd9, 0xcb, 0xcb, + }; + static const uint8 kFaerieQueen_Draw_Flags[24] = { + 0, 0x40, 0, 0, 0x40, 0x40, 0, 0, 0x40, 0x40, 0, 0x40, 0, 0x40, 0, 0, 0x40, 0x40, 0, 0, 0x40, 0x40, 0, 0x40, + }; + static const uint8 kFaerieQueen_Draw_Ext[24] = { + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + }; + static const DrawMultipleData kFaerieQueen_Dmd[20] = { + { 0, 0, 0x00e9, 2}, + {16, 0, 0x40e9, 2}, + { 0, 0, 0x00e9, 2}, + {16, 0, 0x40e9, 2}, + { 0, 0, 0x00e9, 2}, + {16, 0, 0x40e9, 2}, + { 0, 16, 0x00eb, 2}, + {16, 16, 0x40eb, 2}, + { 0, 32, 0x00ed, 2}, + {16, 32, 0x40ed, 2}, + { 0, 0, 0x00ef, 0}, + {24, 0, 0x40ef, 0}, + { 0, 8, 0x00ff, 0}, + {24, 8, 0x40ff, 0}, + { 0, 0, 0x00e9, 2}, + {16, 0, 0x40e9, 2}, + { 0, 16, 0x00eb, 2}, + {16, 16, 0x40eb, 2}, + { 0, 32, 0x00ed, 2}, + {16, 32, 0x40ed, 2}, + }; + if (!savegame_is_darkworld) { + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 11; i >= 0; i--, oam++) { + int j = g * 12 + i; + oam->x = kFaerieQueen_Draw_X[j] + info.x; + oam->y = kFaerieQueen_Draw_Y[j] + info.y; + oam->charnum = kFaerieQueen_Draw_Char[j]; + oam->flags = info.flags | kFaerieQueen_Draw_Flags[j]; + bytewise_extended_oam[oam - oam_buf] = kFaerieQueen_Draw_Ext[j]; + } + Sprite_CorrectOamEntries(k, 11, 0xff); + } else { + Sprite_DrawMultiple(k, &kFaerieQueen_Dmd[sprite_graphics[k] * 10], 10, NULL); + } +} + +void Sprite_71_Leever(int k) { // 86cba2 + static const uint8 kLeever_EmergeGfx[16] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 1, 2, 1, 0, 0}; + static const uint8 kLeever_AttackGfx[4] = {9, 10, 11, 12}; + static const uint8 kLeever_AttackSpd[2] = {12, 8}; + static const uint8 kLeever_SubmergeGfx[16] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 1, 2, 1, 0, 0}; + + if (sprite_ai_state[k]) + Leever_Draw(k); + else { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + } + if (sprite_pause[k]) + sprite_state[k] = 8; + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // under sand + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 127; + } else { + Sprite_ApplySpeedTowardsLink(k, 16); + Sprite_MoveXY(k); + Sprite_CheckTileCollision2(k); + } + break; + case 1: // emerge + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 160; + Sprite_ZeroVelocity_XY(k); + } else { + sprite_graphics[k] = kLeever_EmergeGfx[sprite_delay_main[k] >> 3]; + } + break; + case 2: // attack + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { +stop_attack: + sprite_ai_state[k]++; + sprite_delay_main[k] = 127; + } else { + if (!(sprite_subtype2[k] & 7)) + Sprite_ApplySpeedTowardsLink(k, kLeever_AttackSpd[sprite_A[k]]); + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + goto stop_attack; + sprite_graphics[k] = kLeever_AttackGfx[++sprite_subtype2[k] >> 2 & 3]; + } + break; + case 3: // submerge + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 64; + } else { + sprite_graphics[k] = kLeever_SubmergeGfx[sprite_delay_main[k] >> 3 ^ 15]; + } + break; + } + +} + +void Leever_Draw(int k) { // 86ce45 + static const uint8 kLeever_Draw_Num[14] = {1, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1}; + static const int8 kLeever_Draw_X[56] = { + 2, 6, 6, 6, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 0, 8, + 0, 8, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + static const int8 kLeever_Draw_Y[56] = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 8, 8, + 5, 5, 8, 8, 2, 2, 8, 8, 1, 1, 8, 8, 0, 0, 8, 8, + -1, -1, 8, 8, 8, -2, -2, 0, 8, -2, -2, 0, 8, -2, -2, 0, + 8, -2, -2, 0, 8, -2, -2, 0, + }; + static const uint8 kLeever_Draw_Char[56] = { + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x38, 0x38, 0x38, 0x38, 8, 9, 0x28, 0x28, + 8, 9, 0xd9, 0xd9, 8, 8, 0xd8, 0xd8, 8, 8, 0xda, 0xda, 6, 6, 0xd9, 0xd9, + 0x26, 0x26, 0xd8, 0xd8, 0x6c, 6, 6, 0, 0x6c, 0x26, 0x26, 0, 0x6c, 6, 6, 0, + 0x6c, 0x26, 0x26, 0, 0x6c, 8, 8, 0, + }; + static const uint8 kLeever_Draw_Flags[56] = { + 1, 0x41, 0x41, 0x41, 1, 0x41, 0x41, 0x41, 1, 0x41, 0x41, 0x41, 1, 1, 1, 0x41, + 1, 1, 0, 0x40, 1, 1, 0, 0x40, 1, 1, 0, 0x40, 1, 1, 0, 0x40, + 0, 1, 0, 0x40, 6, 0x41, 0x41, 0, 6, 0x41, 0x41, 0, 6, 1, 1, 0, + 6, 1, 1, 0, 6, 1, 1, 0, + }; + static const uint8 kLeever_Draw_Ext[56] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, + 2, 2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, + 2, 2, 2, 0, 2, 2, 2, 0, + }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int d = sprite_graphics[k]; + for (int i = kLeever_Draw_Num[d]; i >= 0; i--, oam++) { + int j = d * 4 + i; + uint16 x = info.x + kLeever_Draw_X[j]; + uint16 y = info.y + kLeever_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kLeever_Draw_Char[j]; + uint8 f = info.flags; + if (oam->charnum >= 0x60 || oam->charnum == 0x28 || oam->charnum == 0x38) + f &= 0xf0; + oam->flags = kLeever_Draw_Flags[j] | f; + bytewise_extended_oam[oam - oam_buf] = kLeever_Draw_Ext[j] | (x >> 8 & 1); + } +} + +void Sprite_D8_Heart(int k) { // 86cec0 + if (SpriteDraw_AbsorbableTransient(k, true)) + return; + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckAbsorptionByPlayer(k); + if (Sprite_HandleDraggingByAncilla(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_ai_state[k]++; + sprite_graphics[k] = 0; + } + sprite_oam_flags[k] &= ~0x40; + if (!sign8(sprite_x_vel[k])) + sprite_oam_flags[k] |= 0x40; + switch (sprite_ai_state[k] >= 3 ? 3 : sprite_ai_state[k]) { + case 0: // InitializeAscent + sprite_ai_state[k]++; + sprite_delay_main[k] = 18; + sprite_z_vel[k] = 20; + sprite_graphics[k] = 1; + sprite_D[k] = 0; + break; + case 1: // BeginDescending + if (sprite_delay_main[k] != 0) { + sprite_z_vel[k]--; + } else { + sprite_ai_state[k]++; + sprite_z_vel[k] = 253; + sprite_x_vel[k] = 0; + } + break; + case 2: // GlideGroundward + if (sprite_delay_main[k] == 0) { + int j = sprite_D[k] & 1; + sprite_x_vel[k] += kHeartRefill_AccelX[j]; + if (sprite_x_vel[k] == (uint8)kHeartRefill_VelTarget[j]) { + sprite_D[k]++; + sprite_delay_main[k] = 8; + } + } + break; + case 3: // Grounded + sprite_z_vel[k] = sprite_x_vel[k] = sprite_y_vel[k] = 0; + break; + } +} + +void Sprite_E3_Fairy(int k) { // 86cf94 + sprite_ignore_projectile[k] = 1; + if (!sprite_ai_state[k]) { + if (!player_is_indoors) + sprite_obj_prio[k] = 48; + if (SpriteDraw_AbsorbableTransient(k, true)) + return; + } + Fairy_CheckIfTouchable(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // normal + if (!sprite_delay_aux4[k]) { + if (Sprite_CheckDamageToLink(k)) { + Sprite_HandleAbsorptionByPlayer(k); + } else if (Sprite_CheckDamageFromLink(k) & kCheckDamageFromPlayer_Ne) { + sprite_ai_state[k]++; + Sprite_ShowMessageUnconditional(0xc9); + return; + } + } + if (Sprite_HandleDraggingByAncilla(k)) + return; + Faerie_HandleMovement(k); + break; + case 1: // capture + if (choice_in_multiselect_box == 0) { + int j = Sprite_Find_EmptyBottle(); + if (j >= 0) { + link_bottle_info[j] = 6; + Hud_RefreshIcon(); + sprite_state[k] = 0; + return; + } + Sprite_ShowMessageUnconditional(0xca); + } + sprite_delay_aux4[k] = 48; + sprite_ai_state[k] = 0; + break; + } +} + +void Fairy_CheckIfTouchable(int k) { // 86d011 + if (submodule_index == 2 && (dialogue_message_index == 0xc9 || dialogue_message_index == 0xca)) + sprite_delay_aux4[k] = 40; +} + +void Sprite_E4_SmallKey(int k) { // 86d032 + if (dung_savegame_state_bits & (kAbsorbBigKey[sprite_die_action[k]] << 8)) { + sprite_state[k] = 0; + return; + } + Sprite_DrawRippleIfInWater(k); + if (SpriteDraw_AbsorbableTransient(k, false)) + return; + Sprite_Absorbable_Main(k); +} + +void Sprite_D9_GreenRupee(int k) { // 86d04a + Sprite_DrawRippleIfInWater(k); + if (SpriteDraw_AbsorbableTransient(k, true)) + return; + Sprite_Absorbable_Main(k); +} + +void Sprite_Absorbable_Main(int k) { // 86d051 + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveZ(k); + Sprite_MoveXY(k); + if (sprite_delay_aux3[k] == 0) { + Sprite_CheckTileCollision2(k); + Sprite_BounceOffWall(k); + } + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_x_vel[k] = (int8)sprite_x_vel[k] >> 1; + sprite_y_vel[k] = (int8)sprite_y_vel[k] >> 1; + uint8 t = -sprite_z_vel[k]; + t >>= 1; + if (t < 9) { + sprite_z_vel[k] = sprite_x_vel[k] = sprite_y_vel[k] = 0; + } else { + sprite_z_vel[k] = t; + if (sprite_I[k] == 8 || sprite_I[k] == 9) { + sprite_z_vel[k] = 0; + int j = Sprite_SpawnSmallSplash(k); + if (j >= 0 && sprite_flags3[k] & 0x20) { + // wtf carry propagation + Sprite_SetX(j, Sprite_GetX(j) - 4); + Sprite_SetY(j, Sprite_GetY(j) - 4); + } + } else { + if (sprite_type[k] >= 0xe4 && player_is_indoors) + SpriteSfx_QueueSfx2WithPan(k, 5); + } + } + } + if (Sprite_HandleDraggingByAncilla(k)) + return; + Sprite_CheckAbsorptionByPlayer(k); +} + +void Sprite_08_Octorok(int k) { // 86d377 + static const uint8 kOctorock_Tab0[20] = { + 0, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 0, + }; + static const uint8 kOctorock_Tab1[10] = {2, 2, 2, 2, 2, 2, 2, 2, 1, 0}; + static const uint8 kOctorock_NextDir[4] = {2, 3, 1, 0}; + static const uint8 kOctorock_Dir[4] = {3, 2, 0, 1}; + static const int8 kOctorock_Xvel[4] = {24, -24, 0, 0}; + static const int8 kOctorock_Yvel[4] = {0, 0, 24, -24}; + static const uint8 kOctorock_OamFlags[4] = {0x40, 0, 0, 0}; + + int j = sprite_D[k]; + if (sprite_delay_aux1[k]) + sprite_D[k] = kOctorock_Dir[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kOctorock_OamFlags[j] | (sprite_graphics[k] == 7 ? 0x40 : 0); + Octorock_Draw(k); + sprite_D[k] = j; + + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_MoveXY(k); + Sprite_CheckDamageToAndFromLink(k); + if (!(sprite_ai_state[k] & 1)) { + sprite_graphics[k] = ++sprite_subtype2[k] >> 3 & 3 | (sprite_D[k] & 2) << 1; + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = sprite_type[k] == 8 ? 60 : 160; + } else { + j = sprite_D[k]; + sprite_x_vel[k] = kOctorock_Xvel[j]; + sprite_y_vel[k] = kOctorock_Yvel[j]; + if (Sprite_CheckTileCollision(k)) + sprite_D[k] ^= 1; + } + return; + } else { + Sprite_ZeroVelocity_XY(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = (GetRandomNumber() & 0x3f) + 48; + sprite_D[k] = sprite_delay_main[k] & 3; + } else { + switch (sprite_type[k]) { + case 8: // normal + j = sprite_delay_main[k]; + if (j == 28) + Octorok_FireLoogie(k); + sprite_C[k] = kOctorock_Tab0[j >> 3]; + break; + case 10: // four shooter + j = sprite_delay_main[k]; + if (j < 128) { + if (!(j & 15)) + sprite_D[k] = kOctorock_NextDir[sprite_D[k]]; + if ((j & 15) == 8) + Octorok_FireLoogie(k); + } + sprite_C[k] = kOctorock_Tab1[j >> 4]; + break; + } + } + } +} + +void Octorok_FireLoogie(int k) { // 86d4cd + static const int8 kOctorock_Spit_X[4] = {12, -12, 0, 0}; + static const int8 kOctorock_Spit_Y[4] = {4, 4, 12, -12}; + static const int8 kOctorock_Spit_Xvel[4] = {44, -44, 0, 0}; + static const int8 kOctorock_Spit_Yvel[4] = {0, 0, 44, -44}; + SpriteSpawnInfo info; + SpriteSfx_QueueSfx2WithPan(k, 0x7); + int j = Sprite_SpawnDynamically(k, 0xc, &info); + if (j >= 0) { + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kOctorock_Spit_X[i]); + Sprite_SetY(j, info.r2_y + kOctorock_Spit_Y[i]); + sprite_x_vel[j] = kOctorock_Spit_Xvel[i]; + sprite_y_vel[j] = kOctorock_Spit_Yvel[i]; + } +} + +void Octorock_Draw(int k) { // 86d54a + static const int8 kOctorock_Draw_X[9] = {8, 0, 4, 8, 0, 4, 9, -1, 4}; + static const int8 kOctorock_Draw_Y[9] = {6, 6, 9, 6, 6, 9, 6, 6, 9}; + static const uint8 kOctorock_Draw_Char[9] = {0xbb, 0xbb, 0xba, 0xab, 0xab, 0xaa, 0xa9, 0xa9, 0xb9}; + static const uint8 kOctorock_Draw_Flags[9] = {0x65, 0x25, 0x25, 0x65, 0x25, 0x25, 0x65, 0x25, 0x25}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + if (sprite_D[k] != 3) { + OamEnt *oam = GetOamCurPtr(); + int j = sprite_C[k] * 3 + sprite_D[k]; + uint16 x = info.x + kOctorock_Draw_X[j]; + uint16 y = info.y + kOctorock_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kOctorock_Draw_Char[j]; + oam->flags = kOctorock_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } + oam_cur_ptr += 4; + oam_ext_cur_ptr++; + sprite_flags2[k]--; + Sprite_PrepAndDrawSingleLargeNoPrep(k, &info); + sprite_flags2[k]++; +} + +void Sprite_0C_OctorokStone(int k) { // 86d5b9 + if (sprite_state[k] == 6) { + SpriteDraw_OctorokStoneCrumbling(k); + if (Sprite_ReturnIfPaused(k)) + return; + if (sprite_delay_main[k] == 30) + SpriteSfx_QueueSfx2WithPan(k, 0x1f); + } else { + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToLink(k); + Sprite_MoveXY(k); + if (!((k ^ frame_counter) & 3) && Sprite_CheckTileCollision(k)) + Sprite_Func3(k); + } +} + +void SpriteDraw_OctorokStoneCrumbling(int k) { // 86d643 + static const int8 kOctostone_Draw_X[16] = {0, 8, 0, 8, -8, 16, -8, 16, -12, 20, -12, 20, -14, 22, -14, 22}; + static const int8 kOctostone_Draw_Y[16] = {0, 0, 8, 8, -8, -8, 16, 16, -12, -12, 20, 20, -14, -14, 22, 22}; + static const uint8 kOctostone_Draw_Flags[16] = {0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0}; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = ((sprite_delay_main[k] >> 1 & 0xc) ^ 0xc); + for (int i = 3; i >= 0; i--, oam++) { + int j = g + i; + uint16 x = info.x + kOctostone_Draw_X[j]; + uint16 y = info.y + kOctostone_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0xbc; + oam->flags = kOctostone_Draw_Flags[j] | 0x2d; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } + +} + +void Sprite_0F_Octoballoon(int k) { // 86d6aa + static const uint8 kSprite_Octoballoon_Z[8] = {16, 17, 18, 19, 20, 19, 18, 17}; + sprite_z[k] = kSprite_Octoballoon_Z[sprite_subtype2[k] >> 3 & 7]; + Octoballoon_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 3; + if (!Octoballoon_Find()) { + sprite_state[k] = 6; + sprite_hit_timer[k] = 0; + sprite_delay_main[k] = 15; + return; + } + } + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_subtype2[k]++; + if (!((k ^ frame_counter) & 15)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 4); + if (sprite_x_vel[k] - pt.x) + sprite_x_vel[k] += sign8(sprite_x_vel[k] - pt.x) ? 1 : -1; + if (sprite_y_vel[k] - pt.y) + sprite_y_vel[k] += sign8(sprite_y_vel[k] - pt.y) ? 1 : -1; + } + Sprite_MoveXY(k); + if (Sprite_CheckDamageToLink(k)) + Octoballoon_RecoilLink(k); + Sprite_CheckDamageFromLink(k); + Sprite_CheckTileCollision2(k); + Sprite_BounceOffWall(k); +} + +void Octoballoon_RecoilLink(int k) { // 86d72b + if (!link_incapacitated_timer) { + link_incapacitated_timer = 4; + Sprite_ApplyRecoilToLink(k, 16); + Sprite_InvertSpeed_XY(k); + } +} + +void Octoballoon_Draw(int k) { // 86d784 + static const int8 kOctoballoon_Draw_X[12] = {-4, 4, -4, 4, -8, 8, -8, 8, -4, 4, -4, 4}; + static const int8 kOctoballoon_Draw_Y[12] = {-4, -4, 4, 4, -8, -8, 8, 8, -4, -4, 4, 4}; + static const uint8 kOctoballoon_Draw_Char[12] = {0x8c, 0x8c, 0x9c, 0x9c, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86}; + static const uint8 kOctoballoon_Draw_Flags[12] = {0, 0x40, 0, 0x40, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0}; + int d = 0; + if (sprite_state[k] == 6) { + if (sprite_delay_main[k] == 6 && !submodule_index) + Octoballoon_FormBabby(k); + d = (sprite_delay_main[k] >> 1 & 4) + 4; + } + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + for (int i = 3; i >= 0; i--, oam++) { + int j = d + i; + uint16 x = info.x + kOctoballoon_Draw_X[j]; + uint16 y = info.y + kOctoballoon_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kOctoballoon_Draw_Char[j]; + oam->flags = kOctoballoon_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } + SpriteDraw_Shadow(k, &info); +} + +void Octoballoon_FormBabby(int k) { // 86d80e + static const int8 kOctoballoon_Spawn_Xv[6] = {16, 11, -11, -16, -11, 11}; + static const int8 kOctoballoon_Spawn_Yv[6] = {0, 11, 11, 0, -11, -11}; + + SpriteSfx_QueueSfx2WithPan(k, 0xc); + for (int i = 5; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x10, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_vel[j] = kOctoballoon_Spawn_Xv[i]; + sprite_y_vel[j] = kOctoballoon_Spawn_Yv[i]; + sprite_z_vel[j] = 48; + sprite_subtype2[j] = 255; + } + } +} + +void Sprite_10_OctoballoonBaby(int k) { // 86d853 + if (!sprite_subtype2[k]) + sprite_state[k] = 0; + if (sprite_subtype2[k] >= 64 || !(sprite_subtype2[k] & 1)) + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]--; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_z_vel[k]--; + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 16; + } + Sprite_MoveXY(k); + Sprite_CheckTileCollision2(k); + Sprite_BounceOffWall(k); + Sprite_CheckDamageToAndFromLink(k); +} + +void Sprite_0D_Buzzblob(int k) { // 86d89a + static const uint8 kBuzzBlob_Gfx[4] = {0, 1, 0, 2}; + static const uint8 kBuzzBlob_ObjPrio[4] = {10, 2, 8, 2}; + if (sprite_delay_aux1[k]) + sprite_obj_prio[k] = sprite_obj_prio[k] & 0xf1 | kBuzzBlob_ObjPrio[sprite_delay_aux1[k] >> 1 & 3]; + Sprite_Cukeman(k); + BuzzBlob_Draw(k); + sprite_graphics[k] = kBuzzBlob_Gfx[sprite_subtype2[k] >> 3 & 3] + (sprite_delay_aux1[k] ? 3 : 0); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_subtype2[k]++; + if (!sprite_delay_main[k]) + Buzzblob_SelectNewDirection(k); + if (!sprite_delay_aux1[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision2(k); + Sprite_BounceOffWall(k); + Sprite_CheckDamageToAndFromLink(k); +} + +void Buzzblob_SelectNewDirection(int k) { // 86d906 + static const int8 kBuzzBlob_Xvel[8] = {3, 2, -2, -3, -2, 2, 0, 0}; + static const int8 kBuzzBlob_Yvel[8] = {0, 2, 2, 0, -2, -2, 0, 0}; + static const uint8 kBuzzBlob_Delay[8] = {48, 48, 48, 48, 48, 48, 64, 64}; + int j = GetRandomNumber() & 7; + sprite_x_vel[k] = kBuzzBlob_Xvel[j]; + sprite_y_vel[k] = kBuzzBlob_Yvel[j]; + sprite_delay_main[k] = kBuzzBlob_Delay[j]; +} + +void BuzzBlob_Draw(int k) { // 86d953 + static const uint16 kBuzzBlob_DrawX[3] = {0, 8, 0}; + static const int16 kBuzzBlob_DrawY[3] = {-8, -8, 0}; + static const uint8 kBuzzBlob_DrawChar[18] = { 0xf0, 0xf0, 0xe1, 0, 0, 0xce, 0, 0, 0xce, 0xe3, 0xe3, 0xca, 0xe4, 0xe5, 0xcc, 0xe5, 0xe4, 0xcc }; + static const uint8 kBuzzBlob_DrawFlags[18] = { 0, 0x40, 0, 0, 0, 0, 0, 0, 0x40, 0, 0x40, 0, 0, 0, 0, 0x40, 0x40, 0x40 }; + static const uint8 kBuzzBlob_DrawExt[3] = {0, 0, 2}; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 2; i >= 0; i--, oam++) { + uint16 x = info.x + kBuzzBlob_DrawX[i]; + uint16 y = info.y + kBuzzBlob_DrawY[i]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kBuzzBlob_DrawChar[g * 3 + i]; + if (oam->charnum == 0) + oam->y = 240; + oam->flags = kBuzzBlob_DrawFlags[g * 3 + i] | info.flags; + bytewise_extended_oam[oam - oam_buf] = kBuzzBlob_DrawExt[i] | (x >> 8 & 1); + } + SpriteDraw_Shadow(k, &info); +} + +void Sprite_02_StalfosHead(int k) { // 86ddb7 + static const uint8 kStalfosHead_OamFlags[4] = {0, 0, 0, 0x40}; + static const uint8 kStalfosHead_Gfx[4] = {0, 1, 2, 1}; + + sprite_floor[k] = link_is_on_lower_level; + if (sprite_delay_aux1[k]) + Oam_AllocateFromRegionC(8); + int j = sprite_subtype2[k] >> 3 & 3; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kStalfosHead_OamFlags[j]; + sprite_graphics[k] = kStalfosHead_Gfx[j]; + sprite_obj_prio[k] = 0x30; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + if (sprite_F[k]) + Sprite_ZeroVelocity_XY(k); + Sprite_MoveXY(k); + sprite_subtype2[k]++; + ProjectSpeedRet pt; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] & 1) + return; + pt = Sprite_ProjectSpeedTowardsLink(k, 16); + } else { + if ((k ^ frame_counter) & 3) + return; + pt = Sprite_ProjectSpeedTowardsLink(k, 16); + pt.x = -pt.x; + pt.y = -pt.y; + } + if (sprite_x_vel[k] - pt.x != 0) + sprite_x_vel[k] += sign8(sprite_x_vel[k] - pt.x) ? 1 : -1; + if (sprite_y_vel[k] - pt.y != 0) + sprite_y_vel[k] += sign8(sprite_y_vel[k] - pt.y) ? 1 : -1; +} + +bool Pipe_ValidateEntry() { // 87f4f1 + for (int k = 4; k >= 0; k--) { + if (ancilla_type[k] == 0x31) { + link_position_mode = 0; + link_cant_change_direction = 0; + ancilla_type[k] = 0; + break; + } + } + return ((link_state_bits & 0x80) | link_auxiliary_state) != 0; +} + +void Ancilla_TerminateSparkleObjects() { // 89adc7 + for (int i = 4; i >= 0; i--) { + uint8 t = ancilla_type[i]; + if (t == 0x2a || t == 0x2b || t == 0x30 || t == 0x31 || t == 0x18 || t == 0x19 || t == 0xc) + ancilla_type[i] = 0; + } +} + +int Sprite_SpawnSuperficialBombBlast(int k) { // 89ae40 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x4a, &info); + if (j >= 0) { + sprite_state[j] = 6; + sprite_delay_aux1[j] = 31; + sprite_C[j] = 3; + sprite_flags2[j] = 3; + sprite_oam_flags[j] = 4; + SpriteSfx_QueueSfx2WithPan(k, 0x15); + Sprite_SetSpawnedCoordinates(j, &info); + } + return j; +} + +void Sprite_SpawnDummyDeathAnimation(int k) { // 89ae7e + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xb, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_state[j] = 6; + sprite_delay_main[j] = 15; + SpriteSfx_QueueSfx2WithPan(k, 0x14); + sprite_floor[j] = 2; + } +} + +void Sprite_MagicBat_SpawnLightning(int k) { // 89aea8 + static const int8 kSpawnMadderBolts_Xvel[4] = {-8, -4, 4, 8}; + static const int8 kSpawnMadderBolts_St2[4] = {0, 0x11, 0x22, 0x33}; + for (int i = 0; i < 4; i++) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x3a, &info); + if (j >= 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x1); + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_SetX(j, info.r0_x + 4); + Sprite_SetY(j, info.r2_y + 12 - sprite_z[k]); + sprite_z[j] = 0; + sprite_y_vel[j] = 24; + sprite_head_dir[j] = 24; + sprite_ignore_projectile[j] = 24; + sprite_flags2[j] = 0x80; + sprite_flags3[j] = 3; + sprite_oam_flags[j] = 3; + sprite_delay_main[j] = 32; + sprite_graphics[j] = 2; + int i = sprite_G[k]; + sprite_x_vel[j] = kSpawnMadderBolts_Xvel[i]; + sprite_subtype2[j] = kSpawnMadderBolts_St2[i]; + sprite_floor[j] = 2; + sprite_G[k]++; + } + } +} + +void Fireball_SpawnTrailGarnish(int k) { // 89b020 + if ((k ^ frame_counter) & 3) + return; + int j = GarnishAlloc(); + garnish_type[j] = 8; + garnish_active = 8; + garnish_countdown[j] = 11; + garnish_x_lo[j] = cur_sprite_x; + garnish_x_hi[j] = cur_sprite_x >> 8; + garnish_y_lo[j] = cur_sprite_y + 16; + garnish_y_hi[j] = (cur_sprite_y + 16) >> 8; + garnish_sprite[j] = k; +} + +void GarnishSpawn_PyramidDebris(int8 x, int8 y, int8 xvel, int8 yvel) { // 89b1bd + int k = GarnishAllocForce(); + sound_effect_2 = 3; + sound_effect_1 = 31; + sound_effect_ambient = 5; + + garnish_type[k] = 19; + garnish_active = 19; + garnish_x_lo[k] = 232 + x; + garnish_y_lo[k] = 96 + y; + garnish_x_vel[k] = xvel; + garnish_y_vel[k] = yvel; + garnish_countdown[k] = (GetRandomNumber() & 31) + 48; +} + +void Snitch_SpawnGuard(int k) { // 89c02f + static const uint16 kCrazyVillageSoldier_X[3] = {0x120, 0x340, 0x2e0}; + static const uint16 kCrazyVillageSoldier_Y[3] = {0x100, 0x3b0, 0x160}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x45, &info, 0); + if (j < 0) + return; + int i = sprite_type[k] == 0x3d ? 0 : + sprite_type[k] == 0x35 ? 1 : 2; + Sprite_SetX(j, kCrazyVillageSoldier_X[i] + (sprcoll_x_base & 0xff00)); + Sprite_SetY(j, kCrazyVillageSoldier_Y[i] + (sprcoll_y_base & 0xff00)); + sprite_floor[j] = 0; + sprite_health[j] = 4; + sprite_defl_bits[j] = 0x80; + sprite_flags5[j] = 0x90; + sprite_oam_flags[j] = 0xb; +} + +void Babusu_Draw(int k) { // 8dbd20 + static const DrawMultipleData kBabusu_Dmd[40] = { + { 0, 4, 0x4380, 0}, + { 0, 4, 0x4380, 0}, + { 0, 4, 0x43b6, 0}, + { 0, 4, 0x43b6, 0}, + { 0, 4, 0x43b7, 0}, + { 8, 4, 0x0380, 0}, + { 0, 4, 0x4380, 0}, + { 8, 4, 0x03b6, 0}, + { 8, 4, 0x03b7, 0}, + { 8, 4, 0x03b7, 0}, + { 8, 4, 0x0380, 0}, + { 8, 4, 0x0380, 0}, + { 4, 0, 0x8380, 0}, + { 4, 0, 0x8380, 0}, + { 4, 0, 0x83b6, 0}, + { 4, 0, 0x83b6, 0}, + { 4, 0, 0x83b7, 0}, + { 4, 8, 0x0380, 0}, + { 4, 0, 0x8380, 0}, + { 4, 8, 0x03b6, 0}, + { 4, 8, 0x03b7, 0}, + { 4, 8, 0x03b7, 0}, + { 4, 8, 0x0380, 0}, + { 4, 8, 0x0380, 0}, + { 0, -8, 0x0a4e, 2}, + { 0, 0, 0x0a5e, 2}, + { 0, -8, 0x4a4e, 2}, + { 0, 0, 0x4a5e, 2}, + { 8, 0, 0x0a6c, 2}, + { 0, 0, 0x0a6b, 2}, + { 8, 0, 0x8a6c, 2}, + { 0, 0, 0x8a6b, 2}, + { 0, 8, 0x8a4e, 2}, + { 0, 0, 0x8a5e, 2}, + { 0, 8, 0xca4e, 2}, + { 0, 0, 0xca5e, 2}, + {-8, 0, 0x4a6c, 2}, + { 0, 0, 0x4a6b, 2}, + {-8, 0, 0xca6c, 2}, + { 0, 0, 0xca6b, 2}, + }; + if (sprite_graphics[k] != 0xff) { + Sprite_DrawMultiple(k, &kBabusu_Dmd[sprite_graphics[k] * 2], 2, NULL); + } else { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + } +} + +void Wizzrobe_Draw(int k) { // 8dbe06 + static const DrawMultipleData kWizzrobe_Dmd[24] = { + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x0088, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x0086, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x008c, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x008a, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x408c, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x408a, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x00a4, 2}, + {0, -8, 0x00b2, 0}, + {8, -8, 0x00b3, 0}, + {0, 0, 0x008e, 2}, + }; + Sprite_DrawMultiple(k, &kWizzrobe_Dmd[sprite_graphics[k] * 3], 3, NULL); +} + +void Wizzbeam_Draw(int k) { // 8dbe68 + static const DrawMultipleData kWizzbeam_Dmd[8] = { + { 0, -4, 0x00c5, 0}, + { 0, 4, 0x80c5, 0}, + { 0, -4, 0x40c5, 0}, + { 0, 4, 0xc0c5, 0}, + {-4, 0, 0x40d2, 0}, + { 4, 0, 0x00d2, 0}, + {-4, 0, 0xc0d2, 0}, + { 4, 0, 0x80d2, 0}, + }; + Sprite_DrawMultiple(k, &kWizzbeam_Dmd[sprite_D[k] * 2], 2, NULL); +} + +void Freezor_Draw(int k) { // 8dbfa6 + + static const DrawMultipleData kFreezor_Dmd0[28] = { + {-8, 0, 0x00a6, 2}, + { 8, 0, 0x40a6, 2}, + {-8, 0, 0x00a6, 2}, + { 8, 0, 0x40a6, 2}, + {-8, 0, 0x00a6, 2}, + { 8, 0, 0x40a6, 2}, + { 0, 11, 0x00ab, 0}, + { 8, 11, 0x40ab, 0}, + {-8, 0, 0x00ac, 2}, + { 8, 0, 0x40a8, 2}, + { 0, 11, 0x00ba, 0}, + { 8, 11, 0x00bb, 0}, + {-8, 0, 0x00a8, 2}, + { 8, 0, 0x40ac, 2}, + { 0, 11, 0x40bb, 0}, + { 8, 11, 0x40ba, 0}, + { 0, 2, 0x00ae, 0}, + { 8, 2, 0x40ae, 0}, + { 0, 10, 0x00be, 0}, + { 8, 10, 0x40be, 0}, + { 0, 4, 0x00af, 0}, + { 8, 4, 0x40af, 0}, + { 0, 12, 0x00bf, 0}, + { 8, 12, 0x40bf, 0}, + { 0, 8, 0x00aa, 0}, + { 8, 8, 0x40aa, 0}, + { 0, 8, 0x00aa, 0}, + { 8, 8, 0x40aa, 0}, + }; + static const DrawMultipleData kFreezor_Dmd1[8] = { + { 0, 0, 0x00ae, 0}, + { 8, 0, 0x40ae, 0}, + { 0, 8, 0x00be, 0}, + { 8, 8, 0x40be, 0}, + {-2, 0, 0x00ae, 0}, + {10, 0, 0x40ae, 0}, + {-2, 8, 0x00be, 0}, + {10, 8, 0x40be, 0}, + }; + if (sprite_graphics[k] != 7) { + Sprite_DrawMultiple(k, &kFreezor_Dmd0[sprite_graphics[k] * 4], 4, NULL); + } else { + Sprite_DrawMultiple(k, kFreezor_Dmd1, 8, NULL); + } +} + +void Zazak_Draw(int k) { // 8dc0a6 + static const uint8 kZazak_Char[8] = {0x82, 0x82, 0x80, 0x84, 0x88, 0x88, 0x86, 0x84}; + static const uint8 kZazak_Flags[8] = {0x40, 0, 0, 0, 0x40, 0, 0, 0}; + static const DrawMultipleData kZazak_Dmd[24] = { + { 0, -8, 0x0008, 2}, + {-4, 0, 0x00a0, 2}, + { 4, 0, 0x00a1, 2}, + { 0, -7, 0x0008, 2}, + {-4, 1, 0x40a1, 2}, + { 4, 1, 0x40a0, 2}, + { 0, -8, 0x000e, 2}, + {-4, 0, 0x00a3, 2}, + { 4, 0, 0x00a4, 2}, + { 0, -7, 0x000e, 2}, + {-4, 1, 0x40a4, 2}, + { 4, 1, 0x40a3, 2}, + { 0, -9, 0x000c, 2}, + { 0, 0, 0x00a6, 2}, + { 0, 0, 0x00a6, 2}, + { 0, -8, 0x000c, 2}, + { 0, 0, 0x00a8, 2}, + { 0, 0, 0x00a8, 2}, + { 0, -9, 0x400c, 2}, + { 0, 0, 0x40a6, 2}, + { 0, 0, 0x40a6, 2}, + { 0, -8, 0x400c, 2}, + { 0, 0, 0x40a8, 2}, + { 0, 0, 0x40a8, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kZazak_Dmd[sprite_graphics[k] * 3], 3, &info); + if (sprite_pause[k]) + return; + int i = sprite_head_dir[k] + (sprite_delay_aux1[k] == 0 ? 0 : 4); + OamEnt *oam = GetOamCurPtr(); + oam->charnum = kZazak_Char[i]; + oam->flags = (oam->flags & ~0x40) | kZazak_Flags[i]; + SpriteDraw_Shadow(k, &info); +} + +void Stalfos_Draw(int k) { // 8dc21c + static const uint8 kStalfos_Char[4] = {2, 2, 0, 4}; + static const uint8 kStalfos_Flags[4] = {0x70, 0x30, 0x30, 0x30}; + static const DrawMultipleData kStalfos_Dmd[36] = { + { 0, -10, 0x0000, 2}, + { 0, 0, 0x0006, 2}, + { 0, 0, 0x0006, 2}, + { 0, -9, 0x0000, 2}, + { 0, 1, 0x4006, 2}, + { 0, 1, 0x4006, 2}, + { 0, -10, 0x0004, 2}, + { 0, 0, 0x0006, 2}, + { 0, 0, 0x0006, 2}, + { 0, -9, 0x0004, 2}, + { 0, 1, 0x4006, 2}, + { 0, 1, 0x4006, 2}, + { 0, -10, 0x0002, 2}, + { 5, 5, 0x002e, 0}, + { 0, 0, 0x0024, 2}, + { 0, -10, 0x0002, 2}, + { 0, 0, 0x000e, 2}, + { 0, 0, 0x000e, 2}, + { 0, -10, 0x4002, 2}, + { 3, 5, 0x402e, 0}, + { 0, 0, 0x4024, 2}, + { 0, -10, 0x4002, 2}, + { 0, 0, 0x400e, 2}, + { 0, 0, 0x000e, 2}, + { 2, -8, 0x4002, 2}, + { 0, 0, 0x4008, 2}, + { 0, 0, 0x4008, 2}, + {-2, -8, 0x0002, 2}, + { 0, 0, 0x0008, 2}, + { 0, 0, 0x0008, 2}, + { 0, -6, 0x0000, 2}, + { 0, 0, 0x000a, 2}, + { 0, 0, 0x000a, 2}, + { 0, 0, 0x000a, 2}, + { 0, -6, 0x0004, 2}, + { 0, -6, 0x0004, 2}, + }; + PrepOamCoordsRet info; + if (sprite_delay_aux2[k]) { + Sprite_PrepOamCoord(k, &info); + return; + } + Sprite_DrawMultiple(k, &kStalfos_Dmd[sprite_graphics[k] * 3], 3, &info); + if (sprite_graphics[k] < 8 && !sprite_pause[k]) { + OamEnt *oam = GetOamCurPtr(); + int i = sprite_head_dir[k]; + oam->charnum = kStalfos_Char[i]; + oam->flags = (oam->flags & ~0x70) | kStalfos_Flags[i]; + } + SpriteDraw_Shadow(k, &info); +} + +bool Probe_CheckTileSolidity(int k) { // 8dc26e + uint8 tiletype; + if (player_is_indoors) { + int t = (sprite_floor[k] >= 1) ? 0x1000 : 0; + t += (cur_sprite_x & 0x1f8) >> 3; + t += (cur_sprite_y & 0x1f8) << 3; + tiletype = dung_bg2_attr_table[t]; + } else { + tiletype = Overworld_ReadTileAttribute(cur_sprite_x >> 3, cur_sprite_y); + } + sprite_tiletype = tiletype; + return kSprite_SimplifiedTileAttr[tiletype] >= 1; +} + +void Sprite_HumanMulti_1(int k) { // 8dc2d9 + switch (sprite_subtype2[k]) { + case 0: Sprite_FluteDad(k); break; + case 1: Sprite_ThiefHideoutGuy(k); break; + case 2: Sprite_BlindsHutGuy(k); break; + } + +} + +void Sprite_BlindsHutGuy(int k) { // 8dc2e6 + BlindHideoutGuy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = 0; + int j = Sprite_ShowSolicitedMessage(k, 0x172); + if (j & 0x100) + sprite_D[k] = sprite_head_dir[k] = j; +} + +void Sprite_ThiefHideoutGuy(int k) { // 8dc308 + if (!(frame_counter & 3)) { + sprite_graphics[k] = 2; + uint8 dir = Sprite_DirectionToFaceLink(k, NULL); + sprite_head_dir[k] = dir == 3 ? 2 : dir; + } + sprite_oam_flags[k] = 15; + Oam_AllocateDeferToPlayer(k); + Thief_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + Sprite_ShowSolicitedMessage(k, 0x171); + sprite_graphics[k] = 2; +} + +void Sprite_FluteDad(int k) { // 8dc343 + FluteBoyFather_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + sprite_graphics[k] = (frame_counter < 48) ? 2 : (frame_counter >> 7) & 1; + + if (sprite_ai_state[k]) { + Sprite_ShowSolicitedMessage(k, 0xa3); + sprite_graphics[k] = 2; + } else if (link_item_flute < 2) { + Sprite_ShowSolicitedMessage(k, 0xa1); + } else if (!(Sprite_ShowSolicitedMessage(k, 0xa4) & 0x100) && + hud_cur_item == 13 && (joypad1H_last&0x40) && Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_ShowMessageUnconditional(0xa2); + sprite_ai_state[k]++; + sprite_graphics[k] = 2; + } +} + +void FluteBoyFather_Draw(int k) { // 8dc3e1 + static const DrawMultipleData kFluteBoyFather_Dmd[6] = { + {0, -7, 0x0086, 2}, + {0, 0, 0x0088, 2}, + {0, -6, 0x0086, 2}, + {0, 0, 0x0088, 2}, + {0, -8, 0x0084, 2}, + {0, 0, 0x0088, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kFluteBoyFather_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void BlindHideoutGuy_Draw(int k) { // 8dc481 + static const DrawMultipleData kBlindHideoutGuy_Dmd[16] = { + {0, -8, 0x000c, 2}, + {0, 0, 0x00ca, 2}, + {0, -8, 0x000c, 2}, + {0, 0, 0x40ca, 2}, + {0, -8, 0x000c, 2}, + {0, 0, 0x00ca, 2}, + {0, -8, 0x000c, 2}, + {0, 0, 0x40ca, 2}, + {0, -8, 0x000e, 2}, + {0, 0, 0x00ca, 2}, + {0, -8, 0x000e, 2}, + {0, 0, 0x40ca, 2}, + {0, -8, 0x400e, 2}, + {0, 0, 0x00ca, 2}, + {0, -8, 0x400e, 2}, + {0, 0, 0x40ca, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kBlindHideoutGuy_Dmd[sprite_graphics[k] * 2 + sprite_D[k] * 4], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_SweepingLady(int k) { // 8dc4ad + SweepingLady_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_ShowSolicitedMessage(k, 0xa5); + Sprite_BehaveAsBarrier(k); + sprite_graphics[k] = frame_counter >> 4 & 1; +} + +void SweepingLady_Draw(int k) { // 8dc4eb + static const DrawMultipleData kSweepingLadyDmd[4] = { + {0, -7, 0x008e, 2}, + {0, 5, 0x008a, 2}, + {0, -8, 0x008e, 2}, + {0, 4, 0x008c, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kSweepingLadyDmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_Lumberjacks(int k) { // 8dc51b + static const uint16 kLumberJackMsg[4] = {0x12c, 0x12d, 0x12e, 0x12d}; + Lumberjacks_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Lumberjack_CheckProximity(k, 0)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); + } + if (!Sprite_CheckIfLinkIsBusy() && Lumberjack_CheckProximity(k, 1) && (filtered_joypad_L & 0x80)) { + int msg = (BYTE(link_x_coord) >= sprite_x_lo[k]) + (link_sword_type >= 2) * 2; + Sprite_ShowMessageUnconditional(kLumberJackMsg[msg]); + } + sprite_graphics[k] = frame_counter >> 5 & 1; +} + +bool Lumberjack_CheckProximity(int k, int j) { // 8dc58f + static const uint8 kLumberJacks_X[2] = {48, 52}; + static const uint8 kLumberJacks_Y[2] = {19, 20}; + static const uint8 kLumberJacks_W[2] = {98, 106}; + static const uint8 kLumberJacks_H[2] = {37, 40}; + return (uint16)(cur_sprite_x - link_x_coord + kLumberJacks_X[j]) < kLumberJacks_W[j] && + (uint16)(cur_sprite_y - link_y_coord + kLumberJacks_Y[j]) < kLumberJacks_H[j]; +} + +void Lumberjacks_Draw(int k) { // 8dc6ba + static const DrawMultipleData kLumberJacks_Dmd[33] = { + {-23, 5, 0x02be, 0}, + {-15, 5, 0x02bf, 0}, + { -7, 5, 0x02bf, 0}, + { 1, 5, 0x02bf, 0}, + { 9, 5, 0x02bf, 0}, + { 17, 5, 0x02bf, 0}, + { 25, 5, 0x42be, 0}, + {-32, -8, 0x40a8, 2}, + {-32, 4, 0x40a6, 2}, + { 30, -8, 0x00a8, 2}, + { 31, 4, 0x00a4, 2}, + {-19, 5, 0x02be, 0}, + {-11, 5, 0x02bf, 0}, + { -3, 5, 0x02bf, 0}, + { 5, 5, 0x02bf, 0}, + { 13, 5, 0x02bf, 0}, + { 21, 5, 0x02bf, 0}, + { 29, 5, 0x42be, 0}, + {-31, -8, 0x40a8, 2}, + {-32, 4, 0x40a4, 2}, + { 31, -8, 0x00a8, 2}, + { 31, 4, 0x00a6, 2}, + {-19, 5, 0x02be, 0}, + {-11, 5, 0x02bf, 0}, + { -3, 5, 0x02bf, 0}, + { 5, 5, 0x02bf, 0}, + { 13, 5, 0x02bf, 0}, + { 21, 5, 0x02bf, 0}, + { 29, 5, 0x42be, 0}, + {-32, -8, 0x400e, 2}, + {-32, 4, 0x40a4, 2}, + { 32, -8, 0x000e, 2}, + { 31, 4, 0x00a6, 2}, + }; + Sprite_DrawMultiple(k, &kLumberJacks_Dmd[sprite_graphics[k] * 11], 11, NULL); +} + +void Sprite_FortuneTeller(int k) { // 8dc762 + switch (sprite_subtype2[k]) { + case 0: // fortuneteller main + FortuneTeller_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + FortuneTeller_LightOrDarkWorld(k, savegame_is_darkworld >> 6 & 1); + break; + case 1: // dwarf solidity + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + link_speed_setting = 0; + Link_CancelDash(); + } + break; + } +} + +void FortuneTeller_PerformPseudoScience(int k) { // 8dc849 + sprite_graphics[k] = 0; + sprite_ai_state[k]++; + + static const uint8 kFortuneTeller_Readings[16] = {0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd}; + + uint8 slots[2] = { 0, 0 }; + int n = 0; +#define ADD_MSG(q) { slots[n++]=(q); if (n==2) goto done; } + + if (savegame_map_icons_indicator < 3) + goto done; + if (!link_item_book_of_mudora) ADD_MSG(2); + if (!(link_which_pendants & 2)) ADD_MSG(1); + if (link_item_mushroom < 2) ADD_MSG(3); + if (!link_item_flippers) ADD_MSG(4); + if (!link_item_moon_pearl) ADD_MSG(5); + if (sram_progress_indicator < 3) ADD_MSG(6); + if (!link_magic_consumption) ADD_MSG(7); + if (!link_item_bombos_medallion) ADD_MSG(8); + if (!(sram_progress_indicator_3 & 0x10)) ADD_MSG(9); + if (!(sram_progress_indicator_3 & 0x20)) ADD_MSG(10); + if (!link_item_cape) ADD_MSG(11); + if (!(save_ow_event_info[0x5b] & 2)) ADD_MSG(12); + if (link_sword_type < 4) ADD_MSG(13); + ADD_MSG(14); + ADD_MSG(15); +done: + + int j = ((sram_progress_flags ^= 0x40) & 0x40) != 0; + Sprite_ShowMessageUnconditional(kFortuneTeller_Readings[slots[j]]); +} + +void FortuneTeller_Draw(int k) { // 8dcb01 + static const DrawMultipleData kFortuneTeller_Dmd[12] = { + { 0, -48, 0x000c, 2}, + { 0, -32, 0x002c, 0}, + { 8, -32, 0x402c, 0}, + { 0, -48, 0x000a, 2}, + { 0, -32, 0x002a, 0}, + { 8, -32, 0x402a, 0}, + {-4, -40, 0x0066, 2}, + { 4, -40, 0x4066, 2}, + {-4, -40, 0x0066, 2}, + {-4, -40, 0x0068, 2}, + { 4, -40, 0x4068, 2}, + {-4, -40, 0x0068, 2}, + }; + int j = (savegame_is_darkworld >> 6 & 1) * 2 + sprite_graphics[k]; + Sprite_DrawMultiple(k, &kFortuneTeller_Dmd[j * 3], 3, NULL); +} + +void Smithy_SpawnDumbBarrierSprite(int k) { // 8dcb2a + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x31, &info); + if (j < 0) + return; + Sprite_SetX(j, info.r0_x); + Sprite_SetY(j, info.r2_y); + sprite_subtype2[j] = 1; + sprite_flags4[j] = 0; + sprite_ignore_projectile[j] = 1; +} + +void Sprite_MazeGameLady(int k) { // 8dcb5c + Lady_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + switch (sprite_ai_state[k]) { + case 0: // startup + if (sprite_x_lo[k] < BYTE(link_x_coord)) { + int j = Sprite_ShowMessageOnContact(k, 0xcc); + if (j & 0x100) { + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + sprite_ai_state[k] = 1; + word_7FFE00 = 0; + word_7FFE02 = 0; + sprite_A[k] = 0; + flag_overworld_area_did_change = 0; + } + } else { + Sprite_ShowMessageOnContact(k, 0xd0); + } + break; + case 1: // sound + SpriteSfx_QueueSfx3WithPan(k, 0x7); + sprite_ai_state[k] = 2; + break; + case 2: // accumulate time + if (++sprite_A[k] == 63) { + sprite_A[k] = 0; + word_7FFE00 += 1; + if (word_7FFE00 == 0) + word_7FFE02++; + } + break; + } +} + +void Sprite_MazeGameGuy(int k) { // 8dcbf2 + int j; + MazeGameGuy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = 0; + Sprite_BehaveAsBarrier(k); + sprite_graphics[k] = frame_counter >> 3 & 1; + if (flag_overworld_area_did_change) { + Sprite_ShowMessageOnContact(k, 0xd0); + return; + } + switch (sprite_ai_state[k]) { + case 0: { // parse time + word_7FFE04 = word_7FFE00; + word_7FFE06 = word_7FFE02; + int t = word_7FFE04 % 6000; + int a = t / 600; + t %= 600; + int b = t / 60; + t %= 60; + int c = t / 10; + t %= 10; + byte_7E1CF2[0] = t | c << 4; + byte_7E1CF2[1] = b | a << 4; + t = Sprite_ShowMessageOnContact(k, 0xcb); + if (t & 0x100) { + sprite_D[k] = sprite_head_dir[k] = (uint8)t; + sprite_ai_state[k] = 1; + } + break; + } + case 1: // check qualify + if (save_ow_event_info[BYTE(overworld_screen_index)] & 0x40) { + Sprite_ShowMessageUnconditional(0xcf); + sprite_ai_state[k] = 4; + } else if (word_7FFE04 < 16) { + Sprite_ShowMessageUnconditional(0xcd); + sprite_D[k] = sprite_head_dir[k] = (uint8)link_player_handler_state; // wtf + sprite_ai_state[k] = 3; + } else { + Sprite_ShowMessageUnconditional(0xce); + sprite_D[k] = sprite_head_dir[k] = (uint8)link_player_handler_state; // wtf + sprite_ai_state[k] = 2; + } + break; + case 2: // sorry + j = Sprite_ShowMessageOnContact(k, 0xce); + if (j & 0x100) + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + break; + case 3: // can have it + j = Sprite_ShowSolicitedMessage(k, 0xcd); + if (j & 0x100) + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + break; + case 4: // nothing more + j = Sprite_ShowSolicitedMessage(k, 0xcf); + if (j & 0x100) + sprite_D[k] = sprite_head_dir[k] = (uint8)j; + break; + } +} + +void MazeGameGuy_Draw(int k) { // 8dcda7 + static const DrawMultipleData kMazeGameGuy_Dmd[16] = { + {0, -10, 0x0000, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x0000, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x0000, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x0000, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x4002, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x4002, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x0002, 2}, + {0, 0, 0x0020, 2}, + {0, -10, 0x0002, 2}, + {0, 0, 0x0020, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kMazeGameGuy_Dmd[sprite_graphics[k] * 2 + sprite_D[k] * 4], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void CrystalMaiden_Draw(int k) { // 8dce5f + int j = sprite_D[k] * 2 + sprite_graphics[k]; + BYTE(dma_var6) = kCrystalMaiden_Dma[j * 2 + 0]; + BYTE(dma_var7) = kCrystalMaiden_Dma[j * 2 + 1]; + Sprite_DrawMultiplePlayerDeferred(k, kCrystalMaiden_SpriteData + j * 2, 2, NULL); +} + +void Priest_Draw(int k) { // 8dcf31 + int j = sprite_D[k] * 2 + sprite_graphics[k]; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, kPriest_Dmd + j * 2, 2, &info); + SpriteDraw_Shadow(k, &info); +} + +uint8 FluteBoy_Draw(int k) { // 8dcfd9 + static const DrawMultipleData kFluteBoy_Dmd[16] = { + {-1, -1, 0x0abe, 0}, + { 0, 0, 0x0aaa, 2}, + { 0, -10, 0x0aa8, 2}, + { 0, 0, 0x0aaa, 2}, + {-1, -1, 0x0abe, 0}, + { 0, 8, 0x0abf, 0}, + { 0, -10, 0x0aa8, 2}, + { 0, 0, 0x0aaa, 2}, + {-1, -1, 0x0abe, 0}, + { 0, 0, 0x0aaa, 2}, + { 0, -10, 0x0aa8, 2}, + { 0, 0, 0x0aaa, 2}, + {-1, -1, 0x0abe, 0}, + { 0, 8, 0x0abf, 0}, + { 0, -10, 0x0aa8, 2}, + { 0, 0, 0x0aaa, 2}, + }; + Oam_AllocateFromRegionB(0x10); + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kFluteBoy_Dmd[sprite_D[k] * 8 + sprite_graphics[k] * 4], 4, &info); + return (info.x | info.y) >> 8; +} + +void FluteAardvark_Draw(int k) { // 8dd040 + static const DrawMultipleData kFluteAardvark_Dmd[8] = { + {0, -16, 0x06e6, 2}, + {0, -8, 0x06c8, 2}, + {0, -16, 0x06e6, 2}, + {0, -8, 0x06ca, 2}, + {0, -16, 0x06e8, 2}, + {0, -8, 0x06ca, 2}, + {0, -16, 0x00cc, 2}, + {0, -8, 0x00dc, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kFluteAardvark_Dmd[sprite_graphics[k] * 2], 2, NULL); +} + +void DustCloud_Draw(int k) { // 8dd120 + static const DrawMultipleData kDustCloud_Dmd[24] = { + { 0, -3, 0x008b, 0}, + { 3, 0, 0x009b, 0}, + {-3, 0, 0xc08b, 0}, + { 0, 3, 0xc09b, 0}, + { 0, -5, 0x008a, 2}, + { 5, 0, 0x008a, 2}, + {-5, 0, 0x008a, 2}, + { 0, 5, 0x008a, 2}, + { 0, -7, 0x0086, 2}, + { 7, 0, 0x0086, 2}, + {-7, 0, 0x0086, 2}, + { 0, 7, 0x0086, 2}, + { 0, -9, 0x8086, 2}, + { 9, 0, 0x8086, 2}, + {-9, 0, 0x8086, 2}, + { 0, 9, 0x8086, 2}, + { 0, -9, 0xc086, 2}, + { 9, 0, 0xc086, 2}, + {-9, 0, 0xc086, 2}, + { 0, 9, 0xc086, 2}, + { 0, -7, 0x4086, 2}, + { 7, 0, 0x4086, 2}, + {-7, 0, 0x4086, 2}, + { 0, 7, 0x4086, 2}, + }; + sprite_oam_flags[k] = 0x14; + Sprite_DrawMultiple(k, &kDustCloud_Dmd[sprite_graphics[k] * 4], 4, NULL); +} + +void MedallionTablet_Draw(int k) { // 8dd1e2 + static const DrawMultipleData kMedallionTablet_Dmd[20] = { + {-8, -16, 0x008c, 2}, + { 8, -16, 0x408c, 2}, + {-8, 0, 0x00ac, 2}, + { 8, 0, 0x40ac, 2}, + {-8, -13, 0x008a, 2}, + { 8, -13, 0x408a, 2}, + {-8, 0, 0x00ac, 2}, + { 8, 0, 0x40ac, 2}, + {-8, -8, 0x008a, 2}, + { 8, -8, 0x408a, 2}, + {-8, 0, 0x00ac, 2}, + { 8, 0, 0x40ac, 2}, + {-8, -4, 0x008a, 2}, + { 8, -4, 0x408a, 2}, + {-8, 0, 0x00aa, 2}, + { 8, 0, 0x40aa, 2}, + {-8, 0, 0x00aa, 2}, + { 8, 0, 0x40aa, 2}, + {-8, 0, 0x00aa, 2}, + { 8, 0, 0x40aa, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kMedallionTablet_Dmd[sprite_graphics[k] * 4], 4, NULL); +} + +void Uncle_Draw(int k) { // 8dd391 + Oam_AllocateFromRegionB(0x18); + const DrawMultipleData *src = &kUncleDraw_Table[sprite_D[k] * 12 + sprite_graphics[k] * 6]; + + int j = sprite_D[k] * 2 + sprite_graphics[k]; + link_dma_var3 = kUncleDraw_Dma3[j]; + link_dma_var4 = kUncleDraw_Dma4[j]; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, src, 6, &info); + + if (sprite_D[k] != 0 && sprite_D[k] != 3) + SpriteDraw_Shadow(k, &info); +} + +void BugNetKid_Draw(int k) { // 8dd47b + static const DrawMultipleData kBugNetKid_Dmd[18] = { + { 4, 0, 0x0027, 0}, + { 0, -5, 0x000e, 2}, + {-8, 6, 0x040a, 2}, + { 8, 6, 0x440a, 2}, + {-8, 14, 0x840a, 2}, + { 8, 14, 0xc40a, 2}, + { 0, -5, 0x000e, 2}, + { 0, -5, 0x000e, 2}, + {-8, 6, 0x040a, 2}, + { 8, 6, 0x440a, 2}, + {-8, 14, 0x840a, 2}, + { 8, 14, 0xc40a, 2}, + { 0, -5, 0x002e, 2}, + { 0, -5, 0x002e, 2}, + {-8, 7, 0x040a, 2}, + { 8, 7, 0x440a, 2}, + {-8, 14, 0x840a, 2}, + { 8, 14, 0xc40a, 2}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kBugNetKid_Dmd[sprite_graphics[k] * 6], 6, NULL); +} + +void Bomber_Draw(int k) { // 8dd56c + static const DrawMultipleData kBomber_Dmd[22] = { + { 0, 0, 0x40c6, 2}, + { 0, 0, 0x40c6, 2}, + { 0, 0, 0x40c4, 2}, + { 0, 0, 0x40c4, 2}, + { 0, 0, 0x00c6, 2}, + { 0, 0, 0x00c6, 2}, + { 0, 0, 0x00c4, 2}, + { 0, 0, 0x00c4, 2}, + {-8, 0, 0x00c0, 2}, + { 8, 0, 0x40c0, 2}, + {-8, 0, 0x00c2, 2}, + { 8, 0, 0x40c2, 2}, + {-8, 0, 0x00e0, 2}, + { 8, 0, 0x40e0, 2}, + {-8, 0, 0x00e2, 2}, + { 8, 0, 0x40e2, 2}, + {-8, 0, 0x00e4, 2}, + { 8, 0, 0x40e4, 2}, + { 0, 0, 0x40e6, 2}, + { 0, 0, 0x40e6, 2}, + { 0, 0, 0x00e6, 2}, + { 0, 0, 0x00e6, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kBomber_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void SpriteDraw_ZirroBomb(int k) { // 8dd606 + static const DrawMultipleData kBomberPellet_Dmd[15] = { + {-11, 0, 0x019b, 0}, + { 0, -8, 0xc19b, 0}, + { 6, 6, 0x419b, 0}, + {-15, -6, 0x018a, 2}, + { -4, -14, 0x018a, 2}, + { 2, 0, 0x018a, 2}, + {-15, -6, 0x0186, 2}, + { -4, -14, 0x0186, 2}, + { 2, 0, 0x0186, 2}, + { -4, -4, 0x0186, 2}, + { -4, -4, 0x0186, 2}, + { -4, -4, 0x0186, 2}, + { -4, -4, 0x01aa, 2}, + { -4, -4, 0x01aa, 2}, + { -4, -4, 0x01aa, 2}, + }; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + Sprite_DrawMultiple(k, &kBomberPellet_Dmd[(sprite_delay_main[k] >> 2) * 3], 3, NULL); +} + +void PlayerBee_HoneInOnTarget(int j, int k) { // 8dd631 + if (sprite_type[j] != 0x88 && (sprite_flags[j] & 2)) + return; + uint16 x = Sprite_GetX(j); + uint16 y = Sprite_GetY(j); + if ((uint16)(cur_sprite_x - x + 16) >= 24 || + (uint16)(cur_sprite_y - y - 8) >= 24) + return; + if (sprite_type[j] == 0x75) { + sprite_E[j] = k + 1; + return; + } + Ancilla_CheckDamageToSprite_preset(j, 1); + sprite_F[j] = 15; + sprite_x_recoil[j] = sprite_x_vel[k] << 1; + sprite_y_recoil[j] = sprite_y_vel[k] << 1; + sprite_B[k]++; +} + +void Pikit_Draw(int k) { // 8dd6e6 + static const DrawMultipleData kPikit_Dmd[8] = { + { 0, 0, 0x00c8, 2}, + { 0, 0, 0x00c8, 2}, + { 0, 0, 0x00ca, 2}, + { 0, 0, 0x00ca, 2}, + {-8, 0, 0x00cc, 2}, + { 8, 0, 0x40cc, 2}, + {-8, 0, 0x00ce, 2}, + { 8, 0, 0x40ce, 2}, + }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteDraw_Pikit_Tongue(k, &info); + OamEnt *oam = GetOamCurPtr(); + tmp_counter = oam->x; + byte_7E0FB6 = oam->y; + oam_cur_ptr += 24; + oam_ext_cur_ptr += 6; + Sprite_DrawMultiple(k, &kPikit_Dmd[sprite_graphics[k] * 2], 2, &info); + uint8 bak = sprite_flags2[k]; + sprite_flags2[k] -= 6; + SpriteDraw_Shadow(k, &info); + sprite_flags2[k] = bak; + SpriteDraw_Pikit_Loot(k, &info); +} + +void SpriteDraw_Pikit_Tongue(int k, PrepOamCoordsRet *info) { // 8dd74a + static const uint8 kPikit_TongueMult[4] = {0x33, 0x66, 0x99, 0xcc}; + static const uint8 kPikit_Draw_Char[8] = {0xee, 0xfd, 0xed, 0xfd, 0xee, 0xfd, 0xed, 0xfd}; + static const uint8 kPikit_Draw_Flags[8] = {0, 0, 0, 0x40, 0x40, 0xc0, 0x80, 0x80}; + if (sprite_ai_state[k] != 2 || sprite_pause[k]) + return; + OamEnt *oam = GetOamCurPtr(); + int x = info->x + 4, y = info->y + 3; + oam[5].x = x; + oam[5].y = y; + oam[0].x = x + sprite_A[k]; + oam[0].y = y + sprite_B[k]; + oam[0].charnum = oam[5].charnum = 0xfe; + oam[0].flags = oam[5].flags = info->flags; + oam++; + int g = sprite_D[k]; + for (int i = 3; i >= 0; i--, oam++) { + oam->x = x + (int8)sprite_A[k] * kPikit_TongueMult[i] / 256; + oam->y = y + (int8)sprite_B[k] * kPikit_TongueMult[i] / 256; + oam->charnum = kPikit_Draw_Char[g]; + oam->flags = kPikit_Draw_Flags[g] | info->flags; + } + Sprite_CorrectOamEntries(k, 5, 0); +} + +void SpriteDraw_Pikit_Loot(int k, PrepOamCoordsRet *info) { // 8dd858 + static const int8 kPikit_DrawGrabbedItem_X[20] = { + -4, 4, -4, 4, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, -4, 4, -4, 4, + }; + static const int8 kPikit_DrawGrabbedItem_Y[20] = { + -4, -4, 4, 4, -4, -4, 4, 4, -4, -4, 4, 4, -4, -4, 4, 4, -4, -4, 4, 4, + }; + static const uint8 kPikit_DrawGrabbedItem_Char[20] = { + 0x6e, 0x6f, 0x7e, 0x7f, 0x63, 0x7c, 0x73, 0x7c, 0xb, 0x7c, 0x1b, 0x7c, 0xec, 0xf9, 0xfc, 0xf9, + 0xea, 0xeb, 0xfa, 0xfb, + }; + static const uint8 kPikit_DrawGrabbedItem_Flags[5] = {0x24, 0x24, 0x28, 0x29, 0x2f}; + if (!sprite_G[k]) + return; + int g = sprite_G[k] - 1; + if (g == 3) + g = sprite_subtype[k] + 2; + Oam_AllocateFromRegionC(0x10); + OamEnt *oam = GetOamCurPtr(); + for (int i = 3; i >= 0; i--, oam++) { + int j = g * 4 + i; + oam->x = tmp_counter + kPikit_DrawGrabbedItem_X[j]; + oam->y = byte_7E0FB6 + kPikit_DrawGrabbedItem_Y[j]; + oam->charnum = kPikit_DrawGrabbedItem_Char[j]; + oam->flags = kPikit_DrawGrabbedItem_Flags[g]; + } + Sprite_CorrectOamEntries(k, 3, 0); +} + +void Kholdstare_Draw(int k) { // 8dd98f + static const DrawMultipleData kKholdstare_Dmd[16] = { + {-8, -8, 0x0080, 2}, + { 8, -8, 0x0082, 2}, + {-8, 8, 0x00a0, 2}, + { 8, 8, 0x00a2, 2}, + {-7, -7, 0x0080, 2}, + { 7, -7, 0x0082, 2}, + {-7, 7, 0x00a0, 2}, + { 7, 7, 0x00a2, 2}, + {-7, -7, 0x0084, 2}, + { 7, -7, 0x0086, 2}, + {-7, 7, 0x00a4, 2}, + { 7, 7, 0x00a6, 2}, + {-8, -8, 0x0084, 2}, + { 8, -8, 0x0086, 2}, + {-8, 8, 0x00a4, 2}, + { 8, 8, 0x00a6, 2}, + }; + static const int8 kKholdstare_Draw_X[16] = {8, 7, 4, 2, 0, -2, -4, -7, -8, -7, -4, -2, 0, 2, 4, 7}; + static const int8 kKholdstare_Draw_Y[16] = {0, 2, 4, 7, 8, 7, 4, 2, 0, -2, -4, -7, -8, -7, -4, -2}; + static const uint8 kKholdstare_Draw_Char[16] = {0xac, 0xac, 0xaa, 0x8c, 0x8c, 0x8c, 0xaa, 0xac, 0xac, 0xaa, 0xaa, 0x8c, 0x8c, 0x8c, 0xaa, 0xac}; + static const uint8 kKholdstare_Draw_Flags[16] = {0x40, 0x40, 0x40, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int j = sprite_A[k]; + uint16 x = info.x + kKholdstare_Draw_X[j]; + uint16 y = info.y + kKholdstare_Draw_Y[j]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kKholdstare_Draw_Char[j]; + oam->flags = kKholdstare_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + oam_cur_ptr += 4, oam_ext_cur_ptr += 1; + Sprite_DrawMultiple(k, &kKholdstare_Dmd[sprite_graphics[k] * 4], 4, &info); +} + +int Sprite_SpawnFireball(int k) { // 8dda06 + SpriteSpawnInfo info; + SpriteSfx_QueueSfx3WithPan(k, 0x19); + int j = Sprite_SpawnDynamicallyEx(k, 0x55, &info, 13); + if (j < 0) + return j; + Sprite_SetX(j, info.r0_x + 4); + Sprite_SetY(j, info.r2_y + 4 - info.r4_z); + + sprite_flags3[j] = sprite_flags3[j] & 0xfe | 0x40; + sprite_oam_flags[j] = 6; + sprite_flags4[j] = 0x54; + sprite_E[j] = 0x54; + sprite_flags2[j] = 0x20; + Sprite_ApplySpeedTowardsLink(j, 0x20); + sprite_delay_main[j] = 20; + sprite_delay_aux1[j] = 16; + sprite_flags5[j] = 0; + sprite_defl_bits[j] = 0x48; + return j; +} + +void ArcheryGameGuy_Draw(int k) { // 8ddac4 + static const int8 kArcheryGameGuy_Draw_X[15] = {0, 0, 0, 0, 0, -5, 0, -1, -1, 0, 0, 0, 0, 1, 1}; + static const int8 kArcheryGameGuy_Draw_Y[15] = {0, -10, -10, 0, -10, -3, 0, -10, -10, 0, -10, -10, 0, -10, -10}; + static const uint8 kArcheryGameGuy_Draw_Char[15] = {0x26, 6, 6, 8, 6, 0x3a, 0x26, 6, 6, 0x26, 6, 6, 0x26, 6, 6}; + static const uint8 kArcheryGameGuy_Draw_Flags[15] = {8, 6, 6, 8, 6, 8, 8, 6, 6, 8, 6, 6, 8, 6, 6}; + static const uint8 kArcheryGameGuy_Draw_Ext[15] = {2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2}; + + Oam_AllocateDeferToPlayer(k); + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 2; i >= 0; i--, oam++) { + int j = g * 3 + i; + oam->x = info.x + kArcheryGameGuy_Draw_X[j]; + oam->y = info.y + kArcheryGameGuy_Draw_Y[j]; + oam->charnum = kArcheryGameGuy_Draw_Char[j]; + oam->flags = kArcheryGameGuy_Draw_Flags[j] | info.flags; + bytewise_extended_oam[oam - oam_buf] = kArcheryGameGuy_Draw_Ext[j]; + } + SpriteDraw_Shadow(k, &info); +} + +void ShopKeeper_RapidTerminateReceiveItem() { // 8ffaea + for (int i = 4; i >= 0; i--) { + if (ancilla_type[i] == 0x22) + ancilla_aux_timer[i] = 1; + } +} + +void Sprite_InitializeSecondaryItemMinigame(int what) { // 8ffd86 + byte_7E03FC = what; + Link_ResetProperties_C(); + for (int k = 4; k >= 0; k--) { + if (ancilla_type[k] == 0x30 || ancilla_type[k] == 0x31) { + ancilla_type[k] = 0; + } else if (ancilla_type[k] == 5) { + flag_for_boomerang_in_place = 0; + ancilla_type[k] = 0; + } + } +} + +void Waterfall(int k) { // 9af5b8 + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + if (BYTE(overworld_screen_index) == 0x43) + AncillaAdd_GTCutscene(); + else + AncillaAdd_WaterfallSplash(); + } +} + +void Sprite_BatCrash(int k) { // 9af5d9 + static const uint16 kRetreatBat_Xpos[4] = {0x7dc, 0x7f0, 0x820, 0x818}; + static const uint16 kRetreatBat_Ypos[4] = {0x62e, 0x636, 0x630, 0x5e0}; + static const uint8 kRetreatBat_Delay[5] = {4, 3, 4, 6, 0}; + int j; + RetreatBat_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + BatCrash_DrawHardcodedGarbage(k); + bg1_y_offset = 0; + if (sprite_delay_aux3[k]) { + if (sprite_delay_aux3[k] == 1) + sound_effect_ambient = 5; + bg1_y_offset = sprite_delay_aux3[k] & 1 ? 1 : -1; + } + if (!sprite_delay_main[k]) { + sprite_graphics[k] = sprite_graphics[k] + 1 & 3; + if (sprite_graphics[k] == 0 && sprite_ai_state[k] < 2) + SpriteSfx_QueueSfx2WithPan(k, 0x3); + sprite_delay_main[k] = kRetreatBat_Delay[sprite_D[k]]; + } + switch(sprite_ai_state[k]) { + case 0: { + j = sprite_A[k]; + if (kRetreatBat_Xpos[j] < cur_sprite_x) { + if (j >= 2) { + sprite_ai_state[k]++; + sprite_delay_aux1[k] = 208; + } + sprite_A[k]++; + sprite_D[k]++; + } +update_pos: + if (!(frame_counter & 7)) + sprite_y_vel[k] += (kRetreatBat_Ypos[j] >= cur_sprite_y) ? 1 : -1; + if (!(frame_counter & 15)) + sprite_x_vel[k]++; + break; + } + case 1: + if (!sprite_delay_aux1[k]) { + sprite_ai_state[k]++; + SpriteSfx_QueueSfx3WithPan(k, 0x26); + sprite_D[k]++; + sprite_x_lo[k] = 232; + sprite_x_hi[k] = 7; + sprite_y_lo[k] = 224; + sprite_y_hi[k] = 5; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 64; + sprite_delay_aux1[k] = 45; + } else { + if (!(frame_counter & 3)) + sprite_x_vel[k]--; + j = sprite_A[k]; + goto update_pos; + } + break; + case 2: + if (!sprite_delay_aux1[k]) { + sprite_y_vel[k] = 0; + sprite_delay_aux1[k] = 96; + sprite_ai_state[k]++; + } + if (sprite_delay_aux1[k] == 9) { + BatCrash_SpawnDebris(k); + CreatePyramidHole(); + } + break; + case 3: // Finishing Up + if (!sprite_delay_aux1[k]) { + sprite_state[k] = 0; + overworld_map_state++; + } + break; + } +} + +void Sprite_SpawnBatCrashCutscene() { // 9af6f5 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(0, 0x37, &info); + if (j >= 0) { + sprite_y_vel[j] = 0; + sprite_B[j] = 0; + sprite_D[j] = 0; + sprite_floor[j] = 0; + sprite_subtype2[j] = 1; + sprite_flags2[j] = 1; + sprite_flags3[j] = 1; + sprite_oam_flags[j] = 1; + sprite_x_lo[j] = 204; + sprite_x_hi[j] = 7; + sprite_y_lo[j] = 50; + sprite_y_hi[j] = 6; + sprite_defl_bits[j] = 128; + } +} + +void BatCrash_DrawHardcodedGarbage(int k) { // 9af750 + static const OamEntSigned kRetreatBat_Oams[8] = { + { 104, -105, 0x57, 0x01}, + { 120, -105, 0x57, 0x01}, + {-120, -105, 0x57, 0x01}, + { 104, -89, 0x57, 0x01}, + { 120, -89, 0x57, 0x01}, + {-120, -89, 0x57, 0x01}, + { 101, -112, 0x57, 0x01}, + {-117, -112, 0x57, 0x01}, + }; + memcpy(oam_buf + 76, kRetreatBat_Oams, 32); + for (int i = 0; i < 9; i++) // wtf 9 + bytewise_extended_oam[i + 76] = 2; +} + +void BatCrash_SpawnDebris(int k) { // 9af7e5 + static const int8 kPyramidDebris_X[30] = { + -8, 0, 8, 16, 24, 32, -8, 0, 8, 16, 24, 32, -8, 0, 8, 16, + 24, 32, -8, 0, 8, 16, 24, 32, -8, 0, 8, 16, 24, 32, + }; + static const int8 kPyramidDebris_Y[30] = { + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + }; + static const int8 kPyramidDebris_Xvel[30] = { + -30, -25, -8, 8, 25, 30, -50, -45, -20, 20, 45, 50, -50, -35, -25, 25, + 35, 50, -45, -50, -60, 60, 50, 45, -30, -35, -40, 40, 35, 30, + }; + static const int8 kPyramidDebris_Yvel[30] = { + 2, 5, 10, 10, 5, 2, 5, 20, 30, 30, 20, 5, 10, 30, 40, 40, + 30, 10, -20, -40, -60, -60, -40, -20, -10, -20, -40, -40, -20, -10, + }; + for (int j = 29; j >= 0; j--) { + GarnishSpawn_PyramidDebris(kPyramidDebris_X[j], kPyramidDebris_Y[j], kPyramidDebris_Xvel[j], kPyramidDebris_Yvel[j]); + } + sprite_delay_aux3[k] = 32; +} + +void RetreatBat_Draw(int k) { // 9af833 + static const DrawMultipleData kRetreatBat_Dmds[18] = { + { 0, 0, 0x044b, 0}, + { 5, -4, 0x045b, 0}, + {-2, -4, 0x0464, 2}, + {-2, -4, 0x0449, 2}, + {-8, -9, 0x046c, 2}, + { 8, -9, 0x446c, 2}, + {-8, -7, 0x044c, 2}, + { 8, -7, 0x444c, 2}, + {-8, -9, 0x0444, 2}, + { 8, -9, 0x4444, 2}, + {-8, -8, 0x0462, 2}, + { 8, -8, 0x4462, 2}, + {-8, -7, 0x0460, 2}, + { 8, -7, 0x4460, 2}, + { 0, 0, 0x044e, 2}, + {16, 0, 0x444e, 2}, + { 0, 16, 0x046e, 2}, + {16, 16, 0x446e, 2}, + }; + static const uint8 kOffs[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 6, 6, 8, 10, 12, 10, 14, 14, 14, 14}; + static const uint8 kCount[20] = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, }; + oam_cur_ptr = 0x960; + oam_ext_cur_ptr = 0xa78; + int j = sprite_D[k] * 4 + sprite_graphics[k]; + Sprite_DrawMultiple(k, &kRetreatBat_Dmds[kOffs[j]], kCount[j], NULL); +} + +void DrinkingGuy_Draw(int k) { // 9af88c + static const DrawMultipleData kDrinkingGuy_Dmd[6] = { + {8, 2, 0x00ae, 0}, + {0, -9, 0x0822, 2}, + {0, 0, 0x0006, 2}, + {7, 0, 0x00af, 0}, + {0, -9, 0x0822, 2}, + {0, 0, 0x0006, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kDrinkingGuy_Dmd[sprite_graphics[k] * 3], 3, &info); + SpriteDraw_Shadow(k, &info); +} + +void Lady_Draw(int k) { // 9af92c + static const DrawMultipleData kLadyDmd[16] = { + {0, -8, 0x00e0, 2}, + {0, 0, 0x00e8, 2}, + {0, -7, 0x00e0, 2}, + {0, 1, 0x40e8, 2}, + {0, -8, 0x00c0, 2}, + {0, 0, 0x00c2, 2}, + {0, -7, 0x00c0, 2}, + {0, 1, 0x40c2, 2}, + {0, -8, 0x00e2, 2}, + {0, 0, 0x00e4, 2}, + {0, -7, 0x00e2, 2}, + {0, 1, 0x00e6, 2}, + {0, -8, 0x40e2, 2}, + {0, 0, 0x40e4, 2}, + {0, -7, 0x40e2, 2}, + {0, 1, 0x40e6, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kLadyDmd[sprite_graphics[k] * 2 + sprite_D[k] * 4], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Lanmola_SpawnShrapnel(int k) { // 9af981 + static const int8 kLanmolaShrapnel_Yvel[8] = {28, -28, 28, -28, 0, 36, 0, -36}; + static const int8 kLanmolaShrapnel_Xvel[8] = {-28, -28, 28, 28, -36, 0, 36, 0}; + + tmp_counter = (sprite_state[0] + sprite_state[1] + sprite_state[2]) < 10 ? 7 : 3; + do { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xC2, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_lo[j] = info.r0_x + 4; + sprite_y_lo[j] = info.r2_y + 4; + sprite_ignore_projectile[j] = 1; + sprite_bump_damage[j] = 1; + sprite_flags4[j] = 1; + sprite_z[j] = 0; + sprite_flags2[j] = 0x20; + sprite_x_vel[j] = kLanmolaShrapnel_Xvel[tmp_counter]; + sprite_y_vel[j] = kLanmolaShrapnel_Yvel[tmp_counter]; + sprite_graphics[j] = GetRandomNumber() & 1; + } + } while (!sign8(--tmp_counter)); +} + +void Sprite_Cukeman(int k) { // 9afa0c + if (sprite_head_dir[k] == 0) + return; + + if (sprite_state[k] == 9 && !(submodule_index | flag_unk1) && + (uint16)(cur_sprite_x - link_x_coord + 0x18) < 0x30 && + (uint16)(link_y_coord - cur_sprite_y + 0x20) < 0x30 && + (filtered_joypad_L & 0x80)) { + dialogue_message_index = 0x17a + (sprite_subtype[k]++ & 1); + Sprite_ShowMessageMinimal(); + } + + uint8 old = sprite_oam_flags[k] & 0xf0; + sprite_oam_flags[k] = old | 8; + Cukeman_Draw(k); + sprite_oam_flags[k] = old | 0xd; + Oam_AllocateFromRegionA(0x10); +} + +void Cukeman_Draw(int k) { // 9afb0e + static const DrawMultipleData kCukeman_Dmd[18] = { + { 0, 0, 0x01f3, 0}, + { 7, 0, 0x41f3, 0}, + { 4, 7, 0x07e0, 0}, + {-1, 2, 0x01f3, 0}, + { 6, 1, 0x41f3, 0}, + { 4, 8, 0x07e0, 0}, + { 1, 1, 0x01f3, 0}, + { 8, 2, 0x41f3, 0}, + { 4, 8, 0x07e0, 0}, + {-2, 0, 0x01f3, 0}, + {10, 0, 0x41f3, 0}, + { 4, 7, 0x07e0, 0}, + { 0, 0, 0x01f3, 0}, + { 8, 0, 0x41f3, 0}, + { 4, 6, 0x07e0, 0}, + {-5, 0, 0x01f3, 0}, + {16, 0, 0x41f3, 0}, + { 4, 8, 0x07e0, 0}, + }; + Sprite_DrawMultiple(k, &kCukeman_Dmd[sprite_graphics[k] * 3], 3, NULL); +} + +void RunningBoy_SpawnDustGarnish(int k) { // 9afb2c + if (++sprite_die_action[k] & 0xf) + return; + int j = GarnishAllocForce(); + garnish_type[j] = 20; + garnish_active = 20; + Garnish_SetX(j, Sprite_GetX(k) + 4); + Garnish_SetY(j, Sprite_GetY(k) + 28); + garnish_countdown[j] = 10; +} + +void MovableMantle_Draw(int k) { // 9afcb3 + Oam_AllocateFromRegionB(0x20); + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + for (int i = 5; i >= 0; i--, oam++) { + oam->x = kMovableMantle_X[i] + info.x; + oam->y = kMovableMantle_Y[i] + info.y; + oam->charnum = kMovableMantle_Char[i]; + oam->flags = kMovableMantle_Flags[i]; + } + Sprite_CorrectOamEntries(k, 5, 2); +} + +void Mothula_Draw(int k) { // 9afdb5 + static const DrawMultipleData kMothula_Dmd[24] = { + {-24, -8, 0x0080, 2}, + { -8, -8, 0x0082, 2}, + { 8, -8, 0x4082, 2}, + { 24, -8, 0x4080, 2}, + {-24, 8, 0x00a0, 2}, + { -8, 8, 0x00a2, 2}, + { 8, 8, 0x40a2, 2}, + { 24, 8, 0x40a0, 2}, + {-24, -8, 0x0084, 2}, + { -8, -8, 0x0086, 2}, + { 8, -8, 0x4086, 2}, + { 24, -8, 0x4084, 2}, + {-24, 8, 0x00a4, 2}, + { -8, 8, 0x00a6, 2}, + { 8, 8, 0x40a6, 2}, + { 24, 8, 0x40a4, 2}, + { -8, -8, 0x0088, 2}, + { -8, -8, 0x0088, 2}, + { 8, -8, 0x4088, 2}, + { 8, -8, 0x4088, 2}, + { -8, 8, 0x00a8, 2}, + { -8, 8, 0x00a8, 2}, + { 8, 8, 0x40a8, 2}, + { 8, 8, 0x40a8, 2}, + }; + oam_cur_ptr = 0x920; + oam_ext_cur_ptr = 0xa68; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kMothula_Dmd[sprite_graphics[k] * 8], 8, &info); + if (sprite_pause[k]) + return; + info.y += sprite_z[k]; + static const int8 kMothula_Draw_X[27] = { + 0, 3, 6, 9, 12, -3, -6, -9, -12, 0, 2, 4, 6, 8, -2, -4, + -6, -8, 0, 1, 2, 3, 4, -1, -2, -3, -4, + }; + OamEnt *oam = GetOamCurPtr() + 10; + int g = sprite_graphics[k]; + for (int i = 8; i >= 0; i--, oam++) { + uint16 x = info.x + kMothula_Draw_X[g * 9 + i]; + uint16 y = info.y + 16; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0x6c; + oam->flags = 0x24; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void BottleMerchant_BuyBee(int k) { // 9afe88 + static const int8 kBottleVendor_GoodBeeX[5] = {-6, -3, 0, 4, 7}; + static const int8 kBottleVendor_GoodBeeY[5] = {11, 14, 16, 14, 11}; + SpriteSpawnInfo info; + SpriteSfx_QueueSfx3WithPan(k, 0x13); + tmp_counter = 4; + do { + int j = Sprite_SpawnDynamically(k, 0xd8, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_lo[j] = info.r0_x + 4; + sprite_stunned[j] = 0xff; + sprite_x_vel[j] = kBottleVendor_GoodBeeX[tmp_counter]; + sprite_y_vel[j] = kBottleVendor_GoodBeeY[tmp_counter]; + sprite_z_vel[j] = 32; + sprite_delay_aux4[j] = 32; + } + } while (!sign8(--tmp_counter)); +} + +void Sprite_ChickenLady(int k) { // 9afed3 + sprite_D[k] = 1; + Lady_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k] == 1) { + dialogue_message_index = 0x17d; + Sprite_ShowMessageMinimal(); + } + sprite_graphics[k] = frame_counter >> 4 & 1; +} + +void Overworld_DrawWoodenDoor(uint16 pos, bool unlocked) { // 9bc952 + Overworld_DrawMap16_Persist(pos, unlocked ? 0xda5 : 0xda4); + Overworld_DrawMap16_Persist(pos+2, unlocked ? 0xda7 : 0xda6); + nmi_load_bg_from_vram = 1; +} + +void Sprite_D4_Landmine(int k) { // 9d8099 + static const uint8 kLandMine_OamFlags[4] = {4, 2, 8, 2}; + + Landmine_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!Landmine_CheckDetonationFromHammer(k)) { + if (!sprite_delay_main[k]) { + sprite_oam_flags[k] = 4; + if (Sprite_CheckDamageToLink(k)) + sprite_delay_main[k] = 8; + return; + } + if (sprite_delay_main[k] != 1) { + sprite_oam_flags[k] = kLandMine_OamFlags[sprite_delay_main[k] >> 1 & 3]; + return; + } + } + sprite_state[k] = 0; + int j = Sprite_SpawnBomb(k); + if (j >= 0) { + sprite_state[j] = 6; + sprite_C[j] = 2; + sprite_oam_flags[j] = 2; + sprite_flags4[j] = 9; + sprite_delay_aux1[j] = 31; + sprite_flags2[j] = 3; + sound_effect_1 = Sprite_CalculateSfxPan(k) | 12; + } +} + +void Landmine_Draw(int k) { // 9d810c + static const DrawMultipleData kLandmine_Dmd[2] = { + {0, 4, 0x0070, 0}, + {8, 4, 0x4070, 0}, + }; + Oam_AllocateFromRegionB(8); + if (byte_7E0FC6 >= 3) + return; + Sprite_DrawMultiple(k, kLandmine_Dmd, 2, NULL); +} + +void Sprite_D3_Stal(int k) { // 9d8129 + static const uint8 kStal_Gfx[5] = {2, 2, 1, 0, 1}; + if (byte_7E0FC6 < 3) { + if (!sprite_ai_state[k]) + Oam_AllocateFromRegionB(4); + Stal_Draw(k); + } + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // dormant + sprite_ignore_projectile[k] = 1; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 64; + SpriteSfx_QueueSfx2WithPan(k, 0x22); + } + } + if (sprite_delay_main[k] != 0) { + if (sprite_delay_main[k] - 1) { + sprite_hit_timer[k] = (sprite_delay_main[k] - 1) | 64; + } else { + sprite_ignore_projectile[k] = 0; + sprite_ai_state[k]++; + sprite_hit_timer[k] = 0; + sprite_flags3[k] &= ~0x40; + sprite_flags2[k] &= ~0x80; + } + } + break; + case 1: // active + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXYZ(k); + Sprite_CheckTileCollision(k); + sprite_z_vel[k]-=2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 16; + Sprite_ApplySpeedTowardsLink(k, 12); + } + if (!(frame_counter & 3) && ++sprite_subtype2[k] == 5) + sprite_subtype2[k] = 0; + sprite_graphics[k] = kStal_Gfx[sprite_subtype2[k]]; + break; + } +} + +void Stal_Draw(int k) { // 9d820c + static const DrawMultipleData kStal_Dmd[6] = { + {0, 0, 0x0044, 2}, + {4, 11, 0x0070, 0}, + {0, 0, 0x0044, 2}, + {4, 12, 0x0070, 0}, + {0, 0, 0x0044, 2}, + {4, 13, 0x0070, 0}, + }; + PrepOamCoordsRet info; + int n = sprite_ai_state[k] ? 2 : 1; + Sprite_DrawMultiple(k, &kStal_Dmd[sprite_graphics[k] * 2], n, &info); + if (sprite_ai_state[k]) + SpriteDraw_Shadow(k, &info); +} + +void Sprite_D2_FloppingFish(int k) { // 9d8235 + static const int8 kFish_Xvel[8] = {0, 12, 16, 12, 0, -12, -16, -12}; + static const int8 kFish_Yvel[8] = {-16, -12, 0, 12, 16, 12, 0, -12}; + static const uint8 kFish_Tab1[2] = {2, 0}; + static const uint8 kFish_Gfx[3] = {1, 5, 3}; + static const uint8 kFish_Gfx2[17] = {5, 5, 6, 6, 5, 5, 4, 4, 3, 7, 7, 8, 8, 7, 7, 8, 8 }; + + if (byte_7E0FC6 < 3) + Fish_Draw(k); + if (sprite_state[k] == 10) { + sprite_ai_state[k] = 4; + sprite_graphics[k] = (frame_counter >> 4 & 1) + 3; + } + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // check deep water + Sprite_CheckTileCollision(k); + if (sprite_tiletype == 8) + sprite_state[k] = 0; + else + sprite_ai_state[k] = 1; + break; + case 1: // flop around + Sprite_CheckIfLifted_permissive(k); + Sprite_BounceFromTileCollision(k); + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + if (sprite_tiletype == 9) { + Sprite_SpawnSmallSplash(k); + } else if (sprite_tiletype == 8) { + sprite_state[k] = 0; + Sprite_SpawnSmallSplash(k); + } + sprite_z_vel[k] = (GetRandomNumber() & 15) + 16; + int j = GetRandomNumber() & 7; + sprite_x_vel[k] = kFish_Xvel[j]; + sprite_y_vel[k] = kFish_Yvel[j]; + sprite_D[k]++; + sprite_subtype2[k] = 3; + } + sprite_subtype2[k]++; + if (!(sprite_subtype2[k] & 7)) { + int j = sprite_D[k] & 1; + if (sprite_A[k] != kFish_Tab1[j]) + sprite_A[k] += j ? -1 : 1; + } + sprite_graphics[k] = kFish_Gfx[sprite_A[k]] + (frame_counter >> 3 & 1); + break; + case 2: // pause before leap + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_z_vel[k] = 48; + Sprite_SpawnSmallSplash(k); + } + break; + case 3: // leaping + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sprite_z_vel[k] == 0 && sprite_A[k] != 0) { + dialogue_message_index = 0x176; + Sprite_ShowMessageMinimal(); + } + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + Sprite_SpawnSmallSplash(k); + if (sprite_A[k]) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xdb, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_SetX(j, info.r0_x + 4); + sprite_stunned[j] = 255; + sprite_z_vel[j] = 48; + sprite_delay_aux3[j] = 48; + Sprite_ApplySpeedTowardsLink(j, 16); + } + } + sprite_state[k] = 0; + } + sprite_graphics[k] = kFish_Gfx2[++sprite_subtype2[k] >> 2]; + break; + case 4: // wiggle + if (!sprite_z[k]) + sprite_ai_state[k] = 1; + Sprite_MoveXY(k); + ThrownSprite_TileAndSpriteInteraction(k); + break; + } +} + +void Fish_Draw(int k) { // 9d8483 + static const DrawMultipleData kFish_Dmd[16] = { + {-4, 8, 0x045e, 0}, + { 4, 8, 0x045f, 0}, + {-4, 8, 0x845e, 0}, + { 4, 8, 0x845f, 0}, + {-4, 8, 0x445f, 0}, + { 4, 8, 0x445e, 0}, + {-4, 8, 0xc45f, 0}, + { 4, 8, 0xc45e, 0}, + { 0, 0, 0x0461, 0}, + { 0, 8, 0x0471, 0}, + { 0, 0, 0x4461, 0}, + { 0, 8, 0x4471, 0}, + { 0, 0, 0x8471, 0}, + { 0, 8, 0x8461, 0}, + { 0, 0, 0xc471, 0}, + { 0, 8, 0xc461, 0}, + }; + static const DrawMultipleData kFish_Dmd2[9] = { + {-2, 11, 0x0438, 0}, + { 0, 11, 0x0438, 0}, + { 2, 11, 0x0438, 0}, + {-1, 11, 0x0438, 0}, + { 0, 11, 0x0438, 0}, + { 1, 11, 0x0438, 0}, + { 0, 11, 0x0438, 0}, + { 0, 11, 0x0438, 0}, + { 0, 11, 0x0438, 0}, + }; + PrepOamCoordsRet info; + if (sprite_graphics[k] == 0) { + Sprite_PrepOamCoord(k, &info); + return; + } + cur_sprite_x += 4; + Sprite_DrawMultiple(k, &kFish_Dmd[(sprite_graphics[k] - 1) * 2], 2, &info); + cur_sprite_y += sprite_z[k]; + int j = sprite_z[k] >> 2; + oam_cur_ptr += 8, oam_ext_cur_ptr += 2; + Sprite_DrawMultiple(k, &kFish_Dmd2[((j >= 2) ? 2 : j) * 3], 3, &info); + Sprite_Get16BitCoords(k); +} + +void ChimneySmoke_Draw(int k) { // 9d8531 + static const DrawMultipleData kChimneySmoke_Dmd[8] = { + {0, 0, 0x0086, 0}, + {8, 0, 0x0087, 0}, + {0, 8, 0x0096, 0}, + {8, 8, 0x0097, 0}, + {1, 1, 0x0086, 0}, + {7, 1, 0x0087, 0}, + {1, 7, 0x0096, 0}, + {7, 7, 0x0097, 0}, + }; + Sprite_DrawMultiple(k, &kChimneySmoke_Dmd[(sprite_graphics[k] & 1) * 4], 4, NULL); +} + +void Sprite_D1_BunnyBeam(int k) { // 9d858b + if (player_is_indoors) + Sprite_BunnyBeam(k); + else + Sprite_Chimney(k); + +} + +void Sprite_Chimney(int k) { // 9d858f + sprite_flags3[k] = 64; + sprite_ignore_projectile[k] = 64; + if (!sprite_ai_state[k]) { + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k]) + return; + sprite_delay_main[k] = 67; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xd1, &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + int t = (uint8)info.r0_x + 8; + sprite_x_lo[j] = t; + sprite_y_lo[j] = info.r2_y + 4 + (t >> 8); + sprite_oam_flags[j] = 4; + sprite_ai_state[j] = 4; + sprite_flags2[j] = 67; + sprite_flags3[j] = 67; + sprite_x_vel[j] = -4; + sprite_y_vel[j] = -6; + } else { + sprite_obj_prio[k] = 0x30; + ChimneySmoke_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + if (!(++sprite_subtype2[k] & 7)) { + int j = sprite_D[k] & 1; + sprite_x_vel[k] += j ? -1 : 1; + if (sprite_x_vel[k] == (uint8)(j ? -4 : 4)) + sprite_D[k]++; + } + if (!(sprite_subtype2[k] & 31)) + sprite_graphics[k]++; + } +} + +void Sprite_BunnyBeam(int k) { // 9d85e0 + static const uint8 kRabbitBeam_Gfx[6] = {0xd7, 0xd7, 0xd7, 0x91, 0x91, 0x91}; + PrepOamCoordsRet info; + if (!sprite_ai_state[k]) { + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (!Sprite_CheckTileCollision(k)) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 128; + } + return; + } + + SpriteDraw_Antfairy(k); + if (!sprite_pause[k]) { + OamEnt *oam = GetOamCurPtr(); + uint8 charnum = kRabbitBeam_Gfx[sprite_graphics[k]]; + for (int i = 0; i < 5; i++) { + oam[i].charnum = charnum; + oam[i].flags = oam[i].flags & 0xf0 | 2; + } + } + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) { + sprite_bump_damage[k] = 0x30; + if (Sprite_CheckDamageToLink(k)) { + sprite_state[k] = 0; + link_timer_tempbunny = 256; + } + if (link_is_on_lower_level == sprite_floor[k]) + Sprite_ApplySpeedTowardsLink(k, 16); + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + Sprite_SpawnPoofGarnish(k); + SpriteSfx_QueueSfx2WithPan(k, 0x15); + } + } +} + +void Sprite_D0_Lynel(int k) { // 9d866a + static const int8 kLynel_AttackGfx[4] = {5, 2, 8, 10}; + static const int8 kLynel_Gfx[8] = {3, 0, 6, 9, 4, 1, 7, 10}; + Lynel_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: // target + if (!sprite_delay_main[k]) { + static const int8 kLynel_Xtarget[4] = {-96, 96, 0, 0}; + static const int8 kLynel_Ytarget[4] = {8, 8, -96, 112}; + int j = sprite_D[k]; + int x = link_x_coord + kLynel_Xtarget[j]; + sprite_A[k] = x, sprite_B[k] = x >> 8; + int y = link_y_coord + kLynel_Ytarget[j]; + sprite_C[k] = y, sprite_E[k] = y >> 8; + sprite_ai_state[k]++; + sprite_delay_main[k] = 80; + } + sprite_graphics[k] = kLynel_Gfx[sprite_subtype2[k] & 4 | sprite_D[k]]; + break; + case 1: // approach + if (sprite_delay_main[k]) { + if (!((k ^ frame_counter) & 3)) { + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_E[k] << 8; + if ((uint16)(x - cur_sprite_x + 5) < 10 && (uint16)(y - cur_sprite_y + 5) < 10) + goto incr_state; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 24); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + } + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + goto incr_state; + sprite_graphics[k] = kLynel_Gfx[++sprite_subtype2[k] & 4 | sprite_D[k]]; + } else { +incr_state: + sprite_ai_state[k]++; + sprite_delay_main[k] = 32; + } + break; + case 2: // attack + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = (GetRandomNumber() & 15) + 16; + sprite_ai_state[k] = 0; + return; + } + if (sprite_delay_main[k] == 16) { + int j = Sprite_SpawnFirePhlegm(k); + if (j >= 0 && link_shield_type != 3) + sprite_flags5[j] = 0; + } + sprite_graphics[k] = kLynel_AttackGfx[sprite_D[k]]; + Sprite_CheckTileCollision(k); + break; + } +} + +void Lynel_Draw(int k) { // 9d8880 + static const DrawMultipleData kLynel_Dmd[33] = { + {-5, -11, 0x00cc, 2}, + {-4, 0, 0x00e4, 2}, + { 4, 0, 0x00e5, 2}, + {-5, -10, 0x00cc, 2}, + {-4, 0, 0x00e7, 2}, + { 4, 0, 0x00e8, 2}, + {-5, -11, 0x00c8, 2}, + {-4, 0, 0x00e4, 2}, + { 4, 0, 0x00e5, 2}, + { 5, -11, 0x40cc, 2}, + {-4, 0, 0x40e5, 2}, + { 4, 0, 0x40e4, 2}, + { 5, -10, 0x40cc, 2}, + {-4, 0, 0x40e8, 2}, + { 4, 0, 0x40e7, 2}, + { 5, -11, 0x40c8, 2}, + {-4, 0, 0x40e8, 2}, + { 4, 0, 0x40e7, 2}, + { 0, -9, 0x00ce, 2}, + {-4, 0, 0x00ea, 2}, + { 4, 0, 0x00eb, 2}, + { 0, -9, 0x00ce, 2}, + {-4, 0, 0x40eb, 2}, + { 4, 0, 0x40ea, 2}, + { 0, -9, 0x00ca, 2}, + {-4, 0, 0x40eb, 2}, + { 4, 0, 0x00eb, 2}, + { 0, -14, 0x00c6, 2}, + {-4, 0, 0x00ed, 2}, + { 4, 0, 0x00ee, 2}, + { 0, -14, 0x00c6, 2}, + {-4, 0, 0x40ee, 2}, + { 4, 0, 0x40ed, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kLynel_Dmd[sprite_graphics[k] * 3], 3, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_SpawnPhantomGanon(int k) { // 9d88a1 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc9, &info); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_flags2[j] = 2; + sprite_ignore_projectile[j] = 2; + sprite_anim_clock[j] = 1; + sprite_oam_flags[j] = 0; +} + +void Sprite_PhantomGanon(int k) { // 9d88bc + static const uint8 kGanonBat_Gfx[4] = {0, 1, 2, 1}; + static const int8 kGanonBat_TargetXvel[2] = {32, -32}; + static const int8 kGanonBat_TargetYvel[2] = {16, -16}; + + if (!sprite_ai_state[k]) { + PhantomGanon_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveY(k); + if (!(++sprite_subtype2[k] & 31)) { + if (--sprite_y_vel[k] == 252) { + int j = SpawnBossPoof(k); + Sprite_SetY(j, Sprite_GetY(j) - 20); + } else if (sprite_y_vel[k] == 251) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 255; + sprite_y_vel[k] = -4; + } + } + } else { + GanonBat_Draw(k); + if (sprite_pause[k]) { + sprite_state[k] = 0; + dung_savegame_state_bits |= 0x8000; + } + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = kGanonBat_Gfx[frame_counter >> 2 & 3]; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] < 208) { + int j = sprite_head_dir[k] & 1; + sprite_y_vel[k] += j ? -1 : 1; + if (sprite_y_vel[k] == (uint8)kGanonBat_TargetYvel[j]) + sprite_head_dir[k]++; + j = sprite_D[k] & 1; + sprite_x_vel[k] += j ? -1 : 1; + if (sprite_x_vel[k] == (uint8)kGanonBat_TargetXvel[j]) + sprite_D[k]++; + if (sprite_x_vel[k] == 0) + SpriteSfx_QueueSfx3WithPan(k, 0x1e); + } + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, link_x_coord & 0xff00 | 0x78, link_y_coord & 0xff00 | 0x50, 5); + uint8 xvel = sprite_x_vel[k], yvel = sprite_y_vel[k]; + sprite_x_vel[k] = xvel + pt.x, sprite_y_vel[k] = yvel + pt.y; + Sprite_MoveXY(k); + sprite_x_vel[k] = xvel, sprite_y_vel[k] = yvel; + } else { + Sprite_MoveXY(k); + if (sprite_x_vel[k] != 64) { + sprite_x_vel[k]++; + sprite_y_vel[k]--; + } + } + } +} + +void GanonBat_Draw(int k) { // 9d89eb + static const DrawMultipleData kGanonBat_Dmd[6] = { + {-8, 0, 0x0560, 2}, + { 8, 0, 0x4560, 2}, + {-8, 0, 0x0562, 2}, + { 8, 0, 0x4562, 2}, + {-8, 0, 0x0544, 2}, + { 8, 0, 0x4544, 2}, + }; + Sprite_DrawMultiple(k, &kGanonBat_Dmd[sprite_graphics[k] * 2], 2, NULL); +} + +void PhantomGanon_Draw(int k) { // 9d8a84 + static const DrawMultipleData kPhantomGanon_Dmd[16] = { + {-16, -8, 0x0d46, 2}, + { -8, -8, 0x0d47, 2}, + { 8, -8, 0x4d47, 2}, + { 16, -8, 0x4d46, 2}, + {-16, 8, 0x0d69, 2}, + { -8, 8, 0x0d6a, 2}, + { 8, 8, 0x4d6a, 2}, + { 16, 8, 0x4d69, 2}, + {-16, -8, 0x0d46, 2}, + { -8, -8, 0x0d47, 2}, + { 8, -8, 0x4d47, 2}, + { 16, -8, 0x4d46, 2}, + {-16, 8, 0x0d66, 2}, + { -8, 8, 0x0d67, 2}, + { 8, 8, 0x4d67, 2}, + { 16, 8, 0x4d66, 2}, + }; + oam_cur_ptr = 0x950; + oam_ext_cur_ptr = 0xa74; + Sprite_DrawMultiple(k, &kPhantomGanon_Dmd[sprite_graphics[k] * 8], 8, NULL); +} + +void SwishEvery16Frames(int k) { // 9d8aa9 + if (!(frame_counter & 15)) + SpriteSfx_QueueSfx3WithPan(k, 0x6); +} + +void Sprite_GanonTrident(int k) { // 9d8ab6 + Trident_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + SwishEvery16Frames(k); + Sprite_MoveXY(k); + sprite_G[k] = kGanon_G_Func2[--sprite_subtype2[k] >> 2 & 7]; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] & 1) + return; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 32); + Sprite_ApproachTargetSpeed(k, pt.x, pt.y); + } else { + int x = Sprite_GetX(0) + (sprite_D[0] ? -16 : 24); + int y = Sprite_GetY(0) - 16; + if (Ganon_AttemptTridentCatch(x, y)) { + sprite_state[k] = 0; + sprite_ai_state[0] = 3; + sprite_delay_main[0] = 16; + } + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 32); + Sprite_ApproachTargetSpeed(k, pt.x, pt.y); + } +} + +void Sprite_FireBat_Trailer(int k) { // 9d8b49 + FireBat_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + FireBat_Move(k); +} + +void Sprite_SpiralFireBat(int k) { // 9d8b52 + FireBat_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + { + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_E[k] << 8; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 2); + ProjectSpeedRet pt2 = Sprite_ProjectSpeedTowardsLocation(k, x, y, 80); + sprite_x_vel[k] = pt2.y - pt.x; + sprite_y_vel[k] = -pt2.x - pt.y; + } + FireBat_Move(k); +} + +void FireBat_Move(int k) { // 9d8b90 + FireBat_Animate(k); + Sprite_MoveXY(k); + if (sprite_subtype2[k] & 7) + return; + int j = Garnish_FlameTrail(k, true); +// garnish_type[j] = 0x10; + garnish_countdown[j] = (sprite_anim_clock[k] == 5) ? 0x2f : 0x4f; +} + +void Sprite_FireBat_Launched(int k) { // 9d8bd7 + FireBat_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToLink(k); + switch (sprite_ai_state[k]) { + case 0: + GetPositionRelativeToTheGreatOverlordGanon(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + } else { + sprite_graphics[k] = sprite_delay_main[k] >> 2 & 1; + } + break; + case 1: + GetPositionRelativeToTheGreatOverlordGanon(k); + sprite_graphics[k] = ++sprite_subtype2[k] >> 2 & 1; + break; + case 2: + Sprite_MoveXY(k); + sprite_defl_bits[k] = 64; + if (sprite_delay_aux1[k] == 0) { + if (sprite_delay_main[k] == 0) { + FireBat_Animate(k); + FireBat_Animate(k); + + } else { + uint8 t = sprite_delay_main[k] - 1; + if (t == 0) + sprite_delay_aux1[k] = t = 35; + sprite_graphics[k] = t >> 2 & 1; + } + } else if (sprite_delay_aux1[k] == 1) { + Sprite_ApplySpeedTowardsLink(k, 48); + SpriteSfx_QueueSfx3WithPan(k, 0x1e); + FireBat_Animate(k); + FireBat_Animate(k); + } else { + static const uint8 kFirebat_Gfx2[9] = { 4, 4, 4, 3, 3, 3, 2, 2, 2 }; + sprite_graphics[k] = kFirebat_Gfx2[sprite_delay_aux1[k] >> 2]; + } + break; + } +} + +void GetPositionRelativeToTheGreatOverlordGanon(int k) { // 9d8bee + static const int8 kFirebat_X[2] = { 20, -18 }; + static const int8 kFirebat_Y[2] = { -20, -20 }; + + int j = sprite_D[0]; + Sprite_SetX(k, (overlord_x_hi[k] | overlord_y_hi[k] << 8) + kFirebat_X[j]); + Sprite_SetY(k, (overlord_gen2[k] | overlord_floor[k] << 8) + kFirebat_Y[j]); +} + +void FireBat_Animate(int k) { // 9d8c43 + static const uint8 kFirebat_Gfx[4] = { 4, 5, 6, 5 }; + sprite_graphics[k] = kFirebat_Gfx[++sprite_subtype2[k] >> 2 & 3]; +} + +void FireBat_Draw(int k) { // 9d8ca9 + static const int8 kFirebat_Draw_X[2] = { -8, 8 }; + static const uint8 kFirebat_Draw_Char[7] = { 0x88, 0x88, 0x8a, 0x8c, 0x68, 0xaa, 0xa8 }; + static const uint8 kFirebat_Draw_Flags[14] = { 0, 0xc0, 0x80, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40 }; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + + for (int i = 1; i >= 0; i--, oam++) { + uint16 x = info.x + kFirebat_Draw_X[i]; + uint16 y = info.y; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kFirebat_Draw_Char[g]; + oam->flags = kFirebat_Draw_Flags[g * 2 + i] | info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +bool Ganon_AttemptTridentCatch(uint16 x, uint16 y) { // 9d8d06 + return (uint16)(cur_sprite_x - x + 4) < 8 && (uint16)(cur_sprite_y - y + 4) < 8; +} + +void Ganon_HandleFireBatCircle(int k) { // 9d8d70 + static const int8 kGanonMath_X[16] = { 0, 16, 24, 28, 32, 28, 24, 16, 0, -16, -24, -28, -32, -28, -24, -16 }; + static const int8 kGanonMath_Y[16] = { 32, 28, 24, 16, 0, -16, -24, -28, -32, -28, -24, -16, 0, 16, 24, 28 }; + + WORD(overlord_x_lo[0]) -= 4; + + for (int i = 0; i != 8; i++) { + int t = WORD(overlord_x_lo[0]) + i * 64 & 0x1ff; + if (sprite_ai_state[i + 1] != 2) { + int j = (t >> 5) - 4 & 0xf; + sprite_x_vel[i + 1] = (int8)kGanonMath_X[j] >> 2; + sprite_y_vel[i + 1] = (int8)kGanonMath_Y[j] >> 2; + } + int x = Sprite_GetX(0) + GanonSin(t, overlord_x_lo[2]); + overlord_x_hi[i + 1] = x; + overlord_y_hi[i + 1] = x >> 8; + + int y = Sprite_GetY(0) + GanonSin(t + 0x80, overlord_x_lo[2]); + overlord_gen2[i + 1] = y; + overlord_floor[i + 1] = y >> 8; + } + tmp_counter = 8; +} + +void Ganon_SpawnSpiralBat(int k) { // 9d8e7c + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xc9, &info, 8); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_anim_clock[j] = 4; + sprite_oam_flags[j] = 3; + sprite_flags3[j] = 0x40; + sprite_flags2[j] = 1; + sprite_defl_bits[j] = 0x80; + sprite_y_hi[j] = 128; + sprite_delay_main[j] = 48; + sprite_bump_damage[j] = 7; + sprite_ignore_projectile[j] = 7; +} + +void Sprite_D6_Ganon(int k) { // 9d8eb4 + int j; + + if (sign8(sprite_ai_state[k])) { + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + if (!(sprite_delay_main[k] & 1)) + Ganon_Draw(k); + return; + } + + if (sprite_delay_aux4[k]) { + static const uint8 kGanon_GfxB[2] = { 16, 10 }; + sprite_graphics[k] = kGanon_GfxB[sprite_D[k]]; + } + + if (byte_7E04C5 == 2 && byte_7E04C5 != sprite_room[k]) + sprite_delay_aux1[k] = 64; + + sprite_room[k] = byte_7E04C5; + + Ganon_Draw(k); + if (sprite_delay_aux1[k]) { + sprite_graphics[k] = 15; + Ganon_EnableInvincibility(k); + Sprite_CheckDamageToAndFromLink(k); + return; + } + + if (Sprite_ReturnIfInactive(k)) + return; + + if (sprite_delay_aux2[k] == 1) + Ganon_ExtinguishTorch(); + else if (sprite_delay_aux2[k] == 16) + Ganon_ExtinguishTorch_adjust_translucency(); + + PairU8 pair = Sprite_IsRightOfLink(k); + static const uint8 kGanon_HeadDir0[2] = { 2, 0 }; + sprite_head_dir[k] = (uint8)(pair.b + 32) < 64 ? 1 : kGanon_HeadDir0[pair.a]; + + if (sprite_delay_aux4[k]) { + sprite_ignore_projectile[k] = sprite_delay_aux4[k]; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_delay_main[k] = 0; + return; + } + + if (!(sprite_ignore_projectile[k] | flag_is_link_immobilized) && byte_7E04C5 == 2) + Sprite_CheckDamageToAndFromLink(k); + sprite_ignore_projectile[k] = 0; + switch (sprite_ai_state[k]) { + case 0: // + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 128; + } else if (sprite_delay_main[k] == 32) { + music_control = 0x1f; + } else if (sprite_delay_main[k] == 64) { + dialogue_message_index = 0x16f; + Sprite_ShowMessageMinimal(); + } + break; + case 1: // + if (sprite_health[k] < 209) + sprite_health[k] = 208; + if (sprite_delay_main[k] < 64) { + static const uint8 kGanon_Gfx1[2] = { 2, 10 }; + if (sprite_delay_main[k] == 0) { + Ganon_SelectWarpLocation(k, 5); + } else { + sprite_graphics[k] = kGanon_Gfx1[sprite_D[k]]; + } + } else if (sprite_delay_main[k] != 64) { + Ganon_Phase1_AnimateTridentSpin(k); + } else { + static const int8 kGanon_X1[2] = { 24, -16 }; + static const int8 kGanon_Y1[2] = { 4, 4 }; + static const int8 kGanon_Xvel1[16] = { 32, 28, 24, 16, 0, -16, -24, -28, -32, -28, -24, -16, 0, 16, 24, 28 }; + static const int8 kGanon_Yvel1[16] = { 0, 16, 24, 28, 32, 28, 24, 16, 0, -16, -24, -28, -32, -28, -24, -16 }; + sprite_G[k] = 0; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc9, &info); + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kGanon_X1[i]); + Sprite_SetY(j, info.r2_y + kGanon_Y1[i]); + Sprite_ApplySpeedTowardsLink(k, 31); + uint8 angle = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k]); + sprite_x_vel[j] = kGanon_Xvel1[angle - 2 & 0xf]; + sprite_y_vel[j] = kGanon_Yvel1[angle - 2 & 0xf]; + sprite_delay_main[j] = 112; + sprite_anim_clock[j] = 2; + sprite_oam_flags[j] = 1; + sprite_flags2[j] = 4; + sprite_defl_bits[j] = 0x84; + sprite_D[j] = 2; + sprite_bump_damage[j] = 7; + sprite_ignore_projectile[j] = 7; + } + break; + case 2: { // + static const uint8 kGanon_Gfx2_0[2] = { 0, 8 }; + if (sprite_health[k] < 209) + sprite_health[k] = 208; + sprite_graphics[k] = kGanon_Gfx2_0[sprite_D[k]]; + if (sprite_delay_main[k]) { + sprite_ignore_projectile[k]++; + if (sprite_delay_main[k] & 1) + sprite_graphics[k] = 255; + } + break; + } + case 3: // + if (sprite_health[k] < 209) + sprite_health[k] = 208; + if (sprite_delay_main[k] != 0) { + Ganon_Phase1_AnimateTridentSpin(k); + } else { + sprite_ai_state[k] = 6; + sprite_delay_main[k] = 127; + Ganon_HandleAnimation_Idle(k); + } + break; + case 4: // + if (sprite_health[k] < 209) + sprite_health[k] = 208; + if (sprite_delay_main[k] != 0) + Ganon_ShakeHead(k); + else + Ganon_SelectWarpLocation(k, 5); + break; + case 13: // + sprite_health[k] = 100; + // fall through + case 5: // + case 10: // + case 18: { // + sprite_ignore_projectile[k]++; + uint16 x = sprite_x_hi[k] << 8 | swamola_target_x_lo[0]; + uint16 y = sprite_y_hi[k] << 8 | swamola_target_y_lo[0]; + if (Ganon_AttemptTridentCatch(x, y)) { + sprite_D[k] = sprite_subtype[k] >> 2; + if (sprite_ai_state[k] == 5) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 32; + } else if (sprite_health[k] >= 161) { + sprite_ai_state[k] = 11; + sprite_delay_main[k] = 40; + } else if (sprite_health[k] >= 97) { + sprite_ai_state[k] = 14; + sprite_delay_main[k] = 40; + } else { + sprite_ai_state[k] = 17; + sprite_delay_main[k] = 104; + } + } else { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 32); + Sprite_ApproachTargetSpeed(k, pt.x, pt.y); + Sprite_MoveXY(k); + if (sprite_delay_main[k] == 0 || frame_counter & 1) { + sprite_graphics[k] = 255; + return; + } + static const uint8 kGanon_Gfx5[2] = { 2, 10 }; + sprite_graphics[k] = kGanon_Gfx5[sprite_D[k]]; + if (!(frame_counter & 7)) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xd6, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ignore_projectile[j] = 24; + sprite_delay_main[j] = 24; + sprite_ai_state[j] = 255; + sprite_graphics[j] = sprite_graphics[k]; + sprite_head_dir[j] = sprite_head_dir[k]; + } + } + } + break; + } + case 6: // + if (sprite_health[k] < 209) + sprite_health[k] = 208; + if (!sprite_delay_main[k]) { + if (sprite_health[k] >= 209) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 128; + } else { + sprite_delay_main[k] = 255; + sprite_ai_state[k] = 7; + } + } else { + Ganon_ShakeHead(k); + } + break; + case 7: // + if (sprite_health[k] < 161) + sprite_health[k] = 160; + overlord_x_lo[2] = 40; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 8; + sprite_delay_main[k] = 255; + } else { + if (sprite_delay_main[k] < 0xc0 && (sprite_delay_main[k] & 0xf) == 0) + Ganon_SpawnSpiralBat(k); + Ganon_Phase1_AnimateTridentSpin(k); + Ganon_HandleFireBatCircle(k); + } + break; + case 8: { // + static const int8 kGanon_Tab2[16] = { 0, 0, 0, 0, -1, -1, -2, -1, 0, 0, 0, 0, 1, 2, 1, 1 }; + static const uint8 kGanon_Delay8[8] = { 0x10, 0x30, 0x50, 0x70, 0x90, 0xb0, 0xd0, 0xbd }; + + if (sprite_health[k] < 161) + sprite_health[k] = 160; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 9; + sprite_delay_main[k] = 127; + Ganon_HandleAnimation_Idle(k); + for (int j = 8; j != 0; j--) { + sprite_ai_state[j] = 2; + sprite_delay_main[j] = kGanon_Delay8[j - 1]; + } + } else { + overlord_x_lo[2] += kGanon_Tab2[sprite_delay_main[k] >> 4 & 15]; + Ganon_Phase1_AnimateTridentSpin(k); + Ganon_HandleFireBatCircle(k); + } + break; + } + case 9: // + if (sprite_health[k] < 161) + sprite_health[k] = 160; + if (!sprite_delay_main[k]) { + Ganon_SelectWarpLocation(k, 10); + } else { + Ganon_ShakeHead(k); + } + break; + case 11: // + sprite_ignore_projectile[k]++; + Ganon_HandleAnimation_Idle(k); + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 255; + sprite_ai_state[k] = 7; + } else if (sprite_delay_main[k] & 1) { + sprite_graphics[k] = 255; + } + break; + case 12: { // + j = sprite_delay_main[k]; + if (j == 0) { + Ganon_SelectWarpLocation(k, 13); + return; + } + int t = 0; + if (j < 96) { + t = 1; + if (j < 72) { + if (j == 66) + Ganon_Func1(k, 3); + t = 2; + } + } + if (sprite_D[k]) + t += 3; + static const uint8 kGanon_Gfx12[6] = { 5, 6, 7, 13, 14, 10 }; + sprite_graphics[k] = kGanon_Gfx12[t]; + if ((sprite_hit_timer[k] & 127) == 1) { + sprite_ai_state[k] = 15; + sprite_z_vel[k] = 24; + sprite_delay_main[k] = 0; + } + break; + } + case 14: // + sprite_ignore_projectile[k]++; + Ganon_HandleAnimation_Idle(k); + sprite_G[k] = 0; + if (!sprite_delay_main[k]) { + if (GetRandomNumber() & 1) { + Ganon_SelectWarpLocation(k, 13); + } else { + sprite_delay_main[k] = 127; + sprite_ai_state[k] = 12; + } + } else if (sprite_delay_main[k] & 1) { + sprite_graphics[k] = 255; + } + break; + case 15: { // + static const uint8 kGanon_Gfx15[2] = { 6, 14 }; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] == 1) { + sprite_ai_state[k] = 16; + sprite_z_vel[k] = 160; + return; + } + } else { + Sprite_MoveZ(k); + if (--sprite_z_vel[k] == 0) + sprite_delay_main[k] = 32; + + } + sprite_graphics[k] = kGanon_Gfx15[sprite_D[k]]; + break; + } + case 16: { // + bg1_y_offset = 0; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] == 1) { + sound_effect_ambient = 5; + Ganon_SelectWarpLocation(k, 13); + flag_is_link_immobilized = 0; + Ganon_SpawnFallingTilesOverlord(k); + if (sprite_anim_clock[k] >= 4) { + Ganon_SelectWarpLocation(k, 10); + sprite_health[k] = 96; + sprite_delay_aux2[k] = 224; + dialogue_message_index = 0x170; + Sprite_ShowMessageMinimal(); + } + } else { + bg1_y_offset = (sprite_delay_main[k] - 1) & 1 ? -1 : 1; + flag_is_link_immobilized = 1; + } + } else { + static const uint8 kGanon_Gfx16[2] = { 2, 10 }; + + Sprite_MoveZ(k); + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 0; + sprite_z[k] = 0; + sprite_delay_main[k] = 96; + sound_effect_ambient = 7; + SpriteSfx_QueueSfx2WithPan(k, 0xc); + } + sprite_graphics[k] = kGanon_Gfx16[sprite_D[k]]; + } + break; + } + case 17: { // + static const uint8 kGanon_Gfx17b[2] = { 6, 14 }; + static const uint8 kGanon_Gfx17[2] = { 7, 10 }; + sprite_graphics[k] = kGanon_Gfx17b[sprite_D[k]]; + if (!sprite_delay_main[k]) { + Ganon_SelectWarpLocation(k, 0x12); + return; + } else if (sprite_delay_main[k] == 52) { + Ganon_Func1(k, 5); + } else if (sprite_delay_main[k] < 52) { + sprite_graphics[k] = kGanon_Gfx17[sprite_D[k]]; + } + if (sprite_delay_main[k] >= 72 || sprite_delay_main[k] < 40) { + sprite_ignore_projectile[k]++; + if (sprite_delay_main[k] & 1) + sprite_graphics[k] = 0xff; + } + Ganon_EnableInvincibility(k); + break; + } + case 19: // + sprite_oam_flags[k] = 5; + sprite_flags[k] = 2; + if (!sprite_delay_main[k]) { + sprite_oam_flags[k] = 1; + Ganon_SelectWarpLocation(k, 18); + sprite_type[k] = 0xd6; + sprite_hit_timer[k] = 0; + } else { + static const uint8 kGanon_Gfx19[2] = { 5, 13 }; + sprite_graphics[k] = kGanon_Gfx19[sprite_D[k]]; + } + break; + } +} + +void Ganon_EnableInvincibility(int k) { // 9d8ffa + if ((sprite_hit_timer[k] & 127) == 26) { + sprite_hit_timer[k] = 0; + sprite_ai_state[k] = 19; + sprite_delay_main[k] = 127; + sprite_type[k] = 215; + } +} + +void Ganon_SpawnFallingTilesOverlord(int k) { // 9d90d0 + static const uint8 kGanon_Ov_Type[4] = { 12, 13, 14, 15 }; + static const uint8 kGanon_Ov_X[4] = { 0x18, 0xd8, 0xd8, 0x18 }; + static const uint8 kGanon_Ov_Y[4] = { 0x28, 0x28, 0xd8, 0xd8 }; + + int j; + for (j = 7; j >= 0 && overlord_type[j] != 0; j--); + + int t = sprite_anim_clock[k]; + if (t >= 4) + return; + sprite_anim_clock[k] = t + 1; + + overlord_type[j] = kGanon_Ov_Type[t]; + overlord_x_lo[j] = kGanon_Ov_X[t]; + overlord_x_hi[j] = link_x_coord >> 8; + overlord_y_lo[j] = kGanon_Ov_Y[t]; + overlord_y_hi[j] = link_y_coord >> 8; + overlord_gen1[j] = 0; + overlord_gen2[j] = 0; +} + +void Ganon_Func1(int k, int t) { // 9d9162 + tmp_counter = t; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xC9, &info, 8); + if (j < 0) + return; + SpriteSfx_QueueSfx2WithPan(k, 0x2a); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ignore_projectile[j] = sprite_anim_clock[j] = t; + sprite_oam_flags[j] = 3; + sprite_flags3[j] = 0x40; + sprite_flags2[j] = 0x21; + sprite_defl_bits[j] = 0x40; + static const int8 kGanon_Gfx16_Y[2] = { 0, -16 }; + Sprite_SetY(j, info.r2_y + kGanon_Gfx16_Y[sprite_D[k]]); + Sprite_ApplySpeedTowardsLink(j, 32); + sprite_delay_main[j] = 16; + sprite_A[j] = sprite_x_lo[0]; + sprite_B[j] = sprite_x_hi[0]; + sprite_C[j] = sprite_y_lo[0]; + sprite_E[j] = sprite_y_hi[0]; + sprite_bump_damage[j] = 7; + sprite_ignore_projectile[j] = 7; +} + +void Ganon_Phase1_AnimateTridentSpin(int k) { // 9d93db + static const uint8 kGanon_GfxFunc2[16] = { 0, 0, 1, 1, 0, 0, 1, 1, 8, 8, 9, 9, 8, 8, 9, 9 }; + + int j = (sprite_delay_main[k] >> 2 & 7) + (sprite_D[k] ? 8 : 0); + sprite_G[k] = kGanon_G_Func2[j]; + sprite_graphics[k] = kGanon_GfxFunc2[j]; + SwishEvery16Frames(k); +} + +void Ganon_HandleAnimation_Idle(int k) { // 9d9443 + static const uint8 kGanon_G[2] = { 9, 10 }; + static const uint8 kGanon_Gfx[2] = { 2, 10 }; + sprite_G[k] = kGanon_G[sprite_D[k]]; + sprite_graphics[k] = kGanon_Gfx[sprite_D[k]]; +} + +void Ganon_SelectWarpLocation(int k, int a) { // 9d947f + int j; + static const uint8 kGanon_NextSubtype[32] = { + 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7, + 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, + }; + static const uint8 kGanon_NextY[8] = { 0x40, 0x30, 0x30, 0x40, 0xb0, 0xc0, 0xc0, 0xb0 }; + static const uint8 kGanon_NextX[8] = { 0x30, 0x50, 0xa0, 0xc0, 0x40, 0x60, 0x90, 0xb0 }; + + sprite_subtype[k] = j = kGanon_NextSubtype[GetRandomNumber() & 3 | sprite_subtype[k] << 2]; + swamola_target_x_lo[0] = kGanon_NextX[j]; + swamola_target_y_lo[0] = kGanon_NextY[j]; + sprite_ai_state[k] = a; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_delay_main[k] = 48; + SpriteSfx_QueueSfx3WithPan(k, 0x28); +} + +void Ganon_ShakeHead(int k) { // 9d94ba + static const uint8 kGanon_HeadDir[18] = { + 0, 0, 0, 1, 2, 2, 2, 1, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 16, + }; + sprite_head_dir[k] = kGanon_HeadDir[sprite_delay_main[k] >> 3]; +} + +void Ganon_Draw(int k) { // 9d9adf + PrepOamCoordsRet info; + if (sign8(sprite_graphics[k]) || + sprite_ai_state[k] != 19 && sprite_delay_aux4[k] == 0 && byte_7E04C5 == 0) { + Sprite_PrepOamCoordOrDoubleRet(k, &info); + return; + } + Trident_Draw(k); + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr() + 5; + int g = sprite_graphics[k]; + for (int i = 0; i < 12; i++, oam++) { + int j = g * 12 + i; + oam->x = info.x + kGanon_Draw_X[j]; + oam->y = info.y + kGanon_Draw_Y[j]; + oam->charnum = kGanon_Draw_Char[j]; + oam->flags = info.flags | (kGanon_Draw_Flags[j] & ((info.flags & 0xf) >= 5 ? 0xf0 : 0xff)); + bytewise_extended_oam[oam - oam_buf] = 2; + } + static const uint8 kGanon_SprOffs[17] = { + 1, 1, 1, 1, 1, 1, 15, 1, 4, 4, 4, 4, 4, 4, 4, 15, 15, + }; + if (kGanon_SprOffs[g] != 15) { + oam = oam - 12 + kGanon_SprOffs[g]; + int j = sprite_head_dir[k] * 2 + (sprite_D[k] ? 6 : 0); + oam[0].charnum = kGanon_Draw_Char2[j]; + oam[0].flags = (oam[0].flags & 0x3f) | kGanon_Draw_Flags2[j]; + + oam[1].charnum = kGanon_Draw_Char2[j + 1]; + oam[1].flags = (oam[1].flags & 0x3f) | kGanon_Draw_Flags2[j + 1]; + + } + if (submodule_index) + Sprite_CorrectOamEntries(k, 9, 0xff); + + if (sprite_G[k] == 9) { + static const DrawMultipleData kGanon_Dmd[2] = { + {16, -3, 0x4c0a, 2}, + {16, 5, 0x4c1a, 2}, + }; + oam_cur_ptr = 0x828, oam_ext_cur_ptr = 0xa2a; + Sprite_DrawMultiple(k, kGanon_Dmd, 2, NULL); + } + + uint16 z = sprite_z[k] - 1; + int frame = (z >> 11) > 4 ? 4 : (z >> 11); + cur_sprite_y += z; + oam_cur_ptr = 0x9f4; + oam_ext_cur_ptr = 0xa9d; + uint8 bak = sprite_oam_flags[k]; + sprite_oam_flags[k] = 0; + sprite_obj_prio[k] = 48; + Sprite_DrawMultiple(k, &kLargeShadow_Dmd[frame * 3], 3, NULL); + sprite_oam_flags[k] = bak; + Sprite_Get16BitCoords(k); +} + +void Trident_Draw(int k) { // 9d9c1c + static const DrawMultipleData kTrident_Dmd[50] = { + { 10, -10, 0x0864, 0}, + { 5, -15, 0x0864, 0}, + { 0, -20, 0x0864, 0}, + { -5, -25, 0x0864, 0}, + {-18, -38, 0x0844, 2}, + { 1, -4, 0x0865, 0}, + { 1, -11, 0x0865, 0}, + { 1, -18, 0x0865, 0}, + { 1, -25, 0x0865, 0}, + { -3, -40, 0x0862, 2}, + { -8, -9, 0x4864, 0}, + { -3, -14, 0x4864, 0}, + { 3, -20, 0x4864, 0}, + { 9, -26, 0x4864, 0}, + { 12, -37, 0x4844, 2}, + {-10, -20, 0x4874, 0}, + { -3, -20, 0x4874, 0}, + { 4, -20, 0x4874, 0}, + { 11, -20, 0x4874, 0}, + { 18, -23, 0x4860, 2}, + {-10, -30, 0xc864, 0}, + { -4, -24, 0xc864, 0}, + { 2, -18, 0xc864, 0}, + { 8, -12, 0xc864, 0}, + { 12, -8, 0xc844, 2}, + { 1, -32, 0x8865, 0}, + { 1, -25, 0x8865, 0}, + { 1, -18, 0x8865, 0}, + { 1, -11, 0x8865, 0}, + { -3, -5, 0x8862, 2}, + { 13, -30, 0x8864, 0}, + { 8, -25, 0x8864, 0}, + { 2, -19, 0x8864, 0}, + { -4, -13, 0x8864, 0}, + {-16, -9, 0x8844, 2}, + { 14, -20, 0x0874, 0}, + { 7, -20, 0x0874, 0}, + { 0, -20, 0x0874, 0}, + { -7, -20, 0x0874, 0}, + {-21, -23, 0x0860, 2}, + { 13, -30, 0x8864, 0}, + { 8, -25, 0x8864, 0}, + { 2, -19, 0x8864, 0}, + { -4, -13, 0x8864, 0}, + {-16, -9, 0x8844, 2}, + {-10, -30, 0xc864, 0}, + { -4, -24, 0xc864, 0}, + { -4, -24, 0xc864, 0}, + { -4, -24, 0xc864, 0}, + { -4, -24, 0xc864, 0}, + }; + int g = sprite_G[k]; + if (g == 0) + return; + static const int8 kTrident_Draw_X[5] = { 24, -16, 0, 16, -8 }; + static const int8 kTrident_Draw_Y[5] = { 4, 4, 16, 21, 19 }; + + int j = sprite_G[k] == 9 ? 3 : + sprite_G[k] >= 9 ? 4 : sprite_D[k]; + cur_sprite_x += kTrident_Draw_X[j]; + cur_sprite_y += kTrident_Draw_Y[j]; + uint8 bak = sprite_obj_prio[k]; + sprite_obj_prio[k] &= ~0xf; + Sprite_DrawMultiple(k, &kTrident_Dmd[(g - 1) * 5], 5, NULL); + sprite_obj_prio[k] = bak; + Sprite_Get16BitCoords(k); +} + +void SpritePrep_Swamola_InitializeSegments(int k) { // 9d9c80 + static const uint8 kBuggySwamolaLookup[6] = { 0x1c, 0xa9, 0x03, 0x9d, 0x90, 0x0d }; // wrong bank + //int j = k * 32; + int j = kBuggySwamolaLookup[k]; + for (int i = 0; i < 32; i++, j++) { + swamola_x_lo[j] = sprite_x_lo[k]; + swamola_x_hi[j] = sprite_x_hi[k]; + swamola_y_lo[j] = sprite_y_lo[k]; + swamola_y_hi[j] = sprite_y_hi[k]; + } +} + +void Sprite_CF_Swamola(int k) { // 9d9cb0 + static const uint8 kSwamola_Target_Dir[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + static const int8 kSwamola_Target_X[9] = {0, 0, 32, 32, 32, 0, -32, -32, -32}; + static const int8 kSwamola_Target_Y[9] = {0, -32, -32, 0, 32, 32, 32, 0, -32}; + int j; + + if (sprite_ai_state[k]) { + if (sign8(sprite_ai_state[k])) { + Sprite_Swamola_Ripples(k); + return; + } + Swamola_Draw(k); + } + Sprite_Get16BitCoords(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + Sprite_CheckDamageToAndFromLink(k); + uint8 old_vel = sprite_y_vel[k]; + sprite_y_vel[k] += sprite_z_vel[k]; + Sprite_MoveXY(k); + sprite_y_vel[k] = old_vel; + switch(sprite_ai_state[k]) { + case 0: { // emerge + if (!sprite_delay_main[k] && (j = kSwamola_Target_Dir[GetRandomNumber() & 7]) != sprite_D[k]) { + int t = (sprite_B[k] << 8 | sprite_A[k]) + kSwamola_Target_X[j]; + swamola_target_x_lo[k] = t, swamola_target_x_hi[k] = t >> 8; + t = (sprite_head_dir[k] << 8 | sprite_C[k]) + kSwamola_Target_Y[j]; + swamola_target_y_lo[k] = t, swamola_target_y_hi[k] = t >> 8; + sprite_ai_state[k] = 1; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_z_vel[k] = -15; + Swamola_SpawnRipples(k); + } + break; + } + case 1: // ascending + if (!(sprite_subtype2[k] & 3)) { + if (!++sprite_z_vel[k]) + sprite_ai_state[k] = 2; + ProjectSpeedRet pt = Swamola_ProjectVelocityTowardsTarget(k); + Sprite_ApproachTargetSpeed(k, pt.x, pt.y); + } + break; + case 2: { // wiggle + static const int8 kSwamola_Z_Accel[2] = {2, -2}; + static const int8 kSwamola_Z_Vel_Target[2] = {12, -12}; + int j = sprite_G[k] & 1; + sprite_z_vel[k] += kSwamola_Z_Accel[j]; + if (sprite_z_vel[k] == (uint8)kSwamola_Z_Vel_Target[j]) + sprite_G[k]++; + uint16 x = swamola_target_x_hi[k] << 8 | swamola_target_x_lo[k]; + uint16 y = swamola_target_y_hi[k] << 8 | swamola_target_y_lo[k]; + if ((uint16)(cur_sprite_x - x + 8) < 16 && (uint16)(cur_sprite_y - y + 8) < 16) + sprite_ai_state[k] = 3; + ProjectSpeedRet pt = Swamola_ProjectVelocityTowardsTarget(k); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + break; + } + case 3: // descending + if (!(sprite_subtype2[k] & 3) && ++sprite_z_vel[k] == 16) { + sprite_ai_state[k] = 4; + Swamola_SpawnRipples(k); + sprite_y_hi[k] = 128; + sprite_delay_main[k] = 80; + } + if (!(sprite_subtype2[k] & 3)) + Sprite_ApproachTargetSpeed(k, 0, 0); + break; + case 4: // submerge + if (!sprite_delay_main[k]) { + sprite_D[k] = j = kSwamola_Target_Dir[GetRandomNumber() & 7]; + Sprite_SetX(k, (sprite_B[k] << 8 | sprite_A[k]) + kSwamola_Target_X[j]); + Sprite_SetY(k, (sprite_head_dir[k] << 8 | sprite_C[k]) + kSwamola_Target_Y[j]); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_z_vel[k] = 0; + } + break; + } +} + +ProjectSpeedRet Swamola_ProjectVelocityTowardsTarget(int k) { // 9d9e13 + uint16 x = swamola_target_x_hi[k] << 8 | swamola_target_x_lo[k]; + uint16 y = swamola_target_y_hi[k] << 8 | swamola_target_y_lo[k]; + return Sprite_ProjectSpeedTowardsLocation(k, x, y, 15); +} + +void Swamola_SpawnRipples(int k) { // 9d9eaa + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xcf, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ai_state[j] = 128; + sprite_delay_main[j] = 32; + sprite_oam_flags[j] = 4; + sprite_ignore_projectile[j] = 4; + sprite_flags2[j] = 0; + } +} + +void Sprite_Swamola_Ripples(int k) { // 9d9ece + SwamolaRipples_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; +} + +void SwamolaRipples_Draw(int k) { // 9d9f1d + static const DrawMultipleData kSwamolaRipples_Dmd[8] = { + {0, 4, 0x00d8, 0}, + {8, 4, 0x40d8, 0}, + {0, 4, 0x00d9, 0}, + {8, 4, 0x40d9, 0}, + {0, 4, 0x00da, 0}, + {8, 4, 0x40da, 0}, + {0, 4, 0x00d9, 0}, + {8, 4, 0x40d9, 0}, + }; + Oam_AllocateFromRegionB(8); + Sprite_DrawMultiple(k, &kSwamolaRipples_Dmd[(sprite_delay_main[k] >> 2 & 3) * 2], 2, NULL); +} + +void Swamola_Draw(int k) { // 9d9f64 + static const uint8 kSwamola_Gfx[16] = {7, 6, 5, 4, 3, 4, 5, 6, 7, 6, 5, 4, 3, 4, 5, 6}; + static const uint8 kSwamola_Gfx2[4] = {0, 0, 1, 2}; + static const uint8 kSwamola_Draw_OamFlags[16] = {0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40}; + static const uint8 kSwamola_HistOffs[4] = {8, 16, 22, 26}; + int j = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k] + sprite_z_vel[k]); + sprite_graphics[k] = kSwamola_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 63 | kSwamola_Draw_OamFlags[j]; + SpriteDraw_SingleLarge(k); + j = (sprite_subtype2[k] & 0x1f) + k * 32; + swamola_x_lo[j] = sprite_x_lo[k]; + swamola_x_hi[j] = sprite_x_hi[k]; + swamola_y_lo[j] = sprite_y_lo[k]; + swamola_y_hi[j] = sprite_y_hi[k]; + j = sign8(sprite_y_vel[k]) ? 5 : 0; + int delta = sign8(sprite_y_vel[k]) ? -1 : 1; + oam_cur_ptr += j * 4, oam_ext_cur_ptr += j; + for (int i = 0; i < 4; i++) { + sprite_graphics[k] = kSwamola_Gfx2[i]; + j = (sprite_subtype2[k] - kSwamola_HistOffs[i] & 31) + k * 32; + cur_sprite_x = swamola_x_hi[j] << 8 | swamola_x_lo[j]; + cur_sprite_y = swamola_y_hi[j] << 8 | swamola_y_lo[j]; + oam_cur_ptr += delta * 4, oam_ext_cur_ptr += delta; + SpriteDraw_SingleLarge(k); + } + byte_7E0FB6 = 4; +} + +void SpritePrep_Blind_PrepareBattle(int k) { // 9da081 + if (savegame_tagalong != 6 && dung_savegame_state_bits & 0x2000) { + sprite_delay_aux2[k] = 96; + sprite_C[k] = 1; + sprite_D[k] = 2; + sprite_head_dir[k] = 4; + sprite_graphics[k] = 7; + byte_7E0B69 = 0; + } else { + sprite_state[k] = 0; + } +} + +void BlindLaser_SpawnTrailGarnish(int j) { // 9da0b1 + int k = GarnishAllocOverwriteOld(); + garnish_type[k] = 15; + garnish_active = 15; + garnish_oam_flags[k] = sprite_graphics[j]; + garnish_sprite[k] = j; + garnish_x_lo[k] = sprite_x_lo[j]; + garnish_x_hi[k] = sprite_x_hi[j]; + uint16 y = Sprite_GetY(j) + 16; + garnish_y_lo[k] = y; + garnish_y_hi[k] = y >> 8; + garnish_countdown[k] = 10; +} + +void Sprite_Blind_Head(int k) { // 9da118 + static const uint8 kBlindHead_XposLimit[2] = {0x98, 0x58}; + static const uint8 kBlindHead_YposLimit[2] = {0xb0, 0x50}; + static const int8 kBlindHead_YvelLimit[2] = {24, -24}; + static const int8 kBlindHead_XvelLimit[2] = {32, -32}; + + sprite_obj_prio[k] |= 48; + SpriteDraw_SingleLarge(k); + OamEnt *oam = GetOamCurPtr(); + int j = sprite_head_dir[k]; + oam->charnum = kBlindHead_Draw_Char[j]; + oam->flags = oam->flags & 0x3f | kBlindHead_Draw_Flags[j]; + + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_F[k] == 14) + sprite_F[k] = 8; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sign8(--sprite_subtype[k])) { + sprite_subtype[k] = 2; + sprite_head_dir[k] = sprite_head_dir[k] + 1 & 15; + } + if (sprite_delay_main[k]) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_subtype2[k]++; + j = Blind_SpitFireball(k, 0x1f); + if (j >= 0 && sign8(--sprite_z_subpos[k])) { + sprite_z_subpos[k] = 4; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 32); + sprite_x_vel[j] = pt.x; + sprite_y_vel[j] = pt.y; + } + j = sprite_G[k] & 1; + if (sprite_x_vel[k] != (uint8)kBlindHead_XvelLimit[j]) + sprite_x_vel[k] += j ? -1 : 1; + if ((sprite_x_lo[k] & ~1) == kBlindHead_XposLimit[j]) + sprite_G[k]++; + j = sprite_anim_clock[k] & 1; + if (sprite_y_vel[k] != (uint8)kBlindHead_YvelLimit[j]) + sprite_y_vel[k] += j ? -1 : 1; + if ((sprite_y_lo[k] & ~1) == kBlindHead_YposLimit[j]) + sprite_anim_clock[k]++; + if (!sprite_F[k]) + Sprite_MoveXY(k); +} + +void Blind_SpawnHead(int k) { // 9da1ed + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xce, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_flags3[j] = 0x5b; + sprite_oam_flags[j] = 0x5b & 15; + sprite_defl_bits[j] = 4; + sprite_A[j] = 2; + sprite_flags2[j] = 1; + sprite_flags4[j] = 0; + sprite_flags[j] = 0; + sprite_z[j] = 23; + sprite_y_lo[j] = 23 + info.r2_y; + sprite_G[j] = (info.r0_x >> 7) & 1; + sprite_anim_clock[j] = (info.r2_y >> 7) & 1; + sprite_delay_main[j] = 48; + } +} + +void Sprite_CE_Blind(int k) { // 9da263 + if (sign8(sprite_A[k])) + Sprite_BlindLaser(k); + else if (sprite_A[k] == 2) + Sprite_Blind_Head(k); + else + Sprite_Blind_Blind_Blind(k); +} + +void Sprite_BlindLaser(int k) { // 9da268 + static const uint8 kBlindLaser_Gfx[16] = {7, 7, 8, 9, 10, 9, 8, 7, 7, 7, 8, 9, 10, 9, 8, 7}; + static const uint8 kBlindLaser_OamFlags[16] = {0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80}; + int j = sprite_head_dir[k]; + sprite_graphics[k] = kBlindLaser_Gfx[j]; + sprite_oam_flags[k] = kBlindLaser_OamFlags[j] | 3; + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] == 1) + sprite_state[k] = 0; + return; + } + Sprite_CheckDamageToLink_same_layer(k); + Sprite_SetX(k, Sprite_GetX(k) + (int8)sprite_x_vel[k]); + Sprite_SetY(k, Sprite_GetY(k) + (int8)sprite_y_vel[k]); + if (Sprite_CheckTileCollision(k)) + sprite_delay_main[k] = 12; + BlindLaser_SpawnTrailGarnish(k); +} + +void Sprite_Blind_Blind_Blind(int k) { // 9da2d2 + int j; + + sprite_obj_prio[k] |= 0x30; + Blind_Draw(k); + sprite_oam_flags[k] = 1; + if (Sprite_ReturnIfInactive(k)) + return; + uint8 a = sprite_F[k]; + if (a) + sprite_F[k]--; + + if (a == 11) { + sprite_hit_timer[k] = 0; + sprite_wallcoll[k] = 0; + if (!sprite_delay_aux4[k]) { + sprite_health[k] = 128; + sprite_delay_aux4[k] = 48; + sprite_oam_flags[k] &= 1; + if (++sprite_z_subpos[k] < 3) { + sprite_wallcoll[k] = 96; + sprite_subtype[k] = 1; + } else { + sprite_z_subpos[k] = 0; + if (++sprite_limit_instance == 3) { + Sprite_KillFriends(); + sprite_state[k] = 4; + sprite_A[k] = 0; + sprite_delay_main[k] = 255; + sprite_hit_timer[k] = 255; + flag_block_link_menu++; + SpriteSfx_QueueSfx3WithPan(k, 0x22); + return; + } + sprite_y_vel[k] = sprite_x_vel[k] = 0; + sprite_C[k] = 6; + sprite_delay_aux2[k] = 255; + sprite_ignore_projectile[k] = 255; + Blind_SpawnHead(k); + } + } + } + + if (sprite_A[k]) { + static const uint8 kBlind_Gfx0[7] = {20, 19, 18, 17, 16, 15, 15}; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + sprite_graphics[k] = kBlind_Gfx0[sprite_delay_main[k] >> 3]; + return; + } + if (!(++sprite_subtype2[k] & 1)) + sprite_delay_main[k]++; + + if (sprite_delay_aux1[k]) { + sprite_ai_state[k] = 0; + if (sprite_delay_aux1[k] == 8) + Blind_SpawnLaser(k); + Blind_CheckBumpDamage(k); + return; + } + byte_7E0B69++; + if (!sprite_stunned[k]) { + if (sprite_ai_state[k]) { + sprite_delay_aux1[k] = 16; + sprite_stunned[k] = 128; + sprite_ai_state[k] = 0; + } + } else { + sprite_stunned[k]--; + sprite_ai_state[k] = 0; + } + sprite_x_hi[k] = HIBYTE(link_x_coord); + sprite_y_hi[k] = HIBYTE(link_y_coord); + switch(sprite_C[k]) { + case 0: // blinded + BYTE(dma_var6) = 0; + BYTE(dma_var7) = 0xA0; + if (sprite_delay_aux2[k] == 0) { + sprite_C[k]++; + sprite_delay_aux2[k] = 96; + } else if (sprite_delay_aux2[k] == 80) { + dialogue_message_index = 0x123; + Sprite_ShowMessageMinimal(); + } else if (sprite_delay_aux2[k] == 24) { + SpawnBossPoof(k); + } + break; + case 1: // retreat to back wall + Blind_CheckBumpDamage(k); + sprite_graphics[k] = 9; + if (sprite_delay_aux2[k] == 0) { + sprite_C[k]++; + sprite_delay_main[k] = 255; + sprite_ignore_projectile[k] = 0; + } else if (sprite_delay_aux2[k] < 64) { + sprite_y_vel[k] = -8; + Sprite_MoveY(k); + } + Blind_Animate(k); + sprite_head_dir[k] = 4; + break; + case 2: { // oscillate + static const int8 kBlind_Oscillate_YVelTarget[2] = {18, -18}; + static const int8 kBlind_Oscillate_XVelTarget[2] = {24, -24}; + static const uint8 kBlind_Oscillate_XPosTarget[2] = {164, 76}; + Blind_CheckBumpDamage(k); + Blind_Animate(k); + if ((!(sprite_subtype2[k] & 127) && Sprite_IsBelowLink(k).a + 2 != sprite_D[k] || sprite_delay_main[k] == 0) && sprite_x_lo[k] < 0x78) { + sprite_C[k]++; + sprite_y_vel[k] &= ~1; + sprite_x_vel[k] &= ~1; + sprite_delay_aux2[k] = 0x30; + return; + } + j = sprite_B[k] & 1; + sprite_y_vel[k] += j ? -1 : 1; + if (sprite_y_vel[k] == (uint8)kBlind_Oscillate_YVelTarget[j]) + sprite_B[k]++; + j = sprite_G[k] & 1; + if (sprite_x_vel[k] != (uint8)kBlind_Oscillate_XVelTarget[j]) + sprite_x_vel[k] += j ? -1 : 1; + if ((sprite_x_lo[k] & ~1) == kBlind_Oscillate_XPosTarget[j]) + sprite_G[k]++; + Sprite_MoveXY(k); + if (sprite_wallcoll[k]) { + Blind_FireballFlurry(k, sprite_wallcoll[k]); + } else if (!(sprite_subtype2[k] & 7)) { + Sprite_SpawnProbeAlways(k, sprite_head_dir[k] << 2); + } + break; + } + case 3: // switch walls + Blind_CheckBumpDamage(k); + if (sprite_delay_aux2[k]) { + Blind_Decelerate_X(k); + Sprite_MoveX(k); + Blind_Decelerate_Y(k); + } else { + static const int8 kBlind_SwitchWall_YVelTarget[2] = {64, -64}; + static const uint8 kBlind_SwitchWall_YPosTarget[2] = {0x90, 0x50}; + j = sprite_D[k] - 2; + if (sprite_y_vel[k] != (uint8)kBlind_SwitchWall_YVelTarget[j]) + sprite_y_vel[k] += j ? -2 : 2; + if ((sprite_y_lo[k] & ~3) == kBlind_SwitchWall_YPosTarget[j]) { + sprite_C[k]++; + sprite_B[k] = sprite_D[k] - 1; + } + Sprite_MoveXY(k); + Blind_Decelerate_X(k); + } + break; + case 4: { // whirl around + Blind_CheckBumpDamage(k); + if (!(sprite_subtype2[k] & 7)) { + static const uint8 kBlind_WhirlAround_Gfx[2] = {0, 9}; + j = sprite_D[k] - 2; + if (sprite_graphics[k] == kBlind_WhirlAround_Gfx[j]) { + sprite_delay_main[k] = 254; + sprite_C[k] = 2; + sprite_D[k] ^= 1; + sprite_G[k] = sprite_x_lo[k] >> 7; + } else { + sprite_graphics[k] += j ? 1 : -1; + } + } + Blind_Decelerate_Y(k); + break; + } + case 5: // fireball reprisal + Blind_FireballFlurry(k, 0x65); // wtf: argument + break; + case 6: // behind the curtain + sprite_hit_timer[k] = 0; + sprite_head_dir[k] = 12; + if (sprite_delay_aux2[k] == 0) { + sprite_C[k]++; + sprite_delay_aux2[k] = 39; + SpriteSfx_QueueSfx1WithPan(k, 0x13); + } else if (sprite_delay_aux2[k] >= 224) { + static const uint8 kBlind_Gfx_BehindCurtain[4] = {14, 13, 12, 10}; + sprite_graphics[k] = kBlind_Gfx_BehindCurtain[(sprite_delay_aux2[k] - 224) >> 3]; + } else { + sprite_graphics[k] = 14; + } + break; + case 7: // rerobe + if (sprite_delay_aux2[k] == 0) { + sprite_C[k] = 2; + sprite_delay_main[k] = 128; + sprite_D[k] = (sprite_y_lo[k] >> 7) + 2; + sprite_G[k] = (sprite_x_lo[k] << 2) | (sprite_x_lo[k] >> 7); + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_ignore_projectile[k] = 0; + } else { + static const uint8 kBlind_Gfx_Rerobe[5] = {10, 11, 12, 13, 14}; + sprite_graphics[k] = kBlind_Gfx_Rerobe[sprite_delay_aux2[k] >> 3]; + } + break; + } + + +} + +void Blind_FireballFlurry(int k, uint8 a) { // 9da465 + sprite_wallcoll[k]--; + sprite_oam_flags[k] = (a & 7) * 2 + 1; + if (sign8(--sprite_E[k])) { + sprite_E[k] = sprite_subtype[k]; + sprite_head_dir[k] = sprite_head_dir[k] + 1 & 15; + } + if (!(sprite_subtype2[k] & 31) && sprite_subtype[k] != 5) + sprite_subtype[k]++; + Blind_AnimateRobes(k); + Blind_SpitFireball(k, 0xf); +} + +int Blind_SpitFireball(int k, uint8 a) { // 9da49d + static const int8 kBlindHead_SpawnFireball_Xvel[16] = {-32, -28, -24, -16, 0, 16, 24, 28, 32, 28, 24, 16, 0, -16, -24, -28}; + static const int8 kBlindHead_SpawnFireball_Yvel[16] = {0, 16, 24, 28, 32, 28, 24, 16, 0, -16, -24, -28, -32, -28, -24, -16}; + if (sprite_subtype2[k] & a) + return -1; + int j = Sprite_SpawnFireball(k); + if (j >= 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x19); + int i = sprite_head_dir[k]; + sprite_x_vel[j] = kBlindHead_SpawnFireball_Xvel[i]; + sprite_y_vel[j] = kBlindHead_SpawnFireball_Yvel[i]; + sprite_defl_bits[j] |= 8; + sprite_bump_damage[j] = 4; + } + return j; +} + +int SpawnBossPoof(int k) { // 9da4f9 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xce, &info); + Sprite_SetX(j, info.r0_x + 16); + Sprite_SetY(j, info.r2_y + 40); + sprite_graphics[j] = 0xf; + sprite_A[j] = 1; + sprite_delay_main[j] = 47; + sprite_flags2[j] = 9; + sprite_ignore_projectile[j] = 9; + sound_effect_1 = 12; + return j; +} + +void Blind_Decelerate_X(int k) { // 9da647 + if (sprite_x_vel[k] != 0) + sprite_x_vel[k] += sign8(sprite_x_vel[k]) ? 2 : -2; + Blind_AnimateRobes(k); + if (sprite_wallcoll[k]) + Blind_FireballFlurry(k, sprite_wallcoll[k]); +} + +void Blind_Decelerate_Y(int k) { // 9da6a4 + if (sprite_y_vel[k] != 0) + sprite_y_vel[k] += sign8(sprite_y_vel[k]) ? 4 : -4; + Sprite_MoveY(k); + if (sprite_wallcoll[k]) + Blind_FireballFlurry(k, sprite_wallcoll[k]); +} + +void Blind_CheckBumpDamage(int k) { // 9da6c0 + if (!(sprite_delay_aux4[k] | sprite_F[k])) + Sprite_CheckDamageToAndFromLink(k); + if ((uint16)(link_x_coord - cur_sprite_x + 14) < 28 && + (uint16)(link_y_coord - cur_sprite_y) < 28 && + !(countdown_for_blink | link_disable_sprite_damage)) { + link_auxiliary_state = 1; + link_give_damage = 8; + link_incapacitated_timer = 16; + link_actual_vel_x ^= 255; + link_actual_vel_y ^= 255; + } +} + +void Blind_Animate(int k) { // 9da6ef + static const uint8 kBlind_HeadDir[17] = {0, 1, 2, 3, 4, 3, 2, 1, 0, 15, 14, 13, 12, 13, 14, 15, 0}; + static const uint8 kBlind_Animate_Tab[8] = {0, 1, 1, 2, 2, 3, 3, 4}; + + if (!sprite_wallcoll[k]) { + int t1 = kBlind_Animate_Tab[BYTE(link_x_coord) >> 5]; + t1 = (sprite_D[k] == 3) ? -t1 : t1; + int t0 = (sprite_D[k] - 2) * 8; + int idx = (byte_7E0B69 >> 3 & 7) + (byte_7E0B69 >> 2 & 1) + t0; + sprite_head_dir[k] = (kBlind_HeadDir[idx] + t1) & 15; + } + Blind_AnimateRobes(k); +} + +void Blind_AnimateRobes(int k) { // 9da729 + static const uint8 kBlind_Gfx_Animate[8] = {7, 8, 9, 8, 0, 1, 2, 1}; + sprite_graphics[k] = kBlind_Gfx_Animate[(sprite_subtype2[k] >> 3 & 3) + ((sprite_D[k] - 2) << 2)]; +} + +void Blind_SpawnLaser(int k) { // 9da765 + static const int8 kBlind_Laser_Xvel[16] = {-8, -8, -8, -4, 0, 4, 8, 8, 8, 8, 8, 4, 0, -4, -8, -8}; + static const int8 kBlind_Laser_Yvel[16] = {0, 0, 4, 8, 8, 8, 4, 0, 0, 0, -4, -8, -8, -8, -4, 0}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xce, &info), i; + if (j >= 0) { + sound_effect_2 = Sprite_CalculateSfxPan(k) | 0x26; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_lo[j] = info.r0_x + 4; + sprite_head_dir[j] = i = sprite_head_dir[k]; + sprite_x_vel[j] = kBlind_Laser_Xvel[i]; + sprite_y_vel[j] = kBlind_Laser_Yvel[i]; + sprite_A[j] = 128; + sprite_ignore_projectile[j] = 128; + sprite_flags2[j] = 0x40; + sprite_flags4[j] = 0x14; + } +} + +void Blind_Draw(int k) { // 9dac6c + + if (sprite_graphics[k] >= 15) { + static const DrawMultipleData kBlindPoof_Dmd[37] = { + {-16, -20, 0x0586, 2}, + {-11, -28, 0x0586, 2}, + {-23, -26, 0x0586, 2}, + { -8, -17, 0x0586, 2}, + {-20, -13, 0x0586, 2}, + {-16, -37, 0x0586, 2}, + {-27, -31, 0x0586, 2}, + {-10, -28, 0x0586, 2}, + { -5, -28, 0x0586, 2}, + {-20, -27, 0x0586, 2}, + {-27, -17, 0x0586, 2}, + { -4, -17, 0x0586, 2}, + {-16, -13, 0x0586, 2}, + {-18, -37, 0x458a, 2}, + { -5, -33, 0x458a, 2}, + {-32, -32, 0x058a, 2}, + {-23, -31, 0x458a, 2}, + {-15, -24, 0x458a, 2}, + {-23, -31, 0x458a, 2}, + {-15, -24, 0x458a, 2}, + {-29, -22, 0x058a, 2}, + { -5, -22, 0x058a, 2}, + {-16, -14, 0x058a, 2}, + {-12, -32, 0x458a, 2}, + {-26, -29, 0x458a, 2}, + { -6, -22, 0x458a, 2}, + {-19, -20, 0x058a, 2}, + {-26, -29, 0x458a, 2}, + { -6, -22, 0x458a, 2}, + {-19, -20, 0x058a, 2}, + {-17, -27, 0x059b, 0}, + {-10, -26, 0x059b, 0}, + { 0, -22, 0x459b, 0}, + {-19, -16, 0x459b, 0}, + { -6, -12, 0x059b, 0}, + { 0, 13, 0x0b20, 2}, + { 0, 23, 0x0b22, 2}, + }; + static const uint8 kOffs[] = { 0, 1, 5, 13, 23, 30, 35, 37 }; + int j = sprite_graphics[k] - 15; + Sprite_DrawMultiple(k, &kBlindPoof_Dmd[kOffs[j]], kOffs[j + 1] - kOffs[j], NULL); + return; + } + static const DrawMultipleData kBlind_Dmd[105] = { + { -8, 7, 0x0c8e, 2}, + { 8, 7, 0x4c8e, 2}, + { -8, 23, 0x0ca0, 2}, + { 8, 23, 0x4ca4, 2}, + { 0, 0, 0x0a8c, 2}, + {-19, 3, 0x0aa6, 2}, + { 19, 3, 0x4aa6, 2}, + { -8, 7, 0x0c8e, 2}, + { 8, 7, 0x4c8e, 2}, + { -8, 23, 0x0ca2, 2}, + { 8, 23, 0x4ca0, 2}, + { 0, 0, 0x0a8c, 2}, + {-19, 3, 0x0aa8, 2}, + { 19, 3, 0x4aa8, 2}, + { -8, 7, 0x0c8e, 2}, + { 8, 7, 0x4c8e, 2}, + { -8, 23, 0x0ca4, 2}, + { 8, 23, 0x4ca2, 2}, + { 0, 0, 0x0a8c, 2}, + {-19, 3, 0x0aaa, 2}, + { 19, 3, 0x4aaa, 2}, + {-15, 5, 0x0aa6, 2}, + { -6, 7, 0x0c8e, 2}, + { 6, 7, 0x4c8e, 2}, + { -6, 23, 0x0ca4, 2}, + { 6, 23, 0x4ca0, 2}, + { 0, 0, 0x0a8a, 2}, + { 16, -1, 0x4aa6, 2}, + {-11, 9, 0x0aa6, 2}, + { -4, 7, 0x0c8e, 2}, + { 5, 7, 0x4c8e, 2}, + { -4, 23, 0x0ca4, 2}, + { 5, 23, 0x4ca0, 2}, + { 0, 0, 0x0a88, 2}, + { 10, -2, 0x4aa6, 2}, + { 0, 0, 0x0a84, 2}, + { 13, 8, 0x4aa6, 2}, + {-10, -2, 0x0aa6, 2}, + { -5, 7, 0x0c8e, 2}, + { 5, 7, 0x4c8e, 2}, + { -5, 23, 0x0ca0, 2}, + { 5, 23, 0x4ca4, 2}, + { 0, 0, 0x0a82, 2}, + { 18, 4, 0x4aa6, 2}, + {-15, -1, 0x0aa6, 2}, + { -6, 7, 0x0c8e, 2}, + { 6, 7, 0x4c8e, 2}, + { -6, 23, 0x0ca0, 2}, + { 6, 23, 0x4ca4, 2}, + { 0, 0, 0x0a80, 2}, + {-19, 3, 0x0aa6, 2}, + { 19, 3, 0x4aa6, 2}, + { -8, 7, 0x0c8e, 2}, + { 8, 7, 0x4c8e, 2}, + { -8, 23, 0x0ca0, 2}, + { 8, 23, 0x4ca4, 2}, + { 0, 0, 0x0a80, 2}, + {-19, 3, 0x0aa8, 2}, + { 19, 3, 0x4aa8, 2}, + { -8, 7, 0x0c8e, 2}, + { 8, 7, 0x4c8e, 2}, + { -8, 23, 0x0ca2, 2}, + { 8, 23, 0x4ca0, 2}, + { 0, 0, 0x0a80, 2}, + {-19, 3, 0x0aaa, 2}, + { 19, 3, 0x4aaa, 2}, + { -8, 7, 0x0c8e, 2}, + { 8, 7, 0x4c8e, 2}, + { -8, 23, 0x0ca0, 2}, + { 8, 23, 0x4ca4, 2}, + { -8, 9, 0x0c8e, 2}, + { 8, 9, 0x4c8e, 2}, + { -8, 23, 0x0cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 0, 2, 0x0a8c, 2}, + { -8, 16, 0x0c8e, 2}, + { 8, 16, 0x4c8e, 2}, + { -8, 23, 0x0cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 0, 9, 0x0a8c, 2}, + { -8, 23, 0x0cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 8, 23, 0x4cae, 2}, + { 0, 16, 0x0a8c, 2}, + { -8, 23, 0x0cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 0, 20, 0x0a8c, 2}, + { -8, 23, 0x0cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 8, 23, 0x4cac, 2}, + { 0, 23, 0x0a8c, 2}, + }; + Sprite_DrawMultiple(k, &kBlind_Dmd[sprite_graphics[k] * 7], 7, NULL); + OamEnt *oam = GetOamCurPtr(); + if (sprite_wallcoll[k] == 0) { + if (sprite_C[k] == 6) { + oam[6].y = 0xf0; + return; + } + if (sprite_C[k] == 4) + return; + } + if (sprite_graphics[k] >= 10) + return; + static const uint8 kBlind_OamIdx[10] = {4, 4, 4, 5, 5, 0, 0, 0, 0, 0}; + oam += kBlind_OamIdx[sprite_graphics[k]]; + int j = sprite_head_dir[k]; + oam->charnum = kBlindHead_Draw_Char[j]; + oam->flags = oam->flags & 0x3f | kBlindHead_Draw_Flags[j]; +} + +void TrinexxComponents_Initialize(int k) { // 9dad16 + switch (sprite_type[k]) { + case 0xcb: { + sprite_x_lo[k] += 8; + sprite_y_lo[k] += 16; + Trinexx_CachePosition(k); + overlord_x_lo[2] = 0; + overlord_x_lo[3] = 0; + overlord_x_lo[5] = 0; + overlord_x_lo[7] = 0; + overlord_x_hi[0] = 0; + overlord_x_lo[6] = 255; + Trinexx_RestoreXY(k); + break; + } + case 0xcc: + sprite_graphics[k] = 3; + sprite_delay_main[k] = 128; +common: + for (int j = 0x1a; j >= 0; j--) { + alt_sprite_type[j] = 0x40; + alt_sprite_x_hi[j] = 0; + alt_sprite_y_hi[j] = 0; + } + sprite_subtype2[k] = 1; + Trinexx_CachePosition(k); + break; + case 0xcd: + sprite_delay_main[k] = 255; + goto common; + } +} + +void Trinexx_RestoreXY(int k) { // 9dad4f + sprite_x_lo[k] = sprite_A[k]; + Sprite_SetY(k, (sprite_G[k] << 8) + sprite_C[k] + 12); +} + +void Trinexx_CachePosition(int k) { // 9dad8c + sprite_A[k] = sprite_x_lo[k]; + sprite_B[k] = sprite_x_hi[k]; + sprite_C[k] = sprite_y_lo[k]; + sprite_G[k] = sprite_y_hi[k]; +} + +void Sprite_Trinexx_FinalPhase(int k) { // 9dadb5 + static const uint8 kSprite_TrinexxD_Gfx3[8] = {6, 7, 0, 1, 2, 3, 4, 5}; + static const uint8 kSprite_TrinexxD_Gfx[8] = {7, 7, 1, 1, 3, 3, 5, 5}; + static const int8 kSprite_TrinexxD_Xvel[4] = {0, -31, 0, 31}; + static const int8 kSprite_TrinexxD_Yvel[4] = {31, 0, -31, 0}; + + int j = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k]) >> 1; + uint8 gfx = kSprite_TrinexxD_Gfx3[j]; + sprite_graphics[k] = sprite_delay_aux1[k] ? kSprite_TrinexxD_Gfx[gfx] : gfx; + + Sprite_TrinexxD_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sign8(sprite_ai_state[k])) { + uint8 t = sprite_delay_main[k]; + sprite_hit_timer[k] = t | 0xe0; + if (t == 0) { + sprite_delay_main[k] = 12; + if (sprite_anim_clock[k] == 0) { + sprite_hit_timer[k] = 255; + Sprite_ScheduleBossForDeath(k); + } else { + sprite_anim_clock[k]--; + Sprite_MakeBossExplosion(k); + } + } + return; + } + if (!(frame_counter & 7)) + SpriteSfx_QueueSfx3WithPan(k, 0x31); + + j = ++sprite_subtype2[k] & 0x7f; + moldorm_x_lo[j] = sprite_x_lo[k]; + moldorm_y_lo[j] = sprite_y_lo[k]; + moldorm_x_hi[j] = sprite_x_hi[k]; + moldorm_y_hi[j] = sprite_y_hi[k]; + + if (sprite_F[k] == 14) { + sprite_F[k] = 8; + if (sprite_ai_state[k] == 0) + sprite_ai_state[k] = 2; + } + Sprite_MoveXY(k); + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: + if (!--sprite_A[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 192; + } + Sprite_Get16BitCoords(k); + if (Sprite_CheckTileCollision(k)) { + sprite_D[k] = sprite_D[k] + 1 & 3; + sprite_delay_aux1[k] = 8; + } + j = sprite_D[k]; + sprite_x_vel[k] = kSprite_TrinexxD_Xvel[j]; + sprite_y_vel[k] = kSprite_TrinexxD_Yvel[j]; + break; + case 1: + if (!(frame_counter & 1)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 31); + Sprite_ApproachTargetSpeed(k, pt.x, pt.y); + } + break; + } +} + +void Sprite_TrinexxD_Draw(int k) { // 9daf84 + static const int8 kTrinexxD_HistPos[24] = { + 8, 0xc, 0x10, 0x18, 0x20, 0x28, 0x30, 0x34, 0x38, 0x3c, 0x40, 0x44, 0x48, 0x4c, 0x50, 0x54, + 0x58, 0x5c, 0x60, 0x64, 0x68, 0x6c, 0x70, 0x74, + }; + static const int8 kSprite_TrinexxD_Gfx2[24] = { + 2, 2, 2, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + static const int16 kTrinexxD_OamOffs[24] = { + 0x10, 4, 4, 4, 0x10, 0x10, 0x10, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + }; + + sprite_obj_prio[k] |= 0x30; + PrepOamCoordsRet info; + SpriteDraw_TrinexxRockHead(k, &info); + for (int i = 0; i != sprite_anim_clock[k]; i++) { + int j = sprite_subtype2[k] - kTrinexxD_HistPos[i] & 0x7f; + cur_sprite_x = moldorm_x_hi[j] << 8 | moldorm_x_lo[j]; + cur_sprite_y = moldorm_y_hi[j] << 8 | moldorm_y_lo[j]; + + if ((uint16)(link_x_coord - cur_sprite_x + 8) < 16 && + (uint16)(link_y_coord - cur_sprite_y + 16) < 16 && + !sign8(sprite_ai_state[k]) && + !(countdown_for_blink | link_disable_sprite_damage | submodule_index | flag_unk1)) { + link_auxiliary_state = 1; + link_give_damage = 8; + link_incapacitated_timer = 16; + link_actual_vel_x ^= 255; + link_actual_vel_y ^= 255; + } + oam_cur_ptr += kTrinexxD_OamOffs[i]; + oam_ext_cur_ptr += (kTrinexxD_OamOffs[i] >> 2); + sprite_oam_flags[k] = 1; + if (i == 4 && sprite_ai_state[k] != 0) { + Sprite_Trinexx_CheckDamageToFlashingSegment(k); + sprite_oam_flags[k] = (sprite_subtype2[k] & 6) ^ sprite_oam_flags[k]; + } + sprite_graphics[k] = kSprite_TrinexxD_Gfx2[i]; + if (sprite_graphics[k] != 3) { + SpriteDraw_SingleLarge(k); + } else { + sprite_graphics[k] = 8; + SpriteDraw_TrinexxRockHead(k, &info); + } + } + byte_7E0FB6 = sprite_anim_clock[k]; +} + +void Sprite_Trinexx_CheckDamageToFlashingSegment(int k) { // 9db079 + uint16 old_x = Sprite_GetX(k); + uint16 old_y = Sprite_GetY(k); + Sprite_SetX(k, cur_sprite_x); + Sprite_SetY(k, cur_sprite_y); + sprite_defl_bits[k] = 0x80; + sprite_flags3[k] = 0; + Sprite_CheckDamageFromLink(k); + sprite_defl_bits[k] = 0x84; + sprite_flags3[k] = 0x40; + Sprite_SetX(k, old_x); + Sprite_SetY(k, old_y); +} + +void Sprite_CB_TrinexxRockHead(int k) { // 9db0ca + if (overlord_x_hi[0]) { + Sprite_Trinexx_FinalPhase(k); + return; + } + TM_copy = 0x17; + TS_copy = 0; + SpriteDraw_TrinexxRockHeadAndBody(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sign8(sprite_ai_state[k])) { + flag_block_link_menu = sprite_ai_state[k]; + if (!sprite_delay_main[k]) { + overlord_x_hi[0]++; + Sprite_InitializedSegmented(k); + sprite_subtype2[k] = 0; + sprite_head_dir[k] = 0; + sprite_flags3[k] &= ~0x40; + sprite_defl_bits[k] = 0x80; + sprite_ai_state[k] = 0; + sprite_D[k] = 0; + sprite_A[k] = 0; + sprite_anim_clock[k] = 16; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_A[k] = 128; + HIBYTE(dung_floor_y_vel) = 255; + } else if (sprite_delay_main[k] >= 0xff) { + } else if (sprite_delay_main[k] >= 0xe0) { + if (!(sprite_delay_main[k] & 3)) { + dung_floor_y_vel = -1; + dung_hdr_collision_2_mirror = 1; + } + sprite_y_vel[k] = -8; + Sprite_MoveY(k); + Trinexx_CachePosition(k); + sprite_C[k] = sprite_y_lo[k] - 12; + overlord_x_lo[7] += 2; + } else { + if (!(sprite_delay_main[k] & 3)) + SpriteSfx_QueueSfx2WithPan(k, 0xc); + if (!(sprite_delay_main[k] & 1)) { + static const int8 kTrinexx_X0[8] = {0, 8, 16, 24, -24, -16, -8, 0}; + static const int8 kTrinexx_Y0[8] = {0, 8, 16, 24, -24, -16, -8, 0}; + cur_sprite_x = Sprite_GetX(k) + kTrinexx_X0[GetRandomNumber() & 7]; + cur_sprite_y = Sprite_GetY(k) + kTrinexx_Y0[GetRandomNumber() & 7] - 8; + Sprite_MakeBossDeathExplosion_NoSound(k); + } + sprite_head_dir[k] = 255; + } + return; + } + if ((sprite_state[1] | sprite_state[2]) == 0 && sprite_ai_state[k] < 2) { + sprite_delay_main[k] = 255; + sprite_ai_state[k] = 255; + sound_effect_2 = 0x22; + return; + } + + Trinexx_WagTail(k); + Trinexx_HandleShellCollision(k); + Sprite_CheckDamageToAndFromLink(k); + if (!(frame_counter & 63)) { + PairU8 pair = Sprite_IsRightOfLink(k); + sprite_graphics[k] = (uint8)(pair.b + 24) < 48 ? 0 : pair.a ? 1 : 7; + } + if (overlord_x_lo[6]) { + if (!(frame_counter & 1)) + overlord_x_lo[6]--; + return; + } + if (sprite_state[1] && sprite_ai_state[1] == 3) + return; + if (sprite_state[2] && sprite_ai_state[2] == 3) + return; + + switch (sprite_ai_state[k]) { + case 0: + if (!sprite_delay_main[k]) { + int j = GetRandomNumber() & 3; + if ((sprite_subtype[k] & 0x7f) == j) + return; + if (++sprite_anim_clock[k] == 2) { + sprite_anim_clock[k] = 0; + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 80; + return; + } + static const uint8 kTrinexx_Tab0[4] = {0x60, 0x78, 0x78, 0x90}; + static const uint8 kTrinexx_Tab1[4] = {0x80, 0x70, 0x60, 0x80}; + overlord_x_lo[0] = kTrinexx_Tab0[j]; + overlord_x_lo[1] = kTrinexx_Tab1[j]; + sprite_subtype[k] = j + ((GetRandomNumber() & 3) == 0) * 0x80; + sprite_ai_state[k] = 1; + } + break; + case 1: { + if (sprite_subtype[k] == 0xff && (sprite_delay_main[k] == 0 || Sprite_IsBelowLink(k).a == 0)) { + sprite_subtype[k] = 0; + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + } else { + uint16 x = sprite_x_hi[k] << 8 | overlord_x_lo[0]; + uint16 y = sprite_y_hi[k] << 8 | overlord_x_lo[1]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, sign8(sprite_subtype[k]) ? 16 : 8); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + + uint8 bakx = sprite_x_lo[k]; + uint8 baky = sprite_y_lo[k]; + Sprite_MoveXY(k); + dung_floor_y_vel = (int8)(baky - sprite_y_lo[k]); + dung_floor_x_vel = (int8)(bakx - sprite_x_lo[k]); + + dung_hdr_collision_2_mirror = 1; + Trinexx_CachePosition(k); + sprite_C[k] = sprite_y_lo[k] - 12; + if ((uint8)(overlord_x_lo[0] - sprite_x_lo[k] + 2) < 4 && + (uint8)(overlord_x_lo[1] - sprite_y_lo[k] + 2) < 4) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + } + } + int i = sign8(sprite_subtype[k]) ? 2 : 1; + do { + sprite_subtype2[k] += sign8(sprite_x_vel[k]) ? 1 : -1; + if (!(sprite_subtype2[k] & 0xf)) + SpriteSfx_QueueSfx2WithPan(k, 0x21); + } while (--i); + break; + } + case 2: + Trinexx_WagTail(k); + Trinexx_WagTail(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + Sprite_ApplySpeedTowardsLink(k, 48); + sprite_delay_main[k] = 64; + sound_effect_2 = 0x26; + } + break; + case 3: + Sprite_MoveXY(k); + if (!sprite_delay_main[k]) { + Trinexx_RestoreXY(k); + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + } else if (sprite_delay_main[k] == 0x20) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; + } + break; + } +} + +void Trinexx_WagTail(int k) { // 9db3b5 + if (!overlord_x_lo[5]) { + if (!(++overlord_x_lo[4] & 3)) { + int j = overlord_x_lo[3] & 1; + overlord_x_lo[2] += j ? -1 : 1; + if (overlord_x_lo[2] == (j ? 0 : 6)) { + overlord_x_lo[3] += 1; + overlord_x_lo[5] = 8; + } + } + } else { + --overlord_x_lo[5]; + } +} + +void Trinexx_HandleShellCollision(int k) { // 9db3e6 + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_G[k] << 8; + if ((uint16)(x - link_x_coord + 40) < 80 && (uint16)(y - link_y_coord + 16) < 64 && !(countdown_for_blink | link_disable_sprite_damage)) { + link_auxiliary_state = 1; + link_give_damage = 8; + link_incapacitated_timer = 16; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 32); + link_actual_vel_x = pt.x; + link_actual_vel_y = pt.y; + } +} + +void SpriteDraw_TrinexxRockHead(int k, PrepOamCoordsRet *info) { // 9db560 + static const DrawMultipleData kTrinexx_Draw1_Dmd[36] = { + {-8, -8, 0x40c0, 2}, + { 8, -8, 0x00c0, 2}, + {-8, 8, 0x40e0, 2}, + { 8, 8, 0x00e0, 2}, + + {-8, -8, 0x0000, 2}, + { 8, -8, 0x0002, 2}, + {-8, 8, 0x0020, 2}, + { 8, 8, 0x0022, 2}, + + {-8, -8, 0x00c2, 2}, + { 8, -8, 0x00c4, 2}, + {-8, 8, 0x80c2, 2}, + { 8, 8, 0x80c4, 2}, + + {-8, -8, 0x8020, 2}, + { 8, -8, 0x8022, 2}, + {-8, 8, 0x8000, 2}, + { 8, 8, 0x8002, 2}, + {-8, -8, 0xc0e0, 2}, + { 8, -8, 0x80e0, 2}, + {-8, 8, 0xc0c0, 2}, + { 8, 8, 0x80c0, 2}, + {-8, -8, 0xc022, 2}, + { 8, -8, 0xc020, 2}, + {-8, 8, 0xc002, 2}, + { 8, 8, 0xc000, 2}, + {-8, -8, 0x40c4, 2}, + { 8, -8, 0x40c2, 2}, + {-8, 8, 0xc0c4, 2}, + { 8, 8, 0xc0c2, 2}, + {-8, -8, 0x4002, 2}, + { 8, -8, 0x4000, 2}, + {-8, 8, 0x4022, 2}, + { 8, 8, 0x4020, 2}, + {-8, -8, 0x0026, 2}, + { 8, -8, 0x4026, 2}, + {-8, 8, 0x8026, 2}, + { 8, 8, 0xc026, 2}, + }; + if (!sign8(sprite_ai_state[k])) + sprite_obj_prio[k] |= 0x30; + Sprite_DrawMultiple(k, &kTrinexx_Draw1_Dmd[sprite_graphics[k] * 4], 4, info); +} + +void SpriteDraw_TrinexxRockHeadAndBody(int k) { // 9db587 + static const int8 kTrinexx_Draw_X[35] = { + 0, 3, 9, 16, 24, 0, 2, 7, 13, 20, 0, 1, 4, 9, 15, 0, + 0, 0, 0, 0, 0, -1, -4, -9, -15, 0, -2, -7, -13, -20, 0, -3, + -9, -16, -24, + }; + static const int8 kTrinexx_Draw_Y[35] = { + 0x18, 0x20, 0x25, 0x25, 0x21, 0x18, 0x20, 0x27, 0x2a, 0x2c, 0x18, 0x20, 0x28, 0x2f, 0x34, 0x18, + 0x21, 0x2a, 0x34, 0x3d, 0x18, 0x20, 0x28, 0x2f, 0x34, 0x18, 0x20, 0x27, 0x2a, 0x2c, 0x18, 0x20, + 0x25, 0x25, 0x21, + }; + static const uint8 kTrinexx_Draw_Char[5] = {6, 0x28, 0x28, 0x2c, 0x2c}; + static const uint8 kTrinexx_Mults[8] = {0xfc, 0xe0, 0xc0, 0xa0, 0x80, 0x60, 0x40, 0x20}; + static const int8 kTrinexx_Draw_Xoffs[16] = {0, 2, 3, 4, 4, 4, 3, 2, 0, -2, -3, -4, -4, -4, -3, -2}; + static const int8 kTrinexx_Draw_Yoffs[16] = {-4, -4, -3, -2, 0, 2, 3, 4, 4, 4, 3, 2, 0, -2, -3, -4}; + if (sign8(sprite_head_dir[k])) + return; + + PrepOamCoordsRet info; + SpriteDraw_TrinexxRockHead(k, &info); + + info.flags &= ~0x10; + + if (sprite_ai_state[k] == 3) { + OamEnt *oam = GetOamCurPtr() + 4; + uint8 xb = sprite_A[k] - sprite_x_lo[k]; + uint8 yb = sprite_C[k] - sprite_y_lo[k]; + for (int i = 7; i >= 0; i--, oam++) { + oam->x = info.x + TrinexxMult(xb, kTrinexx_Mults[i]); + oam->y = info.y + TrinexxMult(yb, kTrinexx_Mults[i]); + oam->charnum = 0x28; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = 2; + } + byte_7E0FB6 = 0x30; + } + oam_cur_ptr = 0x9f0; + oam_ext_cur_ptr = 0xa9c; + OamEnt *oam = GetOamCurPtr(); + uint8 xb = sprite_A[k] - BG2HOFS_copy2; + uint16 yb = (sprite_C[k] | sprite_y_hi[k] << 8) - BG2VOFS_copy2; + + uint8 xidx = (uint8)(sprite_x_vel[k] + 3) < 7 ? 0 : (sprite_subtype2[k] >> 2); + uint8 yidx = sprite_subtype2[k] >> 2; + + for (int i = 1; i >= 0; i--, oam += 2) { + oam[0].x = oam[1].x = xb + (i ? -28 : 28) + kTrinexx_Draw_Xoffs[xidx + (1-i) * 8 & 0xf]; + oam[0].y = yb - 8 + kTrinexx_Draw_Yoffs[yidx + i * 8 & 0xf]; + oam[1].y = oam[0].y + 16; + oam[0].charnum = 0xc; + oam[1].charnum = 0x2a; + oam[0].flags = oam[1].flags = info.flags | (i ? 0 : 0x40); + WORD(bytewise_extended_oam[oam - oam_buf]) = 0x202; + } + + oam = (OamEnt *)&g_ram[0x800] + 91; + int g = overlord_x_lo[2]; + for (int i = 0; i < 5; i++, oam++) { + int j = g * 5 + i; + oam->x = xb + kTrinexx_Draw_X[j]; + uint16 y = yb - kTrinexx_Draw_Y[j] - 0x20 + WORD(overlord_x_lo[7]); + oam->y = ClampYForOam(y); + oam->charnum = kTrinexx_Draw_Char[i]; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = 2; + } + tmp_counter = 0xff; + + if (submodule_index) + Sprite_CorrectOamEntries(k, 3, 2); +} + +void Sprite_Sidenexx(int k) { // 9db8a7 + static const int8 kTrinexxHead_Xoffs[2] = {-14, 13}; + + int xx = (sprite_B[0] << 8 | sprite_A[0]) + kTrinexxHead_Xoffs[sprite_type[k] - 0xcc]; + sprite_A[k] = xx, sprite_B[k] = xx >> 8; + + int yy = (sprite_G[0] << 8 | sprite_C[0]) - 0x20; + sprite_C[k] = yy, sprite_G[k] = yy >> 8; + sprite_obj_prio[k] |= 0x30; + TrinexxHead_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sign8(sprite_ai_state[k])) { + sprite_ignore_projectile[k] = sprite_ai_state[k]; + Sidenexx_Explode(k); + return; + } + + if (sprite_hit_timer[k] && sprite_ai_state[k] != 4) { + sprite_hit_timer[k] = 0; + sprite_delay_main[k] = 128; + sprite_ai_state[k] = 4; + sprite_z_vel[k] = sprite_oam_flags[k]; + sprite_oam_flags[k] = 3; + } + Sprite_CheckDamageToAndFromLink(k); + sprite_defl_bits[k] |= 4; + switch(sprite_ai_state[k]) { + case 0: + sprite_flags3[k] |= 0x40; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_subtype2[k] = 9; + sprite_flags3[k] &= ~0x40; + } + break; + case 1: + if (!sprite_delay_main[k]) { + int i = (GetRandomNumber() & 7) + 1; + int j = sprite_D[k]; + if (i < 5 && sprite_D[k] != i) { + sprite_D[k] = i; + sprite_ai_state[k] = 2; + if (j == 1 && !(GetRandomNumber() & 1) && sprite_ai_state[0] < 2) { + sprite_graphics[k] = 0; + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 127; + } + } + } + break; + case 2: { + static const uint8 kTrinexxHead_Target0[45] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x58, 0x64, 0x6a, 0x6f, 0x74, 0x7a, 0x7e, + 0x80, 0x80, 0x39, 0x48, 0x52, 0x5c, 0x65, 0x73, 0x77, 0x7a, 0x80, 0x1e, 0x24, 0x29, 0x2e, 0x34, + 0x3a, 0x44, 0x4d, 0x80, 0xa, 0x11, 0x17, 0x1c, 0x22, 0x2a, 0x36, 0x3a, 0x80, + }; + static const uint8 kTrinexxHead_Target1[45] = { + 0x30, 0x28, 0x23, 0x1e, 0x19, 0x13, 0xc, 6, 0, 0x2f, 0x26, 0x21, 0x1d, 0x18, 0x12, 0xc, + 6, 0, 0x2f, 0x27, 0x22, 0x1d, 0x18, 0x12, 0xc, 6, 0, 0x2f, 0x27, 0x22, 0x1d, 0x18, + 0x12, 0xc, 6, 0, 0x48, 0x3a, 0x32, 0x29, 0x22, 0x19, 0x10, 7, 0, + }; + + int j = sprite_D[k] * 9, f = k * 9; + int n = 0; + for (int i = 8; i >= 0; i--, j++, f++) { + if (alt_sprite_type[f] - kTrinexxHead_Target0[j]) { + alt_sprite_type[f] += sign8(alt_sprite_type[f] - kTrinexxHead_Target0[j]) ? 1 : -1; + n++; + } + if (alt_sprite_type[f] - kTrinexxHead_Target0[j]) { + alt_sprite_type[f] += sign8(alt_sprite_type[f] - kTrinexxHead_Target0[j]) ? 1 : -1; + n++; + } + if (alt_sprite_y_hi[f] - kTrinexxHead_Target1[j]) { + alt_sprite_y_hi[f] += sign8(alt_sprite_y_hi[f] - kTrinexxHead_Target1[j]) ? 1 : -1; + n++; + } + } + if (n == 0) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = GetRandomNumber() & 15; + } + break; + } + case 3: { + static const uint8 kTrinexxHead_FrameMask[8] = {1, 1, 3, 3, 7, 0xf, 0x1f, 0x1f}; + int j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + return; + } + if (j == 64) + Sidenexx_ExhaleDanger(k); + sprite_subtype[k] = (j < 8) ? j : (j < 121) ? 8 : ~(sprite_delay_main[k] + 0x80); + if (j >= 64 && !(frame_counter & kTrinexxHead_FrameMask[(j - 64) >> 3])) { + int x = (GetRandomNumber() & 0xf) - 3; + int y = (GetRandomNumber() & 0xf) + 12; + int j = Sprite_GarnishSpawn_Sparkle(k, x, y); + if (sprite_type[k] == 0xcc) + garnish_type[j] = 0xe; + } + break; + } + case 4: { + sprite_defl_bits[k] &= ~4; + sprite_subtype[k] = 0; + int j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 32; + sprite_oam_flags[k] = sprite_z_vel[k]; + sprite_hit_timer[k] = 0; + } + if (j >= 15) { + if (j >= 63 && j < 78) { + if (sprite_type[k] == 0xcd) + Trinexx_FlashShellPalette_Blue(); + else + Trinexx_FlashShellPalette_Red(); + } + } else { + if (sprite_type[k] == 0xcd) + Trinexx_UnflashShellPalette_Blue(); + else + Trinexx_UnflashShellPalette_Red(); + } + } + } +} + +void Sidenexx_ExhaleDanger(int k) { // 9dbae8 + SpriteSpawnInfo info; + if (sprite_type[k] == 0xcd) { + for (int i = 0; i < 2; i++) { + int j = Sprite_SpawnDynamically(k, 0xcd, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_C[j] = i ? 1 : -2; + SpriteSfx_QueueSfx3WithPan(k, 0x19); + sprite_ignore_projectile[j] = sprite_E[j] = 1; + sprite_y_vel[j] = 24; + sprite_flags2[j] = 0; + sprite_flags3[j] = 0x40; + } + } + byte_7E0FB6 = 1; + } else { + int j = Sprite_SpawnDynamically(k, sprite_type[k], &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + SpriteSfx_QueueSfx2WithPan(k, 0x2a); + sprite_ignore_projectile[j] = sprite_E[j] = 1; + sprite_y_vel[j] = 24; + sprite_flags2[j] = 0; + sprite_flags3[j] = 0x40; + } + } +} + +void Sidenexx_Explode(int k) { // 9dbb3f + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 12; + if (sprite_subtype2[k] == 1) + sprite_state[k] = 0; + sprite_subtype2[k]--; + BYTE(cur_sprite_x) += BG2HOFS_copy2; + BYTE(cur_sprite_y) += BG2VOFS_copy2; + Sprite_MakeBossExplosion(k); + } +} + +void TrinexxHead_Draw(int k) { // 9dbb70 + sprite_x_lo[k] = sprite_A[k]; + sprite_x_hi[k] = sprite_B[k]; + sprite_y_lo[k] = sprite_C[k]; + sprite_y_hi[k] = sprite_G[k]; + Sprite_Get16BitCoords(k); + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int i = 0; + do { + int j = i + k * 9; + + uint16 r6 = (k != 2) ? 0x100 + (uint8)(-alt_sprite_type[j]) : alt_sprite_type[j]; + uint8 r15 = alt_sprite_y_hi[j]; + + BYTE(dungmap_var7) = TrinexxHeadSin(r6, r15); + HIBYTE(dungmap_var7) = TrinexxHeadSin(r6 + 0x80, r15); + + if (i == 0) { + static const int8 kTrinexxHead_FirstPart_X[5] = {-8, 8, -8, 8, 0}; + static const int8 kTrinexxHead_FirstPart_Y[5] = {-8, -8, 8, 8, 2}; + static const uint8 kTrinexxHead_FirstPart_Char[5] = {4, 4, 0x24, 0x24, 0xa}; + static const uint8 kTrinexxHead_FirstPart_Flags[5] = {0x40, 0, 0x40, 0, 0}; + + for (int m = 0; m < 5; m++) { + BYTE(cur_sprite_x) = info.x + BYTE(dungmap_var7); + oam->x = BYTE(cur_sprite_x) + kTrinexxHead_FirstPart_X[m]; + + BYTE(cur_sprite_y) = info.y + HIBYTE(dungmap_var7); + oam->y = BYTE(cur_sprite_y) + kTrinexxHead_FirstPart_Y[m] + (m == 4 ? sprite_subtype[k] : 0); + + oam->charnum = kTrinexxHead_FirstPart_Char[m]; + oam->flags = info.flags | kTrinexxHead_FirstPart_Flags[m]; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + } + Sprite_SetX(k, (sprite_B[k] << 8 | sprite_A[k]) + (int8)BYTE(dungmap_var7)); + Sprite_SetY(k, (sprite_G[k] << 8 | sprite_C[k]) + (int8)HIBYTE(dungmap_var7)); + } else { + BYTE(cur_sprite_x) = oam->x = info.x + BYTE(dungmap_var7); + BYTE(cur_sprite_y) = oam->y = info.y + HIBYTE(dungmap_var7); + oam->charnum = 8; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = 2; + oam++; + } + } while (++i != sprite_subtype2[k]); + + tmp_counter = i; + byte_7E0FB6 = i * 4 + 16; + if (submodule_index) + Sprite_CorrectOamEntries(k, 4, 2); +} + +void Sprite_CC_CD_Common(int k) { // 9dbd44 + if (!(frame_counter & 3)) { + int m = Sprite_IsRightOfLink(k).a ? -1 : 1; + if (sprite_x_vel[k] != (uint8)(m * 16)) + sprite_x_vel[k] += m; + } + if (Sprite_CheckTileCollision(k)) + sprite_state[k] = 0; +} + +void Sprite_CD_SpawnGarnish(int k) { // 9dbd65 + if (++sprite_subtype2[k] & 7) + return; + SpriteSfx_QueueSfx3WithPan(k, 0x14); + int j = GarnishAllocOverwriteOld(); + garnish_active = garnish_type[j] = 0xc; + garnish_sprite[j] = k; + Garnish_SetX(j, Sprite_GetX(k)); + Garnish_SetY(j, Sprite_GetY(k) + 16); + garnish_countdown[j] = 127; +} + +void Sprite_TrinexxFire_AddFireGarnish(int k) { // 9dbdd6 + if (++sprite_subtype2[k] & 7) + return; + SpriteSfx_QueueSfx2WithPan(k, 0x2a); + Garnish_FlameTrail(k, false); +} + +int Garnish_FlameTrail(int k, bool is_low) { // 9dbde8 + int j = is_low ? GarnishAllocOverwriteOldLow() : GarnishAllocOverwriteOld(); + garnish_active = garnish_type[j] = 0x10; + garnish_sprite[j] = k; + Garnish_SetX(j, Sprite_GetX(k)); + Garnish_SetY(j, Sprite_GetY(k) + 16); + garnish_countdown[j] = 127; + return j; +} + +void Sprite_CA_ChainChomp(int k) { // 9dbe7d + ChainChomp_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + ChainChomp_HandleLeash(k); + if (!((k ^ frame_counter) & 3) && (sprite_x_vel[k] | sprite_y_vel[k])) + sprite_D[k] = Sprite_ConvertVelocityToAngle(sprite_x_vel[k], sprite_y_vel[k]) & 0xf; + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + } + Sprite_Get16BitCoords(k); + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_G[k] << 8; + sprite_anim_clock[k] = (uint16)(cur_sprite_x - x + 48) < 96 && (uint16)(cur_sprite_y - y + 48) < 96; + switch(sprite_ai_state[k]) { + case 0: // + if (!sprite_delay_main[k]) { + static const int8 kChainChomp_Xvel[16] = {0, 8, 11, 14, 16, 14, 11, 8, 0, -8, -11, -14, -16, -14, -11, -8}; + static const int8 kChainChomp_Yvel[16] = {-16, -14, -11, -8, 0, 8, 11, 14, 16, 14, 11, 8, 0, -9, -11, -14}; + if (++sprite_subtype2[k] == 4) { + sprite_subtype2[k] = 0; + sprite_ai_state[k] = 2; + int j = GetRandomNumber() & 15; + sprite_x_vel[k] = kChainChomp_Xvel[j] << 2; + sprite_y_vel[k] = kChainChomp_Yvel[j] << 2; + GetRandomNumber(); + Sprite_ApplySpeedTowardsLink(k, 64); + SpriteSfx_QueueSfx3WithPan(k, 0x4); + } else { + sprite_delay_main[k] = (GetRandomNumber() & 31) + 16; + int j = GetRandomNumber() & 15; + sprite_x_vel[k] = kChainChomp_Xvel[j]; + sprite_y_vel[k] = kChainChomp_Yvel[j]; + sprite_ai_state[k] = 1; + } + } else { + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + } + break; + case 1: // + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 32; + sprite_ai_state[k] = 0; + } + if (!(sprite_delay_main[k] & 15)) + ChainChomp_MoveChain(k); + if (!sprite_z[k]) + sprite_z_vel[k] = 16; + if (!sprite_anim_clock[k]) { + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_G[k] << 8; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 16); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + Sprite_MoveXY(k); + sprite_delay_main[k] = 12; + } + break; + case 2: // + if (!sprite_anim_clock[k]) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; + Sprite_MoveXY(k); + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_ai_state[k] = 3; + sprite_delay_aux1[k] = 48; + } + ChainChomp_MoveChain(k); + ChainChomp_MoveChain(k); + break; + case 3: // + if (!sprite_delay_aux1[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 48; + } + ChainChomp_MoveChain(k); + ChainChomp_MoveChain(k); + break; + } + +} + +void ChainChomp_MoveChain(int k) { // 9dc02a + static const uint8 kChainChomp_Muls[6] = {205, 154, 102, 51, 8, 0xbd}; // wtf + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_G[k] << 8; + int pos = k * 8; + uint16 x2 = chainchomp_x_hist[pos] - x; + uint16 y2 = chainchomp_y_hist[pos] - y; + pos++; + for (int i = 5; i >= 0; i--) { + uint16 x3 = x + ChainChomp_OneMult(x2, kChainChomp_Muls[(pos & 7) - 1]); + uint16 y3 = y + ChainChomp_OneMult(y2, kChainChomp_Muls[(pos & 7) - 1]); + if (chainchomp_x_hist[pos] - x3) + chainchomp_x_hist[pos] += sign16(chainchomp_x_hist[pos] - x3) ? 1 : -1; + if (chainchomp_y_hist[pos] - y3) + chainchomp_y_hist[pos] += sign16(chainchomp_y_hist[pos] - y3) ? 1 : -1; + pos++; + } +} + +void ChainChomp_HandleLeash(int k) { // 9dc0f2 + int pos = k * 8; + chainchomp_x_hist[pos] = cur_sprite_x; + chainchomp_y_hist[pos] = cur_sprite_y; + for (int i = 0; i < 6; i++, pos++) { + uint16 x = chainchomp_x_hist[pos] - chainchomp_x_hist[pos + 1]; + if (!sign16(x - 8)) + chainchomp_x_hist[pos + 1] = chainchomp_x_hist[pos] - 8; + else if (sign16(x + 8)) + chainchomp_x_hist[pos + 1] = chainchomp_x_hist[pos] + 8; + + uint16 y = chainchomp_y_hist[pos] - chainchomp_y_hist[pos + 1]; + if (!sign16(y - 8)) + chainchomp_y_hist[pos + 1] = chainchomp_y_hist[pos] - 8; + else if (sign16(y + 8)) + chainchomp_y_hist[pos + 1] = chainchomp_y_hist[pos] + 8; + } +} + +void ChainChomp_Draw(int k) { // 9dc192 + static const uint8 kChainChomp_Gfx[16] = {0, 1, 2, 3, 3, 3, 2, 1, 0, 0, 0, 4, 4, 4, 0, 0}; + static const uint8 kChainChomp_OamFlags[16] = {0x40, 0x40, 0x40, 0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40}; + + int j = sprite_D[k]; + sprite_graphics[k] = kChainChomp_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kChainChomp_OamFlags[j]; + SpriteDraw_SingleLarge(k); + OamEnt *oam = GetOamCurPtr() + 1; + uint8 flags = sprite_oam_flags[k] ^ sprite_obj_prio[k]; + int r8 = (sprite_delay_aux1[k] & 1) + 4; + int pos = k * 8; + for (int i = 5; i >= 0; i--, pos++, oam++) { + uint16 x = chainchomp_x_hist[pos] + r8 - BG2HOFS_copy2; + uint16 y = chainchomp_y_hist[pos] + r8 - BG2VOFS_copy2; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = 0x8b; + oam->flags = flags & 0xf0 | 0xd; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } +} + +void Sprite_C9_Tektite(int k) { // 9dc275 + int j = sprite_anim_clock[k]; + if (j) { + sprite_ignore_projectile[k] = j; + sprite_obj_prio[k] = 0x30; + } + switch (j) { + case 0: Sprite_Tektite(k); break; + case 1: Sprite_PhantomGanon(k); break; + case 2: Sprite_GanonTrident(k); break; + case 3: Sprite_SpiralFireBat(k); break; + case 4: Sprite_FireBat_Launched(k); break; + case 5: Sprite_FireBat_Trailer(k); break; + } +} + +void Sprite_Tektite(int k) { // 9dc293 + int j; + + if (sprite_delay_aux1[k]) + sprite_graphics[k] = 0; + Tektite_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXYZ(k); + Sprite_BounceFromTileCollision(k); + sprite_z_vel[k] -= 1; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + } + switch(sprite_ai_state[k]) { + case 0: { // Stationary + static const uint8 kTektite_Dir[4] = {3, 2, 1, 0}; + static const int8 kTektite_Xvel[4] = {16, -16, 16, -16}; + static const int8 kTektite_Yvel[4] = {16, 16, -16, -16}; + PointU8 pt; + j = Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 40) < 80 && (uint8)(pt.y + 40) < 80 && player_oam_y_offset != 0x80 && + !(sprite_z[k] | sprite_pause[k]) && link_is_on_lower_level == sprite_floor[k] && j != kTektite_Dir[link_direction_facing >> 1]) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 32); + sprite_x_vel[k] = -pt.x; + sprite_y_vel[k] = -pt.y; + sprite_z_vel[k] = 16; + sprite_ai_state[k] = 1; + return; + } + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_B[k]++; + if (sprite_B[k] == 4) { + sprite_B[k] = 0; + sprite_ai_state[k]++; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 48; + sprite_z_vel[k] = 12; + j = Sprite_IsBelowLink(k).a * 2 + Sprite_IsRightOfLink(k).a; + } else { + sprite_z_vel[k] = (GetRandomNumber() & 7) + 24; + j = GetRandomNumber() & 3; + } + sprite_x_vel[k] = kTektite_Xvel[j]; + sprite_y_vel[k] = kTektite_Yvel[j]; + } else { + sprite_graphics[k] = sprite_delay_main[k] >> 4 & 1; + } + break; + } + case 1: // Aloft + if (!sprite_z[k]) { +reset_state: + sprite_ai_state[k] = 0; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 72; + sprite_y_vel[k] = 0; + sprite_x_vel[k] = 0; + } else { + sprite_graphics[k] = 2; + } + break; + case 2: // RepeatingHop + if (!sprite_delay_main[k]) + goto reset_state; + if (!sprite_z[k]) { + sprite_z_vel[k] = 12; + sprite_z[k]++; + sprite_delay_aux1[k] = 8; + } + sprite_graphics[k] = 2; + break; + } +} + +void Tektite_Draw(int k) { // 9dc3f5 + static const DrawMultipleData kTektite_Dmd[6] = { + {-8, 0, 0x00c8, 2}, + { 8, 0, 0x40c8, 2}, + {-8, 0, 0x00ca, 2}, + { 8, 0, 0x40ca, 2}, + {-8, 0, 0x00ea, 2}, + { 8, 0, 0x40ea, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kTektite_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_C8_BigFairy(int k) { // 9dc414 + if (sprite_head_dir[k]) + Sprite_FairyCloud(k); + else + Sprite_BigFairy(k); +} + +void Sprite_FairyCloud(int k) { // 9dc41c + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + FaerieCloud_Draw(k); + if (!(sprite_subtype2[k] & 31)) + SpriteSfx_QueueSfx2WithPan(k, 0x31); + switch (sprite_ai_state[k]) { + case 0: + sprite_A[k] = 0; + Sprite_ApplySpeedTowardsLink(k, 8); + Sprite_MoveXY(k); + Sprite_Get16BitCoords(k); + if ((uint16)(link_x_coord - cur_sprite_x + 3) < 6 && + (uint16)(link_y_coord - cur_sprite_y + 11) < 6) { + WORD(link_hearts_filler) += 0xa0; + sprite_ai_state[k] = 1; + } + break; + case 1: + if (link_health_current == link_health_capacity) { + sprite_ai_state[k]++; + sprite_delay_aux2[0] = 112; // zelda bug + } + break; + case 2: + if ((sprite_subtype2[k] & 15) || sign8(sprite_A[k])) + return; + sprite_A[k] = sprite_A[k] * 2 + 1; + if (sprite_A[k] >= 0x80) { + sprite_A[k] = 255; + flag_is_link_immobilized = 0; + sprite_state[k] = 0; + } + break; + } +} + +void Sprite_BigFairy(int k) { // 9dc4bf + PointU8 pt; + int i = sprite_delay_aux2[k]; + if (i != 0 && i < 0x40) { + if (--i == 0) + sprite_state[k] = 0; + if (i & 1) + return; + } + BigFaerie_Draw(k); + if (sign8(--sprite_G[k])) { + sprite_G[k] = 5; + sprite_graphics[k] = sprite_graphics[k] + 1 & 3; + } + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + switch (sprite_ai_state[k]) { + case 0: // await close player + FaerieCloud_Draw(k); + sprite_A[k] = 1; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 0x30) < 0x60 && (uint8)(pt.y + 0x30) < 0x60) { + Link_CancelDash(); + sprite_ai_state[k] = 1; + dialogue_message_index = 0x15a; + Sprite_ShowMessageMinimal(); + flag_is_link_immobilized = 1; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xC8, &info); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_head_dir[j] = 1; + sprite_y_lo[j] -= sprite_z[k]; + sprite_z[j] = 0; + } + break; + case 1: // dormant + break; + } +} + +void BigFaerie_Draw(int k) { // 9dc5d0 + static const DrawMultipleData kBigFaerie_Dmd[16] = { + {-4, -8, 0x008e, 2}, + { 4, -8, 0x408e, 2}, + {-4, 8, 0x00ae, 2}, + { 4, 8, 0x40ae, 2}, + {-4, -8, 0x008c, 2}, + { 4, -8, 0x408c, 2}, + {-4, 8, 0x00ac, 2}, + { 4, 8, 0x40ac, 2}, + {-4, -8, 0x008a, 2}, + { 4, -8, 0x408a, 2}, + {-4, 8, 0x00aa, 2}, + { 4, 8, 0x40aa, 2}, + {-4, -8, 0x008c, 2}, + { 4, -8, 0x408c, 2}, + {-4, 8, 0x00ac, 2}, + { 4, 8, 0x40ac, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kBigFaerie_Dmd[sprite_graphics[k] * 4], 4, &info); + SpriteDraw_Shadow(k, &info); +} + +void FaerieCloud_Draw(int k) { // 9dc616 + static const int8 kFaerieCloud_Draw_XY[8] = {-12, -6, 0, 6, 12, 18, 0, 6}; + if (!sign8(sprite_A[k]) && !(sprite_A[k] & sprite_subtype2[k])) { + int x = kFaerieCloud_Draw_XY[GetRandomNumber() & 7]; + int y = kFaerieCloud_Draw_XY[GetRandomNumber() & 7]; + Sprite_GarnishSpawn_Sparkle(k, x, y); + } +} + +void Sprite_C7_Pokey(int k) { // 9dc64f + if (sprite_C[k]) { + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 16; + sprite_z[k] = 0; + } + if (Sprite_BounceFromTileCollision(k)) + SpriteSfx_QueueSfx2WithPan(k, 0x21); + if (sprite_G[k] >= 3) { + sprite_state[k] = 6; + sprite_delay_main[k] = 10; + sprite_flags5[k] = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x1e); + } + return; + } + + Hokbok_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_A[k] && sprite_F[k] == 15) { + sprite_F[k] = 6; + sprite_z[k] += sprite_B[k]; + if (!--sprite_A[k]) + sprite_health[k] = 17; + sprite_x_vel[k] += sign8(sprite_x_vel[k]) ? -4 : 4; + sprite_y_vel[k] += sign8(sprite_y_vel[k]) ? -4 : 4; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc7, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_C[j] = 1; + sprite_health[j] = 1; + sprite_x_vel[j] = sprite_x_recoil[k]; + sprite_y_vel[j] = sprite_y_recoil[k]; + sprite_defl_bits[j] = 64; + } + } + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_z_vel[k] = 16; + } else { + static const uint8 kHokbok_B[8] = {8, 7, 6, 5, 4, 5, 6, 7}; + sprite_B[k] = kHokbok_B[sprite_delay_main[k] >> 1]; + } + break; + case 1: + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 15; + } + Sprite_BounceFromTileCollision(k); + break; + } +} + +void Hokbok_Draw(int k) { // 9dc77d + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr() + 3; + int d = sprite_B[k]; + uint16 x = info.x, y = info.y; + for (int i = sprite_A[k]; i >= 0; i--, oam--) { + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = ((i == 0) ? 0xa2 : 0xa0) - ((d < 7) ? 0x20 : 0); + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + y -= d; + } + SpriteDraw_Shadow(k, &info); +} + +void Sprite_C5_Medusa(int k) { // 9dc7eb + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (!player_is_indoors) { + sprite_x_vel[k] = 255; + sprite_subtype[k] = 255; + if (!Sprite_CheckTileCollision(k)) + return; + if (Sprite_ReturnIfInactive(k)) + return; + sprite_type[k] = 0x19; + SpritePrep_LoadProperties(k); + sprite_E[k]++; + sprite_x_lo[k] += 8; + sprite_y_lo[k] -= 8; + SpriteSfx_QueueSfx3WithPan(k, 0x19); + sprite_defl_bits[k] = 0x80; + } else { + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + if (!(sprite_subtype2[k] & 0x7f) && sprite_floor[k] == link_is_on_lower_level) { + int j = Sprite_SpawnFireball(k); + if (j >= 0) { + sprite_defl_bits[j] = sprite_defl_bits[j] | 8; + sprite_bump_damage[j] = 4; + } + } + } +} + +void Sprite_C6_4WayShooter(int k) { // 9dc869 + static const int8 kFireballJunction_X[4] = {12, -12, 0, 0}; + static const int8 kFireballJunction_Y[4] = {0, 0, 12, -12}; + static const int8 kFireballJunction_XYvel[6] = {0, 0, 40, -40, 0, 0}; + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k] == 24) { + int j = Sprite_SpawnFireball(k); + if (j >= 0) { + sprite_defl_bits[j] |= 8; + sprite_bump_damage[j] = 4; + int i = Sprite_DirectionToFaceLink(j, NULL); + sprite_x_vel[j] = kFireballJunction_XYvel[i + 2]; + sprite_y_vel[j] = kFireballJunction_XYvel[i]; + Sprite_SetX(j, Sprite_GetX(j) + kFireballJunction_X[i]); + Sprite_SetY(j, Sprite_GetY(j) + kFireballJunction_Y[i]); + } + } else if (sprite_delay_main[k] == 0) { + if (button_b_frames && sprite_floor[k] == link_is_on_lower_level) + sprite_delay_main[k] = 32; + } +} + +void Sprite_C4_Thief(int k) { // 9dc8d8 + int j; + + + + Thief_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageFromLink(k); + if (sprite_ai_state[k] != 3) { + j = Sprite_DirectionToFaceLink(k, NULL); + sprite_head_dir[k] = j; + if ((j ^ sprite_D[k]) == 1) + sprite_D[k] = j; + } + switch (sprite_ai_state[k]) { + case 0: // loitering + Thief_CheckCollisionWithLink(k); + if (!sprite_delay_main[k]) { + if ((uint16)(link_x_coord - cur_sprite_x + 0x50) < 0xa0 && + (uint16)(link_y_coord - cur_sprite_y + 0x50) < 0xa0) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 16; + } + } + sprite_graphics[k] = kThief_Gfx[sprite_D[k]]; + break; + case 1: // watch player + Thief_CheckCollisionWithLink(k); + sprite_D[k] = sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 32; + } +thief_common: + if (!(frame_counter & 31)) + sprite_D[k] = sprite_head_dir[k]; + sprite_graphics[k] = kThief_Gfx[4 + sprite_D[k] + (++sprite_subtype2[k] & 4)]; + break; + case 2: // chase player + Sprite_ApplySpeedTowardsLink(k, 18); + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if (!sprite_delay_main[k]) { + if ((uint16)(link_x_coord - cur_sprite_x + 0x50) >= 0xa0 || + (uint16)(link_y_coord - cur_sprite_y + 0x50) >= 0xa0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 128; + } + } + if (Sprite_CheckDamageToLink(k)) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 32; + Thief_SpillItems(k); + SpriteSfx_QueueSfx2WithPan(k, 0xb); + } + goto thief_common; + case 3: // steal + Thief_CheckCollisionWithLink(k); + j = Thief_ScanForBooty(k); + + if (!sprite_delay_main[k]) { + sprite_graphics[k] = kThief_Gfx[4 + sprite_D[k] + (++sprite_subtype2[k] & 4)]; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + sprite_D[k] = sprite_head_dir[k]; + } + if (!((k ^ frame_counter) & 3)) + sprite_head_dir[k] = Sprite_DirectionToFaceLocation(k, Sprite_GetX(j), Sprite_GetY(j)); + break; + } +} + +uint8 Thief_ScanForBooty(int k) { // 9dca24 + for (int j = 15; j >= 0; j--) { + if (sprite_state[j] && (sprite_type[j] == 0xdc || sprite_type[j] == 0xe1 || sprite_type[j] == 0xd9)) { + Thief_TargetBooty(k, j); + return j; + } + } + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 64; + return 0xff; +} + +void Thief_TargetBooty(int k, int j) { // 9dca4c + if (!((k ^ frame_counter) & 3)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, Sprite_GetX(j), Sprite_GetY(j), 19); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + } + for (j = 15; j >= 0; j--) { + if (!((j ^ frame_counter) & 3 | sprite_delay_aux4[j]) && sprite_state[j] && + (sprite_type[j] == 0xdc || sprite_type[j] == 0xe1 || sprite_type[j] == 0xd9)) { + Thief_GrabBooty(k, j); + } + } +} + +void Thief_GrabBooty(int k, int j) { // 9dca9e + if ((uint16)(Sprite_GetX(j) - cur_sprite_x + 8) < 16 && + (uint16)(Sprite_GetY(j) - cur_sprite_y + 12) < 24) { + sprite_state[j] = 0; + + int t = sprite_type[j] - 0xd8; + SpriteSfx_QueueSfx3WithPan(t, kAbsorptionSfx[t]); + sprite_delay_main[k] = 14; + } +} + +void Thief_CheckCollisionWithLink(int k) { // 9dcaf2 + if (Sprite_CheckDamageToLink_same_layer(k)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 32); + link_actual_vel_y = pt.y; + sprite_y_recoil[k] = pt.y ^ 0xff; + link_actual_vel_x = pt.x; + sprite_x_recoil[k] = pt.x ^ 0xff; + link_incapacitated_timer = 4; + sprite_F[k] = 12; + SpriteSfx_QueueSfx2WithPan(k, 0xb); + } +} + +void Thief_SpillItems(int k) { // 9dcb30 + static const uint8 kThiefSpawn_Items[4] = {0xd9, 0xe1, 0xdc, 0xd9}; + static const int8 kThiefSpawn_Xvel[6] = {0, 24, 24, 0, -24, -24}; + static const int8 kThiefSpawn_Yvel[6] = {-32, -16, 16, 32, 16, -16}; + + tmp_counter = 5; + do { + byte_7E0FB6 = GetRandomNumber() & 3; + int j; + if (byte_7E0FB6 == 1) { + j = link_num_arrows; + } else if (byte_7E0FB6 == 2) { + j = link_item_bombs; + } else { + j = link_rupees_goal; + } + if (!j) + return; + SpriteSpawnInfo info; + j = Sprite_SpawnDynamicallyEx(k, kThiefSpawn_Items[byte_7E0FB6], &info, 7); + if (j < 0) + return; + if (byte_7E0FB6 == 1) + link_num_arrows--; + else if (byte_7E0FB6 == 2) + link_item_bombs--; + else + link_rupees_goal--; + Sprite_SetX(j, link_x_coord); + Sprite_SetY(j, link_y_coord); + sprite_z_vel[j] = 0x18; + sprite_x_vel[j] = kThiefSpawn_Xvel[tmp_counter]; + sprite_y_vel[j] = kThiefSpawn_Yvel[tmp_counter]; + sprite_delay_aux4[j] = 32; + sprite_head_dir[j] = 1; + sprite_stunned[j] = 255; + } while (!sign8(--tmp_counter)); +} + +void Thief_Draw(int k) { // 9dcc9e + static const DrawMultipleData kThief_Dmd[24] = { + {0, -6, 0x0000, 2}, + {0, 0, 0x0006, 2}, + {0, -6, 0x0000, 2}, + {0, 0, 0x4006, 2}, + {0, -6, 0x0000, 2}, + {0, 0, 0x0020, 2}, + {0, -7, 0x0004, 2}, + {0, 0, 0x0022, 2}, + {0, -7, 0x0004, 2}, + {0, 0, 0x4022, 2}, + {0, -7, 0x0004, 2}, + {0, 0, 0x0024, 2}, + {0, -8, 0x0002, 2}, + {0, 0, 0x000a, 2}, + {0, -7, 0x0002, 2}, + {0, 0, 0x000e, 2}, + {0, -7, 0x0002, 2}, + {0, 0, 0x000a, 2}, + {0, -8, 0x4002, 2}, + {0, 0, 0x400a, 2}, + {0, -7, 0x4002, 2}, + {0, 0, 0x400e, 2}, + {0, -7, 0x4002, 2}, + {0, 0, 0x400a, 2}, + }; + static const uint8 kThief_DrawChar[4] = {2, 2, 0, 4}; + static const uint8 kThief_DrawFlags[4] = {0x40, 0, 0, 0}; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kThief_Dmd[sprite_graphics[k] * 2], 2, &info); + if (!sprite_pause[k]) { + OamEnt *oam = GetOamCurPtr(); + int j = sprite_head_dir[k]; + oam->charnum = kThief_DrawChar[j]; + oam->flags = (oam->flags & ~0x40) | kThief_DrawFlags[j]; + SpriteDraw_Shadow(k, &info); + } +} + +void Sprite_C3_Gibo(int k) { // 9dcce1 + if (sprite_B[k]) { + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kGibo_OamFlags[++sprite_subtype2[k] >> 2 & 3]; + if (sprite_delay_main[k]) { + Sprite_MoveXY(k); + Sprite_BounceFromTileCollision(k); + } + return; + } + Gibo_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_anim_clock[k]++; + int j = sprite_head_dir[k], i; + if (sprite_state[j] == 6) { + sprite_state[k] = sprite_state[j]; + sprite_delay_main[k] = sprite_delay_main[j]; + sprite_flags2[k] += 4; + return; + } + sprite_subtype2[k] = frame_counter >> 3 & 3; + if (!(frame_counter & 63)) + sprite_D[k] = Sprite_IsRightOfLink(k).a << 2; + Sprite_CheckDamageToLink(k); // original destroys y which is a bug + switch(sprite_ai_state[k]) { + case 0: // expel nucleus + if (sprite_delay_main[k] == 0) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 48; + sprite_A[k]++; + SpriteSpawnInfo info; + j = Sprite_SpawnDynamically(k, 0xc3, &info); + if (j >= 0) { + static const int8 kGibo_Xvel[8] = {16, 16, 0, -16, -16, -16, 0, 16}; + static const int8 kGibo_Yvel[8] = {0, 0, 16, -16, 16, 16, -16, -16}; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_head_dir[k] = j; + sprite_flags2[j] = 1; + sprite_B[j] = 1; + sprite_flags3[j] = 16; + sprite_health[j] = sprite_G[k]; + sprite_oam_flags[j] = 7; + sprite_delay_main[j] = 48; + if (++sprite_C[k] == 3) { + sprite_C[k] = 0; + i = Sprite_DirectionToFaceLink(k, NULL); + } else { + i = GetRandomNumber() & 7; + } + sprite_x_vel[j] = kGibo_Xvel[i]; + sprite_y_vel[j] = kGibo_Yvel[i]; + } + } else if (sprite_delay_main[k] == 32) { + sprite_delay_aux1[k] = 32; + } + break; + case 1: // delay pursuit + if (!sprite_delay_main[k]) + sprite_ai_state[k]++; + break; + case 2: // pursue nucleus + if (!((k ^ frame_counter) & 3)) { + uint16 x = Sprite_GetX(j), y = Sprite_GetY(j); + if ((uint16)(cur_sprite_x - x + 2) < 4 && + (uint16)(cur_sprite_y - y + 2) < 4) { + j = sprite_head_dir[k]; + sprite_state[j] = 0; + sprite_A[k] = 0; + sprite_ai_state[k] = 0; + sprite_G[k] = sprite_health[j]; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 32; + return; + } + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 16); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + } + Sprite_MoveXY(k); + break; + } +} + +void Gibo_Draw(int k) { // 9dcf5e + static const DrawMultipleData kGibo_Dmd[32] = { + { 4, -4, 0x408a, 2}, + {-4, -4, 0x408f, 0}, + {12, 12, 0x408e, 0}, + {-4, 4, 0x408c, 2}, + { 4, -4, 0x40aa, 2}, + {-4, -4, 0x409f, 0}, + {12, 12, 0x409e, 0}, + {-4, 4, 0x40ac, 2}, + { 3, -3, 0x40aa, 2}, + {-3, -3, 0x409f, 0}, + {11, 11, 0x409e, 0}, + {-3, 3, 0x40ac, 2}, + { 3, -3, 0x408a, 2}, + {-3, -3, 0x408f, 0}, + {11, 11, 0x408e, 0}, + {-3, 3, 0x408c, 2}, + {-3, -4, 0x008a, 2}, + {13, -4, 0x008f, 0}, + {-3, 12, 0x008e, 0}, + { 5, 4, 0x008c, 2}, + {-3, -4, 0x00aa, 2}, + {13, -4, 0x009f, 0}, + {-3, 12, 0x009e, 0}, + { 5, 4, 0x00ac, 2}, + {-2, -3, 0x00aa, 2}, + {12, -3, 0x009f, 0}, + {-2, 11, 0x009e, 0}, + { 4, 3, 0x00ac, 2}, + {-2, -3, 0x008a, 2}, + {12, -3, 0x008f, 0}, + {-2, 11, 0x008e, 0}, + { 4, 3, 0x008c, 2}, + }; + if (!sprite_A[k]) { + uint8 bak0 = sprite_flags2[k]; + sprite_flags2[k] = 1; + uint8 bak1 = sprite_oam_flags[k]; + sprite_oam_flags[k] = kGibo_OamFlags[sprite_anim_clock[k] >> 2 & 3] | + kGibo_OamFlags2[sprite_delay_aux1[k] >> 2 & 1]; + SpriteDraw_SingleLarge(k); + sprite_oam_flags[k] = bak1; + sprite_flags2[k] = bak0; + } + oam_cur_ptr += 8; + oam_ext_cur_ptr += 2; + Sprite_DrawMultiple(k, &kGibo_Dmd[(sprite_subtype2[k] + sprite_D[k]) * 4], 4, NULL); +} + +void Sprite_C2_Boulder(int k) { // 9dcfcb + if (!player_is_indoors) { + Boulder_OutdoorsMain(k); + return; + } + if (byte_7E0FC6 < 3) + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_oam_flags[k] = frame_counter << 2 & 0xc0; + Sprite_MoveXYZ(k); + if ((k ^ frame_counter) & 3) + return; + if ((uint16)(cur_sprite_x - link_x_coord + 4) < 16 && (uint16)(cur_sprite_y - link_y_coord - 4) < 12) + Sprite_AttemptDamageToLinkPlusRecoil(k); + if (!((k ^ frame_counter) & 3) && Sprite_CheckTileCollision(k)) + sprite_state[k] = 0; +} + +void Boulder_OutdoorsMain(int k) { // 9dd02a + static const int8 kBoulder_Zvel[2] = {32, 48}; + static const int8 kBoulder_Yvel[2] = {8, 32}; + static const int8 kBoulder_Xvel[4] = {24, 16, -24, -16}; + sprite_obj_prio[k] = 0x30; + Boulder_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k] -= sprite_D[k]; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXYZ(k); + sprite_z_vel[k]-=2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + int j = Sprite_CheckTileCollision(k) != 0; + sprite_z_vel[k] = kBoulder_Zvel[j]; + sprite_y_vel[k] = kBoulder_Yvel[j]; + j += (GetRandomNumber() & 1) * 2; + sprite_x_vel[k] = kBoulder_Xvel[j]; + sprite_D[k] = (j & 2) - 1; + SpriteSfx_QueueSfx2WithPan(k, 0xb); + + } +} + +void Boulder_Draw(int k) { // 9dd185 + static const DrawMultipleData kBoulder_Dmd[16] = { + {-8, -8, 0x01cc, 2}, + { 8, -8, 0x01ce, 2}, + {-8, 8, 0x01ec, 2}, + { 8, 8, 0x01ee, 2}, + {-8, -8, 0x41ce, 2}, + { 8, -8, 0x41cc, 2}, + {-8, 8, 0x41ee, 2}, + { 8, 8, 0x41ec, 2}, + {-8, -8, 0xc1ee, 2}, + { 8, -8, 0xc1ec, 2}, + {-8, 8, 0xc1ce, 2}, + { 8, 8, 0xc1cc, 2}, + {-8, -8, 0x81ec, 2}, + { 8, -8, 0x81ee, 2}, + {-8, 8, 0x81cc, 2}, + { 8, 8, 0x81ce, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kBoulder_Dmd[(sprite_subtype2[k] >> 3 & 3) * 4], 4, &info); + Sprite_DrawLargeShadow2(k); +} + +void SpriteDraw_BigShadow(int k, int anim) { // 9dd1a8 + cur_sprite_y += sprite_z[k]; + oam_cur_ptr += 16; + oam_ext_cur_ptr += 4; + Sprite_DrawMultiple(k, &kLargeShadow_Dmd[anim * 3], 3, NULL); + Sprite_Get16BitCoords(k); +} + +void Sprite_DrawLargeShadow2(int k) { // 9dd1af + int z = sprite_z[k] >> 3; + SpriteDraw_BigShadow(k, (z > 4) ? 4 : z); +} + +void CutsceneAgahnim_SpawnZeldaOnAltar(int k) { // 9dd1fd + sprite_x_lo[k] += 8; + sprite_y_lo[k] += 6; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc1, &info); + sprite_A[j] = 1; + sprite_ignore_projectile[j] = 1; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_y_lo[j] = info.r2_y + 40; + sprite_flags2[j] = 0; + sprite_oam_flags[j] = 12; +} + +void Sprite_C1_CutsceneAgahnim(int k) { // 9dd234 + switch (sprite_A[k]) { + case 0: CutsceneAgahnim_Agahnim(k); break; + case 1: Sprite_CutsceneAgahnim_Zelda(k); break; + } + +} + +void CutsceneAgahnim_Agahnim(int k) { // 9dd23f + static const uint8 kChattyAgahnim_LevitateGfx[4] = {2, 0, 3, 0}; + int j; + PrepOamCoordsRet info; + + if (sprite_C[k]) { + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + if (!(sprite_delay_main[k] & 1)) + ChattyAgahnim_Draw(k, &info); + return; + } + ChattyAgahnim_Draw(k, &info); + SpriteDraw_CutsceneAgahnimSpell(k, &info); + if (sprite_pause[k]) { + sprite_ai_state[k] = 0; + sprite_B[k] = 0; + sprite_graphics[k] = 0; + sprite_delay_main[k] = 64; + } + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // problab + if (!sprite_delay_main[k]) { + flag_is_link_immobilized = 1; + dialogue_message_index = 0x13d; + Sprite_ShowMessageMinimal(); + sprite_ai_state[k]++; + } + break; + case 1: // levitate zelda + j = ++sprite_B[k]; + sprite_graphics[k] = sprite_z[15] < 16 ? kChattyAgahnim_LevitateGfx[j >> 5 & 3] : 1; + if ((j & 15) == 0) { + sprite_graphics[15] = 1; + if (++sprite_z[15] == 22) { + sound_effect_2 = 0x27; + sprite_ai_state[k]++; + sprite_delay_main[k] = 255; + sprite_subtype2[k] = 2; + sprite_subtype[k] = 255; + } + } + break; + case 2: // do telewarp + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 80; + } else if (sprite_delay_main[k] == 120) { + intro_times_pal_flash = 120; + } else if (sprite_delay_main[k] < 128 && (sprite_delay_main[k] & 3) == 0) { + sound_effect_2 = 0x2b; + if (sprite_subtype2[k] != 14) + sprite_subtype2[k] += 4; + } + break; + case 3: // complete telewarp + if (sprite_delay_main[k]) { + if (!(sprite_delay_main[k] & 3) && sprite_subtype[k] != 9) + sprite_subtype[k] += 2; + } else { + sprite_delay_main[15] = 19; + sprite_ai_state[k]++; + sprite_delay_main[k] = 80; + sprite_subtype2[k] = 0; + sound_effect_1 = 0x33; + } + break; + case 4: // epiblab + if (!sprite_delay_main[k]) { + dialogue_message_index = 0x13e; + Sprite_ShowMessageMinimal(); + sprite_ai_state[k]++; + sprite_delay_main[k] = 2; + } + break; + case 5: // teleport to curtains + if (sprite_delay_main[k] == 1) + sound_effect_2 = 0x28; + sprite_y_vel[k] = -32; + Sprite_MoveY(k); + if (sprite_y_lo[k] < 48) { + sprite_delay_aux4[k] = 66; + sprite_ai_state[k]++; + } + Sprite_Agahnim_ApplyMotionBlur(k); + break; + case 6: // linger then terminate + if (!sprite_delay_aux4[k]) { + flag_is_link_immobilized = 0; + sprite_state[k] = 0; + Sprite_ManuallySetDeathFlagUW(k); + dung_savegame_state_bits |= 0x4000; + } + break; + } +} + +int Sprite_Agahnim_ApplyMotionBlur(int k) { // 9dd392 + if (frame_counter & 3) + return -1; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc1, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_graphics[j] = sprite_graphics[k]; + sprite_delay_main[j] = 32; + sprite_ignore_projectile[j] = 32; + sprite_C[j] = 32; + } + return j; +} + +void ChattyAgahnim_Draw(int k, PrepOamCoordsRet *info) { // 9dd451 + static const DrawMultipleData kChattyAgahnim_Dmd[16] = { + {-8, -8, 0x0b82, 2}, + { 8, -8, 0x4b82, 2}, + {-8, 8, 0x0ba2, 2}, + { 8, 8, 0x4ba2, 2}, + {-8, -8, 0x0b80, 2}, + { 8, -8, 0x4b80, 2}, + {-8, 8, 0x0ba0, 2}, + { 8, 8, 0x4ba0, 2}, + {-8, -8, 0x0b80, 2}, + { 8, -8, 0x4b82, 2}, + {-8, 8, 0x0ba0, 2}, + { 8, 8, 0x4ba2, 2}, + {-8, -8, 0x0b82, 2}, + { 8, -8, 0x4b80, 2}, + {-8, 8, 0x0ba2, 2}, + { 8, 8, 0x4ba0, 2}, + }; + if (sprite_delay_aux4[k] & 1) + return; + + if (sprite_C[k] == 0) { + oam_cur_ptr = 0x900; + oam_ext_cur_ptr = 0xa60; + } + Sprite_DrawMultiple(k, &kChattyAgahnim_Dmd[sprite_graphics[k] * 4], 4, info); + SpriteDraw_Shadow_custom(k, info, 18); +} + +void SpriteDraw_CutsceneAgahnimSpell(int k, PrepOamCoordsRet *info) { // 9dd516 + static const OamEntSigned kChattyAgahnim_Telewarp_Data[28] = { + {-10, -16, 0xce, 0x06}, + { 18, -16, 0xce, 0x06}, + { 20, -13, 0x26, 0x06}, + { 20, -5, 0x36, 0x06}, + {-12, -13, 0x26, 0x46}, + {-12, -5, 0x36, 0x46}, + { 18, 0, 0x26, 0x06}, + { 18, 8, 0x36, 0x06}, + {-10, 0, 0x26, 0x46}, + {-10, 8, 0x36, 0x46}, + { -8, 0, 0x22, 0x06}, + { 8, 0, 0x22, 0x46}, + { -8, 16, 0x22, 0x86}, + { 8, 16, 0x22, 0xc6}, + {-10, -16, 0xce, 0x04}, + { 18, -16, 0xce, 0x04}, + { 20, -13, 0x26, 0x44}, + { 20, -5, 0x36, 0x44}, + {-12, -13, 0x26, 0x04}, + {-12, -5, 0x36, 0x04}, + { 18, 0, 0x26, 0x44}, + { 18, 8, 0x36, 0x44}, + {-10, 0, 0x26, 0x04}, + {-10, 8, 0x36, 0x04}, + { -8, 0, 0x20, 0x04}, + { 8, 0, 0x20, 0x44}, + { -8, 16, 0x20, 0x84}, + { 8, 16, 0x20, 0xc4}, + }; + static const uint8 kChattyAgahnim_Telewarp_Data_Ext[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2}; + Oam_AllocateFromRegionA(0x38); + const OamEntSigned *data = kChattyAgahnim_Telewarp_Data; + if (!(frame_counter & 2)) + data += 14; + const uint8 *ext_data = kChattyAgahnim_Telewarp_Data_Ext; + if (!sprite_subtype2[k]) + return; + OamEnt *oam = GetOamCurPtr(); + uint8 kn = sprite_subtype2[k] - 1; + uint8 end = sprite_subtype[k]; + uint8 t = end + 1; + oam += t; + ext_data += t; + data += t; + do { + oam->x = info->x + data->x; + oam->y = info->y + data->y - 8; + oam->charnum = data->charnum; + oam->flags = data->flags | 0x31; + bytewise_extended_oam[oam - oam_buf] = *ext_data; + } while (data++, ext_data++, oam++, --kn != end); +} + +void Sprite_CutsceneAgahnim_Zelda(int k) { // 9dd57d + static const DrawMultipleData kAltarZelda_Dmd[4] = { + {-4, 0, 0x0103, 2}, + { 4, 0, 0x0104, 2}, + {-4, 0, 0x0100, 2}, + { 4, 0, 0x0101, 2}, + }; + int j = sprite_delay_main[k]; + if (j != 0) { + SpriteDraw_AltarZeldaWarp(k); + if (j == 1) + sprite_state[k] = 0; + if (j < 12) + return; + } + Oam_AllocateFromRegionA(8); + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kAltarZelda_Dmd[sprite_graphics[k] * 2], 2, &info); + AltarZelda_DrawBody(k, &info); +} + +void AltarZelda_DrawBody(int k, PrepOamCoordsRet *info) { // 9dd5e9 + static const uint8 kAltarZelda_XOffs[16] = {4, 4, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}; + Oam_AllocateFromRegionA(8); + int z = sprite_z[k] < 31 ? sprite_z[k] : 31; + uint8 xoffs = kAltarZelda_XOffs[z >> 1]; + + int y = Sprite_GetY(k) - BG2VOFS_copy2; + OamEnt *oam = GetOamCurPtr(); + + oam[0].x = info->x + xoffs; + oam[1].x = info->x - xoffs; + oam[0].y = oam[1].y = ClampYForOam(y + 7); + oam[0].charnum = oam[1].charnum = 0x6c; + oam[0].flags = oam[1].flags = 0x24; + bytewise_extended_oam[oam - oam_buf] = 2; + bytewise_extended_oam[oam - oam_buf + 1] = 2; +} + +void SpriteDraw_AltarZeldaWarp(int k) { // 9dd6b1 + static const DrawMultipleData kAltarZelda_Warp_Dmd[10] = { + { 4, 4, 0x0480, 0}, + { 4, 4, 0x0480, 0}, + { 4, 4, 0x04b7, 0}, + { 4, 4, 0x04b7, 0}, + {-6, 0, 0x0524, 2}, + { 6, 0, 0x4524, 2}, + {-8, 0, 0x0524, 2}, + { 8, 0, 0x4524, 2}, + { 0, 0, 0x05c6, 2}, + { 0, 0, 0x05c6, 2}, + }; + Oam_AllocateFromRegionA(8); + Sprite_DrawMultiple(k, &kAltarZelda_Warp_Dmd[(sprite_delay_main[k] >> 2) * 2], 2, NULL); +} + +void Sprite_InitializedSegmented(int k) { // 9dd6d1 + for (int i = 0; i < 128; i++) { + moldorm_x_lo[i] = sprite_x_lo[k]; + moldorm_x_hi[i] = sprite_x_hi[k]; + moldorm_y_lo[i] = sprite_y_lo[k]; + moldorm_y_hi[i] = sprite_y_hi[k]; + } +} + +void GiantMoldorm_Draw(int k) { // 9dd881 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + sprite_oam_flags[k] = 11; + SpriteDraw_Moldorm_Eyeballs(k, &info); + oam_cur_ptr += 8, oam_ext_cur_ptr += 2; + + int j = sprite_subtype2[k] & 0x7f; + moldorm_x_lo[j] = sprite_x_lo[k]; + moldorm_x_hi[j] = sprite_x_hi[k]; + moldorm_y_lo[j] = sprite_y_lo[k]; + moldorm_y_hi[j] = sprite_y_hi[k]; + + SpriteDraw_Moldorm_Head(k); + if (sprite_B[k] < 4) { + GiantMoldorm_DrawSegment_AB(k, 16); + if (sprite_B[k] < 3) { + GiantMoldorm_DrawSegment_AB(k, 28); + if (sprite_B[k] < 2) { + SpriteDraw_Moldorm_SegmentC(k); + if (sprite_B[k] == 0) + Moldorm_HandleTail(k); + } + } + } + GiantMoldorm_IncrementalSegmentExplosion(k); + Sprite_Get16BitCoords(k); +} + +void GiantMoldorm_IncrementalSegmentExplosion(int k) { // 9dd8f2 + if (sprite_state[k] == 9 && sprite_delay_aux4[k] && sprite_delay_aux4[k] < 80 && + !(sprite_delay_aux4[k] & 15 | submodule_index | flag_unk1)) { + sprite_B[k]++; + Sprite_MakeBossExplosion(k); + } +} + +void SpriteDraw_Moldorm_Head(int k) { // 9dd993 + static const DrawMultipleData kGiantMoldorm_Head_Dmd[16] = { + {-8, -8, 0x0080, 2}, + { 8, -8, 0x0082, 2}, + {-8, 8, 0x00a0, 2}, + { 8, 8, 0x00a2, 2}, + {-8, -8, 0x4082, 2}, + { 8, -8, 0x4080, 2}, + {-8, 8, 0x40a2, 2}, + { 8, 8, 0x40a0, 2}, + {-6, -6, 0x0080, 2}, + { 6, -6, 0x0082, 2}, + {-6, 6, 0x00a0, 2}, + { 6, 6, 0x00a2, 2}, + {-6, -6, 0x4082, 2}, + { 6, -6, 0x4080, 2}, + {-6, 6, 0x40a2, 2}, + { 6, 6, 0x40a0, 2}, + }; + int t = (sprite_subtype2[k] >> 1 & 1) + (sprite_delay_aux1[k] & 2); + Sprite_DrawMultiple(k, &kGiantMoldorm_Head_Dmd[t * 4], 4, NULL); +} + +void SpriteDraw_Moldorm_SegmentC(int k) { // 9dda5f + sprite_graphics[k] = 0; + oam_cur_ptr += 0x10; + oam_ext_cur_ptr += 4; + GiantMoldorm_DrawSegment_C_OrTail(k, 0x28); +} + +void Moldorm_HandleTail(int k) { // 9ddaba + SpriteDraw_Moldorm_Tail(k); + if (!sprite_delay_aux2[k]) { + sprite_A[k] = 1; + sprite_flags4[k] = 0; + sprite_defl_bits[k] = 0; + uint16 oldx = Sprite_GetX(k); + uint16 oldy = Sprite_GetY(k); + Sprite_SetX(k, cur_sprite_x); + Sprite_SetY(k, cur_sprite_y); + Sprite_CheckDamageFromLink(k); + sprite_A[k] = 0; + sprite_flags4[k] = 9; + sprite_defl_bits[k] = 4; + Sprite_SetX(k, oldx); + Sprite_SetY(k, oldy); + } +} + +void SpriteDraw_Moldorm_Tail(int k) { // 9ddb17 + oam_cur_ptr += 4; + oam_ext_cur_ptr += 1; + sprite_graphics[k]++; + sprite_oam_flags[k] = 13; + GiantMoldorm_DrawSegment_C_OrTail(k, 0x30); +} + +void SpriteDraw_Moldorm_Eyeballs(int k, PrepOamCoordsRet *info) { // 9ddb9e + static const int16 kGiantMoldorm_Eye_X[16] = {16, 15, 12, 6, 0, -6, -12, -13, -16, -13, -12, -6, 0, 6, 12, 15}; + static const int16 kGiantMoldorm_Eye_Y[16] = {0, 6, 12, 15, 16, 15, 12, 6, 0, -6, -12, -13, -16, -13, -12, -6}; + static const uint8 kGiantMoldorm_Eye_Char[16] = {0xaa, 0xaa, 0xa8, 0xa8, 0x8a, 0x8a, 0xa8, 0xa8, 0xaa, 0xaa, 0xa8, 0xa8, 0x8a, 0x8a, 0xa8, 0xa8}; + static const uint8 kGiantMoldorm_Eye_Flags[16] = {0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0, 0, 0x80, 0x80}; + OamEnt *oam = GetOamCurPtr(); + uint8 yoff = kBadPullSwitch_Tab5[kBadPullSwitch_Tab4[sprite_graphics[k]]]; + int r7 = sprite_F[k] ? frame_counter : 0; + int r6 = sprite_D[k] - 1; + for (int i = 1; i >= 0; i--, oam++, r6 += 2) { + uint16 x = info->x + kGiantMoldorm_Eye_X[r6 & 0xf]; + int y = info->y + (uint16)kGiantMoldorm_Eye_Y[r6 & 0xf]; + oam->x = x; + oam->y = (uint16)(y + 0x10 + ((y >> 16) & 1)) < 0x100 ? y : 0xf0; + oam->charnum = kGiantMoldorm_Eye_Char[(r6 + r7) & 0xf]; + oam->flags = info->flags | kGiantMoldorm_Eye_Flags[(r6 + r7) & 0xf]; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); + } +} + +void Sprite_ScheduleBossForDeath(int k) { // 9ddc16 + sprite_state[k] = 4; + sprite_A[k] = 0; + sprite_delay_main[k] = 224; +} + +void Sprite_MakeBossExplosion(int k) { // 9ddc2a + SpriteSfx_QueueSfx2WithPan(k, 0xc); + Sprite_MakeBossDeathExplosion_NoSound(k); +} + +void Sprite_MakeBossDeathExplosion_NoSound(int k) { // 9ddc30 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x00, &info); + if (j >= 0) { + load_chr_halfslot_even_odd = 11; + sprite_state[j] = 4; + sprite_flags2[j] = 3; + sprite_oam_flags[j] = 12; + Sprite_SetX(j, cur_sprite_x); + Sprite_SetY(j, cur_sprite_y); + sprite_delay_main[j] = 31; + sprite_A[j] = 31; + sprite_floor[j] = 2; + } +} + +void Vulture_Draw(int k) { // 9ddd5e + static const DrawMultipleData kVulture_Dmd[8] = { + {-8, 0, 0x0086, 2}, + { 8, 0, 0x4086, 2}, + {-8, 0, 0x0080, 2}, + { 8, 0, 0x4080, 2}, + {-8, 0, 0x0082, 2}, + { 8, 0, 0x4082, 2}, + {-8, 0, 0x0084, 2}, + { 8, 0, 0x4084, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kVulture_Dmd[sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); + +} + +void Sprite_Raven(int k) { // 9ddd85 + static const uint8 kRaven_AscendTime[2] = {16, 248}; + int j; + bool fleeing = false; + sprite_obj_prio[k] |= 0x30; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + switch (sprite_ai_state[k]) { + case 0: { // inwait + PairU8 r = Sprite_IsRightOfLink(k); + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | r.a * 0x40; + int x = link_x_coord - cur_sprite_x; + int y = link_y_coord - cur_sprite_y; + if ((uint16)(x + 0x50 + (x >= 0)) < 0xa0 && (uint16)(y + 0x58 + (y >= 0)) < 0xa0) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 24; + SpriteSfx_QueueSfx3WithPan(k, 0x1e); + } + break; + } + case 1: // ascend + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + int j = sprite_A[k]; + sprite_delay_main[k] = kRaven_AscendTime[j]; + Sprite_ApplySpeedTowardsLink(k, 32); + } + sprite_z[k]++; + sprite_graphics[k] = (frame_counter >> 1 & 1) + 1; + break; + case 2: // attack + if (!sprite_delay_main[k] && !(is_in_dark_world && sprite_A[k]) ) + sprite_ai_state[k]++; +fly: + if (!((k ^ frame_counter) & 1)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, fleeing ? 48 : 32); + if (fleeing) + pt.x = -pt.x, pt.y = -pt.y; + if (sprite_x_vel[k] - pt.x) + sprite_x_vel[k] += sign8(sprite_x_vel[k] - pt.x) ? 1 : -1; + if (sprite_y_vel[k] - pt.y) + sprite_y_vel[k] += sign8(sprite_y_vel[k] - pt.y) ? 1 : -1; + } + sprite_graphics[k] = (frame_counter >> 1 & 1) + 1; + j = (sprite_x_vel[k] >> 7) & 1; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | j * 0x40; + break; + case 3: // flee + fleeing = true; + goto fly; + } +} + +void Vitreous_SpawnSmallerEyes(int k) { // 9ddecb + sprite_G[k] = 9; + sprite_graphics[k] = 4; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x4, &info, 13); + + static const int8 kVitreous_SpawnSmallerEyes_X[13] = {8, 22, -8, -22, 0, 14, 19, 33, 26, -14, -19, -33, -26}; + static const int8 kVitreous_SpawnSmallerEyes_Y[13] = {-8, -12, -8, -12, 0, -20, -1, -12, -24, -20, -1, -12, -24}; + static const int8 kVitreous_SpawnSmallerEyes_Gfx[13] = {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + for (j = 13; j != 0; j--) { + sprite_state[j] = 9; + sprite_type[j] = 0xbe; + SpritePrep_LoadProperties(j); + sprite_floor[j] = 0; + Sprite_SetX(j, info.r0_x + kVitreous_SpawnSmallerEyes_X[j - 1]); + Sprite_SetY(j, info.r2_y + kVitreous_SpawnSmallerEyes_Y[j - 1] + 32); + sprite_A[j] = sprite_x_lo[j]; + sprite_B[j] = sprite_x_hi[j]; + sprite_C[j] = sprite_y_lo[j]; + sprite_D[j] = sprite_y_hi[j]; + sprite_ignore_projectile[j] = sprite_graphics[j] = kVitreous_SpawnSmallerEyes_Gfx[j - 1]; + sprite_subtype2[j] = (j - 1) * 8 + GetRandomNumber(); + } +} + +void Sprite_C0_Catfish(int k) { // 9ddf49 + if (sprite_A[k] & 0x80) + Sprite_Catfish_SplashOfWater(k); + else if (sprite_A[k] == 0) + Catfish_BigFish(k); + else + Sprite_Catfish_QuakeMedallion(k); +} + +void Sprite_Catfish_QuakeMedallion(int k) { // 9ddf54 + if (!sprite_z[k]) { + SpriteDraw_WaterRipple_WithOamAdjust(k); + if (!submodule_index && Sprite_CheckDamageToLink_same_layer(k)) { + sprite_state[k] = 0; + item_receipt_method = 0; + Link_ReceiveItem(sprite_A[k], 0); + } + } + if (sprite_delay_aux3[k]) + Oam_AllocateFromRegionC(8); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_x_vel[k] = (int8)sprite_x_vel[k] >> 1; + sprite_y_vel[k] = (int8)sprite_y_vel[k] >> 1; + int j = sprite_ai_state[k]; + if (j == 4) { + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + sprite_z_vel[k] = 0; + } else { + sprite_ai_state[k]++; + static const uint8 kStandaloneItem_Zvel[4] = {0x20, 0x10, 8, 0}; + sprite_z_vel[k] = kStandaloneItem_Zvel[j]; + if (j < 2 && (j = Sprite_SpawnWaterSplash(k)) >= 0) + sprite_delay_main[j] = 16; + } + } +} + +void Catfish_BigFish(int k) { // 9ddfd1 + GreatCatfish_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // AwaitSpriteThrownInCircle + for (int j = 15; j >= 0; j--) { + if (j == k || sprite_state[j] != 3) + continue; + if ((uint16)(cur_sprite_x - Sprite_GetX(j) + 32) < 64 && (uint16)(cur_sprite_y - Sprite_GetY(j) + 32) < 64) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 255; + return; + } + } + break; + case 1: { // RumbleBeforeEmergence + int j = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 255; + bg1_x_offset = 0; + sound_effect_ambient = 5; + sprite_z_vel[k] = 48; + sprite_x_vel[k] = 0; + Catfish_SpawnPlop(k); + } else if (sprite_delay_main[k] < 0xc0) { + if (sprite_delay_main[k] == 0xbf) + sound_effect_ambient = 7; + bg1_x_offset = (j & 1) ? -1 : 1; + flag_is_link_immobilized = 1; + } + break; + } + case 2: { // Emerge + static const uint8 kGreatCatfish_Emerge_Gfx[16] = {1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 0, 0, 0, 0}; + sprite_subtype2[k]++; + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sprite_z_vel[k] == (uint8)(-48)) + Catfish_SpawnPlop(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_ai_state[k]++; + sprite_delay_main[k] = 255; + } + sprite_graphics[k] = kGreatCatfish_Emerge_Gfx[sprite_subtype2[k] >> 2]; + break; + } + case 3: { // ConversateThenSubmerge + int j = sprite_delay_main[k]; + static const uint8 kGreatCatfish_Conversate_Gfx[20] = { 0, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6 }; + if (j == 0) { + sprite_state[k] = 0; + } else { + if (j == 160 || j == 252 || j == 4) { + Sprite_SpawnWaterSplash(k); + } else if (j == 10) { + Catfish_SpawnPlop(k); + } else if (j == 96) { + flag_is_link_immobilized = 0; + dialogue_message_index = link_item_quake_medallion ? 0x12b : 0x12a; + Sprite_ShowMessageMinimal(); + return; + } else if (j == 80) { + if (link_item_quake_medallion) { + if (GetRandomNumber() & 1) + Sprite_SpawnBomb(k); + else + Sprite_SpawnFireball(k); + } else { + Catfish_RegurgitateMedallion(k); + } + } + if (j < 160) + sprite_graphics[k] = kGreatCatfish_Conversate_Gfx[j >> 3]; + } + break; + } + } +} + +int Sprite_SpawnBomb(int k) { // 9de144 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x4a, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_TransmuteToBomb(j); + sprite_delay_aux1[j] = 80; + sprite_x_vel[j] = 24; + sprite_z_vel[j] = 48; + } + return j; +} + +void Catfish_RegurgitateMedallion(int k) { // 9de16c + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc0, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_vel[j] = 24; + sprite_z_vel[j] = 48; + sprite_A[j] = 17; + SpriteSfx_QueueSfx2WithPan(j, 0x20); + sprite_flags2[j] = 0x83; + sprite_flags3[j] = 0x58; + sprite_oam_flags[j] = 0x58 & 0xf; + DecodeAnimatedSpriteTile_variable(0x1c); + } +} + +void Sprite_Zora_RegurgitateFlippers(int k) { // 9de1aa + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc0, &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_z_vel[j] = 32; + sprite_y_vel[j] = 16; + sprite_A[j] = 30; + SpriteSfx_QueueSfx2WithPan(j, 0x20); + sprite_flags2[j] = 0x83; + sprite_flags3[j] = 0x54; + sprite_oam_flags[j] = 0x54 & 15; + sprite_delay_aux3[j] = 0x30; + DecodeAnimatedSpriteTile_variable(0x11); +} + +void Catfish_SpawnPlop(int k) { // 9de1ed + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xec, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_state[j] = 3; + sprite_delay_main[j] = 15; + sprite_ai_state[j] = 0; + sprite_flags2[j] = 3; + SpriteSfx_QueueSfx2WithPan(k, 0x28); + } +} + +int Sprite_SpawnWaterSplash(int k) { // 9de21c + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xc0, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_A[j] = 0x80; + sprite_flags2[j] = 2; + sprite_ignore_projectile[j] = 2; + sprite_oam_flags[j] = 4; + sprite_delay_main[j] = 31; + } + return j; +} + +void GreatCatfish_Draw(int k) { // 9de320 + static const DrawMultipleData kGreatCatfish_Dmd[28] = { + {-4, 4, 0x008c, 2}, + { 4, 4, 0x008d, 2}, + {-4, 4, 0x008c, 2}, + { 4, 4, 0x008d, 2}, + {-4, -4, 0x008c, 2}, + { 4, -4, 0x008d, 2}, + {-4, 4, 0x009c, 2}, + { 4, 4, 0x009d, 2}, + {-4, -4, 0x408d, 2}, + { 4, -4, 0x408c, 2}, + {-4, 4, 0x409d, 2}, + { 4, 4, 0x409c, 2}, + {-4, -4, 0xc09d, 2}, + { 4, -4, 0xc09c, 2}, + {-4, 4, 0xc08d, 2}, + { 4, 4, 0xc08c, 2}, + {-4, 4, 0xc09d, 2}, + { 4, 4, 0xc09c, 2}, + {-4, 4, 0xc09d, 2}, + { 4, 4, 0xc09c, 2}, + { 0, 8, 0x00bd, 0}, + { 8, 8, 0x40bd, 0}, + { 8, 8, 0x40bd, 0}, + { 8, 8, 0x40bd, 0}, + {-8, 0, 0x0086, 2}, + { 8, 0, 0x4086, 2}, + { 8, 0, 0x4086, 2}, + { 8, 0, 0x4086, 2}, + }; + if (sprite_graphics[k]) + Sprite_DrawMultiple(k, &kGreatCatfish_Dmd[(sprite_graphics[k] - 1) * 4], 4, NULL); +} + +void Sprite_Catfish_SplashOfWater(int k) { // 9de37d + static const DrawMultipleData kWaterSplash_Dmd[8] = { + {-8, -4, 0x0080, 0}, + {18, -7, 0x0080, 0}, + {-5, -2, 0x00bf, 0}, + {15, -4, 0x40af, 0}, + { 0, -4, 0x00e7, 2}, + { 0, -4, 0x00e7, 2}, + { 0, -4, 0x00c0, 2}, + { 0, -4, 0x00c0, 2}, + }; + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + Sprite_DrawMultiple(k, &kWaterSplash_Dmd[(sprite_delay_main[k] >> 3) * 2], 2, NULL); +} + +void Sprite_BF_Lightning(int k) { // 9de3ed + static const uint8 kSpriteLightning_Gfx[8] = {0, 1, 2, 3, 0, 1, 2, 3}; + static const uint8 kSpriteLightning_OamFlags[8] = {0, 0, 0, 0, 0x40, 0x40, 0x40, 0x40}; + static const int8 kSpriteLightning_Xoff[64] = { + -15, 0, 0, -15, 0, -15, -15, 0, -15, 0, 0, -15, 0, -15, -15, 0, + 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 0, 15, 0, 0, 15, + 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 0, 15, 0, 0, 15, + -15, 0, 0, -15, 0, -15, -15, 0, -15, 0, 0, -15, 0, -15, -15, 0, + }; + int j = sprite_A[k]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0xb1 | kSpriteLightning_OamFlags[j] | frame_counter << 1 & 14; + sprite_graphics[k] = kSpriteLightning_Gfx[j] + (BYTE(dungeon_room_index2) == 0x20 ? 4 : 0); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k]) + return; + Lightning_SpawnGarnish(k); + sprite_delay_main[k] = 2; + Sprite_SetY(k, Sprite_GetY(k) + 16); + if ((uint8)(sprite_y_lo[k] - BG2VOFS_copy2) >= 0xd0) { + sprite_state[k] = 0; + return; + } + int rr = GetRandomNumber() & 7; + Sprite_SetX(k, Sprite_GetX(k) + kSpriteLightning_Xoff[sprite_A[k] << 3 | rr]); + sprite_A[k] = rr; +} + +void Lightning_SpawnGarnish(int k) { // 9de475 + int j = GarnishAllocOverwriteOld(); + garnish_type[j] = 9; + garnish_active = 9; + garnish_sprite[j] = sprite_A[k]; + garnish_x_lo[j] = sprite_x_lo[k]; + garnish_x_hi[j] = sprite_x_hi[k]; + int y = Sprite_GetY(k) + 16; + garnish_y_lo[j] = y; + garnish_y_hi[j] = y >> 8; + garnish_countdown[j] = 32; +} + +void Sprite_BD_Vitreous(int k) { // 9de4c8 + if (sprite_delay_aux4[k]) + sprite_graphics[k] = 3; + Vitreous_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Vitreous_SetMinionsForth(k); + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: // dormant + byte_7E0FF8 = 0; + sprite_F[k] = 0; + sprite_flags3[k] |= 64; + if (!(frame_counter & 1) && !--sprite_A[k]) { + sprite_flags3[k] &= ~0x40; + sprite_delay_aux4[k] = 16; + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 128; + if (!sprite_G[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 64; + sprite_ignore_projectile[k] = 0; + sound_effect_1 = 0x35; + return; + } + } + sprite_graphics[k] = frame_counter & 0x30 ? 4 : 5; + break; + case 1: // spew lighting + sprite_F[k] = 0; + if (!sprite_delay_main[k]) { + static const uint8 kVitreous_AfromG[10] = {0x20, 0x20, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0}; + sprite_delay_aux4[k] = 16; + sprite_ai_state[k] = 0; + sprite_A[k] = kVitreous_AfromG[sprite_G[k]]; + } else { + Vitreous_Animate(k, sprite_delay_main[k]); + } + break; + case 2: // pursue player + Vitreous_Animate(k, 0x8B); + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sprite_delay_main[k]) { + static const int8 kVitreous_Xvel[2] = {8, -8}; + sprite_x_vel[k] = kVitreous_Xvel[(sprite_delay_main[k] & 2) >> 1]; + Sprite_MoveX(k); + } else { + Sprite_MoveXYZ(k); + Sprite_CheckTileCollision(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 32; + Sprite_ApplySpeedTowardsLink(k, 16); + SpriteSfx_QueueSfx2WithPan(k, 0x21); + } + } + break; + } +} + +void Vitreous_Animate(int k, uint8 a) { // 9de563 + static const int8 kVitreous_Animate_Gfx[2] = {2, 1}; + if (a == 0x40 || a == 0x41 || a == 0x42) + Sprite_SpawnLightning(k); + sprite_graphics[k] = 0; + PairU8 pair = Sprite_IsRightOfLink(k); + if ((uint8)(pair.b + 16) >= 32) + sprite_graphics[k] = kVitreous_Animate_Gfx[pair.a]; +} + +void Vitreous_SetMinionsForth(int k) { // 9de5da + static const uint8 kVitreous_WhichToActivate[16] = {5, 6, 7, 8, 9, 10, 11, 12, 13, 5, 6, 7, 8, 9, 10, 11}; + if (!(++sprite_subtype2[k] & 63)) { + int j = kVitreous_WhichToActivate[GetRandomNumber() & 15]; + if (sprite_ai_state[j] == 0) { + sprite_ai_state[j] = 1; + sound_effect_1 = 0x15; + } else { + sprite_subtype2[k]--; + } + } +} + +void Sprite_SpawnLightning(int k) { // 9de612 + static const int8 kAgahnim_Lighting_X[8] = {-8, 8, 8, -8, 8, -8, -8, 8}; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xBF, &info), i; + if (j >= 0) { + sound_effect_2 = 0x26; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_A[j] = i = GetRandomNumber() & 7; + int t = info.r0_x + (uint16)kAgahnim_Lighting_X[i]; + Sprite_SetX(j, info.r0_x + kAgahnim_Lighting_X[i]); + sprite_y_lo[j] = info.r2_y + 12 + (t >> 16); + sprite_delay_main[j] = 2; + intro_times_pal_flash = 32; + } +} + +void Vitreous_Draw(int k) { // 9de716 + static const DrawMultipleData kVitreous_Dmd[24] = { + {-8, -8, 0x01c0, 2}, + { 8, -8, 0x41c0, 2}, + {-8, 8, 0x01e0, 2}, + { 8, 8, 0x41e0, 2}, + {-8, -8, 0x01c8, 2}, + { 8, -8, 0x01ca, 2}, + {-8, 8, 0x01e8, 2}, + { 8, 8, 0x01ea, 2}, + {-8, -8, 0x41ca, 2}, + { 8, -8, 0x41c8, 2}, + {-8, 8, 0x41ea, 2}, + { 8, 8, 0x41e8, 2}, + {-8, -8, 0x01c2, 2}, + { 8, -8, 0x41c2, 2}, + {-8, 8, 0x01e2, 2}, + { 8, 8, 0x41e2, 2}, + {-8, -8, 0x01c4, 2}, + { 8, -8, 0x41c4, 2}, + {-8, 8, 0x01e4, 2}, + { 8, 8, 0x41e4, 2}, + {-7, -7, 0x01c4, 2}, + { 7, -7, 0x41c4, 2}, + {-7, 7, 0x01e4, 2}, + { 7, 7, 0x41e4, 2}, + }; + if (sprite_ai_state[k] == 2 && sprite_state[k] == 9) + oam_cur_ptr = 0x800, oam_ext_cur_ptr = 0xa20; + Sprite_DrawMultiple(k, &kVitreous_Dmd[sprite_graphics[k] * 4], 4, NULL); + if (sprite_ai_state[k] == 2) { + sprite_obj_prio[k] &= ~0xe; + Sprite_DrawLargeShadow2(k); + } +} + +void Sprite_BE_VitreousEye(int k) { // 9de773 + static const int8 kSprite_Vitreolus_Dx[4] = {1, 0, -1, 0}; + static const int8 kSprite_Vitreolus_Dy[4] = {0, 1, 0, -1}; + int j = sprite_subtype2[k] >> 4 & 3; + cur_sprite_x += kSprite_Vitreolus_Dx[j]; + cur_sprite_y += kSprite_Vitreolus_Dy[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + if (sprite_graphics[k]) + return; + Sprite_CheckDamageFromLink(k); + Sprite_CheckDamageToLink(k); + if (sprite_F[k] == 14) + sprite_F[k] = 5; + switch (sprite_ai_state[k]) { + case 0: // target player + sprite_G[k] = link_x_coord; + sprite_head_dir[k] = link_x_coord >> 8; + sprite_anim_clock[k] = link_y_coord; + sprite_subtype[k] = link_y_coord >> 8; + break; + case 1: // pursue player + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!((k ^ frame_counter) & 1)) { + uint16 x = sprite_head_dir[k] << 8 | sprite_G[k]; + uint16 y = sprite_subtype[k] << 8 | sprite_anim_clock[k]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 16); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + } + Sprite_MoveXY(k); + if ((uint8)(sprite_G[k] - sprite_x_lo[k] + 4) < 8 && (uint8)(sprite_anim_clock[k] - sprite_y_lo[k] + 4) < 8) + sprite_ai_state[k] = 2; + break; + case 2: // return + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!((k ^ frame_counter) & 1)) { + uint16 x = sprite_A[k] | sprite_B[k] << 8; + uint16 y = sprite_C[k] | sprite_D[k] << 8; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 16); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + } + Sprite_MoveXY(k); + if ((uint8)(sprite_A[k] - sprite_x_lo[k] + 4) < 8 && (uint8)(sprite_C[k] - sprite_y_lo[k] + 4) < 8) { + sprite_x_lo[k] = sprite_A[k]; + sprite_x_hi[k] = sprite_B[k]; + sprite_y_lo[k] = sprite_C[k]; + sprite_y_hi[k] = sprite_D[k]; + sprite_ai_state[k] = 0; + } + break; + } +} + +void HelmasaurFireball_TriSplit(int k) { // 9deed3 + static const int8 kHelmasaurFireball_TriSplit_Xvel[3] = {0, 28, -28}; + static const int8 kHelmasaurFireball_TriSplit_Yvel[3] = {-32, 24, 24}; + static const uint8 kHelmasaurFireball_TriSplit_Delay[6] = {32, 80, 128, 32, 80, 128}; + + SpriteSfx_QueueSfx3WithPan(k, 0x36); + sprite_state[k] = 0; + + byte_7E0FB6 = GetRandomNumber(); + for (int i = 2; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x70, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_vel[j] = kHelmasaurFireball_TriSplit_Xvel[i]; + sprite_y_vel[j] = kHelmasaurFireball_TriSplit_Yvel[i]; + sprite_ai_state[j] = 3; + sprite_ignore_projectile[j] = 3; + sprite_delay_main[j] = kHelmasaurFireball_TriSplit_Delay[(byte_7E0FB6 & 3) + i]; + sprite_head_dir[j] = 0; + sprite_graphics[j] = 1; + } + } + tmp_counter = -1; +} + +void HelmasaurFireball_QuadSplit(int k) { // 9def3d + static const int8 kHelmasaurFireball_QuadSplit_Xvel[4] = {32, 32, -32, -32}; + static const int8 kHelmasaurFireball_QuadSplit_Yvel[4] = {-32, 32, -32, 32}; + SpriteSfx_QueueSfx3WithPan(k, 0x36); + sprite_state[k] = 0; + for (int i = 3; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x70, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_vel[j] = kHelmasaurFireball_QuadSplit_Xvel[i]; + sprite_y_vel[j] = kHelmasaurFireball_QuadSplit_Yvel[i]; + sprite_ai_state[j] = 4; + sprite_ignore_projectile[j] = 4; + } + } + tmp_counter = -1; +} + +void Sprite_ArmosCrusher(int k) { // 9def7e + sprite_oam_flags[k] = 7; + bg1_y_offset = sprite_delay_aux4[k] ? (sprite_delay_aux4[k] & 1 ? -1 : 1) : 0; + switch (sprite_G[k]) { + case 0: // retarget + Sprite_CheckDamageToAndFromLink(k); + if (!(sprite_delay_main[k] | sprite_z[k])) { + Sprite_ApplySpeedTowardsLink(k, 32); + sprite_z_vel[k] = 32; + sprite_G[k]++; + sprite_B[k] = link_x_coord; + sprite_C[k] = link_x_coord >> 8; + sprite_E[k] = link_y_coord; + sprite_head_dir[k] = link_y_coord >> 8; + SpriteSfx_QueueSfx2WithPan(k, 0x20); + } + break; + case 1: // approach target + sprite_z_vel[k] += 3; + if (Sprite_CheckTileCollision(k)) + goto advance; + Sprite_Get16BitCoords(k); + uint16 x, y; + x = sprite_B[k] | sprite_C[k] << 8; + y = sprite_E[k] | sprite_head_dir[k] << 8; + if ((uint16)(x - cur_sprite_x + 16) < 32 && (uint16)(y - cur_sprite_y + 16) < 32) { +advance: + sprite_G[k]++; + sprite_delay_main[k] = 16; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + } + break; + case 2: // hover + sprite_z_vel[k] = 0; + if (!sprite_delay_main[k]) + sprite_G[k]++; + break; + case 3: // crush + sprite_z_vel[k] = -104; + if (!sign8(sprite_z[k])) { + sprite_delay_main[k] = 32; + sprite_delay_aux4[k] = 32; + sprite_G[k] = 0; + SpriteSfx_QueueSfx2WithPan(k, 0xc); + } + break; + } +} + +void Sprite_EvilBarrier(int k) { // 9df06b + EvilBarrier_Draw(k); + if (sprite_graphics[k] == 4) + return; + + sprite_graphics[k] = frame_counter >> 1 & 3; + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageFromLink(k) && link_sword_type < 2) { + sprite_hit_timer[k] = 0; + Sprite_AttemptDamageToLinkPlusRecoil(k); + if (!countdown_for_blink) + link_electrocute_on_touch = 64; + } + + if ((uint16)(link_y_coord - cur_sprite_y + 8) < 24 && + (uint16)(link_x_coord - cur_sprite_x + 32) < 64 && + sign8(link_actual_vel_y - 1)) { + link_electrocute_on_touch = 64; + link_incapacitated_timer = 12; + link_auxiliary_state = 1; + link_give_damage = 2; + link_actual_vel_x = 0; + link_actual_vel_y = 48; + } +} + +void EvilBarrier_Draw(int k) { // 9df249 + static const DrawMultipleData kEvilBarrier_Dmd[45] = { + { 0, 0, 0x00e8, 2}, + {-29, 3, 0x00ca, 0}, + {-29, 11, 0x00da, 0}, + { 37, 3, 0x40ca, 0}, + { 37, 11, 0x40da, 0}, + {-24, -2, 0x00e6, 2}, + { -8, -2, 0x00e6, 2}, + { 8, -2, 0x40e6, 2}, + { 24, -2, 0x40e6, 2}, + { 0, 0, 0x00cc, 2}, + {-29, 3, 0x00cb, 0}, + {-29, 11, 0x00db, 0}, + { 37, 3, 0x40cb, 0}, + { 37, 11, 0x40db, 0}, + { 0, 0, 0x00cc, 2}, + { 0, 0, 0x00cc, 2}, + { 0, 0, 0x00cc, 2}, + { 0, 0, 0x00cc, 2}, + { 0, 0, 0x00cc, 2}, + {-29, 3, 0x00cb, 0}, + {-29, 11, 0x00db, 0}, + { 37, 3, 0x40cb, 0}, + { 37, 11, 0x40db, 0}, + {-24, -2, 0x80e6, 2}, + { -8, -2, 0x80e6, 2}, + { 8, -2, 0xc0e6, 2}, + { 24, -2, 0xc0e6, 2}, + { 0, 0, 0x00e8, 2}, + {-29, 3, 0x00ca, 0}, + {-29, 11, 0x00da, 0}, + { 37, 3, 0x40ca, 0}, + { 37, 11, 0x40da, 0}, + { 0, 0, 0x00e8, 2}, + { 0, 0, 0x00e8, 2}, + { 0, 0, 0x00e8, 2}, + { 0, 0, 0x00e8, 2}, + {-29, 3, 0x00cb, 0}, + {-29, 11, 0x00db, 0}, + { 37, 3, 0x40cb, 0}, + { 37, 11, 0x40db, 0}, + { 37, 11, 0x40db, 0}, + { 37, 11, 0x40db, 0}, + { 37, 11, 0x40db, 0}, + { 37, 11, 0x40db, 0}, + { 37, 11, 0x40db, 0}, + }; + cur_sprite_y += 8; + Sprite_DrawMultiple(k, &kEvilBarrier_Dmd[sprite_graphics[k] * 9], 9, NULL); + Sprite_Get16BitCoords(k); +} + +void SpriteDraw_Antfairy(int k) { // 9df395 + static const DrawMultipleData kDrawFourAroundOne_Dmd[30] = { + { 4, 2, 0x02e1, 0}, + { 4, -3, 0x02e3, 0}, + {-1, 2, 0x02e3, 0}, + { 9, 2, 0x02e3, 0}, + { 4, 7, 0x02e3, 0}, + { 4, 2, 0x02e1, 0}, + { 3, -3, 0x02e3, 0}, + { 9, 1, 0x02e3, 0}, + {-1, 3, 0x02e3, 0}, + { 5, 7, 0x02e3, 0}, + { 4, 2, 0x02e1, 0}, + { 1, -3, 0x02e3, 0}, + { 9, -1, 0x02e3, 0}, + {-1, 5, 0x02e3, 0}, + { 7, 7, 0x02e3, 0}, + { 4, 2, 0x02e1, 0}, + { 0, -2, 0x02e3, 0}, + { 8, -2, 0x02e3, 0}, + { 0, 6, 0x02e3, 0}, + { 8, 6, 0x02e3, 0}, + { 4, 2, 0x02e1, 0}, + { 7, -3, 0x02e3, 0}, + {-1, -1, 0x02e3, 0}, + { 9, 5, 0x02e3, 0}, + { 1, 7, 0x02e3, 0}, + { 4, 2, 0x02e1, 0}, + { 5, -3, 0x02e3, 0}, + {-1, 1, 0x02e3, 0}, + { 9, 3, 0x02e3, 0}, + { 3, 7, 0x02e3, 0}, + }; + if (!(++sprite_subtype2[k] & 1 | submodule_index | flag_unk1)) { + if (++sprite_graphics[k] == 6) + sprite_graphics[k] = 0; + } + Sprite_DrawMultiple(k, &kDrawFourAroundOne_Dmd[sprite_graphics[k] * 5], 5, NULL); +} + +void Toppo_Flustered(int k) { // 9df3d4 + sprite_flags2[k] = 130; + sprite_ignore_projectile[k] = 130; + sprite_flags3[k] = 73; + if (!sprite_subtype[k]) { + if (Sprite_CheckDamageToLink(k)) { + dialogue_message_index = 0x174; + Sprite_ShowMessageMinimal(); + sprite_subtype2[k] = 1; + } + } else if (sprite_subtype[k] < 10) { + sprite_subtype[k]++; + } else if (sprite_subtype[k] == 10) { + sprite_flags5[k] = 0; + sprite_state[k] = 6; + sprite_delay_main[k] = 15; + sprite_flags2[k] += 4; + SpriteSfx_QueueSfx2WithPan(k, 0x15); + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x4d, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + ForcePrizeDrop(j, 6, 6); + } + sprite_subtype[k]++; + } + sprite_graphics[k] = ((++sprite_subtype2[k] & 4) >> 2) + 3; +} + +void Goriya_Draw(int k) { // 9df589 + static const DrawMultipleData kGoriya_Dmd2[3] = { + {10, 4, 0x4077, 0}, + {-2, 4, 0x0077, 0}, + { 4, 4, 0x0076, 0}, + }; + static const DrawMultipleData kGoriya_Dmd[32] = { + {-4, -8, 0x0044, 2}, + {12, -8, 0x4044, 0}, + {-4, 8, 0x0064, 0}, + { 4, 0, 0x4054, 2}, + {-4, -8, 0x0044, 2}, + {12, -8, 0x4044, 0}, + {-4, 8, 0x4074, 0}, + { 4, 0, 0x4062, 2}, + {-4, -8, 0x0044, 0}, + { 4, -8, 0x4044, 2}, + {-4, 0, 0x0062, 2}, + {12, 8, 0x4064, 0}, + {-4, -8, 0x0046, 2}, + {12, -8, 0x4046, 0}, + {-4, 8, 0x0066, 0}, + { 4, 0, 0x4056, 2}, + {-4, -8, 0x0046, 2}, + {12, -8, 0x4046, 0}, + {-4, 8, 0x4075, 0}, + { 4, 0, 0x406a, 2}, + {-4, -8, 0x0046, 0}, + { 4, -8, 0x4046, 2}, + {-4, 0, 0x006a, 2}, + {12, 8, 0x0075, 0}, + {-2, -8, 0x004e, 2}, + { 0, 0, 0x006c, 2}, + {-2, -7, 0x004e, 2}, + { 0, 0, 0x006e, 2}, + { 2, -8, 0x404e, 2}, + { 0, 0, 0x406c, 2}, + { 2, -7, 0x404e, 2}, + { 0, 0, 0x406e, 2}, + }; + static const uint8 kGoriyaDmdOffs[] = { 0, 4, 8, 12, 16, 20, 24, 26, 28, 30, 32 }; + if (sprite_delay_aux1[k] && sprite_D[k] != 3) + Sprite_DrawMultiple(k, &kGoriya_Dmd2[sprite_D[k]], 1, NULL); + + PrepOamCoordsRet info; + oam_cur_ptr += 4, oam_ext_cur_ptr++; + int g = sprite_graphics[k]; + Sprite_DrawMultiple(k, &kGoriya_Dmd[kGoriyaDmdOffs[g]], kGoriyaDmdOffs[g + 1] - kGoriyaDmdOffs[g], &info); + sprite_flags2[k]--; + SpriteDraw_Shadow(k, &info); + sprite_flags2[k]++; +} + +void Moldorm_Draw(int k) { // 9df822 + static const int8 kMoldorm_Draw_X[16] = {11, 10, 9, 6, 3, 0, -2, -3, -4, -3, -2, 1, 4, 7, 9, 10}; + static const int8 kMoldorm_Draw_Y[16] = {4, 6, 9, 10, 11, 10, 9, 6, 3, 0, -2, -3, -4, -3, -2, 1}; + static const uint8 kMoldorm_Draw_Char[3] = {0x5d, 0x62, 0x60}; + static const int8 kMoldorm_Draw_XY[3] = {4, 0, 0}; + static const uint8 kMoldorm_Draw_Ext[3] = {0, 2, 2}; + static const uint8 kMoldorm_Draw_GetOffs[3] = {21, 26, 0}; + + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + uint8 base = sprite_D[k] - 1; + for (int i = 1; i >= 0; i--, oam++, base += 2) { + uint16 x = info.x + kMoldorm_Draw_X[base & 0xf]; + int y = info.y + (uint16)kMoldorm_Draw_Y[base & 0xf]; + oam->x = x; + oam->y = (uint16)(y + 0x10 + ((y >> 16) & 1)) < 0x100 ? y : 0xf0; + oam->charnum = 0x4D; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = (x >> 8 & 1); + } + oam_cur_ptr += 8; + oam_ext_cur_ptr += 2; + + int j = (sprite_subtype2[k] & 0x1f) + k * 32; + moldorm_x_lo[j] = sprite_x_lo[k]; + moldorm_x_hi[j] = sprite_x_hi[k]; + moldorm_y_lo[j] = sprite_y_lo[k]; + moldorm_y_hi[j] = sprite_y_hi[k]; + + for (int i = 2; i >= 0; i--, oam++) { + j = ((sprite_subtype2[k] + kMoldorm_Draw_GetOffs[i]) & 0x1f) + k * 32; + uint16 x = (moldorm_x_lo[j] | moldorm_x_hi[j] << 8) - BG2HOFS_copy2 + kMoldorm_Draw_XY[i]; + uint16 y = (moldorm_y_lo[j] | moldorm_y_hi[j] << 8) - BG2VOFS_copy2 + kMoldorm_Draw_XY[i]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kMoldorm_Draw_Char[i]; + oam->flags = info.flags; + bytewise_extended_oam[oam - oam_buf] = kMoldorm_Draw_Ext[i] | (x >> 8 & 1); + } +} + +void TalkingTree_Mouth(int k) { // 9df956 + static const int8 kTalkingTree_Gfx2[4] = {0, 2, 3, 1}; + int j; + TalkingTree_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_flags4[k] = 0; + switch(sprite_ai_state[k]) { + case 0: + sprite_graphics[k] = 0; + if (Sprite_CheckDamageToLink_same_layer(k)) { + Link_CancelDash(); + link_incapacitated_timer = 16; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 48); + link_actual_vel_y = pt.y; + link_actual_vel_x = pt.x; + SpriteSfx_QueueSfx3WithPan(k, 0x32); + sprite_ai_state[k]++; + sprite_delay_main[k] = 48; + } + break; + case 1: + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 8; + } + sprite_graphics[k] = sprite_delay_main[k] >> 1 & 3; + break; + case 2: + sprite_graphics[k] = kTalkingTree_Gfx2[sprite_delay_main[k] >> 1]; // zelda bug wtf + if (sprite_delay_main[k] == 7) + TalkingTree_SpawnBomb(k); + if (!sprite_delay_main[k]) + sprite_ai_state[k]++; + break; + case 3: + sprite_flags4[k] = 7; + if (!sprite_A[k]) { + static const uint8 kTalkingTree_Msgs2[2] = { 0x82, 0x7d }; + j = sprite_x_lo[k] >> 4 & 1 ^ 1; + sprite_A[k] = j; + if (!(Sprite_ShowSolicitedMessage(k, kTalkingTree_Msgs2[j]) & 0x100)) + sprite_A[k] = 0; + } else { + static const uint8 kTalkingTree_Msgs[4] = {0x7e, 0x7f, 0x80, 0x81}; + static const uint8 kTalkingTree_Screens[4] = {0x58, 0x5d, 0x72, 0x6b}; + j = FindInByteArray(kTalkingTree_Screens, BYTE(overworld_screen_index), 4); + Sprite_ShowMessageUnconditional(kTalkingTree_Msgs[j]); + sprite_A[k] = 0; + } + if (!sprite_delay_main[k]) { + static const uint8 kTalkingTree_Gfx[8] = { 1, 2, 3, 1, 3, 1, 2, 3 }; + static const uint8 kTalkingTree_Delay[8] = { 13, 13, 13, 11, 11, 6, 16, 8 }; + sprite_B[k] = j = sprite_B[k] + 1 & 7; + sprite_graphics[k] = kTalkingTree_Gfx[j]; + sprite_delay_main[k] = kTalkingTree_Delay[j]; + } + break; + } +} + +void TalkingTree_SpawnBomb(int k) { // 9dfa4e + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x4a, &info); + if (j >= 0) { + Sprite_TransmuteToBomb(j); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_delay_aux1[j] = 64; + sprite_y_vel[j] = 24; + sprite_z_vel[j] = 18; + } +} + +void TalkingTree_Draw(int k) { // 9dfadb + static const DrawMultipleData kTalkingTree_Dmd[12] = { + {1, -1, 0x00e8, 0}, + {1, 7, 0x00f8, 0}, + {7, -1, 0x40e8, 0}, + {7, 7, 0x40f8, 0}, + {0, -1, 0x00e8, 0}, + {0, 7, 0x00f8, 0}, + {8, -1, 0x40e8, 0}, + {8, 7, 0x40f8, 0}, + {0, 0, 0x00e8, 0}, + {0, 7, 0x00f8, 0}, + {8, 0, 0x40e8, 0}, + {8, 7, 0x40f8, 0}, + }; + int g = sprite_graphics[k] - 1; + if (g < 0) + return; + Sprite_DrawMultiplePlayerDeferred(k, &kTalkingTree_Dmd[g * 4], 4, NULL); +} + +void TalkingTree_Eye(int k) { // 9dfb0a + static const int8 kTalkingTree_Type1_X[2] = {9, -9}; + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + int j = sprite_head_dir[k]; + Sprite_SetX(k, (sprite_A[k] | sprite_B[k] << 8) + kTalkingTree_Type1_X[j]); + Sprite_SetY(k, (sprite_C[k] | sprite_E[k] << 8)); + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 2); + if (!sign8(pt.y)) { + sprite_D[k] = pt.x + 2; + } else if (sprite_D[k] != 2) { + sprite_D[k] += (sprite_D[k] >= 2) ? -1 : 1; + } + static const int8 kTalkingTree_X1[5] = {-2, -1, 0, 1, 2}; + static const int8 kTalkingTree_Y1[5] = {-1, 0, 0, 0, -1}; + j = sprite_D[k]; + Sprite_SetX(k, (sprite_A[k] | sprite_B[k] << 8) + kTalkingTree_X1[j]); + Sprite_SetY(k, (sprite_C[k] | sprite_E[k] << 8) + kTalkingTree_Y1[j]); +} + +void SpritePrep_TalkingTree_SpawnEyeball(int k, int dir) { // 9dfb8a + static const int8 kTalkingTree_SpawnX[2] = {-4, 14}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x25, &info); + if (j >= 0) { + sprite_head_dir[j] = dir; + int x = info.r0_x + kTalkingTree_SpawnX[dir]; + int y = info.r2_y - 11; + Sprite_SetX(j, x); + Sprite_SetY(j, y); + sprite_A[j] = x; + sprite_B[j] = x >> 8; + sprite_C[j] = y; + sprite_E[j] = y >> 8; + sprite_subtype2[j] = 1; + } +} + +void RupeePull_SpawnPrize(int k) { // 9dfbd7 + static const int8 kSpawnRupees_Xvel[4] = {-18, -12, 12, 18}; + static const int8 kSpawnRupees_Yvel[4] = {16, 24, 24, 16}; + static const uint8 kSpawnRupees_Type[3] = {0xd9, 0xda, 0xdb}; + if (num_sprites_killed) { + byte_7E0FB6 = num_sprites_killed < 4 ? 0 : + number_of_times_hurt_by_sprites ? 1 : 2; + tmp_counter = 3; + do { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, kSpawnRupees_Type[byte_7E0FB6], &info); + if (j < 0) + break; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_x_vel[j] = kSpawnRupees_Xvel[tmp_counter]; + sprite_y_vel[j] = kSpawnRupees_Yvel[tmp_counter]; + sprite_stunned[j] = 255; + sprite_delay_aux4[j] = 32; + sprite_delay_aux3[j] = 32; + sprite_z_vel[j] = 32; + } while (!sign8(--tmp_counter)); + } + num_sprites_killed = 0; + number_of_times_hurt_by_sprites = 0; +} + +void Sprite_D5_DigGameGuy(int k) { // 9dfc38 + DiggingGameGuy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + Sprite_MoveXY(k); + sprite_x_vel[k] = 0; + switch(sprite_ai_state[k]) { + case 0: // intro + if ((uint8)(sprite_y_lo[k] + 7) < BYTE(link_y_coord) && Sprite_DirectionToFaceLink(k, NULL) == 2) { + if (savegame_tagalong == 0) { + if (Sprite_ShowSolicitedMessage(k, 0x187) & 0x100) + sprite_ai_state[k]++; + } else { + Sprite_ShowSolicitedMessage(k, 0x18c); + } + } + break; + case 1: // do you want to play + if (choice_in_multiselect_box == 0 && link_rupees_goal >= 80) { + link_rupees_goal -= 80; + Sprite_ShowMessageUnconditional(0x188); + sprite_ai_state[k] = 2; + sprite_graphics[k] = 1; + sprite_delay_main[k] = 80; + beamos_x_hi[0] = 0; + beamos_x_hi[1] = 0; + sprite_delay_aux1[k] = 5; + Sprite_InitializeSecondaryItemMinigame(1); + music_control = 14; + } else { + Sprite_ShowMessageUnconditional(0x189); + sprite_ai_state[k] = 0; + } + break; + case 2: // move out of the way + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_graphics[k] = 1; + } else if (!sprite_delay_aux1[k]) { + sprite_graphics[k] ^= 3; + if (sprite_graphics[k] & 1) + sprite_x_vel[k] = -16; + sprite_delay_aux1[k] = 5; + } + break; + case 3: // start timer + sprite_ai_state[k]++; + super_bomb_indicator_unk1 = 0; + super_bomb_indicator_unk2 = 30; + break; + case 4: // terminate + if ((int8)super_bomb_indicator_unk2 > 0 || link_position_mode & 1) + return; + music_control = 9; + sprite_ai_state[k]++; + byte_7E03FC = 0; + dialogue_message_index = 0x18a; + Sprite_ShowMessageMinimal(); + super_bomb_indicator_unk2 = 254; + break; + case 5: // come back later + Sprite_ShowSolicitedMessage(k, 0x18b); + break; + } +} + +void DiggingGameGuy_Draw(int k) { // 9dfe4b + static const DrawMultipleData kDiggingGameGuy_Dmd[9] = { + { 0, -8, 0x0a40, 2}, + { 4, 9, 0x0c56, 0}, + { 0, 0, 0x0a42, 2}, + { 0, -8, 0x0a40, 2}, + { 0, 0, 0x0a42, 2}, + { 0, 0, 0x0a42, 2}, + {-1, -7, 0x0a40, 2}, + {-1, 0, 0x0a44, 2}, + {-1, 0, 0x0a44, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kDiggingGameGuy_Dmd[sprite_graphics[k] * 3], 3, &info); + SpriteDraw_Shadow(k, &info); +} + +void OldMountainMan_Draw(int k) { // 9dff0e + static const DrawMultipleData kOldMountainMan_Dmd0[2] = { + {0, 0, 0x00ac, 2}, + {0, 8, 0x00ae, 2}, + }; + static const DrawMultipleData kOldMountainMan_Dmd1[16] = { + { 0, 0, 0x0120, 2}, + { 0, 8, 0x0122, 2}, + { 0, 1, 0x0120, 2}, + { 0, 9, 0x4122, 2}, + { 0, 0, 0x0120, 2}, + { 0, 8, 0x0122, 2}, + { 0, 1, 0x0120, 2}, + { 0, 9, 0x4122, 2}, + {-2, 0, 0x0120, 2}, + { 0, 8, 0x0122, 2}, + {-2, 1, 0x0120, 2}, + { 0, 9, 0x0122, 2}, + { 2, 0, 0x4120, 2}, + { 0, 8, 0x4122, 2}, + { 2, 1, 0x4120, 2}, + { 0, 9, 0x4122, 2}, + }; + static const uint8 kOldMountainMan_Dma[16] = {0x20, 0xc0, 0x20, 0xc0, 0, 0xa0, 0, 0xa0, 0x40, 0x80, 0x40, 0x60, 0x40, 0x80, 0x40, 0x60}; + if (sprite_subtype2[k] != 2) { + int j = sprite_D[k] * 4 + sprite_graphics[k] * 2; + BYTE(dma_var6) = kOldMountainMan_Dma[j + 0]; + BYTE(dma_var7) = kOldMountainMan_Dma[j + 1]; + Sprite_DrawMultiplePlayerDeferred(k, &kOldMountainMan_Dmd1[j], 2, NULL); + } else { + Sprite_DrawMultiplePlayerDeferred(k, kOldMountainMan_Dmd0, 2, NULL); + } + +} + +void HelmasaurKing_Initialize(int k) { // 9e8000 + overlord_gen1[7] = 0x30; + overlord_gen1[5] = 0x80; + overlord_gen1[6] = 0; + overlord_gen2[0] = 0; + overlord_gen2[3] = 0; + overlord_gen2[1] = 0; + overlord_gen2[2] = 0; + HelmasaurKing_Reinitialize(k); +} + +void HelmasaurKing_Reinitialize(int k) { // 9e8019 + uint8 t = sprite_subtype2[k]; + for (int i = 3; i >= 0; i--) { + overlord_x_lo[i] = kHelmasaur_Tab0[t + i * 8 & 0x1f]; + } +} + +void Sprite_92_HelmasaurKing(int k) { // 9e8039 + int t, j; + + if (sign8(sprite_C[k])) { + if (sprite_delay_main[k] == 1) + sprite_state[k] = 0; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!(frame_counter & 7 | sprite_delay_aux1[k])) + sprite_oam_flags[k] ^= 0x40; + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_delay_main[k] = 12; + sprite_z_vel[k] = 24; + sprite_graphics[k] = 6; + } + return; + } + if (sprite_C[k] < 3) { + sprite_obj_prio[k] &= ~0xE; + sprite_flags[k] = 0xA; + } else { + sprite_flags4[k] = 0x1F; + sprite_flags[k] = 2; + } + HelmasaurKing_Draw(k); + if (sprite_state[k] == 6) { + t = sprite_delay_main[k]; + if (!t) { + sprite_state[k] = 4; + sprite_A[k] = 0; + sprite_delay_main[k] = 224; + return; + } + sprite_hit_timer[k] = t | 240; + if (t < 128 && (t & 7) == 0 && (j = overlord_gen2[3]) != 0x10) { + overlord_gen2[3]++; + cur_sprite_x = Sprite_GetX(k) + (int8)overlord_x_lo[5 + j]; + cur_sprite_y = Sprite_GetY(k) + (int8)overlord_y_lo[5 + j]; + Sprite_MakeBossExplosion(k); + } + return; + } + + if (Sprite_ReturnIfInactive(k)) + return; + static const uint8 kHelmasaurKing_Tab1[13] = {3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 0}; + t = kHelmasaurKing_Tab1[sprite_health[k] >> 2]; + sprite_C[k] = t; + if (t == 3) { + if (t != sprite_E[k]) { + sprite_hit_timer[k] = 0; + HelmasaurKing_ExplodeMask(k); + } + } else { + if (t != sprite_E[k]) + HelmasaurKing_ChipAwayAtMask(k); + } + sprite_E[k] = sprite_C[k]; + Sprite_CheckDamageFromLink(k); + HelmasaurKing_SwingTail(k); + HelmasaurKing_AttemptDamage(k); + HelmasaurKing_CheckMaskDamageFromHammer(k); + if (sprite_delay_aux1[k] == 0) { + if (sprite_delay_aux2[k] != 0) { + if (sprite_delay_aux2[k] == 0x40) { + HelmasaurKing_SpitFireball(k); + if (sprite_C[k] >= 3) { +anim_clk: + if (!sprite_anim_clock[k]) { + sprite_anim_clock[k]++; + sprite_delay_aux3[k] = 32; + } + } + } + return; + } + } else { + if (sprite_delay_aux1[k] == 96) + goto anim_clk; + return; + } + static const int8 kHelmasaurKing_Xvel0[8] = {-12, -12, -4, 0, 4, 12, 12, 0}; + static const int8 kHelmasaurKing_Yvel0[8] = {0, 4, 12, 12, 12, 4, 0, 12}; + switch (sprite_ai_state[k]) { + case 0: + if ((sprite_hit_timer[k] || !sprite_delay_main[k]) && !HelmasaurKing_MaybeFireball(k)) { + j = GetRandomNumber() & 7; + sprite_x_vel[k] = kHelmasaurKing_Xvel0[j]; + sprite_y_vel[k] = kHelmasaurKing_Yvel0[j]; + sprite_delay_main[k] = 64; + if (sprite_C[k] >= 3) { + sprite_x_vel[k] <<= 1; + sprite_y_vel[k] <<= 1; + sprite_delay_main[k] >>= 1; + } + sprite_ai_state[k]++; + } + break; + case 1: + HelmasaurKing_HandleMovement(k); + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 32; + sprite_ai_state[k]++; + } + break; + case 2: + if ((sprite_hit_timer[k] || !sprite_delay_main[k]) && !HelmasaurKing_MaybeFireball(k)) { + sprite_delay_main[k] = 64; + if (sprite_E[k] >= 3) + sprite_delay_main[k] >>= 1; + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_ai_state[k]++; + } + break; + case 3: + HelmasaurKing_HandleMovement(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 64; + } + break; + } +} + +void HelmasaurKing_HandleMovement(int k) { // 9e81e6 + int n = 1 + ((frame_counter & 3) == 0) + (sprite_C[k] >= 3); + do { + if (!(++sprite_subtype2[k] & 15)) + sound_effect_1 = 0x21; + } while (--n); + Sprite_MoveXY(k); +} + +bool HelmasaurKing_MaybeFireball(int k) { // 9e8253 + if (++sprite_subtype[k] != 4) + return false; + sprite_subtype[k] = 0; + if (GetRandomNumber() & 1) { + sprite_delay_aux2[k] = 127; + SpriteSfx_QueueSfx3WithPan(k, 0x2a); + } else { + sprite_delay_aux1[k] = 160; + } + return true; +} + +void HelmasaurKing_SwingTail(int k) { // 9e82a0 + overlord_x_lo[4]++; + HelmasaurKing_Reinitialize(k); + uint8 mask = sprite_anim_clock[k] ? 0 : 1; + if (!(frame_counter & mask)) { + int j = sprite_D[k] & 1; + overlord_gen2[0] += j ? -1 : 1; + if (overlord_gen2[0] == (uint8)kFluteBoyAnimal_Xvel[j]) + sprite_D[k]++; + WORD(overlord_gen1[5]) += (int8)overlord_gen2[0]; + } + if (!sprite_anim_clock[k]) + return; + if (!overlord_gen2[0]) + SpriteSfx_QueueSfx3WithPan(k, 0x6); + + if (sprite_anim_clock[k] == 2) { + int j = sprite_head_dir[k]; + WORD(overlord_gen2[1]) += j ? -4 : 4; + if (overlord_gen2[1] == (uint8)(j ? -124 : 124)) + sprite_anim_clock[k] = 3; + overlord_gen1[7] += 3; + } else if (sprite_anim_clock[k] == 3) { + int j = sprite_head_dir[k] ^ 1; + WORD(overlord_gen2[1]) += j ? -4 : 4; + if (overlord_gen2[1] == 0) + sprite_anim_clock[k] = 0; + overlord_gen1[7] -= 3; + } else { + if (!(overlord_gen2[0] | sprite_delay_aux3[k])) { + sprite_head_dir[k] = overlord_gen1[6] & 1; + uint8 dir = Sprite_IsRightOfLink(k).a ^ 1; + if (dir == sprite_head_dir[k]) { + sprite_anim_clock[k] = 2; + sound_effect_2 = Sprite_CalculateSfxPan(k) | 0x26; + } + } + } +} + +void HelmasaurKing_CheckMaskDamageFromHammer(int k) { // 9e8385 + if (sprite_C[k] >= 3 || !(link_item_in_hand & 10) || (player_oam_y_offset == 0x80)) + return; + SpriteHitBox hb; + Player_SetupActionHitBox(&hb); + uint8 bak = sprite_y_lo[k]; + sprite_y_lo[k] += 8; + Sprite_SetupHitBox(k, &hb); + sprite_y_lo[k] = bak; + if (CheckIfHitBoxesOverlap(&hb)) { + sprite_health[k]--; + sound_effect_2 = 0x21; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 0x30); + link_actual_vel_y = pt.y; + link_actual_vel_x = pt.x; + link_incapacitated_timer = 8; + if (!repulsespark_timer) { + repulsespark_x_lo = pt.y; + repulsespark_y_lo = pt.x; + repulsespark_timer = 5; + } + SpriteSfx_QueueSfx2WithPan(k, 0x5); + } +} + +void HelmasaurKing_AttemptDamage(int k) { // 9e83eb + if (!(frame_counter & 7) && + (uint16)(link_x_coord - cur_sprite_x + 36) < 72 && + (uint16)(link_y_coord - cur_sprite_y + 40) < 64) + Sprite_AttemptDamageToLinkPlusRecoil(k); +} + +void HelmasaurKing_ChipAwayAtMask(int k) { // 9e847e + tmp_counter = sprite_C[k] + 7; + HelmasaurKing_SpawnMaskDebris(k); + SpriteSfx_QueueSfx2WithPan(k, 0x1f); +} + +void HelmasaurKing_ExplodeMask(int k) { // 9e848c + for (int j = 1; j < 16; j++) + sprite_state[j] = 0; + tmp_counter = 7; + do { + HelmasaurKing_SpawnMaskDebris(k); + } while (!sign8(--tmp_counter)); + SpriteSfx_QueueSfx2WithPan(k, 0x1f); +} + +void HelmasaurKing_SpawnMaskDebris(int k) { // 9e84aa + static const int8 kHelmasaurKing_Mask_X[10] = {-16, 0, 16, -16, 0, 16, -8, 8, -16, 16}; + static const int8 kHelmasaurKing_Mask_Y[10] = {24, 27, 24, 24, 27, 24, 27, 27, 24, 24}; + static const int8 kHelmasaurKing_Mask_Z[10] = {29, 32, 29, 13, 16, 13, 0, 0, 13, 13}; + static const int8 kHelmasaurKing_Mask_Xvel[10] = {-16, -4, 14, -12, 4, 18, -2, 2, -12, 18}; + static const int8 kHelmasaurKing_Mask_Yvel[10] = {-8, -4, -6, 4, 2, 7, 6, 8, 4, 7}; + static const int8 kHelmasaurKing_Mask_Zvel[10] = {32, 40, 36, 37, 39, 34, 30, 33, 37, 34}; + static const uint8 kHelmasaurKing_Mask_OamFlags[10] = {0, 0, 0x40, 0, 0, 0x40, 0, 0x40, 0, 0x40}; + static const uint8 kHelmasaurKing_Mask_Gfx[10] = {0, 1, 0, 2, 3, 2, 4, 4, 5, 5}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x92, &info); + if (j >= 0) { + int i = tmp_counter; + Sprite_SetX(j, info.r0_x + kHelmasaurKing_Mask_X[i]); + Sprite_SetY(j, info.r2_y + kHelmasaurKing_Mask_Y[i]); + sprite_z[j] = kHelmasaurKing_Mask_Z[i]; + sprite_x_vel[j] = kHelmasaurKing_Mask_Xvel[i]; + sprite_y_vel[j] = kHelmasaurKing_Mask_Yvel[i]; + sprite_z_vel[j] = kHelmasaurKing_Mask_Zvel[i]; + sprite_oam_flags[j] = kHelmasaurKing_Mask_OamFlags[i] | 13; + sprite_graphics[j] = kHelmasaurKing_Mask_Gfx[i]; + sprite_C[j] = 128; + sprite_flags2[j] = 0; + sprite_delay_aux1[j] = 12; + sprite_ignore_projectile[j] = 12; + sprite_subtype[j] = tmp_counter; + } +} + +void HelmasaurKing_SpitFireball(int k) { // 9e8517 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x70, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_SetY(j, info.r2_y + 28); + sprite_delay_main[j] = 32; + sprite_ignore_projectile[j] = 32; + } +} + +void HelmasaurKing_Draw(int k) { // 9e853b + oam_cur_ptr = 0x89c; + oam_ext_cur_ptr = 0xa47; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + KingHelmasaur_OperateTail(k, &info); + SpriteDraw_KingHelmasaur_Eyes(k, &info); + KingHelmasaurMask(k, &info); + SpriteDraw_KingHelmasaur_Body(k, &info); + SpriteDraw_KingHelmasaur_Legs(k, &info); + SpriteDraw_KingHelmasaur_Mouth(k, &info); +} + +void SpriteDraw_KingHelmasaur_Eyes(int k, PrepOamCoordsRet *info) { // 9e856b + static const int8 kHelmasaurKing_DrawB_X[2] = {-3, 11}; + static const uint8 kHelmasaurKing_DrawB_Char[8] = {0xce, 0xcf, 0xde, 0xde, 0xde, 0xde, 0xcf, 0xce}; + static const uint8 kHelmasaurKing_DrawB_Flags[2] = {0x3b, 0x7b}; + oam_cur_ptr += 0x40, oam_ext_cur_ptr += 0x10; + OamEnt *oam = GetOamCurPtr(); + for (int i = 1; i >= 0; i--, oam++) { + oam->x = info->x + kHelmasaurKing_DrawB_X[i]; + oam->y = info->y + 0x14; + int j = overlord_x_lo[4] >> 2 & 7; + oam->charnum = kHelmasaurKing_DrawB_Char[j]; + oam->flags = kHelmasaurKing_DrawB_Flags[i]; + bytewise_extended_oam[oam - oam_buf] = 0; + } + if (submodule_index) + Sprite_CorrectOamEntries(k, 1, 0); +} + +void KingHelmasaurMask(int k, PrepOamCoordsRet *info) { // 9e8686 + static const DrawMultipleData kHelmasaurKing_DrawC_Dmd[24] = { + {-16, -5, 0x0dae, 2}, + { 0, -5, 0x0dc0, 2}, + { 16, -5, 0x4dae, 2}, + {-16, 11, 0x0dc2, 2}, + { 0, 11, 0x0dc4, 2}, + { 16, 11, 0x4dc2, 2}, + { -8, 27, 0x0dc6, 2}, + { 8, 27, 0x4dc6, 2}, + {-16, -5, 0x0dae, 2}, + { 0, -5, 0x0dc0, 2}, + { 16, -5, 0x4dae, 2}, + {-16, 11, 0x0dc8, 2}, + { 0, 11, 0x0dc4, 2}, + { 16, 11, 0x4dc2, 2}, + { -8, 27, 0x0dc6, 2}, + { 8, 27, 0x4dc6, 2}, + {-16, -5, 0x0dae, 2}, + { 0, -5, 0x0dc0, 2}, + { 16, -5, 0x4dae, 2}, + {-16, 11, 0x0dc8, 2}, + { 0, 11, 0x0dc4, 2}, + { 16, 11, 0x4dc8, 2}, + { -8, 27, 0x0dc6, 2}, + { 8, 27, 0x4dc6, 2}, + }; + oam_cur_ptr += 8, oam_ext_cur_ptr += 2; + if (sprite_C[k] >= 3) + return; + Sprite_DrawMultiple(k, &kHelmasaurKing_DrawC_Dmd[sprite_C[k] * 8], 8, info); + oam_cur_ptr += 0x20, oam_ext_cur_ptr += 8; + if (sprite_delay_aux4[k]) + return; + for (int i = 1; i >= 0; i--) { + if (ancilla_type[i] == 7 && (ancilla_x_vel[i] | ancilla_y_vel[i])) { + KingHelmasaur_CheckBombDamage(k, i); + } + } +} + +void KingHelmasaur_CheckBombDamage(int k, int j) { // 9e86e5 + SpriteHitBox hb; + Sprite_SetupHitBox(k, &hb); + int x = (ancilla_x_lo[j] | ancilla_x_hi[j] << 8) - 6; + int y = (ancilla_y_lo[j] | ancilla_y_hi[j] << 8) - ancilla_z[j]; + hb.r0_xlo = x, hb.r8_xhi = x >> 8; + hb.r1_ylo = y, hb.r9_yhi = y >> 8; + hb.r2 = 2; + hb.r3 = 15; + if (CheckIfHitBoxesOverlap(&hb)) { + ancilla_x_vel[j] = -ancilla_x_vel[j]; + ancilla_y_vel[j] = (int8)-ancilla_y_vel[j] >> 1; + sprite_delay_aux4[k] = 32; + repulsespark_timer = 5; + repulsespark_x_lo = ancilla_x_lo[j]; + repulsespark_y_lo = ancilla_y_lo[j] - ancilla_z[j]; + sound_effect_1 = 5; + } +} + +void SpriteDraw_KingHelmasaur_Body(int k, PrepOamCoordsRet *info) { // 9e87e5 + static const DrawMultipleData kHelmasaurKing_DrawD_Dmd[19] = { + {-24, -32, 0x0b80, 2}, + { -8, -32, 0x0b82, 2}, + { 8, -32, 0x4b82, 2}, + { 24, -32, 0x4b80, 2}, + {-24, -16, 0x0b84, 2}, + { -8, -16, 0x0b86, 2}, + { 8, -16, 0x4b86, 2}, + { 24, -16, 0x4b84, 2}, + {-24, 0, 0x0b88, 2}, + { -8, 0, 0x0b8a, 2}, + { 8, 0, 0x4b8a, 2}, + { 24, 0, 0x4b88, 2}, + {-24, 16, 0x0b8c, 2}, + { -8, 16, 0x0b8e, 2}, + { 8, 16, 0x4b8e, 2}, + { 24, 16, 0x4b8c, 2}, + { -8, 32, 0x0ba0, 2}, + { 8, 32, 0x4ba0, 2}, + { 0, -40, 0x0bac, 2}, + }; + Sprite_DrawMultiple(k, kHelmasaurKing_DrawD_Dmd, 19, info); +} + +void SpriteDraw_KingHelmasaur_Legs(int k, PrepOamCoordsRet *info) { // 9e8805 + static const int8 kHelmasaurKing_DrawE_X[4] = {-28, -28, 28, 28}; + static const int8 kHelmasaurKing_DrawE_Y[4] = {-28, 4, -28, 4}; + static const uint8 kHelmasaurKing_DrawE_Char[4] = {0xa2, 0xa6, 0xa2, 0xa6}; + static const uint8 kHelmasaurKing_DrawE_Flags[4] = {0xb, 0xb, 0x4b, 0x4b}; + + oam_cur_ptr += 19 * 4; + oam_ext_cur_ptr += 19; + OamEnt *oam = GetOamCurPtr(); + for (int i = 3; i >= 0; i--, oam += 2) { + oam[1].x = oam[0].x = info->x + kHelmasaurKing_DrawE_X[i]; + oam[0].y = info->y + kHelmasaurKing_DrawE_Y[i] + overlord_x_lo[i]; + oam[1].y = oam[0].y + 0x10; + oam[0].charnum = kHelmasaurKing_DrawE_Char[i]; + oam[1].charnum = oam[0].charnum + 2; + oam[1].flags = oam[0].flags = kHelmasaurKing_DrawE_Flags[i] ^ info->flags; + bytewise_extended_oam[oam - oam_buf] = 2; + bytewise_extended_oam[oam - oam_buf + 1] = 2; + } + tmp_counter = 0xff; + if (submodule_index) { + Sprite_CorrectOamEntries(k, 7, 2); + Sprite_PrepOamCoordOrDoubleRet(k, info); + } +} + +void SpriteDraw_KingHelmasaur_Mouth(int k, PrepOamCoordsRet *info) { // 9e88bc + static const uint8 kHelmasaurKing_DrawF_Y[32] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, + }; + if (!sprite_delay_aux2[k]) + return; + uint8 yd = kHelmasaurKing_DrawF_Y[sprite_delay_aux2[k] >> 2]; + Oam_AllocateFromRegionB(4); + OamEnt *oam = GetOamCurPtr(); + oam->x = info->x; + int t = (uint8)info->y + 0x13; + oam->y = t + (t >> 8) + yd; + oam->charnum = 0xaa; + oam->flags = info->flags ^ 0xb; + bytewise_extended_oam[oam - oam_buf] = 2; +} + +void KingHelmasaur_OperateTail(int k, PrepOamCoordsRet *info) { // 9e8920 + static const uint8 kHelmasaurKing_DrawA_Mult[32] = { + 0xff, 0xf0, 0xe0, 0xd0, 0xc0, 0xb0, 0xa0, 0x90, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, + 0xff, 0xf8, 0xf0, 0xe8, 0xe0, 0xd8, 0xd0, 0xc8, 0xbc, 0xb0, 0xa0, 0x90, 0x70, 0x40, 0x20, 0x10, + }; + static const uint8 kHelmasaurKing_DrawA_MultB[16] = { + 0xff, 0xf0, 0xe0, 0xd0, 0xc0, 0xb0, 0xa0, 0x90, 0x80, 0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10 + }; + + for (int i = 0; i < 16; i++) { + int j = i + (sprite_anim_clock[k] ? 16 : 0); + uint16 rs = WORD(overlord_gen1[5]) + WORD(overlord_gen2[1]); + uint8 f = (rs >> 8) - 1; + uint8 r6 = (uint8)(sign8(f) ? -rs : rs) * kHelmasaurKing_DrawA_Mult[j] >> 8; + uint16 angle = (rs & 0xff00) | (sign8(f) ? r6 ^ 0xff : r6); + uint8 r15 = overlord_gen1[7] * kHelmasaurKing_DrawA_MultB[i] >> 8; + overlord_x_lo[i+5] = HelmasaurSin(angle, r15); + overlord_y_lo[i+5] = HelmasaurSin(angle + 0x80, r15) - 40; + } + + OamEnt *oam = GetOamCurPtr(); + bool is_hit = false; + for (int i = overlord_gen2[3]; i != 16; i++, oam++) { + uint8 x = overlord_x_lo[i + 5] + info->x; + uint8 y = overlord_y_lo[i + 5] + info->y; + oam->x = x; + oam->y = y; + oam->charnum = (i == overlord_gen2[3]) ? 0xe4 : 0xac; + oam->flags = info->flags ^ 0x1b; + + if (!countdown_for_blink && sprite_anim_clock[k]) { + if ((uint8)(link_x_coord - BG2HOFS_copy2 - x + 12) < 24 && + (uint8)(link_y_coord - BG2VOFS_copy2 + 8 - y + 8) < 16) { + is_hit = true; + link_actual_vel_x = 0; + link_actual_vel_y = 56; + } + } + } + + if (is_hit && !flag_block_link_menu) + Sprite_AttemptDamageToLinkPlusRecoil(k); + Sprite_CorrectOamEntries(k, 16, 2); + Sprite_PrepOamCoordOrDoubleRet(k, info); + tmp_counter = 16; +} + +void Sprite_MadBatterBolt(int k) { // 9e8a96 + static const int8 kMadderBolt_X[8] = {0, 4, 8, 12, 12, 4, 8, 0}; + static const int8 kMadderBolt_Y[8] = {0, 4, 8, 12, 12, 4, 8, 0}; + + if (sprite_subtype2[k] & 16) + Oam_AllocateFromRegionB(4); + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_ai_state[k]) { + Sprite_MoveXY(k); + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 1; + } else { + if (++sprite_ai_state[k] == 0) + sprite_state[k] = 0; + int j = ++sprite_subtype2[k]; + if (!(j & 7)) + sound_effect_2 = 48; + Sprite_SetX(k, link_x_coord + kMadderBolt_X[j >> 2 & 7]); + Sprite_SetY(k, link_y_coord + kMadderBolt_Y[j >> 4 & 7]); + } +} + +void Sprite_AA_Pikit(int k) { // 9e8bbf + static const uint8 kPikit_Gfx[24] = { + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, + }; + static const int8 kPikit_XyOffs[72] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 16, 24, 32, 32, 24, 16, 12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -12, -16, -24, -32, -32, -24, -16, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + static const uint8 kPikit_Tab0[8] = {24, 24, 0, 48, 48, 48, 0, 24}; + static const uint8 kPikit_Tab1[8] = {0, 24, 24, 24, 0, 48, 48, 48}; + int j; + Pikit_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: // set next vel + if (!sprite_delay_main[k]) { + int j; + sprite_ai_state[k]++; + if (++sprite_C[k] == 4) { + sprite_C[k] = 0; + j = Sprite_DirectionToFaceLink(k, NULL); + } else { + j = GetRandomNumber() & 3; + } + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[j]; + sprite_y_vel[k] = kZazak_Yvel[j]; + sprite_z_vel[k] = (GetRandomNumber() & 7) + 19; + } + sprite_graphics[k] = ++sprite_subtype2[k] >> 3 & 1; + break; + case 1: // finish jump then attack + Sprite_MoveXYZ(k); + Sprite_CheckTileCollision(k); + sprite_z_vel[k]--; + sprite_z_vel[k]--; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + PointU8 pt; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 48) < 96 && (uint8)(pt.y + 48) < 96) { + sprite_ai_state[k]++; + ProjectSpeedRet pp = Sprite_ProjectSpeedTowardsLink(k, 31); + sprite_D[k] = Sprite_ConvertVelocityToAngle(pp.x, pp.y) >> 1; + sprite_delay_main[k] = 95; + return; + } + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 16; + } + sprite_graphics[k] = ++sprite_subtype2[k] >> 3 & 1; + break; + case 2: { // attempt item grab + j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 16; + sprite_A[k] = 0; + sprite_B[k] = 0; + sprite_G[k] = 0; + return; + } + j >>= 2; + sprite_graphics[k] = kPikit_Gfx[j]; + int8 xo = kPikit_XyOffs[j + kPikit_Tab0[sprite_D[k]]]; + int8 yo = kPikit_XyOffs[j + kPikit_Tab1[sprite_D[k]]]; + sprite_A[k] = xo; + sprite_B[k] = yo; + if (!sprite_G[k] && + (uint16)(cur_sprite_x + xo - link_x_coord + 12) < 24 && + (uint16)(cur_sprite_y + yo - link_y_coord + 12) < 32 && + sprite_delay_main[k] < 46) { + sound_effect_1 = Link_CalculateSfxPan() | 0x26; + j = (GetRandomNumber() & 3) + 1; + sprite_E[k] = sprite_G[k] = j; + if (j == 1) { + if (link_item_bombs) + link_item_bombs--; + else + sprite_G[k] = 0; + } else if (j == 2) { + if (link_num_arrows) + link_num_arrows--; + else + sprite_G[k] = 0; + } else if (j == 3) { + if (link_rupees_goal) + link_rupees_goal--; + else + sprite_G[k] = 0; + } else { + sprite_subtype[k] = link_shield_type; + if (link_shield_type != 0 && link_shield_type != 3) + link_shield_type = 0; + else + sprite_G[k] = 0; + } + } + break; + } + } +} + +void Sprite_A8_GreenZirro(int k) { // 9e8dd2 + static const uint8 kBomber_Gfx[4] = {9, 10, 8, 7}; + + sprite_obj_prio[k] = 0x30; + if (sprite_A[k]) { + switch (sprite_ai_state[k]) { + case 0: // bomberpellet falling + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXY(k); + Sprite_MoveZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_ai_state[k]++; + sprite_delay_main[k] = 19; + sprite_flags2[k]++; + SpriteSfx_QueueSfx2WithPan(k, 0xc); + } + break; + case 1: // bomberpellet exploding + SpriteDraw_ZirroBomb(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!(frame_counter & 3)) + sprite_delay_main[k]++; + Sprite_CheckDamageToLink(k); + break; + } + return; + } + + if (sprite_delay_aux1[k]) + sprite_graphics[k] = kBomber_Gfx[sprite_D[k]]; + sprite_obj_prio[k] |= 0x30; + Bomber_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sprite_delay_aux1[k] == 8) + Zirro_DropBomb(k); + Sprite_CheckDamageToAndFromLink(k); + if (!(frame_counter & 1)) { + int j = sprite_G[k] & 1; + sprite_z_vel[k] += j ? -1 : 1; + if (sprite_z_vel[k] == (uint8)(j ? -8 : 8)) + sprite_G[k]++; + } + Sprite_MoveZ(k); + PointU8 pt; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 40) < 80 && (uint8)(pt.y + 40) < 80 && player_oam_y_offset != 0x80 && + (link_is_running || sign8(button_b_frames - 9))) { + ProjectSpeedRet pp = Sprite_ProjectSpeedTowardsLink(k, 0x30); + sprite_x_vel[k] = -pt.x; + sprite_y_vel[k] = -pt.y; + sprite_delay_main[k] = 8; + sprite_ai_state[k] = 2; + } + switch(sprite_ai_state[k]) { + case 0: + if (!sprite_delay_main[k]) { + static const int8 kBomber_Xvel[8] = {16, 12, 0, -12, -16, -12, 0, 12}; + static const int8 kBomber_Yvel[8] = {0, 12, 16, 12, 0, -12, -16, -12}; + static const uint8 kBomber_Tab0[4] = {0, 4, 2, 6}; + int j; + sprite_ai_state[k]++; + sprite_B[k]++; + if (sprite_B[k] == 3) { + sprite_B[k] = 0; + sprite_delay_main[k] = 48; + j = kBomber_Tab0[Sprite_DirectionToFaceLink(k, NULL)]; + } else { + j = GetRandomNumber(); + sprite_delay_main[k] = j & 0x1f | 0x20; + j &= 7; + } + sprite_x_vel[k] = kBomber_Xvel[j]; + sprite_y_vel[k] = kBomber_Yvel[j]; + } + goto set_dir; + case 1: + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 10; + if (sprite_type[k] == 0xa8) + sprite_delay_aux1[k] = 16; + } else { + Sprite_MoveXY(k); +set_dir: + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + sprite_graphics[k] = sprite_D[k] << 1 | ++sprite_subtype2[k] >> 3 & 1; + } + break; + case 2: + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 0; + sprite_subtype2[k] += 2; + Sprite_MoveXY(k); + goto set_dir; + } +} + +void Zirro_DropBomb(int k) { // 9e8f81 + static const int8 kBomber_SpawnPellet_X[4] = {14, -6, 4, 4}; + static const int8 kBomber_SpawnPellet_Y[4] = {7, 7, 12, -4}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xa8, &info); + if (j >= 0) { + SpriteSfx_QueueSfx2WithPan(k, 0x20); + sprite_z[j] = info.r4_z; + int i = sprite_D[j]; + Sprite_SetX(j, info.r0_x + kBomber_SpawnPellet_X[i]); + Sprite_SetY(j, info.r2_y + kBomber_SpawnPellet_Y[i]); + sprite_x_vel[j] = kFluteBoyAnimal_Xvel[i]; + sprite_y_vel[j] = kZazak_Yvel[i]; + sprite_A[j] = 1; + sprite_ignore_projectile[j] = 1; + sprite_flags4[j] = 9; + sprite_flags3[j] = 0x33; + sprite_oam_flags[j] = 0x33 & 15; + } +} + +void Sprite_StalfosBone(int k) { // 9e8fdf + StalfosBone_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToLink(k); + sprite_subtype2[k]++; + Sprite_MoveXY(k); + if (!sprite_delay_main[k] && Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + Sprite_PlaceWeaponTink(k); + } +} + +void StalfosBone_Draw(int k) { // 9e9040 + static const DrawMultipleData kStalfosBone_Dmd[8] = { + {-4, -2, 0x802f, 0}, + { 4, 2, 0x402f, 0}, + {-4, 2, 0x002f, 0}, + { 4, -2, 0xc02f, 0}, + { 2, -4, 0x403f, 0}, + {-2, 4, 0x803f, 0}, + {-2, -4, 0x003f, 0}, + { 2, 4, 0xc03f, 0}, + }; + Sprite_DrawMultiple(k, &kStalfosBone_Dmd[(sprite_subtype2[k] >> 2 & 3) * 2], 2, NULL); +} + +void Sprite_A7_Stalfos(int k) { // 9e906c + if (sprite_A[k]) { + Sprite_StalfosBone(k); + return; + } + if (!sprite_E[k]) { + Stalfos_Skellington(k); + return; + } + if (!sprite_delay_main[k]) { + sprite_x_vel[k] = 1; + sprite_y_vel[k] = 1; + if (Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + return; + } + sprite_E[k] = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x15); + Sprite_SpawnPoofGarnish(k); + sprite_delay_aux2[k] = 8; + sprite_delay_main[k] = 64; + sprite_y_vel[k] = 0; + sprite_x_vel[k] = 0; + } + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); +} + +void Stalfos_Skellington(int k) { // 9e90b5 + static const uint8 kStalfos_AnimState2[4] = {8, 9, 10, 11}; + static const uint8 kStalfos_CheckDir[4] = {3, 2, 1, 0}; + if (sprite_state[k] == 9 && + (uint16)(link_x_coord - cur_sprite_x + 40) < 80 && + (uint16)(link_y_coord - cur_sprite_y + 48) < 80 && + player_oam_y_offset != 0x80 && + !(sprite_z[k] | sprite_pause[k]) && + sprite_floor[k] == link_is_on_lower_level) { + uint8 dir = Sprite_DirectionToFaceLink(k, NULL); + if (!link_is_running) { + if (button_b_frames >= 0x90) + goto if_1; + if (!sign8(button_b_frames - 9)) + goto endif_1; + } + if (dir != kStalfos_CheckDir[link_direction_facing >> 1]) { +if_1: + sprite_D[k] = dir; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 32); + sprite_x_vel[k] = -pt.x; + sprite_y_vel[k] = -pt.y; + sprite_z_vel[k] = 32; + SpriteSfx_QueueSfx3WithPan(k, 0x13); + sprite_z[k]++; + } + } +endif_1: + if (sprite_z[k] == 0) { + Sprite_Zazak_Main(k); + return; + } + sprite_graphics[k] = kStalfos_AnimState2[sprite_D[k]]; + Stalfos_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_F[k]) + sprite_z_vel[k] = 0; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + uint8 t = Sprite_CheckTileCollision(k); + if (t & 3) + sprite_x_vel[k] = 0; + if (t & 12) + sprite_y_vel[k] = 0; + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k] - 1)) { + sprite_z[k] = 0; + Sprite_ZeroVelocity_XY(k); + SpriteSfx_QueueSfx2WithPan(k, 0x21); + if (sprite_subtype[k]) { + sprite_delay_aux3[k] = 16; + sprite_subtype2[k] = 0; + } + } +} + +void Sprite_Zazak_Main(int k) { // 9e919f + static const uint8 kStalfos_AnimState1[8] = {6, 4, 0, 2, 7, 5, 1, 3}; + static const uint8 kStalfos_Delay[4] = {16, 32, 64, 32}; + + static const int8 kZazak_Yvel[4] = {0, 0, 16, -16}; + if (sprite_B[k]) { + FirePhlegm_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = frame_counter >> 1 & 1; + Sprite_CheckDamageToLink(k); + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + Sprite_PlaceRupulseSpark_2(k); + } + return; + } + int t = sprite_delay_aux3[k]; + if (t != 0) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 32; + Sprite_ZeroVelocity_XY(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + } + if (t == 1) { + Stalfos_ThrowBone(k); + sprite_subtype2[k] = 1; + } + sprite_graphics[k] = kStalfos_AnimState1[(sprite_subtype2[k] & 1) * 4 + sprite_D[k]]; + if (sprite_type[k] == 0xa7) + Stalfos_Draw(k); + else + Zazak_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + switch (sprite_ai_state[k]) { + case 0: // walk then track head + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = kStalfos_Delay[GetRandomNumber() & 3]; + sprite_ai_state[k] = 1; + int j = sprite_head_dir[k]; + sprite_D[k] = j; + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[j]; + sprite_y_vel[k] = kZazak_Yvel[j]; + } + break; + case 1: // halt and change dir + if (sprite_wallcoll[k] != 0) { + sprite_delay_main[k] = 16; + } else { + if (sprite_delay_main[k] != 0) { + if (sign8(--sprite_G[k])) { + sprite_G[k] = 11; + sprite_subtype2[k]++; + } + return; + } else if (sprite_type[k] == 0xa6 && + sprite_D[k] == Sprite_DirectionToFaceLink(k, NULL) && + sprite_floor[k] == link_is_on_lower_level) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 48; + sprite_delay_aux1[k] = 48; + sprite_y_vel[k] = sprite_x_vel[k] = 0; + return; + } + sprite_delay_main[k] = 32; + } + sprite_head_dir[k] = kZazak_Dir2[sprite_D[k] * 2 + (GetRandomNumber() & 1)]; + sprite_ai_state[k] = 0; + if (++sprite_C[k] == 4) { + sprite_C[k] = 0; + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL); + sprite_delay_main[k] = 24; + } + sprite_y_vel[k] = sprite_x_vel[k] = 0; + break; + case 2: // shoot + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 0; + else if (sprite_delay_main[k] == 24) + Sprite_SpawnFirePhlegm(k); + break; + } +} + +int Sprite_SpawnFirePhlegm(int k) { // 9e92e4 + static const int8 kSpawnFirePhlegm_X[4] = {16, -8, 4, 4}; + static const int8 kSpawnFirePhlegm_Y[4] = {-2, -2, 8, -20}; + static const int8 kSpawnFirePhlegm_Xvel[4] = {48, -48, 0, 0}; + static const int8 kSpawnFirePhlegm_Yvel[4] = {0, 0, 48, -48}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xa5, &info); + if (j >= 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x5); + Sprite_SetSpawnedCoordinates(j, &info); + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kSpawnFirePhlegm_X[i]); + Sprite_SetY(j, info.r2_y + kSpawnFirePhlegm_Y[i]); + sprite_x_vel[j] = kSpawnFirePhlegm_Xvel[i]; + sprite_y_vel[j] = kSpawnFirePhlegm_Yvel[i]; + sprite_flags3[j] |= 0x40; + sprite_defl_bits[j] = 0x40; + sprite_flags2[j] = 0x21; + sprite_B[j] = 0x21; + sprite_oam_flags[j] = 2; + sprite_flags4[j] = 0x14; + sprite_ignore_projectile[j] = 20; + sprite_bump_damage[j] = 37; + if (link_shield_type >= 3) + sprite_flags5[j] = 0x20; + } + return j; +} + +void Stalfos_ThrowBone(int k) { // 9e9379 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xa7, &info); + if (j >= 0) { + sprite_A[j] = 1; + Sprite_SetSpawnedCoordinates(j, &info); + Sprite_ApplySpeedTowardsLink(j, 32); + sprite_flags2[j] = 0x21; + sprite_ignore_projectile[j] = 33; + sprite_flags3[j] |= 0x40; + sprite_defl_bits[j] = 0x48; + sprite_delay_main[j] = 16; + sprite_flags4[j] = 0x14; + sprite_oam_flags[j] = 7; + sprite_bump_damage[j] = 32; + SpriteSfx_QueueSfx2WithPan(k, 0x2); + } +} + +void FirePhlegm_Draw(int k) { // 9e9443 + static const DrawMultipleData kFirePhlegm_Dmd[16] = { + { 0, 0, 0x00c3, 0}, + {-8, 0, 0x00c2, 0}, + { 0, 0, 0x80c3, 0}, + {-8, 0, 0x80c2, 0}, + { 0, 0, 0x40c3, 0}, + { 8, 0, 0x40c2, 0}, + { 0, 0, 0xc0c3, 0}, + { 8, 0, 0xc0c2, 0}, + { 0, 0, 0x00d4, 0}, + { 0, -8, 0x00d3, 0}, + { 0, 0, 0x40d4, 0}, + { 0, -8, 0x40d3, 0}, + { 0, 0, 0x80d4, 0}, + { 0, 8, 0x80d3, 0}, + { 0, 0, 0xc0d4, 0}, + { 0, 8, 0xc0d3, 0}, + }; + Sprite_DrawMultiple(k, &kFirePhlegm_Dmd[sprite_D[k] * 4 + sprite_graphics[k] * 2], 2, NULL); +} + +void Sprite_A3_KholdstareShell(int k) { // 9e9460 + if (Sprite_ReturnIfPaused(k)) + return; + PointU8 pt; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 32) < 64 && (uint8)(pt.y + 32) < 64) { + Sprite_NullifyHookshotDrag(); + Sprite_RepelDash(); + } + Sprite_CheckDamageFromLink(k); + if (sprite_ai_state[k] == 0) { + if (sprite_state[k] == 6) { + sprite_flags3[k] = 0xc0; + sprite_ai_state[k] = 1; + sprite_state[k] = 9; + } else if (sprite_hit_timer[k] != 0) { + dung_floor_x_offs = (sprite_hit_timer[k] & 2) ? -1 : 1; + dung_hdr_collision_2_mirror = 1; + } else { + dung_hdr_collision_2_mirror = 0; + } + } else if (sprite_ai_state[k]++ != 18) { + KholdstareShell_PaletteFiltering(); + } else { + sprite_state[k] = 0; + sprite_ai_state[2] = 2; + sprite_delay_main[2] = 128; + } +} + +void GenerateIceball(int k) { // 9e94dd + if (++sprite_subtype2[k] & 127 | sprite_delay_aux1[k]) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xa4, &info); + if (j >= 0) { + Sprite_SetX(j, link_x_coord); + Sprite_SetY(j, link_y_coord); + sprite_z[j] = -32; + sprite_C[j] = -32; + SpriteSfx_QueueSfx2WithPan(j, 0x20); + } +} + +void Sprite_A2_Kholdstare(int k) { // 9e9518 + int j; + + Kholdstare_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_ai_state[k] < 2) { + Kholdstare_SpawnPuffCloudGarnish(k); + if (!(frame_counter & 7)) + sound_effect_1 = 2; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + + if (sign8(--sprite_subtype2[k])) { + sprite_subtype2[k] = 10; + sprite_graphics[k] = sprite_graphics[k] + 1 & 3; + } + + if (!(frame_counter & 3)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 31); + sprite_A[k] = Sprite_ConvertVelocityToAngle(pt.x, pt.y); + } + + Sprite_MoveXY(k); + switch(sprite_ai_state[k]) { + case 0: // Accelerate + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 32; + return; + } + if (sprite_x_vel[k] - sprite_z_vel[k]) + sprite_x_vel[k] += sign8(sprite_x_vel[k] - sprite_z_vel[k]) ? 1 : -1; + if (sprite_y_vel[k] - sprite_z_subpos[k]) + sprite_y_vel[k] += sign8(sprite_y_vel[k] - sprite_z_subpos[k]) ? 1 : -1; +check_coll: + j = Sprite_CheckTileCollision(k); + if (j & 3) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_z_vel[k] = -sprite_z_vel[k]; + } + if (j & 12) { + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_z_subpos[k] = -sprite_z_subpos[k]; + } + break; + case 1: // Decelerate + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 96; + j = GetRandomNumber(); + if (!(j & 0x1c)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 24); + sprite_z_vel[k] = pt.x; + sprite_z_subpos[k] = pt.y; + } else { + static const int8 kKholdstare_Target_Xvel[4] = {16, 16, -16, -16}; + static const int8 kKholdstare_Target_Yvel[4] = {-16, 16, 16, -16}; + sprite_z_vel[k] = kKholdstare_Target_Xvel[j & 3]; + sprite_z_subpos[k] = kKholdstare_Target_Yvel[j & 3]; + } + } else { + if (sprite_x_vel[k]) + sprite_x_vel[k] += sign8(sprite_x_vel[k]) ? 1 : -1; + if (sprite_y_vel[k]) + sprite_y_vel[k] += sign8(sprite_y_vel[k]) ? 1 : -1; + goto check_coll; + } + break; + case 2: // Triplicate + if (sprite_delay_main[k] == 1) { + sprite_state[k] = 0; + sprite_state[k + 1] = 0; + sprite_state[k + 2] = 0; + for (int i = 2; i >= 0; i--) { + static const int8 kKholdstare_Triplicate_Tab0[3] = {32, -32, 0}; + static const int8 kKholdstare_Triplicate_Tab1[3] = {-32, -32, 48}; + SpriteSpawnInfo info; + j = Sprite_SpawnDynamicallyEx(k, 0xa2, &info, 4); + assert(j >= 0); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_z_vel[j] = kKholdstare_Triplicate_Tab0[i]; + sprite_z_subpos[j] = kKholdstare_Triplicate_Tab1[i]; + sprite_delay_main[j] = 32; + } + } + tmp_counter = 0xff; + } else { + sprite_hit_timer[k] |= 0xe0; + } + break; + } +} + +void Kholdstare_SpawnPuffCloudGarnish(int k) { // 9e96a5 + static const int8 kNebuleGarnish_XY[8] = {-8, -6, -4, -2, 0, 2, 4, 6}; + if ((k ^ frame_counter) & 3) + return; + int j = GarnishAllocLow(); + if (j < 0) + return; + garnish_type[j] = 7; + garnish_active = 7; + garnish_countdown[j] = 31; + Garnish_SetX(j, cur_sprite_x + kNebuleGarnish_XY[GetRandomNumber() & 7]); + Garnish_SetY(j, cur_sprite_y + kNebuleGarnish_XY[GetRandomNumber() & 7] + 16); + garnish_floor[j] = 0; +} + +void Sprite_A4_FallingIce(int k) { // 9e9710 + if (!sprite_C[k]) { + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_state[2] < 9 && sprite_state[3] < 9 && sprite_state[4] < 9) + sprite_state[k] = 0; + GenerateIceball(k); + return; + } + + sprite_ignore_projectile[k] = 1; + sprite_obj_prio[k] = 0x30; + SpriteDraw_SingleLarge(k); + if (!sprite_ai_state[k]) + sprite_flags3[k] ^= 16; + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_delay_main[k]) { + if (sprite_delay_main[k] == 1) + sprite_state[k] = 0; + sprite_graphics[k] = (sprite_delay_main[k] >> 3) + 2; + return; + } + + Sprite_MoveXY(k); + if (!sprite_ai_state[k] || (Sprite_CheckDamageToLink(k), !Sprite_CheckTileCollision(k))) { + uint8 old_z = sprite_z[k]; + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] + 64)) + sprite_z_vel[k] -= 3; + if (!(sign8(old_z ^ sprite_z[k]) && sign8(sprite_z[k]))) + return; + sprite_z[k] = 0; + if (!sprite_ai_state[k]) { + sprite_state[k] = 0; + IceBall_Split(k); + return; + } + } + sprite_delay_main[k] = 15; + sprite_oam_flags[k] = 4; + if (!sound_effect_1) { + SpriteSfx_QueueSfx2WithPan(k, 0x1e); + sprite_graphics[k] = 3; + } +} + +void IceBall_Split(int k) { // 9e97cf + static const int8 kIceBall_Quadruplicate_Xvel[8] = {0, 32, 0, -32, 24, 24, -24, -24}; + static const int8 kIceBall_Quadruplicate_Yvel[8] = {-32, 0, 32, 0, -24, 24, -24, 24}; + SpriteSfx_QueueSfx2WithPan(k, 0x1f); + int b = GetRandomNumber() & 4; + for (int i = 3; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xa4, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ai_state[j] = 1; + sprite_graphics[j] = 1; + sprite_C[j] = 1; + sprite_z_vel[j] = 32; + sprite_x_vel[j] = kIceBall_Quadruplicate_Xvel[i + b]; + sprite_y_vel[j] = kIceBall_Quadruplicate_Yvel[i + b]; + sprite_flags4[j] = 0x1c; + } + } + tmp_counter = 0xff; +} + +void Sprite_A1_Freezor(int k) { // 9e981d + Freezor_Draw(k); + if (sprite_state[k] != 9) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 31; + sprite_ignore_projectile[k] = 31; + sprite_state[k] = 9; + sprite_hit_timer[k] = 0; + } + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_ai_state[k] != 3) { + if (Sprite_ReturnIfRecoiling(k)) + return; + } + switch(sprite_ai_state[k]) { + case 0: // stasis + sprite_ignore_projectile[k]++; + if ((uint8)(Sprite_IsRightOfLink(k).b + 16) < 32) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 32; + } + break; + case 1: { // awakening + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + uint16 x = Sprite_GetX(k) - 5; + uint16 y = Sprite_GetY(k); + Dungeon_UpdateTileMapWithCommonTile(x, y, 8); + sprite_delay_aux1[k] = 96; + sprite_D[k] = 2; + sprite_delay_main[k] = 80; + } else { + sprite_x_vel[k] = (sprite_delay_main[k] & 1) ? -16 : 16; + Sprite_MoveX(k); + } + break; + } + case 2: { // moving + static const int8 kFreezor_Xvel[2] = {8, -8}; + static const int8 kFreezor_Yvel[4] = {0, 0, 18, -18}; + static const uint8 kFreezor_Moving_Gfx[4] = {1, 2, 1, 3}; + static const int8 kFreezor_Sparkle_X[8] = {-4, -2, 0, 2, 4, 6, 8, 10}; + Sprite_CheckDamageToLink(k); + if (Sprite_CheckDamageFromLink(k)) + sprite_hit_timer[k] = 0; + if (sprite_delay_aux1[k] && !((k ^ frame_counter) & 7)) { + Sprite_GarnishSpawn_Sparkle(k, kFreezor_Sparkle_X[GetRandomNumber() & 7], -4); + } + if (!sprite_delay_main[k]) + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + int j = sprite_D[k]; + sprite_x_vel[k] = kFreezor_Xvel[j]; + sprite_y_vel[k] = kFreezor_Yvel[j]; + if (!(sprite_wallcoll[k] & 15)) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + sprite_graphics[k] = kFreezor_Moving_Gfx[(k ^ frame_counter) >> 2 & 3]; + break; + } + case 3: { // melting + static const uint8 kFreezor_Melting_Gfx[4] = { 6, 5, 4, 7 }; + if (!sprite_delay_main[k]) { + Sprite_ManuallySetDeathFlagUW(k); + sprite_state[k] = 0; + } + sprite_graphics[k] = kFreezor_Melting_Gfx[sprite_delay_main[k] >> 3]; + break; + } + } +} + +void Sprite_9E_HauntedGroveOstritch(int k) { // 9e995b + static const uint8 kFluteBoyOstrich_Gfx[4] = {0, 1, 0, 2}; + FluteBoyOstrich_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch (sprite_ai_state[k]) { + case 0: // wait + sprite_graphics[k] = (frame_counter & 0x18) ? 3 : 0; + if (byte_7E0FDD) { + sprite_ai_state[k] = 1; + sprite_y_vel[k] = -8; + sprite_x_vel[k] = -16; + } + break; + case 1: // run away + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 32; + sprite_z[k] = 0; + sprite_subtype2[k] = 0; + sprite_A[k] = 0; + } + if (!(++sprite_subtype2[k] & 7) && sprite_A[k] != 3) + sprite_A[k]++; + sprite_graphics[k] = kFluteBoyOstrich_Gfx[sprite_A[k]]; + break; + } +} + +void FluteBoyOstrich_Draw(int k) { // 9e9a4b + static const DrawMultipleData kFluteBoyOstrich_Dmd[16] = { + {-4, -8, 0x0080, 2}, + { 4, -8, 0x0081, 2}, + {-4, 8, 0x00a3, 2}, + { 4, 8, 0x00a4, 2}, + {-4, -8, 0x0080, 2}, + { 4, -8, 0x0081, 2}, + {-4, 8, 0x00a0, 2}, + { 4, 8, 0x00a1, 2}, + {-4, -8, 0x0080, 2}, + { 4, -8, 0x0081, 2}, + {-4, 8, 0x0083, 2}, + { 4, 8, 0x0084, 2}, + {-4, -7, 0x0080, 2}, + { 4, -7, 0x0081, 2}, + {-4, 9, 0x00a3, 2}, + { 4, 9, 0x00a4, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kFluteBoyOstrich_Dmd[sprite_graphics[k] * 4], 4, &info); + SpriteDraw_Shadow_custom(k, &info, 18); +} + +void Sprite_9F_HauntedGroveRabbit(int k) { // 9e9a6d + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kFluteBoyAnimal_OamFlags[sprite_D[k]]; + SpriteDraw_SingleLarge(k); + switch (sprite_ai_state[k]) { + case 0: // wait + sprite_graphics[k] = 3; + if (byte_7E0FDD) { + sprite_ai_state[k] = 1; + sprite_D[k] ^= 1; + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[sprite_D[k]]; + sprite_y_vel[k] = -8; + } + break; + case 1: // run + Sprite_MoveXYZ(k); + sprite_z_vel[k]-=3; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 24; + sprite_z[k] = 0; + sprite_subtype2[k] = 0; + sprite_A[k] = 0; + } + sprite_subtype2[k]++; + if (!(sprite_subtype2[k] & 3) && sprite_A[k] != 2) + sprite_A[k]++; + sprite_graphics[k] = kFluteBoyAnimal_Gfx[sprite_A[k]]; + break; + } +} + +void Sprite_A0_HauntedGroveBird(int k) { // 9e9aec + if (sprite_graphics[k] == 3) + HauntedGroveBird_Blink(k); + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kFluteBoyAnimal_OamFlags[sprite_D[k]]; + oam_cur_ptr += 4; + oam_ext_cur_ptr++; + sprite_flags2[k]--; + SpriteDraw_SingleLarge(k); + sprite_flags2[k]++; + Sprite_MoveXYZ(k); + switch (sprite_ai_state[k]) { + case 0: // wait + sprite_graphics[k] = (frame_counter & 0x18) ? 0 : 3; + if (byte_7E0FDD) { + sprite_ai_state[k] = 1; + sprite_D[k] ^= 1; + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[sprite_D[k]]; + sprite_delay_main[k] = 32; + sprite_z_vel[k] = 16; + sprite_y_vel[k] = -8; + } + break; + case 1: // rising + if (!sprite_delay_main[k]) { + sprite_z_vel[k] += 2; + if (!sign8(sprite_z_vel[k] - 0x10)) + sprite_ai_state[k] = 2; + } + sprite_graphics[k] = (++sprite_subtype2[k] >> 1 & 1) + 1; + break; + case 2: // falling + sprite_graphics[k] = 1; + sprite_z_vel[k] -= 1; + if (sign8(sprite_z_vel[k] + 15)) + sprite_ai_state[k] = 1; + break; + } +} + +void HauntedGroveBird_Blink(int k) { // 9e9b9c + static const int8 kFluteBoyBird_X[2] = {8, 0}; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int j = sprite_D[k]; + oam->x = info.x + kFluteBoyBird_X[j]; + oam->y = info.y; + oam->charnum = 0xae; + oam->flags = info.flags | kFluteBoyAnimal_OamFlags[j]; + Sprite_CorrectOamEntries(k, 0, 0); +} + +void Sprite_9C_Zoro(int k) { // 9e9bc8 + if (sprite_E[k]) + Zoro(k); + else + Babasu(k); +// +} + +void Zoro(int k) { // 9e9bd0 + if (!sprite_C[k]) { + sprite_C[k]++; + if (Sprite_IsBelowLink(k).a != 0) { + sprite_state[k] = 0; + return; + } + } + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_graphics[k] = ++sprite_subtype2[k] >> 1 & 1; + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[sprite_subtype2[k] >> 2 & 1]; + Sprite_MoveXY(k); + if (!sprite_delay_main[k] && Sprite_CheckTileCollision(k)) + sprite_state[k] = 0; + + if (sprite_subtype2[k] & 3) + return; + + int j = GarnishAlloc(); + if (j < 0) + return; + garnish_type[j] = 6; + garnish_active = 6; + Garnish_SetX(j, Sprite_GetX(k)); + Garnish_SetY(j, Sprite_GetY(k) + 16); + garnish_countdown[j] = 10; + garnish_sprite[j] = k; + garnish_floor[j] = sprite_floor[k]; +} + +void Babasu(int k) { // 9e9c6b + static const uint8 kBabusu_Gfx[6] = {5, 4, 3, 2, 1, 0}; + static const uint8 kBabusu_DirGfx[4] = {6, 6, 0, 0}; + static const int8 kBabusu_XyVel[6] = {32, -32, 0, 0, 32, -32}; + + Babusu_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // reset + sprite_ai_state[k]++; + sprite_delay_main[k] = 128; + sprite_graphics[k] = 255; + break; + case 1: // hiding + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 55; + } + break; + case 2: { // terror sprinkles + int j = sprite_delay_main[k], i = sprite_D[k]; + if (j == 0) { + sprite_ai_state[k] = 3; + sprite_x_vel[k] = kBabusu_XyVel[i]; + sprite_y_vel[k] = kBabusu_XyVel[i + 2]; + sprite_delay_main[k] = 32; + } + if (j >= 32) { + sprite_graphics[k] = kBabusu_Gfx[(j - 32) >> 2] + kBabusu_DirGfx[i]; + } else { + sprite_graphics[k] = 0xff; + } + break; + } + case 3: { // scurry across + static const uint8 kBabusu_Scurry_Gfx[4] = {18, 14, 12, 16}; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + sprite_graphics[k] = (frame_counter >> 1 & 1) + kBabusu_Scurry_Gfx[sprite_D[k]]; + if (!sprite_delay_main[k] && Sprite_CheckTileCollision(k)) { + sprite_D[k] ^= 1; + sprite_ai_state[k] = 0; + } + break; + } + } +} + +void Sprite_9B_Wizzrobe(int k) { // 9e9d1b + int j; + if (sprite_C[k]) { + Sprite_Wizzbeam(k); + return; + } + if (sprite_ai_state[k] == 0 || sprite_ai_state[k] & 1 && sprite_delay_main[k] & 1) { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + } else { + Wizzrobe_Draw(k); + } + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_ignore_projectile[k] = 1; + switch(sprite_ai_state[k]) { + case 0: // cloaked + if (!sprite_delay_main[k]) { + sprite_y_vel[k] = sprite_x_vel[k] = 1; + if (!Sprite_CheckTileCollision(k)) { + static const uint8 kWizzrobe_Cloak_Gfx[4] = {4, 2, 0, 6}; + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 63; + sprite_D[k] = j = Sprite_DirectionToFaceLink(k, NULL); + sprite_graphics[k] = kWizzrobe_Cloak_Gfx[j]; + } else { + sprite_state[k] = 0; + } + } + break; + case 1: // phasing in + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 63; + } + break; + case 2: { // attack + static const uint8 kWizzrobe_Attack_Gfx[8] = {0, 1, 1, 1, 1, 1, 1, 0}; + static const uint8 kWizzrobe_Attack_DirGfx[4] = {4, 2, 0, 6}; + sprite_ignore_projectile[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 63; + return; + } + if (j == 32) + Wizzrobe_FireBeam(k); + sprite_graphics[k] = kWizzrobe_Attack_Gfx[j >> 3] + kWizzrobe_Attack_DirGfx[sprite_D[k]]; + break; + } + case 3: // phasing out + if (!sprite_delay_main[k]) { + if (sprite_B[k]) + sprite_state[k] = 0; + sprite_ai_state[k] = 0; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 32; + } + break; + } +} + +void Wizzrobe_FireBeam(int k) { // 9e9e15 + static const int8 kWizzrobe_Beam_XYvel[6] = {32, -32, 0, 0, 32, -32}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x9b, &info); + if (j >= 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x36); + sprite_C[j] = 1; + sprite_ignore_projectile[j] = 1; + Sprite_SetX(j, info.r0_x + 4); + Sprite_SetY(j, info.r2_y); + int i = sprite_D[k]; + sprite_x_vel[j] = kWizzrobe_Beam_XYvel[i]; + sprite_y_vel[j] = kWizzrobe_Beam_XYvel[i + 2]; + sprite_defl_bits[j] = 0x48; + sprite_oam_flags[j] = 2; + sprite_flags5[j] = link_shield_type == 3 ? 0x20 : 0; + sprite_flags4[j] = 0x14; + } +} + +void Sprite_9A_Kyameron(int k) { // 9e9e7b + PrepOamCoordsRet info; + if (!sprite_ai_state[k]) + Sprite_PrepOamCoord(k, &info); + else + Kyameron_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_ignore_projectile[k] = 1; + switch(sprite_ai_state[k]) { + case 0: // reset + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = (GetRandomNumber() & 63) + 96; + sprite_x_lo[k] = sprite_A[k]; + sprite_x_hi[k] = sprite_B[k]; + sprite_y_lo[k] = sprite_C[k]; + sprite_y_hi[k] = sprite_head_dir[k]; + sprite_subtype2[k] = 5; + sprite_graphics[k] = 8; + } + break; + case 1: // puddleup + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 31; + sprite_ai_state[k] = 2; + } + if (sign8(--sprite_subtype2[k])) { + sprite_subtype2[k] = 5; + sprite_graphics[k] = (++sprite_graphics[k] & 3) + 8; + } + break; + case 2: { // coagulate + static const int8 kKyameron_Coagulate_Gfx[8] = {4, 7, 14, 13, 12, 6, 6, 5}; + static const int8 kKyameron_Xvel[4] = {32, -32, 32, -32}; + static const int8 kKyameron_Yvel[4] = {32, 32, -32, -32}; + int j = sprite_delay_main[k]; + if (j == 0) { + sprite_ai_state[k] = 3; + j = Sprite_IsBelowLink(k).a * 2 + Sprite_IsRightOfLink(k).a; + sprite_x_vel[k] = kKyameron_Xvel[j]; + sprite_y_vel[k] = kKyameron_Yvel[j]; + } else { + if (j == 7) + Sprite_SetY(k, Sprite_GetY(k) - 29); + sprite_graphics[k] = kKyameron_Coagulate_Gfx[j >> 2]; + } + break; + } + case 3: { // moving + sprite_ignore_projectile[k] = 0; + if (!Sprite_CheckDamageToAndFromLink(k)) { + Sprite_MoveXY(k); + int j = Sprite_CheckTileCollision(k); + if (j & 3) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_anim_clock[k]++; + } + if (j & 12) { + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_anim_clock[k]++; + } + if (sprite_anim_clock[k] < 3) + goto skip_sound; + } + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 15; + SpriteSfx_QueueSfx2WithPan(k, 0x28); +skip_sound: + static const uint8 kKyameron_Moving_Gfx[4] = {3, 2, 1, 0}; + sprite_graphics[k] = kKyameron_Moving_Gfx[++sprite_subtype2[k] >> 3 & 3]; + if (!((k ^ frame_counter) & 7)) { + uint16 x = (GetRandomNumber() & 0xf) - 4; + uint16 y = (GetRandomNumber() & 0xf) - 4; + Sprite_GarnishSpawn_Sparkle(k, x, y); + } + break; + } + case 4: // disperse + if (!sprite_delay_main[k]) { + sprite_anim_clock[k] = 0; + sprite_ai_state[k] = 0; + sprite_z[k] = 0; + sprite_delay_main[k] = 64; + } else { + sprite_graphics[k] = (sprite_delay_main[k] >> 2) + 15; + } + break; + } +} + +void Kyameron_Draw(int k) { // 9ea158 + static const uint8 kKyameron_OamFlags[12] = {0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0x40, 0xc0, 0x80}; + static const DrawMultipleData kKyameron_Dmd[28] = { + { 1, 8, 0x00b4, 0}, + { 7, 8, 0x00b5, 0}, + { 4, -3, 0x0086, 0}, + { 0, -13, 0x80a2, 2}, + { 2, 8, 0x00b4, 0}, + { 6, 8, 0x00b5, 0}, + { 4, -6, 0x0096, 0}, + { 0, -20, 0x00a2, 2}, + { 4, -1, 0x0096, 0}, + { 0, -27, 0x00a2, 2}, + { 0, -27, 0x00a2, 2}, + { 0, -27, 0x00a2, 2}, + {-6, -6, 0x01df, 0}, + {14, -6, 0x41df, 0}, + {-6, 14, 0x81df, 0}, + {14, 14, 0xc1df, 0}, + {-6, -6, 0x0096, 0}, + {14, -6, 0x4096, 0}, + {-6, 14, 0x8096, 0}, + {14, 14, 0xc096, 0}, + {-4, -4, 0x018d, 0}, + {12, -4, 0x418d, 0}, + {-4, 12, 0x818d, 0}, + {12, 12, 0xc18d, 0}, + { 0, 0, 0x018d, 0}, + { 8, 0, 0x418d, 0}, + { 0, 8, 0x818d, 0}, + { 8, 8, 0xc18d, 0}, + }; + int j = sprite_graphics[k]; + if (j < 12) { + uint8 bak = sprite_oam_flags[k]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kKyameron_OamFlags[j]; + SpriteDraw_SingleLarge(k); + sprite_oam_flags[k] = bak; + } else { + Sprite_DrawMultiple(k, &kKyameron_Dmd[(j - 12) * 4], 4, NULL); + } +} + +void Sprite_99_Pengator(int k) { // 9ea196 + static const uint8 kPengator_Gfx[4] = {5, 0, 10, 15}; + sprite_graphics[k] = sprite_A[k] + kPengator_Gfx[sprite_D[k]]; + Pengator_Draw(k); + if (sprite_F[k] || sprite_wallcoll[k] & 15) { + sprite_ai_state[k] = 0; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + } + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXYZ(k); + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 0; + sprite_z[k] = 0; + } + Sprite_CheckTileCollision(k); + switch(sprite_ai_state[k]) { + case 0: // face player + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + sprite_ai_state[k] = 1; + break; + case 1: // speedup + if (!((k ^ frame_counter) & 3)) { + static const int8 kPengator_XYVel[6] = { 1, -1, 0, 0, 1, -1 }; + bool flag = false; + int j = sprite_D[k]; + if (sprite_x_vel[k] != (uint8)kFluteBoyAnimal_Xvel[j]) + sprite_x_vel[k] += kPengator_XYVel[j], flag = true; + if (sprite_y_vel[k] != (uint8)kZazak_Yvel[j]) + sprite_y_vel[k] += kPengator_XYVel[j + 2], flag = true; + if (!flag) { + sprite_delay_main[k] = 15; + sprite_ai_state[k] = 2; + } + } + sprite_A[k] = (frame_counter & 4) >> 2; + break; + case 2: { // jump + static const uint8 kPengator_Jump[4] = {4, 4, 3, 2}; + if (!sprite_delay_main[k]) + sprite_ai_state[k]++; + else if (sprite_delay_main[k] == 5) + sprite_z_vel[k] = 24; + sprite_A[k] = kPengator_Jump[sprite_delay_main[k] >> 2]; + break; + } + case 3: // slide and sparkle + if (!((k ^ frame_counter) & 7 | sprite_z[k])) { + static const int8 kPengator_Garnish_Y[8] = { 8, 10, 12, 14, 12, 12, 12, 12 }; + static const int8 kPengator_Garnish_X[8] = { 4, 4, 4, 4, 0, 4, 8, 12 }; + int i = sprite_D[k]; + int x = kPengator_Garnish_X[(GetRandomNumber() & 3) + (i >= 2) * 4]; + int y = kPengator_Garnish_Y[(GetRandomNumber() & 3) + (i >= 2) * 4]; + Sprite_GarnishSpawn_Sparkle_limited(k, x, y); + } + break; + } +} + +void Pengator_Draw(int k) { // 9ea415 + static const DrawMultipleData kPengator_Dmd0[40] = { + {-1, -8, 0x0082, 2}, + { 0, 0, 0x0088, 2}, + {-1, -7, 0x0082, 2}, + { 0, 0, 0x008a, 2}, + {-3, -6, 0x0082, 2}, + { 0, 0, 0x0088, 2}, + {-6, -4, 0x0082, 2}, + { 0, 0, 0x008a, 2}, + {-4, 0, 0x00a2, 2}, + { 4, 0, 0x00a3, 2}, + { 1, -8, 0x4082, 2}, + { 0, 0, 0x4088, 2}, + { 1, -7, 0x4082, 2}, + { 0, 0, 0x408a, 2}, + { 3, -6, 0x4082, 2}, + { 0, 0, 0x4088, 2}, + { 6, -4, 0x4082, 2}, + { 0, 0, 0x408a, 2}, + { 4, 0, 0x40a2, 2}, + {-4, 0, 0x40a3, 2}, + { 0, -7, 0x0080, 2}, + { 0, 0, 0x0086, 2}, + { 0, -7, 0x4080, 2}, + { 0, 0, 0x4086, 2}, + { 0, -4, 0x0080, 2}, + { 0, 0, 0x0086, 2}, + { 0, -1, 0x0080, 2}, + { 0, 0, 0x0086, 2}, + {-8, 0, 0x008e, 2}, + { 8, 0, 0x408e, 2}, + { 0, -8, 0x0084, 2}, + { 0, 0, 0x008c, 2}, + { 0, -8, 0x4084, 2}, + { 0, 0, 0x408c, 2}, + { 0, -7, 0x0084, 2}, + { 0, 0, 0x008c, 2}, + { 0, 0, 0x408c, 2}, + { 0, -6, 0x4084, 2}, + {-8, 0, 0x00a0, 2}, + { 8, 0, 0x40a0, 2}, + }; + static const DrawMultipleData kPengator_Dmd1[4] = { + {0, 16, 0x00b5, 0}, + {8, 16, 0x40b5, 0}, + {0, -8, 0x00a5, 0}, + {8, -8, 0x40a5, 0}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kPengator_Dmd0[sprite_graphics[k] * 2], 2, &info); + int i; + if ((i = 0, sprite_graphics[k] == 14) || (i = 1, sprite_graphics[k] == 19)) { + oam_cur_ptr += 8, oam_ext_cur_ptr += 2; + Sprite_DrawMultiple(k, &kPengator_Dmd1[i * 2], 2, &info); + } + SpriteDraw_Shadow(k, &info); +} + +void Sprite_LaserBeam(int k) { // 9ea462 + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + LaserBeam_BuildUpGarnish(k); + Sprite_MoveXY(k); + Sprite_CheckDamageToLink_same_layer(k); + if (!sprite_delay_main[k] && Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + SpriteSfx_QueueSfx3WithPan(k, 0x26); + } +} + +void LaserBeam_BuildUpGarnish(int k) { // 9ea488 + int j = GarnishAllocOverwriteOld(); + garnish_type[j] = 4; + garnish_active = 4; + Garnish_SetX(j, Sprite_GetX(k)); + Garnish_SetY(j, Sprite_GetY(k) + 16); + garnish_countdown[j] = 16; + garnish_oam_flags[j] = sprite_graphics[k]; + garnish_sprite[j] = k; + garnish_floor[j] = sprite_floor[k]; +} + +void Sprite_95_LaserEyeLeft(int k) { // 9ea541 + static const uint8 kLaserEye_Dirs[4] = {2, 3, 0, 1}; + if (sprite_A[k]) { + Sprite_LaserBeam(k); + return; + } + LaserEye_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // monitor firing zone + if (sprite_head_dir[k] == 0 && sprite_D[k] != kLaserEye_Dirs[link_direction_facing >> 1]) { + sprite_graphics[k] = 0; + } else { + uint16 j = (sprite_D[k] < 2) ? link_y_coord - cur_sprite_y : link_x_coord - cur_sprite_x; + if ((uint16)(j + 16) < 32) { + sprite_delay_main[k] = 32; + sprite_ai_state[k] = 1; + } else { + sprite_graphics[k] = 0; + } + } + break; + case 1: // firing beam + sprite_graphics[k] = 1; + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + LaserEye_FireBeam(k); + sprite_delay_aux4[k] = 12; + } + break; + } +} + +void LaserEye_FireBeam(int k) { // 9ea5d8 + static const int8 kLaserEye_SpawnXY[6] = {12, -4, 4, 4, 12, -4}; + static const int8 kLaserEye_SpawnXYVel[6] = {112, -112, 0, 0, 112, -112}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x95, &info); + if (j >= 0) { + int i = sprite_D[k]; + sprite_graphics[j] = (i & 2) >> 1; + Sprite_SetX(j, info.r0_x + kLaserEye_SpawnXY[i]); + Sprite_SetY(j, info.r2_y + kLaserEye_SpawnXY[i + 2]); + sprite_x_vel[j] = kLaserEye_SpawnXYVel[i]; + sprite_y_vel[j] = kLaserEye_SpawnXYVel[i + 2]; + sprite_flags2[j] = 0x20; + sprite_A[j] = 0x20; + sprite_oam_flags[j] = 5; + sprite_defl_bits[j] = 0x48; + sprite_ignore_projectile[j] = 0x48; + sprite_delay_main[j] = 5; + if (link_shield_type == 3) + sprite_flags5[j] = 32; + SpriteSfx_QueueSfx3WithPan(k, 0x19); + } +} + +void LaserEye_Draw(int k) { // 9ea708 + static const DrawMultipleData kLaserEye_Dmd[24] = { + { 8, -4, 0x40c8, 0}, + { 8, 4, 0x40d8, 0}, + { 8, 12, 0xc0c8, 0}, + { 8, -4, 0x40c9, 0}, + { 8, 4, 0x40d9, 0}, + { 8, 12, 0xc0c9, 0}, + { 0, -4, 0x00c8, 0}, + { 0, 4, 0x00d8, 0}, + { 0, 12, 0x80c8, 0}, + { 0, -4, 0x00c9, 0}, + { 0, 4, 0x00d9, 0}, + { 0, 12, 0x80c9, 0}, + {-4, 8, 0x00d6, 0}, + { 4, 8, 0x00d7, 0}, + {12, 8, 0x40d6, 0}, + {-4, 8, 0x00c6, 0}, + { 4, 8, 0x00c7, 0}, + {12, 8, 0x40c6, 0}, + {-4, 0, 0x80d6, 0}, + { 4, 0, 0x80d7, 0}, + {12, 0, 0xc0d6, 0}, + {-4, 0, 0x80c6, 0}, + { 4, 0, 0x80c7, 0}, + {12, 0, 0xc0c6, 0}, + }; + if (sprite_head_dir[k]) + sprite_graphics[k] = (sprite_delay_aux4[k] == 0); + sprite_obj_prio[k] = 0x30; + Sprite_DrawMultiple(k, &kLaserEye_Dmd[(sprite_graphics[k] + sprite_D[k] * 2) * 3], 3, NULL); +} + +void Sprite_94_Pirogusu(int k) { // 9ea742 + static const uint8 kPirogusu_A0[4] = {2, 3, 0, 1}; + static const uint8 kPirogusu_A1[8] = {9, 11, 5, 7, 5, 11, 7, 9}; + static const uint8 kPirogusu_A2[8] = {16, 17, 18, 19, 12, 13, 14, 15}; + static const int8 kPirogusu_XYvel[6] = {0, 0, 4, -4, 0, 0}; + static const int8 kPirogusu_XYvel2[6] = {2, -2, 0, 0, 2, -2}; + static const int8 kPirogusu_XYvel3[6] = {24, -24, 0, 0, 24, -24}; + + if (sprite_E[k]) { + Sprite_94_Tile(k); + return; + } + sprite_obj_prio[k] |= 0x30; + Pirogusu_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // wriggle in hole + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 31; + } + sprite_ignore_projectile[k] = sprite_delay_main[k]; + sprite_A[k] = kPirogusu_A0[sprite_D[k]]; + break; + case 1: { // emerge + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 32; + sprite_ignore_projectile[k] = 0; + Sprite_ZeroVelocity_XY(k); + } else { + sprite_A[k] = kPirogusu_A1[sprite_delay_main[k] >> 3 & 1 | sprite_D[k] << 1]; + int j = sprite_D[k]; + sprite_x_vel[k] = kPirogusu_XYvel[j + 2]; + sprite_y_vel[k] = kPirogusu_XYvel[j]; + Sprite_MoveXY(k); + } + break; + } + case 2: { // splash into play + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + int j = sprite_D[k]; + sprite_x_vel[k] += kPirogusu_XYvel2[j]; + sprite_y_vel[k] += kPirogusu_XYvel2[j + 2]; + if (!sprite_delay_main[k]) { + Sprite_SpawnSmallSplash(k); + sprite_delay_aux1[k] = 16; + sprite_ai_state[k] = 3; + } + sprite_A[k] = kPirogusu_A2[frame_counter >> 2 & 1 | sprite_D[k] << 1]; + break; + } + case 3: { // swim + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_A[k] = kPirogusu_A2[frame_counter >> 2 & 1 | sprite_D[k] << 1] + 8; + if (!sprite_delay_aux1[k]) { + Pirogusu_SpawnSplash(k); + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k) & 15) { + static const uint8 kPirogusu_Dir[8] = {2, 3, 2, 3, 0, 1, 0, 1}; + sprite_D[k] = kPirogusu_Dir[sprite_D[k] << 1 | GetRandomNumber() & 1]; + } + int j = sprite_D[k]; + sprite_x_vel[k] = kPirogusu_XYvel3[j]; + sprite_y_vel[k] = kPirogusu_XYvel3[j + 2]; + } + break; + } + } +} + +void Pirogusu_SpawnSplash(int k) { // 9ea897 + static const uint8 kPirogusu_Tab0[4] = {3, 4, 5, 4}; + if ((k ^ frame_counter) & 3) + return; + int x = kPirogusu_Tab0[GetRandomNumber() & 3]; + int y = kPirogusu_Tab0[GetRandomNumber() & 3]; + int j = GarnishAllocLow(); + if (j >= 0) { + garnish_type[j] = 11; + garnish_active = 11; + Garnish_SetX(j, Sprite_GetX(k) + x); + Garnish_SetY(j, Sprite_GetY(k) + y + 16); + garnish_countdown[j] = 15; + } +} + +void Pirogusu_Draw(int k) { // 9ea93b + static const uint8 kPirogusu_OamFlags[28] = { + 0, 0x80, 0x40, 0, 0, 0, 0, 0x80, 0x80, 0xc0, 0x40, 0x40, 0, 0x40, 0x80, 0xc0, + 0x40, 0xc0, 0, 0x80, 0, 0x40, 0x80, 0xc0, 0x40, 0xc0, 0, 0x80, + }; + static const uint8 kPirogusu_Gfx[28] = { + 0, 0, 1, 1, 2, 3, 4, 3, 2, 3, 4, 3, 5, 5, 5, 5, + 7, 7, 7, 7, 6, 6, 6, 6, 8, 8, 8, 8, + }; + int j = sprite_A[k]; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kPirogusu_OamFlags[j]; + sprite_graphics[k] = kPirogusu_Gfx[j]; + if (j < 4) { + cur_sprite_x += 4, cur_sprite_y += 4; + SpriteDraw_SingleSmall(k); + } else { + SpriteDraw_SingleLarge(k); + } +} + +void Sprite_93_Bumper(int k) { // 9ea982 + static const int8 kBumper_Vels[4] = { 0, 2, -2, 0 }; + Bumper_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckTileCollision(k); + if (!link_cape_mode && Sprite_CheckDamageToLink_same_layer(k)) { + Link_CancelDash(); + sprite_delay_main[k] = 32; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, 0x30); + link_actual_vel_y = pt.y + kBumper_Vels[joypad1H_last >> 2 & 3]; + link_actual_vel_x = pt.x + kBumper_Vels[joypad1H_last & 3]; + link_incapacitated_timer = 20; + Link_ResetSwimmingState(); + SpriteSfx_QueueSfx3WithPan(k, 0x32); + } + for (int j = 15; j >= 0; j--) { + if ((j ^ frame_counter) & 3 | sprite_z[j]) + continue; + if (sprite_state[j] < 9 || (sprite_flags3[j] | sprite_flags4[j]) & 0x40) + continue; + int x = Sprite_GetX(j), y = Sprite_GetY(j); + if ((uint16)(cur_sprite_x - x + 16) < 32 && (uint16)(cur_sprite_y - y + 16) < 32) { + sprite_F[j] = 15; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 0x40); + sprite_y_recoil[j] = pt.y; + sprite_x_recoil[j] = pt.x; + sprite_delay_main[k] = 32; + SpriteSfx_QueueSfx3WithPan(k, 0x32); + } + } +} + +void Bumper_Draw(int k) { // 9eaa8b + static const DrawMultipleData kBumper_Dmd[8] = { + {-8, -8, 0x00ec, 2}, + { 8, -8, 0x40ec, 2}, + {-8, 8, 0x80ec, 2}, + { 8, 8, 0xc0ec, 2}, + {-7, -7, 0x00ec, 2}, + { 7, -7, 0x40ec, 2}, + {-7, 7, 0x80ec, 2}, + { 7, 7, 0xc0ec, 2}, + }; + Sprite_DrawMultiple(k, &kBumper_Dmd[(sprite_delay_main[k] >> 1 & 1) * 4], 4, NULL); +} + +void Sprite_91_StalfosKnight(int k) { // 9eaaa7 + int j; + if (!sprite_ai_state[k]) { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + } else { + StalfosKnight_Draw(k); + } + if (Sprite_ReturnIfInactive(k)) + return; + if ((sprite_hit_timer[k] & 127) == 1) { + sprite_hit_timer[k] = 0; + sprite_ai_state[k] = 6; + sprite_delay_main[k] = 255; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + enemy_damage_data[0x918] = 2; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + switch(sprite_ai_state[k]) { + case 0: { // waiting for player + sprite_flags4[k] = 9; + sprite_ignore_projectile[k] = 9; + uint8 bak0 = sprite_flags2[k]; + sprite_flags2[k] |= 128; + bool flag = Sprite_CheckDamageToLink(k); + sprite_flags2[k] = bak0; + if (flag) { + sprite_z[k] = 144; + sprite_ai_state[k] = 1; + sprite_head_dir[k] = 2; + sprite_graphics[k] = 2; + SpriteSfx_QueueSfx2WithPan(k, 0x20); + } + break; + } + case 1: { // falling + uint8 old_z = sprite_z[k]; + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] + 64)) + sprite_z_vel[k] -= 3; + if (sign8(old_z ^ sprite_z[k]) && sign8(sprite_z[k])) { + sprite_ai_state[k] = 2; + sprite_ignore_projectile[k] = 0; + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + sprite_delay_main[k] = 63; + } + break; + } + case 2: { // + static const uint8 kStalfosKnight_Case2_Gfx[2] = {0, 1}; + enemy_damage_data[0x918] = 0; + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_B[k] = GetRandomNumber() & 63; + sprite_delay_main[k] = 127; + } else { + sprite_C[k] = sprite_graphics[k] = kStalfosKnight_Case2_Gfx[sprite_delay_main[k] >> 5]; + sprite_head_dir[k] = 2; + } + break; + } + case 3: // + Sprite_CheckDamageToAndFromLink(k); + if (sprite_delay_main[k] == sprite_B[k]) { + sprite_head_dir[k] = Sprite_IsRightOfLink(k).a; + sprite_ai_state[k] = 4; + sprite_delay_main[k] = 32; + } else { + static const uint8 kStalfosKnight_Case2_Dir[16] = {0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 2}; + sprite_head_dir[k] = kStalfosKnight_Case2_Dir[sprite_delay_main[k] >> 3]; + sprite_C[k] = 0; + sprite_graphics[k] = 0; + } + break; + case 4: // + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 5; + sprite_delay_main[k] = 255; + sprite_delay_aux1[k] = 32; + } + sprite_C[k] = 1; + sprite_graphics[k] = 1; + break; + case 5: // + Sprite_CheckDamageToAndFromLink(k); + if (sprite_delay_aux1[k] == 0) { + Sprite_MoveXYZ(k); + Sprite_CheckTileCollision(k); + if (!sign8(sprite_z_vel[k] + 64)) + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k] - 1)) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + if (!sprite_delay_main[k]) + goto SetToGround; + sprite_delay_aux1[k] = 16; + } + sprite_graphics[k] = sign8(sprite_z_vel[k] - 24) ? 2 : 0; + } else { + if (sprite_delay_aux1[k] == 1) { + sprite_z_vel[k] = 48; + Sprite_ApplySpeedTowardsLink(k, 16); + sprite_head_dir[k] = Sprite_IsRightOfLink(k).a; + SpriteSfx_QueueSfx3WithPan(k, 0x13); + } + sprite_C[k] = 1; + sprite_graphics[k] = 1; + } + break; + case 6: // + Sprite_MoveXYZ(k); + Sprite_CheckTileCollision(k); + if (!sign8(sprite_z_vel[k] + 64)) + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k] - 1)) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + } + j = sprite_delay_main[k]; + if (!j) { + if (GetRandomNumber() & 1) + goto SetToGround; + sprite_ai_state[k] = 7; + sprite_delay_main[k] = 80; + } else { + if (j >= 224 && (j & 3) == 0) + SpriteSfx_QueueSfx3WithPan(k, 0x14); + static const uint8 kStalfosKnight_Case6_C[32] = { + 0, 4, 8, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 12, 8, 4, 0, + }; + sprite_C[k] = kStalfosKnight_Case6_C[j >> 3]; + sprite_graphics[k] = 3; + sprite_head_dir[k] = 2; + } + break; + case 7: // + if (!sprite_delay_main[k]) { +SetToGround: + sprite_ai_state[k] = 2; + sprite_ignore_projectile[k] = 0; + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + sprite_delay_main[k] = 63; + } else { + static const uint8 kStalfosKnight_Case7_Gfx[2] = {1, 4}; + sprite_graphics[k] = kStalfosKnight_Case7_Gfx[sprite_delay_main[k] >> 2 & 1]; + } + break; + } +} + +void StalfosKnight_Draw(int k) { // 9eae04 + static const DrawMultipleData kStalfosKnight_Dmd[35] = { + {-4, -8, 0x0064, 0}, + {-4, 0, 0x0061, 2}, + { 4, 0, 0x0062, 2}, + {-3, 16, 0x0074, 0}, + {11, 16, 0x4074, 0}, + {-4, -7, 0x0064, 0}, + {-4, 1, 0x0061, 2}, + { 4, 1, 0x0062, 2}, + {-3, 16, 0x0065, 0}, + {11, 16, 0x4065, 0}, + {-4, -8, 0x0048, 2}, + { 4, -8, 0x0049, 2}, + {-4, 8, 0x004b, 2}, + { 4, 8, 0x004c, 2}, + { 4, 8, 0x004c, 2}, + {-4, 8, 0x0068, 2}, + { 4, 8, 0x0069, 2}, + { 4, 8, 0x0069, 2}, + { 4, 8, 0x0069, 2}, + { 4, 8, 0x0069, 2}, + {12, -7, 0x4064, 0}, + {-4, 1, 0x4062, 2}, + { 4, 1, 0x4061, 2}, + {-3, 16, 0x0065, 0}, + {11, 16, 0x4065, 0}, + {12, -8, 0x4064, 0}, + {-4, 0, 0x4062, 2}, + { 4, 0, 0x4061, 2}, + {-3, 16, 0x0074, 0}, + {11, 16, 0x4074, 0}, + {-4, -8, 0x4049, 2}, + { 4, -8, 0x4048, 2}, + {-4, 8, 0x404c, 2}, + { 4, 8, 0x404b, 2}, + { 4, 8, 0x404b, 2}, + }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + SpriteDraw_StalfosKnight_Head(k, &info); + oam_cur_ptr += 4, oam_ext_cur_ptr += 1; + Sprite_DrawMultiple(k, &kStalfosKnight_Dmd[sprite_graphics[k] * 5], 5, &info); + oam_cur_ptr -= 4, oam_ext_cur_ptr -= 1; + SpriteDraw_Shadow_custom(k, &info, 18); +} + +void SpriteDraw_StalfosKnight_Head(int k, PrepOamCoordsRet *info) { // 9eae4e + static const uint8 kStalfosKnight_DrawHead_Char[4] = {0x66, 0x66, 0x46, 0x46}; + static const uint8 kStalfosKnight_DrawHead_Flags[4] = {0x40, 0, 0, 0}; + if (sprite_graphics[k] == 2) + return; + int i = sprite_head_dir[k]; + OamEnt *oam = GetOamCurPtr(); + oam->x = info->x; + oam->y = ClampYForOam(info->y + sprite_C[k] - 12); + oam->charnum = kStalfosKnight_DrawHead_Char[i]; + oam->flags = info->flags | kStalfosKnight_DrawHead_Flags[i]; + bytewise_extended_oam[oam - oam_buf] = 2 | (info->x >> 8 & 1); +} + +void Sprite_90_Wallmaster(int k) { // 9eaea4 + sprite_obj_prio[k] |= 0x30; + WallMaster_Draw(k); + if (sprite_state[k] != 9) { + flag_is_link_immobilized = 0; + link_disable_sprite_damage = 0; + } + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_A[k]) { + link_x_coord = Sprite_GetX(k); + link_y_coord = Sprite_GetY(k) - sprite_z[k] + 3; + flag_is_link_immobilized = 1; + link_disable_sprite_damage = 1; + link_incapacitated_timer = 0; + link_actual_vel_x = link_actual_vel_y = 0; + link_y_vel = link_x_vel = 0; + if ((uint16)(link_y_coord - BG2VOFS_copy2 - 16) >= 0x100) { + flag_is_link_immobilized = 0; + link_disable_sprite_damage = 0; + WallMaster_SendPlayerToLastEntrance(); + Link_Initialize(); + return; + } + } else { + Sprite_CheckDamageFromLink(k); + } + switch(sprite_ai_state[k]) { + case 0: { // Descend + uint8 old_z = sprite_z[k]; + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] + 64)) + sprite_z_vel[k] -= 3; + if (sign8(old_z ^ sprite_z[k]) && sign8(sprite_z[k])) { + sprite_ai_state[k] = 1; + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + sprite_delay_main[k] = 63; + } + break; + } + case 1: // Attempt Grab + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 2; + + sprite_graphics[k] = (sprite_delay_main[k] & 0x20) ? 0 : 1; + if (Sprite_CheckDamageToLink(k)) { + sprite_A[k] = 1; + sprite_flags3[k] = 64; + SpriteSfx_QueueSfx3WithPan(k, 0x2a); + } + break; + case 2: { // Ascend + uint8 old_z = sprite_z[k]; + Sprite_MoveZ(k); + if (sign8(sprite_z_vel[k] - 64)) + sprite_z_vel[k] += 2; + if (sign8(old_z ^ sprite_z[k]) && !sign8(sprite_z[k])) { + sprite_state[k] = 0; + } + break; + } + } +} + +void WallMaster_Draw(int k) { // 9eafe4 + static const DrawMultipleData kWallMaster_Dmd[8] = { + {-4, 0, 0x01a6, 2}, + {12, 0, 0x01aa, 0}, + {-4, 16, 0x01ba, 0}, + { 4, 8, 0x01a8, 2}, + {-4, 0, 0x01ab, 2}, + {12, 0, 0x01af, 0}, + {-4, 16, 0x01bf, 0}, + { 4, 8, 0x01ad, 2}, + }; + Sprite_DrawMultiple(k, &kWallMaster_Dmd[sprite_graphics[k] * 4], 4, NULL); + Sprite_DrawLargeShadow2(k); +} + +void Sprite_8F_Blob(int k) { // 9eb002 + if (sprite_state[k] == 9 && sprite_E[k]) { + sprite_E[k] = 0; + sprite_x_vel[k] = 1; + uint8 t = Sprite_CheckTileCollision(k); + sprite_x_vel[k] = 0; + if (t) { + sprite_state[k] = 0; + return; + } + SpriteSfx_QueueSfx2WithPan(k, 0x20); + } + if (sprite_C[k]) + sprite_obj_prio[k] = 0x30; + Zol_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + + if (sprite_ai_state[k] >= 2) { + Sprite_CheckDamageFromLink(k); + } + if (Sprite_ReturnIfRecoiling(k)) + return; + switch(sprite_ai_state[k]) { + case 0: { // hiding unseen + uint8 bak = sprite_flags4[k]; + sprite_flags4[k] |= 9; + sprite_flags2[k] |= 0x80; + uint8 t = Sprite_CheckDamageToLink(k); + sprite_flags4[k] = bak; + if (t) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 127; + sprite_flags2[k] &= ~0x80; + Sprite_SetX(k, link_x_coord); + Sprite_SetY(k, link_y_coord + 8); + sprite_delay_aux4[k] = 48; + sprite_ignore_projectile[k] = 0; + } + break; + } + case 1: { // popping out + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_z_vel[k] = 32; + Sprite_ApplySpeedTowardsLink(k, 16); + SpriteSfx_QueueSfx3WithPan(k, 0x30); + } else { + static const int8 kZol_PoppingOutGfx[16] = {0, 1, 7, 7, 6, 6, 5, 5, 6, 6, 5, 5, 4, 4, 4, 4}; + sprite_graphics[k] = kZol_PoppingOutGfx[sprite_delay_main[k] >> 3]; + } + break; + } + case 2: { // falling + if (sprite_delay_main[k] == 0) { + Sprite_CheckDamageFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + uint8 oldz = sprite_z[k]; + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] + 64)) + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k] ^ oldz) && sign8(sprite_z[k])) { + sprite_z_vel[k] = 0; + sprite_z[k] = 0; + sprite_C[k] = 0; + sprite_delay_main[k] = 31; + sprite_head_dir[k] = 8; + } + } else if (sprite_delay_main[k] == 1) { + sprite_delay_main[k] = 32; + sprite_ai_state[k]++; + sprite_graphics[k] = 0; + } else { + static const int8 kZol_FallingXvel[2] = {-8, 8}; + static const int8 kZol_FallingGfx[2] = {0, 1}; + sprite_graphics[k] = kZol_FallingGfx[(sprite_delay_main[k] - 1) >> 4]; + sprite_x_vel[k] = kZol_FallingXvel[frame_counter >> 1 & 1]; + Sprite_MoveX(k); + } + break; + } + case 3: // active + Sprite_CheckDamageToLink(k); + if (!sprite_delay_aux1[k]) { + Sprite_ApplySpeedTowardsLink(k, 48); + sprite_delay_aux1[k] = GetRandomNumber() & 63 | 96; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | (sign8(sprite_x_vel[k]) ? 0x40 : 0); + } + if (!sprite_delay_aux2[k]) { + sprite_subtype2[k]++; + if (!(sprite_subtype2[k] & 14 | sprite_wallcoll[k])) { + Sprite_MoveXY(k); + if (++sprite_G[k] == sprite_head_dir[k]) { + sprite_G[k] = 0; + sprite_delay_aux2[k] = (GetRandomNumber() & 31) + 64; + sprite_head_dir[k] = GetRandomNumber() & 31 | 16; + } + } + Sprite_CheckTileCollision(k); + sprite_graphics[k] = (sprite_subtype2[k] & 8) >> 3; + } else { + sprite_graphics[k] = sprite_delay_aux2[k] & 0x10 ? 1 : 0; + } + break; + } +} + +void Zol_Draw(int k) { // 9eb1c5 + PrepOamCoordsRet info; + if (!(sprite_oam_flags[k] & 1) && byte_7E0FC6 >= 3) + return; + + if (sprite_delay_aux4[k]) + Oam_AllocateFromRegionB(8); + + if (!sprite_ai_state[k]) { + Sprite_PrepOamCoord(k, &info); + return; + } + uint8 gfx = sprite_graphics[k]; + if (gfx < 4) { + static const uint8 kZol_OamFlags[4] = {0, 0, 0x40, 0x40}; + uint8 bak1 = sprite_oam_flags[k]; + sprite_oam_flags[k] = bak1 ^ kZol_OamFlags[gfx]; + sprite_graphics[k] = gfx + ((sprite_oam_flags[k] & 1 ^ 1) << 2); + SpriteDraw_SingleLarge(k); + sprite_graphics[k] = gfx; + sprite_oam_flags[k] = bak1; + } else { + static const DrawMultipleData kZol_Dmd[8] = { + {0, 8, 0x036c, 0}, + {8, 8, 0x036d, 0}, + {0, 8, 0x0060, 0}, + {8, 8, 0x0070, 0}, + {0, 8, 0x4070, 0}, + {8, 8, 0x4060, 0}, + {0, 0, 0x0040, 2}, + {0, 0, 0x0040, 2}, + }; + Sprite_DrawMultiple(k, &kZol_Dmd[(gfx - 4) * 2], 2, NULL); + } +} + +void Sprite_8E_Terrorpin(int k) { // 9eb26f + int j; + static const int8 kTerrorpin_Xvel[8] = {8, -8, 0, 0, 12, -12, 0, 0}; + static const int8 kTerrorpin_Yvel[8] = {0, 0, 8, -8, 0, 0, 12, -12}; + static const uint8 kTerrorpin_Oamflags[2] = {0, 0x40}; + static const int8 kTerrorpin_Overturned_Xvel[2] = {8, -8}; + SpriteDraw_SingleLarge(k); + Sprite_CheckTileCollision(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (!sprite_delay_aux2[k]) + Sprite_CheckDamageFromLink(k); + Terrorpin_CheckForHammer(k); + Sprite_MoveXYZ(k); + switch (sprite_B[k]) { + case 0: // upright + if (!sprite_delay_aux4[k]) { + sprite_delay_aux4[k] = (GetRandomNumber() & 31) + 32; + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + } + j = sprite_D[k] + sprite_G[k]; + sprite_x_vel[k] = kTerrorpin_Xvel[j]; + sprite_y_vel[k] = kTerrorpin_Yvel[j]; + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + } + sprite_graphics[k] = frame_counter >> (sprite_G[k] ? 2 : 3) & 1; + sprite_flags3[k] |= 64; + sprite_defl_bits[k] = 4; + Sprite_CheckDamageToLink(k); + break; + case 1: // overturned + sprite_flags3[k] &= 191; + sprite_defl_bits[k] = 0; + if (!sprite_delay_aux4[k]) { + sprite_B[k] = 0; + sprite_z_vel[k] = 32; + sprite_delay_aux4[k] = 64; + return; + } + sprite_z_vel[k] -= 2; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + uint8 t = (uint8)-sprite_z_vel[k] >> 1; + sprite_z_vel[k] = (t < 9) ? 0 : t; + sprite_x_vel[k] = (int8)sprite_x_vel[k] >> 1; + if (sprite_x_vel[k] == 0xff) + sprite_x_vel[k] = 0; + sprite_y_vel[k] = (int8)sprite_y_vel[k] >> 1; + if (sprite_y_vel[k] == 0xff) + sprite_y_vel[k] = 0; + } + if (sprite_delay_aux4[k] < 64) { + sprite_x_vel[k] = kTerrorpin_Overturned_Xvel[sprite_delay_aux4[k] >> 1 & 1]; + sprite_subtype2[k]++; + } + sprite_graphics[k] = 2; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kTerrorpin_Oamflags[++sprite_subtype2[k] >> 3 & 1]; + break; + } +} + +void Terrorpin_CheckForHammer(int k) { // 9eb3a3 + if (!(sprite_z[k] | sprite_delay_aux2[k]) && + sprite_floor[k] == link_is_on_lower_level && + player_oam_y_offset != 0x80 && + link_item_in_hand & 0xa) { + SpriteHitBox hb; + Player_SetupActionHitBox(&hb); + Terrorpin_SetUpHammerHitBox(k, &hb); + if (CheckIfHitBoxesOverlap(&hb)) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_delay_aux2[k] = 32; + sprite_z_vel[k] = 32; + sprite_G[k] = 4; + sprite_B[k] ^= 1; + sprite_delay_aux4[k] = sprite_B[k] ? 0xff : 0x40; + } + } + sprite_head_dir[k] = 0; +} + +void Terrorpin_SetUpHammerHitBox(int k, SpriteHitBox *hb) { // 9eb405 + int x = Sprite_GetX(k) - 16; + int y = Sprite_GetY(k) - 16; + hb->r4_spr_xlo = x; + hb->r10_spr_xhi = x >> 8; + hb->r5_spr_ylo = y; + hb->r11_spr_yhi = y >> 8; + hb->r6_spr_xsize = hb->r7_spr_ysize = 48; +} + +void Sprite_8C_Arrghus(int k) { // 9eb433 + static const uint8 kArrghus_Gfx[9] = {1, 1, 1, 2, 2, 1, 1, 0, 0}; + sprite_obj_prio[k] |= 0x30; + Arrghus_Draw(k); + if (sprite_state[k] != 9 || sprite_z[k] < 96) { + if (Sprite_ReturnIfInactive(k)) + return; + } + Arrghus_HandlePuffs(k); + overlord_x_lo[4] = 1; + if ((sprite_hit_timer[k] & 127) == 2) { + sprite_ai_state[k] = 3; + SpriteSfx_QueueSfx3WithPan(k, 0x32); + sprite_subtype2[k] = 0; + sprite_flags3[k] = 64; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToLink(k); + if (!(sprite_subtype2[k]++ & 3)) { + if (++sprite_G[k] == 9) + sprite_G[k] = 0; + sprite_graphics[k] = kArrghus_Gfx[sprite_G[k]]; + } + + uint8 a = Sprite_CheckTileCollision(k); + if (a) { + if (sprite_ai_state[k] == 5) { + if (a & 3) + sprite_x_vel[k] = -sprite_x_vel[k]; + else + sprite_y_vel[k] = -sprite_y_vel[k]; + } else { + Sprite_ZeroVelocity_XY(k); + } + } + + switch (sprite_ai_state[k]) { + case 0: // approach speed + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 48; + } + Sprite_MoveXY(k); + Sprite_ApproachTargetSpeed(k, sprite_head_dir[k], sprite_D[k]); + break; + case 1: // decelerate + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + if (!Sprite_CheckIfScreenIsClear()) { + if (++overlord_x_lo[3] == 4) { + overlord_x_lo[3] = 0; + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 176; + } else { + sprite_delay_main[k] = (GetRandomNumber() & 63) + 48; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLink(k, (sprite_delay_main[k] & 3) + 8); + sprite_head_dir[k] = pt.x; + sprite_D[k] = pt.y; + } + } else { + sprite_ai_state[k] = 3; + SpriteSfx_QueueSfx3WithPan(k, 0x32); + sprite_subtype2[k] = 0; + } + } else { + Sprite_MoveXY(k); + Sprite_ApproachTargetSpeed(k, 0, 0); + } + break; + case 2: // case2 + overlord_x_lo[4] = 8; + if (sprite_delay_main[k] < 32) { + if (sign8(--overlord_x_lo[2])) { + overlord_x_lo[2] = 0; + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 112; + } + } else if (sprite_delay_main[k] < 96) { + overlord_x_lo[2]++; + } else if (sprite_delay_main[k] == 96) { + SpriteSfx_QueueSfx3WithPan(k, 0x26); + } else if ((sprite_delay_main[k] & 0xf) == 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x6); + } + break; + case 3: // jump way up + sprite_z_vel[k] = 120; + Sprite_MoveZ(k); + if (sprite_z[k] >= 224) { + sprite_delay_main[k] = 64; + sprite_ai_state[k] = 4; + sprite_z_vel[k] = 0; + sprite_x_lo[k] = link_x_coord; + sprite_y_lo[k] = link_y_coord; + } + break; + case 4: { // swoosh from above + if (!(a = sprite_delay_main[k])) { + sprite_z_vel[k] = 144; + uint8 old_z = sprite_z[k]; + Sprite_MoveZ(k); + if (sign8(a = old_z ^ sprite_z[k]) && sign8(a = sprite_z[k])) { + sprite_z[k] = 0; + Sprite_SpawnBigSplash(k); + sprite_ai_state[k] = 5; + sprite_delay_main[k] = 32; + SpriteSfx_QueueSfx3WithPan(k, 0x3); + sprite_x_vel[k] = 32; + sprite_y_vel[k] = 32; + } + } + if (a == 1) { // wtf + SpriteSfx_QueueSfx2WithPan(k, 0x20); + } + break; + } + case 5: // swim frantically + if (!sprite_delay_main[k]) { + sprite_flags3[k] = 0; + Sprite_MoveXY(k); + Sprite_CheckDamageFromLink(k); + if (!(frame_counter & 7)) { + SpriteSfx_QueueSfx2WithPan(k, 0x28); + int j = GarnishAllocLimit(sign8(sprite_y_vel[k]) ? 29 : 14); + if (j >= 0) { + garnish_type[j] = 21; + garnish_active = 21; + garnish_x_lo[j] = sprite_x_lo[k]; + garnish_x_hi[j] = sprite_x_hi[k]; + garnish_y_lo[j] = sprite_y_lo[k] + 24; // why no carry propagation + garnish_y_hi[j] = sprite_y_hi[k]; + garnish_countdown[j] = 15; + } + } + } + break; + } +} + +void Arrghus_Draw(int k) { // 9eb840 + static const DrawMultipleData kArrghus_Dmd[5] = { + {-8, -4, 0x0080, 2}, + { 8, -4, 0x4080, 2}, + {-8, 12, 0x00a0, 2}, + { 8, 12, 0x40a0, 2}, + { 0, 24, 0x00a8, 2}, + }; + Sprite_DrawMultiple(k, kArrghus_Dmd, 5, NULL); + OamEnt *oam = GetOamCurPtr(); + uint8 chr = sprite_graphics[k] * 2; + for (int i = 0; i < 4; i++) + oam[i].charnum += chr; + if (sprite_ai_state[k] == 5) + oam[4].y = 0xf0; + if (sprite_subtype2[k] & 8) + oam[4].flags |= 0x40; + + if (sprite_ai_state[k] != 5) { + oam_cur_ptr += 4, oam_ext_cur_ptr += 1; + if (sprite_z[k] < 0xa0) { + uint8 bak = sprite_oam_flags[k]; + sprite_oam_flags[k] &= ~1; + SpriteDraw_BigShadow(k, 0); + sprite_oam_flags[k] = bak; + } + } else { + Sprite_DrawLargeWaterTurbulence(k); + } + +} + +void Arrghus_HandlePuffs(int k) { // 9eb8b4 + static const uint16 kArrgi_Tab0[13] = {0, 0x40, 0x80, 0xc0, 0x100, 0x140, 0x180, 0x1c0, 0, 0x66, 0xcc, 0x132, 0x198}; + static const uint16 kArrgi_Tab1[13] = {0, 0, 0, 0, 0, 0, 0, 0, 0x1ff, 0x1ff, 0x1ff, 0x1ff, 0x1ff}; + static const uint8 kArrgi_Tab2[13] = {0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xc, 0xc, 0xc, 0xc, 0xc}; + static const int8 kArrgi_Tab3[52] = { + 0, -1, -2, -3, -4, -5, -6, -6, -5, -4, -3, -2, -1, 0, -1, -2, + -3, -4, -5, -6, -6, -5, -4, -3, -2, -1, 0, -1, -2, -3, -4, -5, + -6, -6, -5, -4, -3, -2, -1, 0, -1, -2, -3, -4, -5, -6, -6, -5, + -4, -3, -2, -1, + }; + + WORD(overlord_x_lo[0]) += overlord_x_lo[4]; + if (!(frame_counter & 3) && ++sprite_A[k] == 13) + sprite_A[k] = 0; + if (!(frame_counter & 7) && ++sprite_B[k] == 13) + sprite_B[k] = 0; + for(int i = 0; i != 13; i++) { + uint16 r0 = (WORD(overlord_x_lo[0]) + kArrgi_Tab0[i]) ^ kArrgi_Tab1[i]; + uint8 r14 = overlord_x_lo[2] + kArrgi_Tab2[i]; + + int8 sin_val = ArrgiSin(r0 + 0x00, r14 + kArrgi_Tab3[sprite_A[k] + i]); + int8 cos_val = ArrgiSin(r0 + 0x80, r14 + kArrgi_Tab3[sprite_B[k] + i]); + + int tx = Sprite_GetX(k) + sin_val; + overlord_x_hi[i] = tx; + overlord_y_hi[i] = tx >> 8; + + int ty = Sprite_GetY(k) + cos_val - 0x10; + overlord_gen2[i] = ty; + overlord_floor[i] = ty >> 8; + } + tmp_counter = 13; +} + +void Sprite_8D_Arrghi(int k) { // 9eb8c4 + static const uint8 kArrgi_Gfx[8] = {0, 1, 2, 2, 2, 2, 2, 1}; + + sprite_obj_prio[k] |= 0x30; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = kArrgi_Gfx[++sprite_subtype2[k] >> 3 & 7]; + if (sprite_B[k]) { + int j = sprite_B[k] - 1; + if (ancilla_type[j]) { + sprite_x_lo[k] = ancilla_x_lo[j]; + sprite_x_hi[k] = ancilla_x_hi[j]; + sprite_y_lo[k] = ancilla_y_lo[j]; + sprite_y_hi[k] = ancilla_y_hi[j]; + sprite_oam_flags[k] = 5; + sprite_flags3[k] &= ~0x40; + return; + } + sprite_ai_state[k] = 1; + sprite_B[k] = 0; + sprite_delay_main[k] = 32; + } + if (!sprite_delay_main[k]) + Sprite_CheckDamageToLink(k); + + if (!sprite_ai_state[k]) { + sprite_x_lo[k] = overlord_x_lo[k + 7]; + sprite_x_hi[k] = overlord_y_lo[k + 7]; + sprite_y_lo[k] = overlord_gen1[k + 7]; + sprite_y_hi[k] = overlord_gen3[k + 7]; + return; + } + Sprite_CheckDamageFromLink(k); + if (!((k ^ frame_counter) & 3)) { + uint16 x = overlord_y_lo[k + 7] << 8 | overlord_x_lo[k + 7]; + uint16 y = overlord_gen3[k + 7] << 8 | overlord_gen1[k + 7]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 4); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + if ((uint8)(sprite_x_lo[k] - overlord_x_lo[k + 7] + 8) < 16 && (uint8)(sprite_y_lo[k] - overlord_gen1[k + 7] + 8) < 16) { + sprite_ai_state[k] = 0; + sprite_oam_flags[k] = 0xd; + sprite_flags3[k] |= 0x40; + } + } + Sprite_MoveXY(k); + +} + +void Sprite_8B_Gibdo(int k) { // 9eb9a9 + int j; + Gibdo_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + switch(sprite_ai_state[k]) { + case 0: { + static const uint8 kGibdo_DirTarget[4] = {2, 6, 4, 0}; + static const uint8 kGibdo_Gfx[8] = {4, 8, 11, 10, 0, 6, 3, 7}; + sprite_graphics[k] = kGibdo_Gfx[sprite_D[k]]; + if (!(frame_counter & 7)) { + int j = sprite_A[k]; + if (sprite_D[k] - kGibdo_DirTarget[j]) { + sprite_D[k] += sign8(sprite_D[k] - kGibdo_DirTarget[j]) ? 1 : -1; + } else { + sprite_delay_main[k] = (GetRandomNumber() & 31) + 48; + sprite_ai_state[k] = 1; + } + } + break; + } + case 1: { + static const int8 kGibdo_XyVel[10] = {-16, 0, 0, 0, 16, 0, 0, 0, -16, 0}; + static const uint8 kGibdo_Gfx2[8] = {9, 2, 0, 4, 11, 3, 1, 5}; + int j = sprite_D[k]; + sprite_x_vel[k] = kGibdo_XyVel[j + 2]; + sprite_y_vel[k] = kGibdo_XyVel[j]; + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if ((!sprite_delay_main[k] || sprite_wallcoll[k]) && (j = Sprite_DirectionToFaceLink(k, NULL)) != sprite_A[k]) { + sprite_A[k] = j; + sprite_ai_state[k] = 0; + } else { + if (sign8(--sprite_B[k])) { + sprite_B[k] = 14; + sprite_subtype2[k]++; + } + sprite_graphics[k] = kGibdo_Gfx2[(sprite_subtype2[k] & 1) << 2 | sprite_A[k]]; + } + break; + } + } +} + +void Gibdo_Draw(int k) { // 9ebb20 + static const DrawMultipleData kGibdo_Dmd[24] = { + {0, -9, 0x0080, 2}, + {0, 0, 0x008a, 2}, + {0, -8, 0x0080, 2}, + {0, 1, 0x408a, 2}, + {0, -9, 0x0082, 2}, + {0, 0, 0x008c, 2}, + {0, -8, 0x0082, 2}, + {0, 0, 0x008e, 2}, + {0, -9, 0x0084, 2}, + {0, 0, 0x00a0, 2}, + {0, -8, 0x0084, 2}, + {0, 1, 0x40a0, 2}, + {0, -9, 0x0086, 2}, + {0, 0, 0x00a2, 2}, + {0, -9, 0x0088, 2}, + {0, 0, 0x00a4, 2}, + {0, -9, 0x4088, 2}, + {0, 0, 0x40a4, 2}, + {0, -9, 0x4082, 2}, + {0, 0, 0x408c, 2}, + {0, -9, 0x4086, 2}, + {0, 0, 0x40a2, 2}, + {0, -8, 0x4082, 2}, + {0, 1, 0x408e, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kGibdo_Dmd[sprite_graphics[k] * 2], 2, &info); + if (!sprite_pause[k]) + SpriteDraw_Shadow(k, &info); +} + +void Sprite_89_MothulaBeam(int k) { // 9ebb42 + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToLink(k); + if (!(frame_counter & 1)) + sprite_oam_flags[k] ^= 0x80; + Sprite_MoveXY(k); + if (!sprite_delay_main[k] && Sprite_CheckTileCollision(k)) + sprite_state[k] = 0; + if ((k ^ frame_counter) & 3) + return; + for (int i = 14; i >= 0; i--) { + if (garnish_type[i] == 0) { + garnish_type[i] = 2; + garnish_active = 2; + garnish_x_lo[i] = sprite_x_lo[k]; + garnish_x_hi[i] = sprite_x_hi[k]; + garnish_y_lo[i] = sprite_y_lo[k]; + garnish_y_hi[i] = sprite_y_hi[k]; + garnish_countdown[i] = 16; + garnish_sprite[i] = k; + garnish_floor[i] = sprite_floor[k]; + break; + } + } +} + +void Sprite_94_Tile(int k) { // 9ebbb9 + sprite_obj_prio[k] = 0x30; + FlyingTile_Draw(k); + if (Sprite_ReturnIfPaused(k)) + return; + if (sprite_hit_timer[k]) + goto lbl_a; + sprite_ignore_projectile[k] = 1; + switch (sprite_ai_state[k]) { + case 0: // erase tilemap + Dungeon_UpdateTileMapWithCommonTile(Sprite_GetX(k), (sprite_y_lo[k] + 8) & 0xff | (sprite_y_hi[k] << 8), 6); + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 128; + break; + case 1: // rise up + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 16; + Sprite_ApplySpeedTowardsLink(k, 32); + } else { + if (sprite_delay_main[k] >= 0x40) { + sprite_z_vel[k] = 4; + Sprite_MoveZ(k); + } +lbl_b: + sprite_graphics[k] = ++sprite_subtype2[k] >> 2 & 1; + if (!((k ^ frame_counter) & 7)) + SpriteSfx_QueueSfx2WithPan(k, 0x7); + } + break; + case 2: // towards player + sprite_ignore_projectile[k] = 0; + if (sprite_delay_main[k] && (sprite_delay_main[k] & 3) == 0) + Sprite_ApplySpeedTowardsLink(k, 32); + if (!Sprite_CheckDamageToAndFromLink(k)) { + Sprite_MoveXY(k); + cur_sprite_y -= sprite_z[k]; + if (!Sprite_CheckTileCollision(k)) + goto lbl_b; + } +lbl_a: + SpriteSfx_QueueSfx2WithPan(k, 0x1f); + sprite_state[k] = 6; + sprite_delay_main[k] = 31; + sprite_type[k] = 0xec; + sprite_hit_timer[k] = 0; + sprite_C[k] = 0x80; + break; + } +} + +void FlyingTile_Draw(int k) { // 9ebcca + static const DrawMultipleData kFlyingTile_Dmd[8] = { + {0, 0, 0x00d3, 0}, + {8, 0, 0x40d3, 0}, + {0, 8, 0x80d3, 0}, + {8, 8, 0xc0d3, 0}, + {0, 0, 0x00c3, 0}, + {8, 0, 0x40c3, 0}, + {0, 8, 0x80c3, 0}, + {8, 8, 0xc0c3, 0}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kFlyingTile_Dmd[sprite_graphics[k] * 4], 4, &info); + SpriteDraw_Shadow(k, &info); +} + +void Sprite_8A_SpikeBlock(int k) { // 9ebce8 + if (!sprite_E[k]) { + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + if (!sprite_delay_main[k] && (!SpikeBlock_CheckStatueCollision(k) || (sprite_wallcoll[k] & 0xf))) { + sprite_delay_main[k] = 4; + sprite_x_vel[k] = -sprite_x_vel[k]; + SpriteSfx_QueueSfx2WithPan(k, 0x5); + } + return; + } + Oam_AllocateFromRegionB(4); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + if (sprite_ai_state[k] == 0) { + Dungeon_UpdateTileMapWithCommonTile(Sprite_GetX(k), Sprite_GetY(k), 0); + sprite_ai_state[k] = 1; + sprite_delay_main[k] = 64; + sprite_delay_aux1[k] = 105; + } else if (sprite_delay_main[k] != 0) { + if (sprite_delay_main[k] == 1) { + sprite_x_lo[k] = sprite_A[k]; + sprite_y_lo[k] = sprite_B[k]; + } else { + sprite_x_vel[k] = (sprite_delay_main[k] >> 1) & 1 ? -8 : 8; + Sprite_MoveX(k); + sprite_x_vel[k] = 0; + } + } else if (sprite_ai_state[k] == 1) { + static const int8 kSpikeBlock_XVelTarget[4] = {32, -32, 0, 0}; + static const int8 kSpikeBlock_YVelTarget[4] = {0, 0, 32, -32}; + static const int8 kSpikeBlock_XVelDelta[4] = {1, -1, 0, 0}; + static const int8 kSpikeBlock_YVelDelta[4] = {0, 0, 1, -1}; + + int j = sprite_D[k]; + if (sprite_x_vel[k] != (uint8)kSpikeBlock_XVelTarget[j]) + sprite_x_vel[k] += kSpikeBlock_XVelDelta[j]; + if (sprite_y_vel[k] != (uint8)kSpikeBlock_YVelTarget[j]) + sprite_y_vel[k] += kSpikeBlock_YVelDelta[j]; + Sprite_MoveXY(k); + if (!sprite_delay_aux1[k]) { + Sprite_Get16BitCoords(k); + if (Sprite_CheckTileCollision(k)) { + sprite_ai_state[k] = 2; + sprite_delay_aux1[k] = 64; + } + } + } else if (sprite_delay_aux1[k] == 0) { + static const int8 kSpikeBlock_XVel[4] = {-16, 16, 0, 0}; + static const int8 kSpikeBlock_YVel[4] = {0, 0, -16, 16}; + int j = sprite_D[k]; + sprite_x_vel[k] = kSpikeBlock_XVel[j]; + sprite_y_vel[k] = kSpikeBlock_YVel[j]; + Sprite_MoveXY(k); + if (sprite_x_lo[k] == sprite_A[k] && sprite_y_lo[k] == sprite_B[k]) { + sprite_state[k] = 0; + Dungeon_UpdateTileMapWithCommonTile(Sprite_GetX(k), Sprite_GetY(k), 2); + } + } +} + +bool SpikeBlock_CheckStatueCollision(int k) { // 9ebe19 + for (int j = 15; j >= 0; j--) { + if (!((j ^ frame_counter) & 1) && sprite_state[j] && sprite_type[j] == 0x1c) { + int x0 = Sprite_GetX(k), y0 = Sprite_GetY(k); + int x1 = Sprite_GetX(j), y1 = Sprite_GetY(j); + if ((uint16)(x0 - x1 + 16) < 32 && (uint16)(y0 - y1 + 16) < 32) + return false; + } + } + return true; +} + +void Sprite_88_Mothula(int k) { // 9ebe7e + Mothula_Main(k); + if (Sprite_ReturnIfInactive(k)) + return; + Mothula_HandleSpikes(k); +} + +void Mothula_Main(int k) { // 9ebe88 + int j; + Mothula_Draw(k); + if (sprite_state[k] == 11) + sprite_ai_state[k] = 0; + if (Sprite_ReturnIfInactive(k)) + return; + sprite_flags3[k] = 0; + if (sprite_delay_aux3[k]) + sprite_flags3[k] = 64; + if ((sprite_F[k] & 127) == 6) { + sprite_F[k] = 0; + sprite_delay_aux3[k] = 32; + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 0; + sprite_G[k] = 64; + } + if (Sprite_ReturnIfRecoiling(k)) + return; + switch(sprite_ai_state[k]) { + case 0: // Delay + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 1; + break; + case 1: // Ascend + sprite_z_vel[k] = 8; + Sprite_MoveZ(k); + sprite_z_vel[k] = 0; + if (sprite_z[k] >= 24) { + sprite_G[k] = 128; + sprite_ai_state[k] = 2; + sprite_ignore_projectile[k] = 0; + sprite_delay_main[k] = 64; + } + Mothula_FlapWings(k); + break; + case 2: // FlyAbout + if (!sprite_G[k]) { + sprite_delay_main[k] = 63; + sprite_ai_state[k] = 3; + return; + } + sprite_G[k]--; + Mothula_FlapWings(k); + j = sprite_A[k] & 1; + sprite_z_vel[k] += j ? -1 : 1; + if (sprite_z_vel[k] == (uint8)(j ? -16 : 16)) + sprite_A[k]++; + if (!sprite_delay_main[k]) { + if (++sprite_C[k] == 7) { + sprite_C[k] = 0; + Sprite_ApplySpeedTowardsLink(k, 32); + sprite_delay_main[k] = 128; + } else { + static const int8 kMothula_XYvel[10] = {-16, -12, 0, 12, 16, 12, 0, -12, -16, -12}; + j = GetRandomNumber() & 7; + sprite_x_vel[k] = kMothula_XYvel[j + 2]; + sprite_y_vel[k] = kMothula_XYvel[j]; + sprite_delay_main[k] = (GetRandomNumber() & 31) + 64; + } + } + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_MoveZ(k); + if (Sprite_CheckTileCollision(k)) + sprite_delay_main[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + sprite_subtype2[k] += 2; + break; + case 3: // FireBeams + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) { + sprite_ai_state[k]--; + sprite_G[k] = GetRandomNumber() & 31 | 64; + } else { + if (sprite_delay_main[k] == 0x20) + Mothula_SpawnBeams(k); + Mothula_FlapWings(k); + } + break; + } +} + +void Mothula_FlapWings(int k) { // 9ebf9f + static const uint8 kMothula_FlapWingsGfx[4] = {0, 1, 2, 1}; + int j = ++sprite_subtype2[k] >> 2 & 3; + if (j == 0) + SpriteSfx_QueueSfx3WithPan(k, 0x2); + sprite_graphics[k] = kMothula_FlapWingsGfx[j]; +} + +void Mothula_SpawnBeams(int k) { // 9ebfdf + static const int8 kMothula_Beam_Xvel[3] = {-16, 0, 16}; + static const int8 kMothula_Beam_Yvel[3] = {24, 32, 24}; + SpriteSfx_QueueSfx3WithPan(k, 0x36); + for (int i = 2; i >= 0; i--) { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x89, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_y_lo[j] = info.r2_y - info.r4_z + 3; + sprite_delay_main[j] = 16; + sprite_ignore_projectile[j] = 16; + sprite_x_lo[j] = info.r0_x + kMothula_Beam_Xvel[i]; + sprite_x_vel[j] = kMothula_Beam_Xvel[i]; + sprite_y_vel[j] = kMothula_Beam_Yvel[i]; + sprite_z[j] = 0; + } + } + tmp_counter = 0xff; +} + +void Mothula_HandleSpikes(int k) { // 9ec088 + static const uint8 kMothula_Spike_XLo[30] = { + 0x38, 0x48, 0x58, 0x68, 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xb8, + 0xa8, 0x98, 0x78, 0x68, 0x58, 0x48, 0x38, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + }; + static const uint8 kMothula_Spike_YLo[30] = { + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x48, 0x58, 0x68, 0x78, 0x98, 0xa8, 0xb8, 0xc8, + 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xb8, 0xa8, 0x98, 0x78, 0x68, 0x58, 0x48, + }; + static const uint8 kMothula_Spike_Dir[30] = { + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + }; + + if (--sprite_head_dir[k]) + return; + sprite_head_dir[k] = 0x40; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x8a, &info); + if (j < 0) + return; + int i = GetRandomNumber() & 0x1f; + if (i >= 30) i -= 30; + sprite_A[j] = sprite_x_lo[j] = kMothula_Spike_XLo[i]; + sprite_B[j] = sprite_y_lo[j] = kMothula_Spike_YLo[i] - 1; + sprite_D[j] = kMothula_Spike_Dir[i]; + sprite_E[j] = 1; + sprite_x_hi[j] = byte_7E0FB0 + 1; + sprite_y_hi[j] = byte_7E0FB1 + 1; + sprite_x_vel[j] = 1; + Sprite_Get16BitCoords(j); + Sprite_CheckTileCollision(j); + sprite_x_vel[j] = 0; + sprite_x_lo[j] = sprite_A[j]; + sprite_y_lo[j] = sprite_B[j]; + if (!sprite_wallcoll[j]) { + sprite_state[j] = 0; + sprite_head_dir[k] = 1; + } +} + +void Sprite_86_Kodongo(int k) { // 9ec103 + static const int8 kKodondo_Xvel[4] = {1, -1, 0, 0}; + static const int8 kKodondo_Yvel[4] = {0, 0, 1, -1}; + static const uint8 kKodondo_Gfx[8] = {2, 2, 0, 5, 3, 3, 0, 5}; + static const uint8 kKodondo_OamFlags[8] = {0x40, 0, 0, 0, 0x40, 0, 0x40, 0x40}; + static const uint8 kKodondo_FlameGfx[8] = {2, 2, 0, 5, 4, 4, 1, 6}; + int j; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_flags[k] = 0; + switch(sprite_ai_state[k]) { + case 0: // choose dir + sprite_ai_state[k]++; + sprite_D[k] = GetRandomNumber() & 3; + sprite_flags[k] = 176; + for(;;) { + j = sprite_D[k]; + sprite_x_vel[k] = kKodondo_Xvel[j]; + sprite_y_vel[k] = kKodondo_Yvel[j]; + if (!Sprite_CheckTileCollision(k)) + break; + sprite_D[k] = (sprite_D[k] + 1) & 3; + } + Kodongo_SetDirection(k); + break; + case 1: // move + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + sprite_D[k] ^= 1; + Kodongo_SetDirection(k); + } + if ((sprite_x_lo[k] & 0x1f) == 4 && (sprite_y_lo[k] & 0x1f) == 0x1b && (GetRandomNumber() & 3) == 0) { + sprite_delay_main[k] = 111; + sprite_ai_state[k] = 2; + sprite_A[k] = 0; + } + j = ++sprite_subtype2[k] & 4 | sprite_D[k]; + sprite_graphics[k] = kKodondo_Gfx[j]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kKodondo_OamFlags[j]; + break; + case 2: // breathe flame + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 0; + j = (uint8)(sprite_delay_main[k] - 0x20) < 0x30; + if (j && (sprite_delay_main[k] & 0xf) == 0) + Kodongo_SpawnFire(k); + sprite_graphics[k] = kKodondo_FlameGfx[j * 4 + sprite_D[k]]; + break; + } +} + +void Kodongo_SetDirection(int k) { // 9ec158 + int j = sprite_D[k]; + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[j]; + sprite_y_vel[k] = kZazak_Yvel[j]; +} + +void Kodongo_SpawnFire(int k) { // 9ec223 + static const int8 kKodondo_Flame_X[4] = {8, -8, 0, 0}; + static const int8 kKodondo_Flame_Y[4] = {0, 0, 8, -8}; + static const int8 kKodondo_Flame_Xvel[4] = {24, -24, 0, 0}; + static const int8 kKodondo_Flame_Yvel[4] = {0, 0, 24, -24}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0x87, &info, 13); + if (j >= 0) { + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kKodondo_Flame_X[i]); + Sprite_SetY(j, info.r2_y + kKodondo_Flame_Y[i]); + sprite_x_vel[j] = kKodondo_Flame_Xvel[i]; + sprite_y_vel[j] = kKodondo_Flame_Yvel[i]; + sprite_ignore_projectile[j] = 1; + } +} + +void Sprite_87_KodongoFire(int k) { // 9ec274 + static const uint8 kFlame_OamFlags[4] = { 0, 0x40, 0xc0, 0x80 }; + static const int8 kFlame_Gfx[32] = { + 5, 4, 3, 1, 2, 0, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, + 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, + }; + + if (!sprite_delay_main[k]) { + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kFlame_OamFlags[frame_counter >> 2 & 3]; + if (!Sprite_CheckDamageToLink(k)) { + Sprite_MoveXY(k); + if (!Sprite_CheckTileCollision(k)) + return; + } + sprite_delay_main[k] = 127; + sprite_oam_flags[k] &= 63; + SpriteSfx_QueueSfx2WithPan(k, 0x2a); + } else { + if (Sprite_CheckDamageFromLink(k) & kCheckDamageFromPlayer_Carry && !--sprite_delay_main[k] || sprite_delay_main[k] == 1) + sprite_state[k] = 0; + sprite_graphics[k] = kFlame_Gfx[sprite_delay_main[k] >> 3]; + Flame_Draw(k); + Sprite_CheckDamageToLink(k); + } +} + +void Flame_Draw(int k) { // 9ec35c + static const DrawMultipleData kFlame_Dmd[12] = { + {0, 0, 0x018e, 2}, + {0, 0, 0x018e, 2}, + {0, 0, 0x01a0, 2}, + {0, 0, 0x01a0, 2}, + {0, 0, 0x418e, 2}, + {0, 0, 0x418e, 2}, + { 0, 0, 0x41a0, 2 }, + { 0, 0, 0x41a0, 2 }, + { 0, 0, 0x01a2, 2 }, + { 0, 0, 0x01a2, 2 }, + { 0, -6, 0x01a4, 0 }, + { 8, -6, 0x01a5, 0 }, + }; + Sprite_DrawMultiple(k, &kFlame_Dmd[sprite_graphics[k] * 2], 2, NULL); +} + +void Sprite_85_YellowStalfos(int k) { // 9ec37f + static const int8 kYellowStalfos_ObjPrio[6] = {0x30, 0, 0, 0, 0x30, 0}; + static const int8 kYellowStalfos_Gfx[32] = { + 8, 5, 1, 1, 8, 5, 1, 1, 8, 5, 1, 1, 7, 4, 2, 2, + 7, 4, 2, 2, 7, 4, 2, 2, 7, 4, 2, 2, 7, 4, 2, 2, + }; + static const int8 kYellowStalfos_HeadX[32] = { + -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, -0x80, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 1, 0, -1, 0, 1, 0, 0, 0, 0, 0, + }; + static const uint8 kYellowStalfos_HeadY[32] = { + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 12, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + }; + static const int8 kYellowStalfos_NeutralizedGfx[16] = {1, 1, 1, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9}; + static const int8 kYellowStalfos_NeutralizedHeadY[16] = {10, 10, 10, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7}; + int j; + + if (!sprite_A[k]) { + sprite_x_vel[k] = 1; + sprite_y_vel[k] = 1; + if (Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + return; + } + sprite_A[k]++; + sprite_C[k] = 10; + sprite_flags3[k] |= 64; + SpriteSfx_QueueSfx2WithPan(k, 0x20); + } + + sprite_obj_prio[k] |= kYellowStalfos_ObjPrio[sprite_ai_state[k]]; + YellowStalfos_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (link_sword_type >= 3) { + if (Sprite_ReturnIfRecoiling(k)) + return; + } else if (sprite_ai_state[k] != 5 && sprite_hit_timer[k]) { + sprite_hit_timer[k] = 0; + sprite_ai_state[k] = 5; + sprite_delay_main[k] = 255; + } + sprite_ignore_projectile[k] = 1; + switch (sprite_ai_state[k]) { + case 0: { // descend + sprite_head_dir[k] = 2; + uint8 bak0 = sprite_z[k]; + Sprite_MoveZ(k); + if (!sign8(sprite_z_vel[k] - 192)) + sprite_z_vel[k] -= 3; + if (!sign8(bak0) && sign8(sprite_z[k])) { + sprite_ai_state[k]++; + sprite_z[k] = 0; + sprite_z_vel[k] = 0; + sprite_delay_main[k] = 64; + YellowStalfos_Animate(k); + } + break; + } + case 1: // face player + sprite_ignore_projectile[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + sprite_head_dir[k] = sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 127; + } + sprite_flags3[k] &= ~0x40; + break; + case 2: // pause then detach head + sprite_ignore_projectile[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + j = sprite_delay_main[k]; + if (!j) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 64; + return; + } + if (j == 48) + YellowStalfos_EmancipateHead(k); + sprite_graphics[k] = kYellowStalfos_Gfx[j >> 2 & ~3 | sprite_D[k]]; + j = sprite_delay_main[k] >> 2; + sprite_B[k] = kYellowStalfos_HeadX[j]; + sprite_C[k] = kYellowStalfos_HeadY[j]; + sprite_flags3[k] &= ~0x40; + break; + case 3: // delay before ascending + sprite_ignore_projectile[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_delay_main[k]) + sprite_ai_state[k]++; + YellowStalfos_Animate(k); + break; + case 4: // ascend + sprite_graphics[k] = 0; + sprite_head_dir[k] = 2; + j = sprite_z[k]; + Sprite_MoveZ(k); + if (sign8(sprite_z_vel[k] - 64)) + sprite_z_vel[k] += 2; + if (sign8(j) && !sign8(sprite_z[k])) + sprite_state[k] = 0; + break; + case 5: // neutralized + sprite_ignore_projectile[k] = 0; + Sprite_CheckDamageFromLink(k); + j = sprite_delay_main[k]; + if (!j) + sprite_ai_state[k]--; + sprite_graphics[k] = kYellowStalfos_NeutralizedGfx[j >> 4]; + sprite_C[k] = kYellowStalfos_NeutralizedHeadY[j >> 4]; + break; + } +} + +void YellowStalfos_Animate(int k) { // 9ec509 + static const uint8 kYellowStalfos_Gfx2[4] = {6, 3, 1, 1}; + sprite_graphics[k] = kYellowStalfos_Gfx2[sprite_D[k]]; + sprite_flags3[k] &= ~0x40; +} + +void YellowStalfos_EmancipateHead(int k) { // 9ec580 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 2, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_z[j] = 13; + Sprite_ApplySpeedTowardsLink(j, 16); + sprite_delay_main[j] = 255; + sprite_delay_aux1[j] = 32; + } +} + +void YellowStalfos_Draw(int k) { // 9ec655 + static const DrawMultipleData kYellowStalfos_Dmd[22] = { + {0, 0, 0x000a, 2}, + {0, 0, 0x000a, 2}, + {0, 0, 0x000c, 2}, + {0, 0, 0x000c, 2}, + {0, 0, 0x002c, 2}, + {0, 0, 0x002c, 2}, + {5, 5, 0x002e, 0}, + {0, 0, 0x0024, 2}, + {4, 1, 0x003e, 0}, + {0, 0, 0x0024, 2}, + {0, 0, 0x000e, 2}, + {0, 0, 0x000e, 2}, + {3, 5, 0x402e, 0}, + {0, 0, 0x4024, 2}, + {4, 1, 0x403e, 0}, + {0, 0, 0x4024, 2}, + {0, 0, 0x400e, 2}, + {0, 0, 0x400e, 2}, + {0, 0, 0x002a, 2}, + {0, 0, 0x002a, 2}, + {0, 0, 0x002a, 2}, + {0, 0, 0x002a, 2}, + }; + oam_cur_ptr += 4, oam_ext_cur_ptr++; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kYellowStalfos_Dmd[sprite_graphics[k] * 2], 2, &info); + oam_cur_ptr -= 4, oam_ext_cur_ptr--; + if (!sprite_pause[k]) { + YellowStalfos_DrawHead(k, &info); + SpriteDraw_Shadow(k, &info); + } +} + +void YellowStalfos_DrawHead(int k, PrepOamCoordsRet *info) { // 9ec69a + static const uint8 kYellowStalfos_Head_Char[4] = {2, 2, 0, 4}; + static const uint8 kYellowStalfos_Head_Flags[4] = {0x40, 0, 0, 0}; + OamEnt *oam = GetOamCurPtr(); + if (sprite_graphics[k] == 10 || sprite_B[k] == 0x80) + return; + uint16 x = info->x + (int8)sprite_B[k]; + uint16 y = info->y - sprite_C[k]; + int j = sprite_head_dir[k]; + oam->x = x; + oam->y = ClampYForOam(y); + oam->charnum = kYellowStalfos_Head_Char[j]; + oam->flags = kYellowStalfos_Head_Flags[j] | info->flags; + bytewise_extended_oam[oam - oam_buf] = 2 | (x >> 8 & 1); +} + +void SpritePrep_Eyegore(int k) { // 9ec700 + uint8 t = BYTE(dungeon_room_index2); + if (t == 12 || t == 27 || t == 75 || t == 107) { + sprite_B[k]++; + if (sprite_type[k] == 0x83) + sprite_defl_bits[k] = 0; + } +} + +void Sprite_83_GreenEyegore(int k) { // 9ec79b + static const int8 kGoriya_Xvel[32] = { + 0, 16, -16, 0, 0, 13, -13, 0, 0, 13, -13, 0, 0, 0, 0, 0, + 0, -24, 24, 0, 0, -16, 16, 0, 0, -16, 16, 0, 0, 0, 0, 0, + }; + static const int8 kGoriya_Yvel[32] = { + 0, 0, 0, 0, -16, -5, -5, 0, 16, 13, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, -16, -16, 0, 24, 16, 16, 0, 0, 0, 0, 0, + }; + static const uint8 kGoriya_Dir[32] = { + 0, 0, 1, 0, 3, 3, 3, 0, 2, 2, 2, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 3, 3, 0, 2, 2, 2, 0, 0, 0, 0, 0, + }; + static const uint8 kGoriya_Gfx[16] = {8, 6, 0, 3, 9, 7, 1, 4, 8, 6, 0, 3, 9, 7, 2, 5}; + + if (!sprite_B[k]) { + Eyegore_Main(k); + return; + } + Goriya_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sprite_delay_aux1[k] == 8) + Sprite_SpawnFirePhlegm(k); + if (bitmask_of_dragstate != 0 || !(joypad1H_last & 0xf)) { + sprite_A[k] = 0; + Sprite_CheckDamageToAndFromLink(k); + Sprite_CheckTileCollision(k); + return; + } + + int j = (joypad1H_last & 0xf) | (sprite_type[k] == 0x84) * 16; + sprite_D[k] = kGoriya_Dir[j]; + sprite_x_vel[k] = kGoriya_Xvel[j]; + sprite_y_vel[k] = kGoriya_Yvel[j]; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckDamageToAndFromLink(k); + Sprite_CheckTileCollision(k); + sprite_graphics[k] = kGoriya_Gfx[++sprite_subtype2[k] & 12 | sprite_D[k]]; + if (sprite_type[k] == 0x84) { + PointU8 pt; + uint8 dir = Sprite_DirectionToFaceLink(k, &pt); + if (((uint8)(pt.x + 8) < 16 || (uint8)(pt.y + 8) < 16) && sprite_D[k] == dir) { + if (!(sprite_A[k] & 0x1f)) + sprite_delay_aux1[k] = 16; + sprite_A[k]++; + return; + } + } + sprite_A[k] = 0; +} + +void Eyegore_Main(int k) { // 9ec839 + static const uint8 kEyeGore_Closing_Gfx[8] = {0, 0, 1, 1, 2, 2, 2, 2}; + static const uint8 kEyeGore_Opening_Gfx[8] = {2, 2, 2, 2, 1, 1, 0, 0}; + static const uint8 kEyeGore_Chasing_Gfx[16] = {7, 5, 2, 9, 8, 6, 3, 10, 7, 5, 2, 9, 8, 6, 4, 11}; + static const uint8 kEyeGore_Opening_Delay[4] = {0x60, 0x80, 0xa0, 0x80}; + Eyegore_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + sprite_flags3[k] |= 64; + sprite_defl_bits[k] |= 4; + switch (sprite_ai_state[k]) { + case 0: // wait until player + if (!sprite_delay_main[k]) { + PointU8 pt; + Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 48) < 96 && + (uint8)(pt.y + 48) < 96) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 63; + } + } + break; + case 1: // openig eye + if (!sprite_delay_main[k]) { + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + sprite_ai_state[k] = 2; + sprite_delay_main[k] = kEyeGore_Opening_Delay[GetRandomNumber() & 3]; + } else { + sprite_graphics[k] = kEyeGore_Opening_Gfx[sprite_delay_main[k] >> 3]; + } + break; + case 2: // chase player + sprite_flags3[k] &= ~0x40; + if (sprite_type[k] != 0x84) + sprite_defl_bits[k] &= ~4; + if (!sprite_delay_main[k]) { + sprite_delay_main[k] = 63; + sprite_ai_state[k]++; + sprite_graphics[k] = 0; + } else { + if (!((k ^ frame_counter) & 31)) + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL); + int j = sprite_D[k]; + sprite_x_vel[k] = kFluteBoyAnimal_Xvel[j]; + sprite_y_vel[k] = kZazak_Yvel[j]; + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + sprite_graphics[k] = kEyeGore_Chasing_Gfx[++sprite_subtype2[k] & 12 | sprite_D[k]]; + } + break; + case 3: // closing eye + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 96; + } else { + sprite_graphics[k] = kEyeGore_Closing_Gfx[sprite_delay_main[k] >> 3]; + } + break; + } +} + +void Eyegore_Draw(int k) { // 9ecacf + static const DrawMultipleData kEyeGore_Dmd[48] = { + {-4, -4, 0x00a2, 2}, + { 4, -4, 0x40a2, 2}, + {-4, 4, 0x009c, 2}, + { 4, 4, 0x409c, 2}, + {-4, -4, 0x00a4, 2}, + { 4, -4, 0x40a4, 2}, + {-4, 4, 0x009c, 2}, + { 4, 4, 0x409c, 2}, + {-4, -4, 0x008c, 2}, + { 4, -4, 0x408c, 2}, + {-4, 4, 0x009c, 2}, + { 4, 4, 0x409c, 2}, + {-4, -3, 0x008c, 2}, + {12, -3, 0x408c, 0}, + {-4, 13, 0x00bc, 0}, + { 4, 5, 0x408a, 2}, + {-4, -3, 0x008c, 0}, + { 4, -3, 0x408c, 2}, + {-4, 5, 0x008a, 2}, + {12, 13, 0x40bc, 0}, + { 0, -4, 0x00aa, 2}, + { 0, 4, 0x00a6, 2}, + { 0, -4, 0x00aa, 2}, + { 0, 4, 0x00a6, 2}, + { 0, -3, 0x00aa, 2}, + { 0, 4, 0x00a8, 2}, + { 0, -3, 0x00aa, 2}, + { 0, 4, 0x00a8, 2}, + { 0, -4, 0x40aa, 2}, + { 0, 4, 0x40a6, 2}, + { 0, -4, 0x40aa, 2}, + { 0, 4, 0x40a6, 2}, + { 0, -3, 0x40aa, 2}, + { 0, 4, 0x40a8, 2}, + { 0, -3, 0x40aa, 2}, + { 0, 4, 0x40a8, 2}, + {-4, -4, 0x008e, 2}, + { 4, -4, 0x408e, 2}, + {-4, 4, 0x009e, 2}, + { 4, 4, 0x409e, 2}, + {-4, -3, 0x008e, 2}, + {12, -3, 0x408e, 0}, + {-4, 13, 0x00bd, 0}, + { 4, 5, 0x40a0, 2}, + {-4, -3, 0x008e, 0}, + { 4, -3, 0x408e, 2}, + {-4, 5, 0x00a0, 2}, + {12, 13, 0x40bd, 0}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiple(k, &kEyeGore_Dmd[sprite_graphics[k] * 4], 4, &info); + if (!sprite_pause[k]) + SpriteDraw_Shadow_custom(k, &info, 14); +} + +void SpritePrep_AntifairyCircle(int k) { // 9ecb0c + static const int8 kBubbleGroup_X[3] = {10, 20, 10}; + static const int8 kBubbleGroup_Y[3] = {-10, 0, 10}; + static const int8 kBubbleGroup_Xvel[3] = {18, 0, -18}; + static const int8 kBubbleGroup_Yvel[3] = {0, 18, 0}; + static const int8 kBubbleGroup_A[3] = {1, 1, 0}; + static const int8 kBubbleGroup_B[3] = { 0, 1, 1 }; + Sprite_SetX(k, Sprite_GetX(k) - 10); + sprite_y_vel[k] = -18; + sprite_x_vel[k] = 0; + sprite_A[k] = 0; + sprite_B[k] = 0; + tmp_counter = 2; + do { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x82, &info); + if (j >= 0) { + int i = tmp_counter; + Sprite_SetX(j, info.r0_x + kBubbleGroup_X[i]); + Sprite_SetY(j, info.r2_y + kBubbleGroup_Y[i]); + sprite_x_vel[j] = kBubbleGroup_Xvel[i]; + sprite_y_vel[j] = kBubbleGroup_Yvel[i]; + sprite_A[j] = kBubbleGroup_A[i]; + sprite_B[j] = kBubbleGroup_B[i]; + } + } while (!sign8(--tmp_counter)); +} + +void Sprite_82_AntifairyCircle(int k) { // 9ecb97 + static const int8 kBubbleGroup_Vel[2] = {1, -1}; + static const uint8 kBubbleGroup_VelTarget[2] = {18, (uint8)-18}; + + SpriteDraw_Antfairy(k); + if (Sprite_ReturnIfInactive(k)) + return; + int j = sprite_A[k] & 1; + if ((sprite_x_vel[k] += kBubbleGroup_Vel[j]) == kBubbleGroup_VelTarget[j]) + sprite_A[k]++; + + j = sprite_B[k] & 1; + if ((sprite_y_vel[k] += kBubbleGroup_Vel[j]) == kBubbleGroup_VelTarget[j]) + sprite_B[k]++; + + Sprite_MoveXY(k); + if (sprite_x_vel[k] && sprite_y_vel[k] && Sprite_CheckIfRoomIsClear()) { + sprite_type[k] = 0x15; + sprite_x_vel[k] = sign8(sprite_x_vel[k]) ? -16 : 16; + sprite_y_vel[k] = sign8(sprite_y_vel[k]) ? -16 : 16; + } + Sprite_CheckDamageToLink(k); +} + +void Sprite_81_Hover(int k) { // 9ecc02 + static const int8 kHover_OamFlags[4] = {0x40, 0, 0x40, 0}; + sprite_obj_prio[k] |= 48; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_F[k]) + sprite_ai_state[k] = 0; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + Sprite_CheckTileCollision(k); + sprite_graphics[k] = ++sprite_subtype2[k] >> 3 & 2; + switch(sprite_ai_state[k]) { + case 0: // stopped + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 1; + int j = Sprite_IsRightOfLink(k).a + Sprite_IsBelowLink(k).a * 2; + sprite_D[k] = j; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kHover_OamFlags[j]; + sprite_delay_main[k] = (GetRandomNumber() & 15) + 12; + Sprite_ZeroVelocity_XY(k); + } + break; + case 1: { // moving + static const int8 kHover_AccelX0[4] = {1, -1, 1, -1}; + static const int8 kHover_AccelY0[4] = {1, 1, -1, -1}; + static const int8 kHover_AccelX1[4] = {-1, 1, -1, 1}; + static const int8 kHover_AccelY1[4] = {-1, -1, 1, 1}; + int j = sprite_D[k]; + if (sprite_delay_main[k]) { + sprite_x_vel[k] += kHover_AccelX0[j]; + sprite_y_vel[k] += kHover_AccelY0[j]; + sprite_graphics[k] = sprite_subtype2[k] >> 3 & 1; + } else { + sprite_x_vel[k] += kHover_AccelX1[j]; + sprite_y_vel[k] += kHover_AccelY1[j]; + if (!sprite_y_vel[k]) { + sprite_ai_state[k] = 0; + sprite_delay_main[k] = 64; + } + } + break; + } + } +} + +void Sprite_AB_CrystalMaiden(int k) { // 9ece03 + cur_sprite_x -= dung_floor_x_offs; + cur_sprite_y -= dung_floor_y_offs; + + if (sprite_ai_state[k] >= 3) + CrystalMaiden_Draw(k); + is_nmi_thread_active = 1; + if (!BYTE(intro_did_run_step)) { + CrystalMaiden_RunCutscene(k); + BYTE(intro_did_run_step) = 1; + } +} + +void CrystalMaiden_RunCutscene(int k) { // 9ece39 + sprite_E[k]++; + poly_b += 6; + if (submodule_index) + return; + switch (sprite_ai_state[k]) { + case 0: // disable subscreen + TS_copy = 0; + sprite_ai_state[k]++; + break; + case 1: // enable subscreen + TS_copy = 1; + sprite_ai_state[k]++; + break; + case 2: // generate sparkles + if (poly_config1 < 6) { + poly_config1 = 0; + sprite_ai_state[k]++; + } else { + poly_config1 -= 3; + if (poly_config1 >= 64) + AncillaAdd_SwordChargeSparkle(sprite_A[k]); + } + break; + case 3: // filter palette + sprite_ai_state[k]++; + case 4: + if (!(sprite_E[k] & 1)) { + PaletteFilter_SP5F(); + if (!BYTE(palette_filter_countdown)) { + sprite_ai_state[k]++; + flag_is_link_immobilized = 1; + link_receiveitem_index = 0; + link_pose_for_item = 0; + link_animation_steps = 0; + link_direction_facing = 0; + } + } + break; + case 5: { // show message + static const uint16 kCrystalMaiden_Msgs[9] = {0x133, 0x132, 0x137, 0x134, 0x136, 0x132, 0x135, 0x138, 0x13c}; + int j = BYTE(cur_palace_index_x2) - 10; + if (j == 2 && savegame_map_icons_indicator < 7) + savegame_map_icons_indicator = 7; + if (j == 14 && (link_has_crystals & 0x7f) != 0x7f) + j = 16; + Sprite_ShowMessageUnconditional(kCrystalMaiden_Msgs[j >> 1]); + sprite_ai_state[k]++; + if ((link_has_crystals & 0x7f) == 0x7f) + savegame_map_icons_indicator = 8; + break; + } + case 6: // reading comprehension exam + Sprite_ShowMessageUnconditional(0x13a); + sprite_ai_state[k]++; + break; + case 7: // may the way of the hero + if (choice_in_multiselect_box) { + sprite_ai_state[k] = 5; + } else { + Sprite_ShowMessageUnconditional(0x139); + sprite_ai_state[k]++; + } + break; + case 8: // initiate dungeon exit + TS_copy = 0; + PrepareDungeonExitFromBossFight(); + sprite_state[k] = 0; + break; + } +} + +void Sprite_7D_BigSpike(int k) { // 9ecf47 + static const int8 kSpikeTrap_Xvel[4] = {32, -32, 0, 0}; + static const int8 kSpikeTrap_Xvel2[4] = {-16, 16, 0, 0}; + static const int8 kSpikeTrap_Yvel[4] = {0, 0, 32, -32}; + static const int8 kSpikeTrap_Yvel2[4] = {0, 0, -16, 16}; + static const uint8 kSpikeTrap_Delay[4] = {0x40, 0x40, 0x38, 0x38}; + int j; + + SpikeTrap_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + if (sprite_ai_state[k] == 0) { + PointU8 pt; + sprite_D[k] = j = Sprite_DirectionToFaceLink(k, &pt); + if ((uint8)(pt.x + 16) < 32 || (uint8)(pt.y + 16) < 32) { + sprite_delay_main[k] = kSpikeTrap_Delay[j]; + sprite_ai_state[k] = 1; + sprite_x_vel[k] = kSpikeTrap_Xvel[j]; + sprite_y_vel[k] = kSpikeTrap_Yvel[j]; + } + } else if (sprite_ai_state[k] == 1) { + if (Sprite_CheckTileCollision(k) || !sprite_delay_main[k]) { + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 96; + } + Sprite_MoveXY(k); + } else { + if (!sprite_delay_main[k]) { + j = sprite_D[k]; + sprite_x_vel[k] = kSpikeTrap_Xvel2[j]; + sprite_y_vel[k] = kSpikeTrap_Yvel2[j]; + Sprite_MoveXY(k); + if (sprite_x_lo[k] == sprite_A[k] && sprite_y_lo[k] == sprite_C[k]) + sprite_ai_state[k] = 0; + } + } +} + +void SpikeTrap_Draw(int k) { // 9ecfff + static const DrawMultipleData kSpikeTrap_Dmd[4] = { + {-8, -8, 0x00c4, 2}, + { 8, -8, 0x40c4, 2}, + {-8, 8, 0x80c4, 2}, + { 8, 8, 0xc0c4, 2}, + }; + Sprite_DrawMultiple(k, kSpikeTrap_Dmd, 4, NULL); +} + +void Sprite_7E_Firebar_Clockwise(int k) { // 9ed01a + static const int8 kGuruguruBar_incr[4] = {-2, 2, -1, 1}; + Firebar_Main(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + int j = (sprite_type[k] - 0x7e) + (BYTE(cur_palace_index_x2) == 18) * 2; + + int t = sprite_A[k] | sprite_B[k] << 8; + t = (t + kGuruguruBar_incr[j]) & 0x1ff; + sprite_A[k] = t; + sprite_B[k] = t >> 8; +} + +void Firebar_Main(int k) { // 9ed049 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + byte_7E0FB6 = info.flags; + BYTE(dungmap_var7) = info.x; + HIBYTE(dungmap_var7) = info.y; + int angle = sprite_A[k] | sprite_B[k] << 8; + int8 sinval = GuruguruBarSin(angle, 0x40); + int8 cosval = GuruguruBarSin((angle + 0x80) & 0x1ff, 0x40); + uint8 flags = (sprite_subtype2[k] << 4 & 0xc0) | info.flags; + for (int i = 3; i >= 0; i--, oam++) { + oam->x = info.x + sinval * (i + 1) / 4; + oam->y = info.y + cosval * (i + 1) / 4; + oam->charnum = 0x28; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = 2; + } + Sprite_CorrectOamEntries(k, 3, 0xff); + if (!((k ^ frame_counter) & 3 | submodule_index | flag_unk1)) { + OamEnt *oam = GetOamCurPtr(); + for (int i = 0; i < 4; i++, oam++) { + if (bytewise_extended_oam[oam - oam_buf] & 1) + continue; + if ((uint8)(oam->x + BG2HOFS_copy2 - link_x_coord + 12) < 24 && + oam->y < 0xf0 && + (uint8)(oam->y + BG2VOFS_copy2 - link_y_coord + 4) < 16) + Sprite_AttemptDamageToLinkPlusRecoil(k); + } + } +} + +void Sprite_80_Firesnake(int k) { // 9ed1d1 + static const uint8 kWinder_OamFlags[4] = {0, 0x40, 0x80, 0xc0}; + static const int8 kWinder_Xvel[4] = {24, -24, 0, 0}; + static const int8 kWinder_Yvel[4] = {0, 0, 24, -24}; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_oam_flags[k] = sprite_oam_flags[k] & 0x3f | kWinder_OamFlags[frame_counter >> 2 & 3]; + if (sprite_A[k]) { + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (sprite_delay_main[k] == 0) + sprite_state[k] = 0; + return; + } + Sprite_CheckDamageToAndFromLink(k); + Firesnake_SpawnFireball(k); + if (!sprite_wallcoll[k]) + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) + sprite_D[k] = kZazak_Dir2[sprite_D[k] * 2 + (GetRandomNumber() & 1)]; + int j = sprite_D[k]; + sprite_x_vel[k] = kWinder_Xvel[j]; + sprite_y_vel[k] = kWinder_Yvel[j]; +} + +void Firesnake_SpawnFireball(int j) { // 9ed239 + if ((j ^ frame_counter) & 7) + return; + int k = GarnishAlloc(); + garnish_type[k] = 1; + garnish_active = 1; + garnish_x_lo[k] = sprite_x_lo[j]; + garnish_x_hi[k] = sprite_x_hi[j]; + int y = Sprite_GetY(j) + 16; + garnish_y_lo[k] = y; + garnish_y_hi[k] = y >> 8; + garnish_countdown[k] = 32; + garnish_sprite[k] = j; + garnish_floor[k] = sprite_floor[j]; +} + +void Sprite_7C_GreenStalfos(int k) { // 9ed299 + static const uint8 kGreenStalfos_Dir[4] = {4, 6, 0, 2}; + static const uint8 kGreenStalfos_OamFlags[4] = {0x40, 0, 0, 0}; + static const uint8 kGreenStalfos_Gfx[4] = {0, 0, 1, 2}; + int j = sprite_D[k]; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | kGreenStalfos_OamFlags[j]; + sprite_graphics[k] = kGreenStalfos_Gfx[j]; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + Sprite_CheckDamageToAndFromLink(k); + j = Sprite_DirectionToFaceLink(k, NULL); + if (kGreenStalfos_Dir[j] != link_direction_facing) { + sprite_A[k] = 0; + if (!((k ^ frame_counter) & 7)) { + uint8 vel = sprite_B[k]; + if (vel != 4) + sprite_B[k]++; + Sprite_ApplySpeedTowardsLink(k, vel); + sprite_D[k] = Sprite_IsRightOfLink(k).a; + } + } else { + sprite_A[k] = 1; + if (!((k ^ frame_counter) & 15)) { + uint8 vel = sprite_B[k]; + if (vel) + sprite_B[k]--; + Sprite_ApplySpeedTowardsLink(k, vel); + sprite_D[k] = Sprite_IsRightOfLink(k).a; + } + } + Sprite_MoveXY(k); +} + +void Sprite_7A_Agahnim(int k) { // 9ed330 + int j; + uint8 t; + static const uint8 kAgahnim_StartState[2] = {1, 6}; + static const uint8 kAgahnim_Gfx0[5] = {12, 13, 14, 15, 16}; + static const int8 kAgahnim_Tab5[2] = {32, -32}; + static const uint8 kAgahnim_Tab6[2] = {9, 11}; + static const uint8 kAgahnim_Dir[25] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 1, 1, 4, + 4, 0, 2, 2, 4, 4, 3, 2, 2, + }; + static const uint8 kAgahnim_Gfx1[6] = {2, 10, 8, 0, 4, 6}; + static const uint8 kAgahnim_Tab0[16] = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}; + static const uint8 kAgahnim_Tab1[16] = {0, 0, 0, 0, 0, 0, 0, 6, 5, 4, 3, 2, 1, 0, 0, 0}; + static const uint8 kAgahnim_Tab2[6] = {30, 24, 12, 0, 6, 18}; + static const uint8 kAgahnim_Gfx2[5] = {16, 15, 14, 13, 12}; + static const uint8 kAgahnim_Tab3[16] = {0x38, 0x38, 0x38, 0x58, 0x78, 0x98, 0xb8, 0xb8, 0xb8, 0x98, 0x58, 0x58, 0x60, 0x90, 0x98, 0x78}; + static const uint8 kAgahnim_Tab4[16] = {0xb8, 0x78, 0x58, 0x48, 0x48, 0x48, 0x58, 0x78, 0xb8, 0xb8, 0xb8, 0x90, 0x70, 0x70, 0x90, 0xa0}; + static const uint8 kAgahnim_Gfx3[7] = {0, 8, 10, 2, 2, 6, 4}; + Agahnim_Draw(k); + if (sprite_pause[k]) { + sprite_delay_main[k] = 32; + sprite_graphics[k] = 0; + sprite_D[k] = 3; + } + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + sprite_ignore_projectile[k] = 1; + switch (sprite_ai_state[k]) { + case 0: + sprite_ai_state[k] = kAgahnim_StartState[is_in_dark_world]; + break; + case 1: + if (!sprite_delay_main[k]) { + dialogue_message_index = 0x13f; + Sprite_ShowMessageMinimal(); + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 32; + } + break; + case 2: + byte_7E0FF8 = 0; + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 255; + } else { + sprite_graphics[k] = kAgahnim_Gfx0[sprite_delay_main[k] >> 3]; + } + break; + case 3: + j = sprite_delay_main[k]; + if (j == 192) + SpriteSfx_QueueSfx3WithPan(k, 0x27); + if (j >= 239 || j < 16) { + AgahnimWarpShadowFilter(is_in_dark_world ? k : 2); + } else { + if (!k) { + Sprite_CheckDamageToAndFromLink(k); + sprite_ignore_projectile[k] = 0; + } + } + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_delay_main[k] = 39; + return; + } + if (sprite_delay_main[k] >= 128) { + Sprite_ApplySpeedTowardsLink(k, 2); + sprite_D[k] = kAgahnim_Dir[((int8)sprite_y_vel[k] + 2) * 5 + 2 + (int8)sprite_x_vel[k]]; + Sprite_ApplySpeedTowardsLink(k, 32); + if (sprite_subtype[k] == 4) + sprite_D[k] = 3; + } else if (sprite_delay_main[k] == 112) { + Agahnim_PerformAttack(k); + } + j = sprite_delay_main[k] >> 4; + sprite_A[k] = kAgahnim_Tab0[j]; + t = kAgahnim_Tab1[j]; + sprite_head_dir[k] = t ? t + kAgahnim_Tab2[sprite_D[k]] : t ; + sprite_graphics[k] = kAgahnim_Gfx1[sprite_D[k]] + sprite_A[k]; + break; + case 4: + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + j = sprite_subtype[k] == 4 ? 4 : GetRandomNumber() & 0xf; + sprite_C[k] = kAgahnim_Tab3[j]; + sprite_E[k] = kAgahnim_Tab4[j]; + sprite_G[k] = 8; + } else { + sprite_graphics[k] = kAgahnim_Gfx2[sprite_delay_main[k] >> 3]; + } + break; + case 5: { + if ((uint16)(sprite_x_lo[k] - sprite_C[k] + 7) < 14 && + (uint16)(sprite_y_lo[k] - sprite_E[k] + 7) < 14) { + sprite_x_lo[k] = sprite_C[k]; + sprite_y_lo[k] = sprite_E[k]; + sprite_ai_state[k] = 2; + sprite_delay_main[k] = 39; + return; + } + int x = sprite_x_hi[k] << 8 | sprite_C[k]; + int y = sprite_y_hi[k] << 8 | sprite_E[k]; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, sprite_G[k]); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + if (sprite_G[k] < 64) + sprite_G[k]++; + Sprite_MoveXY(k); + break; + } + case 6: + if (!sprite_delay_main[k]) { + dialogue_message_index = 0x141; + Sprite_ShowMessageMinimal(); + sprite_ai_state[k]++; + sprite_delay_main[k] = 80; + } + break; + case 7: + if (sprite_anim_clock[k]) { + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 32; + } else { + sprite_x_vel[k] = kAgahnim_Tab5[k - 1]; + sprite_y_vel[k] += 2; + Sprite_MoveXY(k); + j = Sprite_Agahnim_ApplyMotionBlur(k); + if (j >= 0) + sprite_oam_flags[j] = 4; + } + } else { + if (!sprite_delay_main[k]) { + sprite_ai_state[k] = 3; + sprite_delay_main[k] = 32; + } else if (sprite_delay_main[k] == 64) { + sound_effect_2 = 0x28; + tmp_counter = 1; + do { + SpriteSpawnInfo info; + j = Sprite_SpawnDynamicallyEx(k, 0x7A, &info, 2); + Sprite_SetSpawnedCoordinates(j, &info); + sprite_flags3[j] = kAgahnim_Tab6[j - 1]; + sprite_anim_clock[j] = sprite_oam_flags[j] = sprite_flags3[j] & 15; + sprite_ai_state[j] = sprite_ai_state[k]; + sprite_delay_main[j] = 32; + } while (!sign8(--tmp_counter)); + } + } + break; + case 8: + flag_block_link_menu = 2; + sprite_head_dir[k] = 0; + if (sprite_delay_main[k] >= 64) { + sprite_hit_timer[k] |= 0xe0; + } else { + if (sprite_delay_main[k] == 1) { + Sprite_SpawnPhantomGanon(k); + music_control = 0x1d; + } + sprite_hit_timer[k] = 0; + sprite_graphics[k] = 17; + } + break; + case 9: { + sprite_head_dir[k] = 0; + int x = Sprite_GetX(0), y = Sprite_GetY(0); + if ((uint16)(cur_sprite_x - x + 4) < 8 && + (uint16)(cur_sprite_y - y + 4) < 8) + sprite_state[k] = 0; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 0x20); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + Sprite_MoveXY(k); + Sprite_Agahnim_ApplyMotionBlur(k); + break; + } + case 10: + if (!sprite_delay_main[k]) { + sprite_state[k] = 0; + PrepareDungeonExitFromBossFight(); + } + if (sprite_delay_main[k] < 16) { + CGADSUB_copy = 0x7f; + TM_copy = 6; + TS_copy = 0x10; + PaletteFilter_SP5F(); + } + if (sprite_z_vel[k] != 0xff) + sprite_z_vel[k]++; + j = sprite_z_subpos[k] + sprite_z_vel[k]; + sprite_z_subpos[k] = j; + if (j & 0x100 && ++sprite_subtype2[k] == 7) { + sprite_subtype2[k] = 0; + SpriteSfx_QueueSfx2WithPan(k, 0x4); + } + sprite_graphics[k] = kAgahnim_Gfx3[sprite_subtype2[k]]; + break; + } +} + +void Agahnim_PerformAttack(int k) { // 9ed67a + static const int8 kAgahnim_X0[6] = {0, 10, 8, 0, -10, -10}; + static const int8 kAgahnim_Y0[6] = {-9, -2, -2, -9, -2, -2}; + + if (!k) { + sprite_subtype[k]++; + if (is_in_dark_world) + sprite_subtype[k] &= 3; + } + if (sprite_subtype[k] == 5) { + sprite_subtype[k] = 0; + SpriteSfx_QueueSfx3WithPan(k, 0x26); + for (int i = 0; i < 4; i++) + Sprite_SpawnLightning(k); + } else { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x7B, &info); + if (j >= 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x29); + int i = sprite_D[k]; + Sprite_SetX(j, info.r0_x + kAgahnim_X0[i]); + Sprite_SetY(j, info.r2_y + kAgahnim_Y0[i]); + sprite_ignore_projectile[j] = sprite_y_hi[j]; + sprite_x_vel[j] = sprite_x_vel[k]; + sprite_y_vel[j] = sprite_y_vel[k]; + if (sprite_subtype[k] >= 2 && !(GetRandomNumber() & 1)) { + sprite_B[j] = 1; + sprite_delay_main[j] = 32; + } + } + } +} + +void Agahnim_Draw(int k) { // 9ed978 + static const int8 kAgahnim_Draw_X0[72] = { + -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, + -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, + -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, -8, 8, + -8, 8, -8, 8, -6, 6, -6, 6, -8, 8, -8, 8, -6, 6, -6, 6, + 0, 8, 0, 8, -8, 8, -8, 8, + }; + static const int8 kAgahnim_Draw_Y0[72] = { + -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, + -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, + -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, -8, -8, 8, 8, + -8, -8, 8, 8, -6, -6, 6, 6, -8, -8, 8, 8, -6, -6, 6, 6, + 0, 0, 8, 8, 8, 8, 8, 8, + }; + static const uint8 kAgahnim_Draw_Char0[72] = { + 0x82, 0x82, 0xa2, 0xa2, 0x80, 0x80, 0xa0, 0xa0, 0x84, 0x84, 0xa4, 0xa4, 0x86, 0x86, 0xa6, 0xa6, + 0x88, 0x8a, 0xa8, 0xaa, 0x8c, 0x8e, 0xac, 0xae, 0xc4, 0xc2, 0xe4, 0xe6, 0xc0, 0xc2, 0xe0, 0xe2, + 0x8a, 0x88, 0xaa, 0xa8, 0x8e, 0x8c, 0xae, 0xac, 0xc2, 0xc4, 0xe6, 0xe4, 0xc2, 0xc0, 0xe2, 0xe0, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xdf, 0xdf, 0xdf, 0xdf, 0x40, 0x42, 0x40, 0x42, + }; + static const uint8 kAgahnim_Draw_Flags0[72] = { + 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, 0, 0x40, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, 0, 0x40, 0x80, 0xc0, + 0, 0x40, 0x80, 0xc0, 0, 0, 0, 0, + }; + static const int8 kAgahnim_Draw_X1[72] = { + -7, 15, -11, 11, -11, 11, -8, 8, -4, 4, 0, 0, -10, -1, -14, -5, + -14, -5, -12, -7, -10, -7, -10, -10, 16, 8, 12, 4, 12, 4, 10, 6, + 9, 7, 8, 8, -6, -6, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, + 14, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -7, 15, -11, 11, + -11, 11, -8, 8, -4, 4, 0, 0, + }; + static const int8 kAgahnim_Draw_Y1[72] = { + -5, -5, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -3, 9, -7, 5, + -7, 5, -5, 3, -3, 3, -2, -2, -3, 9, -7, 5, -7, 5, -5, 3, + -3, 3, -2, -2, -3, 9, -7, 5, -7, 5, -5, 3, -3, 3, -2, -2, + -3, 9, -7, 5, -7, 5, -5, 3, -3, 3, -2, -2, -5, -5, -9, -9, + -9, -9, -9, -9, -9, -9, -9, -9, + }; + static const uint8 kAgahnim_Draw_Char1[36] = { + 0xce, 0xcc, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xcc, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xcc, 0xc6, 0xc6, + 0xc6, 0xc6, 0xce, 0xcc, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xcc, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xcc, + 0xc6, 0xc6, 0xc6, 0xc6, + }; + static const uint8 kAgahnim_Draw_Ext1[36] = { + 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, + 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, + 2, 2, 2, 2, + }; + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + OamEnt *oam = GetOamCurPtr(); + int g = sprite_graphics[k]; + for (int i = 3; i >= 0; i--, oam++) { + int j = g * 4 + i; + oam->x = info.x + kAgahnim_Draw_X0[j]; + oam->y = info.y + kAgahnim_Draw_Y0[j]; + oam->charnum = kAgahnim_Draw_Char0[j]; + oam->flags = info.flags | kAgahnim_Draw_Flags0[j]; + bytewise_extended_oam[oam - oam_buf] = (j >= 0x40 && j < 0x44) ? 0 : 2; + } + if (g < 12) + SpriteDraw_Shadow_custom(k, &info, 18); + if (submodule_index) + Sprite_CorrectOamEntries(k, 3, 0xff); + + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + + if (sprite_D[k]) + Oam_AllocateFromRegionC(8); + else + Oam_AllocateFromRegionB(8); + oam = GetOamCurPtr(); + + if (!sprite_head_dir[k]) + return; + g = sprite_head_dir[k] - 1; + uint8 flags = (((frame_counter >> 1) & 2) + 2) + 0x31; + for (int i = 1; i >= 0; i--, oam++) { + oam->x = info.x + kAgahnim_Draw_X1[g * 2 + i]; + oam->y = info.y + kAgahnim_Draw_Y1[g * 2 + i]; + oam->charnum = kAgahnim_Draw_Char1[g]; + oam->flags = flags; + bytewise_extended_oam[oam - oam_buf] = kAgahnim_Draw_Ext1[g]; + } +} + +void Sprite_7B_AgahnimBalls(int k) { // 9eda42 + if (sprite_B[k]) { + if (sprite_delay_main[k]) + Sprite_ApplySpeedTowardsLink(k, 32); + sprite_oam_flags[k] = 5; + } else { + sprite_oam_flags[k] = (frame_counter >> 1 & 2) + 3; + } + + if (sprite_ai_state[k]) { + static const uint8 kEnergyBall_Gfx[16] = {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0}; + if (sprite_graphics[k] != 2) + SpriteDraw_SingleLarge(k); + else + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_ignore_projectile[k] = sprite_delay_main[k]; + if (!sprite_delay_main[k]) { + sprite_state[k] = 0; + } else if (sprite_delay_main[k] == 6) { + sprite_x_vel[k] = sprite_y_vel[k] = 64; + Sprite_MoveXY(k); + } + sprite_graphics[k] = kEnergyBall_Gfx[sprite_delay_main[k]]; + return; + } + if (sprite_B[k]) + SeekerEnergyBall_Draw(k); + else + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_subtype2[k]++; + Sprite_MoveXY(k); + if (Sprite_CheckTileCollision(k)) { + sprite_state[k] = 0; + if (sprite_B[k]) { + SpriteSfx_QueueSfx3WithPan(k, 0x36); + CreateSixBlueBalls(k); + return; + } + } + + if (sprite_A[k] && !sprite_ignore_projectile[0]) { + SpriteHitBox hb; + hb.r0_xlo = sprite_x_lo[k]; + hb.r8_xhi = sprite_x_hi[k]; + hb.r2 = hb.r3 = 15; + hb.r1_ylo = sprite_y_lo[k]; + hb.r9_yhi = sprite_y_hi[k]; + Sprite_SetupHitBox(0, &hb); + if (CheckIfHitBoxesOverlap(&hb)) { + AgahnimBalls_DamageAgahnim(0, 16, 0xa0); + sprite_state[k] = 0; + sprite_x_recoil[0] = sprite_x_vel[k]; + sprite_y_recoil[0] = sprite_y_vel[k]; + } + } else { + Sprite_CheckDamageToLink(k); + if (Sprite_CheckDamageFromLink(k) & kCheckDamageFromPlayer_Carry) { + if (sprite_B[k]) { + sprite_state[k] = 0; + SpriteSfx_QueueSfx3WithPan(k, 0x36); + CreateSixBlueBalls(k); + return; + } + SpriteSfx_QueueSfx2WithPan(k, 0x5); + SpriteSfx_QueueSfx3WithPan(k, 0x29); + Sprite_ApplySpeedTowardsLink(k, 0x30); + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_A[k]++; + } + } + if ((k ^ frame_counter) & 3 | sprite_B[k]) + return; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x7B, &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_delay_main[j] = 15; + sprite_ai_state[j] = 15; + sprite_B[j] = sprite_B[k]; +} + +void CreateSixBlueBalls(int k) { // 9edb96 + static const int8 kEnergyBall_SplitXVel[6] = {0, 24, 24, 0, -24, -24}; + static const int8 kEnergyBall_SplitYVel[6] = {-32, -16, 16, 32, 16, -16}; + SpriteSfx_QueueSfx3WithPan(k, 0x36); + tmp_counter = 5; + do { + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x55, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x + 4); + Sprite_SetY(j, info.r2_y + 4); + sprite_flags3[j] = sprite_flags3[j] & ~1 | 0x40; + sprite_oam_flags[j] = 4; + sprite_delay_aux1[j] = 4; + sprite_flags4[j] = 20; + sprite_C[j] = 20; + sprite_E[j] = 20; + sprite_x_vel[j] = kEnergyBall_SplitXVel[tmp_counter]; + sprite_y_vel[j] = kEnergyBall_SplitYVel[tmp_counter]; + } + } while (!sign8(--tmp_counter)); + tmp_counter = 0; +} + +void SeekerEnergyBall_Draw(int k) { // 9edc3e + static const DrawMultipleData kEnergyBall_Dmd[8] = { + { 4, -3, 0x00ce, 0}, + {11, 4, 0x00ce, 0}, + { 4, 11, 0x00ce, 0}, + {-3, 4, 0x00ce, 0}, + {-1, -1, 0x00ce, 0}, + { 9, -1, 0x00ce, 0}, + {-1, 9, 0x00ce, 0}, + { 9, 9, 0x00ce, 0}, + }; + Sprite_DrawMultiple(k, &kEnergyBall_Dmd[(sprite_subtype2[k] >> 2 & 1) * 4], 4, NULL); +} + +void Sprite_79_Bee(int k) { // 9edc5b + switch (sprite_ai_state[k]) { + case 0: + Bee_DormantHive(k); + break; + case 1: + Bee_Main(k); + break; + case 2: + Bee_PutInBottle(k); + break; + } +} + +void Bee_DormantHive(int k) { // 9edc68 + if (sprite_E[k]) + return; + sprite_state[k] = 0; + for (int i = 11; i >= 0; i--) + SpawnBeeFromHive(k); +} + +void SpawnBeeFromHive(int k) { // 9edc8f + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x79, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + InitializeSpawnedBee(j); + } +} + +void InitializeSpawnedBee(int k) { // 9edc9b + sprite_ai_state[k] = 1; + sprite_A[k] = sprite_delay_main[k] = kSpawnBee_InitDelay[k & 3]; + sprite_delay_aux4[k] = 96; + sprite_x_vel[k] = kSpawnBee_InitVel[GetRandomNumber() & 7]; + sprite_y_vel[k] = kSpawnBee_InitVel[GetRandomNumber() & 7]; +} + +int ReleaseBeeFromBottle() { // 9edccf + static const int8 kSpawnBee_XY[8] = {8, 2, -2, -8, 10, 5, -5, -10}; + + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(0, 0xb2, &info), i; + if (j >= 0) { + sprite_floor[j] = link_is_on_lower_level; + Sprite_SetX(j, link_x_coord + 8); + Sprite_SetY(j, link_y_coord + 16); + + uint8 t = (&link_item_bow)[hud_cur_item - 1]; + if (link_bottle_info[t - 1] == 8) + sprite_head_dir[j] = 1; + InitializeSpawnedBee(j); + sprite_x_vel[j] = kSpawnBee_XY[GetRandomNumber() & 7]; + sprite_y_vel[j] = kSpawnBee_XY[GetRandomNumber() & 7]; + sprite_delay_main[j] = 64; + sprite_A[j] = 64; + } + return j; +} + +void Bee_Main(int k) { // 9edd45 + Bee_HandleZ(k); + SpriteDraw_SingleSmall(k); + Bee_HandleInteractions(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_ReturnIfRecoiling(k)) + return; + if (sprite_head_dir[k]) + Sprite_SpawnSparkleGarnish(k); + Bee_Bzzt(k); + Sprite_MoveXY(k); + sprite_graphics[k] = (k ^ frame_counter) >> 1 & 1; + if (!sprite_delay_aux4[k]) { + Sprite_CheckDamageToLink(k); + if (Sprite_CheckDamageFromLink(k) & kCheckDamageFromPlayer_Ne) { + Sprite_ShowMessageUnconditional(0xc8); + sprite_ai_state[k] = 2; // put in bottle + return; + } + } + + if (!frame_counter && sprite_A[k] != 16) + sprite_A[k] -= 8; + + if (sprite_delay_main[k] == 0) { + uint16 x = link_x_coord + (GetRandomNumber() & 3) * 5; + uint16 y = link_y_coord + (GetRandomNumber() & 3) * 5; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 20); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | (sign8(pt.x) ? 0 : 0x40); + sprite_delay_main[k] = k + sprite_A[k]; + } +} + +int Sprite_Find_EmptyBottle() { // 9ede2e + for (int i = 0; i != 4; i++) + if (link_bottle_info[i] == 2) + return i; + return -1; +} + +void Bee_HandleInteractions(int k) { // 9ede44 + if (submodule_index == 2 && (dialogue_message_index == 0xc8 || dialogue_message_index == 0xca)) + sprite_delay_aux4[k] = 40; +} + +void Sprite_B2_PlayerBee(int k) { // 9ede63 + static const uint8 kGoodBee_Tab0[2] = {0xa, 0x14}; + + switch (sprite_ai_state[k]) { + case 0: // wait + if (!sprite_E[k]) { + sprite_state[k] = 0; + uint8 or_bottle = link_bottle_info[0] | link_bottle_info[1] | link_bottle_info[2] | link_bottle_info[3]; + if (!(or_bottle & 8)) + GoldBee_SpawnSelf(k); + } + break; + case 1: {// activated + sprite_ignore_projectile[k] = 1; + Bee_HandleZ(k); + SpriteDraw_SingleSmall(k); + Bee_HandleInteractions(k); + if (Sprite_ReturnIfInactive(k)) + return; + Bee_Bzzt(k); + Sprite_MoveXY(k); + sprite_graphics[k] = (k ^ frame_counter) >> 1 & 1; + if (sprite_head_dir[k]) + Sprite_SpawnSparkleGarnish(k); + if (sprite_B[k] >= kGoodBee_Tab0[sprite_head_dir[k]]) { + sprite_defl_bits[k] = 64; + return; + } + if (sprite_delay_aux4[k]) + return; + if (Sprite_CheckDamageFromLink(k) & kCheckDamageFromPlayer_Ne) { + Sprite_ShowMessageUnconditional(0xc8); + sprite_ai_state[k]++; + return; + } + if ((k ^ frame_counter) & 3) + return; + Point16U pt2; + if (!PlayerBee_FindTarget(k, &pt2)) { + pt2.x = link_x_coord + (GetRandomNumber() & 3) * 5; + pt2.x = link_y_coord + (GetRandomNumber() & 3) * 5; + } + if ((k ^ frame_counter) & 7) + return; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, pt2.x, pt2.y, 32); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x40 | (sign8(pt.x) ? 0 : 0x40); + break; + } + case 2: // bottle + Bee_PutInBottle(k); + break; + } +} + +void GoldBee_SpawnSelf(int k) { // 9ede90 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0x79, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ai_state[j] = 1; + sprite_delay_main[j] = 64; + sprite_A[j] = 64; + sprite_delay_aux4[j] = 96; + sprite_head_dir[j] = 1; + sprite_x_vel[j] = kSpawnBee_InitVel[GetRandomNumber() & 7]; + sprite_y_vel[j] = kSpawnBee_InitVel[GetRandomNumber() & 7]; + } +} + +void Bee_HandleZ(int k) { // 9edf8a + sprite_z[k] = 16; + if (sprite_head_dir[k]) + sprite_oam_flags[k] = (sprite_oam_flags[k] & 0xf1) | (((frame_counter >> 4 & 3) + 1) << 1); +} + +bool PlayerBee_FindTarget(int k, Point16U *pt) { // 9edfab + int n = 16; + int j = k * 4 & 0xf; + do { + if (j == k || sprite_state[j] < 9 || sprite_pause[j]) + continue; + if (!(sprite_flags2[k] & 0x80)) { + if (sprite_floor[k] != sprite_floor[j] || sprite_flags4[j] & 0x40 || sprite_ignore_projectile[j]) + continue; + } else { + if (!sprite_head_dir[j] || !(sprite_bump_damage[j] & 0x40)) + continue; + } + PlayerBee_HoneInOnTarget(j, k); + pt->x = Sprite_GetX(j) + (GetRandomNumber() & 3) * 5; + pt->y = Sprite_GetY(j) + (GetRandomNumber() & 3) * 5; + return true; + } while (j = (j - 1) & 0xf, --n); + return false; +} + +void Bee_Bzzt(int k) { // 9ee02e + if (!((k ^ frame_counter) & 31)) + SpriteSfx_QueueSfx3WithPan(k, 0x2c); +} + +void Sprite_B3_PedestalPlaque(int k) { // 9ee044 + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + if (!flag_is_link_immobilized && Sprite_CheckIfLinkIsBusy()) + return; + + link_position_mode &= ~0x20; + if (BYTE(overworld_screen_index) != 48) { + if (link_direction_facing || !Sprite_CheckDamageToLink_same_layer(k)) + return; + if (hud_cur_item != 15 || !(filtered_joypad_H & 0x40)) { + if (!(filtered_joypad_L & 0x80)) + return; + Sprite_ShowMessageUnconditional(0xb6); + } else { + player_handler_timer = 0; + link_position_mode = 32; + sound_effect_1 = 0; + Sprite_ShowMessageUnconditional(0xb7); + } + } else { + if (link_direction_facing || !Sprite_CheckDamageToLink_same_layer(k)) + return; + if (hud_cur_item != 15 || !(filtered_joypad_H & 0x40)) { + if (!(filtered_joypad_L & 0x80)) + return; + Sprite_ShowMessageUnconditional(0xbc); + } else { + player_handler_timer = 0; + link_position_mode = 32; + sound_effect_1 = 0; + button_b_frames = 1; + link_delay_timer_spin_attack = 0; + link_player_handler_state = kPlayerState_OpeningDesertPalace; + Sprite_ShowMessageUnconditional(0xbd); + } + } +} + +void Sprite_B4_PurpleChest(int k) { // 9ee0dd + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_ai_state[k]) { + if (Sprite_ShowMessageOnContact(k, 0x116) & 0x100 && savegame_tagalong == 0) + sprite_ai_state[k] = 1; + } else { + sprite_state[k] = 0; + savegame_tagalong = 12; + LoadFollowerGraphics(); + Sprite_BecomeFollower(k); + } +} + +void Sprite_B5_BombShop(int k) { // 9ee111 + switch (sprite_subtype2[k]) { + case 0: Sprite_BombShop_Clerk(k); break; + case 1: Sprite_BombShop_Bomb(k); break; + case 2: Sprite_BombShop_SuperBomb(k); break; + case 3: Sprite_BombShop_Huff(k); break; + } +} + +void Sprite_BombShop_Clerk(int k) { // 9ee134 + static const uint8 kBombShopGuy_Gfx[8] = {0, 1, 0, 1, 0, 1, 0, 1}; + static const uint8 kBombShopGuy_Delay[8] = {255, 32, 255, 24, 15, 24, 255, 15}; + + BombShopEntity_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_delay_main[k]) { + int j = sprite_E[k]; + sprite_E[k] = j + 1 & 7; + sprite_delay_main[k] = kBombShopGuy_Delay[j]; + sprite_graphics[k] = kBombShopGuy_Gfx[j]; + if (sprite_graphics[k] == 0) { + SpriteSfx_QueueSfx3WithPan(k, 0x11); + BombShop_ClerkExhalation(k); + } else { + SpriteSfx_QueueSfx3WithPan(k, 0x12); + } + } + bool flag = ((link_has_crystals & 5) == 5 && sram_progress_indicator_3 & 32); + Sprite_ShowSolicitedMessage(k, flag ? 0x118 : 0x117); + Sprite_BehaveAsBarrier(k); +} + +void Sprite_BombShop_Bomb(int k) { // 9ee190 + BombShopEntity_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (!ShopItem_CheckForAPress(k)) + return; + + if (link_item_bombs != kMaxBombsForLevel[link_bomb_upgrades]) { + if (!ShopItem_HandleCost(100)) { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } else { + link_bomb_filler = 27; + sprite_state[k] = 0; + Sprite_ShowMessageUnconditional(0x119); + ShopItem_HandleReceipt(k, 0x28); + } + } else { + Sprite_ShowMessageUnconditional(0x16e); + ShopItem_PlayBeep(k); + } + +} + +void Sprite_BombShop_SuperBomb(int k) { // 9ee1df + BombShopEntity_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (ShopItem_CheckForAPress(k)) { + if (!ShopItem_HandleCost(100)) { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } else { + savegame_tagalong = 13; + LoadFollowerGraphics(); + Sprite_BecomeFollower(k); + sprite_state[k] = 0; + Sprite_ShowMessageUnconditional(0x11a); + } + } +} + +void Sprite_BombShop_Huff(int k) { // 9ee21a + static const uint8 kSnoutPutt_Dmd[4] = {4, 0x44, 0xc4, 0x84}; + Oam_AllocateFromRegionC(4); + SpriteDraw_SingleSmall(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_oam_flags[k] &= 0x30; + sprite_oam_flags[k] |= kSnoutPutt_Dmd[frame_counter >> 2 & 3]; + sprite_z_vel[k]++; + Sprite_MoveZ(k); + if (!sprite_delay_main[k]) + sprite_state[k] = 0; + sprite_graphics[k] = sprite_delay_main[k] >> 3 & 3; +} + +void BombShop_ClerkExhalation(int k) { // 9ee256 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xb5, &info); + if (j >= 0) { + Sprite_SetX(j, info.r0_x + 4); + Sprite_SetY(j, info.r2_y + 16); + sprite_subtype2[j] = 3; + sprite_ignore_projectile[j] = 3; + sprite_z[j] = 4; + sprite_z_vel[j] = -12; + sprite_delay_main[j] = 23; + sprite_flags3[j] &= ~0x11; + } +} + +void BombShopEntity_Draw(int k) { // 9ee2c6 + static const DrawMultipleData kBombShopEntity_Dmd[6] = { + {0, 0, 0x0a48, 2}, + {0, 0, 0x0a4c, 2}, + {0, 0, 0x04c2, 2}, + {0, 0, 0x04c2, 2}, + {0, 0, 0x084e, 2}, + {0, 0, 0x084e, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kBombShopEntity_Dmd[sprite_subtype2[k] * 2 + sprite_graphics[k]], 1, &info); + SpriteDraw_Shadow(k, &info); + +} + +void Sprite_B6_Kiki(int k) { // 9ee2ef + switch(sprite_subtype2[k]) { + case 0: Kiki_LyingInwait(k); break; + case 1: Kiki_OfferEntranceService(k); break; + case 2: Kiki_OfferInitialService(k); break; + case 3: Kiki_Flee(k); break; + } +} + +void Kiki_Flee(int k) { // 9ee2fe + bool flag = Kiki_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!sprite_z[k] && + (uint16)(cur_sprite_x - 0xc98) < 0xd0 && + (uint16)(cur_sprite_y - 0x6a5) < 0xd0) + flag = true; + + if (flag) + sprite_state[k] = 0; + sprite_z_vel[k]-=2; + Sprite_MoveXYZ(k); + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = GetRandomNumber() & 15 | 16; + } + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, 0xcf5, 0x6fe, 16); + sprite_x_vel[k] = pt.x << 1; + sprite_y_vel[k] = pt.y << 1; + tagalong_event_flags &= ~3; + if (sign8(pt.x)) pt.x = -pt.x; + if (sign8(pt.y)) pt.y = -pt.y; + sprite_D[k] = (pt.x >= pt.y) ? (sprite_x_vel[k] >> 7) ^ 3 : (sprite_y_vel[k] >> 7) ^ 1; + sprite_graphics[k] = frame_counter >> 3 & 1; +} + +void Kiki_OfferInitialService(int k) { // 9ee3af + if (!sign8(sprite_ai_state[k] - 2)) + Kiki_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXYZ(k); + sprite_z_vel[k]--; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 0; + sprite_z[k] = 0; + } + sprite_graphics[k] = frame_counter >> 3 & 1; + switch(sprite_ai_state[k]) { + case 0: + Sprite_ShowMessageUnconditional(0x11e); + sprite_ai_state[k]++; + break; + case 1: + if (!choice_in_multiselect_box && ShopItem_HandleCost(10)) { + Sprite_ShowMessageUnconditional(0x11f); + tagalong_event_flags |= 3; + sprite_state[k] = 0; + } else { + Sprite_ShowMessageUnconditional(0x120); + tagalong_event_flags &= ~3; + savegame_tagalong = 0; + sprite_ai_state[k]++; + flag_is_link_immobilized++; + } + break; + case 2: { + sprite_ai_state[k]++; + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, 0xc45, 0x6fe, 9); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + sprite_D[k] = (pt.x >> 7) ^ 3; + sprite_delay_main[k] = 32; + break; + } + case 3: + if (!sprite_delay_main[k]) { + sprite_ai_state[k]++; + sprite_z_vel[k] = 16; + sprite_delay_main[k] = 16; + } + break; + case 4: + if (!sprite_delay_main[k] && !sprite_z[k]) { + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + } + break; + } +} + +void Kiki_OfferEntranceService(int k) { // 9ee4c9 + int j, t; + Kiki_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_MoveXYZ(k); + sprite_z_vel[k]--; + if (sign8(sprite_z[k])) { + sprite_z_vel[k] = 0; + sprite_z[k] = 0; + } + switch(sprite_ai_state[k]) { + case 0: // + Sprite_ShowMessageUnconditional(0x11b); + sprite_ai_state[k]++; + break; + case 1: // + if (choice_in_multiselect_box || !ShopItem_HandleCost(100)) { + Sprite_ShowMessageUnconditional(0x11c); + sprite_subtype2[k] = 3; + } else { + Sprite_ShowMessageUnconditional(0x11d); + flag_is_link_immobilized++; + sprite_ai_state[k]++; + sprite_D[k] = 0; + } + break; + case 2: // + case 4: // + case 6: { // + static const uint16 kKiki_Leave_X[3] = {0xf4f, 0xf70, 0xf5d}; + static const uint16 kKiki_Leave_Y[3] = { 0x661, 0x64c, 0x624 }; + + sprite_graphics[k] = frame_counter >> 3 & 1; + j = (sprite_ai_state[k] >> 1) - 1; + if ((uint8)(kKiki_Leave_X[j] - sprite_x_lo[k] + 2) < 4 && + (uint8)(kKiki_Leave_Y[j] - sprite_y_lo[k] + 2) < 4) { + sprite_ai_state[k]++; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + sprite_delay_aux1[k] = 32; + SpriteSfx_QueueSfx2WithPan(k, 0x21); + return; + } + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, kKiki_Leave_X[j], kKiki_Leave_Y[j], 9); + sprite_x_vel[k] = pt.x; + sprite_y_vel[k] = pt.y; + break; + } + case 3: // + case 5: // + if (!sprite_delay_aux1[k]) { + static const uint8 kKiki_Zvel[2] = {32, 28}; + sprite_z_vel[k] = kKiki_Zvel[sprite_ai_state[k]++ >> 1 & 1]; + SpriteSfx_QueueSfx2WithPan(k, 0x20); + sprite_D[k] = sprite_ai_state[k] >> 1 & 1 | 4; + } else { + sprite_D[k] = sprite_ai_state[k] >> 1 & 1 | 6; + sprite_graphics[k] = frame_counter >> 3 & 1; + } + break; + case 7: { // + static const uint8 kKiki_Tab7[3] = {2, 1, 0xff}; + static const uint8 kKiki_Delay7[2] = {82, 0}; + static const int8 kKiki_Xvel7[4] = {0, 0, -9, 9}; + static const int8 kKiki_Yvel7[4] = {-9, 9, 0, 0}; + sprite_graphics[k] = frame_counter >> 3 & 1; + if (sprite_z[k] || sprite_delay_main[k]) + return; + j = sprite_A[k]++; + t = kKiki_Tab7[j]; + if (!sign8(t)) { + sprite_D[k] = t; + sprite_delay_main[k] = kKiki_Delay7[j]; + sprite_x_vel[k] = kKiki_Xvel7[t]; + sprite_y_vel[k] = kKiki_Yvel7[t]; + } else { + sprite_ai_state[k]++; + sprite_x_vel[k] = sprite_y_vel[k] = 0; + trigger_special_entrance = 1; + subsubmodule_index = 0; + overworld_entrance_sequence_counter = 0; + sprite_D[k] = 0; + flag_is_link_immobilized = 0; + } + break; + } + case 8: // + sprite_D[k] = 8; + sprite_graphics[k] = 0; + sprite_z_vel[k] = (GetRandomNumber() & 15) + 16; + sprite_ai_state[k]++; + break; + case 9: // + if (sign8(sprite_z_vel[k]) && !sprite_z[k]) { + sprite_ai_state[k]++; + SpriteSfx_QueueSfx3WithPan(k, 0x25); + } + break; + case 10: // + break; + } +} + +bool Kiki_Draw(int k) { // 9ee859 + static const DrawMultipleData kKiki_Dmd1[32] = { + { 0, -6, 0x0020, 2}, + { 0, 0, 0x0022, 2}, + { 0, -6, 0x0020, 2}, + { 0, 0, 0x4022, 2}, + { 0, -6, 0x0020, 2}, + { 0, 0, 0x0022, 2}, + { 0, -6, 0x0020, 2}, + { 0, 0, 0x4022, 2}, + {-1, -6, 0x0020, 2}, + { 0, 0, 0x0022, 2}, + {-1, -6, 0x0020, 2}, + { 0, 0, 0x0022, 2}, + { 1, -6, 0x4020, 2}, + { 0, 0, 0x4022, 2}, + { 1, -6, 0x4020, 2}, + { 0, 0, 0x4022, 2}, + { 0, -6, 0x01ce, 2}, + { 0, 0, 0x01ee, 2}, + { 0, -6, 0x01ce, 2}, + { 0, 0, 0x01ee, 2}, + { 0, -6, 0x41ce, 2}, + { 0, 0, 0x41ee, 2}, + { 0, -6, 0x41ce, 2}, + { 0, 0, 0x41ee, 2}, + {-1, -6, 0x01ce, 2}, + { 0, 0, 0x01ec, 2}, + {-1, -6, 0x41ce, 2}, + { 0, 0, 0x01ec, 2}, + { 1, -6, 0x41ce, 2}, + { 0, 0, 0x41ec, 2}, + { 1, -6, 0x01ce, 2}, + { 0, 0, 0x41ec, 2}, + }; + static const DrawMultipleData kKiki_Dmd2[12] = { + {0, -6, 0x01ca, 0}, + {8, -6, 0x41ca, 0}, + {0, 2, 0x01da, 0}, + {8, 2, 0x41da, 0}, + {0, 10, 0x01cb, 0}, + {8, 10, 0x41cb, 0}, + {0, -6, 0x01db, 0}, + {8, -6, 0x41db, 0}, + {0, 2, 0x01cc, 0}, + {8, 2, 0x41cc, 0}, + {0, 10, 0x01dc, 0}, + {8, 10, 0x41dd, 0}, + }; + static const uint8 kKikiDma[32] = { + 0x20, 0xc0, 0x20, 0xc0, 0, 0xa0, 0, 0xa0, 0x40, 0x80, 0x40, 0x60, 0x40, 0x80, 0x40, 0x60, + 0, 0, 0xfa, 0xff, 0x20, 0, 0, 2, 0, 0, 0, 0, 0x22, 0, 0, 2 // zelda bug: OOB read + }; + PrepOamCoordsRet info; + if (sprite_D[k] < 8) { + int j = sprite_D[k] * 2 + sprite_graphics[k]; + BYTE(dma_var6) = kKikiDma[j * 2 + 0]; + BYTE(dma_var7) = kKikiDma[j * 2 + 1]; + Sprite_DrawMultiple(k, &kKiki_Dmd1[j * 2], 2, &info); + if (!sprite_pause[k]) + SpriteDraw_Shadow(k, &info); + } else { + Sprite_DrawMultiple(k, &kKiki_Dmd2[sprite_graphics[k] * 6], 6, &info); + if (!sprite_pause[k]) + SpriteDraw_Shadow(k, &info); + } + + return ((info.x | info.y) & 0xff00) != 0; +} + +void Sprite_B7_BlindMaiden(int k) { // 9ee8b6 + CrystalMaiden_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + if (!sprite_ai_state[k]) { + if (Sprite_ShowMessageOnContact(k, 0x122) & 0x100) + sprite_ai_state[k] = 1; + } else { + sprite_state[k] = 0; + savegame_tagalong = 6; + LoadFollowerGraphics(); + Sprite_BecomeFollower(k); + } +} + +void OldMan_RevertToSprite(int k) { // 9ee938 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xAD, &info); + sprite_D[j] = sprite_head_dir[j] = tagalong_layerbits[k] & 3; + Sprite_SetY(j, (tagalong_y_lo[k] | tagalong_y_hi[k] << 8) + 2); + Sprite_SetX(j, (tagalong_x_lo[k] | tagalong_x_hi[k] << 8) + 2); + sprite_floor[j] = link_is_on_lower_level; + sprite_ignore_projectile[j] = 1; + sprite_subtype2[j] = 1; + OldMan_EnableCutscene(); + savegame_tagalong = 0; + link_speed_setting = 0; +} + +void OldMan_EnableCutscene() { // 9ee989 + flag_is_link_immobilized = 1; + link_disable_sprite_damage = 1; +} + +void Sprite_AD_OldMan(int k) { // 9ee992 + int j; + OldMountainMan_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_subtype2[k]) { + case 0: // lost + switch (sprite_ai_state[k]) { + case 0: // supplicate + Sprite_TrackBodyToHead(k); + sprite_head_dir[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + j = Sprite_ShowMessageOnContact(k, 0x9c); + if (j & 0x100) { + sprite_D[k] = sprite_head_dir[k] = j; + sprite_ai_state[k] = 1; + } + break; + case 1: // switch to tagalong + savegame_tagalong = 4; + Sprite_BecomeFollower(k); + which_starting_point = 5; + sprite_state[k] = 0; + CacheCameraProperties(); + break; + } + break; + case 1: // entering domicile + Sprite_MoveXY(k); + switch(sprite_ai_state[k]) { + case 0: // grant mirror + sprite_ai_state[k]++; + item_receipt_method = 0; + Link_ReceiveItem(0x1a, 0); + which_starting_point = 1; + OldMan_EnableCutscene(); + sprite_delay_main[k] = 48; + sprite_x_vel[k] = 8; + sprite_y_vel[k] = 4; + sprite_D[k] = sprite_head_dir[k] = 3; + break; + case 1: // shuffle away + OldMan_EnableCutscene(); + if (!sprite_delay_main[k]) + sprite_ai_state[k]++; + sprite_graphics[k] = (k ^ frame_counter) >> 3 & 1; + break; + case 2: { // approach door + sprite_head_dir[k] = 0; + sprite_D[k] = 0; + j = byte_7E0FDE; + int x = overlord_x_lo[j] | overlord_x_hi[j] << 8; + int y = overlord_y_lo[j] | overlord_y_hi[j] << 8; + if (y >= Sprite_GetY(k)) { + sprite_ai_state[k]++; + sprite_y_vel[k] = sprite_x_vel[k] = 0; + } else { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 8); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + sprite_graphics[k] = (k ^ frame_counter) >> 3 & 1; + OldMan_EnableCutscene(); + } + break; + } + case 3: // made it inside + sprite_state[k] = 0; + flag_is_link_immobilized = 0; + link_disable_sprite_damage = 0; + break; + } + break; + case 2: // sitting at home + static const uint16 kOldMountainManMsgs[3] = {0x9e, 0x9f, 0xa0}; + Sprite_BehaveAsBarrier(k); + if (sprite_ai_state[k]) { + link_hearts_filler = 160; + sprite_ai_state[k] = 0; + } + j = sram_progress_indicator >= 3 ? 2 : link_item_moon_pearl; + if (Sprite_ShowSolicitedMessage(k, kOldMountainManMsgs[j]) & 0x100) + sprite_ai_state[k]++; + + break; + } +} + +void Sprite_B8_DialogueTester(int k) { // 9eeae7 + assert(0); +} + +void Sprite_B9_BullyAndPinkBall(int k) { // 9eeb33 + switch(sprite_subtype2[k]) { + case 0: Sprite_PinkBall(k); return; + case 1: PinkBall_Distress(k); return; + case 2: Sprite_Bully(k); return; + } +} + +void Sprite_PinkBall(int k) { // 9eeb40 + Oam_AllocateDeferToPlayer(k); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + PinkBall_HandleMessage(k); + sprite_oam_flags[k] = sprite_oam_flags[k] & ~0x80 | sprite_head_dir[k]; + Sprite_MoveXYZ(k); + int t = Sprite_CheckTileCollision(k); + if (t) { + if (!(t & 3)) { + sprite_y_vel[k] = -sprite_y_vel[k]; + if (sprite_E[k]) + goto play_sound; + } + sprite_x_vel[k] = -sprite_x_vel[k]; + if (sprite_E[k]) { +play_sound: + BallGuy_PlayBounceNoise(k); + } + } + + sprite_z_vel[k]--; + if (sign8(sprite_z[k])) { + sprite_z[k] = 0; + sprite_z_vel[k] = (uint8)-sprite_z_vel[k] >> 2; + if (sprite_z_vel[k] & 0xfc) + BallGuy_PlayBounceNoise(k); + PinkBall_HandleDeceleration(k); + } + if (!sprite_E[k]) { + if (!sprite_head_dir[k]) { + PinkBall_Distress(k); + sprite_graphics[k] = (k ^ frame_counter) >> 3 & 1; + if (!((k ^ frame_counter) & 0x3f)) { + uint16 x = (link_x_coord & 0xff00) | GetRandomNumber(); + uint16 y = (link_y_coord & 0xff00) | GetRandomNumber(); + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 8); + sprite_B[k] = pt.x; + sprite_A[k] = pt.y; + if (pt.y) { + sprite_oam_flags[k] |= 64; + sprite_oam_flags[k] ^= sprite_x_vel[k] >> 1 & 64; + } + } + sprite_x_vel[k] = sprite_B[k]; + sprite_y_vel[k] = sprite_A[k]; + } else { + PinkBall_Distress(k); + if (k ^ frame_counter) { + sprite_graphics[k] = (k ^ frame_counter) >> 2 & 1; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + } else { + sprite_head_dir[k] = 0; + } + } + } else { + if ((sprite_x_vel[k] | sprite_y_vel[k]) == 0) { + sprite_E[k] = 0; + } else { + sprite_graphics[k] = (k ^ frame_counter) >> 2 & 1; + sprite_head_dir[k] = (k ^ frame_counter) << 2 & 128; + } + } +} + +void PinkBall_HandleDeceleration(int k) { // 9eec4d + if (sprite_x_vel[k]) + sprite_x_vel[k] += sign8(sprite_x_vel[k]) ? 2 : -2; + if (sprite_y_vel[k]) + sprite_y_vel[k] += sign8(sprite_y_vel[k]) ? 2 : -2; +} + +void PinkBall_Distress(int k) { // 9eec74 + PrepOamCoordsRet info; + if (Sprite_PrepOamCoordOrDoubleRet(k, &info)) + return; + Sprite_DrawDistress_custom(info.x, info.y, frame_counter); +} + +void Sprite_Bully(int k) { // 9eec7c + Bully_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Bully_HandleMessage(k); + Sprite_MoveXYZ(k); + int t = Sprite_CheckTileCollision(k), j; + if (t) { + if (!(t & 3)) + sprite_y_vel[k] = -sprite_y_vel[k]; + else + sprite_x_vel[k] = -sprite_x_vel[k]; + } + switch(sprite_ai_state[k]) { + case 0: { // chase + sprite_graphics[k] = (k ^ frame_counter) >> 3 & 1; + int j = sprite_head_dir[k]; + if (!((k ^ frame_counter) & 0x1f)) { + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, Sprite_GetX(j), Sprite_GetY(j), 14); + sprite_y_vel[k] = pt.y; + sprite_x_vel[k] = pt.x; + if (pt.x) + sprite_D[k] = sprite_x_vel[k] >> 7; + } + if (!sprite_z[j]) { + if ((uint8)(sprite_x_lo[k] - sprite_x_lo[j] + 8) < 16 && + (uint8)(sprite_y_lo[k] - sprite_y_lo[j] + 8) < 16) { + sprite_ai_state[k]++; + BallGuy_PlayBounceNoise(k); + } + } + break; + } + case 1: { // kick ball + sprite_ai_state[k] = 2; + int j = sprite_head_dir[k]; + sprite_x_vel[j] = sprite_x_vel[k] << 1; + sprite_y_vel[j] = sprite_y_vel[k] << 1; + sprite_x_vel[k] = 0; + sprite_y_vel[k] = 0; + sprite_z_vel[j] = GetRandomNumber() & 31; + sprite_delay_main[k] = 96; + sprite_graphics[k] = 1; + sprite_E[j] = 1; + break; + } + case 2: // waiting + if (!sprite_delay_main[k]) + sprite_ai_state[k] = 0; + break; + } +} + +void Bully_Draw(int k) { // 9eed9e + static const DrawMultipleData kBully_Dmd[8] = { + {0, -7, 0x46e0, 2}, + {0, 0, 0x46e2, 2}, + {0, -7, 0x46e0, 2}, + {0, 0, 0x46c4, 2}, + {0, -7, 0x06e0, 2}, + {0, 0, 0x06e2, 2}, + {0, -7, 0x06e0, 2}, + {0, 0, 0x06c4, 2}, + }; + PrepOamCoordsRet info; + Sprite_DrawMultiplePlayerDeferred(k, &kBully_Dmd[sprite_D[k] * 4 + sprite_graphics[k] * 2], 2, &info); + SpriteDraw_Shadow(k, &info); + +} + +void BallGuy_PlayBounceNoise(int k) { // 9eedc2 + SpriteSfx_QueueSfx3WithPan(k, 0x32); +} + +void SpawnBully(int k) { // 9eedc9 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xB9, &info); + if (j >= 0) { + Sprite_SetSpawnedCoordinates(j, &info); + sprite_subtype2[j] = 2; + sprite_head_dir[j] = k; + sprite_ignore_projectile[j] = 1; + } +} + +void PinkBall_HandleMessage(int k) { // 9eede8 + if (sprite_delay_aux4[k]) + return; + int msg = link_item_moon_pearl & 1 ? 0x15c : 0x15b; + if (Sprite_ShowMessageOnContact(k, msg) & 0x100) { + sprite_x_vel[k] ^= 255; + sprite_y_vel[k] ^= 255; + if (sprite_E[k]) + BallGuy_PlayBounceNoise(k); + sprite_delay_aux4[k] = 64; + } +} + +void Bully_HandleMessage(int k) { // 9eee25 + if (sprite_delay_aux4[k]) + return; + int msg = link_item_moon_pearl & 1 ? 0x15e : 0x15d; + if (Sprite_ShowMessageOnContact(k, msg) & 0x100) { + sprite_x_vel[k] ^= 255; + sprite_y_vel[k] ^= 255; + sprite_delay_aux4[k] = 64; + } +} + +void Sprite_BA_Whirlpool(int k) { // 9eee5a + static const uint8 kWhirlpool_OamFlags[4] = {0, 0x40, 0xc0, 0x80}; + + if (BYTE(overworld_screen_index) == 0x1b) { + PrepOamCoordsRet info; + Sprite_PrepOamCoord(k, &info); + if (Sprite_ReturnIfInactive(k)) + return; + uint16 x = cur_sprite_x - link_x_coord + 0x40; + uint16 y = cur_sprite_y - link_y_coord + 0xf; + if (x < 0x51 && y < 0x12) { + submodule_index = 35; + link_triggered_by_whirlpool_sprite = 1; + subsubmodule_index = 0; + link_actual_vel_y = 0; + link_actual_vel_x = 0; + link_player_handler_state = 20; + last_light_vs_dark_world = overworld_screen_index & 0x40; + } + } else { + sprite_oam_flags[k] = (sprite_oam_flags[k] & 0x3f) | kWhirlpool_OamFlags[frame_counter >> 3 & 3]; + Oam_AllocateFromRegionB(4); + cur_sprite_x -= 5; + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (Sprite_CheckDamageToLink_same_layer(k)) { + if (sprite_A[k] == 0) { + submodule_index = 46; + subsubmodule_index = 0; + } + } else { + sprite_A[k] = 0; + } + } +} + +void Sprite_BB_Shopkeeper(int k) { // 9eeeef + switch (sprite_subtype2[k]) { + case 0: Shopkeeper_StandardClerk(k); break; + case 1: ChestGameGuy(k); break; + case 2: NiceThiefWithGift(k); break; + case 3: MiniChestGameGuy(k); break; + case 4: LostWoodsChestGameGuy(k); break; + case 5: + case 6: NiceThiefUnderRock(k); break; + case 7: ShopItem_RedPotion150(k); break; + case 8: ShopItem_FighterShield(k); break; + case 9: ShopItem_FireShield(k); break; + case 10: ShopItem_Heart(k); break; + case 11: ShopItem_Arrows(k); break; + case 12: ShopItem_Bombs(k); break; + case 13: ShopItem_Bee(k); break; + } +} + +void Shopkeeper_StandardClerk(int k) { // 9eef12 + if (is_in_dark_world) { + Oam_AllocateDeferToPlayer(k); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_oam_flags[k] = (sprite_oam_flags[k] & 63) | (frame_counter << 3 & 64); + } else { + sprite_oam_flags[k] = 7; + Shopkeeper_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + sprite_graphics[k] = frame_counter >> 4 & 1; + } + Sprite_BehaveAsBarrier(k); + int msg = is_in_dark_world == 0 ? 0x165 : 0x15f; + Sprite_ShowSolicitedMessage(k, msg); + if (sprite_ai_state[k] == 0 && (uint16)(cur_sprite_y + 0x60) >= link_y_coord) { + Sprite_ShowMessageUnconditional(msg); + sprite_ai_state[k] = 1; + } +} + +void ChestGameGuy(int k) { // 9eef90 + Oam_AllocateDeferToPlayer(k); + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + sprite_oam_flags[k] = (sprite_oam_flags[k] & 63) | (frame_counter << 3 & 64); + switch (sprite_ai_state[k]) { + case 0: + if ((uint8)(minigame_credits - 1) >= 2 && Sprite_ShowSolicitedMessage(k, 0x160) & 0x100) + sprite_ai_state[k] = 1; + break; + case 1: + if (choice_in_multiselect_box == 0 && ShopItem_HandleCost(30)) { + minigame_credits = 2; + Sprite_ShowMessageUnconditional(0x164); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x161); + sprite_ai_state[k] = 0; + } + break; + case 2: + if (minigame_credits == 0) + Sprite_ShowSolicitedMessage(k, 0x163); + else + Sprite_ShowSolicitedMessage(k, 0x17f); + break; + } +} + +void NiceThief_Animate(int k) { // 9ef017 + if (!(frame_counter & 3)) { + sprite_graphics[k] = 2; + uint8 dir = Sprite_DirectionToFaceLink(k, NULL); + sprite_head_dir[k] = (dir == 3) ? 2 : dir; + } + Oam_AllocateDeferToPlayer(k); + Thief_Draw(k); +} + +void NiceThiefWithGift(int k) { // 9ef038 + NiceThief_Animate(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + switch (sprite_ai_state[k]) { + case 0: + if (Sprite_ShowSolicitedMessage(k, 0x176) & 0x100) + sprite_ai_state[k] = 1; + break; + case 1: + if (!(dung_savegame_state_bits & 0x4000)) { + dung_savegame_state_bits |= 0x4000; + sprite_ai_state[k] = 2; + ShopItem_HandleReceipt(k, 0x46); + } else { + sprite_ai_state[k] = 0; + } + break; + case 2: + sprite_ai_state[k] = 0; + break; + } +} + +void MiniChestGameGuy(int k) { // 9ef078 + sprite_D[k] = Sprite_DirectionToFaceLink(k, NULL) ^ 3; + sprite_graphics[k] = 0; + MazeGameGuy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + switch (sprite_ai_state[k]) { + case 0: + if ((uint8)(minigame_credits - 1) >= 2 && Sprite_ShowSolicitedMessage(k, 0x17e) & 0x100) + sprite_ai_state[k] = 1; + break; + case 1: + if (choice_in_multiselect_box == 0 && ShopItem_HandleCost(20)) { + minigame_credits = 1; + Sprite_ShowMessageUnconditional(0x17f); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x180); + sprite_ai_state[k] = 0; + } + break; + case 2: + Sprite_ShowSolicitedMessage(k, (minigame_credits == 0) ? 0x163 : 0x17f); + break; + } + +} + +void LostWoodsChestGameGuy(int k) { // 9ef0f3 + NiceThief_Animate(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + switch (sprite_ai_state[k]) { + case 0: + if ((uint8)(minigame_credits - 1) >= 2 && Sprite_ShowSolicitedMessage(k, 0x181) & 0x100) + sprite_ai_state[k] = 1; + break; + case 1: + if (choice_in_multiselect_box == 0 && ShopItem_HandleCost(100)) { + minigame_credits = 1; + Sprite_ShowMessageUnconditional(0x17f); + sprite_ai_state[k] = 2; + } else { + Sprite_ShowMessageUnconditional(0x180); + sprite_ai_state[k] = 0; + } + break; + case 2: + Sprite_ShowSolicitedMessage(k, (minigame_credits == 0) ? 0x163 : 0x17f); + break; + } +} + +void NiceThiefUnderRock(int k) { // 9ef14f + NiceThief_Animate(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + Sprite_ShowSolicitedMessage(k, sprite_subtype2[k] == 5 ? 0x177 : 0x178); +} + +void ShopItem_RedPotion150(int k) { // 9ef16e + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (ShopItem_CheckForAPress(k)) { + if (Sprite_Find_EmptyBottle() < 0) { + Sprite_ShowMessageUnconditional(0x16d); + ShopItem_PlayBeep(k); + } else if (ShopItem_HandleCost(150)) { + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 0x2e); + } else { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } + } +} + +void ShopKeeper_SpawnShopItem(int k, int pos, int what) { // 9ef1b3 + static const int8 kShopKeeper_ItemX[3] = {-44, 8, 60}; + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamicallyEx(k, 0xbb, &info, 12); + assert(j >= 0); + sprite_ignore_projectile[j] = sprite_subtype2[j] = what; + Sprite_SetX(j, info.r0_x + kShopKeeper_ItemX[pos]); + Sprite_SetY(j, info.r2_y + 0x27); + sprite_flags2[j] |= 4; +} + +void ShopItem_FighterShield(int k) { // 9ef1f2 + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + ShopItem_MakeShieldsDeflect(k); + if (ShopItem_CheckForAPress(k)) { + if (link_shield_type) { + Sprite_ShowMessageUnconditional(0x166); + ShopItem_PlayBeep(k); + return; + } + if (!ShopItem_HandleCost(50)) { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + return; + } + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 4); + } + sprite_flags4[k] = 0x1c; +} + +void ShopItem_FireShield(int k) { // 9ef230 + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + ShopItem_MakeShieldsDeflect(k); + if (ShopItem_CheckForAPress(k)) { + if (link_shield_type >= 2) { + Sprite_ShowMessageUnconditional(0x166); + ShopItem_PlayBeep(k); + return; + } + if (!ShopItem_HandleCost(500)) { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + return; + } + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 5); + } + sprite_flags4[k] = 0x1c; +} + +void ShopItem_MakeShieldsDeflect(int k) { // 9ef261 + sprite_ignore_projectile[k] = 0; + sprite_flags[k] = 8; + sprite_defl_bits[k] = 4; + sprite_flags4[k] = 0x1c; + Sprite_CheckDamageFromLink(k); + sprite_flags4[k] = 0xa; +} + +void ShopItem_Heart(int k) { // 9ef27d + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (ShopItem_CheckForAPress(k)) { + if (link_health_current == link_health_capacity) { + ShopItem_PlayBeep(k); + } else if (ShopItem_HandleCost(10)) { + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 0x42); + } else { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } + } +} + +void ShopItem_Arrows(int k) { // 9ef2af + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (ShopItem_CheckForAPress(k)) { + if (link_num_arrows == kMaxArrowsForLevel[link_arrow_upgrades]) { + Sprite_ShowSolicitedMessage(k, 0x16e); + ShopItem_PlayBeep(k); + } else if (ShopItem_HandleCost(30)) { + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 0x44); + } else { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } + } +} + +void ShopItem_Bombs(int k) { // 9ef2f0 + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (ShopItem_CheckForAPress(k)) { + if (link_item_bombs == kMaxBombsForLevel[link_bomb_upgrades]) { + Sprite_ShowSolicitedMessage(k, 0x16e); + ShopItem_PlayBeep(k); + } else if (ShopItem_HandleCost(50)) { + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 0x31); + } else { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } + } +} + +void ShopItem_Bee(int k) { // 9ef322 + SpriteDraw_ShopItem(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (ShopItem_CheckForAPress(k)) { + if (Sprite_Find_EmptyBottle() < 0) { + Sprite_ShowSolicitedMessage(k, 0x16d); + ShopItem_PlayBeep(k); + } else if (ShopItem_HandleCost(10)) { + sprite_state[k] = 0; + ShopItem_HandleReceipt(k, 0xe); + } else { + Sprite_ShowMessageUnconditional(0x17c); + ShopItem_PlayBeep(k); + } + } +} + +void ShopItem_HandleReceipt(int k, uint8 item) { // 9ef366 + static const uint16 kShopKeeper_GiveItemMsgs[7] = {0x168, 0x167, 0x167, 0x16c, 0x169, 0x16a, 0x16b}; + item_receipt_method = 0; + Link_ReceiveItem(item, 0); + int j = sprite_subtype2[k]; + if (j >= 7) { + Sprite_ShowMessageUnconditional(kShopKeeper_GiveItemMsgs[j - 7]); + ShopKeeper_RapidTerminateReceiveItem(); + } +} + +void ShopItem_PlayBeep(int k) { // 9ef38a + SpriteSfx_QueueSfx2WithPan(k, 0x3c); +} + +bool ShopItem_CheckForAPress(int k) { // 9ef391 + if (!(filtered_joypad_L & 0x80)) + return false; + return Sprite_CheckDamageToLink_same_layer(k); +} + +bool ShopItem_HandleCost(int amt) { // 9ef39e + if (amt > link_rupees_goal) + return false; + link_rupees_goal -= amt; + return true; +} + +void SpriteDraw_ShopItem(int k) { // 9ef4ce + static const DrawMultipleData kShopKeeper_ItemWithPrice_Dmd[35] = { + {-4, 16, 0x0231, 0}, + { 4, 16, 0x0213, 0}, + {12, 16, 0x0230, 0}, + { 0, 0, 0x02c0, 2}, + { 0, 11, 0x036c, 2}, + { 0, 16, 0x0213, 0}, + { 0, 16, 0x0213, 0}, + { 8, 16, 0x0230, 0}, + { 0, 0, 0x04ce, 2}, + { 4, 12, 0x0338, 0}, + {-4, 16, 0x0213, 0}, + { 4, 16, 0x0230, 0}, + {12, 16, 0x0230, 0}, + { 0, 0, 0x08cc, 2}, + { 4, 12, 0x0338, 0}, + { 0, 16, 0x0231, 0}, + { 0, 16, 0x0231, 0}, + { 8, 16, 0x0230, 0}, + { 4, 8, 0x0329, 0}, + { 4, 11, 0x0338, 0}, + {-4, 16, 0x0203, 0}, + {-4, 16, 0x0203, 0}, + { 4, 16, 0x0230, 0}, + { 0, 0, 0x04c4, 2}, + { 0, 11, 0x0338, 0}, + { 0, 16, 0x0213, 0}, + { 0, 16, 0x0213, 0}, + { 8, 16, 0x0230, 0}, + { 0, 0, 0x04e8, 2}, + { 0, 11, 0x036c, 2}, + { 0, 16, 0x0231, 0}, + { 0, 16, 0x0231, 0}, + { 8, 16, 0x0230, 0}, + { 4, 8, 0x0ff4, 0}, + { 4, 11, 0x0338, 0}, + }; + Sprite_DrawMultiplePlayerDeferred(k, &kShopKeeper_ItemWithPrice_Dmd[(sprite_subtype2[k] - 7) * 5], 5, NULL); +} + +void Sprite_AC_Apple(int k) { // 9ef515 + if (sprite_ai_state[k]) { + Sprite_Apple(k); + return; + } + if (sprite_E[k] == 0) { + sprite_state[k] = 0; + int n = (GetRandomNumber() & 3) + 2; + do { + SpawnApple(k); + } while (--n >= 0); + } +} + +void SpawnApple(int k) { // 9ef535 + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xac, &info); + if (j < 0) + return; + Sprite_SetSpawnedCoordinates(j, &info); + sprite_ai_state[j] = 1; + sprite_A[j] = 255; + sprite_z[j] = 8; + sprite_z_vel[j] = 22; + uint16 x = info.r0_x & ~0xff | GetRandomNumber(); + uint16 y = info.r2_y & ~0xff | GetRandomNumber(); + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 10); + sprite_x_vel[j] = pt.x; + sprite_y_vel[j] = pt.y; +} + +void Sprite_Apple(int k) { // 9ef57c + if (sprite_A[k] >= 16 || frame_counter & 2) + SpriteDraw_SingleLarge(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (sprite_A[k] == 0) { + sprite_state[k] = 0; + return; + } + Sprite_MoveXYZ(k); + if (Sprite_CheckDamageToLink(k)) { + SpriteSfx_QueueSfx3WithPan(k, 0xb); + link_hearts_filler += 8; + sprite_state[k] = 0; + return; + } + if (!(frame_counter & 1)) + sprite_A[k]--; + + if (!sign8(sprite_z[k] - 1)) { + sprite_z_vel[k] -= 1; + return; + } + sprite_z[k] = 0; + uint8 a = sign8(sprite_z_vel[k]) ? sprite_z_vel[k] : 0; + sprite_z_vel[k] = (uint8)(-a) >> 1; + if (sprite_x_vel[k]) + sprite_x_vel[k] += sign8(sprite_x_vel[k]) ? 1 : -1; + if (sprite_y_vel[k]) + sprite_y_vel[k] += sign8(sprite_y_vel[k]) ? 1 : -1; +} + +void Sprite_BC_Drunkard(int k) { // 9ef603 + DrinkingGuy_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + Sprite_BehaveAsBarrier(k); + if (!GetRandomNumber()) + sprite_delay_main[k] = 32; + sprite_graphics[k] = sprite_delay_main[k] ? 1 : 0; + if (Sprite_ShowSolicitedMessage(k, 0x175) & 0x100) + sprite_graphics[k] = 0; +} + +void SomariaPlatform_LocatePath(int k) { // 9ef640 + for (;;) { + uint8 tiletype = SomariaPlatformAndPipe_CheckTile(k); + sprite_E[k] = tiletype; + if (tiletype >= 0xb0 && tiletype < 0xbf) + break; + Sprite_SetX(k, Sprite_GetX(k) + 8); + Sprite_SetY(k, Sprite_GetY(k) + 8); + } + sprite_x_lo[k] = (sprite_x_lo[k] & ~7) + 4; + sprite_y_lo[k] = (sprite_y_lo[k] & ~7) + 4; + sprite_head_dir[k] = sprite_D[k]; + SomariaPlatformAndPipe_HandleMovement(k); + sprite_ignore_projectile[k]++; + player_on_somaria_platform = 0; + sprite_delay_aux4[k] = 14; + sprite_graphics[k]++; +} + +void Sprite_SomariaPlatform(int k) { // 9ef6d4 + switch(sprite_graphics[k]) { + case 0: { + SomariaPlatform_LocatePath(k); + int j = Sprite_SpawnSuperficialBombBlast(k); + if (j >= 0) { + Sprite_SetX(j, Sprite_GetX(j) - 8); + Sprite_SetY(j, Sprite_GetY(j) - 8); + } + break; + } + case 1: + SomariaPlatform_Draw(k); + if (Sprite_ReturnIfInactive(k)) + return; + if (!(drag_player_x | drag_player_y) && sign8(player_near_pit_state - 2) && Sprite_CheckDamageToLink_ignore_layer(k)) { + sprite_C[k] = 1; + Link_CancelDash(); + if (link_player_handler_state != kPlayerState_Hookshot && link_player_handler_state != kPlayerState_SpinAttacking) { + if (sprite_ai_state[k]) { + SomariaPlatformAndPipe_HandleMovement(k); + return; + } + sprite_A[k]++; + player_on_somaria_platform = 2; + if (!(sprite_A[k] & 7)) { + uint8 a = SomariaPlatformAndPipe_CheckTile(k); + if (a != sprite_E[k]) { + sprite_E[k] = a; + sprite_head_dir[k] = sprite_D[k]; + SomariaPlatformAndPipe_HandleMovement(k); + SomariaPlatform_HandleDrag(k); + } + } + if (BYTE(dungeon_room_index) != 36) { + static const int8 kSomariaPlatform_DragX[8] = {0, 0, -1, 1, -1, 1, 1, -1}; + static const int8 kSomariaPlatform_DragY[8] = {-1, 1, 0, 0, -1, 1, -1, 1}; + int j = sprite_D[k]; + drag_player_x += kSomariaPlatform_DragX[j]; + drag_player_y += kSomariaPlatform_DragY[j]; + Sprite_MoveXY(k); + SomariaPlatform_DragLink(k); + } else { + player_on_somaria_platform = 1; + } + return; + } + } + if (sprite_C[k]) { + player_on_somaria_platform = 0; + sprite_C[k] = 0; + } + break; + } +} + +void SomariaPlatformAndPipe_HandleMovement(int k) { // 9ef7af + static const int8 kSomariaPlatform_Xvel[8] = {0, 0, -16, 16, -16, 16, 16, -16}; + static const int8 kSomariaPlatform_Yvel[8] = {-16, 16, 0, 0, -16, 16, -16, 16}; + SomariaPlatform_HandleJunctions(k); + int j = sprite_D[k]; + sprite_x_vel[k] = kSomariaPlatform_Xvel[j]; + sprite_y_vel[k] = kSomariaPlatform_Yvel[j]; +} + +uint8 SomariaPlatformAndPipe_CheckTile(int k) { // 9ef7c2 + uint16 x = Sprite_GetX(k), y = Sprite_GetY(k); + return GetTileAttribute(0, &x, y); +} + +void SomariaPlatform_Draw(int k) { // 9ef860 + static const DrawMultipleData kSomariaPlatform_Dmd[16] = { + {-16, -16, 0x00ac, 2}, + { 0, -16, 0x40ac, 2}, + {-16, 0, 0x80ac, 2}, + { 0, 0, 0xc0ac, 2}, + {-13, -13, 0x00ac, 2}, + { -3, -13, 0x40ac, 2}, + {-13, -3, 0x80ac, 2}, + { -3, -3, 0xc0ac, 2}, + {-10, -10, 0x00ac, 2}, + { -6, -10, 0x40ac, 2}, + {-10, -6, 0x80ac, 2}, + { -6, -6, 0xc0ac, 2}, + { -8, -8, 0x00ac, 2}, + { -8, -8, 0x40ac, 2}, + { -8, -8, 0x80ac, 2}, + { -8, -8, 0xc0ac, 2}, + }; + Oam_AllocateFromRegionB(0x10); + Sprite_DrawMultiple(k, &kSomariaPlatform_Dmd[sprite_delay_aux4[k] & 12], 4, NULL); +} + +void SomariaPlatform_HandleJunctions(int k) { // 9ef87d + switch (sprite_E[k]) { + case 0xb2: + case 0xb5: // ZigZagRisingSlope + sprite_D[k] ^= 3; + break; + case 0xb3: + case 0xb4: // ZigZagFallingSlope + sprite_D[k] ^= 2; + break; + case 0xb6: { // TransitTile + static const uint8 kSomariaPlatform_TransitDir[4] = {4, 8, 1, 2}; + sprite_ai_state[k] = 1; + if (!link_auxiliary_state && joypad1H_last & kSomariaPlatform_TransitDir[sprite_D[k]]) { + sprite_ai_state[k] = 0; + sprite_D[k] ^= 1; + } + link_visibility_status = 0; + player_on_somaria_platform = 1; + break; + } + case 0xb7: { // Tjunc_NoUp + static const uint8 kSomariaPlatform_Keys1[4] = {3, 7, 6, 5}; + uint8 t = joypad1H_last & kSomariaPlatform_Keys1[sprite_D[k]]; + if (t & 8) { + sprite_D[k] = 0; + } else if (t & 4) { + sprite_D[k] = 1; + } else if (t & 2) { + sprite_D[k] = 2; + } else if (t & 1) { + sprite_D[k] = 3; + } else if (sprite_D[k] == 0) { + sprite_D[k] = 2; + } + sprite_ai_state[k] = 0; + break; + } + case 0xb8: { // Tjunc_NoDown + static const uint8 kSomariaPlatform_Keys2[4] = {11, 3, 10, 9}; + uint8 t = joypad1H_last & kSomariaPlatform_Keys2[sprite_D[k]]; + if (t & 8) { + sprite_D[k] = 0; + } else if (t & 4) { + sprite_D[k] = 1; + } else if (t & 2) { + sprite_D[k] = 2; + } else if (t & 1) { + sprite_D[k] = 3; + } else if (sprite_D[k] == 1) { + sprite_D[k] = 2; + } + sprite_ai_state[k] = 0; + break; + } + case 0xb9: { // Tjunc_NoLeft + static const uint8 kSomariaPlatform_Keys3[4] = {9, 5, 12, 13}; + uint8 t = joypad1H_last & kSomariaPlatform_Keys3[sprite_D[k]]; + if (t & 8) { + sprite_D[k] = 0; + } else if (t & 4) { + sprite_D[k] = 1; + } else if (t & 2) { + sprite_D[k] = 2; + } else if (t & 1) { + sprite_D[k] = 3; + } else if (sprite_D[k] == 2) { + sprite_D[k] = 0; + } + sprite_ai_state[k] = 0; + break; + } + case 0xba: { // Tjunc_NoRight + static const uint8 kSomariaPlatform_Keys4[4] = {0xa, 6, 0xe, 0xc}; + uint8 t = joypad1H_last & kSomariaPlatform_Keys4[sprite_D[k]]; + if (t & 8) { + sprite_D[k] = 0; + } else if (t & 4) { + sprite_D[k] = 1; + } else if (t & 2) { + sprite_D[k] = 2; + } else if (t & 1) { + sprite_D[k] = 3; + } else if (sprite_D[k] == 3) { + sprite_D[k] = 0; + } + sprite_ai_state[k] = 0; + break; + } + case 0xbb: { // TransitTileNoBack + static const uint8 kSomariaPlatform_Keys5[4] = {0xb, 7, 0xe, 0xd}; + uint8 t = joypad1H_last & kSomariaPlatform_Keys5[sprite_D[k]]; + if (t & 8) { + sprite_D[k] = 0; + } else if (t & 4) { + sprite_D[k] = 1; + } else if (t & 2) { + sprite_D[k] = 2; + } else if (t & 1) { + sprite_D[k] = 3; + } + break; + } + case 0xbc: { // TransitTileQuestion + static const uint8 kSomariaPlatform_Keys6[4] = {0xc, 0xc, 3, 3}; + sprite_ai_state[k] = 1; + uint8 t = joypad1H_last & kSomariaPlatform_Keys6[sprite_D[k]]; + if (t) { + if (t & 8) { + sprite_D[k] = 0; + } else if (t & 4) { + sprite_D[k] = 1; + } else if (t & 2) { + sprite_D[k] = 2; + } else { + sprite_D[k] = 3; + } + sprite_ai_state[k] = 0; + } + player_on_somaria_platform = 1; + break; + } + case 0xbe: // endpoint + sprite_ai_state[k] = 0; + sprite_D[k] ^= 1; + link_visibility_status = 0; + player_on_somaria_platform = 1; + break; + } +} + +void SomariaPlatform_HandleDragX(int k) { // 9ef8ad + if ((sprite_D[k] ^ sprite_head_dir[k]) & 2) { + uint8 x = (sprite_x_lo[k] & ~7) + 4; + uint8 t = x - sprite_x_lo[k]; + if (!t) + return; + drag_player_x = (int8)t; + sprite_x_lo[k] = x; + } +} + +void SomariaPlatform_HandleDragY(int k) { // 9ef8d7 + if ((sprite_D[k] ^ sprite_head_dir[k]) & 2) { + uint8 y = (sprite_y_lo[k] & ~7) + 4; + uint8 t = y - sprite_y_lo[k]; + if (!t) + return; + drag_player_y = (int8)t; + sprite_y_lo[k] = y; + } +} + +void SomariaPlatform_HandleDrag(int k) { // 9ef901 + SomariaPlatform_HandleDragX(k); + SomariaPlatform_HandleDragY(k); +} + +void SomariaPlatform_DragLink(int k) { // 9efb49 + uint16 x = cur_sprite_x - 8 - link_x_coord; + if (x) + drag_player_x += sign16(x) ? -1 : 1; + uint16 y = cur_sprite_y - 16 - link_y_coord; + if (y) + drag_player_y += sign16(y) ? -1 : 1; +} + +void Sprite_AE_Pipe_Down(int k) { // 9efb7e + static const uint8 kPipe_Dirs[4] = {8, 4, 2, 1}; + + uint8 t; + if (Sprite_ReturnIfInactive(k)) + return; + switch(sprite_graphics[k]) { + case 0: // locate transit tile + alt_sprite_spawned_flag[0] = 255; + sprite_D[k] = sprite_type[k] - 0xae; + SomariaPlatform_LocatePath(k); + break; + case 1: // locate endpoint + t = SomariaPlatformAndPipe_CheckTile(k); + if (t == 0xbe) { + sprite_graphics[k]++; + t = (sprite_D[k] ^= 1); + } + sprite_E[k] = t; + sprite_head_dir[k] = sprite_D[k]; + SomariaPlatformAndPipe_HandleMovement(k); + Sprite_MoveXY(k); + break; + case 2: // wait for player + if (alt_sprite_spawned_flag[0] == 255 && Sprite_CheckDamageToLink_ignore_layer(k)) { + if (!Pipe_ValidateEntry()) { + sprite_graphics[k]++; + sprite_delay_aux1[k] = 4; + Link_ResetProperties_A(); + flag_is_link_immobilized = 1; + link_disable_sprite_damage = 1; + alt_sprite_spawned_flag[0] = k; + } else { + Sprite_HaltAllMovement(); + } + } + break; + case 3: // draw player in + if (!sprite_delay_aux1[k]) { + sprite_graphics[k]++; + link_visibility_status = 12; + } else { + flag_is_link_immobilized = 1; + link_disable_sprite_damage = 1; + Pipe_HandlePlayerMovement(kPipe_Dirs[sprite_D[k]]); + } + break; + case 4: { // draw player along + sprite_subtype2[k] = 3; + link_x_coord_safe_return_lo = link_x_coord; + link_x_coord_safe_return_hi = link_x_coord >> 8; + link_y_coord_safe_return_lo = link_y_coord; + link_y_coord_safe_return_hi = link_y_coord >> 8; + do { + if (!(++sprite_A[k] & 7)) { + uint8 t = SomariaPlatformAndPipe_CheckTile(k); + if (t >= 0xb2 && t < 0xb6) + SpriteSfx_QueueSfx2WithPan(k, 0xb); + if (t != sprite_E[k]) { + sprite_E[k] = t; + if (t == 0xbe) { + sprite_graphics[k]++; + sprite_delay_aux1[k] = 24; + } + sprite_head_dir[k] = sprite_D[k]; + SomariaPlatformAndPipe_HandleMovement(k); + SomariaPlatform_HandleDrag(k); + } + } + Sprite_MoveXY(k); + uint16 x = Sprite_GetX(k) - 8; + uint16 y = Sprite_GetY(k) - 14; + if (x != link_x_coord) + link_x_coord += (x < link_x_coord) ? -1 : 1; + if (y != link_y_coord) + link_y_coord += (y < link_y_coord) ? -1 : 1; + } while (--sprite_subtype2[k]); + link_x_vel = link_x_coord - link_x_coord_safe_return_lo; + link_y_vel = link_y_coord - link_y_coord_safe_return_lo; + link_direction_last = kPipe_Dirs[sprite_D[k]]; + Link_HandleMovingAnimation_FullLongEntry(); + HandleIndoorCameraAndDoors(); + Link_CancelDash(); + break; + } + case 5: // + if (!sprite_delay_aux1[k]) { + flag_is_link_immobilized = 0; + player_on_somaria_platform = 0; + link_disable_sprite_damage = 0; + link_visibility_status = 0; + link_x_vel = link_y_vel = 0; + alt_sprite_spawned_flag[0] = 255; + sprite_graphics[k] = 2; + } else { + Pipe_HandlePlayerMovement(kPipe_Dirs[sprite_D[k] ^ 1]); + } + break; + } +} + +void Pipe_HandlePlayerMovement(uint8 dir) { // 9efcff + link_direction_last = link_direction = dir; + Link_HandleVelocity(); + Link_HandleMovingAnimation_FullLongEntry(); + HandleIndoorCameraAndDoors(); +} + +void Faerie_HandleMovement(int k) { // 9efd1c + sprite_graphics[k] = frame_counter >> 3 & 1; + if (player_is_indoors && !sprite_delay_aux1[k]) { + if (Sprite_CheckTileCollision(k) & 3) { + sprite_x_vel[k] = -sprite_x_vel[k]; + sprite_D[k] = -sprite_D[k]; + sprite_delay_aux1[k] = 32; + } + if (sprite_wallcoll[k] & 12) { + sprite_y_vel[k] = -sprite_y_vel[k]; + sprite_A[k] = -sprite_A[k]; + sprite_delay_aux1[k] = 32; + } + } + if (sprite_x_vel[k]) { + if (sign8(sprite_x_vel[k])) + sprite_oam_flags[k] &= ~0x40; + else + sprite_oam_flags[k] |= 0x40; + } + Sprite_MoveXY(k); + if (!(frame_counter & 63)) { + uint16 x = (link_x_coord & ~0xff) + GetRandomNumber(); + uint16 y = (link_y_coord & ~0xff) + GetRandomNumber(); + ProjectSpeedRet pt = Sprite_ProjectSpeedTowardsLocation(k, x, y, 16); + sprite_A[k] = pt.y; + sprite_D[k] = pt.x; + } + if (!(frame_counter & 15)) { + sprite_y_vel[k] = ((int8)sprite_A[k] + (int8)sprite_y_vel[k]) >> 1; + sprite_x_vel[k] = ((int8)sprite_D[k] + (int8)sprite_x_vel[k]) >> 1; + } + Sprite_MoveZ(k); + sprite_z_vel[k] += (GetRandomNumber() & 1) ? -1 : 1; + if (sprite_z[k] < 8) { + sprite_z[k] = 8; + sprite_z_vel[k] = 5; + } else if (sprite_z[k] >= 24) { + sprite_z[k] = 24; + sprite_z_vel[k] = -5; + } +} + diff --git a/sprite_main.h b/sprite_main.h new file mode 100644 index 00000000..82a5e684 --- /dev/null +++ b/sprite_main.h @@ -0,0 +1,953 @@ +#pragma once +#include "types.h" +#include "sprite.h" + +void Sprite_PullSwitch_bounce(int k); +void GiantMoldorm_DrawSegment_AB(int k, int lookback); +void GiantMoldorm_DrawSegment_C_OrTail(int k, int lookback); +void Chicken_IncrSubtype2(int k, int j); +bool Octoballoon_Find(); +bool FluteBoy_CheckIfPlayerClose(int k); +void FortuneTeller_LightOrDarkWorld(int k, bool dark_world); +int GarnishAllocForce(); +int GarnishAlloc(); +int GarnishAllocLow(); +int GarnishAllocLimit(int k); +int GarnishAllocOverwriteOldLow(); +int GarnishAllocOverwriteOld(); +void Garnish_SetX(int k, uint16 x); +void Garnish_SetY(int k, uint16 y); +void Sprite_WishPond3(int k); +int Sprite_SpawnSmallSplash(int k); +void HeartUpgrade_CheckIfAlreadyObtained(int k); +void Sprite_MovableMantleTrampoline(int k); +void Sprite_GoodOrBadArcheryTarget(int k); +void ChainBallTrooper_Draw(int k); +void Sprite_CannonTrooper(int k); +void Bee_PutInBottle(int k); +void Sprite_Wizzbeam(int k); +void Kiki_LyingInwait(int k); +int ChainChomp_OneMult(uint8 a, uint8 b); +void Sprite_CC(int k); +void Sprite_CD(int k); +void SpritePrep_IncrXYLow8(int k); +void SpritePrep_FakeSword(int k); +void SpritePrep_MedallionTable(int k); +void Hobo_Draw(int k); +bool Landmine_CheckDetonationFromHammer(int k); +void Sprite_DrawLargeWaterTurbulence(int k); +void Sprite_SpawnSparkleGarnish(int k); +void Sprite_70_KingHelmasaurFireball_bounce(int k); +void Sprite_66_WallCannonVerticalLeft(int k); +void Sprite_65_ArcheryGame(int k); +void ArcheryGame_Host(int k); +void ArcheryGameGuy_ShowMsg(int k, int msg); +void ArcheryGame_Host_ProctorGame(int k); +void ArcheryGame_DrawPrize(int k); +void Sprite_63_DebirandoPit(int k); +void DebirandoPit_Draw(int k); +void Sprite_64_Debirando(int k); +void Debirando_Draw(int k); +void Sprite_62_MasterSword(int k); +void MasterSword_Main(int k); +void Sprite_MasterSword_LightFountain(int k); +void Sprite_MasterSword_LightWell(int k); +void SpriteDraw_LightFountain(int k); +void MasterSword_SpawnLightWell(int k); +void MasterSword_SpawnLightFountain(int k); +void Sprite_MasterSword_LightBeam(int k); +void MasterSword_SpawnReplacementLightBeam(int k); +void MasterSword_SpawnLightBeam(int k, uint8 ain, uint8 yin); +void MasterSword_SpawnPendantProp(int k, uint8 ain); +void Sprite_MasterSword_Prop(int k); +void MasterSword_Draw(int k); +void Sprite_5D_Roller_VerticalDownFirst(int k); +void SpikeRoller_Draw(int k); +void Sprite_61_Beamos(int k); +void Beamos_FireLaser(int k); +void Beamos_Draw(int k); +void SpriteDraw_Beamos_Eyeball(int k, PrepOamCoordsRet *info); +void Sprite_Beamos_Laser(int k); +void BeamosLaser_Draw(int k); +void Sprite_Beamos_LaserHit(int k); +void Sprite_5B_Spark_Clockwise(int k); +void Sprite_59_LostWoodsBird(int k); +void Sprite_5A_LostWoodsSquirrel(int k); +void Sprite_58_Crab(int k); +void Crab_Draw(int k); +void Sprite_57_DesertStatue(int k); +void DesertBarrier_Draw(int k); +void Sprite_55_Zora(int k); +void Sprite_Fireball(int k); +void Sprite_Zora_Main(int k); +void Zora_Draw(int k); +void Sprite_52_KingZora(int k); +void Sprite_SpawnBigSplash(int k); +void ZoraKing_Draw(int k); +void Sprite_56_WalkingZora(int k); +void WalkingZora_AdjustShadow(int k); +void WalkingZora_Draw(int k); +void WalkingZora_DrawWaterRipples(int k); +void SpriteDraw_WaterRipple_WithOamAdjust(int k); +void SpriteDraw_WaterRipple(int k); +void Sprite_53_ArmosKnight(int k); +void ArmosKnight_Draw(int k); +void Sprite_54_Lanmolas(int k); +void Lanmola_Draw(int k); +void Sprite_6D_Rat(int k); +void Sprite_6E_Rope(int k); +void Sprite_6F_Keese(int k); +void Sprite_Cannonball(int k); +void Sprite_SpawnPoofGarnish(int j); +void Sprite_6C_MirrorPortal(int k); +void Sprite_6A_BallNChain(int k); +void BallNChain_Animate(int k); +void SpriteDraw_GuardHead(int k, PrepOamCoordsRet *info, int spr_offs); +void SpriteDraw_BNCBody(int k, PrepOamCoordsRet *info, int spr_offs); +void SpriteDraw_BNCFlail(int k, PrepOamCoordsRet *info); +void Sprite_50_Cannonball(int k); +void SpriteDraw_BigCannonball(int k); +void Sprite_51_ArmosStatue(int k); +void Armos_Draw(int k); +void Sprite_4E_Popo(int k); +void Bot_Draw(int k); +void Sprite_4C_Geldman(int k); +void GerudoMan_Draw(int k); +void Sprite_4D_Toppo(int k); +void Toppo_VerifyTile(int k); +void Toppo_Draw(int k); +void Sprite_4B_GreenKnifeGuard(int k); +void GreenKnifeGuard_Moving(int k); +void Recruit_Draw(int k); +void Sprite_4A_BombGuard(int k); +void SpriteBomb_CheckDamageToSprite(int k, int j); +void SpriteBomb_ExplosionIncoming(int k); +void BombGuard(int k); +void BombGuard_CreateBomb(int k); +void BombTrooper_Draw(int k); +void SpriteDraw_BombGuard_Arm(int k, PrepOamCoordsRet *info); +void SpriteDraw_SpriteBombExplosion(int k); +void Sprite_41_BlueGuard(int k); +void Probe(int k); +void Guard_Main(int k); +void Guard_SetGlanceTo12(int k); +void Guard_ShootProbeAndStuff(int k); +void Guard_TickAndUpdateBody(int k); +void Guard_SetTimerAndAssertTileHitBox(int k, uint8 a); +void Soldier_Func12(int k); +void Guard_ApplySpeedInDirection(int k); +void Sprite_Guard_SendOutProbe(int k); +void Sprite_SpawnProbeAlways(int k, uint8 r15); +void Guard_HandleAllAnimation(int k); +void Guard_AnimateHead(int k, int oam_offs, const PrepOamCoordsRet *poc); +void Guard_AnimateBody(int k, int oam_idx, const PrepOamCoordsRet *poc); +void Guard_AnimateWeapon(int k, const PrepOamCoordsRet *poc); +void Sprite_45_UsainBolt(int k); +void BoltGuard_TriggerChaseTheme(int k); +void Sprite_44_BluesainBolt(int k); +void PsychoTrooper_Draw(int k); +void SpriteDraw_GuardSpear(int k, PrepOamCoordsRet *info, int spr_offs); +void Sprite_48_RedJavelinGuard(int k); +void Sprite_46_BlueArcher(int k); +void SoldierThrowing_Common(int k); +void Guard_LaunchProjectile(int k); +void BushJavelinSoldier_Draw(int k); +void JavelinTrooper_Draw(int k); +void Sprite_49_RedBushGuard(int k); +void Sprite_47_GreenBushGuard(int k); +void Sprite_BushGuard_Main(int k); +void BushGuard_SpawnFoliage(int k); +void BushSoldierCommon_Draw(int k); +void ArcherSoldier_Draw(int k); +void SpriteDraw_Archer_Weapon(int k, int spr_offs, PrepOamCoordsRet *info); +void TutorialSoldier_Draw(int k); +void PullSwitch_FacingUp(int k); +void PullSwitch_HandleUpPulling(int k); +void BadPullDownSwitch_Draw(int k); +void BadPullUpSwitch_Draw(int k); +void PullSwitch_FacingDown(int k); +void GoodPullSwitch_Draw(int k); +void PullSwitch_HandleDownPulling(int k); +void Priest_SpawnMantle(int k); +void Sprite_SanctuaryMantle(int k); +void SageMantle_Draw(int k); +void Sprite_Priest(int k); +void Priest_Dying(int k); +void Priest_RunRescueCutscene(int k); +void Priest_Chillin(int k); +void Sprite_Uncle(int k); +void Uncle_AtHouse(int k); +void Uncle_InPassage(int k); +void Sprite_QuarrelBros(int k); +void QuarrelBros_Draw(int k); +void Sprite_YoungSnitchLady(int k); +void YoungSnitchLady_Draw(int k); +void Sprite_InnKeeper(int k); +void InnKeeper_Draw(int k); +void Sprite_Witch(int k); +void Witch_AcceptShroom(int k); +void Witch_Draw(int k); +void SpritePrep_Snitches(int k); +void Sprite_OldSnitchLady(int k); +void SpritePrep_RunningMan(int k); +void Sprite_RunningMan(int k); +void RunningMan_Draw(int k); +void Sprite_BottleVendor(int k); +uint8 BottleVendor_Draw(int k); +void Priest_SpawnRescuedPrincess(); +void Sprite_76_Zelda(int k); +void Zelda_InCell(int k); +void Zelda_EnteringSanctuary(int k); +void Zelda_AtSanctuary(int k); +void SpritePrep_Mushroom(int k); +void Sprite_Mushroom(int k); +void Sprite_FakeSword(int k); +void FakeSword_Draw(int k); +void SpritePrep_HeartContainer(int k); +void Sprite_HeartContainer(int k); +void Sprite_HeartPiece(int k); +void HeartUpgrade_SetObtainedFlag(int k); +void Sprite_Aginah(int k); +void Sprite_Sahasrahla(int k); +void Sasha_Idle(int k); +void Elder_Draw(int k); +void Sprite_DustCloud(int k); +int Sprite_SpawnDustCloud(int k); +void MedallionTablet_Main(int k); +void BombosTablet(int k); +void EtherTablet(int k); +void ElderWife_Draw(int k); +void SpritePrep_PotionShop(int k); +void MagicShopAssistant_SpawnPowder(int k); +void MagicShopAssistant_SpawnGreenCauldron(int k); +void MagicShopAssistant_SpawnBlueCauldron(int k); +void MagicShopAssistant_SpawnRedCauldron(int k); +void Sprite_PotionShop(int k); +void Sprite_BagOfPowder(int k); +void MagicPowderItem_Draw(int k); +void Sprite_GreenCauldron(int k); +void GreenPotionItem_Draw(int k); +void Sprite_BlueCauldron(int k); +void BluePotionItem_Draw(int k); +void Sprite_RedCauldron(int k); +void PotionCauldron_GoBeep(int k); +void RedPotionItem_Draw(int k); +bool PotionCauldron_CheckBottles(); +void Sprite_MagicShopAssistant_Main(int k); +void Shopkeeper_Draw(int k); +void Sprite_DashItem(int k); +void Sprite_BonkKey(int k); +void Sprite_BookOfMudora(int k); +void Sprite_LumberjackTree(int k); +void DashTreeTop_Draw(int k); +int LumberjackTree_SpawnLeaves(int k); +void Sprite_TroughBoy(int k); +void TroughBoy_Draw(int k); +void BottleMerchant_DetectFish(int k); +void BottleMerchant_BuyFish(int k); +void SpritePrep_ThrowableScenery(int k); +void SpriteModule_Initialize(int k); +void SpritePrep_Mantle(int k); +void SpritePrep_Switch(int k); +void SpritePrep_SwitchFacingUp(int k); +void SpritePrep_Snitch_bounce_1(int k); +void SpritePrep_DoNothingA(int k); +void SpritePrep_Rat(int k); +void SpritePrep_Keese(int k); +void SpritePrep_Rope(int k); +void SpritePrep_Swamola(int k); +void SpritePrep_Blind(int k); +void SpritePrep_Ganon(int k); +void SpritePrep_Pokey(int k); +void SpritePrep_MiniVitreous(int k); +void SpritePrep_Gibo(int k); +void SpritePrep_Octoballoon(int k); +void SpritePrep_AgahnimsBarrier(int k); +void SpritePrep_Catfish(int k); +void SpritePrep_CutsceneAgahnim(int k); +void SpritePrep_Vitreous(int k); +void SpritePrep_Raven(int k); +void SpritePrep_Vulture(int k); +void SpritePrep_Poe(int k); +void SpritePrep_DoNothingC(int k); +void SpritePrep_BlindMaiden(int k); +void SpritePrep_MiniMoldorm_bounce(int k); +void SpritePrep_Bomber(int k); +void SpritePrep_BombShoppe(int k); +void SpritePrep_BullyAndVictim(int k); +void SpritePrep_PurpleChest(int k); +void SpritePrep_Smithy(int k); +void SpritePrep_Babasu(int k); +void SpritePrep_Zoro(int k); +void SpritePrep_LaserEye_bounce(int k); +void SpritePrep_Popo(int k); +void SpritePrep_Popo2(int k); +void SpritePrep_Statue(int k); +void SpritePrep_Bari(int k); +void SpritePrep_GreenStalfos(int k); +void SpritePrep_WaterLever(int k); +void SpritePrep_FireDebirando(int k); +void SpritePrep_DebirandoPit(int k); +void SpritePrep_WeakGuard(int k); +void SpritePrep_WallCannon(int k); +void SpritePrep_ArrowGame_bounce(int k); +void SpritePrep_IgnoreProjectiles(int k); +void SpritePrep_HauntedGroveAnimal(int k); +void SpritePrep_HauntedGroveOstritch(int k); +void SpritePrep_DiggingGameGuy_bounce(int k); +void SpritePrep_ThievesTownGrate(int k); +void SpritePrep_RupeePull(int k); +void SpritePrep_Shopkeeper(int k); +void SpritePrep_Storyteller(int k); +void SpritePrep_Adults(int k); +void SpritePrep_Whirlpool(int k); +void SpritePrep_Sage(int k); +void SpritePrep_BonkItem(int k); +void SpritePrep_Kiki(int k); +void SpritePrep_Locksmith(int k); +void SpritePrep_SickKid(int k); +void SpritePrep_Tektite(int k); +void SpritePrep_Chainchomp_bounce(int k); +void SpritePrep_BigFairy(int k); +void SpritePrep_MrsSahasrahla(int k); +void SpritePrep_MagicBat(int k); +void SpritePrep_FortuneTeller(int k); +void SpritePrep_FairyPond(int k); +void SpritePrep_Hobo(int k); +void SpritePrep_MasterSword(int k); +void SpritePrep_Roller_HorizontalRightFirst(int k); +void SpritePrep_RollerLeftRight(int k); +void SpritePrep_Roller_VerticalDownFirst(int k); +void SpritePrep_RollerUpDown(int k); +void SpritePrep_Kodongo(int k); +void SpritePrep_Spark(int k); +void SpritePrep_LostWoodsBird(int k); +void SpritePrep_LostWoodsSquirrel(int k); +void SpritePrep_Antifairy(int k); +void SpritePrep_FallingIce(int k); +void SpritePrep_KingZora(int k); +bool Sprite_ReturnIfBossFinished(int k); +void SpritePrep_ArmosKnight(int k); +void SpritePrep_DesertStatue(int k); +void SpritePrep_DoNothingD(int k); +void SpritePrep_Octorok(int k); +void SpritePrep_Moldorm_bounce(int k); +void SpritePrep_Lanmolas_bounce(int k); +void SpritePrep_BigSpike(int k); +void SpritePrep_SwimmingZora(int k); +void SpritePrep_Geldman(int k); +void SpritePrep_Kyameron(int k); +void SpritePrep_WalkingZora(int k); +void SpritePrep_StandardGuard(int k); +void SpritePrep_TrooperAndArcherSoldier(int k); +void SpritePrep_TalkingTree(int k); +void SpritePrep_CrystalSwitch(int k); +void SpritePrep_FluteKid(int k); +void SpritePrep_MoveDown_8px(int k); +void SpritePrep_Zazakku(int k); +void SpritePrep_PedestalPlaque(int k); +void SpritePrep_Stalfos(int k); +void SpritePrep_KholdstareShell(int k); +void SpritePrep_Kholdstare(int k); +void SpritePrep_Bumper(int k); +void SpritePrep_MoveDown_8px_Right8px(int k); +void SpritePrep_HardhatBeetle(int k); +void SpritePrep_MiniHelmasaur(int k); +void SpritePrep_Fairy(int k); +void SpritePrep_Absorbable(int k); +void SpritePrep_OverworldBonkItem(int k); +void SpritePrep_ShieldPickup(int k); +void SpritePrep_NiceBee(int k); +void SpritePrep_Agahnim(int k); +void SpritePrep_DoNothingG(int k); +void SpritePrep_FireBar(int k); +void SpritePrep_Trinexx(int k); +void SpritePrep_HelmasaurKing(int k); +void SpritePrep_Spike(int k); +void SpritePrep_RockStal(int k); +void SpritePrep_Blob(int k); +void SpritePrep_Arrghus(int k); +void SpritePrep_Arrghi(int k); +void SpritePrep_Mothula(int k); +void SpritePrep_DoNothingH(int k); +void SpritePrep_BigKey(int k); +void SpritePrep_BigKey_load_graphics(int k); +void SpritePrep_SmallKey(int k); +void SpritePrep_KeySetItemDrop(int k); +void SpriteActive_Main(int k); +void Sprite_09_Moldorm_bounce(int k); +void Sprite_01_Vulture_bounce(int k); +void Sprite_27_Deadrock(int k); +void Sprite_20_Sluggula(int k); +void Sluggula_DropBomb(int k); +void Sprite_19_Poe(int k); +void Poe_Draw(int k); +void Sprite_18_MiniMoldorm(int k); +void Sprite_12_Moblin(int k); +void Moblin_MaterializeSpear(int k); +void Moblin_Draw(int k); +void Sprite_0E_Snapdragon(int k); +void SnapDragon_Draw(int k); +void Sprite_22_Ropa(int k); +void Ropa_Draw(int k); +void Sprite_11_Hinox(int k); +void Hinox_ThrowBomb(int k); +void Hinox_FaceLink(int k); +void Hinox_SetDirection(int k, uint8 dir); +void Hinox_Draw(int k); +void Sprite_23_RedBari(int k); +void RedBari_Split(int k); +void RedBari_Draw(int k); +void Sprite_13_MiniHelmasaur(int k); +void Sprite_26_HardhatBeetle(int k); +void HelmasaurHardHatBeetleCommon(int k); +void HardHatBeetle_Draw(int k); +void Sprite_15_Antifairy(int k); +void Sprite_0B_Cucco(int k); +void Cucco_Calm(int k); +void Chicken_Hopping(int k); +void Cucco_Flee(int k); +void Cucco_DrawPANIC(int k); +void Cucco_Carried(int k); +uint8 Cucco_DoMovement_XY(int k); +void Cucco_SummonAvenger(int k); +void BawkBawk(int k); +void Sprite_17_Hoarder(int k); +void Sprite_Hoarder_Covered(int k); +void Sprite_Hoarder_Frantic(int k); +void CoveredRupeeCrab_Draw(int k); +void Sprite_EC_ThrownItem(int k); +void SpriteDraw_ThrownItem_Gigantic(int k); +void ThrowableScenery_ScatterIntoDebris(int k); +void Sprite_TransmuteToBomb(int k); +void Sprite_28_DarkWorldHintNPC(int k); +void DarkWorldHintNPC_Idle(int k); +void DarkWorldHintNPC_RestoreHealth(int k); +bool DarkWorldHintNPC_HandlePayment(); +void StoryTeller_1_Draw(int k); +void Sprite_2E_FluteKid(int k); +void FluteKid_Human(int k); +void Sprite_FluteKid_Stumpy(int k); +void Sprite_FluteKid_Quaver(int k); +void FluteKid_SpawnQuaver(int k); +void Sprite_1A_Smithy(int k); +void Smithy_Homecoming(int k); +void Smithy_Frog(int k); +void ReturningSmithy_Draw(int k); +void SmithyFrog_Draw(int k); +void Smithy_Main(int k); +bool Smithy_ListenForHammer(int k); +int Smithy_SpawnDwarfPal(int k); +void Smithy_Draw(int k); +void Smithy_Spark(int k); +void Smithy_SpawnSpark(int k); +void SmithySpark_Draw(int k); +void Sprite_1B_Arrow(int k); +void EnemyArrow_Draw(int k); +void Sprite_1E_CrystalSwitch(int k); +void Sprite_1F_SickKid(int k); +void Sprite_21_WaterSwitch(int k); +void PushSwitch_Draw(int k); +void Sprite_39_Locksmith(int k); +void MiddleAgedMan_Draw(int k); +void Sprite_2B_Hobo(int k); +void Sprite_Hobo_Bum(int k); +void SpritePrep_Hobo_SpawnSmoke(int k); +void Sprite_Hobo_Bubble(int k); +int Hobo_SpawnBubble(int k); +void Sprite_Hobo_Fire(int k); +void SpritePrep_Hobo_SpawnFire(int k); +void Sprite_Hobo_Smoke(int k); +void Hobo_SpawnSmoke(int k); +void Sprite_73_UncleAndPriest_bounce(int k); +void SpritePrep_UncleAndPriest_bounce(int k); +void SpritePrep_OldMan_bounce(int k); +void Sprite_TutorialGuardOrBarrier_bounce(int k); +void Sprite_F2_MedallionTablet_bounce(int k); +void Sprite_33_RupeePull_bounce(int k); +void Sprite_14_ThievesTownGrate_bounce(int k); +void SpritePrep_Snitch_bounce_2(int k); +void SpritePrep_Snitch_bounce_3(int k); +void Sprite_37_Waterfall_bounce(int k); +void Sprite_38_EyeStatue_bounce(int k); +void Sprite_3A_MagicBat_bounce(int k); +void SpritePrep_Zelda_bounce(int k); +void Sprite_78_MrsSahasrahla_bounce(int k); +void Sprite_16_Elder_bounce(int k); +void SpritePrep_HeartPiece(int k); +void Sprite_2D_TelepathicTile_bounce(int k); +void Sprite_25_TalkingTree_bounce(int k); +void Sprite_1C_Statue(int k); +bool Statue_CheckForSwitch(int k); +void MovableStatue_Draw(int k); +void Statue_BlockSprites(int k); +void Sprite_1D_FluteQuest(int k); +void Sprite_72_FairyPond(int k); +void Sprite_WishPond2(int k); +void Sprite_HappinessPond(int k); +void WishPond2_Draw(int k); +void FaerieQueen_Draw(int k); +void Sprite_71_Leever(int k); +void Leever_Draw(int k); +void Sprite_D8_Heart(int k); +void Sprite_E3_Fairy(int k); +void Fairy_CheckIfTouchable(int k); +void Sprite_E4_SmallKey(int k); +void Sprite_D9_GreenRupee(int k); +void Sprite_Absorbable_Main(int k); +void Sprite_08_Octorok(int k); +void Octorok_FireLoogie(int k); +void Octorock_Draw(int k); +void Sprite_0C_OctorokStone(int k); +void SpriteDraw_OctorokStoneCrumbling(int k); +void Sprite_0F_Octoballoon(int k); +void Octoballoon_RecoilLink(int k); +void Octoballoon_Draw(int k); +void Octoballoon_FormBabby(int k); +void Sprite_10_OctoballoonBaby(int k); +void Sprite_0D_Buzzblob(int k); +void Buzzblob_SelectNewDirection(int k); +void BuzzBlob_Draw(int k); +void Sprite_02_StalfosHead(int k); +bool Pipe_ValidateEntry(); +void Ancilla_TerminateSparkleObjects(); +int Sprite_SpawnSuperficialBombBlast(int k); +void Sprite_SpawnDummyDeathAnimation(int k); +void Sprite_MagicBat_SpawnLightning(int k); +void Fireball_SpawnTrailGarnish(int k); +void GarnishSpawn_PyramidDebris(int8 x, int8 y, int8 xvel, int8 yvel); +void Snitch_SpawnGuard(int k); +void Babusu_Draw(int k); +void Wizzrobe_Draw(int k); +void Wizzbeam_Draw(int k); +void Freezor_Draw(int k); +void Zazak_Draw(int k); +void Stalfos_Draw(int k); +bool Probe_CheckTileSolidity(int k); +void Sprite_HumanMulti_1(int k); +void Sprite_BlindsHutGuy(int k); +void Sprite_ThiefHideoutGuy(int k); +void Sprite_FluteDad(int k); +void FluteBoyFather_Draw(int k); +void BlindHideoutGuy_Draw(int k); +void Sprite_SweepingLady(int k); +void SweepingLady_Draw(int k); +void Sprite_Lumberjacks(int k); +bool Lumberjack_CheckProximity(int k, int j); +void Lumberjacks_Draw(int k); +void Sprite_FortuneTeller(int k); +void FortuneTeller_PerformPseudoScience(int k); +void FortuneTeller_Draw(int k); +void Smithy_SpawnDumbBarrierSprite(int k); +void Sprite_MazeGameLady(int k); +void Sprite_MazeGameGuy(int k); +void MazeGameGuy_Draw(int k); +void CrystalMaiden_Draw(int k); +void Priest_Draw(int k); +uint8 FluteBoy_Draw(int k); +void FluteAardvark_Draw(int k); +void DustCloud_Draw(int k); +void MedallionTablet_Draw(int k); +void Uncle_Draw(int k); +void BugNetKid_Draw(int k); +void Bomber_Draw(int k); +void SpriteDraw_ZirroBomb(int k); +void PlayerBee_HoneInOnTarget(int j, int k); +void Pikit_Draw(int k); +void SpriteDraw_Pikit_Tongue(int k, PrepOamCoordsRet *info); +void SpriteDraw_Pikit_Loot(int k, PrepOamCoordsRet *info); +void Kholdstare_Draw(int k); +int Sprite_SpawnFireball(int k); +void ArcheryGameGuy_Draw(int k); +void ShopKeeper_RapidTerminateReceiveItem(); +void Sprite_InitializeSecondaryItemMinigame(int what); +void Waterfall(int k); +void Sprite_BatCrash(int k); +void Sprite_SpawnBatCrashCutscene(); +void BatCrash_DrawHardcodedGarbage(int k); +void BatCrash_SpawnDebris(int k); +void RetreatBat_Draw(int k); +void DrinkingGuy_Draw(int k); +void Lady_Draw(int k); +void Lanmola_SpawnShrapnel(int k); +void Sprite_Cukeman(int k); +void Cukeman_Draw(int k); +void RunningBoy_SpawnDustGarnish(int k); +void MovableMantle_Draw(int k); +void Mothula_Draw(int k); +void BottleMerchant_BuyBee(int k); +void Sprite_ChickenLady(int k); +void Overworld_DrawWoodenDoor(uint16 pos, bool unlocked); +void Sprite_D4_Landmine(int k); +void Landmine_Draw(int k); +void Sprite_D3_Stal(int k); +void Stal_Draw(int k); +void Sprite_D2_FloppingFish(int k); +void Fish_Draw(int k); +void ChimneySmoke_Draw(int k); +void Sprite_D1_BunnyBeam(int k); +void Sprite_Chimney(int k); +void Sprite_BunnyBeam(int k); +void Sprite_D0_Lynel(int k); +void Lynel_Draw(int k); +void Sprite_SpawnPhantomGanon(int k); +void Sprite_PhantomGanon(int k); +void GanonBat_Draw(int k); +void PhantomGanon_Draw(int k); +void SwishEvery16Frames(int k); +void Sprite_GanonTrident(int k); +void Sprite_FireBat_Trailer(int k); +void Sprite_SpiralFireBat(int k); +void FireBat_Move(int k); +void Sprite_FireBat_Launched(int k); +void GetPositionRelativeToTheGreatOverlordGanon(int k); +void FireBat_Animate(int k); +void FireBat_Draw(int k); +bool Ganon_AttemptTridentCatch(uint16 x, uint16 y); +void Ganon_HandleFireBatCircle(int k); +void Ganon_SpawnSpiralBat(int k); +void Sprite_D6_Ganon(int k); +void Ganon_EnableInvincibility(int k); +void Ganon_SpawnFallingTilesOverlord(int k); +void Ganon_Func1(int k, int t); +void Ganon_Phase1_AnimateTridentSpin(int k); +void Ganon_HandleAnimation_Idle(int k); +void Ganon_SelectWarpLocation(int k, int a); +void Ganon_ShakeHead(int k); +void Ganon_Draw(int k); +void Trident_Draw(int k); +void SpritePrep_Swamola_InitializeSegments(int k); +void Sprite_CF_Swamola(int k); +ProjectSpeedRet Swamola_ProjectVelocityTowardsTarget(int k); +void Swamola_SpawnRipples(int k); +void Sprite_Swamola_Ripples(int k); +void SwamolaRipples_Draw(int k); +void Swamola_Draw(int k); +void SpritePrep_Blind_PrepareBattle(int k); +void BlindLaser_SpawnTrailGarnish(int j); +void Sprite_Blind_Head(int k); +void Blind_SpawnHead(int k); +void Sprite_CE_Blind(int k); +void Sprite_BlindLaser(int k); +void Sprite_Blind_Blind_Blind(int k); +void Blind_FireballFlurry(int k, uint8 a); +int Blind_SpitFireball(int k, uint8 a); +int SpawnBossPoof(int k); +void Blind_Decelerate_X(int k); +void Blind_Decelerate_Y(int k); +void Blind_CheckBumpDamage(int k); +void Blind_Animate(int k); +void Blind_AnimateRobes(int k); +void Blind_SpawnLaser(int k); +void Blind_Draw(int k); +void TrinexxComponents_Initialize(int k); +void Trinexx_RestoreXY(int k); +void Trinexx_CachePosition(int k); +void Sprite_Trinexx_FinalPhase(int k); +void Sprite_TrinexxD_Draw(int k); +void Sprite_Trinexx_CheckDamageToFlashingSegment(int k); +void Sprite_CB_TrinexxRockHead(int k); +void Trinexx_WagTail(int k); +void Trinexx_HandleShellCollision(int k); +void SpriteDraw_TrinexxRockHead(int k, PrepOamCoordsRet *info); +void SpriteDraw_TrinexxRockHeadAndBody(int k); +void Sprite_Sidenexx(int k); +void Sidenexx_ExhaleDanger(int k); +void Sidenexx_Explode(int k); +void TrinexxHead_Draw(int k); +void Sprite_CC_CD_Common(int k); +void Sprite_CD_SpawnGarnish(int k); +void Sprite_TrinexxFire_AddFireGarnish(int k); +int Garnish_FlameTrail(int k, bool is_low); +void Sprite_CA_ChainChomp(int k); +void ChainChomp_MoveChain(int k); +void ChainChomp_HandleLeash(int k); +void ChainChomp_Draw(int k); +void Sprite_C9_Tektite(int k); +void Sprite_Tektite(int k); +void Tektite_Draw(int k); +void Sprite_C8_BigFairy(int k); +void Sprite_FairyCloud(int k); +void Sprite_BigFairy(int k); +void BigFaerie_Draw(int k); +void FaerieCloud_Draw(int k); +void Sprite_C7_Pokey(int k); +void Hokbok_Draw(int k); +void Sprite_C5_Medusa(int k); +void Sprite_C6_4WayShooter(int k); +void Sprite_C4_Thief(int k); +uint8 Thief_ScanForBooty(int k); +void Thief_TargetBooty(int k, int j); +void Thief_GrabBooty(int k, int j); +void Thief_CheckCollisionWithLink(int k); +void Thief_SpillItems(int k); +void Thief_Draw(int k); +void Sprite_C3_Gibo(int k); +void Gibo_Draw(int k); +void Sprite_C2_Boulder(int k); +void Boulder_OutdoorsMain(int k); +void Boulder_Draw(int k); +void SpriteDraw_BigShadow(int k, int anim); +void Sprite_DrawLargeShadow2(int k); +void CutsceneAgahnim_SpawnZeldaOnAltar(int k); +void Sprite_C1_CutsceneAgahnim(int k); +void CutsceneAgahnim_Agahnim(int k); +int Sprite_Agahnim_ApplyMotionBlur(int k); +void ChattyAgahnim_Draw(int k, PrepOamCoordsRet *info); +void SpriteDraw_CutsceneAgahnimSpell(int k, PrepOamCoordsRet *info); +void Sprite_CutsceneAgahnim_Zelda(int k); +void AltarZelda_DrawBody(int k, PrepOamCoordsRet *info); +void SpriteDraw_AltarZeldaWarp(int k); +void Sprite_InitializedSegmented(int k); +void GiantMoldorm_Draw(int k); +void GiantMoldorm_IncrementalSegmentExplosion(int k); +void SpriteDraw_Moldorm_Head(int k); +void SpriteDraw_Moldorm_SegmentC(int k); +void Moldorm_HandleTail(int k); +void SpriteDraw_Moldorm_Tail(int k); +void SpriteDraw_Moldorm_Eyeballs(int k, PrepOamCoordsRet *info); +void Sprite_ScheduleBossForDeath(int k); +void Sprite_MakeBossExplosion(int k); +void Sprite_MakeBossDeathExplosion_NoSound(int k); +void Vulture_Draw(int k); +void Sprite_Raven(int k); +void Vitreous_SpawnSmallerEyes(int k); +void Sprite_C0_Catfish(int k); +void Sprite_Catfish_QuakeMedallion(int k); +void Catfish_BigFish(int k); +int Sprite_SpawnBomb(int k); +void Catfish_RegurgitateMedallion(int k); +void Sprite_Zora_RegurgitateFlippers(int k); +void Catfish_SpawnPlop(int k); +int Sprite_SpawnWaterSplash(int k); +void GreatCatfish_Draw(int k); +void Sprite_Catfish_SplashOfWater(int k); +void Sprite_BF_Lightning(int k); +void Lightning_SpawnGarnish(int k); +void Sprite_BD_Vitreous(int k); +void Vitreous_Animate(int k, uint8 a); +void Vitreous_SetMinionsForth(int k); +void Sprite_SpawnLightning(int k); +void Vitreous_Draw(int k); +void Sprite_BE_VitreousEye(int k); +void HelmasaurFireball_TriSplit(int k); +void HelmasaurFireball_QuadSplit(int k); +void Sprite_ArmosCrusher(int k); +void Sprite_EvilBarrier(int k); +void EvilBarrier_Draw(int k); +void SpriteDraw_Antfairy(int k); +void Toppo_Flustered(int k); +void Goriya_Draw(int k); +void Moldorm_Draw(int k); +void TalkingTree_Mouth(int k); +void TalkingTree_SpawnBomb(int k); +void TalkingTree_Draw(int k); +void TalkingTree_Eye(int k); +void SpritePrep_TalkingTree_SpawnEyeball(int k, int dir); +void RupeePull_SpawnPrize(int k); +void Sprite_D5_DigGameGuy(int k); +void DiggingGameGuy_Draw(int k); +void OldMountainMan_Draw(int k); +void HelmasaurKing_Initialize(int k); +void HelmasaurKing_Reinitialize(int k); +void Sprite_92_HelmasaurKing(int k); +void HelmasaurKing_HandleMovement(int k); +bool HelmasaurKing_MaybeFireball(int k); +void HelmasaurKing_SwingTail(int k); +void HelmasaurKing_CheckMaskDamageFromHammer(int k); +void HelmasaurKing_AttemptDamage(int k); +void HelmasaurKing_ChipAwayAtMask(int k); +void HelmasaurKing_ExplodeMask(int k); +void HelmasaurKing_SpawnMaskDebris(int k); +void HelmasaurKing_SpitFireball(int k); +void HelmasaurKing_Draw(int k); +void SpriteDraw_KingHelmasaur_Eyes(int k, PrepOamCoordsRet *info); +void KingHelmasaurMask(int k, PrepOamCoordsRet *info); +void KingHelmasaur_CheckBombDamage(int k, int j); +void SpriteDraw_KingHelmasaur_Body(int k, PrepOamCoordsRet *info); +void SpriteDraw_KingHelmasaur_Legs(int k, PrepOamCoordsRet *info); +void SpriteDraw_KingHelmasaur_Mouth(int k, PrepOamCoordsRet *info); +void KingHelmasaur_OperateTail(int k, PrepOamCoordsRet *info); +void Sprite_MadBatterBolt(int k); +void Sprite_AA_Pikit(int k); +void Sprite_A8_GreenZirro(int k); +void Zirro_DropBomb(int k); +void Sprite_StalfosBone(int k); +void StalfosBone_Draw(int k); +void Sprite_A7_Stalfos(int k); +void Stalfos_Skellington(int k); +void Sprite_Zazak_Main(int k); +int Sprite_SpawnFirePhlegm(int k); +void Stalfos_ThrowBone(int k); +void FirePhlegm_Draw(int k); +void Sprite_A3_KholdstareShell(int k); +void GenerateIceball(int k); +void Sprite_A2_Kholdstare(int k); +void Kholdstare_SpawnPuffCloudGarnish(int k); +void Sprite_A4_FallingIce(int k); +void IceBall_Split(int k); +void Sprite_A1_Freezor(int k); +void Sprite_9E_HauntedGroveOstritch(int k); +void FluteBoyOstrich_Draw(int k); +void Sprite_9F_HauntedGroveRabbit(int k); +void Sprite_A0_HauntedGroveBird(int k); +void HauntedGroveBird_Blink(int k); +void Sprite_9C_Zoro(int k); +void Zoro(int k); +void Babasu(int k); +void Sprite_9B_Wizzrobe(int k); +void Wizzrobe_FireBeam(int k); +void Sprite_9A_Kyameron(int k); +void Kyameron_Draw(int k); +void Sprite_99_Pengator(int k); +void Pengator_Draw(int k); +void Sprite_LaserBeam(int k); +void LaserBeam_BuildUpGarnish(int k); +void Sprite_95_LaserEyeLeft(int k); +void LaserEye_FireBeam(int k); +void LaserEye_Draw(int k); +void Sprite_94_Pirogusu(int k); +void Pirogusu_SpawnSplash(int k); +void Pirogusu_Draw(int k); +void Sprite_93_Bumper(int k); +void Bumper_Draw(int k); +void Sprite_91_StalfosKnight(int k); +void StalfosKnight_Draw(int k); +void SpriteDraw_StalfosKnight_Head(int k, PrepOamCoordsRet *info); +void Sprite_90_Wallmaster(int k); +void WallMaster_Draw(int k); +void Sprite_8F_Blob(int k); +void Zol_Draw(int k); +void Sprite_8E_Terrorpin(int k); +void Terrorpin_CheckForHammer(int k); +void Terrorpin_SetUpHammerHitBox(int k, SpriteHitBox *hb); +void Sprite_8C_Arrghus(int k); +void Arrghus_Draw(int k); +void Arrghus_HandlePuffs(int k); +void Sprite_8D_Arrghi(int k); +void Sprite_8B_Gibdo(int k); +void Gibdo_Draw(int k); +void Sprite_89_MothulaBeam(int k); +void Sprite_94_Tile(int k); +void FlyingTile_Draw(int k); +void Sprite_8A_SpikeBlock(int k); +bool SpikeBlock_CheckStatueCollision(int k); +void Sprite_88_Mothula(int k); +void Mothula_Main(int k); +void Mothula_FlapWings(int k); +void Mothula_SpawnBeams(int k); +void Mothula_HandleSpikes(int k); +void Sprite_86_Kodongo(int k); +void Kodongo_SetDirection(int k); +void Kodongo_SpawnFire(int k); +void Sprite_87_KodongoFire(int k); +void Flame_Draw(int k); +void Sprite_85_YellowStalfos(int k); +void YellowStalfos_Animate(int k); +void YellowStalfos_EmancipateHead(int k); +void YellowStalfos_Draw(int k); +void YellowStalfos_DrawHead(int k, PrepOamCoordsRet *info); +void SpritePrep_Eyegore(int k); +void Sprite_83_GreenEyegore(int k); +void Eyegore_Main(int k); +void Eyegore_Draw(int k); +void SpritePrep_AntifairyCircle(int k); +void Sprite_82_AntifairyCircle(int k); +void Sprite_81_Hover(int k); +void Sprite_AB_CrystalMaiden(int k); +void CrystalMaiden_RunCutscene(int k); +void Sprite_7D_BigSpike(int k); +void SpikeTrap_Draw(int k); +void Sprite_7E_Firebar_Clockwise(int k); +void Firebar_Main(int k); +void Sprite_80_Firesnake(int k); +void Firesnake_SpawnFireball(int j); +void Sprite_7C_GreenStalfos(int k); +void Sprite_7A_Agahnim(int k); +void Agahnim_PerformAttack(int k); +void Agahnim_Draw(int k); +void Sprite_7B_AgahnimBalls(int k); +void CreateSixBlueBalls(int k); +void SeekerEnergyBall_Draw(int k); +void Sprite_79_Bee(int k); +void Bee_DormantHive(int k); +void SpawnBeeFromHive(int k); +void InitializeSpawnedBee(int k); +int ReleaseBeeFromBottle(); +void Bee_Main(int k); +int Sprite_Find_EmptyBottle(); +void Bee_HandleInteractions(int k); +void Sprite_B2_PlayerBee(int k); +void GoldBee_SpawnSelf(int k); +void Bee_HandleZ(int k); +bool PlayerBee_FindTarget(int k, Point16U *pt); +void Bee_Bzzt(int k); +void Sprite_B3_PedestalPlaque(int k); +void Sprite_B4_PurpleChest(int k); +void Sprite_B5_BombShop(int k); +void Sprite_BombShop_Clerk(int k); +void Sprite_BombShop_Bomb(int k); +void Sprite_BombShop_SuperBomb(int k); +void Sprite_BombShop_Huff(int k); +void BombShop_ClerkExhalation(int k); +void BombShopEntity_Draw(int k); +void Sprite_B6_Kiki(int k); +void Kiki_Flee(int k); +void Kiki_OfferInitialService(int k); +void Kiki_OfferEntranceService(int k); +bool Kiki_Draw(int k); +void Sprite_B7_BlindMaiden(int k); +void OldMan_RevertToSprite(int k); +void OldMan_EnableCutscene(); +void Sprite_AD_OldMan(int k); +void Sprite_B8_DialogueTester(int k); +void Sprite_B9_BullyAndPinkBall(int k); +void Sprite_PinkBall(int k); +void PinkBall_HandleDeceleration(int k); +void PinkBall_Distress(int k); +void Sprite_Bully(int k); +void Bully_Draw(int k); +void BallGuy_PlayBounceNoise(int k); +void SpawnBully(int k); +void PinkBall_HandleMessage(int k); +void Bully_HandleMessage(int k); +void Sprite_BA_Whirlpool(int k); +void Sprite_BB_Shopkeeper(int k); +void Shopkeeper_StandardClerk(int k); +void ChestGameGuy(int k); +void NiceThief_Animate(int k); +void NiceThiefWithGift(int k); +void MiniChestGameGuy(int k); +void LostWoodsChestGameGuy(int k); +void NiceThiefUnderRock(int k); +void ShopItem_RedPotion150(int k); +void ShopKeeper_SpawnShopItem(int k, int pos, int what); +void ShopItem_FighterShield(int k); +void ShopItem_FireShield(int k); +void ShopItem_MakeShieldsDeflect(int k); +void ShopItem_Heart(int k); +void ShopItem_Arrows(int k); +void ShopItem_Bombs(int k); +void ShopItem_Bee(int k); +void ShopItem_HandleReceipt(int k, uint8 item); +void ShopItem_PlayBeep(int k); +bool ShopItem_CheckForAPress(int k); +bool ShopItem_HandleCost(int amt); +void SpriteDraw_ShopItem(int k); +void Sprite_AC_Apple(int k); +void SpawnApple(int k); +void Sprite_Apple(int k); +void Sprite_BC_Drunkard(int k); +void SomariaPlatform_LocatePath(int k); +void Sprite_SomariaPlatform(int k); +void SomariaPlatformAndPipe_HandleMovement(int k); +uint8 SomariaPlatformAndPipe_CheckTile(int k); +void SomariaPlatform_Draw(int k); +void SomariaPlatform_HandleJunctions(int k); +void SomariaPlatform_HandleDragX(int k); +void SomariaPlatform_HandleDragY(int k); +void SomariaPlatform_HandleDrag(int k); +void SomariaPlatform_DragLink(int k); +void Sprite_AE_Pipe_Down(int k); +void Pipe_HandlePlayerMovement(uint8 dir); +void Faerie_HandleMovement(int k); diff --git a/tables/.gitignore b/tables/.gitignore new file mode 100644 index 00000000..c4b3dddd --- /dev/null +++ b/tables/.gitignore @@ -0,0 +1,10 @@ +dialogue.txt +generated_*.h +linksprite.png +map32_to_map16.txt +music_info.yaml +sfx.txt +/sound +sound_ending.txt +sound_indoor.txt +sound_intro.txt \ No newline at end of file diff --git a/tables/compile_music.py b/tables/compile_music.py new file mode 100644 index 00000000..ff8d9faf --- /dev/null +++ b/tables/compile_music.py @@ -0,0 +1,451 @@ +import array +import sys +import yaml +import re +import util + +class Song: + name = 'Song' + def __str__(self): + s = '[Song_0x%x idx=%d]\n' % (self.ea, self.index) + s += "".join(x.name + '\n' for x in self.phrases) + return s + +class Phrase: + name = 'Phrase' + def __str__(self): + s = '[%s]' % (self.name) + return s + +class PhraseLoop: + name = 'PhraseLoop' + def __init__(self, loops, jmp): + self.loops = loops + self.jmp = jmp + self.name = 'PhraseLoop %d %d' % (self.loops, self.jmp) + def __str__(self): + return self.name + +class Pattern: + name = 'Pattern' + +class SfxPattern: + name = 'SfxPattern' + +class SongList: + name = 'SongList' + +class SfxList: + name = 'SfxList' + +types_for_name = {} + +def get_type_for_name(nam, tp, is_create): + if nam == 'None': + assert not is_create + return None + a = types_for_name.get(nam) + if a != None: + if is_create: + if a.defined: + raise Exception('%s already defined' % nam) + a.defined = True + assert type(a) == tp, (nam, type(a), tp) + return a + a = tp() + a.name = nam + a.defined = is_create + types_for_name[nam] = a + a.ea = None + if '_0x' in nam: + a.ea = int(nam[nam.index('_0x') + 3:], 16) + return a + +def process_song(caption, args, lines): + song = get_type_for_name(caption, Song, True) + song.phrases = [] + for line in lines: + line_cmd, *line_args = line.split(' ') + if line_cmd == 'PhraseLoop': + song.phrases.append(PhraseLoop(int(line_args[0]), int(line_args[1]))) + else: + song.phrases.append(get_type_for_name(line_cmd, Phrase, False)) + return song + +def process_song_list(caption, args, lines): + song_list = get_type_for_name(caption, SongList, True) + song_list.songs = [get_type_for_name(line, Song, False) for line in lines] + return song_list + +def process_phrase(caption, args, lines): + phrase = get_type_for_name(caption, Phrase, True) + assert len(lines)==8 + phrase.patterns = [get_type_for_name(lines[i], Pattern, False) for i in range(8)] + return phrase + +kEffectByteLength = [1, 1, 2, 3, 0, 1, 2, 1, 2, 1, 1, 3, 0, 1, 2, 3, 1, 3, 3, 0, 1, 3, 0, 3, 3, 3, 1] +kEffectNames = ['Instrument', 'Pan', 'PanFade', 'Vibrato', 'VibratoOff', + 'SongVolume', 'SongVolumeFade', 'Tempo', 'TempoFade', + 'Transpose', 'ChannelTranpose', 'Tremolo', 'TremoloOff', + 'Volume', 'VolumeFade', 'Call', 'VibratoFade', + 'PitchEnvelopeTo', 'PitchEnvelopeFrom', 'PitchEnvelopeOff', + 'FineTune', 'EchoEnable', 'EchoOff', 'EchoSetup', 'EchoVolumeFade', + 'PitchSlide', 'PercussionDefine'] +kEffectNamesDict = {a:i for i, a in enumerate(kEffectNames)} +kKeys = ['C-', 'C#', 'D-', 'D#', 'E-', 'F-', 'F#', 'G-', 'G#', 'A-', 'A#', 'B-'] +kKeysDict = {a+str(j+1):i+j*12 for i, a in enumerate(kKeys) for j in range(6)} +kKeysDict['-+-'] = 72 +kKeysDict['---'] = 73 + +def process_pattern(caption, args, lines): + pattern = get_type_for_name(caption, Pattern, True) + pattern.lines = [] + pattern.fallthrough = False + for line in lines: + assert not pattern.fallthrough + line_cmd, *line_args = line.split() + if line_cmd == 'Call': + assert len(line_args) == 2 + pattern.lines.append(('Call', (get_type_for_name(line_args[0], Pattern, False),int(line_args[1]) ), None, None)) + elif line_cmd == 'Fallthrough': + pattern.fallthrough = True + elif line_cmd in kEffectNamesDict: + line_args = [int(a) for a in line_args] + pattern.lines.append((line_cmd, line_args, None, None)) + elif line_cmd in kKeysDict: + assert len(line_args) == 2, line_args + note_length = None if line_args[0] == '--' else int(line_args[0]) + volstuff = None if line_args[1] == '--' else int(line_args[1], 16) + pattern.lines.append((line_cmd, line_args, note_length, volstuff)) + else: + assert 0, repr(line_cmd) + return pattern + +def process_sfx_pattern(caption, args, lines): + pattern = get_type_for_name(caption, SfxPattern, True) + pattern.lines = lines + return pattern + +def write_sfx_pattern(serializer, o): +# print('# Creating %s (%x)' % ( o.name, serializer.addr)) + for i,line in enumerate(o.lines): +# print(line) + line_cmd, *line_args = re.split(r' +', line) + if line_cmd == 'SetInstrument': + assert len(line_args) == 1 + serializer.write([0xe0, int(line_args[0])]) + elif line_cmd == 'Restart': + serializer.write([0xff]) + assert i == len(o.lines) - 1 + return + elif line_cmd == 'Fallthrough': + assert i == len(o.lines) - 1 + return + elif line_cmd in kKeysDict or line_cmd == '.': + if line_args[0] != '--': + serializer.write((int(line_args[0]),)) + if line_args[1] != '---': + serializer.write((int(line_args[1]),)) + if line_args[2] != '---': + serializer.write((int(line_args[2]),)) + if len(line_args) >= 4: + assert line_args[3] == 'PitchSlide' + if line_cmd == '.': + serializer.write([0xf1, int(line_args[4]), int(line_args[5]), int(line_args[6])]) + else: + serializer.write([0xf9, kKeysDict[line_cmd] | 0x80, int(line_args[4]), int(line_args[5]), int(line_args[6])]) + else: + serializer.write([kKeysDict[line_cmd] | 0x80]) + else: + assert 0, repr(line_cmd) + serializer.write([0]) + +def process_sfx_list(caption, args, lines): + sfx_list = get_type_for_name(caption, SfxList, True) + sfx_list.patterns = [] + sfx_list.next = [] + sfx_list.echo = [] + for line in lines: + r = line.split(',') + sfx_list.patterns.append(get_type_for_name(r[0], SfxPattern, False)) + sfx_list.next.append(int(r[1])) + if len(r) >= 3: + sfx_list.echo.append(int(r[2])) + assert len(sfx_list.echo) in (0, len(lines)) + return sfx_list + +def write_sfx_list(serializer, o): + for line in o.patterns: + serializer.write_reloc_entry(line) + for next in o.next: + serializer.write([next]) + for i in o.echo: + serializer.write([i]) + +kGapStartAddrs = (0x2b00, 0x2880, 0xd000) + +class Serializer: + def __init__(self): + self.memory = [None] * 65536 + self.relocs = [] + self.addr = None + + def write(self, data): + for d in data: + assert self.memory[self.addr] == None, '0x%x' % self.addr + self.memory[self.addr] = d + self.addr += 1 + + def write_at(self, a, data): + for d in data: + self.memory[a] = d + a += 1 + + def write_word(self, a, v): + self.memory[a] = v & 0xff + self.memory[a + 1] = v >> 8 & 0xff + + + def write_reloc_entry(self, r): + self.write([0, 0]) + if r: + self.relocs.append((self.addr - 2, r)) + + + def write_song(self, song): + for phrase in song.phrases: + if isinstance(phrase, PhraseLoop): + i = self.addr + phrase.jmp * 2 + self.write([phrase.loops, 0]) + self.write([i & 0xff, i >> 8]) + else: + self.write_reloc_entry(phrase) + self.write([0, 0]) + + def write_phrase(self, phrase): + for i in range(8): + self.write_reloc_entry(phrase.patterns[i]) + + def write_song_list(self, song_list): + for song in song_list.songs: + self.write_reloc_entry(song) + + def write_pattern(self, patt): + for cmd, args, note_length, volstuff in patt.lines: + #print(cmd, args, note_length, volstuff) + if note_length != None: self.write((note_length, )) + if volstuff != None: self.write((volstuff, )) + if cmd in kKeysDict: + self.write((0x80 | kKeysDict[cmd], )) + elif cmd == 'Call': + self.write([0xef, 0, 0, int(args[1])]) + self.relocs.append((self.addr - 3, args[0])) + elif cmd in kEffectNamesDict: + i = kEffectNamesDict[cmd] + assert len(args) == kEffectByteLength[i] + self.write([0xe0 + i]) + self.write(args) + if not patt.fallthrough: + self.write((0, )) + + def write_obj(self, what): + # print(what.name, self.addr, what.ea) + # print('Writing %s at 0x%x. Curr pos 0x%x' % (what.name, what.ea, 0 if self.addr == None else self.addr)) + if what.ea != None: + + if self.addr == None or what.ea in kGapStartAddrs:# or True:#what.ea >= self.addr: + self.addr = what.ea + elif what.ea != self.addr: + print('%s: 0x%x != 0x%x' % (what.name, what.ea, self.addr)) + assert(0) + + what.write_addr = self.addr + assert self.addr != None + if isinstance(what, Phrase): + self.write_phrase(what) + elif isinstance(what, Pattern): + self.write_pattern(what) + elif isinstance(what, Song): + self.write_song(what) + elif isinstance(what, SongList): + self.write_song_list(what) + elif isinstance(what, SfxPattern): + write_sfx_pattern(self, what) + elif isinstance(what, SfxList): + write_sfx_list(self, what) + else: + print(type(what)) + assert(0) + + def write_zeros(self, a, b): + while a < b: + self.memory[a] = 0 + a += 1 + + def process_relocs(self): + for p, r in self.relocs: + self.memory[p + 0] = r.write_addr & 0xff + self.memory[p + 1] = r.write_addr >> 8 + +def process_file(file): + sorted_ents = [] + def add_collect(heading, collect): + caption, *args = heading.strip('[]').split(' ', 1) + if caption.startswith('Song_'): + r = process_song(caption, args, collect) + elif caption.startswith('Phrase_'): + r = process_phrase(caption, args, collect) + elif caption.startswith('Pattern_'): + r = process_pattern(caption, args, collect) + elif caption.startswith('SongList_'): + r = process_song_list(caption, args, collect) + elif caption.startswith('Sfx_'): + r = process_sfx_pattern(caption, args, collect) + elif caption.startswith('SfxPort'): + r = process_sfx_list(caption, args, collect) + else: + assert 0 + sorted_ents.append(r) + collect = None + heading = None + for line in file: + line = line.strip() + if line == '' or line.startswith('#'): continue + if line.startswith('['): + if heading != None: + add_collect(heading, collect) + heading = line + collect = [] + # + #print(caption, args) + else: + collect.append(line.strip('\n')) + if heading != None: + add_collect(heading, collect) + return sorted_ents + +def serialize_song(serializer, song, sorted_ents): + if song == 'intro': +# serializer.write_zeros(0x2a8b, 0x2b00) +# serializer.write_zeros(0x3188, 0x4000) + # serializer.write_zeros(0xbaa0, 0xd000) + # serializer.write_zeros(0xfdae, 0x10000) + # serializer.write_zeros(0x2850, 0x2880) + serializer.addr = 0x4000 + sample_to_addr = {} + music_info = yaml.safe_load(open('music_info.yaml', 'r')) + for i, info in enumerate(music_info['samples']): + if info['file'] not in sample_to_addr: + sample_to_addr[info['file']] = serializer.addr + serializer.write(open('%s.brr' % info['file'], 'rb').read()) + addr = sample_to_addr[info['file']] + serializer.write_word(0x3c00 + i * 4, addr) + serializer.write_word(0x3c00 + i * 4 + 2, addr + info['repeat'] // 16 * 9 if 'repeat' in info else serializer.addr) + for i in range(6): + serializer.write_word(0x3c64 + i * 2, 0xffff) + + for i, info in enumerate(music_info['instruments']): + ea = 0x3d00 + i * 6 + serializer.memory[ea + 0] = info['sample'] + serializer.memory[ea + 1] = 0x80 | info['decay'] << 4 | info['attack'] + serializer.memory[ea + 2] = info['sustain_level'] << 5 | info['sustain_rate'] + serializer.memory[ea + 3] = info['vxgain'] + serializer.memory[ea + 4] = info['pitch_base'] >> 8 + serializer.memory[ea + 5] = info['pitch_base'] & 0xff + + serializer.write_at(0x3D96, music_info['note_gate_off']) + serializer.write_at(0x3D9e, music_info['note_volume']) + + for i, info in enumerate(music_info['sfx_instruments']): + ea = 0x3e00 + i * 9 + serializer.memory[ea + 0] = info['voll'] + serializer.memory[ea + 1] = info['volr'] + serializer.write_word(ea + 2, info['pitch']) + serializer.memory[ea + 4] = info['sample'] + serializer.memory[ea + 5] = 0x80 | info['decay'] << 4 | info['attack'] + serializer.memory[ea + 6] = info['sustain_level'] << 5 | info['sustain_rate'] + serializer.memory[ea + 7] = info['vxgain'] + serializer.memory[ea + 8] = info['pitch_base'] + + serializer.addr = None + for e in sorted_ents: + serializer.write_obj(e) + + if song == 'indoor': + t = types_for_name['Song_0x2880'] + t.defined = True + t.write_addr = 0x2880 + + + for e in types_for_name.values(): + if not e.defined: + raise Exception('Symbol %s not defined' % e.name) + + serializer.process_relocs() + +def compare_with_orig(serializer, song): + ranges=[] + ok = True + spc = open('sound/%s.spc' % song, 'rb').read() + for i in range(65536): + if serializer.memory[i] != None: + if serializer.memory[i]!= spc[i]: + print('0x%x: 0x%x != 0x%x' % (i, serializer.memory[i], spc[i])) + ok = False + else: +# serializer.memory[i] = spc[i] + if len(ranges) and ranges[-1][1] == i: + ranges[-1][1] = i + 1 + else: + ranges.append([i, i + 1]) + if __name__ == "__main__": + for a, b in ranges: + print('// undefined %x-%x' % (a, b)) + return ok + +def produce_loadable_seq(serializer): + r = [] + # count non zeros + start, i = 0, 0 + while start < 0x10000: + while i < 0x10000 and serializer.memory[i] != None: + i += 1 + j = i + while i < 0x10000 and serializer.memory[i] == None: + i += 1 + + if j == start: + start = i + continue + r.extend([(j - start) & 0xff, (j - start) >> 8, start & 0xff, start >> 8]) + r.extend(serializer.memory[start:j]) +# print('copy 0x%x - 0x%x (%d)' % (start, j, j - start)) + start = i + r.extend([0, 0]) + return r + +def print_song(song, f): + global types_for_name + types_for_name = {} + + serializer = Serializer() + + sorted_ents = process_file(open('sound_%s.txt' % song, 'r')) + if song == 'intro': + sorted_ents.extend(process_file(open('sfx.txt' , 'r'))) + + serialize_song(serializer, song, sorted(sorted_ents, key = lambda x: x.ea)) + + r = produce_loadable_seq(serializer) + + util.print_int_array('kSoundBank_%s' % song, r, 'uint8', False, 32, file = f) + + if not compare_with_orig(serializer, song): + raise Exception('compare failed') + +if __name__ == "__main__": + if len(sys.argv) == 1: + for song in ['intro', 'indoor', 'ending']: + print_song(song, sys.stdout) + else: + print_song(sys.argv[1], sys.stdout) diff --git a/tables/compile_resources.py b/tables/compile_resources.py new file mode 100644 index 00000000..e8c8ae6d --- /dev/null +++ b/tables/compile_resources.py @@ -0,0 +1,816 @@ +import sys +import text_compression +import util +from PIL import Image +import yaml +import tables +import compile_music + +print_int_array = util.print_int_array + +PATH = '' + +def flatten(xss): + return [x for xs in xss for x in xs] + +def invert_dict(xs): + return {s:i for i,s in xs.items()} + +def print_map32_to_map16(): + f = open(PATH+'generated_map32_to_map16.h', 'w') + tab = {} + for line in open(PATH + 'map32_to_map16.txt'): + line = line.strip() + x, xs = line.split(':', 1) + tab[int(x)] = [int(t) for t in xs.split(',')] + + def pack(*a): + res=[0] * 6 + res[0] = a[0] & 0xff + res[1] = a[1] & 0xff + res[2] = a[2] & 0xff + res[3] = a[3] & 0xff + res[4] = (a[0] >> 8) << 4 | (a[1] >> 8) + res[5] = (a[2] >> 8) << 4 | (a[3] >> 8) + return res + + res = [[],[],[],[]] + for i in range(0, len(tab), 4): + for j in range(4): + res[j].extend(pack(tab[i][j], tab[i+1][j], tab[i+2][j], tab[i+3][j])) + + print_int_array('kMap32ToMap16_0', res[0], 'uint8', True, 16, file = f) + print_int_array('kMap32ToMap16_1', res[1], 'uint8', True, 16, file = f) + print_int_array('kMap32ToMap16_2', res[2], 'uint8', True, 16, file = f) + print_int_array('kMap32ToMap16_3', res[3], 'uint8', True, 16, file = f) + f.close() + +def print_dialogue(): + f = open(PATH+'generated_dialogue.h', 'w') + new_r = [] + offs = [] + for line in open(PATH + 'dialogue.txt'): + line = line.strip('\n') + a, b = line.split(': ', 1) + index = int(a) + offs.append(len(new_r)) + r = text_compression.compress_string(b) + new_r.extend(r) + + print_int_array('kDialogueOffs', offs, 'uint16', True, 16, file = f) + print_int_array('kDialogueText', new_r, 'uint8', True, 16, file = f) + f.close() + +ROM = util.LoadedRom() + + +kCompSpritePtrs = [ + 0x10f000,0x10f600,0x10fc00,0x118200,0x118800,0x118e00,0x119400,0x119a00, + 0x11a000,0x11a600,0x11ac00,0x11b200,0x14fffc,0x1585d4,0x158ab6,0x158fbe, + 0x1593f8,0x1599a6,0x159f32,0x15a3d7,0x15a8f1,0x15aec6,0x15b418,0x15b947, + 0x15bed0,0x15c449,0x15c975,0x15ce7c,0x15d394,0x15d8ac,0x15ddc0,0x15e34c, + 0x15e8e8,0x15ee31,0x15f3a6,0x15f92d,0x15feba,0x1682ff,0x1688e0,0x168e41, + 0x1692df,0x169883,0x169cd0,0x16a26e,0x16a275,0x16a787,0x16aa06,0x16ae9d, + 0x16b3ff,0x16b87e,0x16be6b,0x16c13d,0x16c619,0x16cbbb,0x16d0f1,0x16d641, + 0x16d95a,0x16dd99,0x16e278,0x16e760,0x16ed25,0x16f20f,0x16f6b7,0x16fa5f, + 0x16fd29,0x1781cd,0x17868d,0x178b62,0x178fd5,0x179527,0x17994b,0x179ea7, + 0x17a30e,0x17a805,0x17acf8,0x17b2a2,0x17b7f9,0x17bc93,0x17c237,0x17c78e, + 0x17cd55,0x17d2bc,0x17d82f,0x17dcec,0x17e1cc,0x17e36b,0x17e842,0x17eb38, + 0x17ed58,0x17f06c,0x17f4fd,0x17fa39,0x17ff86,0x18845c,0x1889a1,0x188d64, + 0x18919d,0x189610,0x189857,0x189b24,0x189dd2,0x18a03f,0x18a4ed,0x18a7ba, + 0x18aedf,0x18af0d,0x18b520,0x18b953, +] + +kCompBgPtrs = [ + 0x11b800,0x11bce2,0x11c15f,0x11c675,0x11cb84,0x11cf4c,0x11d2ce,0x11d726, + 0x11d9cf,0x11dec4,0x11e393,0x11e893,0x11ed7d,0x11f283,0x11f746,0x11fc21, + 0x11fff2,0x128498,0x128a0e,0x128f30,0x129326,0x129804,0x129d5b,0x12a272, + 0x12a6fe,0x12aa77,0x12ad83,0x12b167,0x12b51d,0x12b840,0x12bd54,0x12c1c9, + 0x12c73d,0x12cc86,0x12d198,0x12d6b1,0x12db6a,0x12e0ea,0x12e6bd,0x12eb51, + 0x12f135,0x12f6c5,0x12fc71,0x138129,0x138693,0x138bad,0x139117,0x139609, + 0x139b21,0x13a074,0x13a619,0x13ab2b,0x13b00c,0x13b4f5,0x13b9eb,0x13bebf, + 0x13c3ce,0x13c817,0x13cb68,0x13cfb5,0x13d460,0x13d8c2,0x13dd7a,0x13e266, + 0x13e7af,0x13ece5,0x13f245,0x13f6f0,0x13fc30,0x1480e9,0x14863b,0x148a7c, + 0x148f2a,0x149346,0x1497ed,0x149cc2,0x14a173,0x14a61d,0x14ab5d,0x14b083, + 0x14b4bd,0x14b94e,0x14be0e,0x14c291,0x14c7ba,0x14cce4,0x14d1db,0x14d6bd, + 0x14db77,0x14ded1,0x14e2ac,0x14e754,0x14ebae,0x14ef4e,0x14f309,0x14f6f4, + 0x14fa55,0x14ff8c,0x14ff93,0x14ff9a,0x14ffa1,0x14ffa8,0x14ffaf,0x14ffb6, + 0x14ffbd,0x14ffc4,0x14ffcb,0x14ffd2,0x14ffd9,0x14ffe0,0x14ffe7,0x14ffee, + 0x14fff5,0x18b520,0x18b953, +] + +def compress_store(r): + rr = [] + j, jend = 0, len(r) + while j < jend: + n = min(jend - j, 1024) + rr.append(0xe0 | (n - 1) >> 8) + rr.append((n - 1) & 0xff) + rr.extend(r[j:j+n]) + j += n + rr.append(0xff) + return rr + +def print_images(): + rall = [] + f = open(PATH+'generated_images.h', 'w') + for i in range(12): + r = ROM.get_bytes(kCompSpritePtrs[i], 0x600) + rall.append('kSprGfx_%d' % i) + print_int_array('kSprGfx_%d' % i, r, 'uint8', True, 64, file = f) + + for i in range(12, 108): + decomp, comp_len = util.decomp(kCompSpritePtrs[i], ROM.get_byte, False, True) + r = ROM.get_bytes(kCompSpritePtrs[i], comp_len) + + #print('%d: %d -> %d' % (i, len(compress_store(decomp)), comp_len)) + rall.append('kSprGfx_%d' % i) + print_int_array('kSprGfx_%d' % i, r, 'uint8', True, 64, file = f) + + print_int_array('kSprGfx', rall, 'uint8 *const', None, 8, file = f) + + rall = [] + for i in range(len(kCompBgPtrs)): + decomp, comp_len = util.decomp(kCompBgPtrs[i], ROM.get_byte, False, True) + r = ROM.get_bytes(kCompBgPtrs[i], comp_len) + + #print('%d: %d -> %d' % (i, len(compress_store(decomp)), comp_len)) + rall.append('kBgGfx_%d' % i) + print_int_array('kBgGfx_%d' % i, r, 'uint8', True, 64, file = f) + + print_int_array('kBgGfx', rall, 'uint8 *const', None, 8, file = f) + + f.close() + + +def print_misc(): + f = open(PATH+'generated_overworld_map.h', 'w') + print_int_array('kOverworldMapGfx', ROM.get_bytes(0x18c000, 0x4000), 'uint8', True, 64, file = f) + print_int_array('kLightOverworldTilemap', ROM.get_bytes(0xac727, 4096), 'uint8', True, 64, file = f) + print_int_array('kDarkOverworldTilemap', ROM.get_bytes(0xaD727, 1024), 'uint8', True, 64, file = f) + f.close() + + f = open(PATH+'generated_predefined_tiles.h', 'w') + print_int_array('kPredefinedTileData', ROM.get_words(0x9B52, 6438), 'uint16', False, 16, file = f) + f.close() + + f = open(PATH+'generated_font.h', 'w') + print_int_array('kFontData', ROM.get_words(0xe8000, 2048), 'uint16', False, 16, file = f) + f.close() + + f = open(PATH+'generated_map16_to_map8.h', 'w') + print_int_array('kMap16ToMap8', ROM.get_words(0x8f8000, 3752 * 4), 'uint16', False, 16, file = f) + f.close() + + f = open(PATH+'generated_ancilla.h', 'w') + print_int_array('kGeneratedWishPondItem', ROM.get_bytes(0x888450, 256), 'uint8', False, 16, file = f) + print_int_array('kGeneratedBombosArr', ROM.get_bytes(0x8890FC, 256), 'uint8', False, 16, file = f) + f.close() + + f = open(PATH+'generated_ending.h', 'w') + print_int_array('kGeneratedEndSequence15', ROM.get_bytes(0x8ead25, 256), 'uint8', False, 16, file = f) + print_int_array('kEnding_Credits_Text', ROM.get_bytes(0x8EB178, 1989), 'uint8', False, 16, file = f) + print_int_array('kEnding_Credits_Offs', ROM.get_words(0x8EB93d, 394), 'uint16', False, 16, file = f) + print_int_array('kEnding_MapData', ROM.get_words(0x8EB038, 160), 'uint16', False, 16, file = f) + print_int_array('kEnding0_Offs', ROM.get_words(0x8EC2E1, 17), 'uint16', False, 16, file = f) + print_int_array('kEnding0_Data', ROM.get_bytes(0x8EBF4C, 917), 'uint8', False, 16, file = f) + f.close() + + f = open(PATH+'generated_palettes.h', 'w') + print_int_array('kPalette_DungBgMain', ROM.get_words(0x9BD734, 1800), 'uint16', False, 15, file = f) + print_int_array('kPalette_MainSpr', ROM.get_words(0x9BD218, 120), 'uint16', False, 15, file = f) + + print_int_array('kPalette_ArmorAndGloves', ROM.get_words(0x9BD308, 75), 'uint16', False, 15, file = f) + print_int_array('kPalette_Sword', ROM.get_words(0x9BD630, 12), 'uint16', False, 3, file = f) + print_int_array('kPalette_Shield', ROM.get_words(0x9BD648, 12), 'uint16', False, 4, file = f) + + print_int_array('kPalette_SpriteAux3', ROM.get_words(0x9BD39E, 84), 'uint16', False, 7, file = f) + print_int_array('kPalette_MiscSprite_Indoors', ROM.get_words(0x9BD446, 77), 'uint16', False, 7, file = f) + print_int_array('kPalette_SpriteAux1', ROM.get_words(0x9BD4E0, 168), 'uint16', False, 7, file = f) + + print_int_array('kPalette_OverworldBgMain', ROM.get_words(0x9BE6C8, 210), 'uint16', False, 7, file = f) + print_int_array('kPalette_OverworldBgAux12', ROM.get_words(0x9BE86C, 420), 'uint16', False, 21, file = f) + print_int_array('kPalette_OverworldBgAux3', ROM.get_words(0x9BE604, 98), 'uint16', False, 7, file = f) + print_int_array('kPalette_PalaceMapBg', ROM.get_words(0x9BE544, 96), 'uint16', False,16, file = f) + print_int_array('kPalette_PalaceMapSpr', ROM.get_words(0x9BD70A, 21), 'uint16', False,7, file = f) + print_int_array('kHudPalData', ROM.get_words(0x9BD660, 64), 'uint16', False, 16, file = f) + + print_int_array('kOverworldMapPaletteData', ROM.get_words(0x8ADB27, 256), 'uint16', False, 16, file = f) + + f.close() + +g_overworld_yaml_cache = {} +def load_overworld_yaml(room): + if room not in g_overworld_yaml_cache: + g_overworld_yaml_cache[room] = yaml.safe_load(open(PATH+'overworld/overworld-%d.yaml' % room, 'r')) + return g_overworld_yaml_cache[room] + + +def print_overworld(): + f = open(PATH+'generated_overworld.h', 'w') + + r = [] + for i in range(160): + addr = ROM.get_24(0x82F94D + i * 3) + decomp, comp_len = util.decomp(addr, ROM.get_byte, True, True) + r.append('kOverworld_Hibytes_Comp_%d' % i) + print_int_array('kOverworld_Hibytes_Comp_%d' % i, ROM.get_bytes(addr, comp_len), 'uint8', True, 64, file = f) + print_int_array('kOverworld_Hibytes_Comp', r, 'uint8 *const', None, 8, file = f) + + r = [] + for i in range(160): + addr = ROM.get_24(0x82FB2D + i * 3) + decomp, comp_len = util.decomp(addr, ROM.get_byte, True, True) + r.append('kOverworld_Lobytes_Comp_%d' % i) + print_int_array('kOverworld_Lobytes_Comp_%d' % i, ROM.get_bytes(addr, comp_len), 'uint8', True, 64, file = f) + print_int_array('kOverworld_Lobytes_Comp', r, 'uint8 *const', None, 8, file = f) + + f.close() + +def is_area_head(i): + return i >= 128 or ROM.get_byte(0x82A5EC + (i & 63)) == (i & 63) + +class OutArrays: + def __init__(self): + self.arrs = [] + def add(self, type, name, size, initializer = None, items_per_line = 16): + t = [initializer] * size + self.arrs.append((type, name, t, items_per_line)) + setattr(self, name, t) + def write(self, f): + for type, name, arr, items_per_line in self.arrs: + for i, j in enumerate(arr): + assert isinstance(j, int), (name, i, j, arr) + print_int_array(name, arr, type, True, items_per_line, file = f) + +def print_overworld_tables(): + A = OutArrays() + + A.add('uint8', 'kOverworldMapIsSmall', 192, initializer = 0, items_per_line = 8) + A.add('uint8', 'kOverworldAuxTileThemeIndexes', 128, items_per_line = 8) + A.add('uint8', 'kOverworldBgPalettes', 136, items_per_line = 8) + A.add('uint16', 'kOverworld_SignText', 128, items_per_line = 8) + A.add('uint8', 'kOwMusicSets', 256, items_per_line = 8) + A.add('uint8', 'kOwMusicSets2', 96, items_per_line = 8) + + def get_music_byte(h, tag): + return tables.kMusicNamesRev[h['music'][tag]] | tables.kAmbientSoundNameRev[h['ambient'][tag]] << 4 + + def get_loadoffs(c, d): + x, y = c[0] >> 4, c[1] >> 4 + x += d[0] + y += d[1] + return (y&0x3f) << 7 | (x&0x3f) << 1 + + def awrite(arr, area, key, value): + arr[key] = value + if area < 128 and not A.kOverworldMapIsSmall[area]: + arr[key + 1], arr[key + 8], arr[key + 9] = value, value, value + + loaded_areas = [(i, load_overworld_yaml(i)) for i in range(160) if is_area_head(i)] + + for i,y in loaded_areas: + h = y['Header'] + A.kOverworldMapIsSmall[i] = {'small':1, 'big':0}[h['size']] + if i < len(A.kOverworldAuxTileThemeIndexes): awrite(A.kOverworldAuxTileThemeIndexes, i, i, h['gfx']) + if i < len(A.kOverworldBgPalettes): awrite(A.kOverworldBgPalettes, i, i, h['palette']) + if i < len(A.kOverworld_SignText): awrite(A.kOverworld_SignText, i, i, h['sign_text']) + if i < 64: + awrite(A.kOwMusicSets, i, i, get_music_byte(h, 'beginning')) + awrite(A.kOwMusicSets, i, i + 64, get_music_byte(h, 'zelda')) + awrite(A.kOwMusicSets, i, i + 128, get_music_byte(h, 'sword')) + awrite(A.kOwMusicSets, i, i + 192, get_music_byte(h, 'agahnim')) + elif i < 64 + 96: + awrite(A.kOwMusicSets2, i, i - 64, get_music_byte(h, 'agahnim')) + + for a in ['kBirdTravel_ScreenIndex', 'kBirdTravel_Map16LoadSrcOff', 'kBirdTravel_ScrollX', + 'kBirdTravel_ScrollY', 'kBirdTravel_LinkXCoord', 'kBirdTravel_LinkYCoord', + 'kBirdTravel_CameraXScroll', 'kBirdTravel_CameraYScroll']: + A.add('uint16', a, 17) + A.add('int8', 'kBirdTravel_Unk1', 17) + A.add('int8', 'kBirdTravel_Unk3', 17) + A.add('uint16', 'kWhirlpoolAreas', 8) + + next_whirlpool_id = 0 + for i, y in loaded_areas: + for t in y['Travel']: + if 'bird_travel_id' in t: + j = t['bird_travel_id'] + else: + A.kWhirlpoolAreas[next_whirlpool_id] = t['whirlpool_src_area'] + j = next_whirlpool_id + 9 + next_whirlpool_id += 1 + base_x, base_y = (i & 7) << 9, (i & 56) << 6 + A.kBirdTravel_ScreenIndex[j] = i + A.kBirdTravel_Map16LoadSrcOff[j] = get_loadoffs(t['scroll_xy'], t['load_xy']) + A.kBirdTravel_ScrollX[j] = t['scroll_xy'][0] + base_x + A.kBirdTravel_ScrollY[j] = t['scroll_xy'][1] + base_y + A.kBirdTravel_LinkXCoord[j] = t['xy'][0] + base_x + A.kBirdTravel_LinkYCoord[j] = t['xy'][1] + base_y + A.kBirdTravel_CameraXScroll[j] = t['camera_xy'][0] + base_x + A.kBirdTravel_CameraYScroll[j] = t['camera_xy'][1] + base_y + A.kBirdTravel_Unk1[j] = t['unk'][0] + A.kBirdTravel_Unk3[j] = t['unk'][1] + + A.add('uint16', 'kOverworld_Entrance_Area', 129) + A.add('uint16', 'kOverworld_Entrance_Pos', 129) + A.add('uint8', 'kOverworld_Entrance_Id', 129) + + for i, y in loaded_areas: + for e in y['Entrances']: + j = e['index'] + assert A.kOverworld_Entrance_Id[j] == None + A.kOverworld_Entrance_Area[j] = i + A.kOverworld_Entrance_Id[j] = e['entrance_id'] + A.kOverworld_Entrance_Pos[j] = e['x'] << 1 | e['y'] << 7 + + A.add('uint16', 'kFallHole_Area', 19) + A.add('uint16', 'kFallHole_Pos', 19) + A.add('uint8', 'kFallHole_Entrances', 19) + + holes = [] + for i, y in loaded_areas: + if 'Holes' not in y: continue + for e in y['Holes']: + x, y, j = e['x'], e['y'], e['entrance_id'] + holes.append((j, x << 1 | ((y - 8) & 0x3f) << 7, i)) + for i, (entrance, pos, area) in enumerate(sorted(holes)): + A.kFallHole_Area[i] = area + A.kFallHole_Pos[i] = pos + A.kFallHole_Entrances[i] = entrance + + A.add('uint8', 'kExitData_ScreenIndex', 79) + for a in ['kExitDataRooms', 'kExitData_Map16LoadSrcOff', 'kExitData_ScrollX', + 'kExitData_ScrollY', 'kExitData_XCoord', 'kExitData_YCoord', + 'kExitData_CameraXScroll', 'kExitData_CameraYScroll']: + A.add('uint16', a, 79) + A.add('uint16', 'kExitData_NormalDoor', 79, initializer = 0) + A.add('uint16', 'kExitData_FancyDoor', 79, initializer = 0) + A.add('int8', 'kExitData_Unk1', 79) + A.add('int8', 'kExitData_Unk3', 79) + + A.add('uint16', 'kSpExit_Top', 16, initializer = 0) + A.add('uint16', 'kSpExit_Bottom', 16, initializer = 0) + A.add('uint16', 'kSpExit_Left', 16, initializer = 0) + A.add('uint16', 'kSpExit_Right', 16, initializer = 0) + A.add('int16', 'kSpExit_Tab4', 16, initializer = 0) + A.add('int16', 'kSpExit_Tab5', 16, initializer = 0) + A.add('int16', 'kSpExit_Tab6', 16, initializer = 0) + A.add('int16', 'kSpExit_Tab7', 16, initializer = 0) + A.add('uint16', 'kSpExit_LeftEdgeOfMap', 16, initializer = 0) + A.add('uint8', 'kSpExit_Dir', 16, initializer = 0) + A.add('uint8', 'kSpExit_SprGfx', 16, initializer = 0) + A.add('uint8', 'kSpExit_AuxGfx', 16, initializer = 0) + A.add('uint8', 'kSpExit_PalBg', 16, initializer = 0) + A.add('uint8', 'kSpExit_PalSpr', 16, initializer = 0) + + for i, y in loaded_areas: + for e in y['Exits']: + j = e['index'] + base_x, base_y = (i & 7) << 9, (i & 56) << 6 + assert A.kExitData_ScreenIndex[j] == None + A.kExitData_ScreenIndex[j] = i + room = e['room'] + A.kExitDataRooms[j] = e['room'] + A.kExitData_Map16LoadSrcOff[j] = get_loadoffs(e['scroll_xy'], e['load_xy']) + A.kExitData_ScrollX[j] = e['scroll_xy'][0] + base_x + A.kExitData_ScrollY[j] = e['scroll_xy'][1] + base_y + A.kExitData_XCoord[j] = e['xy'][0] + base_x + A.kExitData_YCoord[j] = e['xy'][1] + base_y + A.kExitData_CameraXScroll[j] = e['camera_xy'][0] + base_x + A.kExitData_CameraYScroll[j] = e['camera_xy'][1] + base_y + A.kExitData_Unk1[j] = e['unk'][0] + A.kExitData_Unk3[j] = e['unk'][1] + door = e.get('door') + if door != None: + if door[0] in ('bombable', 'wooden'): + A.kExitData_NormalDoor[j] = door[1] << 1 | door[2] << 7 | (0x8000 if door[0] == 'bombable' else 0) + elif door[0] in ('palace', 'sanctuary'): + A.kExitData_FancyDoor[j] = door[1] << 1 | door[2] << 7 | (0x8000 if door[0] == 'palace' else 0) + else: + assert e[0] == 'none' + se = e.get('special_exit') + if se: + j = room - 0x180 + A.kSpExit_Dir[j] = se['dir'] * 2 + A.kSpExit_SprGfx[j] = se['spr_gfx'] + A.kSpExit_AuxGfx[j] = se['aux_gfx'] + A.kSpExit_PalBg[j] = se['pal_bg'] + A.kSpExit_PalSpr[j] = se['pal_spr'] + A.kSpExit_Top[j] = se['top'] + A.kSpExit_Bottom[j] = se['bottom'] + A.kSpExit_Left[j] = se['left'] + A.kSpExit_Right[j] = se['right'] + A.kSpExit_LeftEdgeOfMap[j] = se['left_edge_of_map'] + A.kSpExit_Tab4[j] = se['unk4'] + A.kSpExit_Tab5[j] = se['unk5'] + A.kSpExit_Tab6[j] = se['unk6'] + A.kSpExit_Tab7[j] = se['unk7'] + + + A.add('uint16', 'kOverworldSecrets_Offs', 128, initializer = None) + A.add('uint8', 'kOverworldSecrets', 0) + for i, y in loaded_areas: + if len(y['Items']): + assert i < 128 + j = len(A.kOverworldSecrets) + awrite(A.kOverworldSecrets_Offs, i, i, j) + for e in y['Items']: + pos = e[0] << 1 | e[1] << 7 + item = tables.kSecretNamesRev[e[2]] + A.kOverworldSecrets.extend([pos & 0xff, pos >> 8, item]) + A.kOverworldSecrets.extend([0xff, 0xff]) + for i in range(128): + if A.kOverworldSecrets_Offs[i] == None: + A.kOverworldSecrets_Offs[i] = len(A.kOverworldSecrets) - 2 + + A.add('uint16', 'kOverworldSpriteOffs', 144 * 3, initializer = 0) + A.add('uint8', 'kOverworldSprites', 0) + A.add('uint8', 'kOverworldSpriteGfx', 256) + A.add('uint8', 'kOverworldSpritePalettes', 256) + A.kOverworldSprites.append(0xff) + def do_sprite_range(start, end, stagename, sprite_stage_idxs, infostage): + for i, y in loaded_areas: + if i < start or i >= end: continue + info = y[stagename]['info'] + if i < 128: + awrite(A.kOverworldSpriteGfx, i, (i & 63) + infostage * 64, info['gfx']) + awrite(A.kOverworldSpritePalettes, i, (i & 63) + infostage * 64, info['palette']) + if len(y[stagename]['sprites']): + for stage in sprite_stage_idxs: + A.kOverworldSpriteOffs[stage * 144 + i] = len(A.kOverworldSprites) + for e in y[stagename]['sprites']: + A.kOverworldSprites.extend([e[1], e[0], tables.kSpriteNamesRev[e[2]]]) + A.kOverworldSprites.append(0xff) + do_sprite_range(0, 64, 'Sprites.Beginning', [0], 0) + do_sprite_range(0, 64, 'Sprites.FirstPart', [1], 1) + do_sprite_range(0, 64, 'Sprites.SecondPart', [2], 2) + do_sprite_range(64, 144, 'Sprites', [1, 2], 3) + + f = open(PATH+'generated_overworld_tables.h', 'w') + A.write(f) + print_int_array('kMap8DataToTileAttr', ROM.get_bytes(0x8E9459, 512), 'uint8', False, 16, file = f) + print_int_array('kSomeTileAttr', ROM.get_bytes(0x9bf110, 3824), 'uint8', False, 16, file = f) + f.close() + + +def print_dungeon_map(): + f = open(PATH+'generated_dungeon_map.h', 'w') + + r, r2 = [], [] + name = 'kDungMap_FloorLayout' + name2 = 'kDungMap_Tiles' + for i in range(14): + kSizes = [75, 125, 50, 75, 175, 75, 50, 75, 50, 200, 150, 75, 100, 200] + addr = 0xa0000 + ROM.get_word(0x8AF605 + i * 2) + r.append('%s_%d' % (name, i)) + bytes = ROM.get_bytes(addr, kSizes[i]) + nonzero_bytes = len(bytes) - bytes.count(0xf) + print_int_array(r[-1], bytes, 'uint8', False, 25, file = f) + addr = 0xa0000 + ROM.get_word(0x8AFBE4 + i * 2) + r2.append('%s_%d' % (name2, i)) + bytes = ROM.get_bytes(addr, nonzero_bytes) + print_int_array(r2[-1], bytes, 'uint8', False, 25, file = f) + + print_int_array(name, r, 'uint8 *const', None, 4, file = f) + print_int_array(name2, r2, 'uint8 *const', None, 4, file = f) + f.close() + + + +g_dungeon_yaml_cache = {} +def load_dungeon_yaml(room): + if room not in g_dungeon_yaml_cache: + g_dungeon_yaml_cache[room] = yaml.safe_load(open(PATH+'dungeon/dungeon-%d.yaml' % room, 'r')) + return g_dungeon_yaml_cache[room] + +def print_dungeon_sprites(): + offsets=[0 for i in range(320)] + data = [0, 0xff] + for i in range(320): + y = load_dungeon_yaml(i) + sortmode = y['Header']['sort_sprites'] + if len(y['Sprites']) == 0 and sortmode == 0: + continue + offsets[i] = len(data) + data.append(sortmode) + for s in y['Sprites']: + xx, yy, f, name = s[:4] + f = {'upper' : 0, 'lower' : 1}[f] + assert xx >= 0 and xx <= 0x1f + assert yy >= 0 and yy <= 0x1f + + # parse out subcode + ss = 0 + if len(name) > 2 and name[2] == '.': + j = name.index('-') + ss = int(name[3:j]) + name = name[0:2] + name[j:] + + name = tables.kSpriteName2Idx[name] + if name >= 0x100: + data.extend((f << 7 | 0 << 5 | yy, xx | 7 << 5, name & 0xff)) + else: + data.extend((f << 7 | (ss >> 3) << 5 | yy, xx | (ss & 7) << 5, name)) + if len(s) == 5: + kDropTypesToCode = {'drop_key' : [0xfe, 0, 0xe4], 'drop_big_key' : [0xfd, 0, 0xe4]} + data.extend(kDropTypesToCode[s[-1]]) + + data.append(0xff) + f = open(PATH+'generated_dungeon_sprites.h', 'w') + print_int_array('kDungeonSprites', data, 'uint8', True, 16, file = f) + print_int_array('kDungeonSpriteOffs', offsets, 'uint16', True, 16, file=f) + f.close() + +def print_dungeon_secrets_to_file(f): + result = [None] * 640 + for i in range(320): + y = load_dungeon_yaml(i) + def fixone(s): + x, y, data = s[0], s[1], tables.kSecretNamesRev[s[2]] + pos = (x + y * 64) * 2 + return [pos & 0xff, pos >> 8, data] + if len(y['Secrets']): + result[i*2+0] = len(result) & 0xff + result[i*2+1] = len(result) >> 8 + for a in y['Secrets']: + result.extend(fixone(a)) + + result.extend([0xff, 0xff]) + for i in range(320): + if result[i*2+0] == None: + l = (len(result) - 2) + result[i*2+0] = l & 0xff + result[i*2+1] = l >> 8 + print_int_array('kDungeonSecrets', result, 'uint8', True, 16, file = f) + +def append_scan_bytes(big, little): + for n in range(len(little), -1, -1): + if n == 0 or big[-n:] == little[:n]: + offset = len(big) - n + big.extend(little[n:]) + return offset + +def print_dungeon_rooms(): + def print_layer(objs, doors): + door_offset = None + for o in objs: + if o['n'] in tables.kType0Names_rev: + index = tables.kType0Names_rev[o['n']] # 0 - 0xf7 + w = int(o['s'][0]) + h = int(o['s'][2]) + assert w >= 0 and w <= 3 and h >= 0 and h <= 3 + p0 = o['x'] * 4 + w + p1 = o['y'] * 4 + h + p2 = index + elif o['n'] in tables.kType1Names_rev: + index = tables.kType1Names_rev[o['n']] + p0 = o['x'] * 4 + (index >> 0 & 3) + p1 = o['y'] * 4 + (index >> 2 & 3) + p2 = (index >> 4) + 0xf8 + elif o['n'] in tables.kType2Names_rev: + index = tables.kType2Names_rev[o['n']] + x, y = o['x'], o['y'] + #111111xx xxxxyyyy yyiiiiii + p0 = 0xfc + (x >> 4 & 3) + p1 = (x << 4 & 0xf0) | (y >> 2 & 0x0f) + p2 = index | (y << 6 & 0xc0) + else: + raise Exception('item %s not found' % o['n']) + data.extend((p0, p1, p2)) + if doors != None: + data.extend([0xf0, 0xff]) + door_offset = len(data) + for d in doors: + data.extend((d['dir'] | d['pos'] << 4, d['type'])) + data.extend([0xff, 0xff]) + return door_offset + + def get_room_header(y): + h = y['Header'] + p7 = h['hole0_dest'][1] | h['stair0_dest'][1] << 2 | h['stair1_dest'][1] << 4 | h['stair2_dest'][1] << 6 + p8 = h['stair3_dest'][1] + return [tables.kBg2_rev[h['bg2']] << 5 | tables.kCollisionNames_rev[h['collision']] << 2 | h['lights_out'], + h['palette'], + h['blockset'], + h['enemyblk'], + tables.kEffectNames_rev[h['effect']], + tables.kTagNames_rev[h['tag0']], + tables.kTagNames_rev[h['tag1']], + p7, + p8, + h['hole0_dest'][0], + h['stair0_dest'][0], + h['stair1_dest'][0], + h['stair2_dest'][0], + h['stair3_dest'][0]] + + data = [] + offsets = [0]*320 + door_offsets = [0]*320 + room_headers = [] + header_offsets = [0] * 320 + chests = [] + entrances = [None] * 133 + starting_points = [None] * 7 + sign_texts = [0] * 320 + pits_hurt_player = [] + + for i in range(320): + y = load_dungeon_yaml(i) + h = y['Header'] + if h['pits_hurt_player']: pits_hurt_player.append(i) + offsets[i]=len(data) + data.append(h['floor1'] + h['floor2'] * 16) + data.append(h['layout'] * 4 + h['start_quadrant']) + print_layer(y['Layer1'], y.get('Layer1.doors')) + print_layer(y['Layer2'], y.get('Layer2.doors')) + door_offsets[i] = print_layer(y['Layer3'], y.get('Layer3.doors') or []) + header_offsets[i] = append_scan_bytes(room_headers, get_room_header(y)) + sign_texts[i] = h['tele_msg'] + for a in y['Chests']: + if isinstance(a, int): + chests.extend([i & 0xff, i >> 8, a]) + else: + assert a.endswith('!') + chests.extend([i & 0xff, (i >> 8) | 0x80, int(a[:-1])]) + for e in y['Entrances']: + a = e['entrance_index'] + e['room'] = i + assert entrances[a] == None + entrances[a] = e + if 'StartingPoints' in y: + for e in y['StartingPoints']: + a = e['starting_point_index'] + e['room'] = i + assert starting_points[a] == None + starting_points[a] = e + for i in range(133): + if entrances[i] == None: + raise Exception('Entrance %d not defined' % i) + for i in range(7): + if starting_points[i] == None: + raise Exception('Starting point %d not defined' % i) + + def print_entrance_info(f, entrances, prefix): + def get_rc(a): + rep, room, quads, xy = a.get('repair_scroll_bounds'), a['room'], a['quadrants'], a['player_xy'] + if rep == None: rep = (0, 0, 0, 0, 0, 0, 0, 0) + base_x = (room & 0xf) * 2 + base_y = (room >> 4) * 2 + ym = (xy[1] & 0x100) >> 8 + xm = (xy[0] & 0x100) >> 8 + qqq = xm if room >= 242 and quads[0] == 'single_x' else 0 + l = [base_y + ym, base_y, base_y + ym, base_y + 1, + base_x + xm, base_x + qqq, base_x + xm, base_x + qqq + 1] + return [a+b for a,b in zip(l, rep)] + def get_palace(a): + i = tables.kPalaceNames.index(a) + return -1 if i == 0 else (i - 1) * 2 + def get_quadrant1(a): + return ['single_x', 'double_x'].index(a[0]) * 0x20 + ['single_y', 'double_y'].index(a[1]) * 0x2 + def get_quadrant2(a): + kScrollNames = { 'upper_left' : 0, 'lower_left' : 2, 'upper_right' : 16, 'lower_right' : 18 } + return kScrollNames[a[2]] + def get_exit_door(a): + if a[0] == 'none': return 0 + if a[0] == 'none_0xffff': return 65535 + return ['wooden', 'bombable'].index(a[0]) << 15 | a[1] << 1 | a[2] << 7 + + print_int_array(prefix+'rooms', [a['room'] for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'relativeCoords', flatten([get_rc(a) for a in entrances]), 'uint8', True, 16, file = f) + def get_base_x(a): return ((a['room'] & 0x00f) << 9) + def get_base_y(a): return ((a['room'] & 0x1f0) << 5) + print_int_array(prefix+'scrollX', [a['scroll_xy'][0] + get_base_x(a) for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'scrollY', [a['scroll_xy'][1] + get_base_y(a) for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'playerX', [a['player_xy'][0] + get_base_x(a) for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'playerY', [a['player_xy'][1] + get_base_y(a) for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'cameraX', [a['camera_xy'][0] for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'cameraY', [a['camera_xy'][1] for a in entrances], 'uint16', True, 16, file = f) + print_int_array(prefix+'blockset', [a['blockset'] for a in entrances], 'uint8', True, 16, file = f) + print_int_array(prefix+'floor', [a['floor'] for a in entrances], 'int8', True, 16, file = f) + print_int_array(prefix+'palace', [get_palace(a['palace']) for a in entrances], 'int8', True, 16, file = f) + print_int_array(prefix+'doorwayOrientation', [a['doorway_orientation'] for a in entrances], 'uint8', True, 16, file = f) + print_int_array(prefix+'startingBg', [a['plane'] + a['ladder_level'] * 16 for a in entrances], 'uint8', True, 16, file = f) + print_int_array(prefix+'quadrant1', [get_quadrant1(a['quadrants']) for a in entrances], 'uint8', True, 16, file = f) + print_int_array(prefix+'quadrant2', [get_quadrant2(a['quadrants']) for a in entrances], 'uint8', True, 16, file = f) + print_int_array(prefix+'doorSettings', [get_exit_door(a['house_exit_door']) for a in entrances], 'uint16', True, 16, file = f) + if prefix == 'kStartingPoint_': + print_int_array(prefix+'entrance', [a['associated_entrance_index'] for a in entrances], 'uint8', True, 16, file = f) + m = invert_dict(tables.kMusicNames) + print_int_array(prefix+'musicTrack', [m[a['music']] for a in entrances], 'uint8', True, 16, file = f) + + + f = open(PATH+'generated_dungeon_rooms.h', 'w') + print_int_array('kDungeonRoom', data, 'uint8', True, 16, file = f) + print_int_array('kDungeonRoomOffs', offsets, 'uint16', True, 16, file = f) + print_int_array('kDungeonRoomDoorOffs', door_offsets, 'uint16', True, 16, file = f) + print_int_array('kDungeonRoomHeaders', room_headers, 'uint8', True, 16, file = f) + print_int_array('kDungeonRoomHeadersOffs', header_offsets, 'uint16', True, 16, file = f) + print_int_array('kDungeonRoomChests', chests, 'uint8', True, 16, file = f) + print_int_array('kDungeonRoomTeleMsg', sign_texts, 'uint16', True, 16, file = f) + print_int_array('kDungeonPitsHurtPlayer', pits_hurt_player, 'uint16', True, 16, file = f) + + print_entrance_info(f, entrances, 'kEntranceData_') + print_entrance_info(f, starting_points, 'kStartingPoint_') + + data = [] + offsets = [0] * 8 + default_yaml = yaml.safe_load(open(PATH+'dungeon/default_rooms.yaml', 'r')) + for i in range(len(offsets)): + offsets[i] = len(data) + print_layer(default_yaml['Default%d' % i], None) + print_int_array('kDungeonRoomDefault', data, 'uint8', True, 16, file = f) + print_int_array('kDungeonRoomDefaultOffs', offsets, 'uint16', True, 16, file = f) + + data = [] + offsets = [0] * 19 + overlay_yaml = yaml.safe_load(open(PATH+'dungeon/overlay_rooms.yaml', 'r')) + for i in range(len(offsets)): + offsets[i] = len(data) + print_layer(overlay_yaml['Overlay%d' % i], None) + print_int_array('kDungeonRoomOverlay', data, 'uint8', True, 16, file = f) + print_int_array('kDungeonRoomOverlayOffs', offsets, 'uint16', True, 16, file = f) + + print_dungeon_secrets_to_file(f) + + print_int_array('kDungAttrsForTile_Offs', ROM.get_words(0x8e9000, 21), 'uint16', False, 16, file = f) + print_int_array('kDungAttrsForTile', ROM.get_bytes(0x8e902a, 1024), 'uint8', False, 16, file = f) + + print_int_array('kMovableBlockDataInit', ROM.get_words(0x84f1de, 198), 'uint16', False, 16, file = f) + print_int_array('kTorchDataInit', ROM.get_words(0x84F36A, 144), 'uint16', False, 16, file = f) + print_int_array('kTorchDataJunk', ROM.get_words(0x84F48a, 48), 'uint16', False, 16, file = f) + + f.close() + + + +def print_enemy_damage_data(): + f = open(PATH+'generated_enemy_damage_data.h', 'w') + decomp, comp_len = util.decomp(0x83e800, ROM.get_byte, True, True) + print_int_array('kEnemyDamageData', decomp, 'uint8', False, 32, file = f) + f.close() + +def print_tilemaps(): + f = open(PATH+'generated_bg_tilemaps.h', 'w') + kSrcs = [0xcdd6d, 0xce7bf, 0xce2a8, 0xce63c, 0xce456, 0xeda9c] + def decode_one(p): + p_org = p + while not (ROM.get_byte(p) & 0x80): + is_memset = ROM.get_byte(p+2) & 0x40 + len = ((ROM.get_byte(p+2)*256+ROM.get_byte(p+3))&0x3fff) + 1 + p += 4 + p += 2 if is_memset else len + return p - p_org + 1 + for i,s in enumerate(kSrcs): + l = decode_one(s) + print_int_array('kBgTilemap_%d' % i, ROM.get_bytes(s, l), 'uint8', False, 32, file = f) + f.close() + +def print_link_graphics(): + f = open(PATH+'generated_link_graphics.h', 'w') + image = Image.open(PATH+'linksprite.png') + data = image.tobytes() + def encode_4bit_sprite(data, offset, pitch): + b = [0] * 32 + for y in range(8): + for x in range(8): + v = data[offset + y * pitch + x] + b[y*2+0] |= (v & 1) << (7-x) + b[y*2+1] |= (v >> 1 & 1) << (7-x) + b[y*2+16] |= (v >> 2 & 1) << (7-x) + b[y*2+17] |= (v >> 3 & 1) << (7-x) + return bytes(b) + b = b'' + for y in range(56): + for x in range(16): + b += encode_4bit_sprite(data, y * 128 * 8 + x * 8, 128) + print_int_array('kLinkGraphics', b, 'uint8', False, 32, file = f) + #print(list(encode_4bit_sprite(data, 0, 128))) + f.close() + +def print_sound_banks(): + f = open(PATH+'generated_sound_banks.h', 'w') + for song in ['intro', 'indoor', 'ending']: + compile_music.print_song(song, f) + f.close() + + + +def print_all(): + print_sound_banks() + print_dungeon_rooms() + print_enemy_damage_data() + print_link_graphics() + print_dungeon_sprites() + print_map32_to_map16() + print_dialogue() + print_images() + print_misc() + print_dungeon_map() + print_tilemaps() + print_overworld() + print_overworld_tables() + +print_all() + diff --git a/tables/decode_music.py b/tables/decode_music.py new file mode 100644 index 00000000..44a5d071 --- /dev/null +++ b/tables/decode_music.py @@ -0,0 +1,471 @@ +import hashlib +import array +import heapq, sys +import yaml +import time +import util, brr_tools + + +def load_sound_bank(rom, ea, mem_in = None): + memory = list(mem_in) if mem_in else [None]*65536 + j =0 + while True: + numbytes = rom.get_word(ea) + target = rom.get_word(ea+2) + if numbytes==0: +# print('Entry point = 0x%x' % target) + return memory, target + print('# Copy %d bytes to 0x%x' % (numbytes, target)) + ea += 4 + for i in range(numbytes): + memory[target+i] = rom.get_byte(ea) + ea += 1 + if (ea & 0xffff) < 0x8000: + ea += 0x8000 + j += 1 + if j > 256: + break + +def get_byte(ea): + return memory[ea] + +def get_word(ea): + return get_byte(ea) | get_byte(ea + 1) * 256 + + +# lightworld +# Copy 11694 bytes to 0xd000 +# Copy 1672 bytes to 0x2b00 + + +# indoor +# Copy 11455 bytes to 0xd000 +# Copy 1292 bytes to 0x2b00 + +def to_str(s): + if isinstance(s, str): + return s + if isinstance(s, int): + return str(s) + return s.name + + +class Song: + name = 'Song' + def __str__(self): + s = '# Song index %d\n' % self.index + s += '[Song_0x%x]\n' % (self.ea) + s += "".join(x.name + '\n' for x in self.phrases) + return s + +class SongList: + name = 'SongList' + def __str__(self): + s = '[SongList_0x%x]\n' % (self.ea) + s += "".join(('None' if x == None else x.name) + '\n' for x in self.songs) + return s + +class Phrase: + name = 'Phrase' + def __str__(self): + s = '[Phrase_0x%x]\n' % (self.ea) + s += "".join(('None' if x == None else x.name) + '\n' for x in self.patterns) + return s + +class Pattern: + name = 'Pattern' + def __str__(self): + r = '[Pattern_0x%x]\n' % (self.ea) + last_len = None + for a in self.lines: + s = '' + if len(a) == 4: + s += a[0] + " " + " ".join(map(to_str, a[1])) + else: + s += '%s' % (a[0]) + + if a[-2] != None: + s += ' %2d' % a[-2] + last_len = a[-2] + else: + s += ' --'# % last_len + + if a[-1] != None: + s += ' %2x' % a[-1] + else: + s += ' --' + + r += s + '\n' + return r + +class PhraseLoop: + name = 'PhraseLoop' + def __init__(self, loops, jmp): + self.loops = loops + self.jmp = jmp + self.name = 'PhraseLoop %d %d' % (self.loops, self.jmp) + def __str__(self): + return self.name + +types_for_ea = {} +pqueue_by_ea = [] + +def reset_queues(): + global types_for_ea, pqueue_by_ea + types_for_ea = {} + pqueue_by_ea = [] + +def get_type_for_ea(ea, tp): + if ea == 0: + return None + assert(ea >= 256), ea + a = types_for_ea.get(ea) + if a != None: + assert type(a)==tp, (type(a), tp, '0x%x' % ea) + return a + a = tp() + a.ea = ea + a.name = '%s_0x%x' % (a.name, ea) + types_for_ea[ea] = a + if get_byte(ea) != None: + heapq.heappush(pqueue_by_ea, (ea, a)) + a.is_imported = False + else: + a.is_imported = True + return a + +kEffectByteLength = [1, 1, 2, 3, 0, 1, 2, 1, 2, 1, 1, 3, 0, 1, 2, 3, 1, 3, 3, 0, 1, 3, 0, 3, 3, 3, 1] +kEffectNames = ['Instrument', 'Pan', 'PanFade', 'Vibrato', 'VibratoOff', + 'SongVolume', 'SongVolumeFade', 'Tempo', 'TempoFade', + 'Transpose', 'ChannelTranpose', 'Tremolo', 'TremoloOff', + 'Volume', 'VolumeFade', 'Call', 'VibratoFade', + 'PitchEnvelopeTo', 'PitchEnvelopeFrom', 'PitchEnvelopeOff', + 'FineTune', 'EchoEnable', 'EchoOff', 'EchoSetup', 'EchoVolumeFade', + 'PitchSlide', 'PercussionDefine'] +assert(len(kEffectNames) == 27) + +def note_to_str(note): + kKeys = ['C-', 'C#', 'D-', 'D#', 'E-', 'F-', 'F#', 'G-', 'G#', 'A-', 'A#', 'B-'] + if note >= 72: + if note == 72: + return '-+-' # don't write kof + elif note == 73: + return '---' # want kof + else: + assert 0 + octave = note / 12 + key = note % 12 + return '%s%d' % (kKeys[key], octave + 1) + +def get_pattern(ea): + if ea == 0: + return None + pattern = get_type_for_ea(ea, Pattern) + return pattern + +def get_song(ea, index): + song = get_type_for_ea(ea, Song) + if song: + song.index = index + return song + +def get_phrase(ea): + phrase = get_type_for_ea(ea, Phrase) + return phrase + +def decode_pattern(pattern, next_ea): + ea = pattern.ea + pattern.lines = [] + start_ea = ea + while True: +# print('0x%x 0x%x' % (ea, start_ea)) +# assert ea != 0x28f0 + if ea != start_ea and ea == next_ea: + pattern.lines.append(('Fallthrough', (), None, None)) + return + note_length, volstuff = None, None + cmd = get_byte(ea); ea += 1 + if cmd == 0: + break + if not (cmd & 0x80): + note_length = cmd + cmd = get_byte(ea); ea += 1 + if not (cmd & 0x80): + volstuff = cmd + cmd = get_byte(ea); ea += 1 + if cmd == 0xef: + addr = get_word(ea) + loops = get_byte(ea + 2) + ea += 3 + pattern.lines.append((kEffectNames[cmd-0xe0], (get_pattern(addr), loops), note_length, volstuff)) + elif cmd >= 0xe0: + assert note_length == None and volstuff == None, (note_length, volstuff) + x = kEffectByteLength[cmd - 0xe0] + args = [get_byte(ea+i) for i in range(x)] + ea += x + pattern.lines.append((kEffectNames[cmd-0xe0], args, note_length, volstuff)) + else: + assert(cmd & 0x80) + pattern.lines.append((note_to_str(cmd & 0x7f), note_length, volstuff)) + + return pattern + +def decode_phrase(phrase): + phrase.patterns = [get_pattern(get_word(phrase.ea + i * 2)) for i in range(8)] + +def decode_song(song): + ea = song.ea + song.phrases = [] + ea_org = ea + eas_in_phrase = [] + while True: + eas_in_phrase.append(ea) + phrase = get_word(ea) + if phrase == 0: + break + if phrase < 0x100: + assert phrase != 0x80 and phrase != 0x81 + tgt = get_word(ea + 2) + assert tgt in eas_in_phrase + song.phrases.append(PhraseLoop(phrase, (tgt - ea) // 2)) + ea += 4 + else: + song.phrases.append(get_phrase(phrase)) + ea += 2 + return song + +def decode_any(what, next_ea): + if isinstance(what, Song): + decode_song(what) + elif isinstance(what, SongList): + pass # no need + elif isinstance(what, Phrase): + decode_phrase(what) + elif isinstance(what, Pattern): + decode_pattern(what, next_ea) + else: + assert 0 + +def get_song_list(ea, num): + song_list = get_type_for_ea(ea, SongList) + song_list.songs = [get_song(get_word(ea + i * 2), i) for i in range(num)] + +def load_song(ROM, song): + global memory, SONGS_IN_BANK + reset_queues() + if song == 'intro': + memory, entry_point = load_sound_bank(ROM, 0x998000) # intro + SONGS_IN_BANK = (get_word(0xd000) - 0xd000) // 2 + elif song == 'lightworld': + memory, entry_point = load_sound_bank(ROM, 0x9a9ef5) # lw + SONGS_IN_BANK = (get_word(0xd000) - 0xd000) // 2 + elif song == 'indoor': + memory, entry_point = load_sound_bank(ROM, 0x9b8000) # indoor + SONGS_IN_BANK = (0xd046 - 0xd000) // 2 + elif song == 'ending': + memory, entry_point = load_sound_bank(ROM, 0x9ad380) # ending + SONGS_IN_BANK = (0xd046 - 0xd000) // 2 + + +def print_song(song, f): + get_song_list(0xd000, SONGS_IN_BANK) + if song in ('intro', 'lightworld'): + get_phrase(0xD878) + get_phrase(0xD8A8) + get_phrase(0xD8B8) + get_phrase(0xDf11) + get_phrase(0xe37c) + if song == 'indoor': + get_phrase(0xDc5e) + get_phrase(0xDc6e) + get_pattern(0xe905) + get_phrase(0xe94a) + if song == 'ending': + get_phrase(0x2a10) + while len(pqueue_by_ea): + _, item = heapq.heappop(pqueue_by_ea) + decode_any(item, pqueue_by_ea[0][0] if len(pqueue_by_ea) else None) + for a, b in sorted(types_for_ea.items()): + if not b.is_imported: + print(b, file = f) + + +def dump_brr_audio(): + def decode_brr(snd): + start, loop_start = get_word(0x3c00 + snd * 4), get_word(0x3c00 + snd * 4 + 2) + r = brr_tools.decode_brr(lambda x: get_byte(start+x)) + return r, [get_byte(start+x) for x in range(len(r)//16 * 9)], get_byte(start)&0x2 != 0 + for audio_idx in range(25): + sound_data, brr_data, brr_repeat = decode_brr(audio_idx) + open('sound/sound%d.pcm.brr' % audio_idx, 'wb').write(bytes(brr_data)) + open('sound/sound%d.pcm' % audio_idx, 'wb').write(sound_data) + +def dump_music_info(): + music_info = {} + kDupSamples = {10 : 9, 20 : 19} + music_info['samples'] = [] + for audio_idx in range(25): + start, rep = get_word(0x3c00 + audio_idx * 4), get_word(0x3c00 + audio_idx * 4 + 2) + sample_info = { + 'file' : 'sound/sound%d.pcm' % kDupSamples.get(audio_idx, audio_idx) + } + if get_byte(start) & 2: + sample_info['repeat'] = (rep - start) // 9 * 16 + music_info['samples'].append(sample_info) + + def add_sustain_decay_etc(ea, info): + adsr1, adsr2, gain = get_byte(ea), get_byte(ea + 1), get_byte(ea + 2) + info['decay'] = (adsr1 >> 4) & 7 + info['attack'] = adsr1 & 0xf + info['sustain_level'] = adsr2 >> 5 + info['sustain_rate'] = adsr2 & 0x1f + info['vxgain'] = gain + + music_info['instruments'] = [] + for i in range(25): + ea = 0x3d00 + i * 6 + adsr1, adsr2 = get_byte(ea + 1), get_byte(ea + 2) + info = { + 'sample' : get_byte(ea), + } + add_sustain_decay_etc(ea + 1, info) + info['pitch_base'] = get_byte(ea + 4) << 8 | get_byte(ea + 5) + music_info['instruments'].append(info) + + music_info['note_gate_off'] = [get_byte(i) for i in range(0x3D96, 0x3D96 + 8)] + music_info['note_volume'] = [get_byte(i) for i in range(0x3D9E, 0x3D9E + 16)] + + music_info['sfx_instruments'] = [] + + for i in range(25): + ea = 0x3e00 + i * 9 + info = { + 'voll' : get_byte(ea), + 'volr' : get_byte(ea + 1), + 'pitch' : get_word(ea + 2), + 'sample' : get_byte(ea + 4) + } + add_sustain_decay_etc(ea + 5, info) + info['pitch_base'] = get_byte(ea + 8) + music_info['sfx_instruments'].append(info) + + s = yaml.dump(music_info, default_flow_style=None, sort_keys=False) + open('music_info.yaml', 'w').write(s) + +def decode_sfx(ea, next_addr): + r = [] + while True: + if ea == next_addr: + r.append(('Fallthrough', )) + return r + b = get_byte(ea); ea += 1 + if b == 0: + return r + note_length = None + volume_left, volume_right = None, None + if not (b & 0x80): + note_length = b + b = get_byte(ea); ea += 1 + if not (b & 0x80): + volume_left, volume_right = b, None + b = get_byte(ea); ea += 1 + if not b & 0x80: + volume_right = b + b = get_byte(ea); ea += 1 + if b == 0xe0: + assert note_length == None and volume_left == None and volume_right == None, ea + b = get_byte(ea); ea += 1 + r.append(('SetInstrument %d' % b, )) + elif b == 0xf9: + #assert note_length == None and volume_left == None and volume_right == None, ea + b = get_byte(ea); ea += 1 + b0, b1, b2 = get_byte(ea), get_byte(ea+1), get_byte(ea+2); ea += 3 + r.append(('PitchSlide %d %d %d' % (b0, b1, b2), note_to_str(b & 0x7f), note_length, volume_left, volume_right)) + elif b == 0xf1: + #assert note_length == None and volume_left == None and volume_right == None, ea + b0, b1, b2 = get_byte(ea), get_byte(ea+1), get_byte(ea+2); ea += 3 + r.append(('PitchSlide %d %d %d' % (b0, b1, b2), None, note_length, volume_left, volume_right)) + elif b == 0xff: + assert note_length == None and volume_left == None and volume_right == None, ea + r.append(('Restart',)) + return r + else: + r.append((None, note_to_str(b & 0x7f), note_length, volume_left, volume_right)) + +def print_all_sfx(f): + items = set() + def add_sfx_top(base, num, name): + print('[%s_0x%x]' % (name, base), file = f) + next_ea = base + num * 2 + echo_ea = next_ea + num + for i in range(num): + r = [] + ea = get_word(base + i * 2) + if ea == 0: + t = 'None' + else: + items.add(ea) + t = 'Sfx_0x%x' % ea + if name == 'SfxPort1': + print('%s,%d' % (t, get_byte(next_ea + i)), file = f) + else: + print('%s,%d,%d' % (t, get_byte(next_ea + i), get_byte(echo_ea + i)), file = f) + print(file = f) + add_sfx_top(0x17c0, 32, 'SfxPort1') + add_sfx_top(0x1820, 63, 'SfxPort2') + add_sfx_top(0x191c, 63, 'SfxPort3') + items.add(0x1a5b) + items.add(0x1d1c) + items.add(0x1ee2) + items.add(0x1f13) + items.add(0x1f1c) + items.add(0x252d) + items.add(0x2533) + items.add(0x26a2) + items.add(0x277e) + items.add(0x279d) + items.add(0x27c9) + items.add(0x27f6) + items.add(0x2807) + items.add(0x2818) + items.add(0x2829) + items.add(0x2831) + items.add(0x284a) + items = sorted(list(items)) + for i in range(len(items)): + print('[Sfx_0x%x]' % items[i], file = f) + next_addr = items[i + 1] if i + 1 < len(items) else 0 + rs = decode_sfx(items[i], next_addr) + for r in rs: + if len(r) == 5: + aa = '. ' if r[1] == None else r[1] + bb = '--' if r[2] == None else '%2d' % r[2] + cc = '---' if r[3] == None else '%3d' % r[3] + dd = '---' if r[4] == None else '%3d' % r[4] + r0 = '' if r[0] == None else ' ' + r[0] + print('%s %s %s %s%s' % (aa, bb, cc, dd, r0), file = f) + else: + print(r[0], file = f) + print(file = f) + +def extract_sound_data(rom): + load_song(rom, 'intro') + print_song('intro', open('sound_intro.txt', 'w')) + + dump_brr_audio() + dump_music_info() + print_all_sfx(open('sfx.txt', 'w')) + + load_song(rom, 'indoor') + print_song('indoor', open('sound_indoor.txt', 'w')) + + load_song(rom, 'ending') + print_song('ending', open('sound_ending.txt', 'w')) + +if __name__ == "__main__": + ROM = util.LoadedRom() + song = sys.argv[1] + + load_song(ROM, song) + print_song(song, sys.stdout) + diff --git a/tables/extract_music.py b/tables/extract_music.py new file mode 100644 index 00000000..8ec77caa --- /dev/null +++ b/tables/extract_music.py @@ -0,0 +1,467 @@ +import hashlib +import array +import heapq, sys +import yaml +import time +import util + + +def load_sound_bank(rom, ea, mem_in = None): + memory = list(mem_in) if mem_in else [None]*65536 + j =0 + while True: + numbytes = rom.get_word(ea) + target = rom.get_word(ea+2) + if numbytes==0: +# print('Entry point = 0x%x' % target) + return memory, target +# print('# Copy %d bytes to 0x%x' % (numbytes, target)) + ea += 4 + for i in range(numbytes): + memory[target+i] = rom.get_byte(ea) + ea += 1 + if (ea & 0xffff) < 0x8000: + ea += 0x8000 + j += 1 + if j > 256: + break + +def get_byte(ea): + return memory[ea] + +def get_word(ea): + return get_byte(ea) | get_byte(ea + 1) * 256 + + +# lightworld +# Copy 11694 bytes to 0xd000 +# Copy 1672 bytes to 0x2b00 + + +# indoor +# Copy 11455 bytes to 0xd000 +# Copy 1292 bytes to 0x2b00 + +def to_str(s): + if isinstance(s, str): + return s + if isinstance(s, int): + return str(s) + return s.name + + +class Song: + name = 'Song' + def __str__(self): + s = '# Song index %d\n' % self.index + s += '[Song_0x%x]\n' % (self.ea) + s += "".join(x.name + '\n' for x in self.phrases) + return s + +class SongList: + name = 'SongList' + def __str__(self): + s = '[SongList_0x%x]\n' % (self.ea) + s += "".join(('None' if x == None else x.name) + '\n' for x in self.songs) + return s + +class Phrase: + name = 'Phrase' + def __str__(self): + s = '[Phrase_0x%x]\n' % (self.ea) + s += "".join(('None' if x == None else x.name) + '\n' for x in self.patterns) + return s + +class Pattern: + name = 'Pattern' + def __str__(self): + r = '[Pattern_0x%x]\n' % (self.ea) + last_len = None + for a in self.lines: + s = '' + if len(a) == 4: + s += a[0] + " " + " ".join(map(to_str, a[1])) + else: + s += '%s' % (a[0]) + + if a[-2] != None: + s += ' %2d' % a[-2] + last_len = a[-2] + else: + s += ' --'# % last_len + + if a[-1] != None: + s += ' %2x' % a[-1] + else: + s += ' --' + + r += s + '\n' + return r + +class PhraseLoop: + name = 'PhraseLoop' + def __init__(self, loops, jmp): + self.loops = loops + self.jmp = jmp + self.name = 'PhraseLoop %d %d' % (self.loops, self.jmp) + def __str__(self): + return self.name + +types_for_ea = {} +pqueue_by_ea = [] + +def reset_queues(): + global types_for_ea, pqueue_by_ea + types_for_ea = {} + pqueue_by_ea = [] + +def get_type_for_ea(ea, tp): + if ea == 0: + return None + assert(ea >= 256), ea + a = types_for_ea.get(ea) + if a != None: + assert type(a)==tp, (type(a), tp, '0x%x' % ea) + return a + a = tp() + a.ea = ea + a.name = '%s_0x%x' % (a.name, ea) + types_for_ea[ea] = a + if get_byte(ea) != None: + heapq.heappush(pqueue_by_ea, (ea, a)) + a.is_imported = False + else: + a.is_imported = True + return a + +kEffectByteLength = [1, 1, 2, 3, 0, 1, 2, 1, 2, 1, 1, 3, 0, 1, 2, 3, 1, 3, 3, 0, 1, 3, 0, 3, 3, 3, 1] +kEffectNames = ['Instrument', 'Pan', 'PanFade', 'Vibrato', 'VibratoOff', + 'SongVolume', 'SongVolumeFade', 'Tempo', 'TempoFade', + 'Transpose', 'ChannelTranpose', 'Tremolo', 'TremoloOff', + 'Volume', 'VolumeFade', 'Call', 'VibratoFade', + 'PitchEnvelopeTo', 'PitchEnvelopeFrom', 'PitchEnvelopeOff', + 'FineTune', 'EchoEnable', 'EchoOff', 'EchoSetup', 'EchoVolumeFade', + 'PitchSlide', 'PercussionDefine'] +assert(len(kEffectNames) == 27) + +def note_to_str(note): + kKeys = ['C-', 'C#', 'D-', 'D#', 'E-', 'F-', 'F#', 'G-', 'G#', 'A-', 'A#', 'B-'] + if note >= 72: + if note == 72: + return '-+-' # don't write kof + elif note == 73: + return '---' # want kof + else: + assert 0 + octave = note / 12 + key = note % 12 + return '%s%d' % (kKeys[key], octave + 1) + +def get_pattern(ea): + if ea == 0: + return None + pattern = get_type_for_ea(ea, Pattern) + return pattern + +def get_song(ea, index): + song = get_type_for_ea(ea, Song) + if song: + song.index = index + return song + +def get_phrase(ea): + phrase = get_type_for_ea(ea, Phrase) + return phrase + +def decode_pattern(pattern, next_ea): + ea = pattern.ea + pattern.lines = [] + start_ea = ea + while True: +# print('0x%x 0x%x' % (ea, start_ea)) +# assert ea != 0x28f0 + if ea != start_ea and ea == next_ea: + pattern.lines.append(('Fallthrough', (), None, None)) + return + note_length, volstuff = None, None + cmd = get_byte(ea); ea += 1 + if cmd == 0: + break + if not (cmd & 0x80): + note_length = cmd + cmd = get_byte(ea); ea += 1 + if not (cmd & 0x80): + volstuff = cmd + cmd = get_byte(ea); ea += 1 + if cmd == 0xef: + addr = get_word(ea) + loops = get_byte(ea + 2) + ea += 3 + pattern.lines.append((kEffectNames[cmd-0xe0], (get_pattern(addr), loops), note_length, volstuff)) + elif cmd >= 0xe0: + assert note_length == None and volstuff == None, (note_length, volstuff) + x = kEffectByteLength[cmd - 0xe0] + args = [get_byte(ea+i) for i in range(x)] + ea += x + pattern.lines.append((kEffectNames[cmd-0xe0], args, note_length, volstuff)) + else: + assert(cmd & 0x80) + pattern.lines.append((note_to_str(cmd & 0x7f), note_length, volstuff)) + + return pattern + +def decode_phrase(phrase): + phrase.patterns = [get_pattern(get_word(phrase.ea + i * 2)) for i in range(8)] + +def decode_song(song): + ea = song.ea + song.phrases = [] + ea_org = ea + eas_in_phrase = [] + while True: + eas_in_phrase.append(ea) + phrase = get_word(ea) + if phrase == 0: + break + if phrase < 0x100: + assert phrase != 0x80 and phrase != 0x81 + tgt = get_word(ea + 2) + assert tgt in eas_in_phrase + song.phrases.append(PhraseLoop(phrase, (tgt - ea) // 2)) + ea += 4 + else: + song.phrases.append(get_phrase(phrase)) + ea += 2 + return song + +def decode_any(what, next_ea): + if isinstance(what, Song): + decode_song(what) + elif isinstance(what, SongList): + pass # no need + elif isinstance(what, Phrase): + decode_phrase(what) + elif isinstance(what, Pattern): + decode_pattern(what, next_ea) + else: + assert 0 + +def get_song_list(ea, num): + song_list = get_type_for_ea(ea, SongList) + song_list.songs = [get_song(get_word(ea + i * 2), i) for i in range(num)] + +def load_song(ROM, song): + global memory, SONGS_IN_BANK + reset_queues() + if song == 'intro': + memory, entry_point = load_sound_bank(ROM, 0x998000) # intro + SONGS_IN_BANK = (get_word(0xd000) - 0xd000) // 2 + elif song == 'lightworld': + memory, entry_point = load_sound_bank(ROM, 0x9a9ef5) # lw + SONGS_IN_BANK = (get_word(0xd000) - 0xd000) // 2 + elif song == 'indoor': + memory, entry_point = load_sound_bank(ROM, 0x9b8000) # indoor + SONGS_IN_BANK = (0xd046 - 0xd000) // 2 + elif song == 'ending': + memory, entry_point = load_sound_bank(ROM, 0x9ad380) # ending + SONGS_IN_BANK = (0xd046 - 0xd000) // 2 + + +def print_song(song, f): + get_song_list(0xd000, SONGS_IN_BANK) + if song in ('intro', 'lightworld'): + get_phrase(0xD878) + get_phrase(0xD8A8) + get_phrase(0xD8B8) + get_phrase(0xDf11) + get_phrase(0xe37c) + if song == 'indoor': + get_phrase(0xDc5e) + get_phrase(0xDc6e) + get_pattern(0xe905) + get_phrase(0xe94a) + if song == 'ending': + get_phrase(0x2a10) + while len(pqueue_by_ea): + _, item = heapq.heappop(pqueue_by_ea) + decode_any(item, pqueue_by_ea[0][0] if len(pqueue_by_ea) else None) + for a, b in sorted(types_for_ea.items()): + if not b.is_imported: + print(b, file = f) + + +def dump_brr_audio(): + def decode_brr(snd): + start, loop_start = get_word(0x3c00 + snd * 4), get_word(0x3c00 + snd * 4 + 2) + r = util.decode_brr(lambda x: get_byte(start+x)) + return r, [get_byte(start+x) for x in range(len(r)//16 * 9)], get_byte(start)&0x2 != 0 + for audio_idx in range(25): + sound_data, brr_data, brr_repeat = decode_brr(audio_idx) + open('sound/sound%d.pcm.brr' % audio_idx, 'wb').write(bytes(brr_data)) + open('sound/sound%d.pcm' % audio_idx, 'wb').write(sound_data) + +def dump_music_info(): + music_info = {} + kDupSamples = {10 : 9, 20 : 19} + music_info['samples'] = [] + for audio_idx in range(25): + start, rep = get_word(0x3c00 + audio_idx * 4), get_word(0x3c00 + audio_idx * 4 + 2) + sample_info = { + 'file' : 'sound/sound%d.pcm' % kDupSamples.get(audio_idx, audio_idx) + } + if get_byte(start) & 2: + sample_info['repeat'] = (rep - start) // 9 * 16 + music_info['samples'].append(sample_info) + + def add_sustain_decay_etc(ea, info): + adsr1, adsr2, gain = get_byte(ea), get_byte(ea + 1), get_byte(ea + 2) + info['decay'] = (adsr1 >> 4) & 7 + info['attack'] = adsr1 & 0xf + info['sustain_level'] = adsr2 >> 5 + info['sustain_rate'] = adsr2 & 0x1f + info['vxgain'] = gain + + music_info['instruments'] = [] + for i in range(25): + ea = 0x3d00 + i * 6 + adsr1, adsr2 = get_byte(ea + 1), get_byte(ea + 2) + info = { + 'sample' : get_byte(ea), + } + add_sustain_decay_etc(ea + 1, info) + info['pitch_base'] = get_byte(ea + 4) << 8 | get_byte(ea + 5) + music_info['instruments'].append(info) + + music_info['note_gate_off'] = [get_byte(i) for i in range(0x3D96, 0x3D96 + 8)] + music_info['note_volume'] = [get_byte(i) for i in range(0x3D9E, 0x3D9E + 16)] + + music_info['sfx_instruments'] = [] + + for i in range(25): + ea = 0x3e00 + i * 9 + info = { + 'voll' : get_byte(ea), + 'volr' : get_byte(ea + 1), + 'pitch' : get_word(ea + 2), + 'sample' : get_byte(ea + 4) + } + add_sustain_decay_etc(ea + 5, info) + info['pitch_base'] = get_byte(ea + 8) + music_info['sfx_instruments'].append(info) + + s = yaml.dump(music_info, default_flow_style=None, sort_keys=False) + open('music_info.yaml', 'w').write(s) + +def decode_sfx(ea, next_addr): + r = [] + while True: + if ea == next_addr: + r.append(('Fallthrough', )) + return r + b = get_byte(ea); ea += 1 + if b == 0: + return r + note_length = None + volume_left, volume_right = None, None + if not (b & 0x80): + note_length = b + b = get_byte(ea); ea += 1 + if not (b & 0x80): + volume_left, volume_right = b, None + b = get_byte(ea); ea += 1 + if not b & 0x80: + volume_right = b + b = get_byte(ea); ea += 1 + if b == 0xe0: + assert note_length == None and volume_left == None and volume_right == None, ea + b = get_byte(ea); ea += 1 + r.append(('SetInstrument %d' % b, )) + elif b == 0xf9: + #assert note_length == None and volume_left == None and volume_right == None, ea + b = get_byte(ea); ea += 1 + b0, b1, b2 = get_byte(ea), get_byte(ea+1), get_byte(ea+2); ea += 3 + r.append(('PitchSlide %d %d %d' % (b0, b1, b2), note_to_str(b & 0x7f), note_length, volume_left, volume_right)) + elif b == 0xf1: + #assert note_length == None and volume_left == None and volume_right == None, ea + b0, b1, b2 = get_byte(ea), get_byte(ea+1), get_byte(ea+2); ea += 3 + r.append(('PitchSlide %d %d %d' % (b0, b1, b2), None, note_length, volume_left, volume_right)) + elif b == 0xff: + assert note_length == None and volume_left == None and volume_right == None, ea + r.append(('Restart',)) + return r + else: + r.append((None, note_to_str(b & 0x7f), note_length, volume_left, volume_right)) + +def print_all_sfx(f): + items = set() + def add_sfx_top(base, num, name): + print('[%s_0x%x]' % (name, base), file = f) + next_ea = base + num * 2 + echo_ea = next_ea + num + for i in range(num): + r = [] + ea = get_word(base + i * 2) + if ea == 0: + t = 'None' + else: + items.add(ea) + t = 'Sfx_0x%x' % ea + if name == 'SfxPort1': + print('%s,%d' % (t, get_byte(next_ea + i)), file = f) + else: + print('%s,%d,%d' % (t, get_byte(next_ea + i), get_byte(echo_ea + i)), file = f) + print(file = f) + add_sfx_top(0x17c0, 32, 'SfxPort1') + add_sfx_top(0x1820, 63, 'SfxPort2') + add_sfx_top(0x191c, 63, 'SfxPort3') + items.add(0x1a5b) + items.add(0x1d1c) + items.add(0x1ee2) + items.add(0x1f13) + items.add(0x1f1c) + items.add(0x252d) + items.add(0x2533) + items.add(0x26a2) + items.add(0x277e) + items.add(0x279d) + items.add(0x27c9) + items.add(0x27f6) + items.add(0x2807) + items.add(0x2818) + items.add(0x2829) + items.add(0x2831) + items.add(0x284a) + items = sorted(list(items)) + for i in range(len(items)): + print('[Sfx_0x%x]' % items[i], file = f) + next_addr = items[i + 1] if i + 1 < len(items) else 0 + rs = decode_sfx(items[i], next_addr) + for r in rs: + if len(r) == 5: + aa = '. ' if r[1] == None else r[1] + bb = '--' if r[2] == None else '%2d' % r[2] + cc = '---' if r[3] == None else '%3d' % r[3] + dd = '---' if r[4] == None else '%3d' % r[4] + r0 = '' if r[0] == None else ' ' + r[0] + print('%s %s %s %s%s' % (aa, bb, cc, dd, r0), file = f) + else: + print(r[0], file = f) + print(file = f) + +def extract_sound_data(rom): + for song in ['intro', 'indoor', 'ending']: + load_song(rom, song) + open('sound/%s.spc' % song, 'wb').write(bytes((0 if a == None else a) for a in memory)) + print_song(song, open('sound_%s.txt' % song, 'w')) + if song == 'intro': + dump_brr_audio() + dump_music_info() + print_all_sfx(open('sfx.txt', 'w')) + +if __name__ == "__main__": + ROM = util.LoadedRom() + song = sys.argv[1] + + load_song(ROM, song) + print_song(song, sys.stdout) + diff --git a/tables/extract_resources.py b/tables/extract_resources.py new file mode 100644 index 00000000..42708f38 --- /dev/null +++ b/tables/extract_resources.py @@ -0,0 +1,667 @@ +from ast import literal_eval as make_tuple +import sys +import text_compression +import util +from PIL import Image +import tables +import yaml +import extract_music +import os + +PATH='' + +ROM = util.LoadedRom() + +get_byte = ROM.get_byte +get_word = ROM.get_word +get_bytes = ROM.get_bytes + +def get_int8(ea): + b = get_byte(ea) + if b & 0x80: b -= 256 + return b + +def get_int16(ea): + b = get_word(ea) + if b & 0x8000: b -= 65536 + return b + + +def print_map32_to_map16(f): + for i in range(2218): + def getit(ea): + ov = [get_byte(ea + j) for j in range(6)] + res=[0]*4 + res[0] = ov[0] | (ov[4] >> 4) << 8 + res[1] = ov[1] | (ov[4] & 0xf) << 8 + res[2] = ov[2] | (ov[5] >> 4) << 8 + res[3] = ov[3] | (ov[5] & 0xf) << 8 + return res + t0 = getit(0x838000 + i * 6) + t1 = getit(0x83b400 + i * 6) + t2 = getit(0x848000 + i * 6) + t3 = getit(0x84b400 + i * 6) + for j in range(4): + print('%5d: %4d, %4d, %4d, %4d' % (i * 4 + j, t0[j], t1[j], t2[j], t3[j]), file = f) + +def get_exit_datas(): + r = {} + for i in range(79): + room = get_word(0x82dd8a + i * 2) + screen_index = get_byte(0x82DE28 + i) + load_offs = get_word(0x82DE77 + i * 2) + scroll_y = get_word(0x82DF15 + i * 2) + scroll_x = get_word(0x82DFB3 + i * 2) + pos_y = get_word(0x82E051 + i * 2) + pos_x = get_word(0x82E0EF + i * 2) + camera_y = get_word(0x82E18D + i * 2) + camera_x = get_word(0x82E22B + i * 2) + unk1 = get_int8(0x82E2C9 + i) + unk3 = get_int8(0x82E318 + i) + ndoor = get_word(0x82E367 + i * 2) + fdoor = get_word(0x82E405 + i * 2) + base_x = (screen_index & 7) << 9 + base_y = (screen_index & 56) << 6 + y = { + 'index' : i, + 'room' : room, + 'xy' : [pos_x - base_x, pos_y - base_y], + 'scroll_xy' : [scroll_x - base_x, scroll_y - base_y], + 'camera_xy' : [camera_x - base_x, camera_y - base_y], + } + y['load_xy'] = [((load_offs >> 1) - (y['scroll_xy'][0] >> 4)) & 0x3f, (load_offs >> 7) - (y['scroll_xy'][1] >> 4) & 0x3f] + y['unk'] = [unk1, unk3] + def get_special_exit_info(room_index): + return { + 'dir' : get_byte(0x82E801 + room_index - 0x180) >> 1, + 'spr_gfx' : get_byte(0x82E811 + room_index - 0x180), + 'aux_gfx' : get_byte(0x82E821 + room_index - 0x180), + 'pal_bg' : get_byte(0x82E831 + room_index - 0x180), + 'pal_spr' : get_byte(0x82E841 + room_index - 0x180), + 'top' : get_word(0x82e6e1 + (room_index - 0x180) * 2), + 'bottom' : get_word(0x82e701 + (room_index - 0x180) * 2), + 'left' : get_word(0x82e721 + (room_index - 0x180) * 2), + 'right' : get_word(0x82e741 + (room_index - 0x180) * 2), + 'left_edge_of_map' : get_word(0x82E7E1 + (room_index - 0x180) * 2), + 'unk4' : get_int16(0x82e761 + (room_index - 0x180) * 2), + 'unk6' : get_int16(0x82e781 + (room_index - 0x180) * 2), + 'unk5' : get_int16(0x82e7a1 + (room_index - 0x180) * 2), + 'unk7' : get_int16(0x82e7c1 + (room_index - 0x180) * 2), + } + + if room >= 0x180 and room < 0x190: + y['special_exit'] = get_special_exit_info(room) + + if ndoor != 0: + assert fdoor == 0 + y['door'] = ['bombable' if ndoor & 0x8000 else 'wooden', (ndoor & 0x7e) >> 1, (ndoor & 0x3f80) >> 7] + if fdoor != 0: + y['door'] = ['palace' if fdoor & 0x8000 else 'sanctuary', (fdoor & 0x7e) >> 1, (fdoor & 0x3f80) >> 7] + r.setdefault(screen_index, []).append(y) + return r +EXIT_DATAS = get_exit_datas() + +def get_loadoffs(c, d): + x, y = c[0] >> 4, c[1] >> 4 + x += d[0] + y += d[1] + return (y&0x3f) << 7 | (x&0x3f) << 1 + +def get_ow_travel_infos(): + r = {} + for i in range(17): + screen_index = get_word(0x82EAE5 + i * 2) + load_offs = get_word(0x82EB07 + i * 2) + scroll_y = get_word(0x82EB29 + i * 2) + scroll_x = get_word(0x82EB4B + i * 2) + pos_y = get_word(0x82EB6D + i * 2) + pos_x = get_word(0x82EB8F + i * 2) + camera_y = get_word(0x82EBB1 + i * 2) + camera_x = get_word(0x82EBD3 + i * 2) + unk1 = get_int8(0x82EBF5 + i * 2) + unk3 = get_int8(0x82EC17 + i * 2) + base_x = (screen_index & 7) << 9 + base_y = (screen_index & 56) << 6 + y = {} + if i < 9: + y['bird_travel_id'] = i + else: + y['whirlpool_src_area'] = get_word(0x82ECF8 + (i - 9) * 2) + y['xy'] = [pos_x - base_x, pos_y - base_y] + y['scroll_xy'] = [scroll_x - base_x, scroll_y - base_y] + y['camera_xy'] = [camera_x - base_x, camera_y - base_y] + y['load_xy'] = [((load_offs >> 1) - (y['scroll_xy'][0] >> 4)) & 0x3f, (load_offs >> 7) - (y['scroll_xy'][1] >> 4) & 0x3f] + + t0 = get_loadoffs(y['scroll_xy'], y['load_xy']) + assert t0 == load_offs, (t0 & 0x7f, load_offs & 0x7f) + + y['unk'] = [unk1, unk3] + r.setdefault(screen_index, []).append(y) + return r +OW_TRAVEL_INFOS = get_ow_travel_infos() + +def get_ow_entrance_info(): + r = {} + for i in range(129): + area = get_word(0x9BB96F + i * 2) + pos = get_word(0x9BBA71 + i * 2) + entrance_id = get_byte(0x9BBB73 + i) + r.setdefault(area, []).append({'index' : i, 'x' : (pos >> 1) & 0x3f, 'y' : (pos >> 7) & 0x3f, 'entrance_id' : entrance_id}) + return r +OW_ENTRANCE_INFO = get_ow_entrance_info() + +def get_hole_infos(): + r = {} + for i in range(19): + pos = get_word(0x9BB800 + i * 2) + 0x400 + area = get_word(0x9BB826 + i * 2) + entrance_id = get_byte(0x9BB84C + i) + r.setdefault(area, []).append({'x' : (pos >> 1) & 0x3f, 'y' : (pos >> 7) & 0x3f, 'entrance_id' : entrance_id}) + return r +HOLE_INFO = get_hole_infos() + +def print_overworld_area(overworld_area): + is_small = get_bytes(0x82F88D, 192) + y = {} + + def get_music(ambient): + def fn(x): + if ambient: + return tables.kAmbientSoundName[x >> 4] + else: + return tables.kMusicNames[x & 0xf] + if overworld_area < 64: + return { + 'beginning' : fn(get_byte(0x82C303 + overworld_area)), + 'zelda' : fn(get_byte(0x82C303 + overworld_area + 64)), + 'sword' : fn(get_byte(0x82C303 + overworld_area + 128)), + 'agahnim' : fn(get_byte(0x82C303 + overworld_area + 192)), + } + else: + assert overworld_area < 64 + 96 + return {'agahnim' : fn(get_byte(0x82C403 + overworld_area - 64)) } + + def get_items(): + if overworld_area >= 128: return [] + ea = 0x9b0000 | get_word(0x9BC2F9 + overworld_area * 2) + xs = [] + while get_word(ea) != 0xffff: + pos = get_word(ea) + assert pos%2==0 + x, y = pos//2%64, pos//2//64 + xs.append([x, y, tables.kSecretNames[get_byte(ea+2)]]) + ea += 3 + return xs + + header = { + 'name' : tables.kAreaNames[overworld_area], + 'size' : 'small' if is_small[overworld_area] else 'big', + 'gfx' : get_byte(0x80FC9C + overworld_area) if overworld_area < 128 else -1, + 'palette' : get_byte(0x80FD1C + overworld_area) if overworld_area < 136 else -1, + 'sign_text' : get_word(0x87F51D + overworld_area * 2) if overworld_area < 128 else -1, + 'music' : get_music(False), + 'ambient' : get_music(True), + } + + y['Header'] = header + y['Travel'] = OW_TRAVEL_INFOS.get(overworld_area, []) + y['Entrances'] = OW_ENTRANCE_INFO.get(overworld_area, []) + if overworld_area in HOLE_INFO: + y['Holes'] = HOLE_INFO[overworld_area] + y['Exits'] = EXIT_DATAS.get(overworld_area, []) + y['Items'] = get_items() + + def decode_sprites(base_addr): + r = [] + ea = 0x890000 + get_word(base_addr + overworld_area * 2) + while get_byte(ea) != 0xff: + y, x, w = get_byte(ea), get_byte(ea+1), get_byte(ea+2) + r.append([x, y, tables.kSpriteNames[w]]) + ea += 3 + return r + + def get_info(stage): + if overworld_area >= 128: return {} + if overworld_area >= 64: stage = 3 + return { + 'gfx' : get_byte(0x80FA41 + (overworld_area & 63) + stage * 64), + 'palette' : get_byte(0x80FB41 + (overworld_area & 63) + stage * 64), + } + if overworld_area < 64: + y['Sprites.Beginning'] = { + 'info' : get_info(0), + 'sprites' : decode_sprites(0x89C881) + } + y['Sprites.FirstPart'] = { + 'info' : get_info(1), + 'sprites' : decode_sprites(0x89C901) + } + y['Sprites.SecondPart'] = { + 'info' : get_info(2), + 'sprites' : decode_sprites(0x89CA21) + } + elif overworld_area < 144: + y['Sprites'] = { + 'info' : get_info(2), + 'sprites' : decode_sprites(0x89CA21) + } + + s = yaml.dump(y, default_flow_style=None, sort_keys=False) + open(PATH+'overworld/overworld-%d.yaml' % overworld_area, 'w').write(s) + +def print_all_overworld_areas(): + area_heads = ROM.get_bytes(0x82A5EC, 64) + + for i in range(160): + if i >= 128 or area_heads[i&63] == (i&63): + print_overworld_area(i) + +def print_dialogue(): + text_compression.print_strings(open('dialogue.txt', 'w'), get_byte) + +def decomp_one_spr_2bit(data, offs, target, toffs, pitch): + for y in range(8): + d0, d1 = data[offs + y * 2], data[offs + y * 2 + 1] + for x in range(8): + t = ((d0 >> x) & 1) * 1 + ((d1 >> x) & 1) * 2 + target[toffs + y * pitch + (7 - x)] = t * 255 // 3 + +def decomp_one_spr_3bit(data, offs, target, toffs, pitch): + for y in range(8): + d0, d1, d2 = data[offs + y * 2], data[offs + y * 2 + 1], data[offs + y + 16] + for x in range(8): + t = ((d0 >> x) & 1) * 1 + ((d1 >> x) & 1) * 2 + ((d2 >> x) & 1) * 4 + target[toffs + y * pitch + (7 - x)] = t * 255 // 7 + +def decomp_one_spr_4bit(data, offs, target, toffs, pitch): + for y in range(8): + d0, d1, d2, d3 = data[offs + y * 2 + 0], data[offs + y * 2 + 1], data[offs + y * 2 + 16], data[offs + y * 2 + 17] + for x in range(8): + t = ((d0 >> x) & 1) * 1 + ((d1 >> x) & 1) * 2 + ((d2 >> x) & 1) * 4 + ((d3 >> x) & 1) * 8 + target[toffs + y * pitch + (7 - x)] = t + +def save_array_as_image(dimensions, data, fname, palette = None): + img = Image.new('L' if palette == None else 'P', dimensions) + img.putdata(data) + if palette != None: + img.putpalette(palette) + img.save(fname) + + +def decomp_save(data, fname, func, step, height=32, palette=None): + dst=[0]*128*height + for i in range(16*height//8): + x = i % 16 + y = i // 16 + func(data, i * step, dst, x * 8 + y * 8 * 128, 128) + save_array_as_image((128, height), dst, fname, palette) + +def convert_snes_palette(v): + r=[] + for x in v: + r.extend(((x & 0x1f) << 3, (x >> 5 & 0x1f) << 3, (x >> 10 & 0x1f) << 3)) + return r + + +def decode_link_sprites(): + kLinkPalette = [0, 0x7fff, 0x237e, 0x11b7, 0x369e, 0x14a5, 0x1ff, 0x1078, 0x599d, 0x3647, 0x3b68, 0xa4a, 0x12ef, 0x2a5c, 0x1571, 0x7a18] + decomp_save(get_bytes(0x108000, 32768), PATH+'linksprite.png', + decomp_one_spr_4bit, 32, 448, convert_snes_palette(kLinkPalette)) + +def decomp_save_2bit(data, fname): + dst=[0]*128*64 + for i in range(128): + x = i % 16 + y = i // 16 + decomp_one_spr_2bit(data, i * 16, dst, x * 8 + y * 8 * 128, 128) + img = Image.new("L", (128, 64)) + img.putdata(dst) + img.save(fname) + + +gfx_desc = { + 0x00 : ('3bpp_np', 'Half slot images'), + + 0x01 : ('3bpp_np', 'Half slot images'), + 0x02 : ('3bpp_np', 'Half slot images'), + 0x03 : ('3bpp_np', 'Half slot images'), + 0x04 : ('3bpp_np', 'Half slot images'), + 0x05 : ('3bpp_np', 'Half slot images'), + + 0x06 : ('3bpp_np', 'common spr gfx'), + 0x07 : ('3bpp_np', 'common spr gfx'), + + 0x08 : ('3bpp_np', 'Half slot images'), + 0x09 : ('3bpp_np', 'Half slot images'), + 0x0a : ('3bpp_np', 'Half slot images'), + 0x0b : ('3bpp_np', 'Half slot images'), + + 88 : ('3bpp', 'Tagalong gfx'), + 89 : ('3bpp', 'Tagalong gfx'), + + 90 : ('3bpp', 'animated sprites'), + 91 : ('3bpp', 'animated sprites'), + 92 : ('3bpp', 'animated sprites'), + 93 : ('3bpp', 'animated sprites'), + 94 : ('3bpp', 'sword/shield gfx'), + 95 : ('3bpp', 'sword/shield gfx'), + + + 100 : ('3bpp', 'Tagalong gfx'), + 101 : ('3bpp', 'Tagalong gfx'), + 102 : ('3bpp', 'Tagalong gfx'), + + 103 : ('2bpp', 'Attract images loaded to 7800'), + 104 : ('2bpp', 'empty'), + 105 : ('2bpp', 'hud icons loaded to 7xxx'), + 106 : ('2bpp', 'hud icons loaded to 7xxx'), + 107 : ('2bpp', 'hud icons loaded to 7xxx'), +} + +def decomp_generic(k, mode, fname_add = "misc"): + fname = 'img/%.3d - %s.png' % (k, fname_add) + if mode == '2bpp': + r = util.decomp(kCompSpritePtrs[k], get_byte, False) + decomp_save_2bit(r, fname) + elif mode == '3bpp_np': + print(k) + r = get_bytes(kCompSpritePtrs[k], 0x600) + decomp_save(r, fname, decomp_one_spr_3bit, 24) + elif mode== '3bpp': + r = util.decomp(kCompSpritePtrs[k], get_byte, False) + decomp_save(r, fname, decomp_one_spr_3bit, 24) + else: + assert 0 + +if 0: + for k, v in gfx_desc.items(): + decomp_generic(k, v[0]) + +def decode_room_objects(p): + objs = [] + j = 0 + while True: + p0, p1, p2 = get_byte(p), get_byte(p+1), get_byte(p+2) + A = p0 | p1 << 8 + if A == 0xffff: + return p + 2, objs, None + if A == 0xfff0: + p += 2 + break + if (A & 0xfc) != 0xfc: + index = p2 + Dst = (p1 >> 2) << 7 + Dst |= (p0 & 0xfc) >> 1 + X = (Dst >> 1) & 0x3f + Y = (Dst >> 7) & 0x3f + W = p0 & 3 + H = p1 & 3 + if index < 0xf8: + objs.append({'x' : X, 'y' : Y, 's' : '%d*%d' % (W, H), 'n': tables.kType0Names[index]}) + else: + index2 = (index & 7) << 4 | H << 2 | W + objs.append({'x' : X, 'y' : Y, 'n': tables.kType1Names[index2]}) + else: + # subtype 2: 111111xx xxxxyyyy yyiiiiii + X = ((p0 << 4 | p1 >> 4) & 0x3f) + Y = (p1 << 2 | p2 >> 6) & 0x3f + index = p2 & 0x3f + objs.append({'x' : X, 'y' : Y, 'n' : tables.kType2Names[index]}) + p += 3 + j += 1 + + doors = [] + while True: + A = get_byte(p) | get_byte(p+1) << 8 + if A == 0xffff: + return p + 2, objs, doors + doors.append({'type':get_byte(p + 1), 'pos' : get_byte(p) >> 4, 'dir' : A & 3}) + p += 2 + +def get_chest_info(): + ea = 0x81e96e + all = {} + for i in range(504//3): + room = get_word(ea + i * 3) + data = get_byte(ea + i * 3 + 2) + all.setdefault(room & 0x7fff, []).append((data, (room & 0x8000) != 0)) + return all + +CHEST_INFO = get_chest_info() + +def _get_entrance_info_one(i, set): + def get_exit_door(i): + x = get_word((0x82D724, 0x82DC32)[set] + i * 2) + if x == 0: + return ['none'] + if x == 0xffff: + return ['none_0xffff'] + return ['bombable' if x & 0x8000 else 'wooden', (x & 0x7e) >> 1, (x & 0x3f80) >> 7] + kQuadrantNames = { 0 : 'upper_left', 2 : 'lower_left', 16 : 'upper_right', 18 : 'lower_right' } + room = get_word((0x82C813, 0x82DB6E )[set] + i * 2) + def get_se(se_base_addr, xy, quds): + base_x = (room & 0xf) * 2 + base_y = (room >> 4) * 2 + ym = (xy[1] & 0x100) >> 8 + xm = (xy[0] & 0x100) >> 8 + #if room == 259: ym = 1 # possibly related to none_0xffff + hu = get_byte(se_base_addr + i * 8 + 0) - base_y - ym + fu = get_byte(se_base_addr + i * 8 + 1) - base_y + hd = get_byte(se_base_addr + i * 8 + 2) - base_y - ym + fd = get_byte(se_base_addr + i * 8 + 3) - base_y - 1 + #assert fu == 0 and fd == 0 and hd == 0 and fd == 0, (room, fu, fd, hd, fd) + qqq = xm if room >= 242 and quds[0] == 'single_x' else 0 + hl = get_byte(se_base_addr + i * 8 + 4) - base_x - xm + fl = get_byte(se_base_addr + i * 8 + 5) - base_x - qqq + hr = get_byte(se_base_addr + i * 8 + 6) - base_x - xm + fr = get_byte(se_base_addr + i * 8 + 7) - base_x - 1 - qqq + return [hu, fu, hd, fd, hl, fl, hr, fr]# + + player_x = get_word((0x82D063, 0x82DBDE)[set] + i * 2) - ((room & 0x00f) << 9) + player_y = get_word((0x82CF59, 0x82DBD0)[set] + i * 2) - ((room & 0x1f0) << 5) + + y = { + ('entrance_index' if set == 0 else 'starting_point_index'): i, + 'name' : tables.kEntranceNames[i] if set == 0 else 'Starting Location %d' % i, + 'scroll_xy' : [ + get_word((0x82CD45, 0x82DBB4)[set] + i * 2) - ((room & 0x00f) << 9), + get_word((0x82CE4F, 0x82DBC2)[set] + i * 2) - ((room & 0x1f0) << 5), + ], + 'player_xy' : [ player_x, player_y ], + 'camera_xy' : [ + get_word((0x82D277, 0x82DBFA)[set] + i * 2), + get_word((0x82D16D, 0x82DBEC)[set] + i * 2), + ], + 'blockset' : get_byte((0x82D381, 0x82DC08)[set] + i), + 'music' : tables.kMusicNames[get_byte((0x82D82E, 0x82DC4E)[set] + i)], + 'palace' : tables.kPalaceNames[(get_int8((0x82D48B, 0x82DC16)[set] + i) + 2) >> 1], + 'doorway_orientation' : get_int8(0x82D510 + i) if set == 0 else 0, + 'plane' : get_byte((0x82D595, 0x82DC1D)[set] + i) & 0xf, + 'ladder_level' : get_byte((0x82D595, 0x82DC1D)[set] + i) >> 4, + 'quadrants' : [ + 'double_x' if (get_byte((0x82D61a, 0x82DC24)[set] + i) & 0x20) != 0 else 'single_x', + 'double_y' if (get_byte((0x82D61a, 0x82DC24)[set] + i) & 0x2) else 'single_y', + kQuadrantNames[get_byte((0x82D69F, 0x82DC2B)[set] + i)] + ], + 'floor' : get_int8((0x82D406, 0x82DC0F)[set] + i), + } + + se = get_se((0x82C91D, 0x82DB7C)[set], y['player_xy'], y['quadrants']) + if se != [0, 0, 0, 0, 0, 0, 0, 0]: + y['repair_scroll_bounds'] = se + y['house_exit_door'] = get_exit_door(i) + +# quadrant_byte = (2 if player_y & 0x100 else 0) + (16 if player_x & 0x100 else 0) +# if get_byte((0x82D69F, 0x82DC2B)[set] + i) != quadrant_byte: +# print('Room %d has incorrect quadrant byte' % room, y['quadrants']) + if set: + y['associated_entrance_index'] = get_word(0x82DC40 + i * 2) + return room, y + + +def get_entrance_info(set): + r = {} + for i in range(133 if set == 0 else 7): + room, y = _get_entrance_info_one(i, set) + r.setdefault(room, []).append(y) + return r + +ENTRANCE_INFO = get_entrance_info(0) +STARTING_POINT_INFO = get_entrance_info(1) +PITS_HURT_PLAYER = set(get_word(0x80990C + i * 2) for i in range(57)) + +def print_room(room_index): + p = 0x1f8000 + room_index * 3 + room_addr = get_byte(p) | get_byte(p+1) << 8 | get_byte(p+2) << 16 + p = 0x40000 | get_word(0x4f502 + room_index * 2) + if p == 0x4FFEF: + p = 0x82EDC5 # just some place with zeros + floor, layout = get_byte(room_addr), get_byte(room_addr + 1) + + flags = get_byte(p + 0) + p7, p8 = get_byte(p + 7), get_byte(p + 8) + + ea = 0x890000 + get_word(0x89D62E + room_index * 2) + sort_sprites_setting = get_byte(ea) + + header = { + 'floor1': floor & 0xf, + 'floor2' : floor >> 4, + 'layout': layout >> 2, + 'start_quadrant' : layout & 3, + 'bg2' : tables.kBg2[flags >> 5], + 'collision' : tables.kCollisionNames[flags >> 2 & 7], + 'lights_out' : flags & 1, + 'palette' : get_byte(p + 1), + 'blockset' : get_byte(p + 2), + 'enemyblk' : get_byte(p + 3), + 'effect' : tables.kEffectNames[get_byte(p + 4)], + 'tag0' : tables.kTagNames[get_byte(p + 5)], + 'tag1' : tables.kTagNames[get_byte(p + 6)], + 'hole0_dest' : [get_byte(p+9), p7 & 3], + 'stair0_dest' : [get_byte(p+10), p7 >> 2 & 3], + 'stair1_dest' : [get_byte(p+11), p7 >> 4 & 3], + 'stair2_dest' : [get_byte(p+12), p7 >> 6 & 3], + 'stair3_dest' : [get_byte(p+13),p8 & 3], + 'tele_msg' : get_word(0x87F61D+room_index*2), + 'sort_sprites' : sort_sprites_setting, + 'pits_hurt_player' : room_index in PITS_HURT_PLAYER + } + + def get_sprites(): + ea = 0x890000 + get_word(0x89D62E + room_index * 2) + ea += 1 + r = [] + while get_byte(ea) != 0xff: + y, x, type = get_byte(ea), get_byte(ea+1), get_byte(ea+2) + if type == 0xe4: + if y == 0xfe or y == 0xfd: + r[-1].append('drop_key' if y == 0xfe else 'drop_big_key') + ea += 3 + continue + elif x >= 0xe0: + floor = y >> 7 + r.append([x & 0x1f, y & 0x1f, 'lower' if floor else 'upper', tables.kSpriteNames[type + 0x100]]) + ea += 3 + continue + subtype = (x >> 5) | ((y >> 5) & 3) << 3 + floor = y >> 7 + name = tables.kSpriteNames[type] + if subtype != 0: + i = name.index('-') + name = name[:i] + ('.%d' % subtype) + name[i:] + r.append([x & 0x1f, y & 0x1f, 'lower' if floor else 'upper', name]) + ea += 3 + return r + + def get_secrets(): + ea = 0x810000 | get_word(0x81db69 + room_index * 2) + xs = [] + while get_word(ea) != 0xffff: + pos = get_word(ea) + assert pos%2==0 + x, y = pos//2%64, pos//2//64 + xs.append([x, y, tables.kSecretNames[get_byte(ea+2)]]) + ea += 3 + return xs + + def get_chests(): + r = [] + for data, big in CHEST_INFO.get(room_index, []): + if big: + r.append('%d!' % data) + else: + r.append(data) + return r + + sprites = get_sprites() + secrets = get_secrets() + + data = {'Header' : header, 'Sprites' : sprites, 'Secrets' : secrets, 'Chests' : get_chests()} + data['Entrances'] = ENTRANCE_INFO.get(room_index, []) + if room_index in STARTING_POINT_INFO: + data['StartingPoints'] = STARTING_POINT_INFO[room_index] + + p = room_addr + 2 + p, objs, doors = decode_room_objects(p) + data['Layer1'] = objs + if doors: data['Layer1.doors'] = doors + + p, objs, doors = decode_room_objects(p) + data['Layer2'] = objs + if doors: data['Layer2.doors'] = doors + + p, objs, doors = decode_room_objects(p) + data['Layer3'] = objs + if doors: data['Layer3.doors'] = doors + + + return yaml.dump(data, default_flow_style=None, sort_keys=False) + +def print_all_dungeon_rooms(): + for i in range(320): + s = print_room(i) + open(PATH + 'dungeon/dungeon-%d.yaml' % i, 'w').write(s) + +def print_default_rooms(): + def print_default_room(idx): + p = 0x84EF2F + idx * 3 + room_addr = get_byte(p) | get_byte(p+1) << 8 | get_byte(p+2) << 16 + p, objs, doors = decode_room_objects(room_addr) + assert doors == None + return objs + default_rooms = {} + for i in range(8): + default_rooms['Default%d' % i] = print_default_room(i) + s = yaml.dump(default_rooms, default_flow_style=None, sort_keys=False) + open(PATH + 'dungeon/default_rooms.yaml', 'w').write(s) + +def print_overlay_rooms(): + def print_overlay_room(idx): + p = 0x84ECC0 + idx * 3 + room_addr = get_byte(p) | get_byte(p+1) << 8 | get_byte(p+2) << 16 + p, objs, doors = decode_room_objects(room_addr) + assert doors == None + return objs + default_rooms = {} + for i in range(19): + default_rooms['Overlay%d' % i] = print_overlay_room(i) + s = yaml.dump(default_rooms, default_flow_style=None, sort_keys=False) + open(PATH + 'dungeon/overlay_rooms.yaml', 'w').write(s) + +def print_all(): + os.makedirs('img', exist_ok=True) + os.makedirs('overworld', exist_ok=True) + os.makedirs('dungeon', exist_ok=True) + os.makedirs('sound', exist_ok=True) + print_all_overworld_areas() + decode_link_sprites() + print_all_dungeon_rooms() + print_overlay_rooms() + print_default_rooms() + print_dialogue() + print_map32_to_map16(open(PATH+'map32_to_map16.txt', 'w')) + extract_music.extract_sound_data(ROM) + + +print_all() diff --git a/tables/tables.py b/tables/tables.py new file mode 100644 index 00000000..44afbdc9 --- /dev/null +++ b/tables/tables.py @@ -0,0 +1,882 @@ +def invert_dict(xs): + return {s:i for i,s in xs.items()} + +type0_names="""Ceiling [L-R] +[N]Wall Horz: [L-R] +[S]Wall Horz: [L-R] +[N]Wall Horz: (LOW) [L-R] +[S]Wall Horz: (LOW) [L-R] +[N]Wall Column [L-R] +[S]Wall Column [L-R] +[N]Wall Pit [L-R] +[S]Wall Pit [L-R] +/ Wall Wood Bot (HIGH) [NW] +\ Wall Wood Bot (HIGH) [SW] +\ Wall Wood Bot (HIGH) [NE] +/ Wall Wood Bot (HIGH) [SE] +/ Wall Tile Bot (HIGH) [NW] +\ Wall Tile Bot (HIGH) [SW] +\ Wall Tile Bot (HIGH) [NE] +/ Wall Tile Bot (HIGH) [SE] +/ Wall Tile2 Bot (HIGH) [NW] +\ Wall Tile2 Bot (HIGH) [SW] +\ Wall Tile2 Bot (HIGH) [NE] +/ Wall Tile2 Bot (HIGH) [SE] +/ Wall Tile Top (LOW)[NW] +\ Wall Tile Top (LOW)[SW] +\ Wall Tile Top (LOW)[NE] +/ Wall Tile Top (LOW)[SE] +/ Wall Tile Bot (LOW)[NW] +\ Wall Tile Bot (LOW)[SW] +\ Wall Tile Bot (LOW)[NE] +/ Wall Tile Bot (LOW)[SE] +/ Wall Tile2 Bot (LOW)[NW] +\ Wall Tile2 Bot (LOW)[SW] +\ Wall Tile2 Bot (LOW)[NE] +/ Wall Tile2 Bot (LOW)[SE] +Mini Stairs [L-R] +Horz: Rail Thin [L-R] +Pit [N]Edge [L-R] +Pit [N]Edge [L-R] +Pit [N]Edge [L-R] +Pit [N]Edge [L-R] +Pit [N]Edge [L-R] +Pit [S]Edge [L-R] +Pit [S]Edge [L-R] +Pit [N]Edge [L-R] +Pit [SE]Corner [L-R] +Pit [SW]Corner [L-R] +Pit [NE]Corner [L-R] +Pit [NW]Corner [L-R] +Rail Wall [L-R] +Rail Wall [L-R] +Unused -empty +Unused -empty +Red Carpet Floor [L-R] +Red Carpet Floor Trim [L-R] +Unused -empty +[N]Curtain [L-R] +[W]Curtain [L-R]-unused- +Statue [L-R] +Column [L-R] +[N]Wall Decor: [L-R] +[S]Wall Decor: [L-R] +Double Chair [L-R] +Stand Torch [L-R] +[N]Wall Column [L-R] +Water Edge [L-R] +Water Edge [L-R] +Water Edge [L-R] +Water Edge [L-R] +Water Edge [L-R] +Water Edge [L-R] +Water Edge [L-R] +Water Edge [L-R] +Unused Waterfall [L-R] +Unused Waterfall [L-R] +N/A +N/A +[S]Wall Column [L-R] +Bar [L-R] +Shelf [L-R] +Shelf [L-R] +Shelf [L-R] +Cane Ride [L-R] +[N]Canon Hole [L-R] +[S]Canon Hole [L-R] +Cane Ride [L-R] +Unused [L-R] +[N]Wall Torches [L-R] +[S]Wall Torches [L-R] +Unused +Unused +Unused +Unused +[N]Canon Hole [L-R] +[S]Canon Hole [L-R] +Large Horz: Rail [L-R] +Block [L-R] +Long Horz: Rail [L-R] +Ceiling [U-D] +[W]Wall Vert: [U-D] +[E]Wall Vert: [U-D] +[W]Wall Vert: (LOW) [U-D] +[E]Wall Vert: (LOW) [U-D] +[W]Wall Column [U-D] +[E]Wall Column [U-D] +[W]Wall Pit [U-D] +[E]Wall Pit [U-D] +Vert: Rail Thin [U-D] +[W]Pit Edge [U-D] +[E]Pit Edge [U-D] +[W]Rail Wall [U-D] +[E]Rail Wall [U-D] +Unused +Unused +Red Floor/Wire Floor [U-D] +Red Carpet Floor Trim [U-D] +Unused +[W]Curtain [U-D] +[E]Curtain [U-D] +Column [U-D] +[W]Wall Decor: [U-D] +[E]Wall Decor: [U-D] +[W]Wall Top Column [U-D] +Water Edge [U-D] +Water Edge [U-D] +[E]Wall Top Column [U-D] +Cane Ride [U-D] +Pipe Ride [U-D] +Unused +[W]Wall Torches [U-D] +[E]Wall Torches [U-D] +[W]Wall Decor: [U-D] +[E]Wall Decor: [U-D] +[W]Wall Decor:?? [U-D] +[E]Wall Decor:?? [U-D] +[W]Wall Canon Hole [U-D] +[E]Wall Canon Hole [U-D] +Floor Torch [U-D] +Large Vert: Rail [U-D] +Block Vert: [U-D] +Long Vert: Rail [U-D] +[W]Vert: Jump Edge [U-D] +[E]Vert: Jump Edge [U-D] +[W]Edge [U-D] +[E]Edge [U-D] +N/A +[W]Wall Vert: [U-D] +[E]Wall Horz: [U-D] +Blue Peg Block [U-D] +Orange Peg Block [U-D] +Invisible Floor [U-D] +Fake Pot [U-D] +Hammer Peg Block [U-D] +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +/ Ceiling [NW] +\ Ceiling [SW] +\ Ceiling [NE] +/ Ceiling [SE] +Hole [4-way] +/ Ceiling [Trans][NW] +\ Ceiling [Trans][SW] +\ Ceiling [Trans][NE] +/ Ceiling [Trans][SE] +/ Ceiling [BG2 X-RAY][SE] +\ Ceiling [BG2 X-RAY][NE] +\ Ceiling [BG2 X-RAY][SW] +/ Ceiling [BG2 X-RAY][NW] +N/A +N/A +N/A +[S]Horz: Jump Edge [L-R] +[S]Horz: Jump Edge [L-R] +Floor? [L-R] +N/A +N/A +N/A +[N]Wall Decor: 1/2 [L-R] +[S]Wall Decor: 1/2 [L-R] +Blue Switch Block [L-R] +Red Switch Block [L-R] +Invisible Floor [L-R] +N/A +fake pots [L-R] +Hammer Pegs [L-R] +Unused +Unused +Ceiling Large [4-way] +Chest Pedastal [4-way] +Falling Edge Mask [4-way] +Falling Edge Mask [4-way] +Doorless Room Transition +Floor3 [4-way] +BG2 X-RAY Overlay [4-way] +Floor4 [4-way] +Water Floor [4-way] +Water Floor2 [4-way] +Floor5 [4-way] +Unused +Unused +Moving Wall Right [4-way] +Moving Wall Left [4-way] +Unused +Unused +Water Floor3 [4-way] +Floor6 [4-way] +Unused +Unused +Unused +N/A +overlay tile? [4-way] +Lava Background? [4-way] +Swimming Overlay [4-way] +Lava Background 2 [4-way] +Floor2 [4-way] +Chest Platform? [4-way] +Table / Rock [4-way] +Spike Block [4-way] +Spike Floor [4-way] +Floor7 [4-way] +Floor9 [4-way] +Rupee Floor [4-way] +Moving Floor Up [4-way] +Moving Floor Down [4-way] +Moving Floor Left [4-way] +Moving Floor Right [4-way] +Moving Floor/Water [4-way] +Weird Floor? [4-way] +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Unused +Water Face +Waterfall Face +Waterfall Face Longer +Cane Ride Spawn [?]Block +Cane Ride Node [4-way] +Cane Ride Node [S-E] +Cane Ride Node [N-E] +Cane Ride Node [S-E]-2 +Cane Ride Node [N-E]-2 +Cane Ride Node [W-S-E] +Cane Ride Node [W-N-E] +Cane Ride Node [N-E-S] +Cane Ride Node [N-W-S] +Prison Cell +Cane Ride Spawn [?]Block +? +? +? +Rupee Floor +Telepathic Tile +Down Warp Door +Kholdstare Shell - BG2 +Single Hammer Peg +Cell +Cell Lock +Chest +Open Chest +Stair +Stair [S](Layer) +Stair Wet [S](Layer) +Staircase going Up(Up) +Staircase Going Down (Up) +Staircase Going Up (Down) +Staircase Going Down (Down) +Pit Wall Corner +Pit Wall Corner +Pit Wall Corner +Pit Wall Corner +Staircase Going Up (Lower) +Staircase Going Up (Lower) +Staircase Going Down (Lower) +Staircase Going Down (Lower) +Dark Room BG2 Mask +Staircase Going Down (Lower) +Large Pick Up Block +Agahnim Altar +Agahnim Room +Pot +?? +Big Chest +Big Chest Open +Stairs Submerged [S](layer) +??? +??? +??? +??? +??? +??? +Pipe Ride Mouth [S] +Pipe Ride Mouth [N] +Pipe Ride Mouth [E] +Pipe Ride Mouth [W] +Pipe Ride Corner [S-E] +Pipe Ride Corner [N-E] +Pipe Ride Corner [S-W] +Pipe Ride Corner [N-W] +Pipe Ride Tunnel [N] +Pipe Ride Tunnel [S] +Pipe Ride Tunnel [W] +Pipe Ride Tunnel [E] +Pipe Ride Over Mask [U-D] +Bomb Floor +Fake Bomb Floor +Fake Bomb Floor +Warp Tile +??? +??? +??? +??? +Inactive Warp +Floor Switch +Skull Pot +Single Blue Peg +Single Red Peg + +??? +Bar Corner [NW] +Bar Corner [SW] +Bar Corner [NE] +Bar Corner [SE] +Plate on Table +Water Troof +Bookshelf +Forge +??? +Bottles on Bar +??? +Left Warp Door +Right Warp Door +Fake Floor Switch +Fireball Shooter +Medusa Head +Hole +Top Crack Wall +Bottom Crack Wall +Left Crack Wall +Right Crack Wall +Throne/Decor: Object +??? +??? +??? +??? +Window Light +Floor Light Blind BG2 +Boss Goo/Shell BG2 +Bg2 Full Mask +Boss Entrance +Minigame Chest +??? +??? +??? +??? +??? +Vitreous Boss? +??? +??? +??? +??? +""".splitlines() + +type2_names="""Wall Outer Corner (HIGH) [NW] +Wall Outer Corner (HIGH) [SW] +Wall Outer Corner (HIGH) [NE] +Wall Outer Corner (HIGH) [SE] +Wall Inner Corner (HIGH) [NW] +Wall Inner Corner (HIGH) [SW] +Wall Inner Corner (HIGH) [NE] +Wall Inner Corner (HIGH) [SE] +Wall Outer Corner (LOW) [NW] +Wall Outer Corner (LOW) [SW] +Wall Outer Corner (LOW) [NE] +Wall Outer Corner (LOW) [SE] +Wall Inner Corner (LOW) [NW] +Wall Inner Corner (LOW) [SW] +Wall Inner Corner (LOW) [NE] +Wall Inner Corner (LOW) [SE] +Wall S-Bend (LOW) [N1] +Wall S-Bend (LOW) [S1] +Wall S-Bend (LOW) [N2] +Wall S-Bend (LOW) [S2] +Wall S-Bend (LOW) [W1] +Wall S-Bend (LOW) [W2] +Wall S-Bend (LOW) [E1] +Wall S-Bend (LOW) [E2] +Wall Pit Corner (Lower) [NW] +Wall Pit Corner (Lower) [SW] +Wall Pit Corner (Lower) [NE] +Wall Pit Corner (Lower) [SE] +Fairy Pot +Statue +Star Tile Off +Star Tile On +Torch Lit +Barrel +Weird Bed +Table +Decoration +??? +??? +Chair +Bed +Decoration +Wall Painting +??? +??? +Floor Stairs Up (room) +Floor Stairs Down (room) +Floor Stairs Down2 (room) +Stairs [N](unused) +Stairs [N](layer) +Stairs [N](layer) +Stairs Submerged [N](layer) +Block +Water Ladder +Water Ladder +Water Gate Large +Door Staircase Up R +Door Staircase Down L +Door Staircase Up R (Lower) +Door Staircase Down L (Lower) +Sanctuary Wall +??? +Church Pew +??? +Ceiling [L-R]""".splitlines() + +kType0Names = ['%.2X-%s' % (i, type0_names[i]) for i in range(0xf8)] +kType1Names = ['%.3X-%s' % (0xf80 + i, type0_names[i+0xf8]) for i in range(0x80)] +kType2Names = ['%X-%s' % (i + 0x100, x) for i,x in enumerate(type2_names)] + +def invert_list(x): + return {s:i for i,s in enumerate(x)} + +kType0Names_rev = invert_list(kType0Names) +kType1Names_rev = invert_list(kType1Names) +kType2Names_rev = invert_list(kType2Names) + +kTagNames = [ "None","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 room to open", + "NW Move block to open","NE Move block to open","SW Move block to open","SE Move block to open","W Move block to open","E Move block to open","N Move block to open", + "S Move block to open","Move block to open","Pull lever to open","Clear level to open door","Switch opens door(Hold)","Switch opens door(Toggle)", + "Turn off water","Turn on water","Water gate","Water twin","Secret wall (Right)","Secret wall (Left)","Crash","Crash", + "Use switch to bomb wall","Holes(0)","Open chest for holes(0)","Holes(1)","Holes(2)","Kill enemy to clear level","SE Kill enemy to move block","Trigger activated chest", + "Use lever to bomb wall","NW Kill enemy for chest","NE Kill enemy for chest","SW Kill enemies 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 room for chest","Light torches to open","Holes(3)","Holes(4)","Holes(5)","Holes(6)", + "Agahnim's room","Holes(7)","Holes(8)","Open chest for holes(8)","Move block to get chest","Kill to open Ganon's door","Light torches to get chest","Kill boss again", +] + +kTagNames_rev = invert_list(kTagNames) + +kEffectNames = ["None","01","Moving floor","Moving water","04","Red flashes","Light torch to see floor","Ganon room"] +kEffectNames_rev = invert_list(kEffectNames) + +kCollisionNames = ["One", "Both", "Both w/scroll", "Moving floor", "Moving water"] +kCollisionNames_rev = invert_list(kCollisionNames) + +kBg2 = ["None", "Parallaxing", "Dark", "On top", "Translucent", "Parallaxing2", "Normal", "Addition", "Dark room"] +kBg2_rev = invert_list(kBg2) + +kMusicNames = { + 255: "Same", + 0: "None", + 1:"Title", + 2:"World_map", + 3:"Beginning", + 4:"Rabbit", + 5:"Forest", + 6:"Intro", + 7:"Town", + 8:"Warp", + 9:"Dark_world", + 10:"Master_swd", + 11:"File_select", + 12:"Soldier", + 13:"Mountain", + 14:"Shop", + 15:"Fanfare", + 16:"Castle", + 17:"Palace", + 18:"Cave", + 19:"Clear", + 20:"Church", + 21:"Boss", + 22:"Dungeon", + 23:"Psychic", + 24:"Secret_way", + 25:"Rescue", + 26:"Crystal", + 27:"Fountain", + 28:"Pyramid", + 29:"Kill_Agah", + 30:"Ganon_room", + 31:"Last_boss", + 32:"Triforce", + 33:"Ending", + 34:"Staff", + 240:"Stop", + 241:"Fade_out", + 242:"Lower_vol", + 243:"Normal_vol" +} + +kMusicNamesRev = invert_dict(kMusicNames) + +kAmbientSoundName = { + 0: "None", + 1: "Heavy rain", + 3: "Light rain", + 5: "Stop", + 7: "Earthquake", + 9: "Wind", + 11: "Flute", + 13: "Chime 1", + 15: "Chime 2" +} + +kAmbientSoundNameRev = invert_dict(kAmbientSoundName) + +kPalaceNames = ( + "None", + "Church", + + "Castle", + "East", + "Desert", + "Agahnim", + + "Water", + "Dark", + "Mud", + "Wood", + + "Ice", + "Tower", + "Town", + "Mountain", + "Agahnim2" +) + +kAreaNames = """LW 000 : Lost Woods NW +LW 001 : Lost Woods NE +LW 002 : Lumberjack Estate +LW 003 : Tower of Hera NW +LW 004 : Tower of Hera NE +LW 005 : Death Mountain Bridge NW +LW 006 : Death Mountain Bridge NE +LW 007 : Turtle Rock +LW 008 : Lost Woods SW +LW 009 : Lost Woods SE +LW 010 : Death Mountain Gateway +LW 011 : Tower of Hera SW +LW 012 : Tower of Hera SE +LW 013 : Mountain Bridge NW +LW 014 : Mountain Bridge NE +LW 015 : Zora Falls Outskirts +LW 016 : Lost Woods Outskirts +LW 017 : Kakariko Psychics Unlimited +LW 018 : Nothern Pond +LW 019 : Sanctuary Grounds +LW 020 : Graveyard +LW 021 : South Bend +LW 022 : Coven of Commerce +LW 023 : Zora Ridge +LW 024 : Kakariko NW +LW 025 : Kakariko NE +LW 026 : West Woods +LW 027 : Hyrule Castle NW +LW 028 : Hyrule Castle NE +LW 029 : Castle East Bridge +LW 030 : Eastern Ruins NW +LW 031 : Eastern Ruins NE +LW 032 : Kakariko SW +LW 033 : Kakariko SE +LW 034 : Smithy Estate +LW 035 : Hyrule Castle SW +LW 036 : Hyrule Castle SE +LW 037 : Moundlands +LW 038 : Eastern Ruins SW +LW 039 : Eastern Ruins SE +LW 040 : Kakariko Maze +LW 041 : Kakariko South Annex +LW 042 : Haunted Grove +LW 043 : Uncle's Estate West +LW 044 : Uncle's Estate East +LW 045 : Eastern Ruins Bridge +LW 046 : Eastern Ruins Ridge +LW 047 : Eastern Cul-de-sac +LW 048 : Desert of Mystery NW +LW 049 : Desert of Mystery NE +LW 050 : Haunted Terrace +LW 051 : Hyrule Wetlands NW +LW 052 : Hyrule Wetlands NE +LW 053 : Lake Hylia NW +LW 054 : Lake Hylia NE +LW 055 : Frosty Caves +LW 056 : Desert of Mystery SW +LW 057 : Desert of Mystery SE +LW 058 : Via of Mystery +LW 059 : Watergate Grounds +LW 060 : Hyrule Wetlands Terrace +LW 061 : Lake Hylia SW +LW 062 : Lake Hylia SE +LW 063 : Octorock Nesting Grounds +DW 064 : Skull Woods NW +DW 065 : Skull Woods NE +DW 066 : Eastern Skull Clearing +DW 067 : Ganon's Tower NW +DW 068 : Ganon's Tower NE +DW 069 : Death Mountain Bridge NW +DW 070 : Death Mountain Bridge NE +DW 071 : Turtle Rock +DW 072 : Skull Woods SW +DW 073 : Skull Woods SE +DW 074 : Bungie Cave Fun Zone +DW 075 : Ganon's Tower SW +DW 076 : Ganon's Tower SE +DW 077 : Death Mountain Bridge SW +DW 078 : Death Mountain Bridge SE +DW 079 : Falls of Ill Omen +DW 080 : Skull Woods Outskirts +DW 081 : Village of Outcasts Psychics Unlimited +DW 082 : Northern Pond (Evil Edition) +DW 083 : Unctuary Grounds +DW 084 : Garden of Very Bad Things +DW 085 : South Bend +DW 086 : Riverside Commerce +DW 087 : Ridge of Ill Omen +DW 088 : Village of Outcasts NW +DW 089 : Village of Outcasts NE +DW 090 : West Woods +DW 091 : Pyramid of Power NW +DW 092 : Pyramid of Power NE +DW 093 : Pyramid East Non-bridge +DW 094 : Maze of Darkness NW +DW 095 : Maze of Darkness NE +DW 096 : Village of Outcasts SW +DW 097 : Village of Outcasts SW +DW 098 : Gossip Shop +DW 099 : Pyramid of Power SW +DW 100 : Pyramid of Power SE +DW 101 : Moundlands +DW 102 : Maze of Darkness SW +DW 103 : Maze of Darkness SE +DW 104 : Digging Game Field +DW 105 : Archery Shop Grounds +DW 106 : Depressing Grove +DW 107 : Bomb Shop Grounds West +DW 108 : Bomp Shop Grounds +DW 109 : Hammer Time Bridge +DW 110 : Terrace of Darkness +DW 111 : Cul-de-sac of Darkness +DW 112 : Swamp of Evil NW +DW 113 : Swamp of Evil NE +DW 114 : Depressing Terrace +DW 115 : Wilted Wetlands NW +DW 116 : Wilted Wetlands NE +DW 117 : Lake Dielia NW +DW 118 : Lake Dielia NE +DW 119 : Info Hub +DW 120 : Swamp of Evil SW +DW 121 : Swamp of Evil SE +DW 122 : Via To Nowhere +DW 123 : Swamp Palace Grounds +DW 124 : Wilted Terrace +DW 125 : Lake Dielia SW +DW 126 : Lake Dielia SE +DW 127 : A Terrible Vacation Spot +SP 128 : Master Grove / Under Hyrule Bridge +SP 129 : Zora Falls NW +SP 130 : Zora Falls NE +NA 131 : Unused N/A +NA 132 : Unused N/A +NA 133 : Unused N/A +NA 134 : Unused N/A +NA 135 : Unused N/A +SP 136 : Triforce Room / Curtain Overlay +SP 137 : Zora Falls SW +SP 138 : Zora Falls SE +NA 139 : Unused N/A +NA 140 : Unused N/A +NA 141 : Unused N/A +NA 142 : Unused N/A +NA 143 : Unused N/A +NA 144 : Unused N/A +NA 145 : Unused N/A +NA 146 : Unused N/A +SP 147 : Triforce Rm / Overlay (2?) N/A +SP 148 : Master Gr. / Under Bdg (2?) N/A +SP 149 : Birds' Eye Woods Underlay +SP 150 : Death Mountain Panorama +SP 151 : Lost Woods Mist Overlay +NA 152 : Unused N/A +NA 153 : Unused N/A +NA 154 : Unused N/A +NA 155 : Unused N/A +SP 156 : Lava Flow Underlay +SP 157 : Lost Woods Mist Overlay (2?) N/A +SP 158 : Lost Woods Tree Cover Overlay +SP 159 : Rain Overlay +NA 160 : non-existant N/A""".splitlines() + +kEntranceNames = """[Room #260] -- Link's House Intro +[Room #260] -- Link's House Post-intro +[Room #018] -- Sanctuary +[Room #096] -- Hyrule Castle West +[Room #097] -- Hyrule Castle Central +[Room #098] -- Hyrule Castle East +[Room #240] -- Death Mountain Express (Lower) +[Room #241] -- Death Mountain Express (Upper) +[Room #201] -- Eastern Palace +[Room #132] -- Desert Palace Central +[Room #133] -- Desert Palace East +[Room #131] -- Desert Palace West +[Room #099] -- Desert Palace Boss Lair +[Room #242] -- Kakariko Elder's House West +[Room #243] -- Kakariko Elder's House East +[Room #244] -- Kakariko Angry Bros West +[Room #245] -- Kakariko Angry Bros East +[Room #227] -- Mad Batter Lair +[Room #226] -- Under Lumberjacks' Weird Tree +[Room #248] -- Death Mountain Maze 0000 +[Room #232] -- Death Mountain Maze 0001 +[Room #035] -- Turtle Rock Mountainface 1 +[Room #251] -- Death Mountain Cape Heart Piece Cave (Lower) +[Room #235] -- Death Mountain Cape Heart Piece Cave (Upper) +[Room #213] -- Turtle Rock Mountainface 2 +[Room #036] -- Turtle Rock Mountainface 3 +[Room #253] -- Death Mountain Maze 0002 +[Room #237] -- Death Mountain Maze 0003 +[Room #254] -- Death Mountain Maze 0004 +[Room #238] -- Death Mountain Maze 0005 +[Room #255] -- Death Mountain Maze 0006 +[Room #239] -- Death Mountain Maze 0007 +[Room #223] -- Death Mountain Maze 0008 +[Room #249] -- Spectacle Rock Maze 1 +[Room #250] -- Spectacle Rock Maze 2 +[Room #234] -- Spectacle Rock Maze 3 +[Room #224] -- Hyrule Castle Tower +[Room #040] -- Swamp Palace +[Room #074] -- Palace of Darkness +[Room #152] -- Misery Mire +[Room #086] -- Skull Woods 1 +[Room #087] -- Skull Woods 2 +[Room #088] -- Skull Woods Big Chest +[Room #089] -- Skull Woods Boss Lair +[Room #225] -- Lost Woods Thieves' Lair +[Room #014] -- Ice Palace +[Room #230] -- Death Mountain Escape West +[Room #231] -- Death Mountain Escape East +[Room #228] -- Death Mountain Elder's Cave (Lower) +[Room #229] -- Death Mountain Elder's Cave (Upper) +[Room #085] -- Hyrule Castle Secret Cellar +[Room #119] -- Tower of Hera +[Room #219] -- Thieves's Town +[Room #214] -- Turtle Rock Main +[Room #016] -- Ganon's Pyramid Sanctum (Lower) +[Room #012] -- Ganon's Tower +[Room #008] -- Fairy Cave 1 +[Room #047] -- Kakariko Western Well +[Room #060] -- Death Mountain Maze 0009 +[Room #044] -- Death Mountain Maze 0010 +[Room #256] -- Treasure Shell Game 1 +[Room #286] -- Storyteller Cave 1 +[Room #257] -- Snitch House 1 +[Room #257] -- Snitch House 2 +[Room #258] -- SickBoy House +[Room #279] -- Byrna Gauntlet +[Room #259] -- Kakariko Pub South +[Room #259] -- Kakariko Pub North +[Room #259] -- Kakariko Inn +[Room #261] -- Sahasrahlah's Disco Infernum +[Room #287] -- Kakariko's Lame Shop +[Room #262] -- Village of Outcasts Chest Game +[Room #262] -- Village of Outcasts Orphanage +[Room #263] -- Kakariko Library +[Room #263] -- Kakariko Storage Shed +[Room #264] -- Kakariko Sweeper Lady's House +[Room #265] -- Potion Shop +[Room #266] -- Aginah's Desert Cottage +[Room #267] -- Watergate +[Room #268] -- Death Mountain Maze 0011 +[Room #268] -- Fairy Cave 2 +[Room #283] -- Refill Cave 0001 +[Room #283] -- Refill Cave 0002 +[Room #284] -- The Bomb "Shop" +[Room #284] -- Village of Outcasts Retirement Center +[Room #286] -- Fairy Cave 3 +[Room #288] -- Good Bee Cave +[Room #272] -- General Store 1 +[Room #274] -- General Store 2 +[Room #273] -- Archery Game +[Room #274] -- Storyteller Cave 2 +[Room #275] -- Hall of the Invisibility Cape +[Room #276] -- Pond of Wishing +[Room #277] -- Pond of Happiness +[Room #277] -- Fairy Cave 4 +[Room #269] -- Swamp of Evil Heart Piece Hall +[Room #271] -- General Store 3 +[Room #281] -- Blind's Old Hideout +[Room #276] -- Storyteller Cave 3 +[Room #278] -- Warped Pond of Wishing +[Room #289] -- Chez Smithies +[Room #290] -- Fortune Teller 1 +[Room #290] -- Fortune Teller 2 +[Room #280] -- Chest Shell Game 2 +[Room #282] -- Storyteller Cave 4 +[Room #270] -- Storyteller Cave 5 +[Room #270] -- Storyteller Cave 6 +[Room #287] -- Village House 1 +[Room #291] -- Thief Hideout 1 +[Room #292] -- Thief Hideout 2 +[Room #292] -- Heart Piece Cave 1 +[Room #293] -- Thief Hideout 3 +[Room #293] -- Refill Cave 3 +[Room #294] -- Fairy Cave 5 +[Room #294] -- Heart Piece Cave 2 +[Room #128] -- Hyrule Castle Prison +[Room #081] -- Hyrule Castle Throne Room +[Room #048] -- Hyrule Tower Agahnim's Sanctum +[Room #088] -- Skull Woods 3 (Drop In) +[Room #103] -- Skull Woods 4 (Drop In) +[Room #104] -- Skull Woods 5 (Drop In) +[Room #086] -- Skull Woods 6 (Drop In) +[Room #225] -- Lost Woods Thieves' Hideout (Drop In) +[Room #000] -- Ganon's Pyramid Sanctum (Upper) +[Room #024] -- Fairy Cave 6 (Drop In) +[Room #085] -- Hyrule Castle Secret Cellar (Drop In) +[Room #227] -- Mad Batter Lair (Drop In) +[Room #226] -- Under Lumberjacks' Weird Tree (Drop In) +[Room #047] -- Kakariko Western Well (Drop In) +[Room #017] -- Hyrule Sewers Goodies Room (Drop In) +[Room #003] -- Chris Houlihan Room (Drop In) +[Room #295] -- Heart Piece Cave 3 (Drop In) +[Room #288] -- Ice Rod Cave""".splitlines() + +kEntranceNames = [a[a.find(' -- ') + 4:] for a in kEntranceNames] + +kEntranceNames_rev = {s:i for i,s in enumerate(kEntranceNames)} + +kSpriteNames=['00:Raven', '01:Vulture', '02', '03:BigCanon', '04:PullSwitch', '05:DnSwitch', '06:TrapSwitch', '07:FloorMove', '08:Octorok', '09:Mouldrum', '0A:4WayOctorok', '0B:Chicken', '0C:HoveringRock', '0D:Cucumber', '0E:SnapDragon', '0F:OctoBlimp', '10', '11:Hinox', '12:PigSpearMan', '13:MiniHelmasaur', '14:GargoyleGrate', '15:Bubble', '16:Mutant', '17:BushCrab', '18:Moldorm', '19:Poe/Ghini', '1A:BlackSmith(Frog', '1B:AnArrow', '1C:Statue', '1D:UselessSprite', '1E:PegSwitch', '1F:SickBoy', '20:BombSlug', '21:PushSwitch', '22:HoppingBulbPlan', '23:RedMiri', '24:BlueMiri', '25:LiveTree', '26:BlueOrb', '27:Squirrel', '28:PersonRm270', '29:Thief', '2A:DustGirl', '2B:TentMan', '2C:Lumberjacks', '2D', '2E:FluteBoy', '2F:Person', '30:Person', '31:FortuneTeller', '32:AngryBrother', '33:PullForRupees', '34:ScaredGirl2', '35:HedgeMan', '36:Witch', '37:Waterfall', '38:ArrowTarget', '39:GuyByTheSign', '3A:Person11_227', '3B:DashItem', '3C:FarmBoy', '3D:ScaredGirl1', '3E:RockCrab', '3F:PalaceGuard', '40:ElectricBarrier', '41:BlueSoldier', '42:GreenSoldier', '43:RedSpearSoldier', '44:Warrior', '45:HogSpearMan', '46:BlueArcher', '47:GreenGrassArche', '48:RedSpearKnight', '49:RedGrassSpearSo', '4A:RedBombKnight', '4B:Knight', '4C:Geldman', '4D:Bunny', '4E:Tentacle2', '4F:Tentacle', '50:GlassSquirrel', '51:Armos', '52:ZoraKing', '53:ArmosKnight', '54:Lanmolas', '55:FireBallZora', '56:WalkingZora', '57:HyliaObstacle', '58:Crab', '59:Animal', '5A:Animal', '5B:WallBubble(L-R)', '5C:WallBubble(R-L)', '5D:Roller_1', '5E:Roller_2', '5F:Roller_3', '60:Roller_4', '61:Beamos', '62:MasterSwd', '63:SandCrab1', '64:SandCrab2', '65:ArcherGame', '66:Cannon(Right)', '67:Cannon(Left)', '68:Cannon(Down)', '69:Cannon(Up)', '6A:MorningStar', '6B:CannonSoldier', '6C:Teleport', '6D:Rat', '6E:Rope', '6F:Keese', '70', '71:Leever', '72:Pond', '73:Priest/Uncle', '74:Runner', '75:BottleMan', '76:Zelda', '77:WierdBuble', '78:OldWoman', '79:Bee', '7A:Agahnim', '7B:OneShotMagicBal', '7C:StalfosHead', '7D:BigSpikeBlock', '7E:FireBlade', '7F:FireBlade2', '80:Lanmola', '81:WaterBug', '82:4Bubbles', '83:GreenRocklops', '84:RedRocklops', '85:BigSpikeBlock', '86:Triceritops', '87:FireKeese', '88:Mothula', '89', '8A:SpikeBlock', '8B:Gibdo', '8C:Arrghus', '8D:ArrghusFuzz', '8E:Shell', '8F:Blob', '90:WallMaster', '91:StalfosKnight', '92:Helmasaur', '93:RedOrb', '94', '95:EyeLaser(Right)', '96:EyeLaser(Left)', '97:EyeLaser(Down)', '98:EyeLaser(Up)', '99:Penguin', '9A:Splash', '9B:Wizzrobe', '9C', '9D:VRat', '9E:Ostrich', '9F:Rabbit', 'A0:Uglybird', 'A1:IceMan', 'A2:KholdStare', 'A3', 'A4', 'A5:GreenLizard', 'A6:RedLizard', 'A7:Stalfos', 'A8:GreenAirBomber', 'A9:BlueAirBomber', 'AA:LikeLike', 'AB', 'AC:Apples', 'AD:OldMan', 'AE:DownPipe', 'AF:UpPipe', 'B0:RightPipe', 'B1:LeftPipe', 'B2:Good-Bee', 'B3:Inscription', 'B4:BlueChest', 'B5:BombShop', 'B6:Kiki', 'B7:BlindMan', 'B8', 'B9:Bully&Whimp(DW)', 'BA:Whirlpool', 'BB:ShopMan', 'BC:OldMan2', 'BD:Viterous', 'BE:', 'BF:Lighting', 'C0:Item', 'C1:AgahTalk', 'C2:RockChip', 'C3:Half-Bubble', 'C4:Bully', 'C5:Shooter', 'C6:4WayShooter', 'C7:FuzzyStack', 'C8:BigFairy', 'C9:Tektite', 'CA:Chomp', 'CB:TriNexx1', 'CC:TriNexx2', 'CD:TriNexx3', 'CE:Blind', 'CF:SwampSnake', 'D0:Lynel', 'D1:Transform/Smoke', 'D2:Fish', 'D3:AliveRock', 'D4:GroundBomb', 'D5:DiggingGameGuy', 'D6:Ganon', 'D7', 'D8:Heart', 'D9:Rupee-G', 'DA:Rupee-B', 'DB:InTreeRocks', 'DC:Bomb', 'DD:4_bombs', 'DE:8_bombs', 'DF:Magic', 'E0:BigMagic', 'E1:Arrow', 'E2:10-Arrows', 'E3:Fairy', 'E4:Key', 'E5:Big_Key', 'E6', 'E7:Mushroom', 'E8:FakeSword', 'E9:ShopMan2', 'EA:WitchAssistant', 'EB:HeartPie', 'EC:PickedObj', 'ED', 'EE:Mantle', 'EF', 'F0', 'F1', 'F2:MedallianTablet', 'F3:PersonsDoor', 'F4:FallingRocks', 'F5', 'F6', 'F7', 'F8', 'F9', 'FA', 'FB', 'FC', 'FD', 'FE', 'FF', '100:CannonRoom', '101:01', '102:CannonRoom', '103:CannonBalls', '104:RopeDrp(Snake)', '105:StalfosDrop', '106:BombDrop', '107:MovingFloor', '108:Transformer', '109:WallMaster', '10A:FloorDrop(Sqr)', '10B:FloorDrop(Vert)', '10C:0C', '10D:0D', '10E:0E', '10F:0F', '110:RightEvil', '111:LeftEvil', '112:DownEvil', '113:UpEvil', '114:FloorTiles', '115:WizzrobeSpawn', '116:MiniBats', '117:PotTrap', '118:StalfosAppear', '119:ArmosKnights', '11A:BombDrop', '11B'] +kSpriteNames = [a.replace(':', '-') for a in kSpriteNames] + +kSpriteName2Idx = {a:i for i,a in enumerate(kSpriteNames)} +kSpriteNamesRev = {v : i for i, v in enumerate(kSpriteNames)} + + + +kSpriteDropToNameIdx = [ + 0xd9, 0x3e, 0x79, 0xd9, 0xdc, 0xd8, 0xda, 0xe4, 0xe1, 0xdc, 0xd8, 0xdf, 0xe0, 0xb, 0x42, 0xd3, + 0x41, 0xd4, 0xd9, 0xe3, 0xd8, 0, ] + +def get_secret_names(): + r = {} + for i in range(1, 23): + r[i] = '%.2X-%s' % (i, kSpriteNames[kSpriteDropToNameIdx[i - 1]][3:]) + kSpecialSecret = {0 : "Nothing", 4 : "Random", 0x80 : "Hole", 0x82 : "Warp", 0x84 : "Staircase", 0x86 : 'Bombable', 0x88 : 'Switch' } + for k,v in kSpecialSecret.items(): + r[k] = '%.2X-%s' % (k, v) + return r + +kSecretNames = get_secret_names() +kSecretNamesRev = invert_dict(kSecretNames) diff --git a/tables/text_compression.py b/tables/text_compression.py new file mode 100644 index 00000000..729183d2 --- /dev/null +++ b/tables/text_compression.py @@ -0,0 +1,255 @@ + +kTextAlphabet = [ + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", + "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + + # codes 0x3E and up + "!", "?", "-", ".", ",", + + # codes 0x43 and up + "[...]", ">", "(", ")", + + # codes 0x47 and up + "[Ankh]", "[Waves]", "[Snake]", "[LinkL]", "[LinkR]", + "\"", "[Up]", "[Down]", "[Left]", "[Right]", "'", + + # codes 0x52 and up + "[1HeartL]", "[1HeartR]", "[2HeartL]", "[3HeartL]", + "[3HeartR]", "[4HeartL]", "[4HeartR]", + + " ", "<", "[A]", "[B]", "[X]", "[Y]", +] + +kText_CommandLengths = [1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, ] +kText_CommandNames = [ + "NextPic", + "Choose", + "Item", + "Name", + "Window", + "Number", + "Position", + "ScrollSpd", + "Selchg", + "Crash", + "Choose3", + "Choose2", + "Scroll", + "1", + "2", + "3", + "Color", + "Wait", + "Sound", + "Speed", + "Mark", + "Mark2", + "Clear", + "Waitkey", + "EndMessage" +] + +kTextDictionary = [ 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, + 0x59, 0x59, + 0x51, 0x2c, 0x59, + 0x1a, 0x27, 0x1d, 0x59, + 0x1a, 0x2b, 0x1e, 0x59, + 0x1a, 0x25, 0x25, 0x59, + 0x1a, 0x22, 0x27, + 0x1a, 0x27, 0x1d, + 0x1a, 0x2d, 0x59, + 0x1a, 0x2c, 0x2d, + 0x1a, 0x27, + 0x1a, 0x2d, + 0x1b, 0x25, 0x1e, + 0x1b, 0x1a, + 0x1b, 0x1e, + 0x1b, 0x28, + 0x1c, 0x1a, 0x27, 0x59, + 0x1c, 0x21, 0x1e, + 0x1c, 0x28, 0x26, + 0x1c, 0x24, + 0x1d, 0x1e, 0x2c, + 0x1d, 0x22, + 0x1d, 0x28, + 0x1e, 0x27, 0x59, + 0x1e, 0x2b, 0x59, + 0x1e, 0x1a, 0x2b, + 0x1e, 0x27, 0x2d, + 0x1e, 0x1d, 0x59, + 0x1e, 0x27, + 0x1e, 0x2b, + 0x1e, 0x2f, + 0x1f, 0x28, 0x2b, + 0x1f, 0x2b, 0x28, + 0x20, 0x22, 0x2f, 0x1e, 0x59, + 0x20, 0x1e, 0x2d, + 0x20, 0x28, + 0x21, 0x1a, 0x2f, 0x1e, + 0x21, 0x1a, 0x2c, + 0x21, 0x1e, 0x2b, + 0x21, 0x22, + 0x21, 0x1a, + 0x22, 0x20, 0x21, 0x2d, 0x59, + 0x22, 0x27, 0x20, 0x59, + 0x22, 0x27, + 0x22, 0x2c, + 0x22, 0x2d, + 0x23, 0x2e, 0x2c, 0x2d, + 0x24, 0x27, 0x28, 0x30, + 0x25, 0x32, 0x59, + 0x25, 0x1a, + 0x25, 0x28, + 0x26, 0x1a, 0x27, + 0x26, 0x1a, + 0x26, 0x1e, + 0x26, 0x2e, + 0x27, 0x51, 0x2d, 0x59, + 0x27, 0x28, 0x27, + 0x27, 0x28, 0x2d, + 0x28, 0x29, 0x1e, 0x27, + 0x28, 0x2e, 0x27, 0x1d, + 0x28, 0x2e, 0x2d, 0x59, + 0x28, 0x1f, + 0x28, 0x27, + 0x28, 0x2b, + 0x29, 0x1e, 0x2b, + 0x29, 0x25, 0x1e, + 0x29, 0x28, 0x30, + 0x29, 0x2b, 0x28, + 0x2b, 0x1e, 0x59, + 0x2b, 0x1e, + 0x2c, 0x28, 0x26, 0x1e, + 0x2c, 0x1e, + 0x2c, 0x21, + 0x2c, 0x28, + 0x2c, 0x2d, + 0x2d, 0x1e, 0x2b, 0x59, + 0x2d, 0x21, 0x22, 0x27, + 0x2d, 0x1e, 0x2b, + 0x2d, 0x21, 0x1a, + 0x2d, 0x21, 0x1e, + 0x2d, 0x21, 0x22, + 0x2d, 0x28, + 0x2d, 0x2b, + 0x2e, 0x29, + 0x2f, 0x1e, 0x2b, + 0x30, 0x22, 0x2d, 0x21, + 0x30, 0x1a, + 0x30, 0x1e, + 0x30, 0x21, + 0x30, 0x22, + 0x32, 0x28, 0x2e, + 0x7, 0x1e, 0x2b, + 0x13, 0x21, 0x1a, + 0x13, 0x21, 0x1e, + 0x13, 0x21, 0x22, + 0x18, 0x28, 0x2e, +] + +kTextDictionary_Idx = [ + 0, 4, 7, 9, 12, 16, 20, 24, 27, 30, 33, 36, 38, 40, 43, 45, 47, 49, 53, 56, 59, 61, 64, 66, 68, 71, 74, 77, 80, 83, 85, 87, 89, 92, 95, 100, 103, 105, 109, 112, 115, 117, 119, 124, 128, 130, 132, 134, 138, 142, 145, 147, 149, 152, 154, 156, 158, 162, 165, 168, 172, 176, 180, 182, 184, 186, 189, 192, 195, 198, 201, 203, 207, 209, 211, 213, 215, 219, 223, 226, 229, 232, 235, 237, 239, 241, 244, 248, 250, 252, 254, 256, 259, 262, 265, 268, 271, 274 +] + +def make_dict(): + r, rinv = {}, {} + for i in range(len(kTextDictionary_Idx) - 1): + ln = kTextDictionary_Idx[i + 1] - kTextDictionary_Idx[i] + idx = kTextDictionary_Idx[i] + s = "".join(kTextAlphabet[kTextDictionary[idx+i]] for i in range(ln)) + r[i] = s + rinv[s] = i + return r, rinv + +kTextDictionary_Ascii, kTextDictionary_AsciiBack = make_dict() + +def decode_strings(get_byte): + p = 0x9c8000 + result = [] + while True: + org_p = p + #print('0x%x' % p) + s = '' + srcdata = [] + while True: + c = get_byte(p) + srcdata.append(c) + l = kText_CommandLengths[c - 0x67] if c >= 0x67 and c < 0x80 else 1 + p += l + if c == 0x7f: + break + if c < 0x67: + s += kTextAlphabet[c] + elif c < 0x80: + if l == 2: + srcdata.append(get_byte(p-1)) + s += '[%s %.2d]' % (kText_CommandNames[c - 0x67], get_byte(p-1)) + else: + s += '[%s]' % kText_CommandNames[c - 0x67] + elif c == 0x80: + p = 0x8edf40 + s = None + break + elif c > 0x80 and c < 0x88: + assert 0 + elif c == 0xff: + return result + else: + s += kTextDictionary_Ascii[c - 0x88] + if s != None: + result.append((s, srcdata)) + +def print_strings(f, get_byte): + for i, s in enumerate(decode_strings(get_byte)): + print('%s: %s' % (i + 1, s[0]), file = f) + +def find_string_char_at(s, i): + a = s[i:] + + for k, v in kTextDictionary_AsciiBack.items(): + if a.startswith(k): + return [v + 0x88], len(k) + + for i, s in enumerate(kTextAlphabet): + if a.startswith(s): + return [i], len(s) + + if a.startswith('['): + cmd = a[1:a.index(']')] + if cmd in kText_CommandNames: + i = kText_CommandNames.index(cmd) + return [i + 0x67], len(cmd) + 2 + + for i, s in enumerate(kText_CommandNames): + if kText_CommandLengths[i] == 2 and cmd.startswith(s): + e = cmd[len(s):].strip() + return [i + 0x67, int(e)], len(cmd) + 2 + + print('substr %s not found' % a) + assert 0 + +def compress_string(s): + # find the greedy best match + i = 0 + r = [] + while i < len(s): + what, num = find_string_char_at(s, i) + r.extend(what) + i += num + r.append(0x7f) + return r + +def verify(get_byte): + for i, (decoded, original) in enumerate(decode_strings(get_byte)): + c = compress_string(decoded) + if c != original: + print('String %s not match: %s, %s' % (decoded, c, original)) + break + else: + pass diff --git a/tables/util.py b/tables/util.py new file mode 100644 index 00000000..25c8d15c --- /dev/null +++ b/tables/util.py @@ -0,0 +1,240 @@ +import array +import sys +import hashlib + +class LoadedRom: + def __init__(self, name = 'zelda3.sfc'): + self.ROM = open(name, 'rb').read() + hash = hashlib.sha256(self.ROM).hexdigest() + if hash != '66871d66be19ad2c34c927d6b14cd8eb6fc3181965b6e517cb361f7316009cfb': + raise Exception('Wrong ROM version. Expecting Legend of Zelda - A Link to the Past, The (NA) (1.0).sfc') + + def get_byte(self, ea): + assert (ea & 0x8000) + ea = ((ea >> 16) & 0x7f) * 0x8000 + (ea & 0x7fff) + return self.ROM[ea] + + def get_word(self, ea): + return self.get_byte(ea) + self.get_byte(ea + 1) * 256 + + def get_24(self, ea): + return self.get_byte(ea) + self.get_byte(ea + 1) * 256 + self.get_byte(ea + 2) * 65536 + + def get_bytes(self, addr, n): + r = [] + for i in range(n): + r.append(self.get_byte(addr)) + addr += 1 + if (addr & 0x8000) == 0: + addr += 0x8000 + return r + + def get_words(self, addr, n): + r = [] + for i in range(n): + r.append(self.get_word(addr)) + addr += 2 + if (addr & 0x8000) == 0: + addr += 0x8000 + return r + +def split_list(l, n): + return [l[i:i+n] for i in range(0, len(l), n)] + +def to_hex(v): + return '%#x' % v if v < -9 or v >9 else '%d'%v + + +def print_int_array(name, r, tname, decimal, split_length = 16, file = sys.stdout): + rlen = len(r) + rr = split_list(r, split_length ) + if decimal != None: + if decimal: + rr = [['%d' % s for s in t] for t in rr] + else: + rr = [[to_hex(s) for s in t] for t in rr] + + def pad_all_columns(rrs): + colsiz = [max((0 if j >= len(r) else len(r[j])) for r in rrs) for j in range(len(rrs[0]))] + def pad(c, i): + return (' ' * (i - len(c))) + c + return [[pad(c, colsiz[i]) for (i, c) in enumerate(r)] for r in rrs] + + if len(rr) == 1: + print('static const %s %s[%d] = {%s};' % (tname, name, rlen, ", ".join(rr[0])), file = file) + else: + print('static const %s %s[%d] = {' % (tname, name, rlen), file = file) + for t in pad_all_columns(rr): + print(" " + "".join([(a + ', ') for a in t]), file = file) + print('};', file = file) + + + +class Reader: + def __init__(self, ea, rb): + self.ea, self.rb = ea, rb + def next(self): + r = self.rb(self.ea) + self.ea += 1 + if (self.ea & 0xffff) == 0: + self.ea += 0x8000 + return r + +def decomp(ea, rb, offset_is_be = True, return_length = False): + result = bytearray() + reader = Reader(ea, rb) + while True: + b = reader.next() + if b == 0xff: + if return_length: + return result, (reader.ea - ea) & 0x7fff + else: + return result + if (b & 0xe0) != 0xe0: + lx = b & 0x1f + cmd = b & 0xe0 + else: + cmd = (b << 3) & 0xe0 + lx = ((b & 3) << 8) | reader.next() + lx += 1 + if cmd == 0x00: # 000 - literal +# print('literal %d' % lx) + while lx: + result.append(reader.next()) + lx -= 1 + elif cmd & 0x80: # 1xx - copy +# print('copy %d' % lx) + offs = reader.next() << 8 + offs |= reader.next() + if not offset_is_be: offs = ((offs >> 8) | (offs << 8)) & 0xffff + while lx: + result.append(result[offs]) + offs += 1 + lx -= 1 + elif (cmd & 0x40) == 0: # 00x - memset +# print('memset %d' % lx) + b = reader.next() + while lx: + result.append(b) + lx -= 1 + elif (cmd & 0x20) == 0: # 010 - memset16 +# print('memsetw %d' % lx) + b1, b2 = reader.next(), reader.next() + while lx: + result.append(b1) + if lx==1: break + result.append(b2) + lx -= 2 + else: # 011 - incr +# print('incr %d' % lx) + b = reader.next() + while lx: + result.append(b) + b = (b + 1) & 0xff + lx -= 1 + + +def decode_brr(get_byte, olds = (0, 0)): + ea=0 + r = [] + old , older = olds + while True: + cmd = get_byte(ea) + + shift = cmd >> 4 + filter = (cmd >> 2) & 3 + #print("shift=%d, filter=%d" % (shift, filter)) + for i in range(16): + t = (get_byte(ea+1+i//2) >> (0 if i & 1 else 4)) & 0xf + s = (t & 7) - (t & 8) + if shift <= 12: + s = ((s << shift) >> 1) + else: + s = (s >> 3) << 12 # -2048 or 0 + + if filter == 1: + s += old*1+((-old*1) >> 4) + elif filter == 2: + s += old*2 + ((-old*3) >> 5) - older + ((older*1) >> 4) + elif filter == 3: + s += old*2 + ((-old*13) >> 6) - older + ((older*3) >> 4) + # saturate to 16 bits + if s < -0x8000: s = -0x8000 + elif s >= 0x7fff: s = 0x7fff + # wrap to 15 bits + s = (s & 0x3fff) - (s & 0x4000) + + older, old = old, s + #print('%d: 0x%x -> %d (shift %d, filter %d)' % (i, t, s*2, shift, filter)) + r.append(s*2) + ea += 9 + if cmd & 1: + break + return array.array('h', r) + +kBrrFilters = [ + lambda old, older: 0, + lambda old, older: old*1+((-old*1) >> 4), + lambda old, older: old*2 + ((-old*3) >> 5) - older + ((older*1) >> 4), + lambda old, older: old*2 + ((-old*13) >> 6) - older + ((older*3) >> 4) +] + +def brr_get_one(old, rs, r): + s = (rs << r) >> 1 if r <= 12 else (rs >> 3) << 12 + s += old + s = -0x8000 if s < -0x8000 else 0x7fff if s > 0x7fff else s + return (s & 0x3fff) - (s & 0x4000) # wrap to 15 bits + +def encode_brr_generic(data, brr_repeat, olds = (0, 0), lossless=True): + assert len(data) % 16 == 0 + loop_enabled, loop_offset = 1 if brr_repeat != 0 else 0, 0 + result = [] + blk_data = [0] * 16 + best_data = [0] * 9 + p = 0 + best_old, best_older = olds + while p < len(data): +# print(p) + best_err = 1 << 60 + startold, startolder = best_old, best_older + + if all(data[p + i] == 0 for i in range(16)): + result.extend((loop_enabled * 2, 0, 0, 0, 0, 0, 0, 0, 0)) + p += 16 + continue + for filter in range(4): + if filter != 0 and (p == 0 or p == loop_offset): + continue + for r in range(12, 0, -1): + blk_err = 0 + old, older = startold, startolder + for i in range(16): + s = kBrrFilters[filter](old, older) + xs = data[p + i] >> 1 + best_e = 1<<60 + for j in (0, 1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, -8): + s0 = brr_get_one(s, j, r) + e = (xs - s0) * (xs - s0) + if e < best_e: + best_e, best_j, best_s0 = e, j, s0 + if e == 0: + #print(j) + break + if best_e != 0 and lossless: + break + blk_err += best_e + blk_data[i] = best_j & 0xf + older, old = old, best_s0 + else: + if blk_err < best_err: + best_err = blk_err + best_old, best_older = old, older + best_data[0] = r << 4 | filter << 2 | loop_enabled << 1 + for i in range(8): + best_data[i + 1] = blk_data[i * 2] << 4 | blk_data[i * 2 + 1] + result.extend(best_data) + if lossless: assert best_err==0 + p += 16 +# result[-9] |= 1 + return result + diff --git a/tagalong.cpp b/tagalong.cpp new file mode 100644 index 00000000..deb4602f --- /dev/null +++ b/tagalong.cpp @@ -0,0 +1,745 @@ +#include "tagalong.h" +#include "sprite_main.h" +#include "sprite.h" +#include "zelda_rtl.h" +#include "variables.h" +#include "snes_regs.h" +#include "dungeon.h" +#include "overworld.h" +#include "ancilla.h" +#include "player.h" +#include "misc.h" + +static const uint8 kTagalongFlags[4] = {0x20, 0x10, 0x30, 0x20}; +static const uint8 kTagalong_Tab5[15] = {0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static const uint8 kTagalong_Tab4[15] = {0, 0, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static const uint8 kTagalong_Tab0[3] = {5, 9, 0xa}; +static const uint16 kTagalong_Tab1[3] = {0xdf3, 0x6f9, 0xdf3}; +static const uint16 kTagalong_Msg[3] = {0x20, 0x108, 0x11d}; +static const TagalongMessageInfo kTagalong_IndoorInfos[12] = { + {0x1ef0, 0x288, 1, 0x99, 4}, + {0x1e58, 0x2f0, 2, 0x9a, 4}, + {0x1ea8, 0x3b8, 4, 0x9b, 4}, + {0xcf8, 0x25b, 1, 0x21, 1}, + {0xcf8, 0x39d, 2, 0x21, 1}, + {0xc78, 0x238, 4, 0x21, 1}, + {0xa30, 0x2f8, 1, 0x22, 1}, + {0x178, 0x550, 1, 0x23, 1}, + {0x168, 0x4f8, 2, 0x2a, 1}, + {0x1bd8, 0x16fc, 1, 0x124, 6}, + {0x1520, 0x167c, 1, 0x124, 6}, + {0x5ac, 0x4fc, 1, 0x29, 1}, +}; +static const TagalongMessageInfo kTagalong_OutdoorInfos[5] = { + {0x3c0, 0x730, 1, 0x9d, 4}, + {0x648, 0xf50, 0, 0xffff, 0xa}, + {0x6c8, 0xd78, 1, 0xffff, 0xa}, + {0x688, 0xc78, 2, 0xffff, 0xa}, + {0xe8, 0x90, 0, 0x28, 0xe}, +}; +static const uint8 kTagalong_IndoorOffsets[8] = {0, 3, 6, 7, 9, 10, 11, 12}; +static const uint8 kTagalong_OutdoorOffsets[4] = {0, 1, 4, 5}; +static const uint16 kTagalong_IndoorRooms[7] = {0xf1, 0x61, 0x51, 2, 0xdb, 0xab, 0x22}; +static const uint16 kTagalong_OutdoorRooms[3] = {3, 0x5e, 0}; +struct TagalongSprXY { + int8 y1, x1, y2, x2; +}; +struct TagalongDmaFlags { + uint8 dma6, dma7; + uint8 flags; +}; +static const TagalongSprXY kTagalongDraw_SprXY[56] = { + {-2, 0, 0, 0}, + {-2, 0, 0, 0}, + {-2, 0, 0, 0}, + {-2, 0, 0, 0}, + {-1, 0, 1, 0}, + {-1, 0, 1, 0}, + {-1, 0, 1, 0}, + {-1, 0, 1, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {1, 0, 0, 0}, + {1, 0, 0, 0}, + {1, 0, 0, 0}, + {1, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, -3, 0, 0}, + {0, 3, 0, 0}, + {1, 0, 0, 0}, + {1, 0, 0, 0}, + {1, -3, 1, 0}, + {1, 3, 1, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 1, 0}, + {0, 0, 1, 0}, + {0, 0, 1, 0}, + {0, 0, 1, 0}, + {-1, 0, 0, 0}, + {-1, 0, 0, 0}, + {-1, 0, 0, 0}, + {-1, 0, 0, 0}, + {0, 0, 1, 0}, + {0, 0, 1, 0}, + {0, 0, 1, 0}, + {0, 0, 1, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {0, 0, 0, 0}, + {2, 0, 0, 0}, + {2, 0, 0, 0}, + {2, -1, 0, 0}, + {2, 1, 0, 0}, + {3, 0, 1, 0}, + {3, 0, 1, 0}, + {3, -1, 1, 0}, + {3, 1, 1, 0}, +}; +static const TagalongDmaFlags kTagalongDmaAndFlags[16] = { + {0x20, 0xc0, 0x00}, + {0x00, 0xa0, 0x00}, + {0x40, 0x60, 0x00}, + {0x40, 0x60, 0x44}, + {0x20, 0xc0, 0x04}, + {0x00, 0xa0, 0x04}, + {0x40, 0x80, 0x00}, + {0x40, 0x80, 0x44}, + {0x20, 0xe0, 0x00}, + {0x00, 0xe0, 0x00}, + {0x40, 0xe0, 0x00}, + {0x40, 0xe0, 0x44}, + {0x20, 0xe0, 0x04}, + {0x00, 0xe0, 0x04}, + {0x40, 0xe0, 0x04}, + {0x40, 0xe0, 0x40}, +}; +static const uint8 kTagalongDraw_Pals[14] = {0, 4, 4, 4, 4, 0, 7, 4, 4, 3, 4, 4, 4, 4}; +static const uint16 kTagalongDraw_Offs[14] = {0, 0, 0x80, 0x80, 0x80, 0, 0, 0xc0, 0xc0, 0x100, 0x180, 0x180, 0x140, 0x140}; +static const uint8 kTagalongDraw_SprInfo0[24] = { + 0xd8, 0x24, 0xd8, 0x64, 0xd9, 0x24, 0xd9, 0x64, 0xda, 0x24, 0xda, 0x64, 0xc8, 0x22, 0xc8, 0x62, + 0xc9, 0x22, 0xc9, 0x62, 0xca, 0x22, 0xca, 0x62, +}; +static const uint16 kTagalongDraw_SprOffs0[2] = {0x170, 0xc0}; +static const uint16 kTagalongDraw_SprOffs1[2] = {0x1c0, 0x110}; +bool Tagalong_IsFollowing() { + uint8 main = main_module_index; + uint8 sub = submodule_index; + return !flag_is_link_immobilized && sub != 10 && !(main == 9 && sub == 0x23) && !(main == 14 && (sub == 1 || sub == 2)); +} + +bool Follower_ValidateMessageFreedom() { // 87f46f + uint8 ps = link_player_handler_state; + if (ps != kPlayerState_Ground && ps != kPlayerState_Swimming && ps != kPlayerState_StartDash) + return false; + uint8 t = button_mask_b_y & 0x80 | link_unk_master_sword | link_item_in_hand | + link_position_mode | flag_is_ancilla_to_pick_up | flag_is_sprite_to_pick_up | + link_state_bits | link_grabbing_wall; + return t == 0; +} + +void Follower_MoveTowardsLink() { // 88f91a + for(;;) { + int k = 9; + int j = tagalong_var1; + ancilla_y_lo[k] = tagalong_y_lo[j]; + ancilla_y_hi[k] = tagalong_y_hi[j]; + ancilla_x_lo[k] = tagalong_x_lo[j]; + ancilla_x_hi[k] = tagalong_x_hi[j]; + + ProjectSpeedRet pt = Ancilla_ProjectSpeedTowardsPlayer(k, 24); + ancilla_x_vel[k] = pt.x; + ancilla_y_vel[k] = pt.y; + Ancilla_MoveY(k); + Ancilla_MoveX(k); + + uint16 x = Ancilla_GetX(k); + uint16 y = Ancilla_GetY(k); + if (abs16(x - link_x_coord) < 2 && abs16(y - link_y_coord) < 2) + return; + k = ++tagalong_var1; + if (k == 18) + return; + tagalong_y_lo[k] = y; + tagalong_y_hi[k] = y >> 8; + tagalong_x_lo[k] = x; + tagalong_x_hi[k] = x >> 8; + static const uint8 kTagalongLayerBits[4] = {0x20, 0x10, 0x30, 0x20}; + tagalong_layerbits[k] = kTagalongLayerBits[link_is_on_lower_level] >> 2 | 1; + } +} + +bool Follower_CheckBlindTrigger() { // 899e90 + int k = tagalong_var2; + uint16 x = tagalong_x_hi[k] << 8 | tagalong_x_lo[k]; + uint16 y = tagalong_y_hi[k] << 8 | tagalong_y_lo[k]; + uint16 z = (int8)tagalong_z[k]; + y += z + 12; + x += 8; + return abs16(0x1568 - y) < 24 && abs16(0x1980 - x) < 24; +} + +void Follower_Initialize() { // 899efc + tagalong_y_lo[0] = link_y_coord; + tagalong_y_hi[0] = link_y_coord >> 8; + + tagalong_x_lo[0] = link_x_coord; + tagalong_x_hi[0] = link_x_coord >> 8; + + tagalong_layerbits[0] = kTagalongFlags[link_is_on_lower_level] >> 2 | (link_direction_facing >> 1); + timer_tagalong_reacquire = 64; + tagalong_var2 = 0; + tagalong_var1 = 0; + tagalong_var3 = 0; + tagalong_var4 = 0; + link_speed_setting = 0; +} + +void Sprite_BecomeFollower(int k) { // 899f39 + tagalong_var5 = 0; + int y = Sprite_GetY(k) - 6; + tagalong_y_lo[0] = y, tagalong_y_hi[0] = (y >> 8); + int x = Sprite_GetX(k) + 1; + tagalong_x_lo[0] = x, tagalong_x_hi[0] = (x >> 8); + tagalong_layerbits[0] = kTagalongFlags[link_is_on_lower_level] >> 2 | 1; + timer_tagalong_reacquire = 64; + tagalong_var1 = 0; + tagalong_var2 = 0; + tagalong_var3 = 0; + tagalong_var4 = 0; + link_speed_setting = 0; + tagalong_var5 = 0; + super_bomb_going_off = 0; + Follower_MoveTowardsLink(); +} + +void Follower_Main() { // 899fc4 + if (!savegame_tagalong) + return; + if (savegame_tagalong == 0xe) { + Follower_HandleTrigger(); + return; + } + int j = FindInByteArray(kTagalong_Tab0, savegame_tagalong, 3); + if (j >= 0 && submodule_index == 0 && !(j == 2 && overworld_screen_index & 0x40) && sign16(--word_7E02CD)) { + if (!Follower_ValidateMessageFreedom()) { + word_7E02CD = 0; + } else { + word_7E02CD = kTagalong_Tab1[j]; + dialogue_message_index = kTagalong_Msg[j]; + Main_ShowTextMessage(); + } + } + if (j != 0) + Follower_NoTimedMessage(); +} + +void Follower_NoTimedMessage() { // 89a02b + int k; + + if (super_bomb_going_off) { + Follower_NotFollowing(); + return; + } + + if (savegame_tagalong == 12) { + if (link_auxiliary_state != 0) + goto label_a; + + } else if (savegame_tagalong == 13) { + if (link_auxiliary_state == 2 || player_near_pit_state == 2) + goto label_c; + } else { + goto label_a; + } + + if (submodule_index != 0 || link_auxiliary_state == 1 || (link_state_bits & 0x80) || tagalong_var5 || tagalong_var3 || + (int8)tagalong_z[tagalong_var2] > 0 || !(filtered_joypad_L & 0x80)) + goto label_a; + +label_c: + + if (savegame_tagalong == 13 && !player_is_indoors) { + if (link_player_handler_state == kPlayerState_Ether || + link_player_handler_state == kPlayerState_Bombos || + link_player_handler_state == kPlayerState_Quake) + goto label_a; + super_bomb_indicator_unk2 = 3; + super_bomb_indicator_unk1 = 0xbb; + } + + super_bomb_going_off = 128; + timer_tagalong_reacquire = 64; + + k = tagalong_var2; + saved_tagalong_y = tagalong_y_lo[k] | tagalong_y_hi[k] << 8; + saved_tagalong_x = tagalong_x_lo[k] | tagalong_x_hi[k] << 8; + saved_tagalong_floor = link_is_on_lower_level; + saved_tagalong_indoors = player_is_indoors; + Follower_NotFollowing(); + return; + +label_a: + Follower_CheckGameMode(); +} + +void Follower_CheckGameMode() { // 89a0e1 + if (Tagalong_IsFollowing() && (link_x_vel | link_y_vel)) { + int k = tagalong_var1 + 1; + if (k == 20) + k = 0; + tagalong_var1 = k; + uint8 z = link_z_coord; + if (z >= 0xf0) + z = 0; + tagalong_z[k] = z; + uint16 y = link_y_coord - z; + tagalong_y_lo[k] = y; + tagalong_y_hi[k] = y >> 8; + uint16 x = link_x_coord; + tagalong_x_lo[k] = x; + tagalong_x_hi[k] = x >> 8; + uint8 layerbits = link_direction_facing >> 1 | kTagalongFlags[link_is_on_lower_level] >> 2; + if (link_player_handler_state == kPlayerState_Swimming) { + layerbits |= 0x20; + } else { + if (link_player_handler_state == kPlayerState_Hookshot && related_to_hookshot) + layerbits |= 0x10; + if (draw_water_ripples_or_grass) + layerbits |= (draw_water_ripples_or_grass == 1) ? 0x80 : 0x40; + } + tagalong_layerbits[k] = layerbits; + } + + switch (savegame_tagalong) { + case 2: case 4: + Follower_OldMan(); + return; + case 3: case 11: + Follower_OldManUnused(); + return; + case 5: case 14: + assert(0); // Y is unknown here... + return; + default: + Follower_BasicMover(); + return; + } +} + +void Follower_BasicMover() { // 89a197 + int k; + if (!Tagalong_IsFollowing()) { + Tagalong_Draw(); + return; + } + + Follower_HandleTrigger(); + + if (savegame_tagalong == 10 && link_auxiliary_state && countdown_for_blink) { + int k = tagalong_var2 + 1 == 20 ? 0 : tagalong_var2 + 1; + Kiki_SpawnHandler_B(k); + savegame_tagalong = 0; + return; + } + + if (savegame_tagalong == 6 && dungeon_room_index == 0xac && (save_dung_info[101] & 0x100) && Follower_CheckBlindTrigger()) { + int k = tagalong_var2; + uint16 x = tagalong_x_lo[k] | tagalong_x_hi[k] << 8; + uint16 y = tagalong_y_lo[k] | tagalong_y_hi[k] << 8; + savegame_tagalong = 0; + Blind_SpawnFromMaiden(x, y); + BYTE(dung_flag_trapdoors_down)++; + BYTE(dung_cur_door_pos) = 0; + BYTE(door_animation_step_indicator) = 0; + submodule_index = 5; + music_control = 21; + return; + } + + if (!tagalong_var3) { + if (link_player_handler_state == kPlayerState_Hookshot && related_to_hookshot) { + tagalong_var3 = 1; + goto label_e; + } + } else { + if (link_player_handler_state == kPlayerState_Hookshot) + goto label_e; + if (tagalong_var7 != tagalong_var2) + goto label_d; + tagalong_var3 = 0; + } + + k = tagalong_var2; + if ((int8)tagalong_z[k] > 0) { + if (tagalong_var1 != k) + goto label_d; + tagalong_z[k] = 0; + uint16 y = link_y_coord, x = link_x_coord; + tagalong_y_lo[k] = y; + tagalong_y_hi[k] = y >> 8; + tagalong_x_lo[k] = x; + tagalong_x_hi[k] = x >> 8; + } + + if (link_x_vel | link_y_vel) { +label_e: + uint8 t; + t = tagalong_var1 - 15; + if (sign8(t)) + t += 20; + if (t == tagalong_var2) { +label_d: + tagalong_var2 = (tagalong_var2 + 1 == 20) ? 0 : tagalong_var2 + 1; + } + } + Tagalong_Draw(); +} + +void Follower_NotFollowing() { // 89a2b2 + if (saved_tagalong_indoors != player_is_indoors) + return; + if (!link_is_running && !Follower_CheckProximityToLink()) { + Follower_Initialize(); + saved_tagalong_indoors = player_is_indoors; + if (savegame_tagalong == 13) { + super_bomb_indicator_unk2 = 254; + super_bomb_indicator_unk1 = 0; + } + super_bomb_going_off = 0; + Tagalong_Draw(); + } else { + if (savegame_tagalong == 13 && !player_is_indoors && !super_bomb_indicator_unk2) { + AncillaAdd_SuperBombExplosion(0x3a, 0); + super_bomb_going_off = 0; + } + Follower_DoLayers(); + } +} + +void Follower_OldMan() { // 89a318 + uint8 t; + + if (!Tagalong_IsFollowing()) { + Tagalong_Draw(); + return; + } + + if (link_speed_setting != 4) + link_speed_setting = 12; + + Follower_HandleTrigger(); + + if (savegame_tagalong == 0) { + return; + } else if (savegame_tagalong == 4) { + if ((int8)tagalong_z[tagalong_var2] > 0 && tagalong_var1 != tagalong_var2) { + tagalong_var2 = (tagalong_var2 + 1 >= 20) ? 0 : tagalong_var2 + 1; + Tagalong_Draw(); + return; + } + } else { + // tagalong type 2 + if ((link_auxiliary_state & 1) && link_player_handler_state == kPlayerState_RecoilOther) { + if (tagalong_var1 != tagalong_var2) + goto transform; + assert(0); // X is undefined here + } + + if (link_auxiliary_state & 2) { +transform: + savegame_tagalong = kTagalong_Tab4[savegame_tagalong]; + timer_tagalong_reacquire = 64; + int k = tagalong_var2; + saved_tagalong_y = tagalong_y_lo[k] | tagalong_y_hi[k] << 8; + saved_tagalong_x = tagalong_x_lo[k] | tagalong_x_hi[k] << 8; + saved_tagalong_floor = link_is_on_lower_level; + Follower_OldManUnused(); + return; + } + } + + if (link_x_vel | link_y_vel) { + t = tagalong_var1 - 20; + if (sign8(t)) + t += 20; + if (t == tagalong_var2) { + tagalong_var2 = (tagalong_var2 + 1 >= 20) ? 0 : tagalong_var2 + 1; + } + } else if ((frame_counter & 3) == 0 && tagalong_var1 != tagalong_var2) { + t = tagalong_var1 - 9; + if (sign8(t)) + t += 20; + if (t != tagalong_var2) { + tagalong_var2 = (tagalong_var2 + 1 >= 20) ? 0 : tagalong_var2 + 1; + } + } + Tagalong_Draw(); +} + +void Follower_OldManUnused() { // 89a41f + link_speed_setting = 16; + if (!link_is_running && !link_auxiliary_state && link_player_handler_state != kPlayerState_Swimming) { + link_speed_setting = 0; + if (link_player_handler_state != kPlayerState_Hookshot && !Follower_CheckProximityToLink()) { + Follower_Initialize(); + savegame_tagalong = kTagalong_Tab5[savegame_tagalong]; + return; + } + } + Follower_DoLayers(); +} + +void Follower_DoLayers() { // 89a450 + oam_priority_value = kTagalongFlags[saved_tagalong_floor] << 8; + uint8 a = (savegame_tagalong == 12 || savegame_tagalong == 13) ? 2 : 1; + Follower_AnimateMovement_preserved(a, saved_tagalong_x, saved_tagalong_y); +} + +bool Follower_CheckProximityToLink() { // 89a48e + if (!sign8(--timer_tagalong_reacquire)) + return true; + timer_tagalong_reacquire = 0; + if ((uint16)(saved_tagalong_y - 1) >= link_y_coord || + (uint16)(saved_tagalong_y + 19) < link_y_coord || + (uint16)(saved_tagalong_x - 1) >= link_x_coord || + (uint16)(saved_tagalong_x + 19) < link_x_coord) + return true; + return false; +} + +void Follower_HandleTrigger() { // 89a59e + if (submodule_index) + return; + + const TagalongMessageInfo *tmi, *tmi_end; + if (player_is_indoors) { + int j = FindInWordArray(kTagalong_IndoorRooms, dungeon_room_index, 7); + if (j < 0) + return; + tmi = kTagalong_IndoorInfos + kTagalong_IndoorOffsets[j]; + tmi_end = kTagalong_IndoorInfos + kTagalong_IndoorOffsets[j + 1]; + } else { + int j = FindInWordArray(kTagalong_OutdoorRooms, overworld_screen_index, 3); + if (j < 0) + return; + tmi = kTagalong_OutdoorInfos + kTagalong_OutdoorOffsets[j]; + tmi_end = kTagalong_OutdoorInfos + kTagalong_OutdoorOffsets[j + 1]; + } + int st = (tagalong_var2 + 1 >= 20) ? 0 : tagalong_var2 + 1; + do { + if (tmi->tagalong == savegame_tagalong && Follower_CheckForTrigger(tmi)) { + if (tmi->bit & tagalong_event_flags) + return; + tagalong_event_flags |= tmi->bit; + dialogue_message_index = tmi->msg; + if (tmi->msg == 0xffff) { + if (!(tmi->bit & 3)) + Kiki_RevertToSprite(st); + else if (!(save_ow_event_info[BYTE(overworld_screen_index)] & 1)) + Kiki_SpawnHandler_A(st); + return; + } + if (tmi->msg == 0x9d) { + OldMan_RevertToSprite(st); + } else if (tmi->msg == 0x28) { + savegame_tagalong = 0; + } + Main_ShowTextMessage(); + return; + } + } while (++tmi != tmi_end); +} + +void Tagalong_Draw() { // 89a907 + if (tagalong_var5) + return; + oam_priority_value = + ((tagalong_z[tagalong_var2] && !player_is_indoors) ? 0x20 : + (submodule_index == 14) ? kTagalongFlags[link_is_on_lower_level] : + (tagalong_layerbits[tagalong_var2] & 0xc) << 2) << 8; + int k = tagalong_var2; + if (sign8(k)) + k = 0; + uint16 x = tagalong_x_lo[k] | tagalong_x_hi[k] << 8; + uint16 y = tagalong_y_lo[k] | tagalong_y_hi[k] << 8; + uint8 a = tagalong_layerbits[k]; + Follower_AnimateMovement_preserved(a, x, y); +} + +void Follower_AnimateMovement_preserved(uint8 ain, uint16 xin, uint16 yin) { // 89a959 + + uint8 yt = 0, av = 0; + uint8 sc = 0; + + if ((ain >> 2 & 8) && (savegame_tagalong == 6 || savegame_tagalong == 1)) { + yt = 8; + if (swimcoll_var7[0] | swimcoll_var7[1]) + av = (frame_counter >> 1) & 4; + else + av = (frame_counter >> 2) & 4; + } else if (submodule_index == 8 || submodule_index == 14 || submodule_index == 16) { + av = link_is_running ? (frame_counter & 4) : ((frame_counter >> 1) & 4); + } else if (savegame_tagalong == 11) { + av = (frame_counter >> 1) & 4; + } else if ((savegame_tagalong == 12 || savegame_tagalong == 13) && super_bomb_going_off || flag_is_link_immobilized || + submodule_index == 10 || main_module_index == 9 && submodule_index == 0x23 || + main_module_index == 14 && (submodule_index == 1 || submodule_index == 2) || + (link_y_vel | link_x_vel) == 0) { + av = sc = 4; + } else { + av = link_is_running ? (frame_counter & 4) : ((frame_counter >> 1) & 4); + } + uint8 frame = (ain & 3) + av + yt; + + int spr_offs = + (link_y_coord == yin && !(ain & 3) || link_y_coord < yin) ? + kTagalongDraw_SprOffs0[sort_sprites_setting] >> 2: + kTagalongDraw_SprOffs1[sort_sprites_setting] >> 2; + oam_ext_cur_ptr = 0xa20 + spr_offs; + oam_cur_ptr = 0x800 + spr_offs * 4; + + OamEnt *oam = GetOamCurPtr(); + uint16 scrolly = yin - BG2VOFS_copy2; + uint16 scrollx = xin - BG2HOFS_copy2; + + const uint8 *sk = kTagalongDraw_SprInfo0; + if (savegame_tagalong == 1 || savegame_tagalong == 6 || !(ain & 0x20)) { + if (!(ain & 0xc0)) + goto skip_first_sprites; + if ((ain & 0x80) || (sk += 12, sc == 0)) + goto incr; + byte_7E02D7 = 0; + } else { +incr: + if (!(frame_counter & 7) && ++byte_7E02D7 == 3) + byte_7E02D7 = 0; + } + sk += byte_7E02D7 * 4; + { + uint16 y = scrolly + 16, x = scrollx, ext = 0; + oam->x = x; + oam->y = (uint16)(x + 0x80) < 0x180 && (ext = x >> 8 & 1, (uint16)(y + 0x10) < 0x100) ? y : 0xf0; + oam->charnum = sk[0]; + oam->flags = sk[1]; + bytewise_extended_oam[oam - oam_buf] = ext; + oam++; + + ext = 0, x += 8; + oam->x = x; + oam->y = (uint16)(x + 0x80) < 0x180 && (ext = x >> 8 & 1, (uint16)(y + 0x10) < 0x100) ? y : 0xf0; + oam->charnum = sk[2]; + oam->flags = sk[3]; + bytewise_extended_oam[oam - oam_buf] = ext; + oam++; + } +skip_first_sprites: + + uint8 pal = kTagalongDraw_Pals[savegame_tagalong]; + if (pal == 7 && overworld_palette_swap_flag) + pal = 0; + + if (savegame_tagalong == 13 && super_bomb_indicator_unk2 == 1) + pal = (frame_counter & 7); + + const TagalongSprXY *sprd = kTagalongDraw_SprXY + frame + (kTagalongDraw_Offs[savegame_tagalong] >> 3); + const TagalongDmaFlags *sprf = kTagalongDmaAndFlags + frame; + + if (savegame_tagalong != 12 && savegame_tagalong != 13) { + uint16 y = scrolly + sprd->y1, x = scrollx + sprd->x1, ext = 0; + oam->x = x; + oam->y = (uint16)(x + 0x80) < 0x180 && (ext = x >> 8 & 1, (uint16)(y + 0x10) < 0x100) ? y : 0xf0; + oam->charnum = 0x20; + oam->flags = (sprf->flags & 0xf0) | pal << 1 | (oam_priority_value >> 8); + bytewise_extended_oam[oam - oam_buf] = 2 | ext; + oam++; + BYTE(dma_var6) = sprf->dma6; + } + { + uint16 y = scrolly + sprd->y2 + 8, x = scrollx + sprd->x2, ext = 0; + oam->x = x; + oam->y = (uint16)(x + 0x80) < 0x180 && (ext = x >> 8 & 1, (uint16)(y + 0x10) < 0x100) ? y : 0xf0; + oam->charnum = 0x22; + oam->flags = ((sprf->flags & 0xf) << 4) | pal << 1 | (oam_priority_value >> 8); + bytewise_extended_oam[oam - oam_buf] = 2 | ext; + BYTE(dma_var7) = sprf->dma7; + } +} + +bool Follower_CheckForTrigger(const TagalongMessageInfo *info) { // 89ac26 + uint16 x = link_x_coord + 12 - (info->x + 8); + uint16 y = link_y_coord + 12 - (info->y + 8); + if (sign16(x)) + x = -x; + if (sign16(y)) + y = -y; + return x < 24 && y < 28; +} + +void Follower_Disable() { // 89acf3 + if (savegame_tagalong == 9 || savegame_tagalong == 10) + savegame_tagalong = 0; +} + +void Blind_SpawnFromMaiden(uint16 x, uint16 y) { // 9da03c + int k = 0; + sprite_state[k] = 9; + sprite_type[k] = 206; + Sprite_SetX(k, x); + Sprite_SetY(k, y - 16); + SpritePrep_LoadProperties(k); + sprite_delay_aux2[k] = 192; + sprite_graphics[k] = 21; + sprite_D[k] = 2; + sprite_ignore_projectile[k] = 2; + dung_savegame_state_bits |= 0x2000; + byte_7E0B69 = 0; +} + +void Kiki_RevertToSprite(int k) { // 9ee66b + int j = Kiki_SpawnHandlerMonke(k); + sprite_subtype2[j] = 1; + savegame_tagalong = 0; +} + +int Kiki_SpawnHandlerMonke(int k) { // 9ee67a + SpriteSpawnInfo info; + int j = Sprite_SpawnDynamically(k, 0xb6, &info); + if (j >= 0) { + sprite_head_dir[j] = tagalong_layerbits[k] & 3; + sprite_D[j] = tagalong_layerbits[k] & 3; + int x = tagalong_x_hi[k] << 8 | tagalong_x_lo[k]; + int y = tagalong_y_hi[k] << 8 | tagalong_y_lo[k]; + Sprite_SetX(j, x + 2); + Sprite_SetY(j, y + 2); + sprite_floor[j] = link_is_on_lower_level; + sprite_ignore_projectile[j] = 1; + sprite_floor[j] = 2; + link_speed_setting = 0; + } + return j; +} + +void Kiki_SpawnHandler_A(int k) { // 9ee6c7 + int j = Kiki_SpawnHandlerMonke(k); + sprite_subtype2[j] = 2; +} + +void Kiki_SpawnHandler_B(int k) { // 9ee6d0 + int j = Kiki_SpawnHandlerMonke(k); + sprite_z[j] = 1; + sprite_z_vel[j] = 16; + sprite_subtype2[j] = 3; + savegame_tagalong = 0; +} + diff --git a/tagalong.h b/tagalong.h new file mode 100644 index 00000000..068e44b6 --- /dev/null +++ b/tagalong.h @@ -0,0 +1,32 @@ +#pragma once +#include "types.h" + +struct TagalongMessageInfo { + uint16 y, x, bit, msg, tagalong; +}; + +bool Tagalong_IsFollowing(); +bool Follower_ValidateMessageFreedom(); +void Follower_MoveTowardsLink(); +bool Follower_CheckBlindTrigger(); +void Follower_Initialize(); +void Sprite_BecomeFollower(int k); +void Follower_Main(); +void Follower_NoTimedMessage(); +void Follower_CheckGameMode(); +void Follower_BasicMover(); +void Follower_NotFollowing(); +void Follower_OldMan(); +void Follower_OldManUnused(); +void Follower_DoLayers(); +bool Follower_CheckProximityToLink(); +void Follower_HandleTrigger(); +void Tagalong_Draw(); +void Follower_AnimateMovement_preserved(uint8 ain, uint16 xin, uint16 yin); +bool Follower_CheckForTrigger(const TagalongMessageInfo *info); +void Follower_Disable(); +void Blind_SpawnFromMaiden(uint16 x, uint16 y); +void Kiki_RevertToSprite(int k); +int Kiki_SpawnHandlerMonke(int k); +void Kiki_SpawnHandler_A(int k); +void Kiki_SpawnHandler_B(int k); diff --git a/tile_detect.cpp b/tile_detect.cpp new file mode 100644 index 00000000..0354dcab --- /dev/null +++ b/tile_detect.cpp @@ -0,0 +1,527 @@ +#include "tile_detect.h" +#include "zelda_rtl.h" +#include "ancilla.h" +#include "variables.h" +#include "overworld.h" + +static const uint8 kDetectTiles_tab0[] = { 8, 24, 0, 15 }; +static const uint8 kDetectTiles_tab1[] = { 0, 0, 8, 8 }; +static const uint8 kDetectTiles_tab2[] = { 8, 8, 16, 16 }; +static const uint8 kDetectTiles_tab3[] = { 15, 15, 23, 23 }; +static const int8 kDetectTiles_tab4[] = { 7, 24, -1, 16 }; +static const uint8 kDetectTiles_tab5[] = { 0, 0, 8, 8 }; +static const uint8 kDetectTiles_tab6[] = { 15, 15, 23, 23 }; +uint8 Overworld_GetTileAttributeAtLocation(uint16 x, uint16 y) { // 80882e + uint16 t; + + t = ((y - overworld_offset_base_y) & overworld_offset_mask_y) * 8; + t |= ((x - overworld_offset_base_x) & overworld_offset_mask_x); + t = overworld_tileattr[t >> 1] * 4; + t |= (y & 8) >> 2; + t |= (x & 1); + t = GetMap16toMap8Table()[t]; + + uint8 rv = GetMap8toTileAttr()[t & 0x1ff]; + if (rv >= 0x10 && rv < 0x1C) { + rv |= (t >> 14) & 1; + } + return rv; +} + +void TileDetect_Movement_Y(uint16 direction) { // 87cdcb + assert(direction < 4); + TileDetect_ResetState(); + tiledetect_pit_tile = 0; + + tiledetect_which_y_pos[0] = (link_y_coord + kDetectTiles_tab0[direction]); + uint16 y = tiledetect_which_y_pos[0] & tilemap_location_calc_mask; + uint16 x0 = ((link_x_coord + kDetectTiles_tab1[direction]) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((link_x_coord + kDetectTiles_tab2[direction]) & tilemap_location_calc_mask) >> 3; + uint16 x2 = ((link_x_coord + kDetectTiles_tab3[direction]) & tilemap_location_calc_mask) >> 3; + scratch_1 = x2; + TileDetection_Execute(x0, y, 1); + TileDetection_Execute(x1, y, 2); + TileDetection_Execute(x2, y, 4); +} + +void TileDetect_Movement_X(uint16 direction) { // 87ce2a + assert(direction < 4); + TileDetect_ResetState(); + tiledetect_pit_tile = 0; + + uint16 x = ((link_x_coord + kDetectTiles_tab0[direction]) & tilemap_location_calc_mask) >> 3; + uint16 y0 = ((link_y_coord + kDetectTiles_tab1[direction]) & tilemap_location_calc_mask); + tiledetect_which_y_pos[0] = link_y_coord + kDetectTiles_tab2[direction]; + uint16 y1 = tiledetect_which_y_pos[0] & tilemap_location_calc_mask; + tiledetect_which_y_pos[1] = link_y_coord + kDetectTiles_tab3[direction]; + uint16 y2 = tiledetect_which_y_pos[1] & tilemap_location_calc_mask; + TileDetection_Execute(x, y0, 1); + TileDetection_Execute(x, y1, 2); + TileDetection_Execute(x, y2, 4); +} + +void TileDetect_Movement_VerticalSlopes(uint16_t direction) { // 87ce85 + assert(direction < 4); + TileDetect_ResetState(); + tiledetect_pit_tile = 0; + + uint16 y = (link_y_coord + kDetectTiles_tab4[direction]) & tilemap_location_calc_mask; + uint16 x0 = ((link_x_coord + kDetectTiles_tab5[direction]) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((link_x_coord + kDetectTiles_tab6[direction]) & tilemap_location_calc_mask) >> 3; + TileDetection_Execute(x0, y, 1); + TileDetection_Execute(x1, y, 2); +} + +void TileDetect_Movement_HorizontalSlopes(uint16_t direction) { // 87cec9 + assert(direction < 4); + TileDetect_ResetState(); + tiledetect_pit_tile = 0; + + uint16 x = ((link_x_coord + kDetectTiles_tab4[direction]) & tilemap_location_calc_mask) >> 3; + uint16 y0 = ((link_y_coord + kDetectTiles_tab5[direction]) & tilemap_location_calc_mask); + uint16 y1 = ((link_y_coord + kDetectTiles_tab6[direction]) & tilemap_location_calc_mask); + TileDetection_Execute(x, y0, 1); + TileDetection_Execute(x, y1, 2); +} + +void Player_TileDetectNearby() { // 87cf12 + TileDetect_ResetState(); + tiledetect_pit_tile = 0; + + uint16 x0 = ((link_x_coord + kDetectTiles_tab1[0]) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((link_x_coord + kDetectTiles_tab3[0]) & tilemap_location_calc_mask) >> 3; + + uint16 y0 = ((link_y_coord + kDetectTiles_tab1[2]) & tilemap_location_calc_mask); + uint16 y1 = ((link_y_coord + kDetectTiles_tab3[2]) & tilemap_location_calc_mask); + + scratch_1 = y0; + + TileDetection_Execute(x0, y0, 8); + TileDetection_Execute(x0, y1, 2); + TileDetection_Execute(x1, y0, 4); + TileDetection_Execute(x1, y1, 1); +} + +void Hookshot_CheckTileCollision(int k) { // 87d576 + uint8 bak0 = BYTE(dungeon_room_index); + uint8 bak1 = link_is_on_lower_level; + + if (ancilla_arr1[k]) { + if (!BYTE(kind_of_in_room_staircase)) + BYTE(dungeon_room_index) += 0x10; + link_is_on_lower_level ^= 1; + } + + uint16 x = Ancilla_GetX(k), y = Ancilla_GetY(k); + int dir = ancilla_dir[k]; + + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + if (dung_hdr_collision == 2) { + link_is_on_lower_level = 1; + Hookshot_CheckSingleLayerTileCollision(x + BG1HOFS_copy2 - BG2HOFS_copy2, y + BG1VOFS_copy2 - BG2VOFS_copy2, dir); + link_is_on_lower_level = 0; + } + Hookshot_CheckSingleLayerTileCollision(x, y, dir); + + link_is_on_lower_level = bak1; + BYTE(dungeon_room_index) = bak0; +} + +void Hookshot_CheckSingleLayerTileCollision(uint16 x, uint16 y, int dir) { // 87d607 + static const uint8 kHookShot_CheckColl_X[8] = { 0, 15, 0, 15, 0, 0, 8, 8 }; + static const uint8 kHookShot_CheckColl_Y[8] = { 0, 0, 7, 7, 0, 15, 0, 15 }; + uint16 y0 = (y + kHookShot_CheckColl_Y[dir * 2 + 0]) & tilemap_location_calc_mask; + uint16 y1 = (y + kHookShot_CheckColl_Y[dir * 2 + 1]) & tilemap_location_calc_mask; + uint16 x0 = ((x + kHookShot_CheckColl_X[dir * 2 + 0]) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((x + kHookShot_CheckColl_X[dir * 2 + 1]) & tilemap_location_calc_mask) >> 3; + TileDetection_Execute(x0, y0, 1); + TileDetection_Execute(x1, y1, 2); +} + +void HandleNudgingInADoor(int8 speed) { // 87d667 + uint8 y; + + if (link_last_direction_moved_towards & 2) { + y = (uint8)link_y_coord < 0x80 ? 1 : 0; + } else { + y = (uint8)link_x_coord < 0x80 ? 3 : 2; + } + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + + static const int8 kDetectTiles_7_Y[] = { 8, 23, 16, 16 }; + static const int8 kDetectTiles_7_X[] = { 8, 8, 0, 15 }; + + uint16 x0 = ((link_x_coord + kDetectTiles_7_X[y]) & tilemap_location_calc_mask) >> 3; + uint16 y0 = ((link_y_coord + kDetectTiles_7_Y[y]) & tilemap_location_calc_mask); + + TileDetection_Execute(x0, y0, 1); + + if (((R14 | detection_of_ledge_tiles_horiz_uphoriz) & 3) == 0) { + if (((tiledetect_vertical_ledge | detection_of_unknown_tile_types) & 0x33) == 0) + return; + } + + if (link_last_direction_moved_towards & 2) + link_y_coord -= speed; + else + link_x_coord -= speed; +} + +void TileCheckForMirrorBonk() { // 87d6f4 + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + + uint16 x0 = ((link_x_coord + 2) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((link_x_coord + 13) & tilemap_location_calc_mask) >> 3; + + uint16 y0 = ((link_y_coord + 10) & tilemap_location_calc_mask); + uint16 y1 = ((link_y_coord + 21) & tilemap_location_calc_mask); + + scratch_1 = y0; + + TileDetection_Execute(x0, y0, 8); + TileDetection_Execute(x0, y1, 2); + TileDetection_Execute(x1, y0, 4); + TileDetection_Execute(x1, y1, 1); + +} + +// Used when holding sword in doorway +void TileDetect_SwordSwingDeepInDoor(uint8 dw) { // 87d73e + tiledetect_pit_tile = 0; + TileDetect_ResetState(); + + static const int8 kDoorwayDetectX[] = { 8, 8, -1, 16 }; + static const int8 kDoorwayDetectY[] = { -1, 24, 16, 16 }; + int o = (dw - 1) * 2; + uint16 x0 = ((link_x_coord + kDoorwayDetectX[o + 0]) & tilemap_location_calc_mask) >> 3; + uint16 x1 = ((link_x_coord + kDoorwayDetectX[o + 1]) & tilemap_location_calc_mask) >> 3; + + uint16 y0 = ((link_y_coord + kDoorwayDetectY[o + 0]) & tilemap_location_calc_mask); + uint16 y1 = ((link_y_coord + kDoorwayDetectY[o + 1]) & tilemap_location_calc_mask); + + TileDetection_Execute(x0, y0, 1); + TileDetection_Execute(x1, y1, 2); +} + +void TileDetect_ResetState() { // 87d798 + R12 = 0; + R14 = 0; + tiledetect_diagonal_tile = 0; + tiledetect_stair_tile = 0; + tiledetect_pit_tile = 0; + tiledetect_inroom_staircase = 0; + tiledetect_var2 = 0; + tiledetect_var1 = 0; + tiledetect_moving_floor_tiles = 0; + tiledetect_deepwater = 0; + tiledetect_normal_tiles = 0; + tiledetect_icy_floor = 0; + tiledetect_water_staircase = 0; + tiledetect_thick_grass = 0; + tiledetect_shallow_water = 0; + tiledetect_destruction_aftermath = 0; + tiledetect_read_something = 0; + tiledetect_vertical_ledge = 0; + detection_of_ledge_tiles_horiz_uphoriz = 0; + tiledetect_ledges_down_leftright = 0; + detection_of_unknown_tile_types = 0; + tiledetect_chest = 0; + tiledetect_key_lock_gravestones = 0; + bitfield_spike_cactus_tiles = 0; + tiledetect_spike_floor_and_tile_triggers = 0; + bitmask_for_dashable_tiles = 0; + tiledetect_misc_tiles = 0; + tiledetect_var4 = 0; +} + +void TileDetection_Execute(uint16 x, uint16 y, uint16 bits) { // 87d9d8 + uint8 tile; + uint16 offs = 0; + if (player_is_indoors) { + force_move_any_direction = force_move_any_direction & 0xff; + offs = (y & ~7) * 8 + (x & 63) + (link_is_on_lower_level ? 0x1000 : 0); + tile = dung_bg2_attr_table[offs]; + if (cheatWalkThroughWalls) + tile = 0; + link_tile_below = tile; + } else { + tile = Overworld_GetTileAttributeAtLocation(x, y); + } + TileDetect_ExecuteInner(tile, offs, bits, player_is_indoors); +} + +void TileDetect_ExecuteInner(uint8 tile, uint16 offs, uint16 bits, bool is_indoors) { // 87dc2e + static const uint8 word_87DC55[] = { 4, 0, 6, 2 }; + if (cheatWalkThroughWalls) + tile = 0; + + switch (tile) { + case 0x00: case 0x05: case 0x06: case 0x07: case 0x14: case 0x15: case 0x16: case 0x17: case 0x21: case 0x23: case 0x24: case 0x25: case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x41: case 0x45: case 0x47: case 0x49: case 0x5e: case 0x5f: case 0x61: case 0x62: case 0x64: case 0x65: case 0x66: case 0xa6: case 0xa7: case 0xbe: case 0xbf: case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: // TileBehavior_NothingOW + if (!is_indoors) + tiledetect_normal_tiles |= bits; + break; + case 0x01: case 0x02: case 0x03: // TileBehavior_StandardCollision + case 0x26: case 0x43: + R14 |= bits; + break; + case 0x6c: case 0x6d: case 0x6e: case 0x6f: + if (is_indoors) + R14 |= bits; + else + tiledetect_normal_tiles |= bits; + break; + case 0x04: + if (is_indoors) { + R14 |= bits; + } else { + tiledetect_thick_grass |= bits; + } + break; + case 0x0b: + if (is_indoors) { + R14 |= bits; + } else { + index_of_interacting_tile = tile; + tiledetect_deepwater |= bits << 4; + } + break; + case 0x08: // TileBehavior_DeepWater + tiledetect_deepwater |= bits; + break; + case 0x09: // TileBehavior_ShallowWater + tiledetect_shallow_water |= bits; + break; + case 0x0a: // TileBehavior_ShortWaterLadder + tiledetect_normal_tiles |= bits; + break; + case 0x0c: // TileBehavior_OverlayMask_0C + tiledetect_moving_floor_tiles |= bits; + break; + case 0x0d: // TileBehavior_SpikeFloor + if (!flag_block_link_menu && !(dung_savegame_state_bits & 0x8000)) + tiledetect_spike_floor_and_tile_triggers |= bits << 4; + break; + case 0x0e: // TileBehavior_GanonIce + tiledetect_icy_floor |= bits; + break; + case 0x0f: // TileBehavior_PalaceIce + tiledetect_icy_floor |= bits << 4; + break; + case 0x10: case 0x11: case 0x12: case 0x13: // TileBehavior_Slope + R12 |= bits; + tiledetect_diag_state = word_87DC55[tile & 3]; + break; + case 0x18: case 0x19: case 0x1a: case 0x1b: // TileBehavior_SlopeOuter + tiledetect_diagonal_tile |= bits; + R12 |= bits; + tiledetect_diag_state = word_87DC55[tile & 3]; + break; + case 0x1c: // TileBehavior_OverlayMask_1C + tiledetect_water_staircase |= bits; + break; + case 0x1d: // TileBehavior_NorthSingleLayerStairs + index_of_interacting_tile = tile; + tiledetect_inroom_staircase |= bits; + tiledetect_stair_tile |= bits; + break; + case 0x1e: case 0x1f: // TileBehavior_NorthSwapLayerStairs + index_of_interacting_tile = tile; + tiledetect_inroom_staircase |= bits; + tiledetect_stair_tile |= bits; + break; + case 0x20: case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: // TileBehavior_Pit + if (!player_on_somaria_platform) + tiledetect_pit_tile |= bits; + break; + case 0x22: case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: // TileHandlerIndoor_22 + tiledetect_stair_tile |= bits; + break; + case 0x27: // TileBehavior_Hookshottables + R14 |= bits; + tiledetect_misc_tiles |= bits; + break; + case 0x28: // TileBehavior_Ledge_North + index_of_interacting_tile = tile; + tiledetect_vertical_ledge |= bits; + break; + case 0x29: // TileBehavior_Ledge_South + index_of_interacting_tile = tile; + tiledetect_vertical_ledge |= bits << 4; + break; + case 0x2a: case 0x2b: // TileBehavior_Ledge_EastWest + index_of_interacting_tile = tile; + detection_of_ledge_tiles_horiz_uphoriz |= bits; + break; + case 0x2c: case 0x2e: // TileBehavior_Ledge_NorthDiagonal + index_of_interacting_tile = tile; + detection_of_ledge_tiles_horiz_uphoriz |= bits << 4; + break; + case 0x2d: case 0x2f: // TileBehavior_Ledge_SouthDiagonal + index_of_interacting_tile = tile; + tiledetect_ledges_down_leftright |= bits; + break; + case 0x3d: case 0x3e: case 0x3f: // TileHandlerIndoor_3E + index_of_interacting_tile = tile; + tiledetect_inroom_staircase |= bits << 4; + tiledetect_stair_tile |= bits; + break; + case 0x40: // TileBehavior_ThickGrass + tiledetect_thick_grass |= bits; + break; + case 0x44: // TileBehavior_Spike + if (!flag_block_link_menu && !(dung_savegame_state_bits & 0x8000)) + bitfield_spike_cactus_tiles |= bits; + else + R14 |= bits; + break; + case 0x46: // TileBehavior_HylianPlaque + tiledetect_spike_floor_and_tile_triggers |= bits; + R14 |= bits; + break; + case 0x48: case 0x4a: // TileBehavior_DiggableGround + tiledetect_destruction_aftermath |= bits; + tiledetect_normal_tiles |= bits; + break; + case 0x4b: // TileBehavior_Warp + tiledetect_thick_grass |= bits << 4; + break; + case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: { // TileBehavior_Liftable + static const uint8 kTile50data[] = { 0x54, 0x52, 0x50, 0x51, 0x53, 0x55, 0x56 }; + for (int i = 6; i >= 0; i--) { + if (kTile50data[i] == tile) { + if (tile == 0x50 || tile == 0x51) + bitmask_for_dashable_tiles |= bits << 4; + tiledetect_read_something |= bits; + interacting_with_liftable_tile_x2 = i * 2; + R14 |= bits; + tiledetect_misc_tiles |= bits; + break; + } + } + break; + } + case 0x57: // TileBehavior_BonkRocks + R14 |= bits; + bitmask_for_dashable_tiles |= bits << 4; + break; + case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: // TileBehavior_Chest + tiledetect_misc_tiles |= bits; + index_of_interacting_tile = tile; + if (dung_chest_locations[tile - 0x58] >= 0x8000) { + R14 |= bits; + tiledetect_key_lock_gravestones |= bits << 4; + if (bits & 2) + tiledetect_tile_type = tile; + } else { + tiledetect_chest |= bits; // small key lock + R14 |= bits; + } + break; + case 0x60: // TileBehavior_RupeeTile + if (is_indoors) { + if (dung_bg2_attr_table[offs + 64] == 0x60) { + tiledetect_misc_tiles |= bits << 8; + } else { + tiledetect_misc_tiles |= bits << 12; + } + } else { + tiledetect_normal_tiles |= bits; + } + break; + case 0x63: // TileBehavior_MinigameChest + tiledetect_misc_tiles |= bits; + index_of_interacting_tile = tile; + tiledetect_chest |= bits; // small key lock + R14 |= bits; + break; + case 0x67: // TileBehavior_CrystalPeg_Up + R14 |= bits; + tiledetect_misc_tiles |= bits; + bitfield_spike_cactus_tiles |= bits << 4; + break; + case 0x68: // TileBehavior_Conveyor_Upwards + tiledetect_var4 |= bits; + break; + case 0x69: // TileBehavior_Conveyor_Downwards + tiledetect_var4 |= bits << 4; + break; + case 0x6a: // TileBehavior_Conveyor_Leftwards + tiledetect_var4 |= bits << 8; + break; + case 0x6b: // TileBehavior_Conveyor_Rightwards + tiledetect_var4 |= bits << 12; + break; + case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: // TileBehavior_ManipulablyReplaced + if (bits & 2) + tiledetect_var2 |= 1 << (tile & 0xf); + R14 |= bits; + tiledetect_misc_tiles |= bits; + break; + case 0x80: case 0x81: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: // TileHandlerIndoor_80 + R14 |= bits << 4; + tiledetect_var1 = 2 * (tile & 1); + break; + case 0x82: case 0x83: // TileHandlerIndoor_82 + R14 |= (bits << 4) | (bits << 8); + tiledetect_var1 = 2 * (tile & 1); + break; + case 0x8e: case 0x8f: // TileBehavior_Entrance + R14 |= bits << 4; + bitmask_for_dashable_tiles |= bits; + tiledetect_var1 = 0; + break; + case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: // TileBehavior_LayerToggleShutterDoor + room_transitioning_flags = 1; + R14 |= (bits << 4) | (bits << 8); + tiledetect_var1 = 2 * (tile & 1); + break; + case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf: // TileBehavior_LayerAndDungeonToggleShutterDoor + room_transitioning_flags = 3; + R14 |= (bits << 4) | (bits << 8); + tiledetect_var1 = 2 * (tile & 1); + break; + case 0xa0: case 0xa1: case 0xa4: case 0xa5: // TileBehavior_DungeonToggleManualDoor + room_transitioning_flags = 2; + R14 |= bits << 4; + tiledetect_var1 = 2 * (tile & 1); + break; + case 0xa2: case 0xa3: // TileBehavior_DungeonToggleShutterDoor + room_transitioning_flags = 2; + R14 |= (bits << 4) | (bits << 8); + tiledetect_var1 = 2 * (tile & 1); + break; + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: // TileBehavior_LightableTorch + R14 |= bits; + tiledetect_misc_tiles |= bits; + break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: // TileBehavior_FlaggableDoor + R14 |= bits; + tiledetect_misc_tiles |= bits << 4; + break; + + case 0x42: // TileBehavior_GraveStone + if (!is_indoors) { + tiledetect_key_lock_gravestones |= bits; + R14 |= bits; + } + break; + case 0x4c: case 0x4d: // TileBehavior_UnusedCornerType + if (!is_indoors) { + index_of_interacting_tile = tile; + detection_of_unknown_tile_types |= bits; + } + break; + case 0x4e: case 0x4f: // TileBehavior_EasternRuinsCorner + if (!is_indoors) { + index_of_interacting_tile = tile; + detection_of_unknown_tile_types |= bits << 4; + } + break; + default: + assert(0); + } +} + diff --git a/tile_detect.h b/tile_detect.h new file mode 100644 index 00000000..8ef0ad74 --- /dev/null +++ b/tile_detect.h @@ -0,0 +1,18 @@ +#pragma once +#include "types.h" + + +uint8 Overworld_GetTileAttributeAtLocation(uint16 x, uint16 y); +void TileDetect_Movement_Y(uint16 direction); +void TileDetect_Movement_X(uint16 direction); +void TileDetect_Movement_VerticalSlopes(uint16_t direction); +void TileDetect_Movement_HorizontalSlopes(uint16_t direction); +void Player_TileDetectNearby(); +void Hookshot_CheckTileCollision(int k); +void Hookshot_CheckSingleLayerTileCollision(uint16 x, uint16 y, int dir); +void HandleNudgingInADoor(int8 speed); +void TileCheckForMirrorBonk(); +void TileDetect_SwordSwingDeepInDoor(uint8 dw); +void TileDetect_ResetState(); +void TileDetection_Execute(uint16 x, uint16 y, uint16 bits); +void TileDetect_ExecuteInner(uint8 tile, uint16 offs, uint16 bits, bool is_indoors); diff --git a/tracing.cpp b/tracing.cpp new file mode 100644 index 00000000..62ad4f22 --- /dev/null +++ b/tracing.cpp @@ -0,0 +1,208 @@ + +#define _CRT_SECURE_NO_WARNINGS 1 + +#include +#include +#include +#include +#include + +#include "tracing.h" +#include "snes/snes.h" +#include "snes/apu.h" + +// name for each opcode, to be filled in with sprintf (length = 14 (13+\0)) +static const char* opcodeNames[256] = { + "brk ", "ora ($%02x,x) ", "cop #$%02x ", "ora $%02x,s ", "tsb $%02x ", "ora $%02x ", "asl $%02x ", "ora [$%02x] ", "php ", "ora #$%04x ", "asl ", "phd ", "tsb $%04x ", "ora $%04x ", "asl $%04x ", "ora $%06x ", + "bpl $%04x ", "ora ($%02x),y ", "ora ($%02x) ", "ora ($%02x,s),y", "trb $%02x ", "ora $%02x,x ", "asl $%02x,x ", "ora [$%02x],y ", "clc ", "ora $%04x,y ", "inc ", "tcs ", "trb $%04x ", "ora $%04x,x ", "asl $%04x,x ", "ora $%06x,x", + "jsr $%04x ", "and ($%02x,x) ", "jsl $%06x ", "and $%02x,s ", "bit $%02x ", "and $%02x ", "rol $%02x ", "and [$%02x] ", "plp ", "and #$%04x ", "rol ", "pld ", "bit $%04x ", "and $%04x ", "rol $%04x ", "and $%06x ", + "bmi $%04x ", "and ($%02x),y ", "and ($%02x) ", "and ($%02x,s),y", "bit $%02x,x ", "and $%02x,x ", "rol $%02x,x ", "and [$%02x],y ", "sec ", "and $%04x,y ", "dec ", "tsc ", "bit $%04x,x ", "and $%04x,x ", "rol $%04x,x ", "and $%06x,x", + "rti ", "eor ($%02x,x) ", "wdm #$%02x ", "eor $%02x,s ", "mvp $%02x, $%02x ", "eor $%02x ", "lsr $%02x ", "eor [$%02x] ", "pha ", "eor #$%04x ", "lsr ", "phk ", "jmp $%04x ", "eor $%04x ", "lsr $%04x ", "eor $%06x ", + "bvc $%04x ", "eor ($%02x),y ", "eor ($%02x) ", "eor ($%02x,s),y", "mvn $%02x, $%02x ", "eor $%02x,x ", "lsr $%02x,x ", "eor [$%02x],y ", "cli ", "eor $%04x,y ", "phy ", "tcd ", "jml $%06x ", "eor $%04x,x ", "lsr $%04x,x ", "eor $%06x,x", + "rts ", "adc ($%02x,x) ", "per $%04x ", "adc $%02x,s ", "stz $%02x ", "adc $%02x ", "ror $%02x ", "adc [$%02x] ", "pla ", "adc #$%04x ", "ror ", "rtl ", "jmp ($%04x) ", "adc $%04x ", "ror $%04x ", "adc $%06x ", + "bvs $%04x ", "adc ($%02x),y ", "adc ($%02x) ", "adc ($%02x,s),y", "stz $%02x,x ", "adc $%02x,x ", "ror $%02x,x ", "adc [$%02x],y ", "sei ", "adc $%04x,y ", "ply ", "tdc ", "jmp ($%04x,x)", "adc $%04x,x ", "ror $%04x,x ", "adc $%06x,x", + "bra $%04x ", "sta ($%02x,x) ", "brl $%04x ", "sta $%02x,s ", "sty $%02x ", "sta $%02x ", "stx $%02x ", "sta [$%02x] ", "dey ", "bit #$%04x ", "txa ", "phb ", "sty $%04x ", "sta $%04x ", "stx $%04x ", "sta $%06x ", + "bcc $%04x ", "sta ($%02x),y ", "sta ($%02x) ", "sta ($%02x,s),y", "sty $%02x,x ", "sta $%02x,x ", "stx $%02x,y ", "sta [$%02x],y ", "tya ", "sta $%04x,y ", "txs ", "txy ", "stz $%04x ", "sta $%04x,x ", "stz $%04x,x ", "sta $%06x,x", + "ldy #$%04x ", "lda ($%02x,x) ", "ldx #$%04x ", "lda $%02x,s ", "ldy $%02x ", "lda $%02x ", "ldx $%02x ", "lda [$%02x] ", "tay ", "lda #$%04x ", "tax ", "plb ", "ldy $%04x ", "lda $%04x ", "ldx $%04x ", "lda $%06x ", + "bcs $%04x ", "lda ($%02x),y ", "lda ($%02x) ", "lda ($%02x,s),y", "ldy $%02x,x ", "lda $%02x,x ", "ldx $%02x,y ", "lda [$%02x],y ", "clv ", "lda $%04x,y ", "tsx ", "tyx ", "ldy $%04x,x ", "lda $%04x,x ", "ldx $%04x,y ", "lda $%06x,x", + "cpy #$%04x ", "cmp ($%02x,x) ", "rep #$%02x ", "cmp $%02x,s ", "cpy $%02x ", "cmp $%02x ", "dec $%02x ", "cmp [$%02x] ", "iny ", "cmp #$%04x ", "dex ", "wai ", "cpy $%04x ", "cmp $%04x ", "dec $%04x ", "cmp $%06x ", + "bne $%04x ", "cmp ($%02x),y ", "cmp ($%02x) ", "cmp ($%02x,s),y", "pei $%02x ", "cmp $%02x,x ", "dec $%02x,x ", "cmp [$%02x],y ", "cld ", "cmp $%04x,y ", "phx ", "stp ", "jml [$%04x] ", "cmp $%04x,x ", "dec $%04x,x ", "cmp $%06x,x", + "cpx #$%04x ", "sbc ($%02x,x) ", "sep #$%02x ", "sbc $%02x,s ", "cpx $%02x ", "sbc $%02x ", "inc $%02x ", "sbc [$%02x] ", "inx ", "sbc #$%04x ", "nop ", "xba ", "cpx $%04x ", "sbc $%04x ", "inc $%04x ", "sbc $%06x ", + "beq $%04x ", "sbc ($%02x),y ", "sbc ($%02x) ", "sbc ($%02x,s),y", "pea #$%04x ", "sbc $%02x,x ", "inc $%02x,x ", "sbc [$%02x],y ", "sed ", "sbc $%04x,y ", "plx ", "xce ", "jsr ($%04x,x)", "sbc $%04x,x ", "inc $%04x,x ", "sbc $%06x,x" +}; + +// for 8/16 bit immediates +// TODO: probably a better way to do this... +static const char* opcodeNamesSp[256] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "ora #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "and #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "eor #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "adc #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "bit #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "ldy #$%02x ", NULL, "ldx #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, "lda #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "cpy #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "cmp #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "cpx #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "sbc #$%02x ", NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + +// address types for each opcode +static const int opcodeType[256] = { + 0, 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3, + 2, 1, 3, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3, + 0, 1, 1, 1, 8, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 8, 1, 1, 1, 0, 2, 0, 0, 3, 2, 2, 3, + 0, 1, 7, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3, + 6, 1, 7, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3, + 5, 1, 5, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3, + 5, 1, 1, 1, 1, 1, 1, 1, 0, 4, 0, 0, 2, 2, 2, 3, + 6, 1, 1, 1, 2, 1, 1, 1, 0, 2, 0, 0, 2, 2, 2, 3 +}; + +// name for each opcode, for spc +static const char* opcodeNamesSpc[256] = { + "nop ", "tcall 0 ", "set1 $%02x.0 ", "bbs $%02x.0, $%04x ", "or a, $%02x ", "or a, $%04x ", "or a, [X] ", "or a, [$%02x+x] ", "or a, #$%02x ", "or $%02x, $%02x ", "or1 c, $%04x.%01x ", "asl $%02x ", "asl $%04x ", "push p ", "tset $%04x ", "brk ", + "bpl $%04x ", "tcall 1 ", "clr1 $%02x.0 ", "bbc $%02x.0, $%04x ", "or a, $%02x+x ", "or a, $%04x+x ", "or a, $%04x+y ", "or a, [$%02x]+y ", "or $%02x, #$%02x ", "or [X], [Y] ", "decw $%02x ", "asl $%02x+x ", "asl a ", "dec x ", "cmp x, $%04x ", "jmp [$%04x+x] ", + "clrp ", "tcall 2 ", "set1 $%02x.1 ", "bbs $%02x.1, $%04x ", "and a, $%02x ", "and a, $%04x ", "and a, [X] ", "and a, [$%02x+x] ", "and a, #$%02x ", "and $%02x, $%02x ", "or1 c, /$%04x.%01x ", "rol $%02x ", "rol $%04x ", "push a ", "cbne $%02x, $%04x ", "bra $%04x ", + "bmi $%04x ", "tcall 3 ", "clr1 $%02x.1 ", "bbc $%02x.1, $%04x ", "and a, $%02x+x ", "and a, $%04x+x ", "and a, $%04x+y ", "and a, [$%02x]+y ", "and $%02x, #$%02x ", "and [X], [Y] ", "incw $%02x ", "rol $%02x+x ", "rol a ", "inc x ", "cmp x, $%02x ", "call $%04x ", + "setp ", "tcall 4 ", "set1 $%02x.2 ", "bbs $%02x.2, $%04x ", "eor a, $%02x ", "eor a, $%04x ", "eor a, [X] ", "eor a, [$%02x+x] ", "eor a, #$%02x ", "eor $%02x, $%02x ", "and1 c, $%04x.%01x ", "lsr $%02x ", "lsr $%04x ", "push x ", "tclr $%04x ", "pcall $%02x ", + "bvc $%04x ", "tcall 5 ", "clr1 $%02x.2 ", "bbc $%02x.2, $%04x ", "eor a, $%02x+x ", "eor a, $%04x+x ", "eor a, $%04x+y ", "eor a, [$%02x]+y ", "eor $%02x, #$%02x ", "eor [X], [Y] ", "cmpw ya, $%02x ", "lsr $%02x+x ", "lsr a ", "mov x, a ", "cmp y, $%04x ", "jmp $%04x ", + "clrc ", "tcall 6 ", "set1 $%02x.3 ", "bbs $%02x.3, $%04x ", "cmp a, $%02x ", "cmp a, $%04x ", "cmp a, [X] ", "cmp a, [$%02x+x] ", "cmp a, #$%02x ", "cmp $%02x, $%02x ", "and1 c, /$%04x.%01x ", "ror $%02x ", "ror $%04x ", "push y ", "dbnz $%02x, $%04x ", "ret ", + "bvs $%04x ", "tcall 7 ", "clr1 $%02x.3 ", "bbc $%02x.3, $%04x ", "cmp a, $%02x+x ", "cmp a, $%04x+x ", "cmp a, $%04x+y ", "cmp a, [$%02x]+y ", "cmp $%02x, #$%02x ", "cmp [X], [Y] ", "addw ya, $%02x ", "ror $%02x+x ", "ror a ", "mov a, x ", "cmp y, $%02x ", "reti ", + "setc ", "tcall 8 ", "set1 $%02x.4 ", "bbs $%02x.4, $%04x ", "adc a, $%02x ", "adc a, $%04x ", "adc a, [X] ", "adc a, [$%02x+x] ", "adc a, #$%02x ", "adc $%02x, $%02x ", "eor1 c, $%04x.%01x ", "dec $%02x ", "dec $%04x ", "mov y, #$%02x ", "pop p ", "mov $%02x, #$%02x ", + "bcc $%04x ", "tcall 9 ", "clr1 $%02x.4 ", "bbc $%02x.4, $%04x ", "adc a, $%02x+x ", "adc a, $%04x+x ", "adc a, $%04x+y ", "adc a, [$%02x]+y ", "adc $%02x, #$%02x ", "adc [X], [Y] ", "subw ya, $%02x ", "dec $%02x+x ", "dec a ", "mov x, sp ", "div ya, x ", "xcn a ", + "ei ", "tcall 10 ", "set1 $%02x.5 ", "bbs $%02x.5, $%04x ", "sbc a, $%02x ", "sbc a, $%04x ", "sbc a, [X] ", "sbc a, [$%02x+x] ", "sbc a, #$%02x ", "sbc $%02x, $%02x ", "mov1 c, $%04x.%01x ", "inc $%02x ", "inc $%04x ", "cmp y, #$%02x ", "pop a ", "mov [x+], a ", + "bcs $%04x ", "tcall 11 ", "clr1 $%02x.5 ", "bbc $%02x.5, $%04x ", "sbc a, $%02x+x ", "sbc a, $%04x+x ", "sbc a, $%04x+y ", "sbc a, [$%02x]+y ", "sbc $%02x, #$%02x ", "sbc [X], [Y] ", "movw ya, $%02x ", "inc $%02x+x ", "inc a ", "mov sp, x ", "das a ", "mov a, [x+] ", + "di ", "tcall 12 ", "set1 $%02x.6 ", "bbs $%02x.6, $%04x ", "mov $%02x, a ", "mov $%04x, a ", "mov [X], a ", "mov [$%02x+x], a ", "cmp x, #$%02x ", "mov $%04x, x ", "mov1 $%04x.%01x, c ", "mov $%02x, y ", "mov $%04x, y ", "mov x, #$%02x ", "pop x ", "mul ya ", + "bne $%04x ", "tcall 13 ", "clr1 $%02x.6 ", "bbc $%02x.6, $%04x ", "mov $%02x+x, a ", "mov $%04x+x, a ", "mov $%04x+y, a ", "mov [$%02x]+y, a ", "mov $%02x, x ", "mov $%02x+y, x ", "movw $%02x, ya ", "mov $%02x+x, y ", "dec y ", "mov a, y ", "cbne $%02x+x, $%04x", "daa a ", + "clrv ", "tcall 14 ", "set1 $%02x.7 ", "bbs $%02x.7, $%04x ", "mov a, $%02x ", "mov a, $%04x ", "mov a, [X] ", "mov a, [$%02x+x] ", "mov a, #$%02x ", "mov x, $%04x ", "not1 $%04x.%01x ", "mov y, $%02x ", "mov y, $%04x ", "notc ", "pop y ", "sleep ", + "beq $%04x ", "tcall 15 ", "clr1 $%02x.7 ", "bbc $%02x.7, $%04x ", "mov a, $%02x+x ", "mov a, $%04x+x ", "mov a, $%04x+y ", "mov a, [$%02x]+y ", "mov x, $%02x ", "mov x, $%02x+y ", "mov $%02x, $%02x ", "mov y, $%02x+x ", "inc y ", "mov y, a ", "dbnz y, $%04x ", "stop " +}; + +// address types for each opcode, for spc +static const int opcodeTypeSpc[256] = { + 0, 0, 1, 5, 1, 2, 0, 1, 1, 4, 6, 1, 2, 0, 2, 0, + 3, 0, 1, 5, 1, 2, 2, 1, 4, 0, 1, 1, 0, 0, 2, 2, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 4, 6, 1, 2, 0, 5, 3, + 3, 0, 1, 5, 1, 2, 2, 1, 4, 0, 1, 1, 0, 0, 1, 2, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 4, 6, 1, 2, 0, 2, 1, + 3, 0, 1, 5, 1, 2, 2, 1, 4, 0, 1, 1, 0, 0, 2, 2, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 4, 6, 1, 2, 0, 5, 0, + 3, 0, 1, 5, 1, 2, 2, 1, 4, 0, 1, 1, 0, 0, 1, 0, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 4, 6, 1, 2, 1, 0, 4, + 3, 0, 1, 5, 1, 2, 2, 1, 4, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 4, 6, 1, 2, 1, 0, 0, + 3, 0, 1, 5, 1, 2, 2, 1, 4, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 2, 6, 1, 2, 1, 0, 0, + 3, 0, 1, 5, 1, 2, 2, 1, 1, 1, 1, 1, 0, 0, 5, 0, + 0, 0, 1, 5, 1, 2, 0, 1, 1, 2, 6, 1, 2, 0, 0, 0, + 3, 0, 1, 5, 1, 2, 2, 1, 1, 1, 4, 1, 0, 0, 3, 0 +}; + +static void getDisassemblyCpu(Snes* snes, char* line); +static void getDisassemblySpc(Apu *apu, char* line); + +void getProcessorStateCpu(Snes* snes, char* line) { + // 0 1 2 3 4 5 6 7 8 + // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 + // CPU 12:3456 1234567890123 A:1234 X:1234 Y:1234 SP:1234 DP:1234 DP:12 e nvmxdizc + char disLine[14] = " "; + getDisassemblyCpu(snes, disLine); + sprintf( + line, "CPU %02x:%04x %s A:%04x X:%04x Y:%04x SP:%04x DP:%04x DB:%02x %c %c%c%c%c%c%c%c%c", + snes->cpu->k, snes->cpu->pc, disLine, snes->cpu->a, snes->cpu->x, snes->cpu->y, + snes->cpu->sp, snes->cpu->dp, snes->cpu->db, snes->cpu->e ? 'E' : 'e', + snes->cpu->n ? 'N' : 'n', snes->cpu->v ? 'V' : 'v', snes->cpu->mf ? 'M' : 'm', snes->cpu->xf ? 'X' : 'x', + snes->cpu->d ? 'D' : 'd', snes->cpu->i ? 'I' : 'i', snes->cpu->z ? 'Z' : 'z', snes->cpu->c ? 'C' : 'c' + ); +} + +void getProcessorStateSpc(Apu *apu, char* line) { + // 0 1 2 3 4 5 6 7 8 + // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 + // SPC 3456 12345678901234567 A:12 X:12 Y:12 SP:12 nvpbhizc + char disLine[18] = " "; + getDisassemblySpc(apu, disLine); + sprintf( + line, "SPC %04x %s A:%02x X:%02x Y:%02x SP:%02x %c%c%c%c%c%c%c%c", + apu->spc->pc, disLine, apu->spc->a, apu->spc->x, apu->spc->y, apu->spc->sp, + apu->spc->n ? 'N' : 'n', apu->spc->v ? 'V' : 'v', apu->spc->p ? 'P' : 'p', apu->spc->b ? 'B' : 'b', + apu->spc->h ? 'H' : 'h', apu->spc->i ? 'I' : 'i', apu->spc->z ? 'Z' : 'z', apu->spc->c ? 'C' : 'c' + ); +} + +static void getDisassemblyCpu(Snes* snes, char* line) { + uint32_t adr = snes->cpu->pc | (snes->cpu->k << 16); + // read 4 bytes + // TODO: this can have side effects, implement and use peaking + uint8_t opcode = snes_read(snes, adr); + uint8_t byte = snes_read(snes, (adr + 1) & 0xffffff); + uint8_t byte2 = snes_read(snes, (adr + 2) & 0xffffff); + uint16_t word = (byte2 << 8) | byte; + uint32_t longv = (snes_read(snes, (adr + 3) & 0xffffff) << 16) | word; + uint16_t rel = snes->cpu->pc + 2 + (int8_t) byte; + uint16_t rell = snes->cpu->pc + 3 + (int16_t) word; + // switch on type + switch(opcodeType[opcode]) { + case 0: sprintf(line, "%s", opcodeNames[opcode]); break; + case 1: sprintf(line, opcodeNames[opcode], byte); break; + case 2: sprintf(line, opcodeNames[opcode], word); break; + case 3: sprintf(line, opcodeNames[opcode], longv); break; + case 4: { + if(snes->cpu->mf) { + sprintf(line, opcodeNamesSp[opcode], byte); + } else { + sprintf(line, opcodeNames[opcode], word); + } + break; + } + case 5: { + if(snes->cpu->xf) { + sprintf(line, opcodeNamesSp[opcode], byte); + } else { + sprintf(line, opcodeNames[opcode], word); + } + break; + } + case 6: sprintf(line, opcodeNames[opcode], rel); break; + case 7: sprintf(line, opcodeNames[opcode], rell); break; + case 8: sprintf(line, opcodeNames[opcode], byte2, byte); break; + } +} + +void getDisassemblySpc(Apu *apu, char* line) { + uint16_t adr = apu->spc->pc; + // read 3 bytes + // TODO: this can have side effects, implement and use peaking + uint8_t opcode = apu_cpuRead(apu, adr); + uint8_t byte = apu_cpuRead(apu, (adr + 1) & 0xffff); + uint8_t byte2 = apu_cpuRead(apu, (adr + 2) & 0xffff); + uint16_t word = (byte2 << 8) | byte; + uint16_t rel = apu->spc->pc + 2 + (int8_t) byte; + uint16_t rel2 = apu->spc->pc + 2 + (int8_t) byte2; + uint16_t wordb = word & 0x1fff; + uint8_t bit = word >> 13; + // switch on type + switch(opcodeTypeSpc[opcode]) { + case 0: sprintf(line, "%s", opcodeNamesSpc[opcode]); break; + case 1: sprintf(line, opcodeNamesSpc[opcode], byte); break; + case 2: sprintf(line, opcodeNamesSpc[opcode], word); break; + case 3: sprintf(line, opcodeNamesSpc[opcode], rel); break; + case 4: sprintf(line, opcodeNamesSpc[opcode], byte2, byte); break; + case 5: sprintf(line, opcodeNamesSpc[opcode], byte, rel2); break; + case 6: sprintf(line, opcodeNamesSpc[opcode], wordb, bit); break; + } +} diff --git a/tracing.h b/tracing.h new file mode 100644 index 00000000..e98e0ce4 --- /dev/null +++ b/tracing.h @@ -0,0 +1,17 @@ + +#ifndef TRACING_H +#define TRACING_H + + +#include +#include +#include +#include +#include + +#include "snes/snes.h" + +void getProcessorStateCpu(Snes* snes, char* line); +void getProcessorStateSpc(Apu* apu, char* line); + +#endif diff --git a/types.h b/types.h new file mode 100644 index 00000000..79fb6aa1 --- /dev/null +++ b/types.h @@ -0,0 +1,76 @@ +#include +#include +#pragma once + +typedef uint8_t uint8; +typedef int8_t int8; +typedef uint16_t uint16; +typedef int16_t int16; +typedef uint32_t uint32; +typedef int32_t int32; + +#define arraysize(x) sizeof(x)/sizeof(x[0]) +#define sign8(x) ((x) & 0x80) +#define sign16(x) ((x) & 0x8000) +#define load24(x) ((*(uint32*)&(x))&0xffffff) + +#ifdef _MSC_VER +#define countof _countof +#else +#define countof(a) (sizeof(a)/sizeof(*(a))) +#endif +static inline uint16 abs16(uint16 t) { return sign16(t) ? -t : t; } +static inline uint8 abs8(uint8 t) { return sign8(t) ? -t : t; } + +#define BYTE(x) (*(uint8*)&(x)) +#define HIBYTE(x) (((uint8*)&(x))[1]) +#define WORD(x) (*(uint16*)&(x)) +#define XY(x, y) ((y)*64+(x)) + +static inline uint16 swap16(uint16 v) { return (v << 8) | (v >> 8); } + +struct Point16U { + uint16 x, y; +}; +struct PointU8 { + uint8 x, y; +}; + +struct Pair16U { + uint16 a, b; +}; + +struct PairU8 { + uint8 a, b; +}; + +struct ProjectSpeedRet { + uint8 x, y; + uint8 xdiff, ydiff; +}; + +struct OamEnt { + uint8 x, y, charnum, flags; +}; + +struct UploadVram_Row { + uint16 col[32]; +}; + +struct UploadVram_32x32 { + UploadVram_Row row[32]; +}; + +struct UploadVram_3 { + uint8 pad[256]; + uint16 data[4]; +}; + +union UploadVram { + UploadVram_3 t3; +}; + +#define uvram (*(UploadVram*)(&g_ram[0x1000])) + +typedef void PlayerHandlerFunc(); +typedef void HandlerFuncK(int k); \ No newline at end of file diff --git a/variables.h b/variables.h new file mode 100644 index 00000000..99430722 --- /dev/null +++ b/variables.h @@ -0,0 +1,1237 @@ + +#define main_module_index (*(uint8*)(g_ram+0x10)) +#define submodule_index (*(uint8*)(g_ram+0x11)) +#define nmi_boolean (*(uint8*)(g_ram+0x12)) +#define INIDISP_copy (*(uint8*)(g_ram+0x13)) +#define nmi_load_bg_from_vram (*(uint8*)(g_ram+0x14)) +#define flag_update_cgram_in_nmi (*(uint8*)(g_ram+0x15)) +#define flag_update_hud_in_nmi (*(uint8*)(g_ram+0x16)) +#define nmi_subroutine_index (*(uint8*)(g_ram+0x17)) +#define nmi_copy_packets_flag (*(uint8*)(g_ram+0x18)) +#define nmi_update_tilemap_dst (*(uint8*)(g_ram+0x19)) +#define frame_counter (*(uint8*)(g_ram+0x1A)) +#define player_is_indoors (*(uint8*)(g_ram+0x1B)) +#define TM_copy (*(uint8*)(g_ram+0x1C)) +#define TS_copy (*(uint8*)(g_ram+0x1D)) +#define TMW_copy (*(uint8*)(g_ram+0x1E)) +#define TSW_copy (*(uint8*)(g_ram+0x1F)) +#define link_y_coord (*(uint16*)(g_ram+0x20)) +#define link_x_coord (*(uint16*)(g_ram+0x22)) +#define link_z_coord (*(uint16*)(g_ram+0x24)) +#define link_direction_last (*(uint8*)(g_ram+0x26)) +#define link_actual_vel_y (*(uint8*)(g_ram+0x27)) +#define link_actual_vel_x (*(uint8*)(g_ram+0x28)) +#define link_actual_vel_z (*(uint8*)(g_ram+0x29)) +#define link_subpixel_y (*(uint8*)(g_ram+0x2A)) +#define link_subpixel_x (*(uint8*)(g_ram+0x2B)) +#define link_subpixel_z (*(uint8*)(g_ram+0x2C)) +#define link_counter_var1 (*(uint8*)(g_ram+0x2D)) +#define link_animation_steps (*(uint8*)(g_ram+0x2E)) +#define link_direction_facing (*(uint8*)(g_ram+0x2F)) +#define link_y_vel (*(uint8*)(g_ram+0x30)) +#define link_x_vel (*(uint8*)(g_ram+0x31)) +#define link_y_coord_original (*(uint16*)(g_ram+0x32)) +#define byte_7E0034 (*(uint8*)(g_ram+0x34)) +#define byte_7E0035 (*(uint8*)(g_ram+0x35)) +#define tiledetect_diagonal_tile (*(uint16*)(g_ram+0x38)) +#define button_mask_b_y (*(uint8*)(g_ram+0x3A)) +#define bitfield_for_a_button (*(uint8*)(g_ram+0x3B)) +#define button_b_frames (*(uint8*)(g_ram+0x3C)) +#define link_delay_timer_spin_attack (*(uint8*)(g_ram+0x3D)) +#define link_y_coord_safe_return_lo (*(uint8*)(g_ram+0x3E)) +#define link_x_coord_safe_return_lo (*(uint8*)(g_ram+0x3F)) +#define link_y_coord_safe_return_hi (*(uint8*)(g_ram+0x40)) +#define link_x_coord_safe_return_hi (*(uint8*)(g_ram+0x41)) +#define link_direction_mask_a (*(uint8*)(g_ram+0x42)) +#define link_direction_mask_b (*(uint8*)(g_ram+0x43)) +#define player_oam_y_offset (*(uint8*)(g_ram+0x44)) +#define player_oam_x_offset (*(uint8*)(g_ram+0x45)) +#define link_incapacitated_timer (*(uint8*)(g_ram+0x46)) +#define set_when_damaging_enemies (*(uint8*)(g_ram+0x47)) +#define bitmask_of_dragstate (*(uint8*)(g_ram+0x48)) +#define force_move_any_direction (*(uint16*)(g_ram+0x49)) +#define link_visibility_status (*(uint8*)(g_ram+0x4B)) +#define cape_decrement_counter (*(uint8*)(g_ram+0x4C)) +#define link_auxiliary_state (*(uint8*)(g_ram+0x4D)) +#define byte_7E004E (*(uint8*)(g_ram+0x4E)) +#define index_of_dashing_sfx (*(uint8*)(g_ram+0x4F)) +#define link_cant_change_direction (*(uint8*)(g_ram+0x50)) +#define tiledetect_which_y_pos ((uint16*)(g_ram+0x51)) +#define link_cape_mode (*(uint8*)(g_ram+0x55)) +#define link_is_bunny (*(uint8*)(g_ram+0x56)) +#define link_speed_modifier (*(uint8*)(g_ram+0x57)) +#define tiledetect_stair_tile (*(uint8*)(g_ram+0x58)) +#define tiledetect_pit_tile (*(uint8*)(g_ram+0x59)) +#define link_this_controls_sprite_oam (*(uint8*)(g_ram+0x5A)) +#define player_near_pit_state (*(uint8*)(g_ram+0x5B)) +#define byte_7E005C (*(uint8*)(g_ram+0x5C)) +#define link_player_handler_state (*(uint8*)(g_ram+0x5D)) +#define link_speed_setting (*(uint8*)(g_ram+0x5E)) +#define tiledetect_var2 (*(uint16*)(g_ram+0x5F)) +#define gravestone_push_timeout (*(uint8*)(g_ram+0x61)) +#define tiledetect_var1 (*(uint16*)(g_ram+0x62)) +#define oam_priority_value (*(uint16*)(g_ram+0x64)) +#define link_last_direction_moved_towards (*(uint8*)(g_ram+0x66)) +#define link_direction (*(uint8*)(g_ram+0x67)) +#define link_y_page_movement_delta (*(uint8*)(g_ram+0x68)) +#define link_x_page_movement_delta (*(uint8*)(g_ram+0x69)) +#define link_num_orthogonal_directions (*(uint8*)(g_ram+0x6A)) +#define link_moving_against_diag_tile (*(uint8*)(g_ram+0x6B)) +#define is_standing_in_doorway (*(uint8*)(g_ram+0x6C)) +#define moving_against_diag_deadlocked (*(uint8*)(g_ram+0x6D)) +#define tiledetect_diag_state (*(uint16*)(g_ram+0x6E)) +#define byte_7E0071 (*(uint8*)(g_ram+0x71)) +#define scratch_b (*(uint8*)(g_ram+0x72)) +#define scratch_a (*(uint8*)(g_ram+0x73)) +#define scratch_c (*(uint8*)(g_ram+0x74)) +#define scratch_d (*(uint8*)(g_ram+0x75)) +#define index_of_interacting_tile (*(uint16*)(g_ram+0x76)) +#define allow_scroll_z (*(uint8*)(g_ram+0x78)) +#define link_spin_attack_step_counter (*(uint8*)(g_ram+0x79)) +#define last_light_vs_dark_world (*(uint8*)(g_ram+0x7B)) +#define word_7E007E (*(uint16*)(g_ram+0x7E)) +#define map16_load_src_off (*(uint16*)(g_ram+0x84)) +#define map16_load_dst_off (*(uint16*)(g_ram+0x86)) +#define map16_load_var2 (*(uint16*)(g_ram+0x88)) +#define overworld_screen_index (*(uint16*)(g_ram+0x8A)) +#define overlay_index (*(uint16*)(g_ram+0x8C)) +#define oam_cur_ptr (*(uint16*)(g_ram+0x90)) +#define oam_ext_cur_ptr (*(uint16*)(g_ram+0x92)) +#define BGMODE_copy (*(uint8*)(g_ram+0x94)) +#define MOSAIC_copy (*(uint8*)(g_ram+0x95)) +#define W12SEL_copy (*(uint8*)(g_ram+0x96)) +#define W34SEL_copy (*(uint8*)(g_ram+0x97)) +#define WOBJSEL_copy (*(uint8*)(g_ram+0x98)) +#define CGWSEL_copy (*(uint8*)(g_ram+0x99)) +#define CGADSUB_copy (*(uint8*)(g_ram+0x9A)) +#define HDMAEN_copy (*(uint8*)(g_ram+0x9B)) +#define COLDATA_copy0 (*(uint8*)(g_ram+0x9C)) +#define COLDATA_copy1 (*(uint8*)(g_ram+0x9D)) +#define COLDATA_copy2 (*(uint8*)(g_ram+0x9E)) +#define dungeon_room_index (*(uint16*)(g_ram+0xA0)) +#define dungeon_room_index_prev (*(uint16*)(g_ram+0xA2)) +#define dung_cur_floor (*(uint8*)(g_ram+0xA4)) +#define quadrant_fullsize_x (*(uint8*)(g_ram+0xA6)) +#define quadrant_fullsize_y (*(uint8*)(g_ram+0xA7)) +#define composite_of_layout_and_quadrant (*(uint8*)(g_ram+0xA8)) +#define link_quadrant_x (*(uint8*)(g_ram+0xA9)) +#define link_quadrant_y (*(uint8*)(g_ram+0xAA)) +#define dung_hdr_collision_2 (*(uint8*)(g_ram+0xAD)) +#define dung_hdr_tag ((uint8*)(g_ram+0xAE)) +#define subsubmodule_index (*(uint8*)(g_ram+0xB0)) +#define subsubmodule_index_PADDING (*(uint8*)(g_ram+0xB1)) +#define dung_draw_width_indicator (*(uint16*)(g_ram+0xB2)) +#define dung_draw_height_indicator (*(uint16*)(g_ram+0xB4)) +#define dung_load_ptr (*(uint16*)(g_ram+0xB7)) +#define dung_load_ptr_bank (*(uint8*)(g_ram+0xB9)) +#define dung_load_ptr_offs (*(uint16*)(g_ram+0xBA)) +#define tmp1 (*(uint16*)(g_ram+0xBD)) +#define dung_line_ptrs_row3 (*(uint16*)(g_ram+0xDA)) +#define dung_line_ptrs_row4 (*(uint16*)(g_ram+0xDD)) +#define BG1HOFS_copy2 (*(uint16*)(g_ram+0xE0)) +#define BG2HOFS_copy2 (*(uint16*)(g_ram+0xE2)) +#define BG3HOFS_copy2 (*(uint16*)(g_ram+0xE4)) +#define BG1VOFS_copy2 (*(uint16*)(g_ram+0xE6)) +#define BG2VOFS_copy2 (*(uint16*)(g_ram+0xE8)) +#define BG3VOFS_copy2 (*(uint16*)(g_ram+0xEA)) +#define tilemap_location_calc_mask (*(uint16*)(g_ram+0xEC)) +#define link_is_on_lower_level (*(uint8*)(g_ram+0xEE)) +#define room_transitioning_flags (*(uint8*)(g_ram+0xEF)) +#define joypad1H_last (*(uint8*)(g_ram+0xF0)) +#define joypad1L_last (*(uint8*)(g_ram+0xF2)) +#define filtered_joypad_H (*(uint8*)(g_ram+0xF4)) +#define filtered_joypad_L (*(uint8*)(g_ram+0xF6)) +#define joypad1H_last2 (*(uint8*)(g_ram+0xF8)) +#define byte_7E00F9 (*(uint8*)(g_ram+0xF9)) +#define joypad1L_last2 (*(uint8*)(g_ram+0xFA)) +#define dung_unk2 (*(uint16*)(g_ram+0xFC)) +#define virq_trigger (*(uint8*)(g_ram+0xFF)) +#define link_dma_graphics_index (*(uint16*)(g_ram+0x100)) +#define link_dma_var1 (*(uint16*)(g_ram+0x102)) +#define link_dma_var2 (*(uint16*)(g_ram+0x104)) +#define link_dma_var3 (*(uint8*)(g_ram+0x107)) +#define link_dma_var4 (*(uint8*)(g_ram+0x108)) +#define link_dma_var5 (*(uint8*)(g_ram+0x109)) +#define death_var5 (*(uint8*)(g_ram+0x10A)) +#define saved_module_for_menu (*(uint8*)(g_ram+0x10C)) +#define which_entrance (*(uint8*)(g_ram+0x10E)) +#define byte_7E010F (*(uint8*)(g_ram+0x10F)) +#define dung_index_x3 (*(uint16*)(g_ram+0x110)) +#define flag_custom_spell_anim_active (*(uint8*)(g_ram+0x112)) +#define link_tile_below (*(uint8*)(g_ram+0x114)) +#define link_tile_below_PADDING (*(uint8*)(g_ram+0x115)) +#define nmi_load_target_addr (*(uint16*)(g_ram+0x116)) +#define nmi_update_tilemap_src (*(uint16*)(g_ram+0x118)) +#define bg1_x_offset (*(uint16*)(g_ram+0x11A)) +#define bg1_y_offset (*(uint16*)(g_ram+0x11C)) +#define BG2HOFS_copy (*(uint16*)(g_ram+0x11E)) +#define BG1HOFS_copy (*(uint16*)(g_ram+0x120)) +#define BG2VOFS_copy (*(uint16*)(g_ram+0x122)) +#define BG1VOFS_copy (*(uint16*)(g_ram+0x124)) +#define transition_counter (*(uint8*)(g_ram+0x126)) +#define irq_flag (*(uint8*)(g_ram+0x128)) +#define is_nmi_thread_active (*(uint8*)(g_ram+0x12A)) +#define music_control (*(uint8*)(g_ram+0x12C)) +#define sound_effect_ambient (*(uint8*)(g_ram+0x12D)) +#define sound_effect_1 (*(uint8*)(g_ram+0x12E)) +#define sound_effect_2 (*(uint8*)(g_ram+0x12F)) +#define music_unk1 (*(uint8*)(g_ram+0x130)) +#define sound_effect_ambient_last (*(uint8*)(g_ram+0x131)) +#define buffer_for_playing_songs (*(uint8*)(g_ram+0x132)) +#define last_music_control (*(uint8*)(g_ram+0x133)) +#define animated_tile_vram_addr (*(uint16*)(g_ram+0x134)) +#define flag_which_music_type (*(uint8*)(g_ram+0x136)) +#define stk_return_addr (*(uint16*)(g_ram+0x1FE)) +#define overworld_map_state (*(uint8*)(g_ram+0x200)) +#define hud_cur_item (*(uint8*)(g_ram+0x202)) +#define hud_cur_item_hi (*(uint8*)(g_ram+0x203)) +#define hud_var1 (*(uint8*)(g_ram+0x204)) +#define byte_7E0205 (*(uint8*)(g_ram+0x205)) +#define byte_7E0206 (*(uint8*)(g_ram+0x206)) +#define timer_for_flashing_circle (*(uint8*)(g_ram+0x207)) +#define animate_heart_refill_countdown (*(uint8*)(g_ram+0x208)) +#define animate_heart_refill_countdown_subpos (*(uint8*)(g_ram+0x209)) +#define is_doing_heart_animation (*(uint8*)(g_ram+0x20A)) +#define link_debug_value_1 (*(uint8*)(g_ram+0x20B)) +#define dungmap_init_state (*(uint8*)(g_ram+0x20D)) +#define dungmap_cur_floor (*(uint16*)(g_ram+0x20E)) +#define dungmap_var2 (*(uint8*)(g_ram+0x210)) +#define dungmap_idx (*(uint16*)(g_ram+0x211)) +#define dungmap_var4 (*(uint16*)(g_ram+0x213)) +#define dungmap_var3 (*(uint16*)(g_ram+0x215)) +#define dungmap_var5 (*(uint16*)(g_ram+0x217)) +#define word_7E0219 (*(uint16*)(g_ram+0x219)) +#define word_7E021D (*(uint16*)(g_ram+0x21D)) +#define word_7E021F (*(uint16*)(g_ram+0x21F)) +#define word_7E0221 (*(uint16*)(g_ram+0x221)) +#define byte_7E0223 (*(uint8*)(g_ram+0x223)) +#define ancilla_objprio ((uint8*)(g_ram+0x280)) +#define ancilla_U ((uint8*)(g_ram+0x28A)) +#define ancilla_z_vel ((uint8*)(g_ram+0x294)) +#define ancilla_z ((uint8*)(g_ram+0x29E)) +#define ancilla_z_subpixel ((uint8*)(g_ram+0x2A8)) +#define tiledetect_inroom_staircase (*(uint16*)(g_ram+0x2C0)) +#define byte_7E02C2 (*(uint8*)(g_ram+0x2C2)) +#define pushedblocks_some_index (*(uint8*)(g_ram+0x2C3)) +#define pushedblocks_maybe_timeout (*(uint8*)(g_ram+0x2C4)) +#define byte_7E02C5 (*(uint8*)(g_ram+0x2C5)) +#define link_recoilmode_timer (*(uint8*)(g_ram+0x2C6)) +#define link_actual_vel_z_copy (*(uint8*)(g_ram+0x2C7)) +#define byte_7E02C9 (*(uint8*)(g_ram+0x2C9)) +#define fallhole_var2 (*(uint8*)(g_ram+0x2CA)) +#define swimming_countdown (*(uint8*)(g_ram+0x2CB)) +#define byte_7E02CC (*(uint8*)(g_ram+0x2CC)) +#define word_7E02CD (*(uint16*)(g_ram+0x2CD)) +#define tagalong_var2 (*(uint8*)(g_ram+0x2CF)) +#define tagalong_var3 (*(uint8*)(g_ram+0x2D0)) +#define tagalong_var7 (*(uint8*)(g_ram+0x2D1)) +#define timer_tagalong_reacquire (*(uint8*)(g_ram+0x2D2)) +#define tagalong_var1 (*(uint8*)(g_ram+0x2D3)) +#define byte_7E02D4 (*(uint8*)(g_ram+0x2D4)) +#define tagalong_var4 (*(uint8*)(g_ram+0x2D6)) +#define byte_7E02D7 (*(uint8*)(g_ram+0x2D7)) +#define link_receiveitem_index (*(uint8*)(g_ram+0x2D8)) +#define link_receiveitem_var1 (*(uint8*)(g_ram+0x2D9)) +#define link_pose_for_item (*(uint8*)(g_ram+0x2DA)) +#define link_triggered_by_whirlpool_sprite (*(uint8*)(g_ram+0x2DB)) +#define link_x_coord_copy (*(uint16*)(g_ram+0x2DC)) +#define link_y_coord_copy (*(uint16*)(g_ram+0x2DE)) +#define link_is_bunny_mirror (*(uint8*)(g_ram+0x2E0)) +#define link_is_transforming (*(uint8*)(g_ram+0x2E1)) +#define link_bunny_transform_timer (*(uint8*)(g_ram+0x2E2)) +#define link_sword_delay_timer (*(uint8*)(g_ram+0x2E3)) +#define flag_is_link_immobilized (*(uint8*)(g_ram+0x2E4)) +#define tiledetect_chest (*(uint16*)(g_ram+0x2E5)) +#define tiledetect_key_lock_gravestones (*(uint8*)(g_ram+0x2E7)) +#define bitfield_spike_cactus_tiles (*(uint8*)(g_ram+0x2E8)) +#define item_receipt_method (*(uint8*)(g_ram+0x2E9)) +#define tiledetect_tile_type (*(uint16*)(g_ram+0x2EA)) +#define flag_is_ancilla_to_pick_up (*(uint8*)(g_ram+0x2EC)) +#define byte_7E02ED (*(uint8*)(g_ram+0x2ED)) +#define tiledetect_spike_floor_and_tile_triggers (*(uint8*)(g_ram+0x2EE)) +#define bitmask_for_dashable_tiles (*(uint8*)(g_ram+0x2EF)) +#define byte_7E02F0 (*(uint8*)(g_ram+0x2F0)) +#define link_dash_ctr (*(uint8*)(g_ram+0x2F1)) +#define tagalong_event_flags (*(uint8*)(g_ram+0x2F2)) +#define byte_7E02F3 (*(uint8*)(g_ram+0x2F3)) +#define flag_is_sprite_to_pick_up_cached (*(uint8*)(g_ram+0x2F4)) +#define player_on_somaria_platform (*(uint8*)(g_ram+0x2F5)) +#define tiledetect_misc_tiles (*(uint16*)(g_ram+0x2F6)) +#define link_want_make_noise_when_dashed (*(uint8*)(g_ram+0x2F8)) +#define tagalong_var5 (*(uint8*)(g_ram+0x2F9)) +#define link_is_near_moveable_statue (*(uint8*)(g_ram+0x2FA)) +#define player_handler_timer (*(uint8*)(g_ram+0x300)) +#define link_item_in_hand (*(uint8*)(g_ram+0x301)) +#define fallhole_var1 (*(uint8*)(g_ram+0x302)) +#define eq_selected_y_item (*(uint8*)(g_ram+0x303)) +#define eq_selected_y_item_copy (*(uint8*)(g_ram+0x304)) +#define debug_var2 (*(uint8*)(g_ram+0x305)) +#define unused_2 (*(uint8*)(g_ram+0x306)) +#define eq_selected_rod (*(uint8*)(g_ram+0x307)) +#define link_state_bits (*(uint8*)(g_ram+0x308)) +#define link_picking_throw_state (*(uint8*)(g_ram+0x309)) +#define some_animation_timer_steps (*(uint8*)(g_ram+0x30A)) +#define some_animation_timer (*(uint8*)(g_ram+0x30B)) +#define link_var30d (*(uint8*)(g_ram+0x30D)) +#define link_var30e (*(uint8*)(g_ram+0x30E)) +#define dung_floor_y_vel (*(uint16*)(g_ram+0x310)) +#define dung_floor_x_vel (*(uint16*)(g_ram+0x312)) +#define flag_is_sprite_to_pick_up (*(uint8*)(g_ram+0x314)) +#define tile_coll_flag (*(uint8*)(g_ram+0x315)) +#define byte_7E0316 (*(uint8*)(g_ram+0x316)) +#define byte_7E0317 (*(uint8*)(g_ram+0x317)) +#define related_to_moving_floor_y (*(uint16*)(g_ram+0x318)) +#define related_to_moving_floor_x (*(uint16*)(g_ram+0x31A)) +#define state_for_spin_attack (*(uint8*)(g_ram+0x31C)) +#define step_counter_for_spin_attack (*(uint8*)(g_ram+0x31D)) +#define link_spin_offsets (*(uint8*)(g_ram+0x31E)) +#define countdown_for_blink (*(uint8*)(g_ram+0x31F)) +#define tiledetect_moving_floor_tiles (*(uint16*)(g_ram+0x320)) +#define byte_7E0322 (*(uint8*)(g_ram+0x322)) +#define link_direction_facing_mirror (*(uint8*)(g_ram+0x323)) +#define byte_7E0324 (*(uint8*)(g_ram+0x324)) +#define byte_7E0325 (*(uint8*)(g_ram+0x325)) +#define swimcoll_var3 ((uint16*)(g_ram+0x326)) +#define link_maybe_swim_faster (*(uint8*)(g_ram+0x32A)) +#define swimcoll_var5 ((uint16*)(g_ram+0x32B)) +#define swimcoll_var1 ((uint16*)(g_ram+0x32F)) +#define byte_7E0333 (*(uint8*)(g_ram+0x333)) +#define swimcoll_var9 ((uint16*)(g_ram+0x334)) +#define swimcoll_var11 ((uint16*)(g_ram+0x338)) +#define swimcoll_var7 ((uint16*)(g_ram+0x33C)) +#define link_some_direction_bits (*(uint8*)(g_ram+0x340)) +#define tiledetect_deepwater (*(uint16*)(g_ram+0x341)) +#define tiledetect_normal_tiles (*(uint16*)(g_ram+0x343)) +#define link_is_in_deep_water (*(uint8*)(g_ram+0x345)) +#define link_palette_bits_of_oam (*(uint16*)(g_ram+0x346)) +#define tiledetect_icy_floor (*(uint16*)(g_ram+0x348)) +#define link_flag_moving (*(uint8*)(g_ram+0x34A)) +#define eq_debug_variable (*(uint8*)(g_ram+0x34B)) +#define tiledetect_water_staircase (*(uint16*)(g_ram+0x34C)) +#define byte_7E034E (*(uint8*)(g_ram+0x34E)) +#define link_swim_hard_stroke (*(uint8*)(g_ram+0x34F)) +#define link_debug_value_2 (*(uint8*)(g_ram+0x350)) +#define draw_water_ripples_or_grass (*(uint8*)(g_ram+0x351)) +#define sort_sprites_offset_into_oam_buffer (*(uint16*)(g_ram+0x352)) +#define value_computed_for_player_oam (*(uint8*)(g_ram+0x354)) +#define secondary_water_grass_timer (*(uint8*)(g_ram+0x355)) +#define primary_water_grass_timer (*(uint8*)(g_ram+0x356)) +#define tiledetect_thick_grass (*(uint16*)(g_ram+0x357)) +#define tiledetect_shallow_water (*(uint16*)(g_ram+0x359)) +#define tiledetect_destruction_aftermath (*(uint16*)(g_ram+0x35B)) +#define oam_priority_value_2 (*(uint16*)(g_ram+0x35D)) +#define flag_for_boomerang_in_place (*(uint8*)(g_ram+0x35F)) +#define link_electrocute_on_touch (*(uint8*)(g_ram+0x360)) +#define link_actual_vel_z_mirror (*(uint8*)(g_ram+0x362)) +#define link_actual_vel_z_copy_mirror (*(uint8*)(g_ram+0x363)) +#define link_z_coord_mirror (*(uint16*)(g_ram+0x364)) +#define tiledetect_read_something (*(uint16*)(g_ram+0x366)) +#define interacting_with_liftable_tile_x1 (*(uint8*)(g_ram+0x368)) +#define interacting_with_liftable_tile_x1b (*(uint8*)(g_ram+0x369)) +#define interacting_with_liftable_tile_x2 (*(uint8*)(g_ram+0x36A)) +#define player_unk1 (*(uint8*)(g_ram+0x36B)) +#define tile_action_index (*(uint8*)(g_ram+0x36C)) +#define tiledetect_vertical_ledge (*(uint8*)(g_ram+0x36D)) +#define detection_of_ledge_tiles_horiz_uphoriz (*(uint8*)(g_ram+0x36E)) +#define tiledetect_ledges_down_leftright (*(uint8*)(g_ram+0x36F)) +#define detection_of_unknown_tile_types (*(uint8*)(g_ram+0x370)) +#define link_timer_push_get_tired (*(uint8*)(g_ram+0x371)) +#define link_is_running (*(uint8*)(g_ram+0x372)) +#define link_give_damage (*(uint8*)(g_ram+0x373)) +#define link_countdown_for_dash (*(uint8*)(g_ram+0x374)) +#define link_timer_jump_ledge (*(uint8*)(g_ram+0x375)) +#define link_grabbing_wall (*(uint8*)(g_ram+0x376)) +#define link_unk_master_sword (*(uint8*)(g_ram+0x377)) +#define countdown_timer_for_staircases (*(uint8*)(g_ram+0x378)) +#define byte_7E0379 (*(uint8*)(g_ram+0x379)) +#define link_position_mode (*(uint8*)(g_ram+0x37A)) +#define link_disable_sprite_damage (*(uint8*)(g_ram+0x37B)) +#define player_sleep_in_bed_state (*(uint8*)(g_ram+0x37C)) +#define link_pose_during_opening (*(uint8*)(g_ram+0x37D)) +#define related_to_hookshot (*(uint8*)(g_ram+0x37E)) +#define cheatWalkThroughWalls (*(uint8*)(g_ram+0x37F)) +#define ancilla_K ((uint8*)(g_ram+0x380)) +#define ancilla_L ((uint8*)(g_ram+0x385)) +#define ancilla_A ((uint8*)(g_ram+0x38A)) +#define ancilla_B ((uint8*)(g_ram+0x38F)) +#define ancilla_G ((uint8*)(g_ram+0x394)) +#define boomerang_temp_y (*(uint16*)(g_ram+0x399)) +#define boomerang_temp_x (*(uint16*)(g_ram+0x39B)) +#define hookshot_effect_index (*(uint8*)(g_ram+0x39D)) +#define ancilla_arr3 ((uint8*)(g_ram+0x39F)) +#define ancilla_arr1 ((uint8*)(g_ram+0x3A4)) +#define ancilla_S ((uint8*)(g_ram+0x3A9)) +#define ancilla_aux_timer ((uint8*)(g_ram+0x3B1)) +#define door_debris_x ((uint16*)(g_ram+0x3B6)) +#define door_debris_y ((uint16*)(g_ram+0x3BA)) +#define door_debris_direction ((uint8*)(g_ram+0x3BE)) +#define ancilla_arr26 ((uint8*)(g_ram+0x3C0)) +#define ancilla_arr25 ((uint8*)(g_ram+0x3C2)) +#define ancilla_alloc_rotate (*(uint8*)(g_ram+0x3C4)) +#define ancilla_H ((uint8*)(g_ram+0x3C5)) +#define ancilla_floor2 ((uint8*)(g_ram+0x3CA)) +#define boomerang_arr1 ((uint8*)(g_ram+0x3CF)) +#define ancilla_arr23 ((uint8*)(g_ram+0x3D2)) +#define ancilla_T ((uint8*)(g_ram+0x3D5)) +#define ancilla_arr24 ((uint8*)(g_ram+0x3DB)) +#define ancilla_arr22 ((uint8*)(g_ram+0x3E1)) +#define ancilla_tile_attr ((uint8*)(g_ram+0x3E4)) +#define link_something_with_hookshot (*(uint8*)(g_ram+0x3E9)) +#define ancilla_R ((uint8*)(g_ram+0x3EA)) +#define link_force_hold_sword_up (*(uint8*)(g_ram+0x3EF)) +#define flute_countdown (*(uint8*)(g_ram+0x3F0)) +#define tiledetect_var4 (*(uint16*)(g_ram+0x3F1)) +#define byte_7E03F3 (*(uint8*)(g_ram+0x3F3)) +#define dung_unk6 (*(uint8*)(g_ram+0x3F4)) +#define link_timer_tempbunny (*(uint16*)(g_ram+0x3F5)) +#define link_need_for_poof_for_transform (*(uint8*)(g_ram+0x3F7)) +#define link_need_for_pullforrupees_sprite (*(uint8*)(g_ram+0x3F8)) +#define hookshot_var1 (*(uint8*)(g_ram+0x3F9)) +#define bit9_of_xcoord (*(uint16*)(g_ram+0x3FA)) +#define byte_7E03FC (*(uint8*)(g_ram+0x3FC)) +#define byte_7E03FD (*(uint8*)(g_ram+0x3FD)) +#define dung_door_opened (*(uint16*)(g_ram+0x400)) +#define dung_savegame_state_bits (*(uint16*)(g_ram+0x402)) +#define word_7E0405 (*(uint16*)(g_ram+0x405)) +#define dung_quadrants_visited (*(uint16*)(g_ram+0x408)) +#define overworld_area_index (*(uint16*)(g_ram+0x40A)) +#define cur_palace_index_x2 (*(uint16*)(g_ram+0x40C)) +#define dung_layout_and_starting_quadrant (*(uint16*)(g_ram+0x40E)) +#define overworld_screen_trans_dir_bits (*(uint16*)(g_ram+0x410)) +#define incremental_counter_for_vram (*(uint8*)(g_ram+0x412)) +#define dung_hdr_bg2_properties (*(uint8*)(g_ram+0x414)) +#define dung_hdr_bg2_properties_PADDING (*(uint8*)(g_ram+0x415)) +#define overworld_screen_trans_dir_bits2 (*(uint16*)(g_ram+0x416)) +#define overworld_screen_transition (*(uint8*)(g_ram+0x418)) +#define overworld_screen_transition_ALWAYSZERO (*(uint8*)(g_ram+0x419)) +#define dung_floor_move_flags (*(uint16*)(g_ram+0x41A)) +#define dung_some_subpixel ((uint8*)(g_ram+0x41C)) +#define moving_wall_var2 (*(uint8*)(g_ram+0x41E)) +#define word_7E0420 (*(uint16*)(g_ram+0x420)) +#define dung_floor_x_offs (*(uint16*)(g_ram+0x422)) +#define dung_floor_y_offs (*(uint16*)(g_ram+0x424)) +#define dung_hdr_collision_2_mirror (*(uint8*)(g_ram+0x428)) +#define dung_hdr_collision_2_mirror_PADDING (*(uint8*)(g_ram+0x429)) +#define moving_wall_var1 (*(uint16*)(g_ram+0x42A)) +#define dung_misc_objs_index (*(uint16*)(g_ram+0x42C)) +#define dung_index_of_torches (*(uint16*)(g_ram+0x42E)) +#define dung_door_switch_triggered (*(uint8*)(g_ram+0x430)) +#define dung_num_star_shaped_switches (*(uint16*)(g_ram+0x432)) +#define invisible_door_dir_and_index_x2 (*(uint16*)(g_ram+0x436)) +#define dung_num_inter_room_upnorth_stairs (*(uint16*)(g_ram+0x438)) +#define dung_num_inter_room_southdown_stairs (*(uint16*)(g_ram+0x43A)) +#define dung_num_inroom_upnorth_stairs (*(uint16*)(g_ram+0x43C)) +#define dung_num_inroom_southdown_stairs (*(uint16*)(g_ram+0x43E)) +#define dung_num_interpseudo_upnorth_stairs (*(uint16*)(g_ram+0x440)) +#define dung_num_inroom_upnorth_stairs_water (*(uint16*)(g_ram+0x442)) +#define dung_num_activated_water_ladders (*(uint16*)(g_ram+0x444)) +#define dung_num_water_ladders (*(uint16*)(g_ram+0x446)) +#define dung_some_stairs_unk4 (*(uint16*)(g_ram+0x448)) +#define kind_of_in_room_staircase (*(uint16*)(g_ram+0x44A)) +#define dung_num_toggle_floor (*(uint16*)(g_ram+0x44E)) +#define dung_num_toggle_palace (*(uint16*)(g_ram+0x450)) +#define dung_blastwall_flag_x (*(uint8*)(g_ram+0x452)) +#define dung_blastwall_flag_y (*(uint8*)(g_ram+0x453)) +#define dung_unk_blast_walls_2 (*(uint16*)(g_ram+0x454)) +#define dung_unk_blast_walls_3 (*(uint16*)(g_ram+0x456)) +#define hdr_dungeon_dark_with_lantern (*(uint8*)(g_ram+0x458)) +#define hdr_dungeon_dark_with_lantern_PADDING (*(uint8*)(g_ram+0x459)) +#define dung_num_lit_torches (*(uint8*)(g_ram+0x45A)) +#define dung_num_lit_torches_PADDING (*(uint8*)(g_ram+0x45B)) +#define dung_cur_quadrant_upload (*(uint8*)(g_ram+0x45C)) +#define dung_cur_quadrant_upload_PADDING (*(uint8*)(g_ram+0x45D)) +#define word_7E045E (*(uint16*)(g_ram+0x45E)) +#define dung_cur_door_idx (*(uint16*)(g_ram+0x460)) +#define which_staircase_index (*(uint8*)(g_ram+0x462)) +#define which_staircase_index_PADDING (*(uint8*)(g_ram+0x463)) +#define staircase_var1 (*(uint8*)(g_ram+0x464)) +#define related_to_trapdoors_somehow (*(uint16*)(g_ram+0x466)) +#define dung_flag_trapdoors_down (*(uint16*)(g_ram+0x468)) +#define dung_floor_2_filler_tiles (*(uint16*)(g_ram+0x46A)) +#define dung_hdr_collision (*(uint8*)(g_ram+0x46C)) +#define watergate_var1 (*(uint8*)(g_ram+0x470)) +#define watergate_var1_PADDING (*(uint8*)(g_ram+0x471)) +#define watergate_pos (*(uint16*)(g_ram+0x472)) +#define push_block_direction (*(uint8*)(g_ram+0x474)) +#define link_is_on_lower_level_mirror (*(uint8*)(g_ram+0x476)) +#define dung_index_of_torches_start (*(uint16*)(g_ram+0x478)) +#define about_to_jump_off_ledge (*(uint8*)(g_ram+0x47A)) +#define word_7E047C (*(uint16*)(g_ram+0x47C)) +#define dung_num_wall_upnorth_spiral_stairs (*(uint16*)(g_ram+0x47E)) +#define dung_num_wall_downnorth_spiral_stairs (*(uint16*)(g_ram+0x480)) +#define dung_num_wall_upnorth_spiral_stairs_2 (*(uint16*)(g_ram+0x482)) +#define dung_num_wall_downnorth_spiral_stairs_2 (*(uint16*)(g_ram+0x484)) +#define word_7E0486 (*(uint16*)(g_ram+0x486)) +#define word_7E0488 (*(uint16*)(g_ram+0x488)) +#define cur_staircase_plane (*(uint8*)(g_ram+0x48A)) +#define word_7E048C (*(uint16*)(g_ram+0x48C)) +#define dungeon_room_index2 (*(uint16*)(g_ram+0x48E)) +#define dung_floor_1_filler_tiles (*(uint16*)(g_ram+0x490)) +#define byte_7E0492 (*(uint8*)(g_ram+0x492)) +#define move_overlay_ctr (*(uint8*)(g_ram+0x494)) +#define dung_num_chests_x2 (*(uint16*)(g_ram+0x496)) +#define dung_num_bigkey_locks_x2 (*(uint16*)(g_ram+0x498)) +#define dung_num_stairs_1 (*(uint16*)(g_ram+0x49A)) +#define dung_num_stairs_2 (*(uint16*)(g_ram+0x49C)) +#define dung_num_stairs_wet (*(uint16*)(g_ram+0x49E)) +#define hud_floor_changed_timer (*(uint8*)(g_ram+0x4A0)) +#define dung_num_inter_room_upnorth_straight_stairs (*(uint16*)(g_ram+0x4A2)) +#define dung_num_inter_room_upsouth_straight_stairs (*(uint16*)(g_ram+0x4A4)) +#define dung_num_inter_room_downnorth_straight_stairs (*(uint16*)(g_ram+0x4A6)) +#define dung_num_inter_room_downsouth_straight_stairs (*(uint16*)(g_ram+0x4A8)) +#define death_var4 (*(uint8*)(g_ram+0x4AA)) +#define num_memorized_tiles (*(uint16*)(g_ram+0x4AC)) +#define dung_num_inroom_upsouth_stairs_water (*(uint16*)(g_ram+0x4AE)) +#define dung_unk5 (*(uint16*)(g_ram+0x4B0)) +#define word_7E04B2 (*(uint16*)(g_ram+0x4B2)) +#define super_bomb_indicator_unk2 (*(uint8*)(g_ram+0x4B4)) +#define super_bomb_indicator_unk1 (*(uint8*)(g_ram+0x4B5)) +#define word_7E04B6 (*(uint16*)(g_ram+0x4B6)) +#define big_key_door_message_triggered (*(uint16*)(g_ram+0x4B8)) +#define dung_overlay_to_load (*(uint8*)(g_ram+0x4BA)) +#define byte_7E04BC (*(uint8*)(g_ram+0x4BC)) +#define byte_7E04BE (*(uint8*)(g_ram+0x4BE)) +#define byte_7E04BF (*(uint8*)(g_ram+0x4BF)) +#define byte_7E04C0 (*(uint8*)(g_ram+0x4C0)) +#define byte_7E04C1 (*(uint8*)(g_ram+0x4C1)) +#define byte_7E04C2 (*(uint8*)(g_ram+0x4C2)) +#define minigame_credits (*(uint8*)(g_ram+0x4C4)) +#define byte_7E04C5 (*(uint8*)(g_ram+0x4C5)) +#define trigger_special_entrance (*(uint8*)(g_ram+0x4C6)) +#define flag_skip_call_tag_routines (*(uint8*)(g_ram+0x4C7)) +#define word_7E04C8 (*(uint16*)(g_ram+0x4C8)) +#define link_lowlife_countdown_timer_beep (*(uint8*)(g_ram+0x4CA)) +#define dung_torch_timers ((uint8*)(g_ram+0x4F0)) +#define dung_replacement_tile_state ((uint16*)(g_ram+0x500)) +#define dung_object_pos_in_objdata ((uint16*)(g_ram+0x520)) +#define dung_object_tilemap_pos ((uint16*)(g_ram+0x540)) +#define replacement_tilemap_UL ((uint16*)(g_ram+0x560)) +#define replacement_tilemap_LL ((uint16*)(g_ram+0x580)) +#define replacement_tilemap_UR ((uint16*)(g_ram+0x5A0)) +#define replacement_tilemap_LR ((uint16*)(g_ram+0x5C0)) +#define pushedblocks_x_hi ((uint16*)(g_ram+0x5E0)) +#define pushedblocks_x_lo ((uint16*)(g_ram+0x5E4)) +#define pushedblocks_target ((uint16*)(g_ram+0x5E8)) +#define pushedblocks_y_hi ((uint16*)(g_ram+0x5EC)) +#define pushedblocks_y_lo ((uint16*)(g_ram+0x5F0)) +#define pushedblocks_subpixel ((uint16*)(g_ram+0x5F4)) +#define pushedblock_facing ((uint16*)(g_ram+0x5F8)) +#define index_of_changable_dungeon_objs ((uint8*)(g_ram+0x5FC)) +#define up_down_scroll_target (*(uint16*)(g_ram+0x610)) +#define up_down_scroll_target_end (*(uint16*)(g_ram+0x612)) +#define left_right_scroll_target (*(uint16*)(g_ram+0x614)) +#define left_right_scroll_target_end (*(uint16*)(g_ram+0x616)) +#define camera_y_coord_scroll_low (*(uint16*)(g_ram+0x618)) +#define camera_y_coord_scroll_hi (*(uint16*)(g_ram+0x61A)) +#define camera_x_coord_scroll_low (*(uint16*)(g_ram+0x61C)) +#define camera_x_coord_scroll_hi (*(uint16*)(g_ram+0x61E)) +#define BG1HOFS_subpixel (*(uint16*)(g_ram+0x620)) +#define BG1VOFS_subpixel (*(uint16*)(g_ram+0x622)) +#define overworld_unk1 (*(uint16*)(g_ram+0x624)) +#define overworld_unk1_neg (*(uint16*)(g_ram+0x626)) +#define overworld_unk3 (*(uint16*)(g_ram+0x628)) +#define overworld_unk3_neg (*(uint16*)(g_ram+0x62A)) +#define dung_loade_bgoffs_h_copy (*(uint16*)(g_ram+0x62C)) +#define dung_loade_bgoffs_v_copy (*(uint16*)(g_ram+0x62E)) +#define byte_7E0630 (*(uint8*)(g_ram+0x630)) +#define byte_7E0631 (*(uint8*)(g_ram+0x631)) +#define byte_7E0635 (*(uint8*)(g_ram+0x635)) +#define overworld_map_flags (*(uint8*)(g_ram+0x636)) +#define timer_for_mode7_zoom (*(uint8*)(g_ram+0x637)) +#define M7X_copy (*(uint16*)(g_ram+0x638)) +#define M7Y_copy (*(uint16*)(g_ram+0x63A)) +#define dung_hdr_hole_teleporter_plane (*(uint8*)(g_ram+0x63C)) +#define dung_hdr_staircase_plane ((uint8*)(g_ram+0x63D)) +#define dung_flag_movable_block_was_pushed (*(uint8*)(g_ram+0x641)) +#define dung_flag_statechange_waterpuzzle (*(uint8*)(g_ram+0x642)) +#define dung_flag_somaria_block_switch (*(uint8*)(g_ram+0x646)) +#define mosaic_inc_or_dec (*(uint8*)(g_ram+0x647)) +#define spotlight_var3 (*(uint16*)(g_ram+0x670)) +#define spotlight_y_lower (*(uint16*)(g_ram+0x674)) +#define spotlight_y_upper (*(uint16*)(g_ram+0x676)) +#define word_7E0678 (*(uint16*)(g_ram+0x678)) +#define spotlight_var4 (*(uint16*)(g_ram+0x67A)) +#define spotlight_var1 (*(uint16*)(g_ram+0x67C)) +#define spotlight_var2 (*(uint16*)(g_ram+0x67E)) +#define water_hdma_var0 (*(uint16*)(g_ram+0x680)) +#define water_hdma_var1 (*(uint16*)(g_ram+0x682)) +#define water_hdma_var2 (*(uint16*)(g_ram+0x684)) +#define water_hdma_var3 (*(uint16*)(g_ram+0x686)) +#define water_hdma_var4 (*(uint16*)(g_ram+0x688)) +#define water_hdma_var5 (*(uint16*)(g_ram+0x68A)) +#define dung_door_opened_incl_adjacent (*(uint16*)(g_ram+0x68C)) +#define dung_cur_door_pos (*(uint16*)(g_ram+0x68E)) +#define door_animation_step_indicator (*(uint16*)(g_ram+0x690)) +#define door_open_closed_counter (*(uint16*)(g_ram+0x692)) +#define dung_which_key_x2 (*(uint16*)(g_ram+0x694)) +#define ow_entrance_value (*(uint16*)(g_ram+0x696)) +#define big_rock_starting_address (*(uint16*)(g_ram+0x698)) +#define ow_countdown_transition (*(uint8*)(g_ram+0x69A)) +#define byte_7E069C (*(uint8*)(g_ram+0x69C)) +#define byte_7E069E ((uint8*)(g_ram+0x69E)) +#define dung_toggle_floor_pos ((uint16*)(g_ram+0x6C0)) +#define dung_toggle_palace_pos ((uint16*)(g_ram+0x6D0)) +#define dung_chest_locations ((uint16*)(g_ram+0x6E0)) +#define dung_stairs_table_2 ((uint16*)(g_ram+0x6EC)) +#define current_area_of_player (*(uint16*)(g_ram+0x700)) +#define overworld_offset_base_y (*(uint16*)(g_ram+0x708)) +#define overworld_offset_mask_y (*(uint16*)(g_ram+0x70A)) +#define overworld_offset_base_x (*(uint16*)(g_ram+0x70C)) +#define overworld_offset_mask_x (*(uint16*)(g_ram+0x70E)) +#define nmi_disable_core_updates (*(uint8*)(g_ram+0x710)) +#define overworld_area_is_big (*(uint16*)(g_ram+0x712)) +#define overworld_area_is_big_backup (*(uint8*)(g_ram+0x714)) +#define overworld_right_bottom_bound_for_scroll (*(uint16*)(g_ram+0x716)) +#define vwf_flag_next_line (*(uint16*)(g_ram+0x720)) +#define vwf_curline (*(uint16*)(g_ram+0x722)) +#define vwf_var1 (*(uint16*)(g_ram+0x724)) +#define vwf_line_ptr (*(uint16*)(g_ram+0x726)) +#define extended_oam ((uint8*)(g_ram+0xA00)) +#define bytewise_extended_oam ((uint8*)(g_ram+0xA20)) +#define byte_7E0AA0 (*(uint8*)(g_ram+0xAA0)) +#define main_tile_theme_index (*(uint8*)(g_ram+0xAA1)) +#define aux_tile_theme_index (*(uint8*)(g_ram+0xAA2)) +#define sprite_graphics_index (*(uint8*)(g_ram+0xAA3)) +#define misc_sprites_graphics_index (*(uint8*)(g_ram+0xAA4)) +#define unused_config_gfx (*(uint16*)(g_ram+0xAA6)) +#define overworld_palette_aux_or_main (*(uint16*)(g_ram+0xAA8)) +#define load_chr_halfslot_even_odd (*(uint8*)(g_ram+0xAAA)) +#define overworld_palette_sp0 (*(uint8*)(g_ram+0xAAC)) +#define sprite_aux1_palette (*(uint8*)(g_ram+0xAAD)) +#define sprite_aux2_palette (*(uint8*)(g_ram+0xAAE)) +#define byte_7E0AB0 (*(uint8*)(g_ram+0xAB0)) +#define palette_sp6 (*(uint8*)(g_ram+0xAB1)) +#define hud_palette (*(uint8*)(g_ram+0xAB2)) +#define overworld_palette_mode (*(uint8*)(g_ram+0xAB3)) +#define overworld_palette_aux1_bp2to4_hi (*(uint8*)(g_ram+0xAB4)) +#define overworld_palette_aux2_bp5to7_hi (*(uint8*)(g_ram+0xAB5)) +#define dung_hdr_palette_1 (*(uint8*)(g_ram+0xAB6)) +#define byte_7E0AB7 (*(uint8*)(g_ram+0xAB7)) +#define overworld_palette_aux3_bp7_lo (*(uint8*)(g_ram+0xAB8)) +#define overworld_palette_swap_flag (*(uint8*)(g_ram+0xABD)) +#define flag_overworld_area_did_change (*(uint8*)(g_ram+0xABF)) +#define dma_source_addr_6 (*(uint16*)(g_ram+0xAC0)) +#define dma_source_addr_11 (*(uint16*)(g_ram+0xAC2)) +#define dma_source_addr_7 (*(uint16*)(g_ram+0xAC4)) +#define dma_source_addr_12 (*(uint16*)(g_ram+0xAC6)) +#define dma_source_addr_8 (*(uint16*)(g_ram+0xAC8)) +#define dma_source_addr_13 (*(uint16*)(g_ram+0xACA)) +#define dma_source_addr_3 (*(uint16*)(g_ram+0xACC)) +#define dma_source_addr_0 (*(uint16*)(g_ram+0xACE)) +#define dma_source_addr_4 (*(uint16*)(g_ram+0xAD0)) +#define dma_source_addr_1 (*(uint16*)(g_ram+0xAD2)) +#define dma_source_addr_5 (*(uint16*)(g_ram+0xAD4)) +#define dma_source_addr_2 (*(uint16*)(g_ram+0xAD6)) +#define dma_source_addr_10 (*(uint16*)(g_ram+0xAD8)) +#define dma_source_addr_15 (*(uint16*)(g_ram+0xADA)) +#define animated_tile_data_src (*(uint16*)(g_ram+0xADC)) +#define dma_source_addr_9 (*(uint16*)(g_ram+0xAE0)) +#define dma_source_addr_14 (*(uint16*)(g_ram+0xAE2)) +#define dma_var6 (*(uint16*)(g_ram+0xAE8)) +#define dma_var7 (*(uint16*)(g_ram+0xAEA)) +#define dma_source_addr_16 (*(uint16*)(g_ram+0xAEC)) +#define dma_source_addr_18 (*(uint16*)(g_ram+0xAEE)) +#define dma_source_addr_17 (*(uint16*)(g_ram+0xAF0)) +#define dma_source_addr_19 (*(uint16*)(g_ram+0xAF2)) +#define flag_travel_bird (*(uint16*)(g_ram+0xAF4)) +#define dma_source_addr_20 (*(uint16*)(g_ram+0xAF6)) +#define dma_source_addr_21 (*(uint16*)(g_ram+0xAF8)) +#define overlord_type ((uint8*)(g_ram+0xB00)) +#define overlord_x_lo ((uint8*)(g_ram+0xB08)) +#define overlord_x_hi ((uint8*)(g_ram+0xB10)) +#define overlord_y_lo ((uint8*)(g_ram+0xB18)) +#define overlord_y_hi ((uint8*)(g_ram+0xB20)) +#define overlord_gen1 ((uint8*)(g_ram+0xB28)) +#define overlord_gen2 ((uint8*)(g_ram+0xB30)) +#define overlord_gen3 ((uint8*)(g_ram+0xB38)) +#define overlord_floor ((uint8*)(g_ram+0xB40)) +#define overlord_offset_sprite_pos ((uint16*)(g_ram+0xB48)) +#define sprite_stunned ((uint8*)(g_ram+0xB58)) +#define repulsespark_floor_status (*(uint8*)(g_ram+0xB68)) +#define byte_7E0B69 (*(uint8*)(g_ram+0xB69)) +#define sprite_limit_instance (*(uint8*)(g_ram+0xB6A)) +#define sprite_flags ((uint8*)(g_ram+0xB6B)) +#define link_prevent_from_moving (*(uint8*)(g_ram+0xB7B)) +#define drag_player_x (*(uint16*)(g_ram+0xB7C)) +#define drag_player_y (*(uint16*)(g_ram+0xB7E)) +#define dungeon_room_history ((uint16*)(g_ram+0xB80)) +#define byte_7E0B88 (*(uint8*)(g_ram+0xB88)) +#define sprite_obj_prio ((uint8*)(g_ram+0xB89)) +#define archery_game_arrows_left (*(uint8*)(g_ram+0xB99)) +#define archery_game_out_of_arrows (*(uint8*)(g_ram+0xB9A)) +#define byte_7E0B9B (*(uint8*)(g_ram+0xB9B)) +#define dung_secrets_unk1 (*(uint16*)(g_ram+0xB9C)) +#define byte_7E0B9E (*(uint8*)(g_ram+0xB9E)) +#define sprite_ignore_projectile ((uint8*)(g_ram+0xBA0)) +#define sprite_unk2 ((uint8*)(g_ram+0xBB0)) +#define sprite_N ((uint8*)(g_ram+0xBC0)) +#define sprite_flags5 ((uint8*)(g_ram+0xBE0)) +#define ancilla_arr4 ((uint8*)(g_ram+0xBF0)) +#define ancilla_y_lo ((uint8*)(g_ram+0xBFA)) +#define ancilla_x_lo ((uint8*)(g_ram+0xC04)) +#define ancilla_y_hi ((uint8*)(g_ram+0xC0E)) +#define ancilla_x_hi ((uint8*)(g_ram+0xC18)) +#define ancilla_y_vel ((uint8*)(g_ram+0xC22)) +#define ancilla_x_vel ((uint8*)(g_ram+0xC2C)) +#define ancilla_y_subpixel ((uint8*)(g_ram+0xC36)) +#define ancilla_x_subpixel ((uint8*)(g_ram+0xC40)) +#define ancilla_type ((uint8*)(g_ram+0xC4A)) +#define ancilla_step ((uint8*)(g_ram+0xC54)) +#define ancilla_item_to_link ((uint8*)(g_ram+0xC5E)) +#define ancilla_timer ((uint8*)(g_ram+0xC68)) +#define ancilla_dir ((uint8*)(g_ram+0xC72)) +#define ancilla_floor ((uint8*)(g_ram+0xC7C)) +#define ancilla_oam_idx ((uint8*)(g_ram+0xC86)) +#define ancilla_numspr ((uint8*)(g_ram+0xC90)) +#define sprite_room ((uint8*)(g_ram+0xC9A)) +#define sprite_defl_bits ((uint8*)(g_ram+0xCAA)) +#define sprite_die_action ((uint8*)(g_ram+0xCBA)) +#define overlord_spawned_in_area ((uint8*)(g_ram+0xCCA)) +#define sprite_bump_damage ((uint8*)(g_ram+0xCD2)) +#define sprite_give_damage ((uint8*)(g_ram+0xCE2)) +#define damage_type_determiner (*(uint8*)(g_ram+0xCF2)) +#define damage_type_determiner_PADDING (*(uint8*)(g_ram+0xCF3)) +#define activate_bomb_trap_overlord (*(uint8*)(g_ram+0xCF4)) +#define dungmap_var6 (*(uint16*)(g_ram+0xCF5)) +#define overworld_secret_subst_ctr (*(uint8*)(g_ram+0xCF7)) +#define byte_7E0CF8 (*(uint8*)(g_ram+0xCF8)) +#define item_drop_luck (*(uint8*)(g_ram+0xCF9)) +#define luck_kill_counter (*(uint8*)(g_ram+0xCFA)) +#define num_sprites_killed (*(uint8*)(g_ram+0xCFB)) +#define number_of_times_hurt_by_sprites (*(uint8*)(g_ram+0xCFC)) +#define rupee_sfx_sound_delay (*(uint8*)(g_ram+0xCFD)) +#define word_7E0CFE (*(uint16*)(g_ram+0xCFE)) +#define sprite_y_lo ((uint8*)(g_ram+0xD00)) +#define sprite_x_lo ((uint8*)(g_ram+0xD10)) +#define sprite_y_hi ((uint8*)(g_ram+0xD20)) +#define sprite_x_hi ((uint8*)(g_ram+0xD30)) +#define sprite_y_vel ((uint8*)(g_ram+0xD40)) +#define sprite_x_vel ((uint8*)(g_ram+0xD50)) +#define sprite_y_subpixel ((uint8*)(g_ram+0xD60)) +#define sprite_x_subpixel ((uint8*)(g_ram+0xD70)) +#define sprite_ai_state ((uint8*)(g_ram+0xD80)) +#define sprite_A ((uint8*)(g_ram+0xD90)) +#define sprite_B ((uint8*)(g_ram+0xDA0)) +#define sprite_C ((uint8*)(g_ram+0xDB0)) +#define sprite_graphics ((uint8*)(g_ram+0xDC0)) +#define sprite_state ((uint8*)(g_ram+0xDD0)) +#define sprite_D ((uint8*)(g_ram+0xDE0)) +#define sprite_delay_main ((uint8*)(g_ram+0xDF0)) +#define sprite_delay_aux1 ((uint8*)(g_ram+0xE00)) +#define sprite_delay_aux2 ((uint8*)(g_ram+0xE10)) +#define sprite_type ((uint8*)(g_ram+0xE20)) +#define sprite_subtype ((uint8*)(g_ram+0xE30)) +#define sprite_flags2 ((uint8*)(g_ram+0xE40)) +#define sprite_health ((uint8*)(g_ram+0xE50)) +#define sprite_flags3 ((uint8*)(g_ram+0xE60)) +#define sprite_wallcoll ((uint8*)(g_ram+0xE70)) +#define sprite_subtype2 ((uint8*)(g_ram+0xE80)) +#define sprite_E ((uint8*)(g_ram+0xE90)) +#define sprite_F ((uint8*)(g_ram+0xEA0)) +#define sprite_head_dir ((uint8*)(g_ram+0xEB0)) +#define sprite_anim_clock ((uint8*)(g_ram+0xEC0)) +#define sprite_G ((uint8*)(g_ram+0xED0)) +#define sprite_delay_aux3 ((uint8*)(g_ram+0xEE0)) +#define sprite_hit_timer ((uint8*)(g_ram+0xEF0)) +#define sprite_pause ((uint8*)(g_ram+0xF00)) +#define sprite_delay_aux4 ((uint8*)(g_ram+0xF10)) +#define sprite_floor ((uint8*)(g_ram+0xF20)) +#define sprite_y_recoil ((uint8*)(g_ram+0xF30)) +#define sprite_x_recoil ((uint8*)(g_ram+0xF40)) +#define sprite_oam_flags ((uint8*)(g_ram+0xF50)) +#define sprite_flags4 ((uint8*)(g_ram+0xF60)) +#define sprite_z ((uint8*)(g_ram+0xF70)) +#define sprite_z_vel ((uint8*)(g_ram+0xF80)) +#define sprite_z_subpos ((uint8*)(g_ram+0xF90)) +#define cur_object_index (*(uint8*)(g_ram+0xFA0)) +#define byte_7E0FA1 (*(uint8*)(g_ram+0xFA1)) +#define sprite_tiletype (*(uint8*)(g_ram+0xFA5)) +#define dungmap_var7 (*(uint16*)(g_ram+0xFA8)) +#define dungmap_var8 (*(uint16*)(g_ram+0xFAA)) +#define repulsespark_timer (*(uint8*)(g_ram+0xFAC)) +#define repulsespark_x_lo (*(uint8*)(g_ram+0xFAD)) +#define repulsespark_y_lo (*(uint8*)(g_ram+0xFAE)) +#define repulsespark_anim_delay (*(uint8*)(g_ram+0xFAF)) +#define byte_7E0FB0 (*(uint8*)(g_ram+0xFB0)) +#define byte_7E0FB1 (*(uint8*)(g_ram+0xFB1)) +#define byte_7E0FB2 (*(uint8*)(g_ram+0xFB2)) +#define sort_sprites_setting (*(uint8*)(g_ram+0xFB3)) +#define garnish_active (*(uint8*)(g_ram+0xFB4)) +#define tmp_counter (*(uint8*)(g_ram+0xFB5)) +#define byte_7E0FB6 (*(uint8*)(g_ram+0xFB6)) +#define spr_ranged_based_toggler (*(uint8*)(g_ram+0xFB7)) +#define sprcoll_x_size (*(uint16*)(g_ram+0xFB8)) +#define sprcoll_y_size (*(uint16*)(g_ram+0xFBA)) +#define sprcoll_x_base (*(uint16*)(g_ram+0xFBC)) +#define sprcoll_y_base (*(uint16*)(g_ram+0xFBE)) +#define flag_unk1 (*(uint8*)(g_ram+0xFC1)) +#define link_x_coord_prev (*(uint16*)(g_ram+0xFC2)) +#define link_y_coord_prev (*(uint16*)(g_ram+0xFC4)) +#define byte_7E0FC6 (*(uint8*)(g_ram+0xFC6)) +#define prizes_arr1 ((uint8*)(g_ram+0xFC7)) +#define debug_game_frozen (*(uint8*)(g_ram+0xFD7)) +#define cur_sprite_x (*(uint16*)(g_ram+0xFD8)) +#define cur_sprite_y (*(uint16*)(g_ram+0xFDA)) +#define sprite_alert_flag (*(uint8*)(g_ram+0xFDC)) +#define byte_7E0FDD (*(uint8*)(g_ram+0xFDD)) +#define byte_7E0FDE (*(uint8*)(g_ram+0xFDE)) +#define oam_region_base ((uint16*)(g_ram+0xFE0)) +#define oam_alloc_arr1 ((uint16*)(g_ram+0xFEC)) +#define byte_7E0FF8 (*(uint8*)(g_ram+0xFF8)) +#define intro_times_pal_flash (*(uint8*)(g_ram+0xFF9)) +#define alt_sprites_flag (*(uint8*)(g_ram+0xFFA)) +#define byte_7E0FFB (*(uint8*)(g_ram+0xFFB)) +#define flag_block_link_menu (*(uint8*)(g_ram+0xFFC)) +#define byte_7E0FFD (*(uint8*)(g_ram+0xFFD)) +#define byte_7E0FFE (*(uint8*)(g_ram+0xFFE)) +#define is_in_dark_world (*(uint8*)(g_ram+0xFFF)) +#define word_7E1800 (*(uint16*)(g_ram+0x1800)) +#define word_7E1806 (*(uint16*)(g_ram+0x1806)) +#define word_7E197E (*(uint16*)(g_ram+0x197E)) +#define door_type_and_slot ((uint16*)(g_ram+0x1980)) +#define dung_door_tilemap_address ((uint16*)(g_ram+0x19A0)) +#define dung_door_direction ((uint16*)(g_ram+0x19C0)) +#define dung_exit_door_count (*(uint16*)(g_ram+0x19E0)) +#define dung_exit_door_addresses ((uint16*)(g_ram+0x19E2)) +#define tagalong_y_lo ((uint8*)(g_ram+0x1A00)) +#define tagalong_y_hi ((uint8*)(g_ram+0x1A14)) +#define tagalong_x_lo ((uint8*)(g_ram+0x1A28)) +#define tagalong_x_hi ((uint8*)(g_ram+0x1A3C)) +#define tagalong_z ((uint8*)(g_ram+0x1A50)) +#define tagalong_layerbits ((uint8*)(g_ram+0x1A64)) +#define bird_travel_x_lo ((uint8*)(g_ram+0x1AB0)) +#define bird_travel_x_hi ((uint8*)(g_ram+0x1AC0)) +#define bird_travel_y_lo ((uint8*)(g_ram+0x1AD0)) +#define bird_travel_y_hi ((uint8*)(g_ram+0x1AE0)) +#define birdtravel_var1 ((uint8*)(g_ram+0x1AF0)) +#define mode7_hdma_table ((uint16*)(g_ram+0x1B00)) +#define text_msgbox_topleft_copy (*(uint16*)(g_ram+0x1CD0)) +#define text_msgbox_topleft (*(uint16*)(g_ram+0x1CD2)) +#define text_render_state (*(uint8*)(g_ram+0x1CD4)) +#define vwf_line_mode (*(uint8*)(g_ram+0x1CD5)) +#define vwf_line_speed (*(uint8*)(g_ram+0x1CD6)) +#define text_incremental_state (*(uint8*)(g_ram+0x1CD7)) +#define messaging_module (*(uint8*)(g_ram+0x1CD8)) +#define dialogue_msg_dst_offs (*(uint16*)(g_ram+0x1CD9)) +#define byte_7E1CDC (*(uint8*)(g_ram+0x1CDC)) +#define dialogue_msg_src_offs (*(uint16*)(g_ram+0x1CDD)) +#define byte_7E1CDF (*(uint8*)(g_ram+0x1CDF)) +#define text_wait_countdown (*(uint16*)(g_ram+0x1CE0)) +#define text_tilemap_cur (*(uint16*)(g_ram+0x1CE2)) +#define text_next_position (*(uint8*)(g_ram+0x1CE6)) +#define choice_in_multiselect_box (*(uint8*)(g_ram+0x1CE8)) +#define text_wait_countdown2 (*(uint8*)(g_ram+0x1CE9)) +#define byte_7E1CEA (*(uint8*)(g_ram+0x1CEA)) +#define dialogue_message_index (*(uint16*)(g_ram+0x1CF0)) +#define byte_7E1CF2 ((uint8*)(g_ram+0x1CF2)) +#define choice_in_multiselect_box_bak (*(uint8*)(g_ram+0x1CF4)) +#define alt_sprite_state ((uint8*)(g_ram+0x1D00)) +#define alt_sprite_type ((uint8*)(g_ram+0x1D10)) +#define alt_sprite_x_lo ((uint8*)(g_ram+0x1D20)) +#define alt_sprite_x_hi ((uint8*)(g_ram+0x1D30)) +#define alt_sprite_y_lo ((uint8*)(g_ram+0x1D40)) +#define alt_sprite_y_hi ((uint8*)(g_ram+0x1D50)) +#define alt_sprite_graphics ((uint8*)(g_ram+0x1D60)) +#define alt_sprite_A ((uint8*)(g_ram+0x1D70)) +#define alt_sprite_head_dir ((uint8*)(g_ram+0x1D80)) +#define alt_sprite_oam_flags ((uint8*)(g_ram+0x1D90)) +#define alt_sprite_obj_prio ((uint8*)(g_ram+0x1DA0)) +#define alt_sprite_D ((uint8*)(g_ram+0x1DB0)) +#define alt_sprite_flags2 ((uint8*)(g_ram+0x1DC0)) +#define alt_sprite_floor ((uint8*)(g_ram+0x1DD0)) +#define alt_sprite_spawned_flag ((uint8*)(g_ram+0x1DE0)) +#define alt_sprite_flags3 ((uint8*)(g_ram+0x1DF0)) +#define intro_step_index (*(uint8*)(g_ram+0x1E00)) +#define intro_step_timer (*(uint8*)(g_ram+0x1E01)) +#define intro_want_double_ret (*(uint8*)(g_ram+0x1E02)) +#define intro_sprite_alloc (*(uint16*)(g_ram+0x1E08)) +#define intro_frame_ctr (*(uint8*)(g_ram+0x1E0A)) +#define triforce_ctr (*(uint16*)(g_ram+0x1E0C)) +#define intro_sprite_isinited ((uint8*)(g_ram+0x1E10)) +#define intro_sprite_subtype ((uint8*)(g_ram+0x1E18)) +#define intro_sprite_state ((uint8*)(g_ram+0x1E20)) +#define intro_x_subpixel ((uint8*)(g_ram+0x1E28)) +#define intro_x_lo ((uint8*)(g_ram+0x1E30)) +#define intro_x_hi ((uint8*)(g_ram+0x1E38)) +#define intro_y_subpixel ((uint8*)(g_ram+0x1E40)) +#define intro_y_lo ((uint8*)(g_ram+0x1E48)) +#define intro_y_hi ((uint8*)(g_ram+0x1E50)) +#define intro_x_vel ((uint8*)(g_ram+0x1E58)) +#define intro_y_vel ((uint8*)(g_ram+0x1E60)) +#define intro_did_run_step (*(uint8*)(g_ram+0x1F00)) +#define poly_config_color_mode (*(uint8*)(g_ram+0x1F01)) +#define poly_config1 (*(uint8*)(g_ram+0x1F02)) +#define poly_which_model (*(uint8*)(g_ram+0x1F03)) +#define poly_a (*(uint8*)(g_ram+0x1F04)) +#define poly_b (*(uint8*)(g_ram+0x1F05)) +#define poly_base_x (*(uint8*)(g_ram+0x1F06)) +#define poly_base_y (*(uint8*)(g_ram+0x1F07)) +#define poly_var1 (*(uint16*)(g_ram+0x1F08)) +#define thread_other_stack (*(uint16*)(g_ram+0x1F0A)) +#define nmi_flag_update_polyhedral (*(uint8*)(g_ram+0x1F0C)) +#define poly_config_num_vertex (*(uint8*)(g_ram+0x1F3F)) +#define poly_config_num_polys (*(uint8*)(g_ram+0x1F40)) +#define poly_fromlut_ptr2 (*(uint16*)(g_ram+0x1F41)) +#define poly_fromlut_ptr4 (*(uint16*)(g_ram+0x1F43)) +#define poly_fromlut_z (*(uint8*)(g_ram+0x1F45)) +#define poly_fromlut_y (*(uint8*)(g_ram+0x1F46)) +#define poly_fromlut_x (*(uint8*)(g_ram+0x1F47)) +#define poly_f0 (*(uint16*)(g_ram+0x1F48)) +#define poly_f1 (*(uint16*)(g_ram+0x1F4A)) +#define poly_f2 (*(uint16*)(g_ram+0x1F4C)) +#define poly_num_vertex_in_poly (*(uint8*)(g_ram+0x1F4E)) +#define poly_raster_color_config (*(uint8*)(g_ram+0x1F4F)) +#define poly_sin_a (*(uint16*)(g_ram+0x1F50)) +#define poly_cos_a (*(uint16*)(g_ram+0x1F52)) +#define poly_sin_b (*(uint16*)(g_ram+0x1F54)) +#define poly_cos_b (*(uint16*)(g_ram+0x1F56)) +#define poly_e0 (*(uint16*)(g_ram+0x1F58)) +#define poly_e2 (*(uint16*)(g_ram+0x1F5A)) +#define poly_e3 (*(uint16*)(g_ram+0x1F5C)) +#define poly_e1 (*(uint16*)(g_ram+0x1F5E)) +#define poly_arr_x ((uint8*)(g_ram+0x1F60)) +#define poly_arr_y ((uint8*)(g_ram+0x1F88)) +#define poly_tmp0 (*(uint16*)(g_ram+0x1FB0)) +#define poly_tmp1 (*(uint16*)(g_ram+0x1FB2)) +#define poly_raster_color0 (*(uint16*)(g_ram+0x1FB5)) +#define poly_raster_color1 (*(uint16*)(g_ram+0x1FB7)) +#define poly_raster_dst_ptr (*(uint16*)(g_ram+0x1FB9)) +#define poly_tmp2 (*(uint8*)(g_ram+0x1FBC)) +#define poly_arr_xy_coords_minus1 (*(uint8*)(g_ram+0x1FBF)) +#define poly_xy_coords ((uint8*)(g_ram+0x1FC0)) +#define poly_total_num_steps (*(uint8*)(g_ram+0x1FE0)) +#define poly_x0_cur (*(uint8*)(g_ram+0x1FE1)) +#define poly_y0_cur (*(uint8*)(g_ram+0x1FE2)) +#define poly_x0_target (*(uint8*)(g_ram+0x1FE3)) +#define poly_y0_trig (*(uint8*)(g_ram+0x1FE4)) +#define poly_x0_frac (*(uint16*)(g_ram+0x1FE5)) +#define poly_x0_step (*(uint16*)(g_ram+0x1FE7)) +#define poly_cur_vertex_idx0 (*(uint8*)(g_ram+0x1FE9)) +#define poly_x1_cur (*(uint8*)(g_ram+0x1FEA)) +#define poly_y1_cur (*(uint8*)(g_ram+0x1FEB)) +#define poly_x1_target (*(uint8*)(g_ram+0x1FEC)) +#define poly_y1_trig (*(uint8*)(g_ram+0x1FED)) +#define poly_x1_frac (*(uint16*)(g_ram+0x1FEE)) +#define poly_x1_step (*(uint16*)(g_ram+0x1FF0)) +#define poly_cur_vertex_idx1 (*(uint8*)(g_ram+0x1FF2)) +#define poly_raster_numfull (*(uint16*)(g_ram+0x1FFA)) +#define dung_bg2 ((uint16*)(g_ram+0x2000)) +#define dung_bg1 ((uint16*)(g_ram+0x4000)) +#define word_7E6000 (*(uint16*)(g_ram+0x6000)) +#define word_7E8000 (*(uint16*)(g_ram+0x8000)) +#define dung_hdr_travel_destinations ((uint8*)(g_ram+0xC000)) +#define dung_want_lights_out (*(uint8*)(g_ram+0xC005)) +#define dung_want_lights_out_copy (*(uint8*)(g_ram+0xC006)) +#define palette_filter_countdown (*(uint16*)(g_ram+0xC007)) +#define darkening_or_lightening_screen (*(uint16*)(g_ram+0xC009)) +#define mosaic_target_level (*(uint8*)(g_ram+0xC00B)) +#define mosaic_target_level_PADDING (*(uint8*)(g_ram+0xC00C)) +#define bg_tile_animation_countdown (*(uint16*)(g_ram+0xC00D)) +#define word_7EC00F (*(uint16*)(g_ram+0xC00F)) +#define mosaic_level (*(uint8*)(g_ram+0xC011)) +#define word_7EC013 (*(uint16*)(g_ram+0xC013)) +#define word_7EC015 (*(uint16*)(g_ram+0xC015)) +#define overworld_fixed_color_plusminus (*(uint8*)(g_ram+0xC017)) +#define agahnim_pal_setting ((uint16*)(g_ram+0xC019)) +#define overworld_area_index_spexit (*(uint16*)(g_ram+0xC100)) +#define TM_copy_spexit (*(uint8*)(g_ram+0xC102)) +#define BG2VOFS_copy2_spexit (*(uint16*)(g_ram+0xC104)) +#define BG2HOFS_copy2_spexit (*(uint16*)(g_ram+0xC106)) +#define link_y_coord_spexit (*(uint16*)(g_ram+0xC108)) +#define link_x_coord_spexit (*(uint16*)(g_ram+0xC10A)) +#define overworld_screen_index_spexit (*(uint16*)(g_ram+0xC10C)) +#define map16_load_src_off_spexit (*(uint16*)(g_ram+0xC10E)) +#define camera_y_coord_scroll_low_spexit (*(uint16*)(g_ram+0xC110)) +#define camera_x_coord_scroll_low_spexit (*(uint16*)(g_ram+0xC112)) +#define room_scroll_vars0_ystart_spexit (*(uint16*)(g_ram+0xC114)) +#define room_scroll_vars0_yend_spexit (*(uint16*)(g_ram+0xC116)) +#define room_scroll_vars0_xstart_spexit (*(uint16*)(g_ram+0xC118)) +#define room_scroll_vars0_xend_spexit (*(uint16*)(g_ram+0xC11A)) +#define up_down_scroll_target_spexit (*(uint16*)(g_ram+0xC11C)) +#define up_down_scroll_target_end_spexit (*(uint16*)(g_ram+0xC11E)) +#define left_right_scroll_target_spexit (*(uint16*)(g_ram+0xC120)) +#define left_right_scroll_target_end_spexit (*(uint16*)(g_ram+0xC122)) +#define byte_7EC124 (*(uint8*)(g_ram+0xC124)) +#define main_tile_theme_index_spexit (*(uint8*)(g_ram+0xC125)) +#define aux_tile_theme_index_spexit (*(uint8*)(g_ram+0xC126)) +#define sprite_graphics_index_spexit (*(uint8*)(g_ram+0xC127)) +#define overworld_unk1_spexit (*(uint16*)(g_ram+0xC12A)) +#define overworld_unk1_neg_spexit (*(uint16*)(g_ram+0xC12C)) +#define overworld_unk3_spexit (*(uint16*)(g_ram+0xC12E)) +#define overworld_unk3_neg_spexit (*(uint16*)(g_ram+0xC130)) +#define overworld_area_index_exit (*(uint16*)(g_ram+0xC140)) +#define TM_copy_exit (*(uint16*)(g_ram+0xC142)) +#define BG2VOFS_copy2_exit (*(uint16*)(g_ram+0xC144)) +#define BG2HOFS_copy2_exit (*(uint16*)(g_ram+0xC146)) +#define link_y_coord_exit (*(uint16*)(g_ram+0xC148)) +#define link_x_coord_exit (*(uint16*)(g_ram+0xC14A)) +#define overworld_screen_index_exit (*(uint16*)(g_ram+0xC14C)) +#define map16_load_src_off_exit (*(uint16*)(g_ram+0xC14E)) +#define camera_y_coord_scroll_low_exit (*(uint16*)(g_ram+0xC150)) +#define camera_x_coord_scroll_low_exit (*(uint16*)(g_ram+0xC152)) +#define up_down_scroll_target_exit (*(uint16*)(g_ram+0xC15C)) +#define up_down_scroll_target_end_exit (*(uint16*)(g_ram+0xC15E)) +#define left_right_scroll_target_exit (*(uint16*)(g_ram+0xC160)) +#define left_right_scroll_target_end_exit (*(uint16*)(g_ram+0xC162)) +#define byte_7EC164 (*(uint8*)(g_ram+0xC164)) +#define main_tile_theme_index_exit (*(uint8*)(g_ram+0xC165)) +#define aux_tile_theme_index_exit (*(uint8*)(g_ram+0xC166)) +#define sprite_graphics_index_exit (*(uint8*)(g_ram+0xC167)) +#define overworld_unk1_exit (*(uint16*)(g_ram+0xC16A)) +#define overworld_unk1_neg_exit (*(uint16*)(g_ram+0xC16C)) +#define overworld_unk3_exit (*(uint16*)(g_ram+0xC16E)) +#define overworld_unk3_neg_exit (*(uint16*)(g_ram+0xC170)) +#define orange_blue_barrier_state (*(uint16*)(g_ram+0xC172)) +#define word_7EC174 (*(uint16*)(g_ram+0xC174)) +#define word_7EC176 (*(uint16*)(g_ram+0xC176)) +#define BG2HOFS_copy2_cached (*(uint16*)(g_ram+0xC180)) +#define BG2VOFS_copy2_cached (*(uint16*)(g_ram+0xC182)) +#define link_y_coord_cached (*(uint16*)(g_ram+0xC184)) +#define link_x_coord_cached (*(uint16*)(g_ram+0xC186)) +#define room_scroll_vars_y_vofs1_cached (*(uint16*)(g_ram+0xC188)) +#define room_scroll_vars_y_vofs2_cached (*(uint16*)(g_ram+0xC18A)) +#define room_scroll_vars_x_vofs1_cached (*(uint16*)(g_ram+0xC18C)) +#define room_scroll_vars_x_vofs2_cached (*(uint16*)(g_ram+0xC18E)) +#define up_down_scroll_target_cached (*(uint16*)(g_ram+0xC190)) +#define up_down_scroll_target_end_cached (*(uint16*)(g_ram+0xC192)) +#define left_right_scroll_target_cached (*(uint16*)(g_ram+0xC194)) +#define left_right_scroll_target_end_cached (*(uint16*)(g_ram+0xC196)) +#define camera_y_coord_scroll_low_cached (*(uint16*)(g_ram+0xC198)) +#define camera_x_coord_scroll_low_cached (*(uint16*)(g_ram+0xC19A)) +#define quadrant_fullsize_x_cached (*(uint8*)(g_ram+0xC19C)) +#define quadrant_fullsize_y_cached (*(uint8*)(g_ram+0xC19D)) +#define link_quadrant_x_cached (*(uint8*)(g_ram+0xC19E)) +#define link_quadrant_y_cached (*(uint8*)(g_ram+0xC19F)) +#define link_direction_facing_cached (*(uint8*)(g_ram+0xC1A6)) +#define link_is_on_lower_level_cached (*(uint8*)(g_ram+0xC1A7)) +#define link_is_on_lower_level_mirror_cached (*(uint8*)(g_ram+0xC1A8)) +#define is_standing_in_doorway_cahed (*(uint8*)(g_ram+0xC1A9)) +#define dung_cur_floor_cached (*(uint8*)(g_ram+0xC1AA)) +#define mapbak_BG1HOFS_copy2 (*(uint16*)(g_ram+0xC200)) +#define mapbak_BG2HOFS_copy2 (*(uint16*)(g_ram+0xC202)) +#define mapbak_BG1VOFS_copy2 (*(uint16*)(g_ram+0xC204)) +#define mapbak_BG2VOFS_copy2 (*(uint16*)(g_ram+0xC206)) +#define dung_bg2_properties_backup (*(uint8*)(g_ram+0xC208)) +#define overworld_pal_unk1 (*(uint8*)(g_ram+0xC20A)) +#define overworld_pal_unk2 (*(uint8*)(g_ram+0xC20B)) +#define overworld_pal_unk3 (*(uint8*)(g_ram+0xC20C)) +#define mapbak_main_tile_theme_index (*(uint8*)(g_ram+0xC20E)) +#define mapbak_sprite_graphics_index (*(uint8*)(g_ram+0xC20F)) +#define mapbak_aux_tile_theme_index (*(uint8*)(g_ram+0xC210)) +#define mapbak_TM (*(uint8*)(g_ram+0xC211)) +#define mapbak_TS (*(uint8*)(g_ram+0xC212)) +#define overworld_screen_index_prev (*(uint16*)(g_ram+0xC213)) +#define map16_load_src_off_prev (*(uint16*)(g_ram+0xC215)) +#define map16_load_var2_prev (*(uint16*)(g_ram+0xC217)) +#define map16_load_dst_off_prev (*(uint16*)(g_ram+0xC219)) +#define overworld_screen_transition_prev (*(uint8*)(g_ram+0xC21B)) +#define overworld_screen_trans_dir_bits_prev (*(uint16*)(g_ram+0xC21D)) +#define overworld_screen_trans_dir_bits2_prev (*(uint16*)(g_ram+0xC21F)) +#define mapbak_bg1_x_offset (*(uint16*)(g_ram+0xC221)) +#define mapbak_bg1_y_offset (*(uint16*)(g_ram+0xC223)) +#define mapbak_CGWSEL (*(uint16*)(g_ram+0xC225)) +#define music_unk1_death (*(uint8*)(g_ram+0xC227)) +#define sound_effect_ambient_last_death (*(uint8*)(g_ram+0xC228)) +#define mapbak_HDMAEN (*(uint8*)(g_ram+0xC229)) +#define byte_7EC22F (*(uint8*)(g_ram+0xC22F)) +#define vwf_arr ((uint8*)(g_ram+0xC230)) +#define aux_bg_subset_0 (*(uint8*)(g_ram+0xC2F8)) +#define aux_bg_subset_1 (*(uint8*)(g_ram+0xC2F9)) +#define aux_bg_subset_2 (*(uint8*)(g_ram+0xC2FA)) +#define aux_bg_subset_3 (*(uint8*)(g_ram+0xC2FB)) +#define sprite_gfx_subset_0 (*(uint8*)(g_ram+0xC2FC)) +#define sprite_gfx_subset_1 (*(uint8*)(g_ram+0xC2FD)) +#define sprite_gfx_subset_2 (*(uint8*)(g_ram+0xC2FE)) +#define sprite_gfx_subset_3 (*(uint8*)(g_ram+0xC2FF)) +#define aux_palette_buffer ((uint16*)(g_ram+0xC300)) +#define main_palette_buffer ((uint16*)(g_ram+0xC500)) +#define hud_tile_indices_buffer ((uint16*)(g_ram+0xC700)) +#define moving_wall_arr1 ((uint16*)(g_ram+0xC880)) +#define word_7EE000 (*(uint16*)(g_ram+0xE000)) +#define polyhedral_buffer ((uint8*)(g_ram+0xE800)) +#define save_dung_info ((uint16*)(g_ram+0xF000)) +#define save_ow_event_info ((uint8*)(g_ram+0xF280)) +#define savegame_has_master_sword_flags (*(uint16*)(g_ram+0xF300)) +#define byte_7EF33F (*(uint8*)(g_ram+0xF33F)) +#define link_item_bow (*(uint8*)(g_ram+0xF340)) +#define link_item_boomerang (*(uint8*)(g_ram+0xF341)) +#define link_item_hookshot (*(uint8*)(g_ram+0xF342)) +#define link_item_bombs (*(uint8*)(g_ram+0xF343)) +#define link_item_mushroom (*(uint8*)(g_ram+0xF344)) +#define link_item_fire_rod (*(uint8*)(g_ram+0xF345)) +#define link_item_ice_rod (*(uint8*)(g_ram+0xF346)) +#define link_item_bombos_medallion (*(uint8*)(g_ram+0xF347)) +#define link_item_ether_medallion (*(uint8*)(g_ram+0xF348)) +#define link_item_quake_medallion (*(uint8*)(g_ram+0xF349)) +#define link_item_torch (*(uint8*)(g_ram+0xF34A)) +#define link_item_hammer (*(uint8*)(g_ram+0xF34B)) +#define link_item_flute (*(uint8*)(g_ram+0xF34C)) +#define link_item_bug_net (*(uint8*)(g_ram+0xF34D)) +#define link_item_book_of_mudora (*(uint8*)(g_ram+0xF34E)) +#define link_item_bottles (*(uint8*)(g_ram+0xF34F)) +#define link_item_cane_somaria (*(uint8*)(g_ram+0xF350)) +#define link_item_cane_byrna (*(uint8*)(g_ram+0xF351)) +#define link_item_cape (*(uint8*)(g_ram+0xF352)) +#define link_item_mirror (*(uint8*)(g_ram+0xF353)) +#define link_item_gloves (*(uint8*)(g_ram+0xF354)) +#define link_item_boots (*(uint8*)(g_ram+0xF355)) +#define link_item_flippers (*(uint8*)(g_ram+0xF356)) +#define link_item_moon_pearl (*(uint8*)(g_ram+0xF357)) +#define link_sword_type (*(uint8*)(g_ram+0xF359)) +#define link_shield_type (*(uint8*)(g_ram+0xF35A)) +#define link_armor (*(uint8*)(g_ram+0xF35B)) +#define link_bottle_info ((uint8*)(g_ram+0xF35C)) +#define link_rupees_goal (*(uint16*)(g_ram+0xF360)) +#define link_rupees_actual (*(uint16*)(g_ram+0xF362)) +#define link_compass (*(uint16*)(g_ram+0xF364)) +#define link_bigkey (*(uint16*)(g_ram+0xF366)) +#define link_dungeon_map (*(uint16*)(g_ram+0xF368)) +#define link_rupees_in_pond (*(uint8*)(g_ram+0xF36A)) +#define link_heart_pieces (*(uint8*)(g_ram+0xF36B)) +#define link_health_capacity (*(uint8*)(g_ram+0xF36C)) +#define link_health_current (*(uint8*)(g_ram+0xF36D)) +#define link_magic_power (*(uint8*)(g_ram+0xF36E)) +#define link_num_keys (*(uint8*)(g_ram+0xF36F)) +#define link_bomb_upgrades (*(uint8*)(g_ram+0xF370)) +#define link_arrow_upgrades (*(uint8*)(g_ram+0xF371)) +#define link_hearts_filler (*(uint8*)(g_ram+0xF372)) +#define link_magic_filler (*(uint8*)(g_ram+0xF373)) +#define link_which_pendants (*(uint8*)(g_ram+0xF374)) +#define link_bomb_filler (*(uint8*)(g_ram+0xF375)) +#define link_arrow_filler (*(uint8*)(g_ram+0xF376)) +#define link_num_arrows (*(uint8*)(g_ram+0xF377)) +#define link_ability_flags (*(uint8*)(g_ram+0xF379)) +#define link_has_crystals (*(uint8*)(g_ram+0xF37A)) +#define link_magic_consumption (*(uint8*)(g_ram+0xF37B)) +#define link_keys_earned_per_dungeon ((uint8*)(g_ram+0xF37C)) +#define sram_progress_indicator (*(uint8*)(g_ram+0xF3C5)) +#define sram_progress_flags (*(uint8*)(g_ram+0xF3C6)) +#define savegame_map_icons_indicator (*(uint8*)(g_ram+0xF3C7)) +#define which_starting_point (*(uint8*)(g_ram+0xF3C8)) +#define sram_progress_indicator_3 (*(uint8*)(g_ram+0xF3C9)) +#define savegame_is_darkworld (*(uint8*)(g_ram+0xF3CA)) +#define savegame_tagalong (*(uint8*)(g_ram+0xF3CC)) +#define saved_tagalong_y (*(uint16*)(g_ram+0xF3CD)) +#define saved_tagalong_x (*(uint16*)(g_ram+0xF3CF)) +#define saved_tagalong_indoors (*(uint8*)(g_ram+0xF3D1)) +#define saved_tagalong_floor (*(uint8*)(g_ram+0xF3D2)) +#define super_bomb_going_off (*(uint8*)(g_ram+0xF3D3)) +#define deaths_per_palace ((uint16*)(g_ram+0xF3E7)) +#define death_save_counter (*(uint16*)(g_ram+0xF403)) +#define death_var2 (*(uint16*)(g_ram+0xF405)) +#define word_7EF4FE (*(uint16*)(g_ram+0xF4FE)) +#define pots_revealed_in_room ((uint16*)(g_ram+0xF580)) +#define memorized_tile_addr ((uint16*)(g_ram+0xF800)) +#define memorized_tile_value ((uint16*)(g_ram+0xFA00)) +#define word_7EFA40 ((uint16*)(g_ram+0xFA40)) +#define dung_torch_data ((uint16*)(g_ram+0xFB40)) +#define overworld_sprite_gfx ((uint8*)(g_ram+0xFCC0)) +#define overworld_sprite_palettes ((uint8*)(g_ram+0xFD40)) +#define attributes_for_tile ((uint8*)(g_ram+0xFE00)) +#define skullwoodsfire_var0 ((uint8*)(g_ram+0x10000)) +#define skullwoodsfire_var5 ((uint8*)(g_ram+0x10008)) +#define skullwoodsfire_var4 (*(uint8*)(g_ram+0x10010)) +#define blastwall_var4 (*(uint8*)(g_ram+0x10011)) +#define skullwoodsfire_var9 (*(uint16*)(g_ram+0x10018)) +#define skullwoodsfire_var11 (*(uint16*)(g_ram+0x1001A)) +#define blastwall_var7 (*(uint8*)(g_ram+0x1001C)) +#define skullwoodsfire_y_arr ((uint16*)(g_ram+0x10020)) +#define skullwoodsfire_var10 (*(uint16*)(g_ram+0x10026)) +#define skullwoodsfire_x_arr ((uint16*)(g_ram+0x10030)) +#define skullwoodsfire_var12 (*(uint16*)(g_ram+0x10036)) +#define blastwall_var12 ((uint8*)(g_ram+0x10040)) +#define word_7F1000 (*(uint16*)(g_ram+0x11000)) +#define word_7F1010 (*(uint16*)(g_ram+0x11010)) +#define byte_7F11FA (*(uint8*)(g_ram+0x111FA)) +#define byte_7F11FB (*(uint8*)(g_ram+0x111FB)) +#define byte_7F11FC (*(uint8*)(g_ram+0x111FC)) +#define byte_7F11FD (*(uint8*)(g_ram+0x111FD)) +#define byte_7F11FE (*(uint8*)(g_ram+0x111FE)) +#define byte_7F11FF (*(uint8*)(g_ram+0x111FF)) +#define messaging_text_buffer ((uint8*)(g_ram+0x11200)) +#define word_7F1FC0 (*(uint16*)(g_ram+0x11FC0)) +#define dung_bg2_attr_table ((uint8*)(g_ram+0x12000)) +#define dung_bg1_attr_table ((uint8*)(g_ram+0x13000)) +#define word_7F4000 (*(uint16*)(g_ram+0x14000)) +#define word_7F4002 (*(uint16*)(g_ram+0x14002)) +#define word_7F4004 (*(uint16*)(g_ram+0x14004)) +#define word_7F4006 (*(uint16*)(g_ram+0x14006)) +#define map16_decode_0 ((uint8*)(g_ram+0x14400)) +#define map16_decode_1 ((uint8*)(g_ram+0x14410)) +#define map16_decode_2 ((uint8*)(g_ram+0x14420)) +#define map16_decode_3 ((uint8*)(g_ram+0x14430)) +#define map16_decode_last (*(uint16*)(g_ram+0x14440)) +#define map16_decode_tmp (*(uint16*)(g_ram+0x14442)) +#define breaktowerseal_var3 ((uint8*)(g_ram+0x15800)) +#define breaktowerseal_var4 (*(uint8*)(g_ram+0x15808)) +#define breaktowerseal_x (*(uint16*)(g_ram+0x1580E)) +#define breaktowerseal_y (*(uint16*)(g_ram+0x15810)) +#define breaktowerseal_var5 (*(uint8*)(g_ram+0x15812)) +#define breaktowerseal_base_sparkle_y_lo ((uint8*)(g_ram+0x15817)) +#define breaktowerseal_base_sparkle_y_hi ((uint8*)(g_ram+0x1581F)) +#define breaktowerseal_base_sparkle_x_lo ((uint8*)(g_ram+0x15827)) +#define breaktowerseal_base_sparkle_x_hi ((uint8*)(g_ram+0x1582F)) +#define breaktowerseal_sparkle_var1 ((uint8*)(g_ram+0x15837)) +#define breaktowerseal_sparkle_y_lo ((uint8*)(g_ram+0x1584F)) +#define breaktowerseal_sparkle_y_hi ((uint8*)(g_ram+0x15867)) +#define breaktowerseal_sparkle_x_lo ((uint8*)(g_ram+0x1587F)) +#define breaktowerseal_sparkle_x_hi ((uint8*)(g_ram+0x15897)) +#define breaktowerseal_sparkle_var2 ((uint8*)(g_ram+0x158AF)) +#define overworld_music ((uint8*)(g_ram+0x15B00)) +#define freeRam ((uint8*)(g_ram+0x15BA0)) +#define enemy_damage_data ((uint8*)(g_ram+0x16000)) +#define hdma_table ((uint16*)(g_ram+0x17000)) +#define kTextDialoguePointers ((uint8*)(g_ram+0x171C0)) +#define word_7F8000 (*(uint16*)(g_ram+0x18000)) +#define word_7F9B52 (*(uint16*)(g_ram+0x19B52)) +#define word_7F9B54 (*(uint16*)(g_ram+0x19B54)) +#define word_7F9B56 (*(uint16*)(g_ram+0x19B56)) +#define word_7F9B58 (*(uint16*)(g_ram+0x19B58)) +#define word_7FA000 (*(uint16*)(g_ram+0x1A000)) +#define word_7FC000 (*(uint16*)(g_ram+0x1C000)) +#define mapbak_palette ((uint16*)(g_ram+0x1DD80)) +#define sprite_where_in_room ((uint16*)(g_ram+0x1DF80)) +#define overworld_sprite_was_loaded ((uint8*)(g_ram+0x1EF80)) +#define garnish_type ((uint8*)(g_ram+0x1F800)) +#define garnish_y_lo ((uint8*)(g_ram+0x1F81E)) +#define garnish_x_lo ((uint8*)(g_ram+0x1F83C)) +#define garnish_y_hi ((uint8*)(g_ram+0x1F85A)) +#define garnish_x_hi ((uint8*)(g_ram+0x1F878)) +#define garnish_y_vel ((uint8*)(g_ram+0x1F896)) +#define garnish_x_vel ((uint8*)(g_ram+0x1F8B4)) +#define garnish_y_subpixel ((uint8*)(g_ram+0x1F8D2)) +#define garnish_x_subpixel ((uint8*)(g_ram+0x1F8F0)) +#define garnish_countdown ((uint8*)(g_ram+0x1F90E)) +#define garnish_sprite ((uint8*)(g_ram+0x1F92C)) +#define garnish_anim_5 ((uint8*)(g_ram+0x1F94A)) +#define garnish_floor ((uint8*)(g_ram+0x1F968)) +#define sprite_I ((uint8*)(g_ram+0x1F9C2)) +#define garnish_oam_flags ((uint8*)(g_ram+0x1F9FE)) +#define sprite_unk3 ((uint8*)(g_ram+0x1FA1C)) +#define sprite_unk4 ((uint8*)(g_ram+0x1FA2C)) +#define sprite_unk5 ((uint8*)(g_ram+0x1FA3C)) +#define sprite_unk1 ((uint8*)(g_ram+0x1FA4C)) +#define swamola_x_lo ((uint8*)(g_ram+0x1FA5C)) +#define alt_sprite_C ((uint8*)(g_ram+0x1FA6C)) +#define alt_sprite_E ((uint8*)(g_ram+0x1FA7C)) +#define alt_sprite_subtype2 ((uint8*)(g_ram+0x1FA8C)) +#define alt_sprite_height_above_shadow ((uint8*)(g_ram+0x1FA9C)) +#define alt_sprite_delay_main ((uint8*)(g_ram+0x1FAAC)) +#define byte_7FFABC ((uint8*)(g_ram+0x1FABC)) +#define alt_sprite_I ((uint8*)(g_ram+0x1FACC)) +#define alt_sprite_maybe_ignore_projectile ((uint8*)(g_ram+0x1FADC)) +#define swamola_x_hi ((uint8*)(g_ram+0x1FB1C)) +#define swamola_y_lo ((uint8*)(g_ram+0x1FBDC)) +#define moldorm_x_lo ((uint8*)(g_ram+0x1FC00)) +#define moldorm_x_hi_ ((uint8*)(g_ram+0x1FC80)) +#define swamola_y_hi ((uint8*)(g_ram+0x1FC9C)) +#define moldorm_y_lo ((uint8*)(g_ram+0x1FD00)) +#define word_7FFD02 (*(uint16*)(g_ram+0x1FD02)) +#define swamola_target_x_lo ((uint8*)(g_ram+0x1FD5C)) +#define swamola_target_x_hi ((uint8*)(g_ram+0x1FD62)) +#define swamola_target_y_lo ((uint8*)(g_ram+0x1FD68)) +#define swamola_target_y_hi ((uint8*)(g_ram+0x1FD6E)) +#define beamos_x_lo ((uint8*)(g_ram+0x1FD80)) +#define beamos_x_hi ((uint8*)(g_ram+0x1FE00)) +#define beamos_y_lo ((uint8*)(g_ram+0x1FE80)) +#define beamos_y_hi ((uint8*)(g_ram+0x1FF00)) diff --git a/variables_attract.h b/variables_attract.h new file mode 100644 index 00000000..935fe4d6 --- /dev/null +++ b/variables_attract.h @@ -0,0 +1,40 @@ +#define attract_var12 (*(uint16*)(g_ram+0x20)) +#define attract_state (*(uint8*)(g_ram+0x22)) +#define attract_sequence (*(uint8*)(g_ram+0x23)) +#define attract_var10 (*(uint8*)(g_ram+0x25)) +#define attract_next_legend_gfx (*(uint8*)(g_ram+0x26)) +#define attract_legend_flag (*(uint8*)(g_ram+0x27)) +#define attract_x_base (*(uint8*)(g_ram+0x28)) +#define attract_y_base (*(uint8*)(g_ram+0x29)) +#define attract_oam_idx (*(uint8*)(g_ram+0x2A)) +#define attract_var9 (*(uint8*)(g_ram+0x2B)) +#define attract_var13 (*(uint8*)(g_ram+0x2C)) +#define attract_var7 (*(uint16*)(g_ram+0x2D)) +#define attract_vram_dst (*(uint16*)(g_ram+0x30)) +#define attract_var1 (*(uint8*)(g_ram+0x32)) +#define attract_var3 (*(uint8*)(g_ram+0x33)) +#define attract_var4 (*(uint8*)(g_ram+0x34)) +#define attract_x_base_hi (*(uint8*)(g_ram+0x40)) +#define attract_var17 (*(uint8*)(g_ram+0x50)) +#define attract_var21 (*(uint8*)(g_ram+0x51)) +#define attract_var15 (*(uint8*)(g_ram+0x52)) +#define attract_var22 (*(uint8*)(g_ram+0x5D)) +#define attract_var18 (*(uint8*)(g_ram+0x5F)) +#define attract_var5 (*(uint8*)(g_ram+0x60)) +#define attract_var11 (*(uint8*)(g_ram+0x61)) +#define attract_var19 (*(uint8*)(g_ram+0x62)) +#define attract_var20 (*(uint8*)(g_ram+0x63)) +#define selectfile_arr1 ((uint16*)(g_ram+0xBF)) +#define selectfile_arr2 ((uint8*)(g_ram+0xCA)) +#define selectfile_var6 (*(uint8*)(g_ram+0xCC)) +#define attract_room_index (*(uint8*)(g_ram+0x10E)) +#define attract_legend_ctr (*(uint16*)(g_ram+0x200)) +#define selectfile_var8 (*(uint16*)(g_ram+0x630)) +#define selectfile_var3 (*(uint8*)(g_ram+0xB10)) +#define selectfile_var7 (*(uint8*)(g_ram+0xB11)) +#define selectfile_var4 (*(uint8*)(g_ram+0xB12)) +#define selectfile_var9 (*(uint8*)(g_ram+0xB13)) +#define selectfile_var11 (*(uint8*)(g_ram+0xB14)) +#define selectfile_var5 (*(uint8*)(g_ram+0xB15)) +#define selectfile_var10 (*(uint8*)(g_ram+0xB16)) +#define selectfile_var2 (*(uint8*)(g_ram+0xB9D)) diff --git a/variables_blastwall.h b/variables_blastwall.h new file mode 100644 index 00000000..093f80b2 --- /dev/null +++ b/variables_blastwall.h @@ -0,0 +1,10 @@ +#define blastwall_var5 ((uint8*)(g_ram+0x10000)) +#define blastwall_var6 ((uint8*)(g_ram+0x10008)) +#define blastwall_var1 (*(uint8*)(g_ram+0x10010)) +#define blastwall_var4 (*(uint8*)(g_ram+0x10011)) +#define blastwall_var8 (*(uint16*)(g_ram+0x10018)) +#define blastwall_var9 (*(uint16*)(g_ram+0x1001A)) +#define blastwall_var7 (*(uint8*)(g_ram+0x1001C)) +#define blastwall_var10 ((uint16*)(g_ram+0x10020)) +#define blastwall_var11 ((uint16*)(g_ram+0x10030)) +#define blastwall_var12 ((uint8*)(g_ram+0x10040)) diff --git a/variables_breaktowerseal.h b/variables_breaktowerseal.h new file mode 100644 index 00000000..c2773ebc --- /dev/null +++ b/variables_breaktowerseal.h @@ -0,0 +1,15 @@ +#define breaktowerseal_var3 ((uint8*)(g_ram+0x15800)) +#define breaktowerseal_var4 (*(uint8*)(g_ram+0x15808)) +#define breaktowerseal_x (*(uint16*)(g_ram+0x1580E)) +#define breaktowerseal_y (*(uint16*)(g_ram+0x15810)) +#define breaktowerseal_var5 (*(uint8*)(g_ram+0x15812)) +#define breaktowerseal_base_sparkle_y_lo ((uint8*)(g_ram+0x15817)) +#define breaktowerseal_base_sparkle_y_hi ((uint8*)(g_ram+0x1581F)) +#define breaktowerseal_base_sparkle_x_lo ((uint8*)(g_ram+0x15827)) +#define breaktowerseal_base_sparkle_x_hi ((uint8*)(g_ram+0x1582F)) +#define breaktowerseal_sparkle_var1 ((uint8*)(g_ram+0x15837)) +#define breaktowerseal_sparkle_y_lo ((uint8*)(g_ram+0x1584F)) +#define breaktowerseal_sparkle_y_hi ((uint8*)(g_ram+0x15867)) +#define breaktowerseal_sparkle_x_lo ((uint8*)(g_ram+0x1587F)) +#define breaktowerseal_sparkle_x_hi ((uint8*)(g_ram+0x15897)) +#define breaktowerseal_sparkle_var2 ((uint8*)(g_ram+0x158AF)) diff --git a/variables_happiness_pond.h b/variables_happiness_pond.h new file mode 100644 index 00000000..b61c2045 --- /dev/null +++ b/variables_happiness_pond.h @@ -0,0 +1,15 @@ +#define happiness_pond_y_vel ((uint8*)(g_ram+0x15800)) +#define happiness_pond_x_vel ((uint8*)(g_ram+0x1580C)) +#define happiness_pond_z_vel ((uint8*)(g_ram+0x15818)) +#define happiness_pond_y_lo ((uint8*)(g_ram+0x15824)) +#define happiness_pond_y_hi ((uint8*)(g_ram+0x15830)) +#define happiness_pond_x_lo ((uint8*)(g_ram+0x1583C)) +#define happiness_pond_x_hi ((uint8*)(g_ram+0x15848)) +#define happiness_pond_z ((uint8*)(g_ram+0x15854)) +#define happiness_pond_timer ((uint8*)(g_ram+0x15860)) +#define happiness_pond_arr1 ((uint8*)(g_ram+0x1586C)) +#define happiness_pond_item_to_link ((uint8*)(g_ram+0x1587A)) +#define happiness_pond_y_subpixel ((uint8*)(g_ram+0x15886)) +#define happiness_pond_x_subpixel ((uint8*)(g_ram+0x15892)) +#define happiness_pond_z_subpixel ((uint8*)(g_ram+0x1589E)) +#define happiness_pond_step ((uint8*)(g_ram+0x158AA)) diff --git a/variables_skullwoodsfire.h b/variables_skullwoodsfire.h new file mode 100644 index 00000000..a2ce408c --- /dev/null +++ b/variables_skullwoodsfire.h @@ -0,0 +1,9 @@ +#define skullwoodsfire_var0 ((uint8*)(g_ram+0x10000)) +#define skullwoodsfire_var5 ((uint8*)(g_ram+0x10008)) +#define skullwoodsfire_var4 (*(uint8*)(g_ram+0x10010)) +#define skullwoodsfire_var9 (*(uint16*)(g_ram+0x10018)) +#define skullwoodsfire_var11 (*(uint16*)(g_ram+0x1001A)) +#define skullwoodsfire_y_arr ((uint16*)(g_ram+0x10020)) +#define skullwoodsfire_var10 (*(uint16*)(g_ram+0x10026)) +#define skullwoodsfire_x_arr ((uint16*)(g_ram+0x10030)) +#define skullwoodsfire_var12 (*(uint16*)(g_ram+0x10036)) diff --git a/variables_weathervane.h b/variables_weathervane.h new file mode 100644 index 00000000..5551c108 --- /dev/null +++ b/variables_weathervane.h @@ -0,0 +1,14 @@ +#define weathervane_arr3 ((uint8*)(g_ram+0x15800)) +#define weathervane_arr4 ((uint8*)(g_ram+0x1580C)) +#define weathervane_arr5 ((uint8*)(g_ram+0x15818)) +#define weathervane_arr6 ((uint8*)(g_ram+0x15824)) +#define weathervane_arr7 ((uint8*)(g_ram+0x15830)) +#define weathervane_arr8 ((uint8*)(g_ram+0x1583C)) +#define weathervane_arr9 ((uint8*)(g_ram+0x15848)) +#define weathervane_arr10 ((uint8*)(g_ram+0x15854)) +#define weathervane_arr11 ((uint8*)(g_ram+0x15860)) +#define weathervane_arr12 ((uint8*)(g_ram+0x1586C)) +#define weathervane_var13 (*(uint8*)(g_ram+0x15878)) +#define weathervane_var14 (*(uint8*)(g_ram+0x15879)) +#define weathervane_var2 (*(uint16*)(g_ram+0x158B6)) +#define weathervane_var1 (*(uint8*)(g_ram+0x158B8)) diff --git a/zelda3.vcxproj b/zelda3.vcxproj new file mode 100644 index 00000000..1a5e3bdf --- /dev/null +++ b/zelda3.vcxproj @@ -0,0 +1,238 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {CB07E01D-A194-481A-BEA1-DC13756AD150} + Win32Proj + 10.0 + zelda3 + + + + Application + true + v143 + + + Application + false + v143 + + + Application + true + v142 + + + Application + false + v142 + + + + + + + + + + + + + + + + + + + + + true + + + true + + + + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + Disabled + D:\Lib\SDL2-2.0.20\include + + + MachineX86 + true + Console + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);D:\Lib\SDL2-2.0.20\lib\x86\SDL2.lib;D:\Lib\SDL2-2.0.20\lib\x86\SDL2main.lib; + + + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + ProgramDatabase + D:\Lib\SDL2-2.0.20\include + + + MachineX86 + true + Console + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);D:\Lib\SDL2-2.0.20\lib\x86\SDL2.lib;D:\Lib\SDL2-2.0.20\lib\x86\SDL2main.lib; + + + + + D:\Lib\SDL2-2.0.20\include + Default + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);D:\Lib\SDL2-2.0.20\lib\x64\SDL2.lib;D:\Lib\SDL2-2.0.20\lib\x64\SDL2main.lib; + + + + + D:\Lib\SDL2-2.0.20\include + + + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);D:\Lib\SDL2-2.0.20\lib\x64\SDL2.lib;D:\Lib\SDL2-2.0.20\lib\x64\SDL2main.lib + + + + + + + + + + + Disabled + Disabled + + + + + + + + + + + + + Disabled + Disabled + + + Disabled + Disabled + + + Disabled + Disabled + + + Disabled + Disabled + + + Disabled + Disabled + + + Disabled + + + MaxSpeed + AnySuitable + + + Disabled + Disabled + + + Disabled + + + Disabled + Disabled + + + + + MaxSpeed + + + + + Disabled + Disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zelda3.vcxproj.filters b/zelda3.vcxproj.filters new file mode 100644 index 00000000..df859996 --- /dev/null +++ b/zelda3.vcxproj.filters @@ -0,0 +1,232 @@ + + + + + {d6299dde-0eca-4199-8851-ead8818843b7} + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Snes + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + Zelda + + + \ No newline at end of file diff --git a/zelda_cpu_infra.cpp b/zelda_cpu_infra.cpp new file mode 100644 index 00000000..ebddf030 --- /dev/null +++ b/zelda_cpu_infra.cpp @@ -0,0 +1,891 @@ +// This file handles running zelda through the emulated cpu. + +#include "zelda_cpu_infra.h" +#include "zelda_rtl.h" +#include "variables.h" +#include "misc.h" +#include "nmi.h" +#include "poly.h" +#include "attract.h" +#include "spc_player.h" + +#include "snes/snes.h" +#include "snes/cpu.h" +#include "snes/cart.h" +#include "tracing.h" + +#include + +Snes *g_snes; +Cpu *g_cpu; +uint8 g_emulated_ram[0x20000]; + + +void SaveLoadSlot(int cmd, int which); + +//uint8 *GetPtr(uint32 addr) { +// Cart *cart = g_snes->cart; +// return &cart->rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & (cart->romSize - 1)]; +//} + +//extern "C" uint8 *GetCartRamPtr(uint32 addr) { +// Cart *cart = g_snes->cart; +// return &cart->ram[addr]; +//} + +struct Snapshot { + uint16 a, x, y, sp, dp, pc; + uint8 k, db, flags; + uint8 ram[0x20000]; + uint16 vram[0x8000]; + uint16 sram[0x2000]; +}; + +static Snapshot g_snapshot_mine, g_snapshot_theirs, g_snapshot_before; + +static void MakeSnapshot(Snapshot *s) { + Cpu *c = g_cpu; + s->a = c->a, s->x = c->x, s->y = c->y; + s->sp = c->sp, s->dp = c->dp, s->db = c->db; + s->pc = c->pc, s->k = c->k; + s->flags = cpu_getFlags(c); + memcpy(s->ram, g_snes->ram, 0x20000); + memcpy(s->sram, g_snes->cart->ram, g_snes->cart->ramSize); + memcpy(s->vram, g_snes->ppu->vram, sizeof(uint16) * 0x8000); +} + +static void MakeMySnapshot(Snapshot *s) { + memcpy(s->ram, g_zenv.ram, 0x20000); + memcpy(s->sram, g_zenv.sram, 0x2000); + memcpy(s->vram, g_zenv.ppu->vram, sizeof(uint16) * 0x8000); +} + +static void RestoreMySnapshot(Snapshot *s) { + memcpy(g_zenv.ram, s->ram, 0x20000); + memcpy(g_zenv.sram, s->sram, 0x2000); + memcpy(g_zenv.ppu->vram, s->vram, sizeof(uint16) * 0x8000); +} + +static void RestoreSnapshot(Snapshot *s) { + Cpu *c = g_cpu; + + c->a = s->a, c->x = s->x, c->y = s->y; + c->sp = s->sp, c->dp = s->dp, c->db = s->db; + c->pc = s->pc, c->k = s->k; + cpu_setFlags(c, s->flags); + memcpy(g_snes->ram, s->ram, 0x20000); + memcpy(g_snes->cart->ram, s->sram, g_snes->cart->ramSize); + memcpy(g_snes->ppu->vram, s->vram, sizeof(uint16) * 0x8000); +} + +static bool g_fail; + +static void VerifySnapshotsEq(Snapshot *b, Snapshot *a, Snapshot *prev) { + memcpy(b->ram, a->ram, 16); + b->ram[0xfa1] = a->ram[0xfa1]; + b->ram[0x72] = a->ram[0x72]; + b->ram[0x73] = a->ram[0x73]; + b->ram[0x74] = a->ram[0x74]; + b->ram[0x75] = a->ram[0x75]; + b->ram[0xb7] = a->ram[0xb7]; + b->ram[0xb8] = a->ram[0xb8]; + b->ram[0xb9] = a->ram[0xb9]; + b->ram[0xba] = a->ram[0xba]; + b->ram[0xbb] = a->ram[0xbb]; + b->ram[0xbd] = a->ram[0xbd]; + b->ram[0xbe] = a->ram[0xbe]; + b->ram[0xc8] = a->ram[0xc8]; + b->ram[0xc9] = a->ram[0xc9]; + b->ram[0xca] = a->ram[0xca]; + b->ram[0xcb] = a->ram[0xcb]; + b->ram[0xcc] = a->ram[0xcc]; + b->ram[0xcd] = a->ram[0xcd]; + b->ram[0xa0] = a->ram[0xa0]; + b->ram[0x128] = a->ram[0x128]; // irq_flag + b->ram[0x463] = a->ram[0x463]; // which_staircase_index_padding + memcpy(&b->ram[0x1f0d], &a->ram[0x1f0d], 0x3f - 0xd); + memcpy(b->ram + 0x138, a->ram + 0x138, 256 - 0x38); // copy the stack over + + if (memcmp(b->ram, a->ram, 0x20000)) { + fprintf(stderr, "@%d: Memory compare failed (mine != theirs, prev):\n", frame_counter); + int j = 0; + for (size_t i = 0; i < 0x20000; i++) { + if (a->ram[i] != b->ram[i]) { + if (++j < 128) { + if ((i&1) == 0 && a->ram[i + 1] != b->ram[i + 1]) { + fprintf(stderr, "0x%.6X: %.4X != %.4X (%.4X)\n", (int)i, + WORD(b->ram[i]), WORD(a->ram[i]), WORD(prev->ram[i])); + i++, j++; + } else { + fprintf(stderr, "0x%.6X: %.2X != %.2X (%.2X)\n", (int)i, b->ram[i], a->ram[i], prev->ram[i]); + } + } + } + } + if (j) + g_fail = true; + fprintf(stderr, " total of %d failed bytes\n", (int)j); + } + + if (memcmp(b->sram, a->sram, 0x2000)) { + fprintf(stderr, "@%d: SRAM compare failed (mine != theirs, prev):\n", frame_counter); + int j = 0; + for (size_t i = 0; i < 0x2000; i++) { + if (a->sram[i] != b->sram[i]) { + if (++j < 128) { + if ((i&1) == 0 && a->sram[i + 1] != b->sram[i + 1]) { + fprintf(stderr, "0x%.6X: %.4X != %.4X (%.4X)\n", (int)i, + WORD(b->sram[i]), WORD(a->sram[i]), WORD(prev->sram[i])); + i++, j++; + } else { + fprintf(stderr, "0x%.6X: %.2X != %.2X (%.2X)\n", (int)i, b->sram[i], a->sram[i], prev->sram[i]); + } + } + } + } + if (j) + g_fail = true; + fprintf(stderr, " total of %d failed bytes\n", (int)j); + } + + if (memcmp(b->vram, a->vram, sizeof(uint16) * 0x8000)) { + fprintf(stderr, "@%d: VRAM compare failed (mine != theirs, prev):\n", frame_counter); + for (size_t i = 0, j = 0; i < 0x8000; i++) { + if (a->vram[i] != b->vram[i]) { + fprintf(stderr, "0x%.6X: %.4X != %.4X (%.4X)\n", (int)i, b->vram[i], a->vram[i], prev->vram[i]); + g_fail = true; + if (++j >= 16) + break; + } + } + } +} + +static uint8_t *RomByte(Cart *cart, uint32_t addr) { + return &cart->rom[(((addr >> 16) << 15) | (addr & 0x7fff)) & (cart->romSize - 1)]; +} + +void SetSnes(Snes *snes) { + g_snes = snes; + g_cpu = snes->cpu; +} + +bool g_calling_asm_from_c; + +void HookedFunctionRts(int is_long) { + if (g_calling_asm_from_c) { + g_calling_asm_from_c = false; + return; + } + assert(0); +} + +void RunEmulatedFunc(uint32 pc, uint16 a, uint16 x, uint16 y, bool mf, bool xf, int b, int whatflags) { + g_snes->debug_cycles = 1; + RunEmulatedFuncSilent(pc, a, x, y, mf, xf, b, whatflags | 2); + g_snes->debug_cycles = 0; +} + +void RunEmulatedFuncSilent(uint32 pc, uint16 a, uint16 x, uint16 y, bool mf, bool xf, int b, int whatflags) { + uint16 org_sp = g_cpu->sp; + uint16 org_pc = g_cpu->pc; + uint8 org_b = g_cpu->db; + uint8 org_dp = g_cpu->dp; + if (b != -1) + g_cpu->db = b >= 0 ? b : pc >> 16; + if (b == -3) + g_cpu->dp = 0x1f00; + + static uint8 *rambak; + if (rambak == 0) rambak = (uint8 *)malloc(0x20000); + memcpy(rambak, g_emulated_ram, 0x20000); + memcpy(g_emulated_ram, g_ram, 0x20000); + + if (whatflags & 2) + g_emulated_ram[0x1ffff] = 0x67; + + g_cpu->a = a; + g_cpu->x = x; + g_cpu->y = y; + g_cpu->spBreakpoint = g_cpu->sp; + g_cpu->k = (pc >> 16); + g_cpu->pc = (pc & 0xffff); + g_cpu->mf = mf; + g_cpu->xf = xf; + g_calling_asm_from_c = true; + while (g_calling_asm_from_c) { + if (g_snes->debug_cycles) { + char line[80]; + getProcessorStateCpu(g_snes, line); + puts(line); + } + cpu_runOpcode(g_cpu); + while (g_snes->dma->dmaBusy) + dma_doDma(g_snes->dma); + + if (whatflags & 1) { +/* if (apu_debugging == 2 && g_snes->apu->cpuCyclesLeft == 0) { + char line[80]; + getProcessorStateSpc(g_snes->apu, line); + puts(line); + }*/ +// apu_cycle(g_snes->apu); + } + } + g_cpu->dp = org_dp; + g_cpu->sp = org_sp; + g_cpu->db = org_b; + g_cpu->pc = org_pc; + + memcpy(g_ram, g_emulated_ram, 0x20000); + memcpy(g_emulated_ram, rambak, 0x20000); +} + +void RunOrigAsmCodeOneLoop(Snes *snes) { + // Run until the wait loop in Interrupt_Reset, + // Or the polyhedral main function. + for(int loops = 0;;loops++) { + snes_printCpuLine(snes); + cpu_runOpcode(snes->cpu); + while (snes->dma->dmaBusy) + dma_doDma(snes->dma); + + uint32_t pc = snes->cpu->k << 16 | snes->cpu->pc; + if (pc == 0x8034 || pc == 0x9f81d && loops >= 10) + break; + } +} + +void RunEmulatedSnesFrame(Snes *snes) { + // First call runs until init + if (snes->cpu->pc == 0x8000 && snes->cpu->k == 0) { + RunOrigAsmCodeOneLoop(snes); + g_emulated_ram[0x12] = 1; + + // Fixup uninitialized variable + *(uint16*)(g_emulated_ram+0xAE0) = 0xb280; + *(uint16*)(g_emulated_ram+0xAE2) = 0xb280 + 0x60; + } + RunOrigAsmCodeOneLoop(snes); + + snes_doAutoJoypad(snes); + + // animated_tile_vram_addr uninited + if (snes->ram[0xadd] == 0) + *(uint16_t*)&snes->ram[0xadc] = 0xa680; + + // In one code path flag_update_hud_in_nmi uses an undefined value + snes_write(snes, DMAP0, 0x01); + snes_write(snes, BBAD0, 0x18); + snes->cpu->nmiWanted = true; + for (;;) { + snes_printCpuLine(snes); + cpu_runOpcode(snes->cpu); + while (snes->dma->dmaBusy) + dma_doDma(snes->dma); + + uint32_t pc = snes->cpu->k << 16 | snes->cpu->pc; + if (pc == 0x8039 || pc == 0x9f81d) + break; + } +} + +struct Ppu *GetPpuForRendering() { + return g_zenv.ppu; +} + +Dsp *GetDspForRendering() { + SpcPlayer_GenerateSamples(g_zenv.player); + return g_zenv.player->dsp; +} + + +void saveFunc(void *ctx, void *data, size_t data_size) { + std::vector *vec = (std::vector *)ctx; + vec->resize(vec->size() + data_size); + memcpy(vec->data() + vec->size() - data_size, data, data_size); +} + +struct LoadFuncState { + uint8 *p, *pend; +}; + +void loadFunc(void *ctx, void *data, size_t data_size) { + LoadFuncState *st = (LoadFuncState *)ctx; + assert(st->pend - st->p >= data_size); + memcpy(data, st->p, data_size); + st->p += data_size; +} + + +void CopyStateAfterSnapshotRestore(bool is_reset) { + memcpy(g_zenv.ram, g_snes->ram, 0x20000); + memcpy(g_zenv.sram, g_snes->cart->ram, g_snes->cart->ramSize); + memcpy(g_zenv.ppu->vram, &g_snes->ppu->vram, offsetof(Ppu, pixelBuffer) - offsetof(Ppu, vram)); + memcpy(g_zenv.player->ram, g_snes->apu->ram, sizeof(g_snes->apu->ram)); + + if (!is_reset) { + memcpy(g_zenv.player->dsp->ram, g_snes->apu->dsp->ram, sizeof(Dsp) - offsetof(Dsp, ram)); + SpcPlayer_CopyVariablesFromRam(g_zenv.player); + } + + memcpy(g_zenv.dma->channel, g_snes->dma->channel, sizeof(Dma) - offsetof(Dma, channel)); + + g_zenv.player->timer_cycles = 0; + + if (!is_reset) { + // Setup some fake cpu state cause we can't depend on the savegame's + Cpu *cpu = g_snes->cpu; + cpu->a = cpu->x = cpu->y = 0; + cpu->pc = 0x8034; + cpu->sp = 0x1ff; + cpu->k = cpu->dp = cpu->db = 0; + cpu_setFlags(cpu, 0x30); + cpu->irqWanted = cpu->nmiWanted = cpu->waiting = cpu->stopped = 0; + cpu->e = false; + + if (thread_other_stack == 0x1f2) { + cpu->sp = 0x1f3e; + cpu->pc = 0xf81d; + cpu->db = cpu->k = 9; + cpu->dp = 0x1f00; + static const uint8 kStackInit[] = { 0x82, 0, 0, 0, 0, 0, 0, 0, 0x40, 0xb7, 0xb0, 0x34, 0x80, 0 }; + memcpy(g_snes->ram + 0x1f2, kStackInit, sizeof(kStackInit)); + } + } +} + +std::vector SaveSnesState() { + std::vector data; + + MakeSnapshot(&g_snapshot_before); + + // Copy from my state into the emulator + memcpy(&g_snes->ppu->vram, g_zenv.ppu->vram, offsetof(Ppu, pixelBuffer) - offsetof(Ppu, vram)); + memcpy(g_snes->ram, g_zenv.ram, 0x20000); + memcpy(g_snes->cart->ram, g_zenv.sram, 0x2000); + SpcPlayer_CopyVariablesToRam(g_zenv.player); + memcpy(g_snes->apu->ram, g_zenv.player->ram, 0x10000); + memcpy(g_snes->apu->dsp->ram, g_zenv.player->dsp->ram, sizeof(Dsp) - offsetof(Dsp, ram)); + memcpy(g_snes->dma->channel, g_zenv.dma->channel, sizeof(Dma) - offsetof(Dma, channel)); + + snes_saveload(g_snes, &saveFunc, &data); + + + RestoreSnapshot(&g_snapshot_before); + return data; +} + + +class StateRecorder { +public: + StateRecorder() : last_inputs_(0), frames_since_last_(0), total_frames_(0), replay_mode_(false) {} + void Record(uint16 inputs); + void RecordPatchByte(uint32 addr, const uint8 *value, int num); + + void Load(FILE *f, bool replay_mode); + void Save(FILE *f); + + uint16 ReadNextReplayState(); + bool is_replay_mode() { return replay_mode_; } + + void MigrateToBaseSnapshot(); +private: + + void RecordJoypadBit(int command); + void AppendByte(uint8 v); + void AppendVl(uint32 v); + + uint16 last_inputs_; + uint32 frames_since_last_; + uint32 total_frames_; + + // For replay + uint32 replay_pos_, replay_frame_counter_, replay_next_cmd_at_; + uint8 replay_cmd_; + bool replay_mode_; + + std::vector log_; + std::vector base_snapshot_; +}; + +uint32 RamChecksum() { + uint64_t cksum = 0, cksum2 = 0; + for (int i = 0; i < 0x20000; i += 4) { + cksum += *(uint32 *)&g_ram[i]; + cksum2 += cksum; + } + return cksum ^ (cksum >> 32) ^ cksum2 ^ (cksum2 >> 32); +} + +void StateRecorder::AppendByte(uint8 v) { + log_.push_back(v); + printf("%.2x ", v); +} + +void StateRecorder::AppendVl(uint32 v) { + for (; v >= 255; v -= 255) + AppendByte(255); + AppendByte(v); +} + +void StateRecorder::RecordJoypadBit(int command) { + int frames = frames_since_last_; + AppendByte(command << 4 | (frames < 15 ? frames : 15)); + if (frames >= 15) + AppendVl(frames - 15); + frames_since_last_ = 0; +} + +void StateRecorder::Record(uint16 inputs) { + uint16 diff = inputs ^ last_inputs_; + if (diff != 0) { + last_inputs_ = inputs; + printf("0x%.4x %d: ", diff, frames_since_last_); + for (int i = 0; i < 12; i++) { + if ((diff >> i) & 1) + RecordJoypadBit(i); + } + printf("\n"); + } + frames_since_last_++; + total_frames_++; +} + +void StateRecorder::RecordPatchByte(uint32 addr, const uint8 *value, int num) { + assert(addr < 0x20000); + printf("%d: PatchByte(0x%x, 0x%x. %d): ", frames_since_last_, addr, *value, num); + + int frames = frames_since_last_; + + int lq = (num - 1) <= 3 ? (num - 1) : 3; + + AppendByte(0xc0 | (frames != 0 ? 1 : 0) | (addr & 0x10000 ? 2 : 0) | lq << 2); + if (frames != 0) + AppendVl(frames - 1); + if (lq == 3) + AppendVl(num - 1 - 3); + + frames_since_last_ = 0; + AppendByte(addr >> 8); + AppendByte(addr); + for(int i = 0; i < num; i++) + AppendByte(value[i]); + printf("\n"); +} + +void StateRecorder::Load(FILE *f, bool replay_mode) { + uint32 hdr[8] = { 0 }; + fread(hdr, 8, 4, f); + + assert(hdr[0] == 1); + + total_frames_ = hdr[1]; + log_.resize(hdr[2]); + fread(log_.data(), 1, hdr[2], f); + last_inputs_ = hdr[3]; + frames_since_last_ = hdr[4]; + + base_snapshot_.resize((hdr[5] & 1) ? hdr[6] : 0); + fread(base_snapshot_.data(), 1, base_snapshot_.size(), f); + + bool is_reset = false; + replay_mode_ = replay_mode; + if (replay_mode) { + replay_next_cmd_at_ = frames_since_last_ = 0; + last_inputs_ = 0; + replay_pos_ = 0; + replay_frame_counter_ = 0; + replay_cmd_ = 0xff; + // Load snapshot from |base_snapshot_|, or reset if empty. + + if (base_snapshot_.size()) { + LoadFuncState state = { base_snapshot_.data(), base_snapshot_.data() + base_snapshot_.size() }; + snes_saveload(g_snes, &loadFunc, &state); + assert(state.p == state.pend); + } else { + snes_reset(g_snes, true); + SpcPlayer_Initialize(g_zenv.player); + is_reset = true; + } + } else { + std::vector data; + data.resize(hdr[6]); + fread(data.data(), 1, data.size(), f); + + LoadFuncState state = { data.data(), data.data() + data.size() }; + snes_saveload(g_snes, &loadFunc, &state); + assert(state.p == state.pend); + } + CopyStateAfterSnapshotRestore(is_reset); +} + +void StateRecorder::Save(FILE *f) { + uint32 hdr[8] = { 0 }; + + std::vector data = SaveSnesState(); + assert(base_snapshot_.size() == 0 || base_snapshot_.size() == data.size()); + + hdr[0] = 1; + hdr[1] = total_frames_; + hdr[2] = log_.size(); + hdr[3] = last_inputs_; + hdr[4] = frames_since_last_; + hdr[5] = (base_snapshot_.size() ? 1 : 0); + hdr[6] = data.size(); + + fwrite(hdr, 8, 4, f); + fwrite(log_.data(), 1, log_.size(), f); + fwrite(base_snapshot_.data(), 1, base_snapshot_.size(), f); + fwrite(data.data(), 1, data.size(), f); +} + +void StateRecorder::MigrateToBaseSnapshot() { + printf("Migrating to base snapshot!\n"); + std::vector data = SaveSnesState(); + base_snapshot_ = std::move(data); + + replay_mode_ = false; + frames_since_last_ = 0; + last_inputs_ = 0; + total_frames_ = 0; + log_.clear(); +} + +uint16 StateRecorder::ReadNextReplayState() { + assert(replay_mode_); + while (frames_since_last_ >= replay_next_cmd_at_) { + frames_since_last_ = 0; + // Apply next command + if (replay_cmd_ != 0xff) { + if (replay_cmd_ < 0xc0) { + last_inputs_ ^= 1 << (replay_cmd_ >> 4); + } else if (replay_cmd_ < 0xd0) { + int nb = 1 + ((replay_cmd_ >> 2) & 3); + uint8 t; + if (nb == 4) do { + nb += t = log_[replay_pos_++]; + } while (t == 255); + uint32 addr = ((replay_cmd_ >> 1) & 1) << 16; + addr |= log_[replay_pos_++] << 8; + addr |= log_[replay_pos_++]; + do { + g_emulated_ram[addr & 0x1ffff] = g_ram[addr & 0x1ffff] = log_[replay_pos_++]; + } while (addr++, --nb); + } else { + assert(0); + } + } + if (replay_pos_ >= log_.size()) { + replay_cmd_ = 0xff; + replay_next_cmd_at_ = 0xffffffff; + break; + } + // Read the next one + uint8 cmd = log_[replay_pos_++], t; + int mask = (cmd < 0xc0) ? 0xf : 0x1; + int frames = cmd & mask; + if (frames == mask) do { + frames += t = log_[replay_pos_++]; + } while (t == 255); + replay_next_cmd_at_ = frames; + replay_cmd_ = cmd; + } + frames_since_last_++; + // Turn off replay mode after we reached the final frame position + if (++replay_frame_counter_ >= total_frames_) { + replay_mode_ = false; + } + return last_inputs_; +} + +StateRecorder input_recorder; +static int frame_ctr; + +bool RunOneFrame(Snes *snes, int input_state, bool turbo) { + frame_ctr++; + + if (kIsOrigEmu) { + snes_runFrame(snes); + return false; + } + + // Either copy state or apply state + if (input_recorder.is_replay_mode()) { + input_state = input_recorder.ReadNextReplayState(); + } else { + input_recorder.Record(input_state); + turbo = false; + + // This is whether APUI00 is true or false, this is used by the ancilla code. + uint8 apui00 = g_zenv.player->port_to_snes[0] != 0; + if (apui00 != g_ram[0x648]) { + g_emulated_ram[0x648] = g_ram[0x648] = apui00; + input_recorder.RecordPatchByte(0x648, &apui00, 1); + } + } + + if (snes == NULL) { + ZeldaRunFrame(input_state); + return turbo; + } + + MakeSnapshot(&g_snapshot_before); + MakeMySnapshot(&g_snapshot_mine); + MakeSnapshot(&g_snapshot_theirs); + + // Compare both snapshots + VerifySnapshotsEq(&g_snapshot_mine, &g_snapshot_theirs, &g_snapshot_before); + if (g_fail) { + printf("early fail\n"); + return turbo; + } + +again: + // Run orig version then snapshot + snes->input1->currentState = input_state; + RunEmulatedSnesFrame(snes); + MakeSnapshot(&g_snapshot_theirs); + + // Run my version and snapshot +again_mine: + ZeldaRunFrame(input_state); + + MakeMySnapshot(&g_snapshot_mine); + + // Compare both snapshots + VerifySnapshotsEq(&g_snapshot_mine, &g_snapshot_theirs, &g_snapshot_before); + + if (g_fail) { + g_fail = false; + RestoreMySnapshot(&g_snapshot_before); + // RestoreSnapshot(&g_snapshot_before); + //SaveLoadSlot(kSaveLoad_Save, 0); + goto again_mine; + } + + return turbo; +} + +void PatchRomBP(uint8_t *rom, uint32_t addr) { + rom[(addr >> 16) << 15 | (addr & 0x7fff)] = 0; +} + +void PatchRom(uint8_t *rom) { + // fix a bug with unitialized memory + { + uint8_t *p = rom + 0x36434; + memmove(p, p + 2, 7); + p[7] = 0xb0; + p[8] = 0x40 - 7; + } + + // BufferAndBuildMap16Stripes_Y can read bad memory if int is negative + if (1) { + uint8_t *p = rom + 0x10000 - 0x8000; + int thunk = 0xFF6E; + uint8_t *tp = p + thunk; + + *tp++ = 0xc0; *tp++ = 0x00; *tp++ = 0x20; + *tp++ = 0x90; *tp++ = 0x03; + *tp++ = 0xa9; *tp++ = 0x00; *tp++ = 0x00; + *tp++ = 0x9d; *tp++ = 0x00; *tp++ = 0x05; + *tp++ = 0x60; + + p[0xf4a7] = 0x20; p[0xf4a8] = thunk; p[0xf4a9] = thunk >> 8; + p[0xf4b5] = 0x20; p[0xf4b6] = thunk; p[0xf4b7] = thunk >> 8; + + p[0xf3dd] = 0x20; p[0xf3de] = thunk; p[0xf3df] = thunk >> 8; + p[0xf3ef] = 0x20; p[0xf3f0] = thunk; p[0xf3f1] = thunk >> 8; + } + + // Better random numbers + if (1) { + // 8D:FFC1 new_random_gen: + int new_routine = 0xffc1; + uint8_t *p = rom + 0x60000, *tp = p + new_routine; + + *tp++ = 0xad; *tp++ = 0xa1; *tp++ = 0x0f; // mov.b A, byte_7E0FA1 + *tp++ = 0x18; *tp++ = 0x65; *tp++ = 0x1a; // add.b A, frame_counter + *tp++ = 0x4a; // lsr A + *tp++ = 0xb0; *tp++ = 0x02; // jnb loc_8DFFCC + *tp++ = 0x49; *tp++ = 0xb8; // eor.b A, #0xB8 + *tp++ = 0x8d; *tp++ = 0xa1; *tp++ = 0x0f; // byte_7E0FA1, A + *tp++ = 0x18; // clc + *tp++ = 0x6b; // retf + + p[0xBA71] = 0x4c; p[0xBA72] = new_routine; p[0xBA73] = new_routine >> 8; + } + + { + + } + + // Fix so SmashRockPile_fromLift / Overworld_DoMapUpdate32x32_B preserves R2/R0 destroyed + { + /* + .9B:BFA2 A5 00 mov.w A, R0 + .9B:BFA4 48 push A + .9B:BFA5 A5 02 mov.w A, R2 + .9B:BFA7 48 push A + .9B:C0F1 22 5C AD 02 callf Overworld_DoMapUpdate32x32_B + .9B:C048 68 pop A + .9B:C049 85 00 mov.w R0, A + .9B:C04B 68 pop A + .9B:C04C 85 02 mov.w R2, A + + */ + uint8_t *tp = rom + 0x6ffd8; + *tp++ = 0xa5; *tp++ = 0x00; *tp++ = 0x48; + *tp++ = 0xa5; *tp++ = 0x02; *tp++ = 0x48; + *tp++ = 0x22; *tp++ = 0x5c; *tp++ = 0xad; *tp++ = 0x02; + *tp++ = 0xc2; *tp++ = 0x30; + *tp++ = 0x68; *tp++ = 0x85; *tp++ = 0x02; + *tp++ = 0x68; *tp++ = 0x85; *tp++ = 0x00; + *tp++ = 0x6b; + + int target = 0xDFFD8; // DoorAnim_DoWork2_Preserving + + rom[0xdc0f2] = target; + rom[0xdc0f3] = target >> 8; + rom[0xdc0f4] = target >> 16; + + } + + rom[0x2dec7] = 0; // Fix Uncle_Embark reading bad ram + + rom[0x4be5e] = 0; // Overlord05_FallingStalfos doesn't initialize the sprite_D memory location + + rom[0xD79A4] = 0; // 0x1AF9A4: // Lanmola_SpawnShrapnel uses undefined carry value + + rom[0xF0A46] = 0; // 0x1E8A46 Helmasaur Carry Junk + rom[0xF0A52] = 0; // 0x1E8A52 Helmasaur Carry Junk + + rom[0xef9b9] = 0xb9; // TalkingTree_SpitBomb + + rom[0xdf107] = 0xa2; + rom[0xdf108] = 0x03; + rom[0xdf109] = 0x6b; // Palette_AgahnimClone destoys X + + + rom[0x4a966] = 0; // Follower_AnimateMovement_preserved + + PatchRomBP(rom, 0x1de0e5); + PatchRomBP(rom, 0x6d0b6); + PatchRomBP(rom, 0x6d0c6); + + PatchRomBP(rom, 0x1d8f29); // adc instead of add + + PatchRomBP(rom, 0x06ED0B); + + PatchRomBP(rom, 0x1dc812); // adc instead of add + + PatchRomBP(rom, 0x9b46c); // adc instead of add + PatchRomBP(rom, 0x9b478); // adc instead of add + + PatchRomBP(rom, 0x9B468); // sbc + PatchRomBP(rom, 0x9B46A); + PatchRomBP(rom, 0x9B474); + PatchRomBP(rom, 0x9B476); + PatchRomBP(rom, 0x9B60C); + + PatchRomBP(rom, 0x8f708); // don't init scratch_c + + PatchRomBP(rom, 0x1DCDEB); // y is destroyed earlier, restore it.. + + // Smithy_Frog doesn't save X + memmove(rom + 0x332b8, rom + 0x332b7, 4); rom[0x332b7] = 0xfa; + + // This needs to be here because the ancilla code reads + // from the apu and we don't want to make the core code + // dependent on the apu timings, so relocated this value + // to 0x648. + rom[0x443fe] = 0x48; rom[0x443ff] = 0x6; + rom[0x44607] = 0x48; rom[0x44608] = 0x6; + + // AncillaAdd_AddAncilla_Bank09 destroys R14 + rom[0x49d0c] = 0xda; rom[0x49d0d] = 0xfa; + rom[0x49d0f] = 0xda; rom[0x49d10] = 0xfa; + +} + + +static const char *const kReferenceSaves[] = { + "Chapter 1 - Zelda's Rescue.sav", + "Chapter 2 - After Eastern Palace.sav", + "Chapter 3 - After Desert Palace.sav", + "Chapter 4 - After Tower of Hera.sav", + "Chapter 5 - After Hyrule Castle Tower.sav", + "Chapter 6 - After Dark Palace.sav", + "Chapter 7 - After Swamp Palace.sav", + "Chapter 8 - After Skull Woods.sav", + "Chapter 9 - After Gargoyle's Domain.sav", + "Chapter 10 - After Ice Palace.sav", + "Chapter 11 - After Misery Mire.sav", + "Chapter 12 - After Turtle Rock.sav", + "Chapter 13 - After Ganon's Tower.sav", +}; + +void SaveLoadSlot(int cmd, int which) { + char name[128]; + if (which & 256) { + if (cmd == kSaveLoad_Save) + return; + sprintf(name, "saves/ref/%s", kReferenceSaves[which - 256]); + } else { + sprintf(name, "saves/save%d.sav", which); + } + FILE *f = fopen(name, cmd != kSaveLoad_Save ? "rb" : "wb"); + if (f) { + printf("*** %s slot %d\n", + cmd==kSaveLoad_Save ? "Saving" : cmd==kSaveLoad_Load ? "Loading" : "Replaying", which); + + if (cmd != kSaveLoad_Save) + input_recorder.Load(f, cmd == kSaveLoad_Replay); + else + input_recorder.Save(f); + + fclose(f); + } +} + +class PatchRamByteBatch { +public: + PatchRamByteBatch() : count_(0), addr_(0) {} + ~PatchRamByteBatch(); + void Patch(uint32 addr, uint8 value); + +private: + uint32 count_, addr_; + uint8 vals_[256]; +}; + +PatchRamByteBatch::~PatchRamByteBatch() { + if (count_) + input_recorder.RecordPatchByte(addr_, vals_, count_); +} + +void PatchRamByteBatch::Patch(uint32 addr, uint8 value) { + if (count_ >= 256 || addr != addr_ + count_) { + if (count_) + input_recorder.RecordPatchByte(addr_, vals_, count_); + addr_ = addr; + count_ = 0; + } + vals_[count_++] = value; + + g_emulated_ram[addr] = g_ram[addr] = value; +} + +void PatchCommand(char c) { + PatchRamByteBatch b; + if (c == 'w') { + b.Patch(0xf372, 80); // health filler + b.Patch(0xf373, 80); // magic filler +// b.Patch(0x1FE01, 25); + } else if (c == 'k') { + input_recorder.MigrateToBaseSnapshot(); + } else if (c == 'o') { + b.Patch(0xf36f, 1); + } +} diff --git a/zelda_cpu_infra.h b/zelda_cpu_infra.h new file mode 100644 index 00000000..adbe81a1 --- /dev/null +++ b/zelda_cpu_infra.h @@ -0,0 +1,7 @@ +#pragma once +#include "types.h" + +uint8 *GetPtr(uint32 addr); + +void RunEmulatedFuncSilent(uint32 pc, uint16 a, uint16 x, uint16 y, bool mf, bool xf, int b = -1, int whatflags = 0); +void RunEmulatedFunc(uint32 pc, uint16 a, uint16 x, uint16 y, bool mf, bool xf, int b = -1, int whatflags = 0); diff --git a/zelda_rtl.cpp b/zelda_rtl.cpp new file mode 100644 index 00000000..d41684f8 --- /dev/null +++ b/zelda_rtl.cpp @@ -0,0 +1,282 @@ +#include "zelda_rtl.h" +#include "variables.h" +#include "misc.h" +#include "nmi.h" +#include "poly.h" +#include "attract.h" +#include "spc_player.h" +#include "snes/ppu.h" + +ZeldaEnv g_zenv; +// These point to the rewritten instance of the emu. +uint8 g_ram[131072]; +struct SimpleHdma { + const uint8 *table; + const uint8 *indir_ptr; + uint8 rep_count; + uint8 mode; + uint8 ppu_addr; + uint8 indir_bank; +}; +void SimpleHdma_Init(SimpleHdma *c, DmaChannel *dc); +void SimpleHdma_DoLine(SimpleHdma *c); + +static const uint8 bAdrOffsets[8][4] = { + {0, 0, 0, 0}, + {0, 1, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 1, 1}, + {0, 1, 2, 3}, + {0, 1, 0, 1}, + {0, 0, 0, 0}, + {0, 0, 1, 1} +}; +static const uint8 transferLength[8] = { + 1, 2, 2, 4, 4, 4, 2, 4 +}; +#define AT_WORD(x) (uint8)(x), (x)>>8 +// direct +static const uint8 kAttractDmaTable0[13] = {0x20, AT_WORD(0x00ff), 0x50, AT_WORD(0xe018), 0x50, AT_WORD(0xe018), 1, AT_WORD(0x00ff), 0}; +static const uint8 kAttractDmaTable1[10] = {0x48, AT_WORD(0x00ff), 0x30, AT_WORD(0xd830), 1, AT_WORD(0x00ff), 0}; +static const uint8 kHdmaTableForEnding[19] = { + 0x52, AT_WORD(0x600), 8, AT_WORD(0xe2), 8, AT_WORD(0x602), 5, AT_WORD(0x604), 0x10, AT_WORD(0x606), 0x81, AT_WORD(0xe2), 0, +}; +static const uint8 kSpotlightIndirectHdma[7] = {0xf8, AT_WORD(0x1b00), 0xf8, AT_WORD(0x1bf0), 0}; +static const uint8 kMapModeHdma0[7] = {0xf0, AT_WORD(0xdd27), 0xf0, AT_WORD(0xde07), 0}; +static const uint8 kMapModeHdma1[7] = {0xf0, AT_WORD(0xdee7), 0xf0, AT_WORD(0xdfc7), 0}; +static const uint8 kAttractIndirectHdmaTab[7] = {0xf0, AT_WORD(0x1b00), 0xf0, AT_WORD(0x1be0), 0}; +static const uint8 kHdmaTableForPrayingScene[7] = {0xf8, AT_WORD(0x1b00), 0xf8, AT_WORD(0x1bf0), 0}; +void zelda_apu_write(uint32_t adr, uint8_t val) { + assert(adr >= APUI00 && adr <= APUI03); + g_zenv.player->input_ports[adr & 0x3] = val; +} + +void zelda_apu_write_word(uint32_t adr, uint16_t val) { + zelda_apu_write(adr, val); + zelda_apu_write(adr + 1, val >> 8); +} + +uint8_t zelda_read_apui00() { + // This needs to be here because the ancilla code reads + // from the apu and we don't want to make the core code + // dependent on the apu timings, so relocated this value + // to 0x648. + return g_ram[0x648]; +} + +uint8_t zelda_apu_read(uint32_t adr) { + return g_zenv.player->port_to_snes[adr & 0x3]; +} + +uint16_t zelda_apu_read_word(uint32_t adr) { + uint16_t rv = zelda_apu_read(adr); + rv |= zelda_apu_read(adr + 1) << 8; + return rv; +} + +void zelda_ppu_write(uint32_t adr, uint8_t val) { + assert(adr >= INIDISP && adr <= STAT78); + ppu_write(g_zenv.ppu, (uint8)adr, val); +} + +void zelda_ppu_write_word(uint32_t adr, uint16_t val) { + zelda_ppu_write(adr, val); + zelda_ppu_write(adr + 1, val >> 8); +} + +void zelda_apu_runcycles() { +// apu_cycle(g_zenv.apu); +} + +const uint8 *SimpleHdma_GetPtr(uint32 p) { + switch (p) { + + case 0xCFA87: return kAttractDmaTable0; + case 0xCFA94: return kAttractDmaTable1; + case 0xebd53: return kHdmaTableForEnding; + case 0x0F2FB: return kSpotlightIndirectHdma; + case 0xabdcf: return kMapModeHdma0; + case 0xabdd6: return kMapModeHdma1; + case 0xABDDD: return kAttractIndirectHdmaTab; + case 0x2c80c: return kHdmaTableForPrayingScene; + + case 0x1b00: return (uint8 *)mode7_hdma_table; + case 0x1be0: return (uint8 *)mode7_hdma_table + 0xe0; + case 0x1bf0: return (uint8 *)mode7_hdma_table + 0xf0; + case 0xadd27: return (uint8*)kMapMode_Zooms1; + case 0xade07: return (uint8*)kMapMode_Zooms1 + 0xe0; + case 0xadee7: return (uint8*)kMapMode_Zooms2; + case 0xadfc7: return (uint8*)kMapMode_Zooms2 + 0xe0; + case 0x600: return &g_ram[0x600]; + case 0x602: return &g_ram[0x602]; + case 0x604: return &g_ram[0x604]; + case 0x606: return &g_ram[0x606]; + case 0xe2: return &g_ram[0xe2]; + default: + assert(0); + return NULL; + } +} + +void SimpleHdma_Init(SimpleHdma *c, DmaChannel *dc) { + if (!dc->hdmaActive) { + c->table = 0; + return; + } + c->table = SimpleHdma_GetPtr(dc->aAdr | dc->aBank << 16); + c->rep_count = 0; + c->mode = dc->mode | dc->indirect << 6; + c->ppu_addr = dc->bAdr; + c->indir_bank = dc->indBank; +} + +void SimpleHdma_DoLine(SimpleHdma *c) { + if (c->table == NULL) + return; + bool do_transfer = false; + if ((c->rep_count & 0x7f) == 0) { + c->rep_count = *c->table++; + if (c->rep_count == 0) { + c->table = NULL; + return; + } + if(c->mode & 0x40) { + c->indir_ptr = SimpleHdma_GetPtr(c->indir_bank << 16 | c->table[0] | c->table[1] * 256); + c->table += 2; + } + do_transfer = true; + } + if(do_transfer || c->rep_count & 0x80) { + for(int j = 0, j_end = transferLength[c->mode & 7]; j < j_end; j++) { + uint8 v = c->mode & 0x40 ? *c->indir_ptr++ : *c->table++; + zelda_ppu_write(0x2100 + c->ppu_addr + bAdrOffsets[c->mode & 7][j], v); + } + } + c->rep_count--; +} + +void ZeldaDrawPpuFrame() { + SimpleHdma hdma_chans[2]; + + dma_startDma(g_zenv.dma, HDMAEN_copy, true); + + SimpleHdma_Init(&hdma_chans[0], &g_zenv.dma->channel[6]); + SimpleHdma_Init(&hdma_chans[1], &g_zenv.dma->channel[7]); + + for (int i = 0; i < 225; i++) { + if (i == 128 && irq_flag) { + zelda_ppu_write(BG3HOFS, selectfile_var8); + zelda_ppu_write(BG3HOFS, selectfile_var8 >> 8); + zelda_ppu_write(BG3VOFS, 0); + zelda_ppu_write(BG3VOFS, 0); + if (irq_flag & 0x80) { + irq_flag = 0; + zelda_snes_dummy_write(NMITIMEN, 0x81); + } + } + ppu_runLine(g_zenv.ppu, i); + SimpleHdma_DoLine(&hdma_chans[0]); + SimpleHdma_DoLine(&hdma_chans[1]); + } +} + +void HdmaSetup(uint32 addr6, uint32 addr7, uint8 transfer_unit, uint8 reg6, uint8 reg7, uint8 indirect_bank) { + struct Dma *dma = g_zenv.dma; + if (addr6) { + dma_write(dma, DMAP6, transfer_unit); + dma_write(dma, BBAD6, reg6); + dma_write(dma, A1T6L, addr6); + dma_write(dma, A1T6H, addr6 >> 8); + dma_write(dma, A1B6, addr6 >> 16); + dma_write(dma, DAS60, indirect_bank); + } + dma_write(dma, DMAP7, transfer_unit); + dma_write(dma, BBAD7, reg7); + dma_write(dma, A1T7L, addr7); + dma_write(dma, A1T7H, addr7 >> 8); + dma_write(dma, A1B7, addr7 >> 16); + dma_write(dma, DAS70, indirect_bank); +} + +void ZeldaInitializationCode() { + zelda_snes_dummy_write(NMITIMEN, 0); + zelda_snes_dummy_write(HDMAEN, 0); + zelda_snes_dummy_write(MDMAEN, 0); + zelda_apu_write(APUI00, 0); + zelda_apu_write(APUI01, 0); + zelda_apu_write(APUI02, 0); + zelda_apu_write(APUI03, 0); + zelda_ppu_write(INIDISP, 0x80); + + Sound_LoadIntroSongBank(); + Startup_InitializeMemory(); + + animated_tile_data_src = 0xa680; + dma_source_addr_9 = 0xb280; + dma_source_addr_14 = 0xb280 + 0x60; + zelda_snes_dummy_write(NMITIMEN, 0x81); +} + +void ZeldaRunGameLoop() { + frame_counter++; + ClearOamBuffer(); + Module_MainRouting(); + NMI_PrepareSprites(); + nmi_boolean = 0; +} + +void ZeldaInitialize() { + g_zenv.dma = dma_init(NULL); + g_zenv.ppu = ppu_init(NULL); + g_zenv.ram = g_ram; + g_zenv.sram = (uint8*)calloc(8192, 1); + g_zenv.vram = g_zenv.ppu->vram; + g_zenv.player = SpcPlayer_Create(); + SpcPlayer_Initialize(g_zenv.player); + dma_reset(g_zenv.dma); + ppu_reset(g_zenv.ppu); +} + +void ZeldaRunFrame(uint16 input) { + if (animated_tile_data_src == 0) + ZeldaInitializationCode(); + + // When poly is active, the main game loop is not run. They alternate. + if (is_nmi_thread_active && thread_other_stack != 0x1f31) { + if (intro_did_run_step && !nmi_flag_update_polyhedral) { + Poly_RunFrame(); + intro_did_run_step = 0; + nmi_flag_update_polyhedral = 0xff; + } + } else { + ZeldaRunGameLoop(); + } + + Interrupt_NMI(input); +} + +void ClearOamBuffer() { // 80841e + for (int i = 0; i < 128; i++) + oam_buf[i].y = 0xf0; +} + +void Startup_InitializeMemory() { // 8087c0 + memset(g_ram + 0x0, 0, 0x2000); + main_palette_buffer[0] = 0; + srm_var1 = 0; + uint8 *sram = g_zenv.sram; + if (WORD(sram[0x3e5]) != 0x55aa) + WORD(sram[0x3e5]) = 0; + if (WORD(sram[0x8e5]) != 0x55aa) + WORD(sram[0x8e5]) = 0; + if (WORD(sram[0xde5]) != 0x55aa) + WORD(sram[0xde5]) = 0; + zelda_ppu_write(TMW, 0); + INIDISP_copy = 0x80; + flag_update_cgram_in_nmi++; +} + +void LoadSongBank(const uint8 *p) { // 808888 + SpcPlayer_Upload(g_zenv.player, p); +} + diff --git a/zelda_rtl.h b/zelda_rtl.h new file mode 100644 index 00000000..a66a24cc --- /dev/null +++ b/zelda_rtl.h @@ -0,0 +1,197 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "types.h" +#include "snes_regs.h" + + +struct ZeldaEnv { + uint8 *ram; + uint8 *sram; + uint16 *vram; + struct Ppu *ppu; + struct SpcPlayer *player; + struct Dma *dma; +}; +extern ZeldaEnv g_zenv; +// it's here so that the variables.h can access it +extern uint8 g_ram[131072]; + + + +static inline void zelda_snes_dummy_write(uint32_t adr, uint8_t val) {} + + + + + + + + + +const uint16 kUpperBitmasks[] = { 0x8000, 0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 8, 4, 2, 1 }; +const uint8 kLitTorchesColorPlus[] = {31, 8, 4, 0}; +const uint8 kDungeonCrystalPendantBit[13] = {0, 0, 4, 2, 0, 16, 2, 1, 64, 4, 1, 32, 8}; +const int8 kGetBestActionToPerformOnTile_x[4] = { 7, 7, -3, 16 }; +const int8 kGetBestActionToPerformOnTile_y[4] = { 6, 24, 12, 12 }; + +struct MovableBlockData { + uint16 room; + uint16 tilemap; +}; + +struct OamEntSigned { + int8 x, y; + uint8 charnum, flags; +}; + + + +#define movable_block_datas ((MovableBlockData*)(g_ram+0xf940)) +#define oam_buf ((OamEnt*)(g_ram+0x800)) + + + + +struct OwScrollVars { + uint16 ystart, yend, xstart, xend; +}; + +#define ow_scroll_vars0 (*(OwScrollVars*)(g_ram+0x600)) +#define ow_scroll_vars1 (*(OwScrollVars*)(g_ram+0x608)) + +#define ow_scroll_vars0_exit (*(OwScrollVars*)(g_ram+0xC154)) + + + + +extern const uint8 kLayoutQuadrantFlags[]; +extern const uint8 kVariousPacks[16]; +extern const uint8 kMaxBombsForLevel[]; +extern const uint8 kMaxArrowsForLevel[]; +extern const uint8 kReceiveItem_Tab1[76]; +extern const uint8 kHealthAfterDeath[21]; +extern const uint8 kReceiveItemGfx[76]; +extern const uint16 kOverworld_OffsetBaseY[64]; +extern const uint16 kOverworld_OffsetBaseX[64]; + +// forwards + + +struct MirrorHdmaVars { + uint16 var0; + uint16 var1[2]; + uint16 var3[2]; + uint16 var5; + uint16 var6; + uint16 var7; + uint16 var8; + uint16 var9; + uint16 var10; + uint16 var11; + uint16 pad; + uint8 ctr2, ctr; +}; + + +// Various level tables + + +#define scratch_0 (*(uint16*)(g_ram+0x72)) +#define scratch_1 (*(uint16*)(g_ram+0x74)) +#define srm_var1 (*(uint16*)(g_zenv.sram+0x1ffe)) +#define messaging_buf ((uint16*)(g_ram+0x10000)) +#define quake_arr1 ((uint8*)(g_ram+0x15800)) +#define quake_arr2 ((uint8*)(g_ram+0x15805)) +#define quake_var5 (*(uint8*)(g_ram+0x1580A)) +#define quake_var1 (*(uint16*)(g_ram+0x1580B)) +#define quake_var2 (*(uint16*)(g_ram+0x1580D)) +#define quake_var4 (*(uint8*)(g_ram+0x1580F)) +#define ether_y3 (*(uint16*)(g_ram+0x15810)) +#define ether_var1 (*(uint8*)(g_ram+0x15812)) +#define ether_y (*(uint16*)(g_ram+0x15813)) +#define ether_x (*(uint16*)(g_ram+0x15815)) +#define quake_var3 (*(uint16*)(g_ram+0x1581E)) +#define bombos_arr7 ((uint8*)(g_ram+0x15820)) +#define bombos_y_lo ((uint8*)(g_ram+0x15824)) +#define bombos_y_hi ((uint8*)(g_ram+0x15864)) +#define bombos_x_lo ((uint8*)(g_ram+0x158A4)) +#define bombos_x_hi ((uint8*)(g_ram+0x158E4)) +#define bombos_y_coord2 ((uint16*)(g_ram+0x15924)) +#define bombos_x_coord2 ((uint16*)(g_ram+0x1592C)) +#define bombos_var4 (*(uint8*)(g_ram+0x15934)) +#define bombos_arr3 ((uint8*)(g_ram+0x15935)) +#define bombos_arr4 ((uint8*)(g_ram+0x15945)) +#define bombos_y_coord ((uint16*)(g_ram+0x15955)) +#define bombos_x_coord ((uint16*)(g_ram+0x159D5)) +#define bombos_var3 (*(uint8*)(g_ram+0x15A55)) +#define bombos_var2 (*(uint8*)(g_ram+0x15A56)) +#define bombos_var1 (*(uint8*)(g_ram+0x15A57)) + +#define happiness_pond_y_vel ((uint8*)(g_ram+0x15800)) +#define happiness_pond_x_vel ((uint8*)(g_ram+0x1580C)) +#define happiness_pond_z_vel ((uint8*)(g_ram+0x15818)) +#define happiness_pond_y_lo ((uint8*)(g_ram+0x15824)) +#define happiness_pond_y_hi ((uint8*)(g_ram+0x15830)) +#define happiness_pond_x_lo ((uint8*)(g_ram+0x1583C)) +#define happiness_pond_x_hi ((uint8*)(g_ram+0x15848)) +#define happiness_pond_z ((uint8*)(g_ram+0x15854)) +#define happiness_pond_timer ((uint8*)(g_ram+0x15860)) +#define happiness_pond_arr1 ((uint8*)(g_ram+0x1586C)) +#define happiness_pond_item_to_link ((uint8*)(g_ram+0x1587A)) +#define happiness_pond_y_subpixel ((uint8*)(g_ram+0x15886)) +#define happiness_pond_x_subpixel ((uint8*)(g_ram+0x15892)) +#define happiness_pond_z_subpixel ((uint8*)(g_ram+0x1589E)) +#define happiness_pond_step ((uint8*)(g_ram+0x158AA)) + + +#define turn_on_off_water_ctr (*(uint8*)(g_ram+0x424)) +#define mirror_vars (*(MirrorHdmaVars*)(g_ram+0x6A0)) +#define sprite_N_word ((uint16*)(g_ram+0xBC0)) +#define sprite_where_in_overworld ((uint8*)(g_ram+0x1DF80)) +#define alt_sprite_B ((uint8*)(g_ram+0x1FA5C)) +#define uvram_screen (*(UploadVram_32x32*)&g_ram[0x1000]) +#define vram_upload_offset (*(uint16*)(g_ram+0x1000)) +#define vram_upload_data ((uint16*)(g_ram+0x1002)) +#define vram_upload_tile_buf ((uint16*)(g_ram+0x1100)) +#define overworld_entrance_sequence_counter (*(uint8*)(g_ram+0xc8)) + +#ifndef overworld_tileattr +#define overworld_tileattr ((uint16*)(g_ram+0x2000)) +#endif +#define dung_line_ptrs_row0 (*(uint16*)(g_ram+0xbf)) +#define star_shaped_switches_tile ((uint16*)(g_ram+0x6A0)) +#define dung_inter_starcases ((uint16*)(g_ram+0x6B0)) +#define dung_stairs_table_1 ((uint16*)(g_ram+0x6B8)) +#define selectfile_var8 (*(uint16*)(g_ram+0x630)) + +#define R10 (*(uint16*)(g_ram+10)) +#define R12 (*(uint16*)(g_ram+12)) +#define R14 (*(uint16*)(g_ram+14)) +#define R16 (*(uint16*)(g_ram+0xc8)) +#define R18 (*(uint16*)(g_ram+0xca)) +#define R20 (*(uint16*)(g_ram+0xcc)) + +void zelda_apu_write(uint32_t adr, uint8_t val); +void zelda_apu_write_word(uint32_t adr, uint16_t val); +uint8_t zelda_read_apui00(); +uint8_t zelda_apu_read(uint32_t adr); +uint16_t zelda_apu_read_word(uint32_t adr); +void zelda_ppu_write(uint32_t adr, uint8_t val); +void zelda_ppu_write_word(uint32_t adr, uint16_t val); +void zelda_apu_runcycles(); +const uint8 *SimpleHdma_GetPtr(uint32 p); +void ZeldaDrawPpuFrame(); +void HdmaSetup(uint32 addr6, uint32 addr7, uint8 transfer_unit, uint8 reg6, uint8 reg7, uint8 indirect_bank); +void ZeldaInitializationCode(); +void ZeldaRunGameLoop(); +void ZeldaInitialize(); +void ZeldaRunFrame(uint16 input); +void ClearOamBuffer(); +void Startup_InitializeMemory(); +void LoadSongBank(const uint8 *p);

tPLC3a1d7^7MG>(FFH0Vo&I}z zdgB}YF$gOi*xS6+tGs#Zj+XFWh(x9&ahoyGki;g@Nh!uuLn50C7x+RE{B!&85S)Z)b;Zr{TJt z9)YjhA4SW&_iz1DO`s+77nPIY3Jc+i6&|jX!soNU{5hXDG76J7FdH_kGi=ykp|6mb zxhjh>YgGng#;WYa+}-pIuvKGebA^OE)tImKF@?SE%rz!%w~V|(D$GqZCMnDXcFWAY zUgigKXz^?Z%wWTU)J$Ve+IE9-!%2_sm3m_qnoc%Hd)R2ChcM@Qt* z;rVn#0Uf^A7`2Zzv)%SFi}o=Q`-_k<>LBQOw}VW?K_;q*3Ey92-VbFA;rrNbd+CV1 zbhmxR@ck^*3g63i+e1g}p}XxhLT=PvHhd4;EuYRWFh&&`4j@-g28$fagvZ8iG{nXt zLsU8gJvN<9$8^Gh3}#RYV`6g{$x_qOGmJ1m(Md@uscD9tNyw1ECeR6qU^2yRo9iD;vTzC$2O5C1ZOvJ9de55!3MXMwBL7Pnn4d1he z%*JmG`%L={2ib4U#(nOO1*W}*{p>!oaS!z0F0K|bBi6@lNl4vk$TSCj2&8S?e->GVu&q@efIx3~!wB$!f-+Y?bKiHBuo#flZi6>>Atsw?pjO0Gy~ z))j=VTzPnfyQ2NI)vuj@#lAzoUuXWh?AL$G&p4j;>)~I2`SsSX_Fo5F#ql*)d$iAc2$3^^|jz@uU-4>8qWXr+UaZ8uid+5yXJiz#|>uFg57Y*hjR~{1#(I@ zJmtW-3(j12(fZA%1WUW?6vP%}!X*n%xrn91b)vxIu#CS>7*CrcpSSt4v!}1=6M_{+0aWpjtq|@)8okUIH0`?_QFMxRUSNnjAFN$QrK@2OxtlT zmRk7TZ6+GYLzzXi63pt3zeFV`9JgD34Q8#~&#{pHcJq}OU9(uM5 z_mB&?@34#3Y%;|oR=HvYKtEsKcl|%t?_QTs26XS*>+n|wH(tHb?*{Jb2)%P-{EdIy zSa4%ief*mn`)-`Bf5!R0+^D?aee=1SJ#XR|LeObn07tobc|bsbB^-9;T9g|Sk!~!3 zK_&%Ky#l@1(5>5*!}8%xN+}x{V3~DOWBDAH&kBjy0p%^5ailOLA{R&Y)k7-yA0h2_ zhx9E(oX-G-FDhmw0A^7E0V=i1fbm~Y=|-4gQ7*kJhs};G`D3~)7jJ^W#vG|{<@KAS zdrJ+AcF?KY*%TQ@LqmaOMh5Io{ejp}h_GPP*etUdEHAs;oMT2RCt;l11bkHvq_&6+ z-2nx`HnHhub1vL+%$fCa0O_!yI0^I|TqyGaxa~I=KyJP4n#Q*!MLEz$m^0u5Ro*0S zJ%39=cR~KI-kN#q(_4FP!QQ5D(4}2VLrP7h!%F9s;&@@{vC@mBWuFq-G+B|!^7^~mR`3BGfpr|(p@GQ6{k?F9Y7oXd8}HNKO}ngLeR8SYgx!FM#glgV}h!)nfA zyJQ*P$&#x!odIgoD$?BFtm*sRw}wUEMVdp*wDS09sX|Y{pEN;ZwoJH9Smxd)O48Gf z>Chq=m7qP5QOWU%ahBD$Ve;W>6?ArXVh-C0?q+x#pTl-hVwO|Te7AxyX0Q{}*-mgb zr@_Qnh> zQ9)aJloOHTN+L}q4J?k0i!XufR;r#IV7nYRz;-)e=#w_M zgI3ZL>+c?ML`T4S1!y2WvHtE6N0_fzopac3IfhPYY+6ZrrXh>X%*sKa>J4g-8mll` zQ=U-13&NrDGvyMRU5?Q8^2g=uoz{1-p}|MjJLB$5y)&yJ9)0JlJKx+%ypwh3hMeYo zx9#1&cZc4ccz4HLT)y@$eb4`1k9+;@4Znxu3-5h>FaF-ad;hujn;f@vyib_&+1AS>e=u!qa2$^y)l)rayK~EqCt|px%v+|C(KR zituOb!d^YF%K{WPLI4p@3jeA_7WzTMyntTd;Xh}BmNq&-`x+g%m7aAh&paS49Ul;; zTv&X_%gW3%<$_*>Js`63cI9Sgmss9;K!Cq(+^$?UZ8au?BW8?eH^dtg<%{Km2Si#< zMrLMuiRJGP2+LXkxDC!sSm$n-Rd`GV8lt$AWgnbJ;Z(@TG33Lpwx-Uy$SG z!ET5*C9-jerc`!aoM{`7UO$Ur*M4K#+Nc)R7Cbe}!4AAUDQuLT?grG&EmoU@@yZjs zhDuM)=#a-e3`E!XK<-S#&&Zt*__+bPaY3%302Z?fj9^&g<|FK~H*S1fqA?X3Z%oD2 z>hm)jK+p?3dxaWD?qoHh0lDir0&k$$wNyFVQAaKgj657#`z@f{BjK0N#I_Cx+*i{Ej)^Y5nL zC;UDOo|nt<)ZY*Oe&+X^@LVUyeJgrY46PVdF}`9(1uj3gVnxN4ioA+r6+g*w%Z&=c z6t&M-Vpx>r_Ph_ZkBSRU-;^4kwIL%;xp&C0JggvCbMRI}GF+1lsc=m+q{-J*3%pRW z_&x#y9-Pc>g=;FC4A(RkrpEA`XnFn-QQ8VG6~L^fDWs*%fCP|83V0C#jM*5K2XSLm zfnibJ69oD#+GmP70D@k00P+e7U=v3|ZUT_KE;xBZVqD^;t?|hl;^PwIIwV>`A1P#~ zTE@#yiLFyDvt&|%FqyoqmZeI(S)wT_$GF{)W6HvQq#+F!j9}=;-1!D@cwqEfl+`31 zdHE+6h$#tcI`oR~J40|Ea~aMZfwb;)ZJ*Cr}ViA}WZctlvfeMG7p zF{D_E>p7BaIS=UyKT<$&zbNf)0<<3%je=JZ7YJi7mPN@E7~|5Pz?j-3Myx6-#>PPV zm%xHn;r*7b1uZYHGI)U|J8}Ugv)OX@5rN9IkfO&r*Tni-mWoFNJQ~d) zP8_2jL>7Stkfx;OktedS>p}cmClNREB)7% zJp*Ravj-}K;v3IM(D-I6Cclgod5XDV=qfTi~M4D>AfK-idu{$?U7Tb-hUPh z4f2{=N|y!PE=G}y;vGgq*1gE7_DFBa5O`tx$P%9GA ziw-wmaQMmV?Z|*96P1)l&Qh;3WL&h_fs9*A;Ii5E1aOHmUjtx5hWIk=HxAS;zswi% z4Ts9KTi|xA%r{<%#lh`BnQtuIa>}$D;g&2@g>D-Gb>X);hYuAWK6KlNzCG~Ww+9OH zb0Iw^GdD9mJ#9OrCMRr7+O|0^7Iy^0q8z9m50`fMB0n{KLB}l1EEg@CEITZFE#;PK z*zV&Wz+DRd!P{Vc!y0OR(>m1pf%RkSO6yu{w$*8E4|}Wht9-Ze!^*!`{=3pv8Co^0 zYIfD)s)VYvs$Z*|Rd~30rFwYv-0FqZYpT~*$5!K%jOu;W-&fzPzFmE<+EVRb)3&B} zP5+vCHQ6<{Y7nZf@vCiL+qt$+ZNJ(9wYa=xY%O7#QA>=0Wf)W%@F>L+Q%hUoYY9Ur zevf9}053aYVbT*3YY2rmnXEa^k^wcog|k&1Vfj}bu9*yq7+uE5>r-RQbX5LGT;ueFyqIJ3Qc9xz)LVUv>#$h__*;!+BBP= z#!a_rN)7NXX%VO(Rt&5bhE4FiiQU9(+O)~A5uP`)_)YOf186Ip_-*k9AST5SngIzJ zYz6}!umP5=;8bM)Ij~zU0DJ-eN>&(I)w@nwNA3D zk2Z9d|Gksa8Cgm%HRA5MkKS7lxpx9ApqTRMeR~V?9}k%j`S${~$Br?(Ycd^`lfJW8 zx*^BH*uf91SLz1YtOpK(USq8`tb^xu>^f%Mx^eV|WDuYdy z?F4*ZlV->WNnz9I)U@HLbYf((?5-$sV$3c!!n6VO7_3SfyqtQ1dkp5D%se)99ah72 zvLdqZKAQ!jfDMCN%hoexp})w zO7J&(atR;SY+NM2D-6zuIYa9-gSbmg5&4Hy!sJ4hQA* zmA{8nSP>9lBfZG`FP3_PeQ#|D=mlSJ6yr5)ZyYniDok|Q6@tcLzMmI>@&W;Bs#QlbXw`^hIeO&OwO}O&}%U2Y<5r*%LP$7#Q zpP9u*WU}M4GL;x4LM#JfKuadjf@6@F#=;7HqZ=gdVBuX$qZMu%ou25!tm;v9kU5{M!jb#}|r`|9+0Ql$VWW0Yu&J)NYGeATsvK*N} zPcct`?}rhVSJB?0gK+LG!krtHd>{Nh9e(JbG3t<QG*2wYK0B9I$fza=i z*XrMjWE3Gt>>ltfB36|aEy7>-6{G6TZQvhvaU9@FBywCO_H97u@&nVo@<*{kgeDGY zwHnyR@qXwXM90(xKbTccqOzd~ z%_qChd}SNBnuI0&P8gygf}dMtJ>M}YTtF{YNoK;yvx|;0p|?^ zTR!%+uX!)4SsGoufAm zH@|$~C3OuLAM{JR*V>l1>epYHN6I3aUcu+13p3^>=C}K%G+a zT&4cu49h>!$84(ZC8;O31b+2Bf@)1Y5FMnMOlVf{Y%7Bo(oZE(D?`Dv2nB$&`V(HL z8|041QM5a%JV2)6qr(3l}uM)=tX zP#fz2(p>?#nn&FO5c-MO2NFd!@S}cKh6$2@LxC?p!ZQLq2(=?n+(3ZZ4k!N+)K6sI3pvmF2g}|?;Z$Gnly3}L9@?y>C!^1cA#ux0D4_YKpiLt?76qX=ZJY1#v8CH**KM|^)h&0F*{(UhvQKl&uphJg+pV@0wl?@ zvBaKd53$GEd)dFU|IKc2yk>9b__a=Nf2J*!Vs>PIEU9r*Mw?mrUXl~#4}_u{3h*7_$B-;YCKh;X{K4Jov8`a3e;+C zsOGUYU2|T$O>;?Gq{-6eYdUI2YDQ_dXy(wR+QGVObdoMo7ozK->#QBG4WV{YS@7HA zqhvZ2M21omQ7-XVoQcLs)o3bePDT6UHIUd(=S9W^w_wji`j(AGV>d#gB>U z(n;d3)DbNf6U3K=GeQdg3tz^a@)hi>=k_v zpEteyeTI0AW6k<=-m&^2-i!33y#nN3PMszOQ}4mAu_sZh zDL*onun|{K1et@DlJBBts5PjLdX;#cibVe8Q0Xh8N+gIp@jSW+oIWjXmPUz#r4g{R z*iWJZO-H#@C+ZqK9Dbqt3NxJfMz>LOiuwrj?-^;H$cnjwog;X=V})~`eVapTyJBx& zmt;?^IcDo#^`MrwcB=ix8dSU1`hKmZ@^0T=R4v!rUh@H z*lhJI`?6^YQSj>+Rw>@e1sW@eGQSw5YrEr8Hd(6E1NQH`e*Jn8Pn6{vkb2 z-jyz*X!zaY8euPClm=8K6%5}2^b712u^R1>j!G0^huvuokajW}&LHv-5skvp zSK=nrSKNp;!yX;wT&$?u0=jh4SHzTNqSp*;mg{E+??81 zIiI?(xHsxP=FZpUbK~sy_!Z9MVhvx8mWi*Dx1@2@OXzdzE9n%uP%I#l_zTiD?t*yT z=_Af@#tJ@MOYsM1qVNiTPFyeDBa(?^Y8d&DDkWQKj#KM3zS_^VOEvMDwv>&0n<7Cw zOQ{&p(iAEkY{zM8Ji3Km5U-2n!Vh9IQ4oLUuJRikvtb{jxz0-Ga@d>XB_U7zRcsCe zM=SKRWJ60(GVG->Tf0G%tc}$S(fVqpY4w_c^a;&Ynu1@r_R)0E&Y)UphLPK-i$s|w zh}r_b1HDYYsg0ru?OOU>ZK^g6cJpXM9VOl+{)vX8zUX7LMPktm={b}kt%W^f4uD=d zg%kX*!Z+e3DN~9;7U>(*hFC^K!=6Wds20>^Y6_**4%WP*9irKwd7B!jJxQg4?VGMm zr{c8ds6q4!O|F*F%%EVGTCxrCFXC(1{QI9MoM=njK`r4olJ61E61RvD;w91#em!r6 z-B5hRW8wp0qBsh6s`(NeJ8uH^WkR1x)zVlo8*LT+$PH2$F5^FwxJKWJyHi}JIUzSFT8KN&FO1vxZD~m|9yj-`=8EsEk`n#tpNPR;gEVK@shaQD zO7g7N1agJGf_RO|CMxOIiD_Cp3eZFo3n>fXBo~kcWEnZ0>_xGpL(`4APk*6lrSsRk zL#L9hbf?Kf%o*xDGlbgBY$EsT+fj@cLv3e95zClrv_k(Mg44f1zUB1++0XlZO6T2` zy2%6(@9TC*DYTbl(R?mEN1fy@kUO~J&<~c7`P@9}9#2qv`5HuUeNm<}S6bryo0R1Y zkj^@f2)yGR-rF&SFLE^FeVmb;uk$4?+c}cUfoSA35OlKixf zg)N$;{7veg!c^_g{CnD~j`QSC_P(UWc9e*=?IZ@;i^-PuU&vqT&Jj0i@!Vi5kP2MdnE&J?o5Amt~3qyQQPE>dnFUc9AFNZ{_2b~tu(pn zDNlpLaqUb~HuKjZlZo@F|G(76@G}{A{Qqlh48fhxo|LDyOnq-h%N_6iSxek`thW2# z%)jOK7ql#RZ*R-Jjq0m;Dol4CXUetIoNNZ;#x%H6{wodtmgk;-reE5 zKYQXh%p5kkpSwXOe;sx=)H%X<1{Z`s!n@ma#H7|*!hFHFpF;qi3qn(rKy7A-Nv*S< z*}$mh4CXy%3^TS#2r4ZY_gK>y(|e{FCR}eAGt8u(;mjarFr1i%rZ8tS3hqIs!KOi` zaJk+=#uYwh!U4ZRgNn}`jtln~sIAzDgC$U3J(&@!rZUrDqpImm;>Yb)ajQ1s;3}xC zp3DelE;A3#PaEpH)1kCm!L9Zc7xf33&rK1G=}+)aH%&E7gLC+*G*hNYY1t%Zl1V)y zn1Re_W?Uou?(P57G}kl_&f!d9eeGYWnZo=FXi(bk+5cVm_chcX$&6yu zb2RfIGe@RDX}@Rxci~^#P(PCS8>5~Ww?e~q2Gi}?|6TZJ%K5m=C(J(^P6hXeOiF#O zXa9HMch$#Zd0+p&aK)o3j79b1Egoytu~GI1AXm+Ejp)-Fjpg#FT0h<@W9`ZC6Fw)x zWq&{(k1+%sToAA~p^oM1nBQ=R@fVLz@)#^rr_ccPZ>Td=PgZTjY@%dnEp+8+k;kC*fJTaeP|aGpbMIf2L7=xor)&lyM)A z>#kt-!T!mQ*eAmHJ$*9pAyiy={KMlB9@o|SW*@~n0U5~Nkf%@PIsW1C2#@P3gvS1$ zLW8OY*e7dh{KMnAI|P?MSWiQ}j$ps6>G7{I1l31Tc%||I?*6C4aUW76 zU(thUxbQXRheAU(IvnK;+aeuj1d>VRv~m7mCXd}ga4quN{f2OPz&WTLVZ?=qoDpU2< zERT^&`!W8;`sEt`pX7sD8;_A{`=_;a?|)do+-Y#v0=2d>K3(*=AoFipTlX?bk8#o9 z-gbp@jQc~zRl9M0tnUhcpY%a+`djk&tkzcSqC0;4tnjz758_I9;a2UUXZ?MD-~%<5 zyIT9Ck7xb0f8YbT%iUEw6#5SYlMBjBQ`0^emdzL+MeYqY8AgNm_1<53o8NEffl&Vm z9}GiRWb>YnqWAT4bQmw6^nVoJL#4=l{-gLGCeuV_0rPiEHw4x9!FMcM)%Q?!-hKXq z{f}{`(WZfJ5LDj>-={E*abx(6@taKlGEFhPYZ@R!h+?7|d>`xwskl|z@x3vAjC+ph z!+IL9--z2EVfvi;j!84Q*Tc`A{@?a`+$s(IJHFWww|k%oLnt&AK^^zt>HlS$QcTQH z-B5a{Lc_?8qdMYt&Gw^&G~s=-l!H8GlnWV0@8X&7yKOP*geD%(h^?m2VZ>Z^QcJil-+-4q>|c2~IcW0hH%-?-QNvu9Ub{B$Y2 zYN&$WU6Y!^tHNx&YNgKsF%18b6^2Tf@+ z9)rGNzG-xNuD`i-QGwu&5063WTv5G0x&GFe26udT>~*)7__==0(`fz8ody*TzT^3+ zyS>EEvQH0wY-2gPXmH1e$6j}PiJukxXFTewx;Wb8jt|>sY%ko;`Z>iD>z`_WaK|?V zMs92`+)u@y#!_soNw__@74Epyk=wnk3Vvk`6wh-Suf<*ncgLmr97=s<{BQ8*VGR_| zHSyULE$%q+GaiF++0*qa%H90Cj_NzAuYXqH0NTWmP*w zS#t&&l%UX~#?0aFV?SP_#`9R9VHC!W=fMgE>Y6aD!`IUTZTe9e_c1J-uF#9?p8*Om zc09+$S5+t7=H2!BY5p41qo(6E{IPocT6%1~|L}Lyf8OZP_=(~uEF5?P0^st zV5YUjW4L;%xRtxh7isJVG@b+DFrkV>bpOw^8i!*9IU5Yzo%SZ@&D8@Ua95I`)o$7?V5x1c+b0~_j^5B zegOEJ^8cE`t8-Tzi)g6}Tb zyXO3O-9>!|tB$X#--TPD$^_rB&*Q1{7{9u1tIE>l^Gt-z<2~2p8_Ql^3x)RMl{nXU z|HnQL_B&i-zuCvN7J53ueY{s`P-TMe*d{fujkQKu1H>!2>iFvJf2uOUcTe2%*o)U; z>(_ym_slN;=g)i|ta}Y>q4n#)?mmY~gDMkzSK967b70)^sl1!VI^gm-p7g<#UaI&X z4Y*~_<5gU9#Op1ehNm2O%7LdGc*=pN9C*rsryO|7fu|gJ%7LdGc*=pN9C*rsryO|7 zfu|gJ%7LdGc*=pN9C*rsryO|7fu|gJ%7LdGc*=pN9C*rs|G#rU3X)>fEd}u1BPvNr z(mjcj{v$1wz9>)lpkTT^FzNM`jsb0#ZshHB#m;xS}1)d{UX6WD>$5k z3QDLi&=6e+_;FAUyAn~OkZ70q`n)D@VaIOW-+dr?vsgE)W_@HSY$v0W-jY6&Xi>w% z7FMMay3w8sJ}~1S=WnGPc_-!^?8^axkZ?I)2td_hsh`vg5(u2-5tZN{?{SC*3Xec> zydMJ`n9BO7LNJEIL%I6=Mp0g@6mCl=r4az7zfxa;fumvPZ~$U-F<*uq3o64j`Qj)9 zOp-*zpdi;?UI0HPCMZY;n{cTIfhgDt!j}rth53fzo#!Bd&{4j+Ac%&=1jRfny(&E~ zy&%0Lg-IbnkPrqBN(hmFYI{A8OC>+4)J0z@=z=84(rtqYfsho+F)bE>8n8g6i+t9J=qf5HAz{y+YH{nB?ipS^EU)75(e zG03j7`daJtPt7fsfSA6(te2!$V%Ej116@#~vL5(KVJN)c=pJKV9~Ra>>~DcFcniQ7 zHin5o5cL>~r65FEa~Ivqt31b}-6Kw%x|fg7$wT|AJRYL#`s zE^9hws@tKn>+I`30SVy_(@bjXmIZtlBzrRS?NT_8fCP*AWv*yUL(!AcUJ%{MhPeBK zW=aSD(53Bey;XFp-3RTUebdqF=tw<(ppCMraaoQaY-*`~LSx8cX^CW%OtRR%kOsyCbITVjU$F9X-~kv5NvBE< z$x%tly*cqv?1F!P7B@R~R_v^cUDSNcFiO%$)^oOV*7a7@8+P1l2B8>;zz3F+FC4h{ z2U&vd%b~o9{=Y^l;b!r#NV+gt%1i3?(<=3rA<(b`9>x1s29*ch$FLOqZuYG~p<;Yv zut9L?mz)4>u*(GD%Q>*ro=0ElQ>g;N6$nLA5hvLs3xrz`jz9qQfWTArdj5%Lb?A}4 zk;#O(jQ`TEbA%PE{K0qJKPf(_H0BFe|5wt3z`o)m1~y}gSpp|q!}Emvq7r; z3@Z*lJbLfg1H+E=Kl1#|pi*3)m6!&wG08Do8rfG5`*JJnM!)YCzV3LX`h)v1=bjvY z8e8!&HCk`QQ5XSIk8!h)(8Ys@7#DwJLS$aSr3w2OwF!w zivh}$gdDV^S@Kk0>j-OdB-nqCLlMNScDp~xh(2e;ssTzN34viDux{oNLoJj@|%mv>t%miza6^e`BFeNUb|dk&`s zp>yayz_!DA4t9SJJ=(1Dxi;0+Sd41@QrM3Zw=KE!7+6~=XH*(7 z1Tg7R(5)CL?1*w;=wWz}s1H20bsShcK{@PD2k-SM)`!WHzdiCvOet7rU(j40{;anc zq^BMfnm&DRwZZNS`M78F4ojA~tL7J@VZ)M>dxu#e7fCva<*R{j#cDS2x%~?R1}Yfv?=FZ-Evmz3A30i=|hu)~&t0NlK$*d=<+eG{AQ{d-l9^DIuY2NHGku z{a}DRhb*Ao$LetuR7X8JUw_Pau&0tmfwF#L9Swr7fBeWa838a7o4(npWJGP`OZ_;`u^`K5xwBh_lFN-E@1f!0`58P z@`via{4)L+f6V?Res<5p&#uBtVv55`gFN$tZiN-ad?H!-Y6#1C%2U6T`XR>_e*rZO z;IO&?%1?<&eM9Ch_}x})-%$BNdH>>4nJ-}XWcw3_2A_y}yq7;)85vV_vr?KPbBRHLQdvHjLASEAW91xB{ znSWM({M(+&Iscjj-slf705t>o2BHL6Hn{9$Fvz+vcHy&*?p0Io%&ozAi$N|5eZI&^ zx4!rFre1Hn-g|d`U>Q$gnMcZH`pc*m&JXD>ln0jG>iyE45obo6`2uKG4ujkWK8nU6 zsIwYk`bus1Hym@SUc9Tj zr)1#v`9eF|pqLnJR~7kBoERGF$$vY?w-uX7vL6@rLs+q=e(;n?h+lwVQ2i`7`2lNS zR!|&ZG;nkOnvT*7F-zcI(NGsTD5`#ZA*3y7 zm%Id($4CS38*r*JHsF>T04PQuQ+z-EehBVGxZk@UfR7L<5vHQ|4Y(&^o8o?)`u?Az zTXg?m@eT0{XecEjv<964={Fqp1Y_N|`sSZ=rypAYLe$xPtwE(hr7|5$-19}SGR0wP zpR)LIny_M5zAv;CA?QCxVq&lr6(ze^=1}_&p8Wp+_SMD&m3|aG`o_O2-urat{=0S9 zzxe{SgI=%-l|aBX|IGfPf1%fdUoWq=+OL2Oc;=ZkaxE7016x8nqQxH449kg=$Bw;w z@uU0wWc%+2-hK!KY=^*Gtfn2Ge%0qchWl88F8Y-xoTdce9@JU4^@ zD+G;mu}%Z`%E0?C_pQXPxM#istW9~pA0Vd*`vEH+fLNgJJ*&vSL2mUA6867~j}*r& zkq8Xi^VneBVsB9u1e6Dsg&ec%@EnJQLh`Bv=+c$@<33V@;Um9)_@Z@zvDOf7>Y8?Y-UK#QJ*ty*J{uN9B4)Ujf#G35A34mQQd<7)^&J|=rI$I929 zGbF!y_=Q6+^&aubIcpnvT*RaI53-dx@yo?)4=QSG4u|5UK0tR+HPlqCctwT7QC|KQ zjIU?UtyveJTn)Gr>c`hlz!DLJ(Ku`2asKVPsOq}U-#H_~_@>$yyp{QL{18V}b>YE{ z37Zn9@U;9#Hwe86BeODo!J3Mn)DA*_2uq|Tn11&|=4%kRUdog_##4S+vO(ox$6~&e z9kejdd?fYz0bn3`@C}0rQzPwB^+Pt|c>el?{#9Ckdr)2V+1wAJC;v^6AGUh&&_}S1 z4nh%&iGI4?zMlk^^*(9!Ee%ra_ZRi{I}AzUYdwFyl$`WR$PXeZG>1P9IEx+wkBgy^ z*p?g5H4Z@l(>)xBIS`W-l|8%m^-+5r&t*--qjn4A5B?L2mO}_VwrIug&t2}dGfD|| zRF00Lub_+)MvSo8eqT@%a{85;XC4?nTXzIBLkG04hkkkzbcyGytIwS4-p}lK>3(3) zLg0^L8EEL8rC_J5z7L*RxGZK#=+U53Un|9z*7s}0`(Ctyt2!~9#yZ`1UlN3_dZz~6t8 zS1|myw!emccH}@zu{`!;?Zdr{LRjjl)6aLGvE_~b1m5b|W=m-kZK#^2|CQu+LO|$;LckQGt=**n+eb4tl&-Z+;)$Z(f-Pe0t z@4D>0A*ClULyfZKYp*+Gtv31loX~~Tkss6VT&y~(3yu3Etf@0c)c&~rk^~+x2}~1q zXk?OCG1}HKL>!IJSE2t$3b3PnK=z@G_4aE`O;gj`Zyz~QSNHC_G>3qd%8ua0;9gM! zisK8O{wca8N}%@n>@xKdVI6;AeJ0jk;w5&B{rC5Wrq|vSoFAMYE(??eOM)f+u}qi_ zPpentsRZ}RsIsBQdELoAe;q5YY)8N~e!SFt4G)*yx_`}@$@}xTIzoCV39DzzQ3f?e zC)5#V!-mbCeL$2H)YH!a%mXPNvcY3X*6NRH@(NzBTU35F^K+}L3d@B;B$X&3m7kaU zg^rUmAw+hl4(5@&nm-?S)omE(QS3I>S7Y^<2D+8JS|oaN;cE|kG5mYOMJ@Rcr|1!< z<;h$DKLILv^1G)$tP3nH7?HMo;-gdE-!O>>uu#7pZQKe!lTX;S3;)#IT@$cEhy`PE z40)^Ji}=JHI{;6dn4Rr%z3{>lPf!z?*!ft^AHdR?EU!{uJ~ML9nZlAZ8J;Ei_+IYg z<0Z99n_|c)De#*MY7K_Pi&g5*x^$C6G69bPzMh*{-=4RPds=#;v}%^uS?6G;WV=F= zYf0ln(G)ee`wBvfqh|j`iTH^;v4jc#KExmA@47hK;i{=&>`x2i_|=HBpxt^-^glJL z@xe>WPAzME_`t*c`EX!Jk9gVtZt3-B?mql_<)pGnWpiBbRB5nO*Pq`2OMf+R>_GWs zA;?+?)NPX&+8ZF(c-@u$X?~?ox-7YJ@ZA^2g`OXJ~n#c)={-4zuc>v_)e@}24R%HzoFN_ zvrS8v-8X}?k7Aq^Vi8o0zHQ?XSd{1vGPqany1|W|5W2Ub*Q?`gq_UoW-s?SeY62WM z1gVRFlb(DRJO__3UY0ewYwz^l%Inh~%KQAz&+nWgjkIT&R3?>OC1qjLr25F#XKiDK zkI2i<%O5^Mo07$6@!fo1+@C{Tx#JhR%i`myJhY@ZL6 zD&iPd0S`jlz!Nq69Qt#PZ;Zz!(lEZU_Y?ONU5GTNUrp%$6)oOz`7IJ%SF=JCIGwpyDfo_+YsdtP-Ou?_(3NwyWdAMb@! zk3RdrYoAYk&age#Yv#_@*&1+nE_Z@T6NMHitSorrx#_`@Iw$!T=i0D_;o@c3%vb{H zF5(wc8hanH{bk9kb512SO}p4V1#KF}AL513a^Lg$eEZbW!$(}V4S99%1CM_?;MJn3 z{4%8WD_p{$klOt#-}4 zf}L+2eCqTpp2HuXUj52h3Wt%4q$T%^G^zB#)KzGP)>#TC;k-4AF z{C&}caaMeRr-aYN2M4G`tHf-Kt-a|_#qTZoT0o9CiF`+<&LNL>!Ym|_@?lw>KbE9G-;%*2Hmr+cwT{cwQH}+4*aCQ?Bm#P$dGFTdftQ!^XUbJw)N0W`Gk+Lu+f+`b zte+nYy>jyR$KPo93j9W6VJ&|VBhz!x?F17}I{GUBL?q(gyzA;18KzaQh`LD^FxA>O zOCOe9o$9E)e|`V@qrRiQ1HOU&FLG(3VWf>jcoU8A9UTH*oYuotz&N9kh>D zjKjBtCx26PX7Pt*o26QNz(nyK&D0ZVdyF?POK*C8UP0~FtyU|IE{|h`CMlhT5w@fx z918eredQh?4Su803bI{5-LEJx1guR`XlO{=q-~0*3&8o+sQn;nC;g-eYnx1d&Q`mU zVw5Wk*#Za|kD-MgKE7&v70xdh@wo;|xvM-@#j8MhfN{?;1NC#0$>T{*ZWibaq2GR# z)GUy{%~|89nILzh@Lk$@HTLn6 zVhp;$56&TNP5auMw^l#ioELrAeX=DD!lR5&OFZ$`MR|3#-(M1{EIVo~+M0*e6|10% ze0G5PKx+z`^C?ZK7gH{EYDqhfZ|m@jSgAgbIzss0Uh?9+4{zE&)q8_?BKbtW6TjaZ zo_Xu9zYLF+dP`mSYN?AFV}DlQ1 zyml=WO*Y<2{-5Yc84u}Zl^1xw$op*c9_xwBIpu1|Mg?@}NbGa=0Ue{!2==c0exHxl zJRRbE2#qUt(MHb0MVID<=Utc^a)zAeoH3^Xqql+gMhe-Z$>pKi%GZtQ>wk0Lv&Qc! zlw`l2FUB}<4HVM9c6HJ=CwPD*ejUi~0R9rcb!ou?rB9Fjtj|fA2XaySdf0~baULkf z`gU+p_=A>jS{Lw8L`|cw9wWO72Xbh~1(%ZOoKOKFckk$0$fpw0BQH7J2ul|6Y4*Lk z^B_PZ{mj@sWE19!{3_m!kKy@8^S>N+aP+=DCo@m=`XT#pHUAv_lli9;emiwS2~wD^ zTNn0(CGNWnyh)%-sknlgSGhP^+kW1>kNlqtw+ZicK-t2#b3ykXdNua?0k5UI(EHS& zuZDbe91`#yWVjx`yWtO5pLBgz_IcUqvbq^hPJVSR%}M0bF*H-@&F7TQDW@gCiW0vw z==3{DJDGvqf;jzXCCGvO5DD|ivaMdxphkcn2`u3GJ}~SFQYVtQj&* zGbhqJ2`xzTr2#>mWQ~0syGNQKQ9eE5Nj8Z8lXynmNKj-2PsE#%g1j6L`EE`--{<7m z&q|*T4ya3$W0V-r0+*a}UhgH3XK-EfrRYpdHVde8XDmW1EmWC(e2|PM~6u)!pFy1T?hv? zWM@Kr8-O6_D?2m!YW;!p=OWF~R>DRAv~7k&(Mg_NE5G?<(W&6crW50LZ`w54;^sSJ z_r~twGaz-vnD;zZ*4n(hsWedVWL=*FL;Sye4kN(I1A3xbu> zZW~Fj+&6g+9WN$b{^zp4{GrzFz9sTK8Ii_7h_6{5lTz}|t^49~q z#r8z2@U1TL#Q9|1Bym0S>2L60=P>3$gcWnzAheAOG2|Fu?Rs&-t3`pVFBUy7erd&o z_#^QfgIyxLH|CAi#p>o`PD7q}fOtWsfBRLYfBQAu8DI3na!OQz(|y`-0kx_VYEMFL zE$ko9a*xYj?yn04-Lv|8hE~hcOMQR^QO|-gKTaa}Z02JJ8ymtG!xt!L5+vlf82=(1 zQ#Ho@_T0L|!874YEte@LjbUV4l8qEDO8EDS-p74{`whYlH<0|>>TaYoUrbnOeP77G zMPR^+)g1#j){m_T>!P}d?!xExE9?`wriVAYQul{11{}(%8+O3!kk2n&asJ1H^C`*L zUDoCu?SC{O|8ics1`J26AFude+5Ws%oD>^gLlK6<0X-EF};jN|51%G$;x8MKc zEEA)b2XQo0QGh=!zM9n@Wku5b+zKB|7{~{-#A^1AhqmH8sj>HKKY$#bhrM&y{)36e zla6)Bbbo*8`%7sb^t()%?wU3&*G7Mt3+xH{C%E9x%gJwD+&EUgqnxy^ApdIkr775N{Q3n<9ET}1GUJXv5 zjT^S&oz||rDJV@D{^UyO;bTIxWb)thzhRcSftdJTy5Owc<7*3Q3qCKnX`{Ku_hzpIE8Gra2JKsle+OD>$J!ak1Y+K1+iurtQqvuANB7dd zp)Y54pV!xhF0Zv+ZfL{N38$*AU*daUzg*QzISwCjxkP-o5qimcm9!_5k@^{GPZLn9oVwkBgn<EhfN=CSwBxo;lj6zIa0^gID|IHC6K?5KLhsw>YgQabsR&2j8T*08nM z*%U|)v9^H0{jvuR8aNa_Co4NEC#$`0UvTnwy~+5SXvbZ5G3Ib!u#VSGVP5>xUX~Ag zSqD(IiP`C3#}xr`atSdQCKL4MFn8kt#2Ep!trq#q;RUO72*^C%r?F>abMmROJ!N|= zQN?jEmmkfL&(EyH{#U(`=J=9FuBqex7m{H{>h`Px=RwNQ^gBFJ+^=A6G{Aw_w^`=# z^fNths%h)2oj1__({bz$HnL>4j4j9h?rO}gGlKoS2044%)mlAa zfh#1J7;RtH7Q$*H|>~Px1_xc z`L1+d>*KW}=T&}qm`}#EW8Ky9#}+Std&O4^zbXDE_zi!GKXY|Fc3E(G!d~NAU$(hq zQ^_WZr-7kf(7aZ(zhqGO79?~@6{ct8ao zi?M-`Dd!e6U2OT~*B^@Wm5F$B{HD-zho{iv@YsEdXbdH91I@RA7ksQ0o6Gb_jf>&wPHvV59ORL2@$uUvKHY2JidII(#8r;7U~Vw~ zbpGj#(;2kVpP;=PXAH31D)6_C^G5~NvW^IS&=G?i9M;j_%Vck02KGF5`ikGNA0GEj z?^C8m)5+xKw)qlDmi>!Ge|x0$WBycKQSB1`ihFk=yzRGd%P*P-@Eg62;GJPHWm|YW z|MLm_neug(fl^7LdoukzEG3*0?i^ONEZ!g5Nc;D6{*z9CCdyGpJGFEP>)^YDHSn@N zqm!?)r*th-G29Od13xnQRH70b^@Y=g41xUp^EXeem|Ahvx@vZU_vnDN_hS`7h7k)bnq#BFA}E)wkc)Lxe@8xQu80u+I#K6(B=E+qAcN zcI&&*`!GY5&n?o~0|p-0Q?q{KX#2xbJ>~)%Xhj#RRlWpoAO-15H^Uq8R!TD7>3k>27tSASKh<;93Xi01dhl6uo#IFP$La{A+vi$Swyr5Xpbqq) z{1KdB3E-5~VT=m|m*h^G$Lm6M+YgeKX2ASrT;oozP+aL*fexU^YXHqH0rJKsT|~)c zs(0X#b^KQ3$-yQl`y4si-2|2o;DulAnzeoDQQK+bqwDOSs3UzLl}wBWpP-Ksb~f)= z|E~ws_X%sHRpSsZ=O@~egaf>)L05qgm^x6urG@s21Gtm(tK=VCud}T$|Eliu+V29P zbJ1ul=EJ!gGtT80a1M!10WOQ3iyg<)2Xs2gZ}QpOG9pe1UhzAR&w75@ZM!D#oV=6n zOgQzI%vOPSSBpE&FX4Rq>w!R^6}6X_)5w#A(hZ^@Cv&Yvi(S>#1lsM?z}2|3wsi|L zYiXy%y@lT5I!izop`KIU<=&G;iu}@Vi7znMU*8eIqJ~qtX`7T$ZBvXj zv&)b{(g7`UEA>03)np&~swR8KG)yOjqZ4fMEzu*W59*(G(e+2olav1+yv9vUGB%U2 zWUi$4kf-sNOq>KvXLmte;QvaG({1o{_9a56KYkRCQC)pyj;kP$R4g>KKQeSh4L;06 zqm(A$u85_*OC-=@DW z6zaID>_ffnqbul-SSXM-2B27KL!zBB))O2S^S6bI6!K_9vYN<4<8wz?B&%0_n)12v zTO%@aj7#6LkJ)?pnEY-rM(r#6UFjQ({yy{7alan>>Oh)6XmGx+FKpY1YWdV4)Z%BQ1sVx-lb9~CiRwwfpi75ukcy#H-KS7+Yl+*ERS z^gjC;(@E1M-FY3&apY%+NV_LtKf8pJjy-HYiZo|TiTnvY3;WYrH7?=3R?M=l@YHZ% zO}L~ar81G9ehK^H*@Dg7bL5rkonGJCGFk7pr*dJHLb;lG$|7r}2s8;f+HFwBlW27Y z(=gj{oI<0Kyf!3TKk-QXv>^_69*G(wq@q2XuHbk=m5PNGt*lJ#Iig&)Y=%cL?dPVToV z$F&rFSFoS(?w~|)bpGCf=K}nqhL61ErUO$bUUm-VWWyMpv?#%j9eJ7?%XE`zWX4F| zqHb2Vij#}7{*y;evQkJ6BJ2`O*A{gP(zFU4N%3+Tl9DLfWo!54nX45YsgKc{5&h&X zTG|tI%LI(Kkbc^qk5j`XV~3ttM4p>a{q%fX4OCY(Unh2&{Xz@17cj4Epk<(CURfX# zh}4Ga{2tLdPg{bGp&G=@D=RLk^Lu@G{#ZEq^esI>hH;OMvrWKtC7%$yivIcp>;6;u z`FHde(yUBNzEAy@@@00=L9j~MSv^A;)Yls;u%P5)B@Tmr=KOK{{>Hk%xbv|JUqk4F zePK;)Zfaa#nAueGPREOL6VKO}nIqRfBUBtJko%)zDXMXbuLqd?30R?3kHG_f=Vh3I z7l@`#PX`!#Hhzx=R(^)2-9vfN0n>JGHae5bde2S$Bzd>eljH%*xWw{9tym>pnac{8 z!!TW4s43Jz_OS-%bnE*8?4rQ zu`Mk>$C4?|yi*)KBh}T^EmKQ};Dw`{Q?%tquk9t{?=rwq$oYu79&6n7{515nA7_=@ z&&1REWJizleZYD+SuBgKa0Xp&ZW{EF zJnmJA_%y7(?8W%-2R4%h9ny6+Lobb1rA{K|+peF=`a{0Euw;^c7FNWbaT%uTbIpE_ z2k=Er3Kkz5U|%{J!Lg+CsV=2m-$N@OZ44Ekm|CK>D(TrSa+0T@!sd%=8gfenth+QR zB`w$Li(nqs(fu>}%ak`Vn^CgixDrcHzMpNp9N-b9$XB|R@7mz$Y4@bw*JX&h2N;KR zvP^utU4BBIu?zn9{Q3U*zJp*KAL3=wx1Sjx`JuId#Pb}x_^Z4Kx{|!1Z7@h;iX@d% zrBo2g;F6N)X*rczp?o{XYkRR*czjVxAhy_m=FB@M<8<$o$ zV3BB<8;8Cm^r?=?um}WZQahOxCT8!PfKy;27}y9I1g$H~5eGEtCON{lW_88%x%?#GV%-zqPnfMhnBJ&IMpciBCFXw+3I z)oOYg-emeQ42t^TN#&B#XC99aj-FQxg(84u2dxDPcaGy9T1=Ff2K^TVz|HsHm>)Pruo{d-m-7d_nIbGoOY%2BTYJ1p?r* znJe36SzyW5lLwqV%|+fKoE%Emi58ku$)R+0xw0*Kq-QLJnNmz?BaOuC0#3Qcbd70{ z%?M{;R)a}vF_}~x?`#1`vmc}G4c4(Ll6bJO6R7An9gItCM{y-hV-G z1c_u%5MyNskev+E)gab;1u;dS!Qh6IrCY1*-u?RPAAPvG+U=$lAh1zphCM~Hl3E}b z=#(tECJEG)oy9T=5T+z)g|Mj{2po*(IXcXB zaL;_6SQX-9LVvv%!)!#Iq02T+wNJIru&*M+S*JGX>?TQg?q_;`b|@o~5>1JYiH?s^ z|NN0qG!he@XR>rf4;<+%H+Zq_E-6^1)}%2poE^LY)5#>MjO}wYIJvXg(2Ao$F$XKl zjp!o`XAD1qk9UO;wfi|+03-sOxP9*#k_gv&zDdD1X&W8r%_7qaHdfz zy4_pz7r?T>%s2| z1wiB6xd6|TJVYGRDu{Y~9t6Bl zx@*q%r8Ddg8Aqg;Aj9;ko&mg%q>&VM3`pvG8h7ozxM)oDE6ZC`BMv{?&-d`TyfUVb zIie0Mqw>*SYk6<3T+wrghLBJDi%wu#A$7Hb!;|xY2pAs{dQ3FaJoOxAO@)+sm=KGLQ& zGNQhS;1cW`p>Z&-WoU*Qjr4L2;WQefk>V)8$KVq$)O?Ou7E#SKxwBjXBck=W4 zGL>WCBdxYu=5_Xaq*>BK(uUYpCMnL4-TT7PjENvn;dvrNt~S9uI2Rl zY|E1P*hs1l9EDaZpf;3AIz=Ch*9rxV1`2rD9-yZz_pu7>f>${9g$Mz;xukoXumBvWl!hD^Q53G2E6IS=}?bMrMW;3pI+6Jv=hJO?OGf{hHW?%adTVH!0Q(t=~0*187fP{O% zLvEMu68?5+2m*@O^F_zq%|*?)K4Jx2B-59!Zs3pB!H8AC?9@4?R+~(AxWrq&NLdrB z(w+f1zdsToD>V}F%K-=@E;Xh0P8r>kQUF$_LZ4q_8ek_5c?x?4AxEU5Qtu)bLV#m` zMd+r;zQ~&Bt_jZ-aG= z+*1e`o>^oGlm$voJo4~pJ6^wHvz56oV}278@08K$@-1Vu7n2`N?wr=m7{%&|73YKp zhSjA+-zWm?db?qX^^q~7`xwP=HQa8oyIgL!Y~d@FQRdR5XuBEDL@Z+X%8F`TX=#*K z9={mN0CkDJ!~-3S!p zb`oPMv=qwk0?Cfo(7Vehm3N10ZREE2dOSpuhO;0wWsQnM>a%_fRS$x{3ozO0n&s+k)&YiPALklsy79+J4}aE z>YeLKpgKJwG?(;6ZX6)ZB<3p$lWB0Ct*?9h{jKmTRR z77t3%vKLqm8^itr%?yx))s!(*Y3*SdS~9dm1fX|X;FwTqu}pS-aNxCL2VyR0O~?;S zy93zQiQyMu!rgE~AZZd*XnI=!s37)0RVtaSJs!XF!o)^uzwA8FCwu7Dfhi0TR3V37 z1rj0U%3N457If_ZvXv_*6j|@3*|7EA2}LVcuEe@BSsY|-Ou#-MN;L>JaG-P#^IQco zg)T|0G8qP5Go({y7h@MAwK^G@lHutcIq$k2+H!8|hml+Hcz2zdvn9aVR_MYdSc5R5 z$SnJ{Hd8OVdCav2@m56A)x8jNZCsz8v|diWoIK#0HPOQnGcs63$=?WlO8HryzOT8j zS)huU&5o`J65$j_4g(J`70m8m`t#L=kPxh}e?ECd6IoCdi!Lz46iIn-)x7i+3pIfRl^ z9u;~%1b1<_$I+-g=9%nqIxA%Tum^8fpW+<^w}>5ZSjw0I z^uzj3sxmLW-jLYiBG7^6Z^FvvAAE=XuN+QPOAO`59xa1KGS!(q47PG_L!X|j0mBc2 z6c})N0w9=!=^g7|`6hIxB>F~)9{tj@HSDigw{(Gje4cGS#`;avr70#&eOcq6av6G_ z#%{nl90%~G$za*joaX$@Ez_PQGy+5o`RF4p)^tki47uxJ=|0*d_$L`TN%!=`KT*M- z>njNv-k34}=o>Ca1M``YR}aoT3@rK(57(=k-7qSxXBT5K83+`Bk~^am0YGJCyY!7` zGWS^zyF`aUfw|DU7L)?#F*~Q1WmyM}yry?bYNuom$}a1=}#byZcP7FBVB2P6ChSGz0~|b-&)KPN<1EGL_Lhh%hI+eW87! zw+@zgHi2g3Xc6lm3Qf2TcP4Fg6kk7Mm^;Z1rZU_KzFGv#SRn;_K!g33w+{a$`qv9< zraC+dKl53DLfS(@M<72w*2&N_GtHEgYH*q@RI5SQX-SAf+lA9=Qr545N;NyCIw?Q{ z=_3v6h-1&}a5!_#7#Hs}m+aX_{OUw*hF&JdIkRJ%&oMsf6YVb^Uxf&y@L_bFfbp3? zXQom)49`Ye^RPbxIFl)%gP~Z_19CVO6g!)~>xS=pJRU14BMltG2z>+AC}VLc^!qoL zo!oM7(Y-~3^C*WO;agxg7om)bk~a=dTQF!O`D^g0_Y(Af0l0&FZ+K(Ik_FG4nZLQg zu&Ko9_joc8dj`760PW;Y;91rVRJ3ric98Ei8igWn*f{HL6H80&W88BUSd%2#*#SI# z3Qi{e8Im)4*nk10kFI#omPWew4y3q;{hB=sIi>jh`>ocZ+4tRJ8!{qE53P_3+`PmF zu-nmBS`J9ksxs0BnTDm^Vw^~|YQa5&koOkIDHzPbav|dxSXoNeb|dWO3jQMb=>|%a zm_1YHIx|^6WBQU#HxkvS3d$Lwp#Y+fIc&D}*Cp?jX*Q^cAaGjrz6|yafhu;(#8>}8Y3J)tkyb84o2q3W>@9brAeL3vw_`%&}{>-{!KF;jX__sDY7m$Gk9y5 zNzP)j$|}HLQ=lFCBc0w-Qf3ZKjp$=Dic{`Z26IuXQ`9^e)alO*4*ddcUJr}Llq^=$ z9Kc^5>XlbVvG&`&+oJsaU*^0qUAD)&11tMM(dodlk9v1Q&so{Ixx>0-DCs~GICB|`ONfv*MtzvMjVpPwCcHsm&x$gq!K@Mr_9@G{Tl z<5L#TUeSA8YMKfIvIi$eXpMRt%AoPtz+8@!$<-ATey^%meM0#i7~?D0?{RwK6L6B# zeo)#jZIYfVBM%sq@#1vfX5o7(5v}IjmY*LFFF={~OtG*q{fX1^;z^2iogn7N0gWeE&D`{627i2J%Ju_2~nz@97@U zQou(XyKd&qALxOTd$F@3v0s8mUuTYOxsiS2@(*}o7shlyyI$Icygk8T>rwwnw9Klu z(OY5BQnI{hHrz{$yD|iA?RWVi9vX3cLfW#yS!Bk^5Lszgu8%2^+k~+1J$9q}SuU5eSrTiza%pdKLzw@Q- zU%y)SRI#q~MyYG2Mjc?EVQ+6J8wmZRM{hr~{ju)D1HXFasm7DNDqLp&PMi)pfF3@M zHkJVgG(O=?hpA(FE;CeR*3G2Zt4_$)JjluKk6H&q; zMz5pA`jvWYuZQ|c{lA|Tg2E*UxR%|8bkEZHSCr7o>^_s<>)_kyd@{lPpj~%>PoG5X z$w{dSlg4h83|@WRbfQoyc%&aVpn<)D+MQUvL;tfIH5XZv0xG#bmqd2HLp^k z5#8+X)~W^3o2GA@68e5*xGHv-^dP;x)(uKZ(31A#Nn_uWVzXio(Nmx+y4w*->#bqD z1(l->-ldlu^DE{?&TqNAAaH|f)@sDEanIq_fhKZQ%!^xQL+Q?k z|8*yq(4Jl{fxC)x2CBw(!?v4}bigW%f1^P^JupTvw>9SMVOum77V`N)jq%`(ozNWn zfN_GG4VQaincFROx2sJk{B`yp2wjO$$_z|0cDV!_E)|gyJc94>0RA;{-h{nlJ?Kbq zc*(r1Q5j=|@N<)@eq+A z@fzk%4?~jGZ0EMETb|#Ps;T{JtR!OgL#xdORl|_+4X{N0Y+QF~B>Z*K5W9+2aEGGQ z0_fh`F^?p8%cc$MA7As$!DG{+W?I2rfF0JyFgtz|r*jGJskZCKcF9X0+hyV4Nu3I` z#C`b~Kl5Q_K8A6sF*5T4cZWX??ra_2loRYm{70N8L5iBtQ}tCP$g9ciC7i0fvIH@X zcPN3u7PqG_8t}JY@X{57Y5h1Iwci6QuR{w4084yQtoVqxW@m868E?c6IG&r@z@a4z zG#fkB-G6ELyiSYrq)ZDW=Q2)~{0*(23@#XAnYkq1{=YOW2zIl@B}c*tOzkH}O8{C` z&(6KOm}o!-j3>IG12VuRqW+;rBvF4|S)p9Ni~&2wVR8nRZy0XurR|xPnk>UsP&O0z z7sZJ*a(Gs|Vix&m6{SD+x@Q3EL@knjD>zdE9Zi_uU@S`tC{AN6|4j57It<}G*lF}~ zAv=px4iVoT3l@`cy*&4%;j)p|>PbV$S9e?8MmEP-bx*WyeapD zxx=B2?}X+1XYlYd;G#Uhu`{-OYxdEDNA)`^qoD|TbpZUIgEZW@8 z$9}b9#3*pgQy5dXgS&nQ3wsm`{@s=%Es$on?r-$?Ab~@%c36(tNghUM2PAN8Z?VbI z*3K+w=Cn45v4wUiu@NCciRy`+3JS1mVLf!hB9Kyk9w!eiOamrW_$M3U-?e{q*Su~c zt{K(cl-eV?3pCIWHW>1M9kfhOp@GhNxv3mm`5xhEzmep#9hRGl6$Q(A*X0E(1|(q8 zurZ`=cSg*hZlj55+{sq2iDf4BQH)j5`af|?5AfYJXu%NRLBI{;d}DnVgue43zB}Hn zI}r90^r6r{t%}R~s0JE6H|8RpV~6A%g>I%*qJ$1YFr1(1{qsZey$p-vEb#yug|9)` z2}f(_y`TjWE`&PIL*^5X-hnF50OSzDHLaQ^Tw(=EhW+64S0ItQ;?cCHGy@~}4S*+N zl&;gnI=OZBbg3^T=uFS;fXXJZe%=pq+M<`XZ7s3xbFZQJO&D2W6QGPn0#UOvDOrhK zaJ=X_4ue9SP=+0#1LOE+r^{2eC$#?Lbc**NH_ajU3k*$U)v8)$OdV58T_ho}vK*2n zMfB^(s?B-6!fl+*tf&(B^CNd9bVDU5EbNa?_CBM!7Y{1X7GFnjFXXun7RX}E1l_cq zMX!sYmsag^?{WhN^o$oh-Bk@w4mwkmFf^q=v_Db82$Vqkn;lCaxMK;FAK2U$tvoaT z!qoGye+ZrqtUiO;(E$PlesoDDZC<=uf!^uKBL{myVv= z8J!-{lLfa0p2pyvkY2Lj+TH&e|Fq}Vv!VLYNgZL@i)nWytO1r_M>qm3k;54SE#&vQ zf|TMM8SVzjxEp5#?-cQLffPc1cgX@PV3J?n7N5yb!r+3oC5}v#aHr5;i6n9f35ZIh z5)!VAotb~>z4Q8Z_!;n6BlNtLxhyjcg_%RshNha5%z!6i_Bsn|FnPdn!o^sf`$?#o zc39>UtPcunU$(nQU(w#`n{A%X``h6qai#K1u$=ACn)bK_ohb3Ae=Xp{tr%^xQEDS< zqP6uCkWdR|NFO7N^k*sXbQ~v5@5VjBcd_3fPYdwdk9Fi9s-YwQ5bT=oUJ%<8+kAk< zv|DlHg?8U;=zk0{cnbB+Q3iF~AgRW6l~N1RYzV1<^}QTv9)SgIW08veWk(}bCu1|B z9uLZ+SxXca;t8ZA*xu6wuEl{5NH9t4K=hxi2f8P}(p`;X642ZeDz^E-zcN;df2RUJ zem1F7@nCx|6LQOLIjDXu$0 zyd4ueD`l|%sdOLOf^8{mtR}_Fr*Vx|&lB+O7#>QMcvZ~Mr&D|R66)zC%Kv!cv}`*4 zvOqsAn@)i41x@G(rVI3$h+i5Fr+7ZP@zXIM-8e;H$O9d+469Si@au`!`pGu#X&puL^L4#w582{zjM=C5qJtUlg2mHQ> zf3D-C@4)`peuB*yJ$6D542PGUnN80QPJhqv2=bGowIwflD9IqO(5E}^H8i7eq#Te8 zF2{4#n2l+?FEs}p#h8gu{XNibT4ke^WR5d2;ZCQMniQuMUnpKz5hc4IMJlYt z!R$U@@Nt(hwtynthLg?#jWHU~A|?!x@7y6n*1@ zp0s@wBlsEAxdc~&G5*_KR;$sLDYoyC&w_jBMvo z#!1Bc5ibpsh815|ns4i7>SR)O!J7L7Xog#Xn{H@l7ZzI|TYrAjsVu8zI*a%YV)i}( zBl|Zfp#f5IkV$X3;o@ql(qYR_Lc|)}$RYuTtC|0H{xaI+;M)uNz=7t~iTT5`{2B{fr=`dzqnW$fe z?}wJIKz%d@*g@CX*mbG}-`HST9E!Tj5t259vy(Z1R(<-VI{){Da4G^ zfG3fhIM9Uhb72+J*uELsN3KCsi;JJ-`u&~+L~uy-fI>=GrITle3nIjT0>%+paIjYf zX)dDTy@HqeoRkBIe_Fx4E%A7gDxC@^acLV=I4yAB2U1?bHtQ>Mar&$zqOWvD=fets z+*Lrj8>r=px_hQf}0*O2kucsz2dG?t=>scYsCx zC1}ZJ{Xs{Gxs*+_jL9fLXam|e6{9AN$+Dy8mjWq+Gj7gJz-gHM)AQ4lz-zw%$J`F8 z3CsA-D#sGP}rWM-$PwdbQr~1kVO%w!SmR<-w>;XqTqFrBd-W6S!=_h!< zkYSSJ7)Ba8ooHwGB;T*dQRXOVo|ulB9)!=u{Ll@K9g1?U$ISGP?CGSHShGEd(d$b* zA$tgXLghJxFJoV3|FDE$pYVizoaE6B?NMr3mR8(%ajsj1`2b2Q#n>|w>kp4Xe~b>D z9&W=4wz4>{aP*s6Mr&8(j9s#O3^UQ$JB*ANh3Uz_Jn%j3D3BE%-Tc^vQ&FQhtmyao zkn=L^2BXMtMmzejfy#lMB(0Puih zL6DVWO1Zv!US^*(ouXs?G=G)rznrmj#u^k%-CIYlNVz5ja~Q$1R0FNjm@rB#*=+Sy9o^}}q4$cA$0P73 z(=P(~_n<^NflsH`7wg8`J(7Sia`uN79xvjdC;Xd33pOv<{6h3R1eWwhM9d>DLlfhP z4W`#!*JCmAuaqc1U}*0f;8%+LKHz|{ zZPB#fb;8(sED=C(3^@qXG?Ts`92>HRmD*|i9ZvZbK;_srg{u-^)s zlnh<3)B^{0=pG5QD8-!~bzOpgl4nIs(FqZaYh0+R3{8SbpD3oye`xQC8T?v7lg z;A67P7GeDFj=EwPg;xOY>w$6DL#Y2#P;M*o6TBT37hXu-*{hw|WvEgItwiaMpcV;Z zLKp1NVU(K6H?`(IcJP8PgfQAUID%HjkoF)-=*yNS-J>3=EF9Py$Z-;R*8zmu4 za*woYGq3M6*w9;%iMb%rcN{o$D8>d8a1`>J^k=%%J#_KqAs2^S^n)rv=#4|@#Sic} z#e!$s{;nOl|En`^UU)V__G~8TYr`{YKY)59Pw^UzgL{{$1uSY9iyBD25;b^_{A12n z-w`a=@H%k#jc6`Cqw@`FICk<)p|A{~0^Y2G{~r*agtG}fx{U3U*Jqh+1%`|yU?BtT z9}d2wC*g3A9w+RN6a_Gg<+}h2e*|k!v<^x5+*fho@X^WxmB%VB0pYZ}nhyz{0ts-l z>oV`M%^SDSw%j_hXCGyX`Z{PjH_Ba(`ul*s^k#m%m;(>m9Kidirv+(clSUD&yyJR^ zZ7$hTw!d=k&abQotaCR&Sh=pm;4krb5Kme{1)GV^R}q{lq&HnjYfp+K>N`m>b*5^#@Z%ygJc`uc(sJ42+^-0)Q zN@w#hdRBwWR{_q5yce0)FhA4~YAD%P5)xy|m(Z{c(3Lk4Zbz+^4omYac6F)}M~wyU zBPf9$ek1)>_3gr!zql>%;>;ayAIhu`V(039oSq0k_iu;x39@G+RKu4I&opG?6rTqi zMWfc2Sl!JQ7+5&w2J1uPMj85`d^PYvlvxhBz-k;y2PKXisSeO*KCG>)|3je!b*zv+ zj{jC@LM8hIlsR*_%opey;!jW(-)Q zpZ(7m_^)H&|7KqQx$Qq=;Aaf{jDepq@G}N}#=y@Q_#eaoc2KXFi~bD#cQMdnZMH7T zD$Z)g??3Y`F3C*kuJjZtnWNT_^myOp zC0zfK^DfejHCxRWvpVLdb&f0Z6ZF@t&yoLP)@S(l;s0XRCpn)ixR^E0Y`ZGIoR_YN z`V%2e>n!Umm(!Ji+kfTyr(b)=wbQPhb?wY+@4WWv{1sX6WR+N{ZzZl3*>1FDX?7{D zMcMOkrTi^Bo3HXMQMvzAmM?2}R>@B4TS?U2u%h8&R%ydhT<0|u;VSZHH(%vj#F|S2 zuNSkNJ7?{j6?I12+nu-*?av;1ZT__*t{r*pDA9V9+9ChWtX*iu2j&lftuJ%_0Sr5= z<3X2Kt*_xK=TDTD`0bc~f7aiSf3LX)`A_D2hx`+=Z$Qq&)~~O~KXLFc2Gc*4(J_Cb z%%A@K_x0bEeb@YpSx2+JMY%_FzD51-WxbF4**SA?pU6)&-#Bd2Fu4UC>%TkaUZgvd zbryNfc5!v07dzvsPuT#`T~3mbs|^D(-8}j`Lqu=oR!g=U@3K@<+3mWj&U)Jj<1}9(W}m z$6wZY+}}5N`rx|;&l!B(;EOr422UG2b?}|In}gr`2H!ha&j0J|2eL0_d9qjHIzMOr zf<%5%8tNbNPun2pUy?H#eD`Gb2IMcxDZ3(n;o!Nb=|0p+_0JuAzqp${xCrf<5wHJH z_LcsM`s00)dv^6zuK&TTUu8X%wIFL@7U|pe{!{Af@(1P9?>E^;(7KCRFXX%kzPp%} zmz9sJoc~yMort6GTSrVD(XsyP^K(T0AF@x2G%w|B75PVGjcm)`m>q1(f7^&D@%$~X zH2+)Qa`OKi|NRtC{@25>Me(!y83R9K;Aaf{jDepq@G}PfAHx90cNiZP|Bv!C@nXuu z{1E(C__qi+%9ryNd<1HF{5vFB0)8ekAUX3V0D>{JgO({x|$<{*6fS z8xj8wVz%RhQh&xPm&h&QBk)G;2hfTo0yd*Is<8!MH2vBAKZ$`TSdBiL)EZ~GvC`^| zi@B2XjV-a()>y2iwZ3UT_rP<$SX#~1(pugH@%{h*!B&(vMT1Sj@S$McS*p>_Yw@+& z9()IJ`K5mZ&oue*j(+*8P@nS_DZD+btF_xHDO?0!ucmJohw(+TI>096*5Mk2#GQt$ zd>gBaev6m@(r|QX4zHKypyUA3kZWz()l}7dC|VC0^)_=}C+(>H@N4uwfcStn1mTmt zXu`(DYnRoGt{o=6(v#p=2 z=o<@0|Be)iX2~Ue!T%9E5<3J62RMkwf7f)Sf2Qf#b5DmhwfWEapQIzwY5Q{2T1cg} zIow_W`JP|n;h<`cYe*PK0aQrQ}Tev95&bH1tMMCT-W3cKoTTT3B=-JOYGd4mc4ug|&_ zOe(wo)jiu-!V;p!DZaNhFm96gl3{#+j~pL890D1*3@ztKr}_d-a6klPlHFBFJay#CQ5 zO)4uKXwU3r>qlR-I1$T;HZ-)iL#a&e1R>JsG-{Pn>GPTW{%!b}=u{jTH~UB-b#yVx zXU5yH6Ztv5R6Q8>%WZM~IQHGQCt6MhoA>Vco=3rLEu)TAQ~V zY9H=Sl8W&7485T@$&@DI6=`z*Bwcc*%G%AHNUzB3Y41C4!W60@7tcEoj54o??>b6h zLoH|ziKO?k_XNKE`xMmlUrD{LsB4|XZ-&2<(*x4JC>{m_{8klChKGnlVG zr*G>)cYAB4a&A8wI9lJ>6g(G>G>ebYAor`ETp1c6)u~>-@n`IMNb@)j&lF7e%5_VNP0wsusYw}{?Y?hiyhI(95jcO0-6 z8q&n=-eRd1N&$K!*4%o&+%|q({T#GIxM)-CINuG7uN4}jMI|f|89;(1ldtsQ@^()dE~9Uk zYs2Ni7IdDd0nV11?9JuPwaqXQ&|~;0e5@&kHu9nHLHl;Rv9DGFzr|euNZd$7;YYp4 zyn%AToqlw^g9`&Mcv2iTRQPj#yzaR7bCQ=1<2g9+P_P~ipzn6I+hd}L7#bRCZUl#r ztL9y#mr?s#V1ol)`vv|k@KgMRh{wC}+uWzXu8-G7>d;%XABGpniO3jl|M^zxc?ACR zD8>&id5d{*xSV4Ujk6~)f$XD*Ukh7s7+=PhN$0$?07qiyhzOBDv_3>iTMCbz_tElQ z(%byD;9WJ*wb9l54SaoXGpIzd^hcP&4cy@XQMk^3?06tT=;|GKxv<`Jy2p`$0h5Um z`0&xb-MG@{%*g4`UpopYBqoGQd;nE$AH`GARDp@AAQeSOzsgbUMi4E4QvHxUVpDt+ z0Qww!%}Y08%zF+=;G(UUArNGpiUHWWINtDhfz5l5Z*47ad8zK>;8AK};KgchwSBd; z79N=5+|cIf3wwB3$W`7TEU30rc!JL^O)Q@JNWtQT?ps_FWh1QJ7K>Ng;paH|_#L>o z01cCnkiHE@_GTw_C)k@vh%Y=Qbx2S3u{Idb%V9*^<~RH6VSj$vq|@1ROK&QhbZC39 z{HMH}F$}a{XbDHckxR|t<}0-y*$06LS!72}etin*eTUXXo;&)dAAbAY=K7Zai~7+5 zVJ#||QQ5E0gmFH*&;Cm9H@k-LMQ_F*-f;VdTh`p=xz8iRwYk&Hcblj6zuSx_c1(;1 z4EdUWXzp6~4~>UOp5*2jzL0Z4nNfd1X-~S*vY{lyZ}Cm6R7EC4>3dcaU2CFqUGg{8 ztkwzcm5>ke4;IsR^yo_y{cPm#aNhx)PcQS?8ru}w5?vKr$tk{{jmo&GY&}Bc_+?UO z9p&qm*|9t-vpv6DLg4u;eH-HAH+d{WX;IJb;WWjPn(@3=q30hdx1;yx(tP%fB_(+8 z0rh)Y|D*kZ6?|?iL-hNub*1Z)V)Q*Xtulg#PUsW4YVd0$@(8{L+y3ndyuV(2NiK0U z7^p8dmEBaf0exGE*52X%OYAS={t-7}gRs(B_h9k!h^6mqByg30uk7yxw+r9&Or%*A zBflluKD%%_WlYm`C0~Va43Pc#J}k^9`OY{7?uF5Dhpo91c>H_(S=go@ zz>|~kPm@J5s7d)yKs{!)WL}Ra819OAz*omtLt^Ov2EKi||9=30&MEK8o*l(3d+X4~=~ z-WU0+_!eO158$@l7)*(#Yx$9ZFV&xIy4aE=27=cRTUA$C8E=H zOr&gMQmeP6E*uPo>sq|65}FhMZyW*l6PJ)%jbHkwE4gaiQCoN6j@(-C4#n;e!v|Iy z5Vu;SSSjM$VXuJY{2#UDr@V4)yF`2qC@FiHBF8zceYT){8QuXqbtCxaL;jISPi>LC zT;B>l8XUL~D>ExZ{4V|ye;YDPHIk$HWiPis(KjliJ^oeH_o;vr@zhIlyOFM%lXWcP zV|815gCagrdICQL%PYb}9WFEjX@?Im?J6QK%I4}MSaV-=@s`+C)8UK&P&8;-p!?Ksx!+Z1Z z`46!8PV?R(eFOg-_R>RuWn<5b))&J_X@uoTu1Uzgj~~Md61l7Cu@<^Yf^093^Upfa z?MX4mHi+~);`~*GZ`6_dJ!n4%H3Wq`%lfWZXuV<)e-zYyo2#&X{-}WG2w1*Szzh6W zalb{xzk~ALL92G5RMJ0zUXw#VVwB<*h6vDO z_}<0y7q|Iw?vf#krRNJtt?J3YKlyk3g=(}y0uJVzZen#=U1MFdmeX|l1k&^R_)jwN z_qqt%$vD>=);FxT%0HJ>7(cz|3VaYq;>3vJ{2b&*V<++Py^-Ql1z9oUuP^-dg&`aN zIYNN%DzjvxwHP1=D6+cTz&GUO{q4rKo7CDO7Ie7N(L{t}9q7=LnMe7!gIOe|uLCY3 zjD4e44EOzF-CgVM>b7HTX1xr4MGIVCC<6ZW7Tpi+zZId^jw&&{Jy>6wO30AK2=f=O zo=AtHafQ?Kkx#Rh9~bjWoQ%e!)4|=CzBZG>+x<_8>BvKbanNSJmj7&X4jCgWChABYYouMcI3=M9%_pD5<>1k#$Sa4dqMGQAxnmEwJf&cF~ z@M8`=k;-Wxq=5MZ55$2J90Vucx5(&y@8k5oOS|5L@g=0+0KAhl!3hV}5JfARzL?vs zifS>eMO2HS2^&CDF6NXGPc-Y%<&(Zc6Ar+DgXzi^Q(Ir|pUJ%jn56u|Bd5}dPp|Ewr(?n+)8|L=Cg znhDMcs-4`l))zZp>^!aa-gaQLIlt$U+g$FsHr^6f2`8ls&bh5WjX!2u8(%l6<}OU% z*{x#Ix6ZZkBeI{n8`JsG>mK~q?6vWgU0wlt1n2eGms=F}UK=0i-wNno8y^mszPblZ zf5@@#F?{}e)je$E_YX#-~EtSe%8^1gAwVOtyA>byk(`sw@TCN^r(2 zA8R=+du_b4<7a?xC%3m9E+%(Rl7&LUE00qRgHVm+hyFkb)o_wuBhU5ja>1%$o3GSL94P0ba^Wrkk{n?>pAeU z>?o{f!@EZVVP2N~fPR90WDNLoV6r6oLyUqT{cA|T3~+4fIWZ5jhj}^nsF)}8% zL5t`~wnhabuIEK9R=aqY3}28oINsIZg`=9(P|d%c4#mJ!)es8dp?(kp6N(TOOjv0& zJ!*022|{}1g+d%@yO>|hEAR+LD8m&>p*}NA;P6mH_}GsX(iJ#S{%yy8aqDzAZqon| zmH{abcP)S$sxWGAOlP>p_-~{*0uD2hg%zkbsAYJ_BXS&Tf=&&!kQ|KzL2$`jG)~Gz zLs*s!4&-c3=DC_*l6m7?3xP{g4J1r$AdecJ$9Oo(&lR-4t_#2sAiIYj8Q%-*54T%)jE1$w)GG zGX@;Izd{e3_XT%Ih~y&4QQ1+Mp{HS{A&1Cv(ulyac+?u4#~YAg5C4D1$@{QOw6$?r zkx+RxoPCP0?!m@sjYAB+)cWsq@238D*1M_JO&nNm}Qe}6XAH2-ay|2A|OoaQ#oe?#o}5A!w6fB(Z8tclzv4m5F~i33d>XyQN<2bwt0 z#DOLb`~ePx-h^KH@`hr>y#lUAk>U$W;n~@Qf#*gMQk=iaN#5P|6u3;%3I|~qTNp^X}DV9_XM7XP`HPIc7v~JfozE4Nvt$62SkYL z1JY-pVd-j>JPr3q_^4%L0R?6ZigSb9z}6kySn(SUY5j4g~;Q*H#Wn&Js zl`|}>z+Ya3JK9UaV{XGQgZ?MUIATL*6p#Qx=muBj4qZIPQTJJ$UZ}$=<}Kn8bN%*3=oCtif(D>;M}#8(2fk4p1t;g?MsVY~ z3EUWfDcs}SNbW)IA-JlQ4?)UgZYuXA_dNF;cL$)#jVXxL z!sq5d@L|!qWl%~mK&2jT@V!5`V8z}8e}%CvL_)uo8D!JswNdAz(!=(V;egQC8Cg}d z5o$5CEg>I7bdOpmcIi-_P{;K$ZYDz%CIdMwRSPo8U^i&-&B7fj;y>E=>l>nRqjb}z z=>LsP*8jI{iU!MzI@}HS>kiT}LCW|)zc)M!7|_lOFM+f($43Y8%9Y?#5P9~l+=eZED5;~Jbu$1~H#W2IogZi#eT330pJIW9K_+*Wsv z)#^nrb-)w&Q6f4yI5_tTuMLi2U?jQ0Ef*`Fnrbv^wVZ}p3U7tGL2tdaIP95)BvBf^ zLb36q?n2ipRN+OCcvC*0%s|?8AW`3b0?9S~AAk71#~*+A;fL?J$7ZduzvG-UdFkXi zle4E!o?{#Jo~?l)=wVv4XkZI^)EswX@i#V6Ziqh7ci@Jwt8thke8@$@PUc2~8{~bk zasJ;9fxQ?mbkMUH!*4%vQ)>8x^5+!YdpFiET5Mf1E6o9)2{Uh)~$c_n|i@f;}1ILmP@+EXYRFtCe!l~04B3DF2GHh7K8l|>E^;!7X z@&ULTiGi^)vzd4JGon(_2gO1OY2ycGc6X);!a~y`(_+&zrX{AOre&sQP0yL0H!U~) z&9uU_(v)v{!Sr|2i>6hk@z0RXFPUC8y<#dby=r>RwA!@B^t!3gRAeePy453qrms!k zn8yD|Iv+HBYx>S~$aL8Bz3GVQsOgyL2h(v=rO9JDVLE9#Wjby8(R9XCWvVt!h#;MR zGW~2iYdUB8#dO|OWAd6Vm@b-XO_xlUO;=2HCZFl5>6+=f$#1GR3Boz13H}>6;4`VQ?vz$GyM} z9SkL48Qhq`{ki+Naoh}8v69N7cdzn5kOrw1;q)Pm(*KtUk2OPJIH@dp_uljG8%hYL zuc7`TA7~kZ;7pB^TYJK_174+7RMBkv-HW*H^&7c#3BQpDNq^MFP1C;%Aorb?TGTb7!h=%7wp+yV)tDZ+185y1f`zg{H)qo9hkco)oEq->wo? zTE>fcq`++$vC-%XrrY2o%IIi#M->d;$S(NRToe2!bKu6_HgNpF@d{j!N`}LalCaeS z;;|k?M`!9L=8oWuDku>*+^mx8oR&HC!3mT9>WXUCO4q(i@4l`DUw>?0d_(r|;J2yn zRZlfU^hxe=hoQBGC4>9+?A#tb=tTLG<0?1&83-(V!wVgV*U;y%dp2L;*WTkd0#cJ=wF#(9~eTaD&6l#lWbpqe#hL zLh=7GK46Pxzro-lJ^0(9IeDRy@JYk~d3z@Kl#!$W&gUcjA;^I5>7-1EBh`X} z>=fYa07FdMo*jR`WX9aCHI)0i?sI5y=&yuC)rdqy8q6J&dfu9J0X~sx&NqB4$a;e3 zHN$xEon8pdAASGzF8fdRJ@$QeJ^KZFFSmjp81F_iBF;-?QPHw!d&1Wiw@SCB5=W3iomMLq7CR<_t=FQ@4TL2=5M$vahh; zv2lQZcn~*Ikfj^}A;kU)yPd_HABJ7qa09q^+2^@u8)$d{tP1?UzX2WqOJzhb22&`v zCPCaI;(Nj|+#2>Z_DA*%TgBeZea9XU0qF>Vk3GenX4^u}O{|f-%3cdzyK?s_H?Sk% zo#ITf+_79M=0?aC=^4dgTDF*LDbTwN@Jnwh-(lCXZ?o^P7oi1)b9Zw`Z=%D;UI^yt z!KHEcD<4p%alN@dTu&|;sKL5ot;TXXCgCQ~2Pwidy+{FlPl{Z@H=dP+m8#JJjxckP{L=hQm_vX6Pedgh|CNc0c_H6CxL={G;^$8%hu7?yev|e82_THnlP6?* z#lM50pbe`x#Ye=H4$4F&=Ah{zIy*5vm>Ix_bYa=DXOxD5d^F z@qf!8w3fAzg)m?Z38P>RLdqS=j!G$=at5zMp#F$|RG9orz5fWv{};j5rENS)N$<#w zhm}%)q4*zT5GFCBm^Lz6KGqSjM=%qZd>Ms{V!A}(5GIQm!Q3a}NBJ*eUuO@pcX1!H za_(EubtnzAbb1}7r1v;cVKnFKMB~e&xPYZ8l+}DiyD`X7q0~4{!I`TF;55a(-tl#J4s@gMnHL!C`=`tnDZib z)P*-{^?w0=?EB&P*Eis=5%oXjk?`*&2oEqe<{H#r>i>v;jhxa#ukVF%h_?MwZZXVk zQU9-I@p=rdo7fVu_IKX`e*ug7zeLoPl)_^K!3O+X0{Er=kNEqDJ))B`N$h{WgwyL>;m|!n6tqa!aN~O{6K^JQ>p$EWFL9^MX+>=!`FcSD2!6;8|edDf5c9K;y+0C zkv%}cROU`)SLIZ|F13)Pf2al=CF*~ae@UvTrrXPoR^H2@9kLHBf)M_X*pGufC6T*B z9EbM8j=vrK|?e^%L9>Yl0aod(m)~kN2!){ z;4ZeJp|2eQj#F7%&r6g5 zpQeX2kR<;o`G|kC5-l*Sv((qH#U=by{_o*l6|E*6_n>kV=V+jSmQFDsAC3}NY+mfb z*hR4+`M`LJooXOS{!#J~{}AOq5&L>p>TBWnsr(P&-U?boYgx2Ekb=Il#0D9ZYMDwF z$37FgBz9>mZI$r4OZrc;f4&6lQvLUU1+t!%`Wi|kt^ZDteAG>^G+0EdMEs+;>0CD^ zF(?C}`cteoUciIED*FyXg}N;w9$65l120hOYQIJoCV$whNN%^ zGdv6$%ci7#k#kGK^#4h~iMXg;g=5|Bpanv$f!$yUQ29g)?Q?cBy9KV){-!d3{ea@l zVl1){P`V_(NZR*V(EhG4{ZHi?dpyb?wZuc$I4*|MbCMkpvd|>^TcUts9l=n&NUx1K zL-C{b&Epm}=>JV@SLjc>MfpeRN1Gq*oYOEa;OyW#7P0Sc;7)HCYfwL-4NGlcN`a)0 zA7Vm4`=`ViY2=^8Jq$Y(CHe0G_B_@d<=+RAAldwqwX=i8x{n5oXcr-mkb-@HKSn9d z!H@!qbtJQ#3jx&-5@#gIp9E{T&6JY-8#r1na{dTNxn%Q8)(+aIy~$`LQb6rb+BP_o zz+IKkiL)?A5Gz_1C|xwZF=wdVu~eJ|MJXlw2Q@8fTxthlZ}^1$MjRJ#bdYms9fk6I z3*!`y1#<3Dz>n>?2&h1bdQQAf1KcQGDy2&KJWv+S8Ki9~q|rHGNdNZ}=abSL_aw`4 zC&FgCbmlANISEz*9Sg>A6QLbrm7_&IAV!=II=PiW`J$8|1++bu1Svzl;T$le|J!hP zhK0OP!*Fdc>3o{U3;K!9h#vvF;t{ZAzmR=(n@}#>3D(I@un=&JrhBgOdZ)ar9JdvO zVs7@|oabo~|07IudE9M6ygY<`ADld>f>ZONNjG_Sd9vInM?a0Z`TA>lY+%QC#A^=|F7vGDr!hBQe=QGMo=5?efbT>ZI1ShDWT$15U>A;45y$k z9RG(hZwISnJ$WCl+iofUzn-VP3@JeDQr&O7?*hC>MBKY&HDWG_g1#V$RN5WH3Ahoe z;A0X4#U2qZ|1o4CsSf7&fNTisBablcWxs_TsktITWe__`0#bn3cQ(lXyHI*>5yMh) zb1!H`mISevCH2@54BeD8J(tP%i7nApVg2W9?^%SZ?kGvm3Cd zlE$eN|5aI`yik4>FeA4QiPH9!43jVwB53|l-(GdgEC=uG4i;#I7h^lD8wItE{yDE}0~Qziam`y>Cq5-B($ z+aud6I~bgUO3&f^9A~Ih&QjrHDUId-0vS%SKoikka0kfzA`-e*H?&W9AEEfa65F53 zA4&jX$N2}HgSwbJn2F+S7y;`~DM0*^B%}PlMpnab*j^HIEhWo9=EJX{_DO|!sgFqb zDQ?t&i2s}5Iv`T8mn>$U0eh6r$7%f$KVcAmNdBqpBYnRP;q4>&^<)&REY-<;VY(Mv z;3wHxs3Th3N69G>|0$6d$OCKx*aa!BP{E$VpthGJ{1fsiLI0-^AG(efd%+=@v8B12~(xIPATXWnb1?NP$RWxKKcV;A{}&xhxs_E$&>=opBahmntE#xmK=6jAOT zXU4;Npbq@V6Kwe}$TRX?VVXQj)IH&{jkXYKe%cFA|D$9y9wWl>OXIHqnr8yDT8^40 zRW_5E1@M%J9oMO`1d1P54kh`g`W$;fNVch6B=rJ{yO&5qC{GAKCs)d&$qK?23)k?oAxvqOT9b|vQl1e07uQ6HYQYeG$=VOMaKa@#Jf4ov zA2zaoB>PwDfs%bo*CNWHm(2)LfV6J}+Y>1W;g{r}S~!vp4)p>tUY;&9%TncyEgxzH zVf{lE_-WCyqW0}LrW!`rFUWh1D4=5!uFoDIUqkL;){;B@IC`!QV zvXF#J;{tLoykAiLKc~U|r#3L!dmZH=3M4GMf;=cBZ<4jZm9?-oxsRLy?u5(#d?M99 zT*9gRBmNuv1wJd)A8lZ2?UaAboV~Gb8i-iAlq@5iD_|Yz-GAPMETKm#0ps|I2>v(*2 zXUzXDjE?zZaO<6ox0mwAu#b+pJuJ7*)r9|#ap2aRy}gt_hP|o%Z;#8j&eg>KKgNMu zbN2R9{uuTq`M*6b-#S+l|Nj^VZq3=-OZj8io8GSm-v_YSN?ST#rzxmKlnHKxA?XE+x$C!I{uCPhy1_zkNA)I zPxw#yO@BK6W&E@JbNuuCa{h1p3V!9Ej=z9^m4A(2&9C8K=L`9wKOO(O{6G11{CoWS z{CfTae#4)Rzl8sc|D4~|eZi=>8Oe^*LQ| zG_!Gj3LM-lo)h1r$N2H(aO9{!YBT~Ve;p1}t_d*avd?y>WW7^4t>_p1mu5KKvIzby zPB@#?BNTbC3=#0KQo%*cf}>1$wQ8+H+s`H2t~*thN3?lmg0Sw%w;%ha=TF+pDuhkL zHCk1qOqOXK`q9}!hP*D4b-L zl}#GBc{6wi4oph2+h2R_Sv;O`^PxqL&4xQTXFFl6@8NUVxpKQr$9<5%XMnR|Xl`HT)dwRj!~d1>~Y z=l*i|osvPeLAD9@54Um6It*B}D9?&DLY@T}%4OtQ0RGQ+ZVWF5os=J+K*0RIx|&KF ze_a6-q8FpDi&t`1cd*YJ<96O#KH|9bnAPp#^gY_O>#%<8YWt^ix6V3lda|%j1@8e8 z2XCpY@qV(RO{ZUKXU~0Pj6gmM2qe3LT~zD~h=n@xwhnLz+cOY>Id2i5Amr6oOH0q3 z$pi;20}+#~t+AzuEz#7hZCqRVopDd3eEGna4@~GC4=2VZCYBv7d^w|U&t561DXBes zsiG3cZN~$PE=c@D(#1o&k)MFaNy>ZtyZZ@!S;nGyuROJ33i6UDIFLuowp+L$_~3sf z1gKk?yL#e>!%y$SUk-gmyTMp$5OV6rb6R7Lbzr0{yCmz~S4P$3R^}kA zo|utgx8*)HY0~AW^KFl2{OhT;6V5QTBQLj%;(I)iJ^!aE8%E4IeAGUy``TTPE%~D3 z+DRj>E&uM?k=NR+oqM|A;`{ScGn9O^THd;qY|)9_G%e8-zFhXr+_@^%;>lTC-aqj7 zv*Wrhsnx=9qeO5t0LcT&^Uy(cM9>QG(E|~nN>x>GDI8anb9CYtW8avR+0P7JC3oU9 zhr>+B(!uXd|M;nY&V9#O?0nPyk=>|?7Edw7)-s#(^2*Af>tfrHGR#i)JzbIe!n70m z0XMWS^3yMzf|ljsAH*Z*mfZ9D1D{R)blQj0OD1o~-DJZ?6qCdTA|wS0r{#-CNDiNE z$nJJOz|5Gw5z?_ygsh+WZQoz?Pp>$;W|OVb6JTVKk@^h3m#It?6oO*b;_1r{rBxU! z4U;;?>N7ITY2Wp^-0Rz3mmj>);)vyoz5*E>6;-YtWFe28S^GA^GjBf{coX_eo6)1^ zT|4O~I(5&uZcO*Mel2-QxvDuy1#jDP9}l_O>Dp{zRgofEJYLH%!<$ctM>ybp>+~BZ z-mU&l_zCLbsaRe3iW_{C?G0Cn4^sTP2ZKq$1mK$7$JVN=_zFvbbCdL;0CLRI;Z%oH z$K1!<uBB4tU@=q&ihC?}6j2?M%QTIEA`e53vW_uKwHlZ`+=6N+*!rX+`#; zz_x7}I;@&N)LxIk^Db9p_z|8%a<-*@Lt%EyL$4b!5c=D z4k#Un0A+~oC+({D_dQgX?riIf78W_9*#Yf{%WZY-W<4Yq_{EcK>-3!5Tp!ADY0=74 z{OZZ8C;Q;HpS%Y_ECkMa^7)qek`50pc;6hGF(+&OAeQYkxoo@3Wr6lFCpt16_jm6S z8M$<+Ae80h{rjrTs~%UBRr*cJUeiwVN&SQ(ws2$D-suTCzu)KcdOaSu8!Kuha?oKG zKwUTK%H+DqmnM31yg3(g0y)~&+O{yhBMC*`ijsG9am$}C-+TTio>vb#HLFMX@ysHL z(xuW_oC9q@q`Q^368x`>t?4-D#q_-ir)e7)waa&%f)g8mt?tw7N9v~vULR{T zYB!0AwLMH4oRTzm}r7;-p&Vu+@%P#drV305FT>4JpHgXC@^S-IaQV;ex zVA_*#T7Ra^&q;^NzQp#5U?U>n31^+KY+0SF&MCOB2~O7>r%NKY;g0M_x9$;y53-9z zD7C`iCFW`QbDQ&Re&)Q&OKs0|`L6qSCr+OFD9H$-#h2UnvRuVM=|n9=qzYKXo zu=$Z@)U|jv=at;ewypN9_Cm+546hoysT>Zj$78h>Bw8NNc2$qzKidW*`mfiXx?3Qn zmdb1aq`VH~{mLX_HSoMv+uFm|aRR9@R%xrW=bH(H=YS$`v;1f^)T%DT&RAh_TinZo znzi0he|P;u@DK1AlnPD*j=W!E5oBo81wrH54q67rO@Rk4yM%w%^bIhj1Z+omfU%|( zg0fNz9fkWUd%{z0u^aSFy+vJBd$m3g*qV1_ z$Fwswr)y94-=3duN^@)({qUHK>AUCI>aWhPol}+dx5|X_?w%K3={IKgNH^Q znp#uh+@3)+KqXk*4U7-^BxZeQ+K@Z!%I8CV(SKv!W%?o=;>C{Lw(4-zorkVPe&4Bi zV5fguImF{v4;T$`YX-Rdi~Io>lw=laYMgd3x?$W}ow;^WRpK|(UKQ`etkvRw0LB{; zN&}^V%0T55a7js=mhwMz1^$b!PASL(k%G)G6O@9gE{l=Ffq|SV(>32^_Y`?5y)}+; z9bCy}AkI)_HwkzGB;d|496xZry6$q_B^VO6pSa-j2{}+>kHuJdxaM5lmFsw#AdKQZ zf88VrKAH3h_(k~{JsQlp(u~TxG3}eoJo6_Y|7lvSd8}4+L`Q;Zwk#05V@ zfcnC>DgvKWd@Ae^E(+D$%iY$Kg#kA+BR<6W2KLMKCWO~e^3M+J9Lap+L^RFY4iU zpgz_#7S2(G<7w6XdMx;`zL`*4;~d`eZ+Xrc$75slZ+zugA@zqF?=|DL_pivR$oevC z@JhpO-lNYj8dEn_dhqjmrOIcOrT3J=C<%SXX`OAg5{tzxfWb7mAY;3I5vmW#-HOiw zvA9d!wW{kXr>pgum@88Lq)T0{JXt&KLb5l`KWy9ADQL5RQ+-tNM&c=k>$UlX z&ixjMQ^YFZ>NXOOOW}@M+;Vxle72OhAr3xBfc?l1zw|f-5qa=gDanQUR{+v|QZx}- z3N7pZay|RJlS0du4?c_yAe0N`{Q|!T2v0gYq?DH%L3H!Jdi{>oecn&s)bB<8-g{tN zCYd7!-!;BB%G>k_%Y6I$R5(WkDLDhWEStc?%p)D_O5U5qGXtwLl8T zZ5iN~2bdG*&qvOkpT0=#jjw56IiPf#W3hcXjI~~{E1-O)$UCxTycqAYFSf66AUzn* z1X!3U^B$CE+tLeaSa!lkKtJ@`(Qn6*svR)L6NEMRp*+!<%QExwv;ZV86Q+u!Y^wvD zITMHjz}Yog_2`8*ayrSa^T%G`&#PX%gXo?No&urO3uE-aJc zkI$OFe!+K79+`fm=7{ijVU-k51f<@w+rHdZkei>IF9<&GsofP7NJ8#P+fv)owB4*f z=6W!{f0wDuetN!Nex~i5S1s!|uH~hlX+RN7;`hJrQ`r=Y|eLbwalv;~&1X3@X_5zk;vd@>V{@xw<%=s_pKb$))6N^$Sv{h;^ z6yZWe?_#Vng922VMq!Xy!Em!0z<`!9Mb1L!8Gh!dvz`_`iAN>&Kr5i76oS#NdNU(KxlT=;wCq>876w;bE0c%j|(yRLQ=?k+tKZPgdU99 z(>ghGkxbyHE2=K4PFbh8K5M^srC06YeLkOPL(BaU*Q4vy0MT_E0EnCDknZav1WxEu z2lc}0D)4JlFssy7rS6|nFai#~J!W1w9$Rgl`Ztejpnz33EQ&x=wEj6=Ho z{<=Dzzka>0uDTk6J`c>DP6LPR?f@~TnL;9Eb{A5n9DpojKAn$Ina}HV%)29 zhix6YW#|_4@%qSxix%l41>s5{5O}AmstQ?FR0PK;fWb#{?2DjQ_Odd3++u;GMPMX? z0}I@_#VM3#mrk!tt5W-*)473s7>ppl^93hdVJ@&d$OuBts82*rUi{dSr(ga>|6}Zl z$ODHDAKv3WaJWkGV`RPlvBJk!OkR9Sc7i#4*bTAAj`!ZHJ)^vwQXYLpRV(+aY6DlV zfwgyCfKLa(D4~z(+j_2co4#@^BU3l;IQhgIE*M?B#J1615a7CT&quke-oXQx9J-9( z6yn+RHczy7cKB(W*GO3H9S>Sxt^jt!cX};u-cxE7ilN`R>f1NlJo;~P63N8Kc+R48 zYD+bhqvVk>E!#g<{g#{LxHejSnsZ6#xyz(h=FZtTWn^#uQRE9cBbl!84HBk^{^=z} zVkBHt4RAmFz-1ZRdNa!~rm&cL|96F3W7(9+`c2kL5s>7}!;Sf^~9=)1V)+SI_gZSM1hu@yF&=w0v znC{T1ShDl#HY96)oMA+2*`7zyFmGJQWbedaW3iDVNiE& zH^iGhKbXiFVZQLBzmpJGISLoF&=pnIyn}w{+m`df@fwx0``k3AF@s#aaH96UL0K8X zFk!ebNqAVucE<7wmIQ>Nw~J@AWw#U;u6Z>-hO5{Y$n_aKWX$;Kb-h*`_VjD%>5A6D&a#dCe6F8TVYEC+K z;FxAhiQnrZ`tpNa&ka=hvQ#xs2GS}=ly(UGbwRH_WY*tzZ#eeSy?tuF&gkl#>KtFc z|Gdi$5}JIx==GFoR#$pkJ{DiLNiMM&4Lxab@_g9mB%DrO>~j_s&!{6<;HUytY8aBD zk7X4wMBa)XQ?r!jy;}5X$;Y&cjD{Z8y<3;g&0DM3UrGhO2+DVf0P-yqv7mEbzt>{OY}440z44*u_OB2j0jChz~dh3~SK?WoyY>a8CVJ40?QH zmJA?pT2uw8xSJC6^-n88HK zBN-KIfprx|&PJ#$Fgt-0rV4WGF56D;^3$VWJn(u??}v&FBxQ;Ud4LVD&S)pF2#g_<&e(;w$!-oSSlK#6=_E9W`*(`?!81 z)=SOss+8t^T0%$`8`rJ#ZfaGM(U+#?KV_CUlD}6#3AiR0X>Va<}2*Q>z zZ+b3nyt2yAm00&|^g_=gr2OZDdu(18ncii3w`5f(1<#}_(j$2C-~%b?`c57BhH~5wR8b)I3_1W;QB6=0bbLXt6>0Kezyz^h4en3oz z3rH!*^VTv9J7A-O6t5@nM7Jzlq9Xdv4?usE9DPCz!2?pPjhvfu<>QMQ4BJ-iJD*0( z#GW=*o2^fdO@`6HU>-PWT#po9${!$=j=w>7!Z5Bg!>Tg8U4XU1AP~*eb?At=x&X^f zFv8%90^to7s|5^>TevhBiwen5_^`=Tavn-dn|Si6w2_}r#r{4A#-bCj{_q#@llBij zUwHlL_TlY?Mbh?yGc%?*rUrHf3d%`9Rj9R-HH8_I0vFHNC&+8mg4U_%*UTA{6`Miq z8{e6qF>^+SZ{vR3G2gb+fiZqji^D6DYbWh4Vrk8T6yVyv9Q2`_bmCcs4EDF=IY5$7 zlVolz_JBN~SZx_$@C=HW-p$g6huqZ7f8Y*1`nQ&W>IuN>j&ui<#$x_}->G0v7GL?; zul2cdtRA<4xXJN-r)|Xsj~j5xpclc^jXE|WQilHR0hsJLg>3cv9*#A0mCx-rw;Vjb?$XE&0BiZ^ zXl|HA00bSpRiHi{xeH?Nf{{&hu#O$f0W$#33#yqqFW2BTkP!yKxQQ=8y=KUT$y6kq zf24%7!FWY|^YfQhHxY=T))b}xT_=SnmL9V>vXWRh`d$TQ5$n}1o)&> zUBp?Y7EVh0M)rDg zIV$}ELExZtj&uRYfP1h72#Js9D2NIG9*zfx{w>Kh@u}K=oFy)q(?htjrjMm-A6U-z zUaCH))p`BzUech_@n1Tpd+MAGY+I+rZZ_+{h7_%-uGRq^+G$y0PCI`tR;A)}TG-YF z`FA$IcphsNcSk{ltaF3SfEOyHe*X(^3Ykv0mUP0f{r(-2na>#ts?@hFXIMVzda z`1vGNbVA!)QUD(&^ICnmK21rEe@brko{h_@eIWmmQxRU(l74PU71vgZMS1rbtLb=Q z6iF77FgKL1z#N>4Vvf^->A0j3 zrKpPP7JrWs1F^qc7Y0G^x{KtH`=D1Q13zs~&2u_4dbdHn537e{B%C*OXuz3v_$u_h zLmRSP#0A=XrfPZaMZ15Q9wwLj10d4@{P?gQTIJ!$M`c~%ToZyYE-_|u^pEXOK>jT}t+`6*o9aKq%ou1;<>Cv9%*^men14uzRGljqDG zn>EjD@}BLPp*4dnd$1xz_ysp0g7qDp)T#%sgV`)gB0x*GN>0(K*+{v+VBV!Oew`1c z&Es|x|FttZpU2=%AaH_bgj3~Ap)BFeeP?BX_gsnJc+#);1x^QaLt&Qf_n*{XgQ1F# zy0c}9J|R{uYbZYf%fA*sd(1g)nkLsu%fI&NIp0PoALO|emFGSR?2n>6->E07XI_E+ zxCZ3;oWTb1^;f3qE*-SNiF{}!fi*9O89BtqM#^A^f|{I-yxOWh#at?@P4y5+95&Ziok!3Vd)w%V9}slA(e%4Tx_W8=>ym-$HiD&qiErS>Jm> zREsFE$%qpQf|*pzQw3)Cwqsk|K8A=Ljc>xJ{}(!tt*y+6RsE*-OhB`&N1 zXagUd35>xUSnTe&T}~q8ZDF>yfJ_6M<}8s%wC$HU!+Oj^@;%iWKb*}tM<&22#-9A@ zHJK~r>Ee6@o__+Ym#dm5wXoi07&&Ge&`->0bY26SA48*$BISr7pARy(B-sRj35oMge5Pmb6JgQB|F}~ z&@S^Ud^rAE0oVA2G6m;#yF&SSVuE^$`T0)#MBic?=GK7x=R(aVE{08yo_vqP*pK0v zI9ZDPo*v2C<{&Lvoq23>^ZGOOSA_Ecjo%lzbWN40<<)$wBKBJ9V?cQ!83yOL3C-e8 z6;#g~d1AivyzZ5^f%3WJUt~E6EcsDjCEIsa@-Rmby^X&EuGMtfMAIddQ2g@wy zoH-Va`U;#=X$Ia{;MBGK&~_{II~Q(0?>DaDD!ICtPouLr3rySPMA*Fb=zI$+H)*bG zYBoN30A|Mqlyu>Ttw)dhJ?`%Dj>N*LV5!L*$)?Db#4@Kw5Tw_{VItNB`8Z(W22MhYH~18dh`e9oza)cbs~%q^6QQB4qSp!;!bD%(anK_ z2MB2gC;C0iCd;!sop=6_LE8OgdLL(C4S`a1-fNd?&&@h_r~gem@xpctr=^c1wAJPG0dgoP zJsIRsDyj77w-dhmkzhgZ{BQ)R!F8e|P}1?!>!2TM&BuEm{~2ewYNl0mdO}LV+>8Z! z!oEIfqdAr@zUXACFLc@H(psoyn|E63?J+0 ztbZ_La=#}t=9_!BPLM~jogZ~9nBO}g8h32sHc%!|F7yya);OSGCLkOt$X#RGU$Se< zcjj{Q!~$P&!J08+kC#vMoz=ZFYMC=TBZEQdA!MDaU~CuAhf8g--hm~{ao!Eu9sZ8 zbg;U5%3$xFK1-d4os-inY>ZqDxZ!=rWDE4uZ9hEu<~PHtR*&7h{*eAu4f)5TA5~>< zXkPQO4@){&y$Wn3tics1XjM|K>&d|qfLNvSg6;6`SbhmN+|E>(Xy&Uq3o!+ ze$g}V;YG9gsBpA?v3v(`?A&3S+v_oUjBXDZd;FZu3%xvwRkExsIwCeGdeKT&9SaOx zcj(8>*Ec=6`oZV-L-}&@-jCN8Ji4EiZ*&&}i9g6LeJ|EIXN43@&6vfNy?!tW!) zjVUUXv;ajw9XmiNsDZQwR{$fNd5>RfGt%KfTcGeG42B3Sx7b>2JzyANm;&=7ESGoy zyrAZ6FxgQ9J>C(9QHH6S-dtM+4U1_o9Dst%Z$LvmH-^E^hmK+dlgM3SEk^KBN;F006I~X?7P7ZH0HXSPwAA@H`;7iH!WDc%yusy$@UbMj)|Z!vQE5p&+q}fJ%QZ zpo&!}AcsN`6)OuMM2QipTuY9ZSz2b`YeaNrP-1*LOZ#9%j4TqYFkBG~P8#83ywJ7` zEE$Or#l&j>$f4E?A%ifc{gfOhuh8#9H$PU;5 zZv1ya*yRp$qhcS9c_g|!+X^}^3r|zZEf&~si_3lFlILSjs%Hw!*bGnt%nL<_YSJS% zNw26j5iO#kA|iqxd&MW|v$V@T^zQp3M!x&*h!MpecpBD0%I6ymH@kSh;sB1 zpcp0JEw1@v{t)Rd7lx_Bw~(R~Nnwy5lpso!kDN1HGWxZk-^FyFZ=`>}|1H1H4@)nk zE18t&NW^sw2Ur|hZK`>+W3*$fuvTz563vOY!ls>;I4M!kI!Gc(OvJSN#T=s@iHTSs zY{Y8-F|38>L@=9kKneJ@7s(ZIR+&R`ateH>{e^+o0;l~2zMLG)j}FFK;s82m2&KRb zbYwcjcQP+} z9L@o#J=DJnC^L(>CyAUnDr7p$Gy-D5E(fsC;xKHnI;~EN7$NZ$=|F^Afv=O0uK*GS zRE8CDg(GLCH)+gxfcH1**1 zh`yoyIB$MP2;gDPm+uXaNYqL|n+qx!bd-BqGD-XDq|F0q{T+YIUY+#n zB#|>BX?X&szS^k$a7IS0CrUk1hCh77E0}lCH;{}_3u0b;W7Nor z5gLN)k|ViQU>(5t3)_{G(zvwvG4X5SbxCQsqSakmclNN*h$PJj18}fG86>5R$OR6&eb;P23!ZMDZtV@kfjfOD%(8cM@ z2Iy+(8tfD<&|_}ml1AU44h9-sAnGvoHH>~J`l9}phC`z(>A=*IfhE^=2E-1R3zF~m zZ}IPf5db4v#z>lhQl{q{M2$wcMYSCw`^GTnH{>yVX&QW@yD7pfrZ;qVR4VvDSOl&? z>Owe>DGd=S7`>ulZMQF&TSmyEQpLtbM=O80Jg$@ z@{A0pGXT0pr-NF;xR9!mKr4<5UCk0`Vd49?pGSHeU`W>6gRP5U2W%SxIxr2)RekiF zInPfoy03Ixk!>lwEz-|%J}(r(9?>Guax{+s8&U-qY$);s!?5-*2vQg&Rwj>RBjL9f zm`)`ae~CfEu%rI)i1(8YKK1jK9hmO%9QM8MKj{BCup@wBbS%q*Re1k&8lqu~Wx5mR zv)IRrtzZQJevU(}F(S9vV|7#f*jhTiZ@(THJ^S_QD^8|CfAzCuSo&G|T40IOzteB< zugSINzE|H__NV8~Twuz;MQ)z&Yq2}$ITtuHEIbeNxUCz#oKN8! zxcp+_NeH^dpno9j?h1(XTS3Fz*RFH3R?*R7{jJtw&wVpGn_9t7A>s9ZnjJO(>|?imFt$A7{V`f!jtBeAw!qjx2E1s)#nztvn(4K;@h9l| zS@baWunpmAWA%und>lb27<^NF@0KK`Nr2mupa;vM6euSeB8KG=Y*Z}DiAG~S=zBLO zpX5m8Q`?jFJ&cpFkxDj79sz}j96)J8%UAp{52X8cnNOzeEE(wK+(uC0WLMy1U?)h_ z99Cpa%O9yp1J`$;{j z><UGhvhKzlG0)nGW1?-hkpaJYWIBlN2x;T7VMhNKZ|@DnU_mP7o`k({<0N6|M`- zgzbVfhr?%p4pou9v?Kb_Asr`#?}Z2^THY$M!Q3H{tV-QF%zkxKv7`^d)p|pOL|0eP zgyC$hW9 zSEK_enCt8b82pH!4UcV;@7zQoSifG`|PXIIwTM2?d!_^*6v&V=)!y2E*=N5s6#jAn=2!-Xa zy+d5$4MrJY^{?0(N_Tk>XuV%yH>fLl_^k@;LqxC%x%e9k09tGOgPU>Wsw2MXa7A=4VH|vNIe(kyHbJdr;3ZGw0_rR6}*no(plo$bZj$>Pa z!4)J-&8v70mdOD`x5o%8;a*?EMnt!y(0nu?T7vv(- zfhM|QV!B|(6_o{iJ7b>skQOa<3CmEf;bod2i2F9B?-*#4fhAxYabX=w{-nKq#oTA+o3 zs1*v0fSR%i2uP8oBAbYapil*yAUrovz+G8gP~@o~A|e6}itL-qQ(T~B5!8oJL7_tF z{eI_8CR?%dovcb0SJ%x~7**&cwc9)+eMddm39A-*;eCpQD7QMn%XL%6|5 z6dX!j!O7|NsxSJ}W>qgkvBJ7;_5)_JoeT=A8UqqufFY=84WuxO`E=?(7d6|5oBwqB zdn+regED{@;a2;lKz#vM`ky1fQ513&b3J^L3J00~6;ghoi?y2g0_vxs^^3t~HK>F7 zkE6Hoy&Oae)*0@_DE$id5?haVg>5c*dg9_SpAK5o?$Nf3GO5R9!l_*iSqIjM^;5|& zR=!D&4?1DdHdC^o`?H&`qVSvlRWJBlro$Xo$|aOfA}MExJVH;mDnH3sqpOaru-7i% zWKU&?)|`3Zo&1Je3aWcr%I~jPLR>|2CmOs8ny?psRR)*s^W=Z3AF6`ufN&0!@-p@J z*NBCCL4HVfQTjzq79Ree#T}*FtMW8rRST3|Enh*QIPq77z zqe;%S@KwwIG}JN@7={FS|bODa;Q0`2Yf3p%={`ZHKe<~>z07G(;X41u) z-wL(=A8v-ke=hwi17(|{Ux|_`Wgy*)`hmWg$U1=Phv4$-OMSI{!CnELU|OmtNOn>B zWz7|8rob@8Y*%7=D}XG@|5q5(Scuq)^8e~^D*MygeLd;B5l^HsmaLZj4or_Pg14x$ zUaWkBVSJie8j@d~Tz90GG%$f%YL7FKXd~&B5>OY^T0otn3py0VVnX zDq;aHOl|-D)qAb{&roSp`04=a2?Qv8Z)(}c(#G}GQ>z}TEnlUT%735+2&cakewT7r z^lG-DSdpL#mCcYaOumjTL;c_u?N^99maVFnT>w=ON=@zmdiON6{m4hS@jZrSjM1nZ z%^I^){Xy4M)FK^`)<*cjMd?c^jXj`z?LW41QJu=v`spP5DXjdHV^vt)6l@k{snRc< z-~4CO-`B#+Y=SR@YIzm$p!&|^p>K`iyD5F|q#9Jz0aUI<-H(#*t@c!TqI0;s2cVAM z(YGgF)_xv;I#G<@jVnEf?^6fyEsostO{MI(sobzOV{HbxXJB;hN##Y1?|r1YXPf%l zKFE8o^^u{+N0WQ&{NbgWlr0z~o2|T=UDke1%IOJXvc(6d&%pOPlvC<; z0$Y;cGP2VlS7kB&=!t7A^0%K>wsKaSO6tGx|4&k5#*nT00W{8Rsv<~Lxm}6bdHlTm}66UxH<;3m{WzNA46c1H75zbDuj>zs%7Su+f z{H^nu?`0c9=*ilI+N?lz7Y`F;%JQ4@R0*g)5GqfV;AI%xY+|$CxZG^OWqq)~5N7r2 ztv)g1gB|<4DXtpUX2Yn@RWnxh9K(tQdj47ZNEREBU~X6Ua@;K~m-9%()(+eXaMRPv zmN_@)u5oS0J!9g<7&A$DMI*%p4WNR}Rd6?a!{m+)`RD zqGxCHr%W~MK>p9|&!v&MhNWPhaE;nVB&cJfiKYazm?MB))(`{A4Pws60e*(hv$V66 zHy)z`Uy4|{k-FuWe@rSK{-ZEPCh2Jv=^vqQfziSDo$ojYI4)Nu$cOBQk$3K7m#Y$# zVRp5YpcLT^hJPsmnI|@z*z}tANb{x>n>jH{jMCl-KSFmS?T__-U^4PR?_;0Sjw6)j z5pWlJ&7Y<(NXWP5*&X%*e8E?rNb>^vp6`2BZ_cme7`#IpB%Vm~YNUaD{#p7=oB^HB zZevY#Jd)-><>72>TE9Rgm%itpGmN1bT;?&ezI9ZgO|xTmbTwuJ9b?}jA9{cwDI<%m zV~;@ji<0JOq^u3I(uFE!%N$isw4}47c{kQ=*w`CBcLV13+O5e^+&3A3R#U}c1%x7mDZ`#1!ZYu&#;}(I=wx`<6SQ6jgYaEnK#+s#3Un zfp8C8CSk-=^ocBfa|B|K^;~}QGPcUO%K7a=X_1RL@87eb(x}qMMp*HEMJS?=!K?tO zu)+rPzK@2m91D8lK&lvso-p5^-an~GT`ybA=CZf2O7IRgN_96NFWiv3+Bxuz1;fe0 zfSK?2AO+rGMXI}6=j!`3&1ldlMOdIt#ys}6n6n_w{WG2!IcnBhn14qqpAAR(osUxf zXVqZyVAGuqOXKcyOm2M@2K~mNWr%~fi)lHfOe0HWcwU9EL+t7 ziP1C0=6UIh)?pxj7Uh33azB~tn$vmnxGSO?C%4zxAuqLp1-P%qMdoVH(OJ)o?7Mht z>(*G=Xx)Tqwqft5*~(pl75Bj>x@sczs`{KU4dP5U+Cfs-Ji_?a<&AG zJJV(l!ocpZ%A$OU(+H!C;EuYaCn`leRXxjXWwjHkP+NP_ajL>qTB&Te&OK18^o z*XXemCc7Va_~FN&dT#zJuPqAldy&^`i(41ei>;6E4bSP`#VSJj&LCESuZa-)mfM8B z(e~!mqt6IZE)M5>FW#kX{Jr)=%j8*(MerXmo{WTaM& z?ommjlYhOYgXsl?B>gKlztC6s7w%C>OB<58gQli+zT4*NE?raKfFRT2-tP9z7;G07*IoMu)$bC*r;oi4&E6NGNGZ&`Z*mhCkVEa{d$vwaSm?5oE ztP0%o$6yU!q%y+U`1$ci_-_%HBdrv7V$`sDV+JoubT@t<;cYN&X($kBeZ!b5$-VTl z_u?shMOP9xugG)T>`}JKT=bSv|APWZjHwK$hFF zIG^ku&VD4@?RYTbp$wSl#x*@_X4YRb-pH6aa{5SNBc8ppy65-HT9&;odtlb{8Bb(9 z1^-WFJgYvR^wBTOsC`Kuy|V^^-kZH1^wKU|uT8zsCzabl^hH@WFTQ#4fW_f-=P~2^ zL#Qp$_YR3ssC$^H7JZM!eY1LqzjA5?`9~iA-qVh1hxSKg)%vr+q6@lnEx)ywv3J4pZ{e! zknxr}rFun>lJ-&$kDV7t$f@*%)&Fmb;^oHNd$B%2tU^x1sta0ik%yHZl+tujYX5ho zxJc;$-Xf(7pk&#mG^UuzvaP0}KjD2ZLA4vXi~S7cv#Ls_yVL{Wi8opYDcwj9RSut# zY6gK{sQZ83Bx;2~y)YK5pPZ1@6C}BO|My6XlZ+5hg9=Q8H(9YD3}-TVtPTo0avD9| z6?Rrrv!ZrLN~L=4%K(cw6rc1p<}06C&MZ-3e%cF?S@g0x^)(X z04u0SPlQLfM^B4n31S0H*k3V4b!K{KCe~n@eVSd5o%wKH2!$L_Mo%=$*Nf#gI0M;< z&HF(T=#%I@gb6}$T6{!SY$KCpiKuvMccW5i!Z@nc#T< zVcKCsYv;(7R0`g#9v!pe9Vh5`q92T4%9LNH!Nx;=6g@3G)I~&)$bV2doXp7_K|~HR zq%#zZAm#ME7n9yW70gMm4)K8Iq&L3;eFx#{Q0<&P7cxco-bpKV2B&zC!|#06N9bB$ z>rqu<7ij!|0v=3{Gg3_k{oKg8k;Sd5CXO7+*usS#g?ftkHN&zkoeaYNA}#)?9(k2X z*Vf6{X5%>U7RmrEp;brE9?sLzo{0t{@;xE|6Z&kFA-(uCEPV<4T19^ z5Tk389HVQWyqHy7c`IvLZz@Yn+RB#q-O5(?ZOzheYR#JBZrl%dQE%4N)thz3-L&^` zoWL2+23?oU60@4Jtb`a{hh#hJb#pQ^$HnSw*T?EIaN7!FbsTpFZd>PAouhLa8`N(; zdnI8$>t~zK=GMnMf0o&LKg%+3+d4zXZR-LZx2-Gmu8nmg`+;}=$JnvXdN!zk3@g5= z3o9|<}s&nFQ z-9J^AhdUp4C)_UF&YSUmGvw_9d2!qNLhsvHSKJ%2;~vll@BJFLm#~C?%BhjtI^)C)MY)@;GHx&` z%42M-ew<}&a@Pim(vUr2{?Yts!lUq)&bB9PhkheFU>cb)6gx{L`N>Y?UHlWT<>oMzC*ggce(Y789MgxgWtW{L!sO7O+ zV-@8Y=FppCTE#f(ihpnGnK>~x(adv!&a*fPBG*i2MVZTb)KQdq%$zi`o}#p4U6aNp z_28r73tgdB=j|V%i)4t@*YW*_^HA9;De>SO0eZv674+%rcPOJVC61I&*BcDjkDtXx z8w{NDh&pu)^unN1&-k*->e%hk4pLH2NT^Ro>n8g2dPzxj6B2CopeHnLoKU}hQc{wt zH%P^?>^58ddi4?#5|WdX>(#R**r0=R6e*uh2Z3POu7Uc2=nWc;ew{jA_ynrgizAYx zZn4CfN%{0>Y=Mu1QDULTSuB>=SgF@#F)&+V@fDGDi`0JyL>Kh}`RM#9>{<{ZmD)!{ zA6c3y`P6rK^;rhYVBS>c&|&LiolO_Pby->MI^kxjt7e8t-zfR>ah(>w1jTPcjf zES}^fY}J1@J`_pLx0k=O;@!8GMXXbu-&?he%n{45^84*|Z0-B2BO>4ke{0uBdKl#2 zQM_hmvdrRQ!5_OhbQu9P9E$KIm3eDspFX-yOouq}Hfsd#S@E^$xI1l2xh$}wa zo4zL#C#JJ&JnO;l0o_MCQVEE?%oHxOq2BUu|eM*Puzip>{b?|mzN2( ziI>p{WP?28X9#yeLGsKS@@@yp>~yVXw|HK3zUaJ=|9jc4+?9o=fR{v~$HG~~gh!~7 zIR3S_sK6e-Yt-yfv%4&Ny@!IoghuRUMZ16(Ln54q0^|tGUJVB|9G+aDGTM{*O$J@x zUUphFcbFn@{7^SlH7@~*bPam(q-t*S@sewoT$}UZq7LV;mX2Si@wadUv=M&JhdAqK*{svRLhWuzv_XW)%*<5p79Gt`}WVpu82}qV2`oM*ojLj+HL=8?Cd3#ku|`G_6VQR zfj!gqU{}3&{N@sbuns$!3Z=&v=myx+aEITVhJE_($8Mz9FE}#IN>{m6F)CzMrMF{; z#RB#kYW-Yq$*jEHw#v4Z*k2gtO6;4q2hyI!=;3!NKYY`Vv=}YM0;5}+!3AfT<7`+` zUbF~37RFWNSBN&<3k;Tl4|c6n-Kh_Ouf37hNPEDn;#l8j_Mpymc*lC>{&&<`5RTu& z-NstmCfL?uFS>lyH=RaW%8uX;Hp~5I$$tj?_Q#WUp%F?w(>t<0vm5Ifi>G%%#XF6;>WDgMskm}b@e1k!CC{I5~X zr;$f~Le8OGDarpXQ0&9Fo*U?s`8YV9X7BsyPpbR+x#6EqSYQZi0sBh-o8c52#x8@@ zyFqalIqf+1RxN<}9Q%#UaV#i4j&L?0PsM;+Il`NW@r}tax4`MWS47+iQ-Zo1S{|s{ zA>UtxFK(xn5)@lJr?QK65rJ&2}5gQc7+1h9&B}Q7jYW+Q=HsgX!tRYcvs6uE z4?F5Q0 z0NH62ocb_?UtZT43a8dIXz{gp{ z5%sD!|ND*Ahx1PJvyV^ePW7zVOPIbtaGq?~R?6#Qub8bG*M;@Z%{vwd#-I4N?ht%T$*-rCJbADdFqpE_A%X1>d$06mv zg?ldeVB9#Wo!Mf*aeJU8m4sA}^5;gz_RLz7JGQt&r6u>pNcCAreJ>fH_O~x7D7BwX zo)jz2h_6v`E5lP95&z(1d-eTQ$6wgDqU~n-M^cKqK|!fL18m6rQR&Ia=UmmMZnW`U^mw$S;c%0)t$8Xp-l3{n;9QG_I_n{sjbC;{Yp;YN!W4@vN6&?@FRJ-kCkD+WABTq5*zHN=IKaQIs^r;LVM$YepE$0Y* zD#Puut5B(HtLH6~koL5#B!!>PCg704)^X$V4-TQX{QS;1YA-v#v~-?AZ*i*cWzK$%32_I9 z92^oCH?rj6s@*srbqsvW!=J`dc5uk)322{ebjm56PC5^Jq|@2kbjm56h z#pOQkNjIkS2ENM8nil{As!)i@Sv!%t^i;>&D2j%XHtlZY7$*i~-XS=FF%RmJ>AV=F`PX=e1GY0!+*nb9Gdju!vj-d=nPlt85OAfjTAZc zBvqPKBTvy3C7xQ~3e~*=XK>O9s8v-J!UDFab0X}q4Wh5c{%oWoBV%!jVUoRZ0Yg4} z0yR~ovufF@xXIL@z{0tGS)~gn7*4CcFT$MCswk&nT2U_aEW7$@Oly`^)F>?_^`4w8 z)gqx;x;?8IPrJt5sL@Eb33ge{9Sw6jOlXzWyeOqvn(C=hnjd%B70h+9C%32F0wbvYOH#-r#H*a8K0Bh7{R6$HBQU9W_-t@BKnn%H>6}{WfsAA zZc2JidZwc&Ju^E!HH~BgkMTKKxoORcAXk%=>})V=Mv@TI@s5<7w4z4onHfYxG0Mr! zD$31j)+jX_!dNnST9M$LmYI{*jA+w}V$uqx6ilMg&Sq&iItf zR#};8MLZ?5C_5*s2}EcNX1eC^3VG6CnbIm7BC6bYqpa+-)bZI(QV^DkB}GFpC#1k- zygfZLmADk;HcV@l)&g+>muAf~NygZ$+zv$!K<-0bjjF{iAZcGzR1a{aH)>SWJR9tr zHyh8h8aGJKOiL|lLOv0rtfB_Z(o!-=n9}hLQkpeOPiuBfQBh1!Wvtvq^1(TA#^U;qA9@ab;o^x!=c5q4rvZ z9^@~ydu`d-^3%tUpDsUJb`HlTqi#Qoy7@S2N@@iz<*xQ#%moRPjrSUGQpxqy`ciqK z9wOD`Bz;wG_2%{!^NZ~V3J!?2k6KXSPV{N9`3aLFOLdC#x9bA*<53g;tkRb(TjOf) zE%hi73x){#$)MlKHnEvh@*?f#f;jAvhA)IiYytYa@J;cc2;YJ5a(9+IJ8D;}K=?I? zqoVeI(hPaF%i~5|HacT_C;I;->I14z)V2t9EOb2kuqDFA_gn&-=JsrRcIp^gc51er z-dh0k<~WC-Idr-bt6Ep-arl(JvUL@`{{qa9Vt?tQ(CI2E=vWHT4!^Lk*$Zeze?gs2J%~%C@1@*vYKwEQ_U|`u&&yK}{3UmqLrC>0wSnh4kpBr$tzvCPLf{QeYz${qjH zo%{M7d29dDyUWkCxc|!v^?&!5>=Wz`{)@kV>|tI{vA5WpTOk668O=yB5C~TEFF4Gs z8fo5`o8wT+3b&UmRI{&qlNo1L*KxsO?`jrRm|5$v7kQOkbPh{hm{BCqnf%BtPpevhj% zzcLs7IU8=SUild5v>3VN3f?H~#{BEs4$L%wz5)K9HDMj`9bo`dJUcF5Jz_<--x_Q( zxYtj8M?qiYd3@(NjQ{0sv?89glu|{f^gZ;!k(=k%I6phbUQ~NqL-D_R3TmR~D!W#_ zQMGaM;a7g^r@T6Nm5t57f0S3z4?cokcDa`Rf3p2Nx$nD`w`bpE8~DV)2gi3UTYm>? z@6UkkPe`AWs72M)2ys=psJ)6SD~i3U8FgnBzGy5%4ImW#|Bp2`u-egICMEv=C#ZFB zzOgFj=dXYM`uh)dPkiEp6*b>kHUT|=Bly4WXBo7uVJB1770(5*cZ>Ch*L> z7P(S3@fC;uuaNS3b1OIJ9pbvO=@wM{b%<P0e6yZyUK}+J*k^wb6^th zTXt-DjO?U6QM3j1u=wq%?Rw_-Y!ROyFP`mswu^5E4x3`>Eg$!$Zd-N?OC6TF<*|*i z8~yez;#?g7E{xnvli`^W%89pEnWE1y}fm;R+0|yG1!U=F7 zir{NYtdtu5;8Wb22Hq3DWgy}%_{EF(NLeVn@LR~YB_InZ2|bmc8uwsXM3@v`@kY-r z-9lsmjl@^R{j+XET*anaO!6LL`YcvpAaL+w5Wfwv9~Lk14WRc~x5}u>LV4Gw_F)je zU8R?J5_&SeLKX_|d}$$(6*&0u1pX9P5#Im@={sB}9LO()865W;T^(Fb(={e}cQD;( z3ddlFnkxypZ3BbD`?T9<-EMXDa`iCvG|9V{>DKcgDDnUy=*vq!8G@xGZne`w=1Zyj z@)FRi9cSVo(}DEhw2&c5J`@(k{btj%rl(C$yX5_>Yaq@82*qHVS_+!=r1C2H$hda| zhXJMmE_n|$bu@)zu-#uS+x1lAAHPj4d6E~UyOc+!1L-7(%$HIZd4GEtz2I=Zv zhsIsv@QUe%hll#&FX~{bmqmRg`N+7}=CI1O!gPb_Zh!o@JSOX9ioY!P;boBGe!jGj z`BLhl-W7El#XgV^1qYc9q*GeRd?|IwCp;_}chZC7k2XZDf2rP}x=`{7mUg;nx+|DI zIR3K!C5Z`#&{F&PjuTsk`f^ciB!hX%_t0|xdAAdVfqYn-!zzEil(s zBByPMm3(T472qi1A6gF*Jz*jE$ft;Z_lI8z!7sq6_M4;>I>rBPS9jA2SFk+c=~0`@ z#cgCA5MB>bm=~uMu7NtBHUcW?dMQ}d2T*dG5q#=FU^jUZj+9f7Q9f|?9 zzp|~nWZYd%3bP8cqMAgBwz_H34Ql+u<9@-s@8VIZQK^NzaG{IZ2cmD)r^Z}kZk2Qc z;xFPQ!#F<MX$C3T=Zr1qEE-t*P>wIpyQ7uJueUs$iO zgKIp}KRT&l61BgwtqZP$Ytd5LxEe=gMr9T@R_n-dh=0qZhWB*8qWe7!uV~mO8tFeC zeT;fh6h?AXfWym4FZX#V=_P*&32qNs-ZSWmLHD%0q9yPfr}lMZ7yx|P5&NQJ+p|1yhZvG2GrjRl!Z_^7OU;yXODfV_J)Xuyea+1nG8|JC{t8$SqPUy zv`Irlb#!{{$DcjUw){pK7B?=!LdI z;x)e|N!udm1vSOJANqSD{!$L&AIgFFY>N#||IoY_ zUhamwDE>pyK92HZ8=U^4{81ewViQ{KmY62E?snaSySphsuljTe|MVQ?qP}kJ_*1&~ zjurm_0)60|o;O9sJQB0zCLew(J>q_kKmL-lhQ}_VsJWKe)~lJvY&Vm2^^nT?2Ccye+SB6An!?;q#lU>iVMVF)NSWW|Jr?E@jpQFmb!>%X#B}7 zybmn@2dv(V_{;kO*h}7Jrt4gtT-W06=6cZdjOjhod#=?FgIeAfz+Te#b@g`j!7Zp4 zs~8Xuc~c(mX6j_R7WZ|gGDsb`WXmn;sKA$mfDc)|yP0~M`rz)XQp@sxp+0a|Q&*R~ zFBEnljHRw%42Uj}dsdrnGX=ty;Ra}zm_Y3c#^5#6YyPl_S8(`CgW@iENDO4(hiWk5 zA#XxY#=XoG&OuTK`aVSOF-WQcD@a+kf&e-Ok4=)J{k%Wh0&Xy|Uj&anI?wqua&!5r<&;0zGFD z_jWxub)z~Ua9!Ii9D`7q!cB`!0oq}yf0UZI$+Qj4e=?;6cZzdpyhYmQ;JbCWMA96} zK}sp(?HdD%->&i{-qMGRMX+2KdZ+vtpc8L@1Ot*WIDKWGA~>J>`?_j+i+Iz>)#lXA z1L+PM0`p3Q0vAKa8Q#Y!2?eE_dk8Ay9B3Qogcgm0F`~FQB1j}`ycgl~V z9Lw-6W4juQC^r7Fs1F0$HlDf=;!8*Bx zfBz2VAmj?j7jTnr;NVZ!ZT`F{!<4>ASACLS-?*QYU&SA3D=`o>wZl}$d?*k2#{DFH z==X0)P2mX1g7exv@tb_3rDE)<8T^EP|CSP?oT=l!B;6)|UfU#c3rXR>b1;TQ<5SolBu{`ET!LypdJipcVRY4wDeIP0LXeP=^!X~UwipE`UTRtNm2L7V^QJoH3s;#IH0~|0 zU|znmsNyZK7Gttx^>7Vqr(D*W@*OOdhk- zE70O}EeyBlhUjt)_c0@atc)D0Ph~9)Ep<=AHG$@k8>vgyHPB6CZSdr}OuZ6$ zwXOiJ#Ir1^Jkp!=o?(5`he;nLtxp=IPuJhA6Co1M8kVQqf@h(@tlyCIanexz<%ZUV zEllvI`6X^9xIti*|HhbxJ<^%F%g#JuVbCz-o-#+QCw14E8jb8PMT>-s!~>3GD%2Gn zw6+1$z&#a}Smscp&{bVifi;MpDvug2g2e(3%s{KgMe@+4daeN-L@?pvO1dhPa&W!J z<5_=DVLQ7oYWHZ{zfJsc%-;qsY0Fx6=wymd?-V3Cvscirl|of12dg)oU2wYWr-Hv1 z94t79Ic>DVtG_I78cJMyXWf71xM|N?5C_JtahwfiNvlk zW0kSWD)%b)o`P@TcGOP(5dp8l%JSE>lUG?ja|%U*NYH7QZNa~$deQK2@{c^Hc)oe% zqcvsThf3s1(8)@v5;>K5N~#`mR~c!#EzP#W9l;uB;z@IpFkcg+fVfMX^q-TcaZkyRasu)@p?UEKeKWZY(|va zIkvo_%v(drGi9pLYFDN}YMasl&nZfWN&g*QFhhrtvOq*C>|wke}UItVXwHM^19!!^^`K=OxtsBmaZAm`uI@gx0;>G z%kE@ly0S|tSN1BW`zZ@fFF3dFH}I$dE{E;slm%`@S)hzwkX8PnVy!*_{uIs?XFn?F zUe*w(<-=5>Y*Gr!y#<~iLA}cUAX9tgt0R-AGDTMtS#7McR$41({&Kx?-?_c*kJ&|< zO*(S+NM?Cv`SHP&B8pO0UREv{EGVYc87IvPiVM7M1X2@;S;vHla#}eK>7G>%E9Vg3 zU(X&?HYziev(qMtLki40aWaSaA8SyQklVc%24sQl+TaRw*aWov!-s%!9vm zSbN?3$K%SBGUd*)8_Gs6Xj=YWml_>aeIKn^w|>1cLg{ye9~@M+xBc4EJAmyvYw!C#g-X`QGxDCX$w`OfksX}=$a8*YxQf^WPtJeUfsHUi51+iwPnv)e=IIdkl$yb61* z`R(qo^*EY2bbXSBhlWS+dNnOSX!$|Q4}tZYT6y^YsyxVkpr&gGXb5NsXb5NsXbAl8 zAfRqqT)$rZdU5)?x;U#Y%E*2-j7^S>jr|lVl0ES0fp5LrKA+<*IrZxS@3MvIeq}V4 z6p#MP?BQcd9(bg(I@+&vx@J>#Z?OwW zIf{$>C0{Y<<~FHuat~zMvG@0@RKNQDG{HW-DZFhz$12CK}Jmr@E-o=e%D zvOJ|z%3Ub~QqoiUraYdqCgtsvckmX>{9o~&nK~uak@{Tf#MI@fLsGk@ZcBYNwMXhL zsiRWgO?@MEjxQSjijW0Qov!d-$NZnmxmT}O{4~U}5Kgd71299T-@IXz+Q_v_Venf1P^f(a0C!flJ_9rCa ze7i2350&%xP*iI5q1OC}uP~5&2$0STA(_@s?&Vlv3G_Ah$(#TS67_^XBbpBYpgKY}uUNrYwo4Gk?keZ$Q` z@=|>kiXT`7(nD;i~2@bkUQ9&r@e%`Pn-*H!W1O0NFR!}$`A2X10eoBMr2mq zRkP}fhuWU2MNG9p98`KL=%iGBD1bh*m;)t(^}7d25qMQyi9Pt8ue}cV{C#hdAIS@j zQa<7jI8{N(i-<3^|AIgbAI93|-xq9%FJcent4&03Fb575R-GXq#vZdS$L->qz&W`Retgu93MZiN<{ej*~5l{{MRcrXpz2n{T=1;UoX-nLLiCN_Q~fj z+PhC=-zgG5f#+*{KHP#vpU1zmgu;;lM z^Gr=JM&Y(vW2{El(bUrms3^0+qKmRvW8pt0DmK;{6Agn|@WRs=6=RN!p}l#nCQM;9 zVQX}{5r&T`P8_#}-#A6hYJxmwgl&Ppi`_&^{^<_qBTj0^!6=ABILyO!9vWzh*8k zoy#}R<)(T3u6g|BdHm~n+&rK6n9nEA=PTy(WAl0A1^ku;e8~cScmZ#@kk4Akk1pg* zUgV=*Fc z@zhuO;a7RqYy7U)__EjdvDbL^Vt&hFK5sFvSj-!|&bz$MA9sn%m1n%cA9#bWeS<&zCV%5iZhnjByu}y4#rM6%%}e>!OZh!Z`NE}q?@}JWjJICK zr!3=dFXIt!^BdmgZ@tYe%lUK5`Sb7amGAI7SMaqf_`-Mjpq2dSO5X21e&9WR*D7B3 zeV+e5pYT4PxSGGSnwPKU)(?2Q4|tak`0x+-y&v$GKH#5!z<>FG$FAYGt>N?6@CIx7 z&b9p9T0U$Y-?NSnE#t41@xPaGi;OM{fHynHZ#~GLKgcJ1 z$KN}`d;Y**`H_z}%D?-GmmKE{j`NR?^UCA=qn~-Z6I^$a_c+PlKgrwv!e{@&*{^*4 zue|D4?mWdmImNA~`JyWRYZX_jc+_va#c%x9-+0m)Za>4Do#AcH@axa;A!m5$8UDf< zzVZw|e1<2U<(<#+%d7dIYTo-C_nhNv&vAPVFRI~_YWUn5zP^UnQMj|*GPd0EX1Qf= zxh1{AQdD7?SYcUFVcB0{S-jtJa=&Hl0n5GvmKzRRMjW;rI&8^2V!8E*<;5eGAC6dz z-&UXTKL~B2mfw~J8HSifX zC(9QMfO=o@WsUQPC^Si6p-vpmIZgQl-9++WFP zRMchE(-Y6ScMhD6K8m&(GwF$Y8>h?yTV*?v?J2r4} zPwD@IiId`Y-Sci~!2SAm(*5<4-S=;saK`=m&^N$;b8A8W&ZvHq6u08OH8HNqs&;e7 zcfMtHN=ub~`oOGihHIj3eyZ2p@x<@p!b5{bj6c%pwt+XmeVU_AABx8Gflp8T4fGr1 z66>~WyKi`Mub(sxuUwQ^b4~q5j4etGzQ}z}OX1$P zbn7sp|H@pLa%0;?iG%G|)g|{A94lhaHeHl>XXNcjo3>F4>OEFE_=Y2VZu6CiKlopNFPJF5txtCt{UOa`b=t|<|6?tx(Jz-U2cgF!upO3fQ zM@VQ&LqJ17LqJ2|A4Q<`KT4?4X$WWtXb5NsXb5NsXb5NsXb5NsoCkr3^Vn%t8Uh*u z8Uh*u8Uh*u{}&M$+G%K~C!cuY@#zmf^2o!pN*~^FuV>1n`#*mF%@?13%xuN}W~ z@Q|Sci-r^pDjs^%fTdkKUf;F*kp8{9cfP(;$7HCa3#w=+(*@OkCzi41ShLQrtU8PO zZuP1EPMQC4sYZ|f$7utUCUz2r;ND{#IqDdT^n1b^%xtAJb3WHfdl*Ze-HJ8PaQsdL{(%bRR}+Sx?kWW z#Ph$$Z~;mD)*(_j&#$IVo%WZ%Jow;44?q0KqmNFXG2^kvAD=mM=B!z>X3w7e1gR&X zo_gx3r=NcMnP;AT_POVue__s?x%1}FU$F4S7hihm<(FT1WznKnph{rhjJb2{UE{{zeb0o6B_;RXH)-THd z;_~Wii(g-|G35khG_3G8PC8spticq=;eI0|*6de--0-t|)C6%E1PpVg+2vQpO z2&C4!Rc`a_rdf?M(j937`uFSGyH}6yT|2w3>(s&7KEF-gl{J@8A$j~CFx0<!|eCP5JPROw@)&hHrJH`MqKM7b8p{{yF7I>7({ literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 13 - After Ganon's Tower.sav b/saves/ref/Chapter 13 - After Ganon's Tower.sav new file mode 100644 index 0000000000000000000000000000000000000000..9b50faba7e397f58857e3fbde81f0bd66f3ebde3 GIT binary patch literal 556355 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℘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%0D^!{at@2GG;&IiZ{arDnyl%}_(SuBVr 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 z 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 F{|6U{IS&8; literal 0 HcmV?d00001 diff --git a/saves/ref/Chapter 11 - After Misery Mire.sav b/saves/ref/Chapter 11 - After Misery Mire.sav new file mode 100644 index 0000000000000000000000000000000000000000..7429974659b38bbae37292d265f7f9081878d1a4 GIT binary patch literal 553094 zcmeFZ3tUrIwm7`cIUxi{a?VMDrV4oxJG24`0Xv-v1bHY`A)wNsz7iFcI<2uUOP$&< zbNgUg5$t11YgJTgRjS5_*eX?s*wI!bpv;}CJQBdx86`R4(bg7nzIB4y&i&u}{pS1r z|KIoQIh?)MUVH7e*IIk+wO3963?bCN4WUH>0O0y9JQzG-$vm!!j0rQ$QNJxL-1z+S zFFgPJ#*H@Og^e%FoS~d5vp#2ySiZ#gtA|Xg>~+O!))+%)C?%0LR#j>fZ~XnnjnBWZ zQJE~Yyy zRBHn%2w!EzLsk{Xtt1Vm6)(%QYOf@;`1yvekQ35wS}y( z63>!hVJn|C&9IoJ%|C|+N zubNvNYT=oQO$*KV!h+{)*diNYLYX*!o>gJO%}K>Czxd2!n+u9oE-SW$KOXW7?+FuH zWqWwGDePI(uT3wT)|nMc3kyvTS<^Br<6o;RdM(3Z(`4HgnkL&qo_~6yslcYP2~CBj zIi~xpk&iyQDsQ7n@T@f=%Nk<}1qMbFJLC1r)ZEIr%-1UM*KKPH3pOt)FdJ-a_kzct zeeOAH$Wzwv)z+0o)=;y+9JZ*S&>FqmRJJO^6k?tEsPzGJn)R~<)<>#wXPv%nf_E;T>+^b0oCVprjXg$Pnz%*Ch-dy z&zcn0eP;eDE3d>%nuTVo3%`?wDyWC>NZRiCvW)87fCq2J${o3bjaoMK( zR;*dOZdplz39T?qF+cF)g6C|!-xruIg@r|n)>-9GTOZh9#pcZ_1ZH6wk3UwjYK4tj zWr};+Iwix36)jnjyV9h!g_wBHSgEz9a8s!b&o&8iY|^5_nKP_$YnCrEqu;JBNu8mj zBUhVqSI8$lx6mBylVas-uVpEtHcCvUXQh*Jt>ANG<|%7!;zE;r zj)|SJa@Mo!%<-!VpUf$LJ-hNZuT~OZ;#ar4y4ECp)V#pVH(|3(Ab^!;jC~28hZK8``&8l2D zxANiHWtAzfRz|#DIrUX5W{zGBtBYF`tPid<&$i+PR;?Mco+~s>&$0g2I(1&LDP@Uu zl^L1j#n!iHSL$9j{dRTbqc4=ru}y#G`GQT0Oz|6Sv*wsWo;T@CViPh69yO)d_;XBz zNjN9l#LF?Sf5v=2$gQ;InkKKQT=_aU+HOMb|#daUSi zE3tOL5@W<~o?2!pdSY!sWWLlEYUaJT0`yyA-el(4qOBp%@K+F4WD1|V)Ji~${PCIqfc+LMJ6Yi z)Y-FV&z@t9fWTR3DY7gw2{J;6C)O+kw_ZIf^Bl%;RK`j-o6v?i(nzb=9AcKO0qK*A z&1mW4<`7%{A`|v>*2+g$T7@Re`k>V~f0b2`v3!Mj%ACy^rC?yOO>BAu!bi#mlj_;o zA%rqoW(zl=XQdeu>tt{(p&1ohQx{rQ)*|ba-`j|!WTWVz<&PVA4==R}7Mdchv^8{{ zjdBVlT}VnpLPL3ct7RR|4++CVLqgY>9w?q~(!4xp zjxEtzn*FC&x4iM@>*5s~xwfxmTkw{>Tw~DOjF%xbL-~6I!hV3;|bgA{% zx#rXot8AIcu=>Rpt-QI`sn(EUQ@Sa^6l>zom|+ymu)e>}CV9y!D6x`HtX*qd@*7il zc216xlA5EQU-(RxB!gB)$|9vwsYE7`!jD8ErDYNs_dr7y!~+C1JU>-H8telM)bMa+ z5a3D}JAswTCh#1$yO=v8B$0HaB$C4d&7Hnr7uVuYZ~+u41@R_D$|Gg6$Y2j(q`^lP z91S?@OV$UnvNxKEr#BXw60>JNyLOgrr9{b5gCfC6xanakxbKv}?mljE*(8~4vNSRh z@N%vPc3am2bUf#jR`2id6-+Dii&@iPy}s8{u$m#^7w-#s2zT zC7Ul(vR_PAvI{3EMU#|l-XvwjBqafevPsHNxsol6R8F3x?3<*VIZ1g_iJI%V;WilF zj5tUR5O#vgELiL}Wn4XRVO-KNafOjwZJB6jccU2MiLjBOvS2%X0vjy9(IE8X@V3$2 zqaS>C?Yo*`4r%ovMjY(5AskmA^bLwaX%8TD9--<0x(^wU;UIPpLk2^TO05jzg(0;B z?nxMig(Ad*^oP6ul}m^om*1uP3A&5&T7Ogfe_YAi|BgF+{YFzBF7mTs8d8 z@b+&{e>eE;!1uP%>e1J}`^$I3--p~D`2Js?`Cp^Vib4vcM{&roAqvS*lpLBG0PaI_ zD5oH(6et{SaS#Cx_-|*ZK3M zFb_9dC<;MB4*HsnK{2S8?Pb@Yuh_3xB$kECg8i~!KZ-{W0Hqp5BQ4V7(-He1c7wga zHnOEG!XIM|AU1c&5shX7r`l<=RHOHg-hW2@bTp&ncHGY|6@dgO46TBj2OCyPNyKFv zSfCJ!%TO6dnGO#JmO(wyx&sE=zZAb%;1>)0Vu7D5plWUV{03TfWXl@~r!oE*<=x{CD@=8b{2JPu+O9&GJfSOJ-G~ zF-%vR8WCI*^aw&K z&^2U*pF>|(g&5ZeD{2p&w+{_W(av$*>W;NpUdgw-%ix_Wh|xa~ofcyBD8BRtda1Jp zzk#mUI}z6D!ml)i%~>8cCwsIEzf!{}M*o0c**#i?yTV6T5M{@=1qW}#E$^-%jCEq; zS#bp#pv(3r+rzj@YUg)FZKAGHxdU`m1!|S=T=uP#Zi)Q1nQoDN+d{{GdzSWoAiGJm zbyuKGvaceerbo8Obi8?yFQuO6yS{IcT^d#4HzV7wPU31=+f$=zuG%yS5CBECjUVRV z&AXNg@bQ63Mqk+2z~uOWIoc_QUHpqf2$sfr169OvD~c*oxQeY<3YGC|`UX1pCDFn= z*G8QCia6Iwv`n$Kmi=wHv;;T!|DB`+@a47~JKj$HCY-o9W0>Ov? z+wwT@@DPBpmaxowC4S~~$q?fz8D_dm7$#h&-SQ>D5N2V-z?2+TJR4OaUL~4itw7(U zKaw8L72}7kmR1B)UI1>qsAZ#U+xTdp?P_`@F1$0y+A6Lrn{$Kh#E2W=#xufB8t;VF zf@LeiJ6Yn&(JRf-(eviGx?2{vl(Z~r$#2PMF;_M{Ua4AW9Y8Sss&Md{k?TQGUJM@) zGRxKr>x`A*u4&^g!u*Huk}`&0@&^|mw4SQ_=FJQWZ^?k}?=zUISJQQWy*jCa{BF`; z^{9*b{;unVkJ7j+9E@o7ZU(t^y;#U%N19}zgMj+73<9Ee|j(_{-)J_aP97~RWyECL3xtCo{%HmzJ=!arGZ)pB#))s+K_8S%-bn~K&i z#!oK3T2#p{zpE`_G?Eh=%^EfS?R0Vcw-1WryO)lC+azWL-{?>2UHGZQaVsp$IK?m9 z|E1*>a|OTcs?1W2WYwvW!R_`)F6X1XWw7=#N*t?vSd}BrL1A+q?FOOegtgPo z*{gFmS6(^V*$kVw^C*lyipN)=k)xM(exKFZgj>N8Tw$C`^KPK4Mb?(ZKpu4W?-vIh z9`?)C1=f~D9J;WqcH#GnIP_!ImV7HXowd^)oTWWDOSAO`rsL+R!n-^F5bP)mmfL`^ z3?A@Vh_@hgRZwUZ2#rk$O@Yuf2>l0m(t~4W1zDDj=sWfJNMdIqKAO%s$}Dgc>$$T; z%UqBMWV1|ED;+u3mJ&|LC(3G9d|$!|S*N0JYE;Bur%wdP;6P8!zx6H5LO+_6Eh~3bJZ1hati^0KE*DxGVOv@oTc(;D!bfUcS>NbOZoAUB zn8ZX>@+hEKPyL{ahZ^L$vYRVvpnzZuu{hS&Sq4U0LHtSJ4rYcM~*V{N9}lzJ!=$U&mV=@IogctMCqrHYMjAGj#}Pr z!mk`1t$}lNHx9>dizF(l3eRE3M~;^Gt3qPQHXV;UB8{_Y^OIqx?ETX3tuSjd6Bb+w z!k90v2he1{y8azfNF;*s5;)YH(pf$IdZjt9j$aMcynp+_p&u815*y_DO-dJxJ}sgJS;J+}54L-h8}m zl)~FaF`})zt-DhV?@BQuR1~RrAUUI8`P%i*zOd<~%`e+*ck;5LGuN0vs8A?WPoFLg z4Bt*pLjQ3c8@m~oBFcSo{?gR=r7KqD&CSUcKRR!=8FHD`VIyH%!s8St676B7*j2X7oaH-c`QIyZ{0kD!u^uG>1*Ey#v`Tn+_!eH2|B;k?Af z)J5uUQU3reb^ZFc=+<}Wsto8R2wbhLi5L9HI)KL-myLGG&-D=%;?}YY&BXPuh-u9P z6JhzbhWN9KD8`vzcXiEgCR|_Zk_HHl`fvCBjJoxosR<_RE_KMoCPEi!X`OPT>|8T& zzn>8VyOvgsLeItX#Pw$4+y#O+rDe+B`v`^~(odZ0C$95QEX4?*Z(2XW$e`BFWkdsW z%RXv`$XJmJp~(987UDt^aqAp$5yS=7!93@QNNY<-Nr;R8_cp?XSs~dNAX>!(SZ57! zgXrAN#pf~{L}{C#@0;>HHp)(J!8lsse= z!1RP`3ru>wjeyNpdTxNQZW$o14-hWljgS`17$JpB1G6qYcb%x%0CJCAzfM3^VVS7! zG|joP0o;{ig<+WW2AePi*F9piNdDeLfVG=CU0h}SCnZ4Tke~>6bsw!EmW{rDUkl+n zbB}`|$N^RthQcCqjD9i$$04Z9KXKS0Z^3~BC;<7yAEcnxIXA)RTgAZz6uOD3sbF@9 zXXl*6sEcS(jqWB~5||vw$0ET+qNC4;Q~z!SBIx-LYz`eS$$$W|i8GTsw-GJz-=3b_ zSw*zOneUqfj&|-M!6e+}fAPQMPyG{r>OcOOd)FQAO8EqLh5R0Ou+XKSaliC`g8L(p z6S7aeZ-V=j`|fhTfna?)!Ln0=emMo~2;RX6K_?Dz?khs4;Bc)Ru5|*}O6bDDrosL; z;%`}yT0&aMQJp22soJ@&$pdpOuio?W>-`g?{RB*9<;cLV#a#UrIGFK?Nb@6+T=|lW zE4yUIvl7nm+aTsu5m)0z?XUuNZUrt(dL-_86A@gtR`g9Ab4>sAttR5HM~O$`zKLt0 z^sAOlaAy)WGa-M!PPp<~s9R3XRa+59LW!0QaELL$Y}U=V1Lw@}3lbQs zCPQQNC;?&*Ndbg79%9@$Sx4T$pSKe(E+zywC3FqM!-@>V!E#K9?uy`QFbp580ww`_ zOw0?kf6Mx5f_um-yMF>};wNBlkQhGQnVTj}U@F4emVvsJ0?8;!1MO4C)=NeKG&yGOIUdADLxk|yuA2`6`E8t@$j5}O0-~3(JPoLBOJ7~fEEAM~d{@3q^ z?`UFw^Q(t`wKb|SYVXvQQ^ixGr^Zc9oBE03yrN@@X9_cgouZBEpUUz1c|VSLhz~Cn z!{H^R7*R+9Z&fG3+sG;K8ef4_NOu3U`;+g_yuW+ezfU_ct$*5~X@8kks{QbOnU<$L ztNkH{iD`|gi7AVziiwNKig_$%eaxho&=@S{l;(wLf7e{qv}r=sM>QX5{;bK0U7&eg zW7H<8hLr!I+^70dIY;SNTvE-6?uxQ1*G3gbWlpgwKU99BT&ex_lse7vm>JriYi$fR z(teKO;8d=diO?hHHxF}Q(nDPNKV1L2-!IIBFGJwVh~S{R6-q(!DS6Z8YQ&lo(?->) zny=N(>I3R(^;Y$9^&i!rX`fP?)XUW~)lX`5>KOIDY2B*uX>TYRR4b?KQ*BetQ$6{s zzF)Q7kEt?MI~2cHq$|F=U#*ZRhNGLJ4@57EE{k3`^~))xQ{IkV6a8%T$5ZN~-&Rak zHK{hL-_X9J-Kj16C*2WB0Tu6D4?l7T_|07m`t^*YAe=mbNllwD)}4M(DTPz<&h-fQ zbqlBNJe7gB=`ski*J8~!VkK`LpR^vjY4(^Hs9Wh_(wwhh<5-O2-e>|fI@1a zI)ntZ0<#|p?1FqK4+v&Kc|;H&geUn?$PwfY6{OsDppbgO?Axc2pgBl#T3`T@W{xoA zG<;LRFWtL)7jmPBl-s*dM6KM9A{!@~C+;+>kvkm3szSnDQ~gN3Z=(4j628qf{|Ks3 zv4^QxJEd?WD^5aFfG$w64oXo^DH?*kpHs07l;S8QJ4l6p6eKuE#h#=T$0*rhD*R(A zWDjx^!qVIINcfr1kHU{3w`h{0PHcCaaIC2p*WIZPIqE;FUvpesfBZzLLu^0(+38bj z8pVyLK0EOlN9Cvo>f_?$jw2iFtXm{bxjXJ|{V$I%<;MTd2>=@WPYD1KX1`l1NZ%^R zs}L4%k-StPEP7M2^iRT-ZwlhJ2($hqx4bFH+M>^U6S?IUgY0%Svh1`x80ANnJ(idl zsCHTuu~5Blxeu1wvVD~d*49^^*LHhTS3^K08x|a z=n%qG;oy4_`qCqxS-w{{zLVj>6-xL2=eRfCjcGJi#>Gs&=FqBk;8`%@$vyY#9Ms$@R7s3 z{6k!s66~Fzk#R5#2`#?85AhEDm({&3QO9kGt+4aRV%T!R6J-8Gl`>Jq1}o@}jJ;il zB=$%H>|==|G6e#Jq&{-??W0K25Sf4b7?OM%x%l>RBsm#beES5FG)At!{TY&g9Z&>^ zh-lRNk#-Ac6_tOeDX5+p9gNDa{|vdMyyD~aZay!62X8U#-ASsH?K^BAsO}cGKR~t* zY<{%)1L#XnskXhB4v(sKpA907Z7K?^eeh}ZxFXr$~{9yNKem>Va&7VC{r35Qje_?4g4^`)sg7@Y?<>$)v!E!NI&I6aq z0TpP74O@|L2gHW3-4KfYgoM=`yhE6O`&A@-mxHUrw+XiL!6LvEA}SC7JLuxdw}Y&= z1zA_+%m$`ggRFs?7H*rgRahn4BK(u&PhedbT#LeXxhHGw(4vZK0V)PiEQoao3=V$2ahhPaL#So(p+L7loQ83(S8b$7@depX*g7`O@YM~@$!$K z`0P~U>855OY`YL%>ATyuhLmop+R9tMZQI-Y^?!crU81=1?QOi`s;%#Z6mQ+O1)wck z|2xVp+h7MsdHJ>QBVSy52Mz~#KTHO8_y8;bj>X^2c^9~0sMY{B(9{V42N8s8?z+nJXS{IOwVeC{1)P=W`D*roZ@lAg@WKgy$@y-e83gExq=fQM$-w;?STwZ$n zbtFFy-Uh)6ibGI@!%|9wu(DyV!SA>L>;0a7l0DL9TXUg+RuR>a8m}iz`HQ2xE9g@8ur3xNXSVP z2KM2a_qGW%^~GR&I;R*!#2^zmfSN#Uiif5Kk{_X*zuMd%LBm??)i60o31!lew7 zLlQqCp@|C&hxWNK-eSk01H9RFyK8xhy&uAg(eh$25G^PL%>_HcVBJ6$j28czZ~pgBO2_S7;|_L5LTe5d0c^58?`xCj_7ocX09fv7gzGHNY?k(1ThFm5YQllfL;#M$cLnYI~YR2QgtWF;&WPsT7Hsag) z;F<&ke=zMazMXgHfoLJm2YNog6iOWSi5-PjgUz|wKyR20ECgZ!3?c#yff!&Aj)2)P z-fZv(-WE7Pb_KU1q}Fh*@$Fph4$&8fj<=EUEZ2mE!%1%Mkc}ePhn#Abd<5exyH-J# zwu^-}%I9*rY73XOaY#trFpB}*eivEZ<=XECiMUkGvW+9!#vvhplUi(C3>BhnLfgA? zv{h((TWG7&qbi|os}=#g%`LOo;M}ylp7c9N`QX%($!#!~e48ASm-o1$iYwmbime>$ zKXI(fCbn4<5;k)kPGQRJpWytT!9T~x2Ju`{^-V{8EX(ZZrgB#R*$N-DV6`j!?_s`nuO$$`%_ zGT0YzT)zczQ1U((47UMeII8O)sSBRiLdeB91caT_P@RC4oj{y~gJFVjAL18RSL?a> z%L`^r{8~32#^peKh}MyEF0T;D4Hb7kWB$waC$U>%Ka6G3A7c?}jO~nNVj~{7|AB%B zZ15|D2Os$SfsO~hd0^}T^@H;sL}&v%Kfm1M;1&VF?#~ctq zxDKB1f`0QcxQ@bg1g^t}4{HwxyZCbGx`R6W30wyc9+V#pb_ul5bq96u09+q`{IT$3 z=sNES*KU3@XODLKN5bveH*#vUZ+s+tUt6BCQ(L}6{=W9LlpWgFw#z>Xl8S{FESujG zp4aZ#BRp^UGXOO;!t;yX0pOh);d|#7y#>%)HNw3?YKi>9qRrdoKqRj@zvz7ccFK32 z&v}mncF51?{2729J16u!b@H>5pPxE;>Le(P?rK;M7pEzxq&;$1x4UYCGV)LEYE=gp zryVFJJOKKn?9sjnvufW+`AA#2NB$A$vsYWb2QU=?RMf~n5rS--ChvVL+8FT$K@A(zOw(WO25+#_|zESv3!Q>gsH zg*WdhMC&l079LL6^73-woBU;OzIjjB|60V_kLy%cu;P)U!c=>mAa~#11D4Gn2Su!{ ztrgDP$6vB<-_J#KhlBMcs;BG%yIpP<*4b5u1)tREKY{A-VfkU-*($iHFp0-Y>7+pMOBG|6~2W+MGS|y>1y8^^Uxpf#s=HRaL?&epQux+qP{2c;s)q z@rLjX{u^(|!O%ft(;mTKeNYtPF8;1voCyW+$an16A>6^=u|v+;5gyf3u%xh>!a8B< zCo1rW1N-#{RCR)bp9t$d7VO>iv8DFHg$roW=33!L`TGPP)#~@|vg`s>P@so&IOhlx zE^)w@t^+6Gj9JbvFPCrKx>W#={Oz~j7QW4Y`)xTm0{nScWhDo2Li&Eo(Qn_rUAUdU zeLE+b0G@vmQMiW>Tl%Lp_x(u2eg>(}W2 z?GC0!e?Wgm|Cf9HJ$fvWOjIVuCr*rTPa6Eemy!s}BOg33T=q`QJ2h|Zd~4_3n%g#9 zcd++@aM|_?|8xWT2Vef3(eh>QyrX?f_>TPiJNmceRaIJe4Iw{YrQhn70283%n8=sa z)M$4K;TWjV@05S|q4opehw}3u>OYw1+`e7=z7P(J?fUoS@4cseR|v=7d-`{SQa*Q2 z%Bl~mKHU1j)(`I1K`Ej8u9WXx_@|pYZNB-{J;#g%#{{i~%j}1_`}i^a`Jnck{BH^0 zdP{$v6Zq%dcLm=m+_@8agKBKw{=V@2_hG1T*#Z0U1BZ`Il=2Hg`vt&poDc55V80No z0ekq9!=LQmcj54bU=0VIaM}J(9QzL1CrXau|E9z5uIv0#|6+k(Ebxm3ezCwW7Wl;i zzgXZG3;h4b0_l?Uob*-cLv!9;`0hgc!Yd1X3#E$^7HwR#cM(~rE<9QYuQ`^SvT)C# zk{wT8escAu)ti3!J@HcMOV?i7_j2>gn_t`f+PaEYEArl{c&BkU_cZSQX5aC{?e<&t zxMOk0R-A-?-*E5xf1F`i_ouuK7?hz^IFw;c1cyPqU>U-d8~DL8G*}9t46O;P{QIYv zJNyl)holzc`y&T)_dKC~t>*gGlMI~icS zNgk*K8pCQ^wd1SnWA_>6uYSh1rTQbsnXmqKeQ4}|z4bP1fM5FhcHO502Vh%41P+h| z)=dCJ;QLQS9EKNw|6jlX_+20*ux>*T!@mm%e)t&%I}0EHF0FMS(oQQG$Dd-37wS@9>#?7sJ_-#|;NWd%7;3+*EgP`@zPGgX}umkiGh`)rDD`G_*!z zNX{g{w1?sNYfDjVJ3)esb|1AIE@4b>%3H5*$M)@vM8kah5|lBATy^#-bf! z6Z_=+bP3}?(Yk&oI@{ssygAF?t{&)hP{R>aTbv?#kMix7N7X~~Nyj70sOH?8s$9ph zG%_SrrAH2Q)8Odv5BnTOiFhC)4{zC%Yga`Z#K#DyTX)v4Fe?~GvxgqmL@cEoeuqk_ zck7gn`6(S3HsmK9m(o;Nk6w}Qa4c5OU8ZVFbfEcZ$3)Vh1V^rJNYjjqCON$Exk{x% zhdW#|XUN~6+h#Q_!2?bbX`HkYxt%5t{2@FIzw6STnt=KTJuQxLMVf9PIu$uY zlIbeM%uI9~pGvp)4Wm4Vr&;VX{1x{)albcBsY~!XRhS$8--6Vifr=w*zt93RH8cu>v#CP zz42qYl-(ImDg9XBNxhTq6(KT(M>@<2iJeyxqRfsya(sT;Orvg3YfN)=M#u@$sX__3 z*B_VWc#_84DMSEw91qN0?};Yr9Z_l6c;1-tYljyhC(S0tJ7U}k(Q1|W5r_0EeFuyC z6C6{QF??Sxi|;wPjD2_a%;iIlzBEF1Dsvojjvh5Jfq2HZC!OIrH^1D^IFzIOnx~sD zf9>3p>le?5SHX_UdCL=ZejVk&87%sWJASc)(hg?eaiMSTx&6%Xr6b2&-#JOYi^Zmc ziz-zL#qz#*lar*F=yW9YI?;nfv@{@LoMZ~bBAQ8aq%7~ro3hd?bvo5{sd>exrx#XYdw>7<0Ryf(_)D zby<||&!rL^Qi6xxdeWnCD8#&*8RQj@L!luP`$k;TooeLErAS8Q_##TDImTdmCx!K^ z(oint)HIWRl1%7zPH!LAkQ5A$X)?9Xyy8uB`0!@Yg0?i)ks@gp_x;tuIth#e$G5&GNMpb=-Jx+)xrARLc1lE&4#ksaqaD9zqaVqy_cuEd zJ%}3eQT0xRaj68U;MY$VhxiiX4Z}wrhT+TS+|kkjrw143>cynkNimqmJr`%4RJ`9w zN2`5%9zT29=xDea@6_S;JW{O0oFwC;6exmrvdjEBx8I|5$S&i4C4zVe`)>HG^52{G zWOOG^%`-kS%R%}5ea``s35jy1F=9W)`nk3#d!hyVWD!!oBM;a7DQw{Ez}k=iohXx$} z@!_<~(fBb(8k@qf?vxRyce={&rUE)g_kdC@PEoN9ONWNq1cbykOCfEjTsdmmi72aj=G_xBWt9n>sFrS!~Aa}1xMJa!|AJCrObX{MCJ zd&U{llRV5l&!H1bMDvUZR~&8eG{!jnVn>okOqrDZ0msq-a>N;tcHQZBDKVBI^BmKc zw-1e65s`bOdq+En_MrzI{ei`L<6mnS$J7jzpirtt?j6U+?jFZ?4}5eU^Rx3W!#4@_ z2;ouIk$lxFOI$R`vVlwW|A=TZuN~8L;Kh=}eN~;vLgKw>#$^O_%?C-+BDXpJ- zKTS7Y()%&SU+cwb+}x}|wJG+|f}ZQEMEecC=pkhAiE4X!ny*}x4plSBm&P?;-)`Su zFxbD~$3AShRunTs-0Dpf?RPI6sq2qSxLDgZE=zup$q??(Oglm-bt&z&UMzih+?6b@ zjR_27N<3n9tzUnwN0QL(*qHeE0wTq!+#%rV8 zC_vJx!Tm`JXMi_|OR5{!yT5s)w`)$dxG#bCBR=ED{cMbAcyM4rcP*083^^W|x4*L^ zz9}=_C9WQdYkSBzbsnl#W}Q|AMtq6;wJF{GN(tV!UzMon8cu4{z0=n=IH;6HU#j&d zv}p{te8hg^AkvZy8MR-Evby{v?x_wDwGrCS&#ZhWQ+#QdaI3Itw?E#e#j&1hiH9j} zbEV9vzUhz5{6WDERnvwZuP+%BR+FCirg$}m-Z5k*_RdZ&_^^6|Cqu_vyI)^EexjM2 zd7XKu+R8e5M@(1ys|zkUK%_uK^<|B|cR@fRsy>>bBt5zrG1a%uJo`g)1`=1d8^pfT znF?1mi*?Hq6wFYyM~TfM-SI?q429^P-U7OsZB|Lho*`v*k9PSdxYU?X-8IyUDPyRf za!EUu9lp1)yL@1S1XrHKXH`ouM%+s*=&J73iY_uz{dhHwn2UXjluR{)QT_tVrK@JB zX_SjafofKRkKe**R4o~EAxuj7sws)L*ONu|mct*gj*UF~!Fg;R>;I9JywYSCbo(%tEl1cmr4@Gj zt0fw;RcaV_muD-xaW%yxl_&k(v08BnA1uf9ZFKY*da#_)C=THip)9{OWT3US&q&IX#4c_0C45%-$xHYQan~h(d9tc!h;q}tBt;6TKMeS4+xu7yW9)x&x($HKvnp zOe!uPbk8UlYs9n4GgWMN50Pc4Rt&n66TNP_e7skZop-U9Er;K0Qr+rBZ0XQ*KU{QY zu1cpB1M&SDz&B82{OPmJzbk6%KSc6*W+uoSH+HH^8li;dSB zONR?h7bQ_AM@kosHD@WWxmBfV^5R$SWSz8B*V@R?vlsnP-X_s#R6d$6S<&;HO8He6 zDy4^L>K~_CrKJm^4}5}UW&Tj!gQ<`PXU1EJK$jQG;EdIqF2XKdC5HmuC_Navv-uS&|&T$YLdwkL|i7)y9-4vCLKAop@=|B9)IwR(6#(fup-6 zfs>`DajiNqc*|Q#XD^_}-ASqv4Bf7t)D4!L>Pa%)bj?^@vNAocYh<+=OedM4 zAMXher5fe69*hcfm)Mc_)aQ&kvqXnc5)GZSpj0B&(t%cgOlhXr+e6Y6UG(>x%-Jw^45||46W$yrDv7s zXbnZGR~Hv$d3kHrEXs;5xpp`*TYs{#r^xHBiI=6+3>bG~i_@MOT0+Nn$U4(h8!MP{_wfXRlsVVnAO1V+OLT)W=99 z;;tUHRIO1C-twu{C5nKz*XvKtEQvVTqurR1z?3jjm4t}Q(v-|nGQA8%lO?xWeS?EO z)?0M&bGNrglSGzaNd_@X{I}F8OV0U+~AH$fU{v^`dYsg3~ z8FXVwQV9~4kdjQjL9ND0B+0b*bB}>48T-mhvR+?TN#iBIL{0kKB^WroI#EKGXf!yX zjgk0^hR(EZ-(e>eC0(suZYAmMDG__|MHzaLsAy#NDl0iOX+crM$!_iQtEb6I7*{iH zP_ax2>G!o>Z1b^2*L-J>H2RWPl~4>W(ZqmWG;J`b7?^@(X(f5{W-O(fD{b%jfr9E9u3xNoq_@7Zn&ZnMo>4R)mSKUF!~{ z<(7zU-C~s@@p#cce)MA6RSOj*ES9{`puv1aSJoCAFP`>GN+@ynC5SOpQ7eo5ihv?e z)P06gSyFFy6iEzvr6D^rv1r!nLT!xb8e61}p)Z|oyVYId?PZjdsM}T4p;dYn28*i1 z&pAC#(?uFg!q+Ho_JD$c?(W7$e~~)jKTh>vF)>9da*Xx5n8c!tf@F-whDM9{k0q&) z#-J)1CP|Z#L#HQZ%qlE?zDN-<7J%fftLVq8x5kyq zaW==@A(bW-W~g!u$!lYHqlJYzQc0gjZB$>$X?I`z;8b@{ZxQ?z$oM$x$8+=~NvSiF z=p2tTdWD0XJS~Nzdr{b>F;xS$H#ISKR?|w9vBbgz{y}(Na-axNrqV&=_-}_ z;mk}`Tm*~MIY`mf>SYl7u(#`44})Q?4+kzwvywH8?_n&nFoR)TRBYOU>}ixv%)~N` zC^|tQz8c%JzF zD?*+t^8T}!2aCaI0ksHAm#9<#q+=v}NW^$V45fs`8UCdpB1uu8m$~;ct)siUr#mJ& zE9Zjpd96`6&`{z7_!AU^V z>#~q0IV*e3+J;~g8JBn5rFriz&As6tbpM)`NFG?H6O)vbwJE!BP2rl=S&KGh z8e$9@4pX>j&Fa;w7iDeA(j);*Og7Lww&t6VEck>Q4?D8!|J758`3)$}OH_Sc~ zUcOV4~ zp7bO6;|qK3yeR|9mQ>%YrZ%(8hIO^IIVm^8Xy(bS&Sq;}~CW13o} zQBv_h+)$J0vc4^^P1Dq57?ZeULR!?+Kj=>#QZ>iheJhS>E-hha*qxfOrJhOcD!VYZ zd6GL(m}hSefhz52q@B@^r8P&oRraxz_Q<|j?w)S@%@vWlsynmnF(~(VV5b4!nu9ZhU|2EnEEM<^w{@=`1Db8 zX@mVNcD5~XiCST&&Q5CAjn7lr)BBm08qG}5J*qjxN%?-XtCva1%MKoEH~u)6QlCW* z`))c;FMI%xu^&Uu-G+Hak^K>3+A-9;OKqPwEBe79*##FJ&4%ela;lwHIemVojIkS; zfFYOi3hhHNPS)>?5!KA^`C--Xq}^fme$7$D98HR{8`*fZahQckrR_SV*N|%02O=bi z9bUKHDfKCQgN9tYnv5beN0}jevs9sD<5k8Q?I8KluWEH2cAp_dC5{4hoLHYTCSE57 zW2*YGVJA_;<^>)t_#N)88G2{(Zlyb7R?Q~WxboQKw@^(-mtm7WI_0um+RV21&?%H% z5$%ySV?$m$G?Y3I(NRM;kEzzFgj9`#zlU~DH~y}M8t-`f+jiBMJx-P8$NHT^c2cRB zPpLZanuaRrqiHjjdVt|jA4%ovYUX1t-|X%8&9x__sio zg9WOVh-caT&M~}dsVa5g=+{b5l`xgeY{y+wtB{p6Uh#}3RH10W}=^fGa=bL10T9Q%>=Zi;kah+f3%b&$0x}z~QN|&+ey{pf} zc+;iqsIf1e=S!cKAW0Zfcue}9M9))w1x+#fUX3p@FqAN?A0JNfq`Bk$DzgiBsZUQ9 zt9Wt!qT%^NCaQg@^BFttky1@Claf-^YVT=23UVl&)u_S}uR_fCgD_v$2AO{tQEp*o z1M5d4(LGX0gA1vZes);g0PjsxFUH7x``lDA>tu3IH>f*u&-kZ_nSCQk*lFL>7qt77 z$}gFf8KjlYh85lugmtWIwKnRU2|@;<67&NILSyd_bke5S*XkW zve9v|>$0Ym(Zn>6mz848C2V}3PHVV2=_!q(!KaGHgdJjKgIez$py1Q_zDP0ogTs}O z>$uF;WX?z?LmHxy*vXLOsKec;l4g>;HI57kWF=i~z6Ni)igpjv%6)BJ@E<)#3_JD} zWPWY`u5f(UzUe(@|G`J%m)JkMyxq5)UDe-^ zhGa1}F|oU0oD}D?m|xcb=V6q8x@&A7`Do$Z5qDlzLxMEVt8xyy8iZ26M>Q|W)NtAG zBOd7KN^MXkiBu^``Fk1`L{TE|m-^@i?YJgBa@OHhUy9T$7SM~e4Y%;zk%H4%`Cs^G z-x#CdiBG1_jSMs=&JQ$TgE!B_@e|mF#L@g-YN42IKo^h1T{pYc4OjBrlvWb(HC*fw z4dnMouQy~g8D+FWe669^*HPg159EKrn&9()!0T`5@;$>a*V6+HE3XWxqdw{Tyg``l zcmLJQBz-YNVY=3#HgUtZiS94fcPtqAg6cC~?DsOv7aG)OYM<4i`l8)*tAlkj+Ar8X zeQ%~avGb?)YQtBDDmRdaxBS~B{>H=nntWHmD;vcLn7Je~V zCdH+b8IFhXawyw^Y%VfGkyKNnl^PLOQl705acO|kY{f*QyFtoZYXRNor97Er&pH3k zpT)1P{_ys9|N8r$=Xu{&SUEuy^a659nM>&-#vOSR*P z?27L!Z7X}1{+;R98+#|tR}vpSbqejhM-46+zWe{Z-Cdqb{CWWC{hakW@7Qf|okU9Y zM6jKC%1Hsv#S6?+!#bYa>ZhLFox zjceR#AvM6&p`plT7Atb*y`{DPs`MnD`M4*sd-GAse)yhc>0ajS`q7X|x*ikoSDioKV zIeja=UmNII`mCL0j>xmv-S8S-$DQ2fT|{-#)-2;sygraNAKp>aJB$nSHLG+e5xi;p zy-h|sb_akVa~{sgcMPOmA`KUE2XVNz5#B;1j1wPQ3Or%E%NxZ3uC8l|V;|Sedxo>^ zj#t((6Q>eOJL=1(P2A*O`XO~_>jd7jpV)?-5tF-UyQ7yWH-&GS6Xo8Y3}lDs#+@w1 z@wKg^>K*qQCs7z7-T`Rde7h&(yOoz@1@r5rJ8TK7N0aAZAD7P^ZhNE}t zuF_D^t|N)$Cp@7AG&B*AF5R%>WP0gyrW5VGOR7Fr1w6ZYWd+bVO@ov0C7I2}m&maOY96HLV=C0wev6iE8KA7n2C zcW)ZCo`lM2&b-BoeBk}=PqQ+C8wtS8j0r>E@RIG+ZFwmJpfCR zp4SrX6=L|+P1%=tc9y9VhQpc2F}`z~RbS`Q1J}bE;eiET^?BfiZRLaF`l+Lii`96d zkJ@b5$y8y<(rI`%mCXwYWarsEE}g6|5x3}dy>$7b#QL#Ky7YL>en+A;s=4nfC(dOp z^5M9@nCMWc_B*ewUPu&8P3ywzAdGc1jT*p87WyeWYO^FLjL8B5{;mwu=eC7(RWvkedQTFC3C$^Jt1N5J5 zt*}dFZxwZE50C_jcHVS~oStY4C={ZZ+==X|RoAMw*_Idp{Re6Ch>74w?xY1bd0^CO z&PpT`PTb(OTX2jwC(ufu97#v=2_(Pcs?#Lu=JN9YVWO_ns6)qc^+4b z3;)n_0{iygb-kKUJF28hEoKrVO#IS6O?<3+Gw}bI_&X<=4+8(+6Q85f3EWOBn{=4? zwu6b^v9SAO;y1h;@?_#;O=a%`117%Tb1?C3R!{R_;=lT2;;VZJH;E9Uq{769Rm;Rw zf-v!6-&qbaiToj33$rt@nQ#@^TG{=-C;tDQ`2Tz2|NlMl|NhAvA13~9&tKo%_uEyA zEsmU!B#!n_==IS79R-G(Q%;^KWTJ?2ttVwx`K2M%C+b< zE&PfbWefo&Rhrc0V$2|P=?{a|RP^H`7aSo8A)+Yd8{vrE8!^~rC>7E*GaD(510I=-#!1A||4N?=lHjPSw}fX3D;glCC=&fxtZhpaLCzos2qhHF zF%!<0pwJ{D1R)E|$MZ4x>Wzj&)c%Et4uLozFknp75M3ouDuxgR)i8Gd)50(=gJK7) zLJESam~SKo!VU>#wr3ZPI}6f55e3|+sk*}ZVq|S2i|~(E7AzrILBQ%ic858VsHqOY z%j8#7O5R>j{jM6kdC2H1e_SgTl3F-M;?-r$%T#Bw-x|1)g)QFqkB#!pwaSBx3-4^Q1FsvP2EvgHs-&HthMB&UJ3EhkNg+6Ev zAbp`;4i+FqAC(t(M&C0ETp6ZD_Maa6wpKeWc8$8Puh@Cz={+?uYnE&sH!Jc zHGMm^pmnoFMJ18%mpMu=B-76cJ`c18*}T7?J}DuJ3LSMo<&}fHK!c#*^2UN{ck2L& zBhkMfixFcbqw_^+*q>c6l`T%ch19C;J!B?CqOwUsQv ze2D(;pRy`Z!}`IhR!|PC42K(LA%cGY0>q6--dJe?tJ<=JHaD)S{wMYNC$I)V;t2j0 z#RBF(d%oGXXZt_jx*2cJS_vB>V{?C1rVqb$^V9Q-o8^Z)WUYxV20bn*^C@9kv~Rgk zYwa(@pV_)X%~J?c|Jh%y|N5F26ugV}wtBOuD908tm8vMbgIko^Nt;fnTHL5$)Q~OW zU(|D21#=Iei@BTePaPJAbKQp5*UAQtEq;F5Pnhn2R7uhsxof6R+ZK=f4vCnX+wwY! z?rVUYA?sxVePF8VwskcJ$};UiZv7N#YmvIh@}jC9?$zFhkT4Pd=en3YR{GhuA22=j z^vj*=r^@W1I;pKKUe7##x}N3d)(LFg$zn*?I&P(i%t^);Fa7?dfB)e1)6Xux{nTHl zesE06EFMX}_Ehh=dq>wnB7{o>y|Z4iC@;5ZdSKo9%?E2nP&yU=lJFi09+7P#tGTtV z3~^6{?R_oyRM@xPY9JL}eXzBDyGr7`)@ECG6XhafXl`+>i9Pd11UV`e(s)}v;@9Hs z@BhfPqbRpT!{a!IrnXfv>uTY=UV;)coods-&glG{iq<96nwqK#oaTQX1mxZtQfas zieHxoJ};T#Djxrf|0x}|ct1HUa%4H=Icem?RYP{OpGo%h+@86uNJ%^5QO2#R*?=Mf zS(xNE&xAzYsv1DkKOILX%l9}k_drx_aawO4MMOBog@_h}5j}ghb)sy1BD%;>9gQ=l z_;V`t4U@-lKEAa(nOr~A@tl}$udDVBIvB^F{>D!fH?}N-{`yFt#kDI|3!f_<4w1$8 ztMvEg;z~QqT3zr_p(f3YhH}k(kixID- zh}MXrSoR!2s7%c%(pi=KW+xO34Gtd3Vl_hC6sx^8j;F*|&jSrixtyYj(XXqZB@rzh zbdRo-YU>ClxsLS)4uRsshIfgNZ;M5i=FX#CUQtbVmRa;Cc`-<_c8S!M zlO@j`%80$aV#yf@nZ%z+H?7L1l@W;+#S2>iN^EBU3a-Cs5wk33ya+E2kuj7&;H{8z z@r|Vjd0T2Zytt#2C;z~q{;nv!&9J>&lu2w_;uyJu=0qK9XEDNN6UiFV=|N3|Xg2SQ zq280Ms2WU7tyo_Z&tk;c-t*^k;$i30{~Ezg`NbBgCfn*9CHib+!PsJg;xPM2BsLLB z1ZRZY&Yl_&)wPU5tENMu3jvuXKvE)u7&xVR&WolR-rAcZPK)SSN^aFuOx$F9T{uIv zie2kjmkFiz;(v3h>;d3UKMj7u5j{FrzllObnlp2TpU3D_@pBr zxGf?oML^wV#b%bUpzh$NSc7W89?vfBoixmzdYOo0&w>c_{_&i6Do`;bkz*HozWrj` zhUM=+TPOErw&_CeiJPVh$C!^+;vb!O$_W0%cuOQ~@R`cWEky)5wG%@vMEqqB`+KEy zU_WjI{`<|7pBrf0v;TLMrlwa!oGb^n_Ao@u61RyR1_)S!)Yy;(qeW{r8*j2MOFZ)V zNw;de)FXCkViRG47Lok7tQpH%oAECjd*2BEm(RE2O38bu^I{vZj_l+%krve?(k3;R zk#H)$^T;AuT|YtN{!_&-Fr?|J=ZfWgd{MK5p zy?yYyA!c;-9ut;W(WK(Unur_mPRGNCr~NKzakFvK^Lz_=H2$#Y$sIk+ z{){LY;W|zOTe?z^f4S4vYZuu~*(sU!P4Qshvui8=%EgLDFds$LP$_<0GiA->;%@v% zM;pyF7gyr9xvv7(+XqfB21c>ki)W1&7tfuf)}^!V+hX8BNy$mZZBeuDYm}yHqP7V- zZbDlVn`DkbFqqUB&}l@b+AE^ik$opyZ^qwFo!pyh(5oVQ3p*Dn1+t>f!l!F0`7ZIc z7VxRuEh3Jn=;vZUYLBy@yUu*M*p%Y7or={;C|l4wE`;IR-SJyxoHq|#GsiQk<~tO? zj>XAb*TAF9vDWy_Z-#GsX)hvzj$LO6mWaQ#_52ymb@ubPG@wbH*~4snr+L;<>J4V& zEbYpzm~Sa@A8&Gom7_@f_Ok;ZEW_z|9VWd_{#SDxEi+{4X+9S>yEP|$TO#70cG1l} zgQeqJFNSJC6vN{^;5_uSlR)C9g3rJ8zWVQ6@z%hO`wkW4 zXZ>+JRN1=qAS=IxuKoZ4ycsuX)rk>p6%03sQ2rsjEospRd& z#p~a8KUn`SV*Dl7ny7mA+TvNjx<9{XeM2LI0Zts41(b()9*eO#j@sOqNQnOWQ zwmBNySuK~iS*i{5lm>d8vqf{N)d&Q4X0`MC232C@xxI=F&SBKrY`~>qNPX{<*-%^(ld)7+Vx{}$u$e7&S4~Qs4{DHDP6wJx-wgO7R5d7 zoNLxiTGXt9w9ZQR2p>C$I42LUrdmo3Zf>^7p*>-ZS0@Ai=`rJy`nPABN(SK`op(>7 zf#vLbgzAAOGyMoh_D&YXjfVGOOL>+j@8(`+&#w_G49ClI3Ofr+_IM<7XA{CqrogwS3&r8yz zb-&ZDFg>10x<%=1x7|`F>xh%seAah+>fVlKt*3kC$-|veg@O{vC8lPpELy~Jtq-RIA3WeLJ%em7e^xrdy5!8$pxuQE!rtMcyQpoQep zce6cJ%Bt_85$0T-tPi{!p^QHub`kVlrw0zVkInk{0BgLgV_VjDd&4wkLh#zV2##tk zCA{?=4S(Zd8^SNYYc=X>h_RvX-1-UN^xyFy?=-jWp2`K@aJ+-ig>Pg6j-7Y7-rjbL zfd<|o)UR51PQG1}{Cr)Fc`p;4Rk4Wv%LbDBAAQrTMi zwW|%Y*Aaed?=^;fh$t{XURyQR36II_ehpE|*>>l7_iH%`eEWEcd=2!XE|>LD{53I7 zi`IibR$5>F<&OPKkpK1dXARx76Lj`q=tJ@>7ep0Z(cs1H|G_Bv>GLeYxb3Brq;8;? z!&xDaPInh~QKggbD? z_mJq4M?Oe;@}Gm}99+PE^aFFaP@ml4Wr_LCfBxSWD&%!w1qaTWkEt)bzL6!8V=nCL zJHJgjxB$UDaqyglzPmYf<1&LS3~sL(+m~F}LS$P+?!L+FEku$casRRlT^QQFPHey8 zsxJ&B*No)X7bW#Kci_*LA*nAPM{fM)Lfsx=;mO;g3g-2NNHwl)9A~iw-@(PVzPOFT47!@+>nZbr?&0Dty2GDM-n{m&Oy|LM+edq+r>u(CnFA1R1 zE)pU*5yc41`514vuPWnq}9UQL_80eOgN=8H9>DQqmIiWKkl3Y^{V_wz*I z2g!q4M40M7*9*}l+urfZdqV5AB#AuTLB^cLf>NOEo>(ml>cBpKAXer$j5tD>W5sF- zrx2GOyP>wZP)pc|)i6ZIcv~{2r*suzG(4u507vxsTte9qQcS-4X<@aoTEk0tRml2$ ztmXLYssQj3(Q&Gn21IdLsZ(r0ATXA)48f-#9Ui3gm*j5mVZTBKP&^LlTrl$_V_SjXN8*T2gx-l3x%|XsD`Qv zhKfZ%*2zRmZI@hWinuEzvxot6ACH!Z7ry81KO+m0-3$K9#I~>s4ts`y8&TQx<{SPu zm;zLpHAn#Dq9S#GV%7Ah)b^&M--{OnllK6dl#`=BK7$uDy(mZP$A|kbx|@;!&NT*V zOBP4tNItEnmTp9`zP?u?wzNs$!L^QVu1HZR9YWN0OVN%#|0@wDwf_SU-=kbJRr)R5 zGg)}4hbI7zn|$$X7x#d~nv>QtV`?XA+Pfy?p=9ipZL>B?b6Uyv-dP*=jqeyt4;r_D zJ2OFcy5j_02#`qSrFaNb;KEx>Swwdv=6M_Jh}b~D3V>yM19h`cwwzK!HSp3C%na5q)yYF{u$35)vk$1}; zd$S>$bCaTum$fdFW76UbwB3@rh)EOC+KSif@D_H-k3xjkK6Y)z{r5M{{u-YotZbtu ztJrwoEtfrG&6LJV&ARh6jgjL6rk#>hStiG~DB`vA?lL(pWim=@+2tM|2%mcgA>L=k zlQpAERbR7?_iNPKO~(>Hp1vNy>V*IBI1gu~!s#?M-en&({h4C_YMlCFN2s3m)W@E^ z*!-p|A63SqHYSKMLGsFe96UIkn?vI})cFe9()$O~VHstSwXME+Tt|3kE9069^%PQd zZx=D~R^TP3i4C+*STRjQUoxMWs9VLe?nY17RFgGaUEs$urTL7EeM7{itiT@tVknJA z3XYy)Lo<(eHur}PSL~6AoWY(vN`#3kAGt4l^H}=zbK{JxqD&**GNCpQR;{1QUfJ2( z(?0srRJwvl!NYI0zmXenHZA)pe1I9x5jCTC;M=c_{r9!o?jP6Rr^i}f(#j7$`5Yb7 zoRK5h6l+{GOC`x)!GCbk_2s9Ix0%&LfAkkW9)A4U559SH%rtCH8h$-9Zt{`M8i8i7 zNYAP7jlB4Gfh%kF`wnN>UAQuQf5*Ma<@m9nIrV-`u?$`0H;B?L3;ic!U1c^yB28vY zJ+&9&6*4|1mn(fXW8b*guK&Y#vxxrGSkuhmgcRn+oKn5n2(rjKSW5-zJ%z`|{<`*! zx4R#dy54!a@wYilt$QZa09D+7(4$X$I#kMs_(o-7|J72(E91WL5oN=IZAGQ>RPyD|@1J`uW^Hbd1|dZ~&KJ*x10$7~lN--n)8X&C5}3?3ne@#{m@I zd@$D5Yp^bxRvN<YS*&k-ec>Bsf;!-uAUnDgD&I!Z%>gH<5a1v)W=PR z^-o^c)b?rAVK&wb)92Ht(9YhX4MnG@XW*5TexI5n9h_X|R*`9QxP-Ljwcz-F_}KT@ zaPswOE6#u0;4``DN9+T{yjJg;aQSPuIjQmeY2)wynm=|pUZ1y6>dviAbZ74R+FFx* z&cV$~T7@Lb&VfbLP>3>$KA5xDo>jSnATv0tk(-rQk1jTIrejPFb1n|p#9Q2XTv~jj z>AJ>;dlyp;^(~m-pDwDFmWsIL!sk3%`V~8I?_<$tW-aR*eF&MNyJ?=+^$8l?`*+D*|gb`OFyPi&c$xqen%O~xOJZl^x zWt7O7W_QW9MxC(Wv*yHef8JjBikRE-8cxDSD6?_P+df7Gl(CqNkeJ8Nre4NL{GpU3 zron$)f0@ONIkm1aK}ln#+!Vipn#<*J@}bMP;L*OCvQ=LTND^9~+ILzN4%6kS0ZXr$ zt2~gW8cZZ>m?GbqtKRbWY)G%T=i_{LF=Yx9;5h7In??|wV_+#kB@!7g{jR5Zu1 zk!v~c_!+`5v*q@{WX-Vqtgw%tEEYU0Li^C^+o+kLc)2oF@*0e;`s&k7#1v?h-TMm!BS7T365+zHzh4S5H4AQ4jSKL5Say*F&4I(+T7JG5ARuwYaIS-ap& z@j7i#q@ep6Id^U8qlLBs*k~ZYNnLC>T3bSL{R0G?)Csw;v+(lb`H$*=OT;#7LLT28hqcQ zng8_+tjmq8k5vSR|M?$*ADjx5AMLg6E~gfdj@OckN>MQ-qTnT(RAUB8^X!d6ZHdtO zYz2u!Vi8Y`s@4fifDJLFuPD1q25Ju!z?Cc3RR;+uhG+s}8Z78n9j!}*Y6;~Pii}+_ z(_AC%V}x3LsERepJqw1h_x-~kO7P+)7YGA&c;sY#<_$Q@65w_!G|K&hs?M^Iuxy-5l< zMOyG|UIboP>kjXxO0hRz*HIkKZ&BBVWOo~SX$Dsi$8hTnDdrzCP}rkU(XN>aKa5%z zX4IP6cF77pHP3t()UU7y6S$h>U1nOP*qgm6a@1q<`m?mV%_d) zaz=54p$nmeYzd_ZV3B83LWK=*b0ao;{IaWBqLJ^LcnY{$N7oGe5p{T*>6wD5&vkHW zhz_=^IQ;$Si~)7=g>2h1X>d_&O27*{Y~XdH@y!_skf6a%wK|ik_k;f|iC!L}5%9)! zbj5(BMmxsz-IUd~2f*IvVzn69X5$3^FjnL-6hlckW$s}BBnAZ-{i9fA!w zE|R-5$#TC(&H*o++e4{pE_`4`sBIU?$1^FZJ0ycu^a5jmA9r6bBpHZh*k#P@iZ6s@ z7&lQvqWH!q7xdT@Cb}=QJ5!Jx;YJo(zUU=ddVUmf9^{44eUxn`pLyX-^&rVc_|PUG zu`yi*XW2fEnb|INpQ%bH8%>fC#Jt)MRzQ1WevX{k&2$g$W+AWKnonzrK95i>5qkaK z4|UDR>F3Ts^Rm&RL8GnlVK?N3;2NCGW*X_|Uf<3_lG5O?_M4F~SRu8_9}f3^ZI!Vz zQ4FW()@#G?z$_`3Ux^IPRKaRD!&A{?lbF5zhkaf_&N904!W;ZdGkxU3ZpOk25{w;N z+D8gaiD_p0`p!U7$KY<l{4i3#v6nPGkC_H893(x4qBNzVh zrrj+l45BemR6##TGDU`Gnx!Kbeia8R&~$3H3|K*uIZfL~!0MUTpFGfZ@W8YWZ2fuwyvP|Csv-ufmI2LVM}{i zfsklCsU0L4CJzi7N;sB#l0?C&jkYao{6P}!fw4ger%K3g@+xz9Qsw=SWN|l2JSl*Z z6Oz27K&U*Plq`{hBo7Q5R_N^^>eic33`3)ANr?t4m4+mm6uf4LG?ejD2UgZ)m9|5Y z#SKZ6Ac6M-p7ugxYMgDupnU(Fl+8gaiG%t>Fwqy8Ck1rd@zf7_s z$k&C32X4Ru`^2gW^ph}oy%|OYM)N`v3M=iw1HVopjeoW>0RQ0`y<0%ug~irg}y0Oi-q)Payg$W zDmCMTiuo`0UFz>U@wz|EAvHXIBL6s~yaEu`c$h>}k1AznK4oSi=r33~@9o|8uLnq<^=)5XzDVI!Z>{QXgI ztF(hW2RV@&>9Y^vOn$UjG_L|{Pn<|1y-)e6LnlWmuFdO4Ey$>f=2M0Y?IRcErA(Wr zBih|R;^A4^KI-KOLFRFkMU$iLFZDC z^F?N~!dV7=Eu1GtLkx=pSJKgQE5_Z8t3SOu`ZviN+aEDGdz2&1Ws-BaNBy8OF4B3+ ziKV_8(#&#Ll&2$ngrige7}Jq6twnuQG2dNHUHx!*G?^|aD%w<`yY0a=>i3NTV{%~D zI$Ca(a79HNqufaUoBeMN(@_ScM}`OS;^qiRi0R`Vh#+<4j!p1;1RhXcRZVV68wEfh9Byz$eeXg*EgFn$bZUT7UC;%If* zzI)tk;YJyA>gRGwH=-(s9eBYGkM{MwIUKp%qeKZ^2VGOG5Zx}w3cT8jpiEN~%--J> zOPQ<{5W%U@k)s6w^;9EjNBg|}!eaw(q#{W~$5H}RH{KCfpK zBtAU2jAIJ;!!*v&G=lufDQ>bMap`ygBJ44h8+tHQ$Dxj*(@~Ca!i`p-F zwJ1f>hOFv^82C#gGzch!w{Ozyp8L?5=nHT3he(#l{S(IS-sWvR+ zA7f3UE|g@Djl$1kx~{AJ?gA=&h@Qy|)%)zxH`*?SX%^$7FwgGis>x~;dM%%Vh8~44 zSDC*51{xYw+uWH(UTlqlHU{N5{tIF9@)s?X-|G{6b}s@uURq$`%|z6cW;9hz71Fwj zj`o6s_0aGe%~6Ol!!=9Qt1&=XbkyHl5>)epQ!Qa%zYvZvR1+onXvqB2)#g?6LbR}) zmW$v9J_@etAgs50N38`!H}vXC4A_F2gjm8tKIg7P9K*ce4^!|e(wJz+(;p`Pb7>