mirror of
https://github.com/snesrev/zelda3.git
synced 2025-12-19 18:05:55 -05:00
963 lines
33 KiB
C
963 lines
33 KiB
C
#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);
|
|
}
|
|
|