From 42e1c438e1e78e3a298c71734cb7e699a990c94c Mon Sep 17 00:00:00 2001 From: Tom Overton Date: Wed, 1 Nov 2023 05:08:22 -0700 Subject: [PATCH 01/28] Add original asset names to all `object_n*` and `object_o*` files (#1460) --- assets/xml/objects/object_nb.xml | 8 ++-- assets/xml/objects/object_niw.xml | 4 +- assets/xml/objects/object_nnh.xml | 2 +- assets/xml/objects/object_numa_obj.xml | 44 +++++++++--------- assets/xml/objects/object_ny.xml | 2 +- assets/xml/objects/object_oF1d_map.xml | 26 +++++------ assets/xml/objects/object_ob.xml | 14 +++--- assets/xml/objects/object_obj_chan.xml | 8 ++-- assets/xml/objects/object_obj_danpeilift.xml | 4 +- assets/xml/objects/object_obj_dinner.xml | 4 +- assets/xml/objects/object_obj_milk_bin.xml | 2 +- assets/xml/objects/object_obj_tokeidai.xml | 48 ++++++++------------ assets/xml/objects/object_obj_usiyane.xml | 10 ++-- assets/xml/objects/object_obj_yasi.xml | 4 +- assets/xml/objects/object_omoya_obj.xml | 2 +- assets/xml/objects/object_open_obj.xml | 12 ++--- assets/xml/objects/object_ot.xml | 10 ++-- assets/xml/objects/object_owl.xml | 12 ++--- assets/xml/objects/object_oyu.xml | 4 +- 19 files changed, 106 insertions(+), 114 deletions(-) diff --git a/assets/xml/objects/object_nb.xml b/assets/xml/objects/object_nb.xml index 7ac63e118..f169abed9 100644 --- a/assets/xml/objects/object_nb.xml +++ b/assets/xml/objects/object_nb.xml @@ -2,10 +2,10 @@ - - - - + + + + diff --git a/assets/xml/objects/object_niw.xml b/assets/xml/objects/object_niw.xml index db47a439f..fcc178dde 100644 --- a/assets/xml/objects/object_niw.xml +++ b/assets/xml/objects/object_niw.xml @@ -1,7 +1,7 @@  - + @@ -18,7 +18,7 @@ - + diff --git a/assets/xml/objects/object_nnh.xml b/assets/xml/objects/object_nnh.xml index f7f546e25..3a806c792 100644 --- a/assets/xml/objects/object_nnh.xml +++ b/assets/xml/objects/object_nnh.xml @@ -2,7 +2,7 @@ - + diff --git a/assets/xml/objects/object_numa_obj.xml b/assets/xml/objects/object_numa_obj.xml index a450cf11a..ea2aa74a6 100644 --- a/assets/xml/objects/object_numa_obj.xml +++ b/assets/xml/objects/object_numa_obj.xml @@ -1,33 +1,33 @@  - - - - + + + + - - - - + + + + - + - + - - + + - + - + - + @@ -36,22 +36,22 @@ - - + + - + - + - + - + - + diff --git a/assets/xml/objects/object_ny.xml b/assets/xml/objects/object_ny.xml index 186dd91c3..3f2d3a908 100644 --- a/assets/xml/objects/object_ny.xml +++ b/assets/xml/objects/object_ny.xml @@ -1,6 +1,6 @@  - + diff --git a/assets/xml/objects/object_oF1d_map.xml b/assets/xml/objects/object_oF1d_map.xml index a241eac13..27270fb7f 100644 --- a/assets/xml/objects/object_oF1d_map.xml +++ b/assets/xml/objects/object_oF1d_map.xml @@ -14,7 +14,7 @@ - + @@ -32,9 +32,9 @@ - - - + + + @@ -60,7 +60,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -128,15 +128,15 @@ - - - - - - + + + + + + - + diff --git a/assets/xml/objects/object_ob.xml b/assets/xml/objects/object_ob.xml index 1efe524b4..1d4447de5 100644 --- a/assets/xml/objects/object_ob.xml +++ b/assets/xml/objects/object_ob.xml @@ -7,8 +7,8 @@ - - + + @@ -40,8 +40,8 @@ - - + + @@ -94,8 +94,8 @@ - - - + + + diff --git a/assets/xml/objects/object_obj_chan.xml b/assets/xml/objects/object_obj_chan.xml index 0b378e8c1..108669b0e 100644 --- a/assets/xml/objects/object_obj_chan.xml +++ b/assets/xml/objects/object_obj_chan.xml @@ -1,14 +1,14 @@  - - + + - - + + diff --git a/assets/xml/objects/object_obj_danpeilift.xml b/assets/xml/objects/object_obj_danpeilift.xml index 2d3c26567..882ce1bce 100644 --- a/assets/xml/objects/object_obj_danpeilift.xml +++ b/assets/xml/objects/object_obj_danpeilift.xml @@ -1,7 +1,7 @@  - + - + diff --git a/assets/xml/objects/object_obj_dinner.xml b/assets/xml/objects/object_obj_dinner.xml index 6ca440035..f73716464 100644 --- a/assets/xml/objects/object_obj_dinner.xml +++ b/assets/xml/objects/object_obj_dinner.xml @@ -1,7 +1,7 @@  - - + + diff --git a/assets/xml/objects/object_obj_milk_bin.xml b/assets/xml/objects/object_obj_milk_bin.xml index 70daa6172..e67e0b15f 100644 --- a/assets/xml/objects/object_obj_milk_bin.xml +++ b/assets/xml/objects/object_obj_milk_bin.xml @@ -1,6 +1,6 @@  - + diff --git a/assets/xml/objects/object_obj_tokeidai.xml b/assets/xml/objects/object_obj_tokeidai.xml index 94a302ea4..9822eb149 100644 --- a/assets/xml/objects/object_obj_tokeidai.xml +++ b/assets/xml/objects/object_obj_tokeidai.xml @@ -32,47 +32,39 @@ - - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - - + + - - - + + diff --git a/assets/xml/objects/object_obj_usiyane.xml b/assets/xml/objects/object_obj_usiyane.xml index 339b25df9..99e6e0cb1 100644 --- a/assets/xml/objects/object_obj_usiyane.xml +++ b/assets/xml/objects/object_obj_usiyane.xml @@ -1,13 +1,13 @@  - - + + - - + + - + diff --git a/assets/xml/objects/object_obj_yasi.xml b/assets/xml/objects/object_obj_yasi.xml index 34ace132e..5971fc744 100644 --- a/assets/xml/objects/object_obj_yasi.xml +++ b/assets/xml/objects/object_obj_yasi.xml @@ -1,12 +1,12 @@  - + - + diff --git a/assets/xml/objects/object_omoya_obj.xml b/assets/xml/objects/object_omoya_obj.xml index 85389f314..e5483bd19 100644 --- a/assets/xml/objects/object_omoya_obj.xml +++ b/assets/xml/objects/object_omoya_obj.xml @@ -1,6 +1,6 @@  - + diff --git a/assets/xml/objects/object_open_obj.xml b/assets/xml/objects/object_open_obj.xml index 74a4101bd..3ad1dd436 100644 --- a/assets/xml/objects/object_open_obj.xml +++ b/assets/xml/objects/object_open_obj.xml @@ -1,15 +1,15 @@  - - + + - - - + + + - + diff --git a/assets/xml/objects/object_ot.xml b/assets/xml/objects/object_ot.xml index ae3b42d22..1b99fb071 100644 --- a/assets/xml/objects/object_ot.xml +++ b/assets/xml/objects/object_ot.xml @@ -1,12 +1,12 @@  - - - + + + - + @@ -49,6 +49,6 @@ - + diff --git a/assets/xml/objects/object_owl.xml b/assets/xml/objects/object_owl.xml index 8d17dcc5d..b07442a99 100644 --- a/assets/xml/objects/object_owl.xml +++ b/assets/xml/objects/object_owl.xml @@ -2,14 +2,14 @@ - + - + - + @@ -78,9 +78,9 @@ - - - + + + diff --git a/assets/xml/objects/object_oyu.xml b/assets/xml/objects/object_oyu.xml index bbf0b7f72..f674f0977 100644 --- a/assets/xml/objects/object_oyu.xml +++ b/assets/xml/objects/object_oyu.xml @@ -1,10 +1,10 @@  - + - + From f276d2b0e618f7fc95a35b629161561489203f39 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Wed, 1 Nov 2023 20:07:38 -0300 Subject: [PATCH 02/28] Enable `-Wint-conversion` warning (#1266) * fixing some warnings * more pointer fixing * Use `-Wno-int-conversion` on audio files * more progress * fix * more pointer fixes * kinda progress * Fix remaining casts * Format * fix merge * fix warnings * fix parameter * use SEGMENT_ROM_START_OFFSET a bit more * format * fix audio warnings * some more fixes * fix en_go * review * review * whoops, missing cast * review * review * ->data * format * review * fix * asPtr * fix * Update src/code/sched.c Co-authored-by: Derek Hensley * review * fix in EnDnh * improve format * engo * format * fix * format * Update include/z64.h Co-authored-by: Derek Hensley * TexturePtr * fix warnings * fix warnings * format * fix * review --------- Co-authored-by: Derek Hensley --- Makefile | 2 +- include/audiothread_cmd.h | 6 +- include/functions.h | 4 +- include/loadfragment.h | 4 +- include/main.h | 2 +- include/segment_symbols.h | 8 +- include/sys_flashrom.h | 2 +- include/tha.h | 3 +- include/z64audio.h | 3 +- include/z64message.h | 4 +- src/audio/lib/heap.c | 2 +- src/audio/lib/load.c | 44 +- src/audio/lib/synthesis.c | 18 +- src/audio/lib/thread.c | 22 +- src/boot/O2/loadfragment.c | 24 +- src/boot/O2/loadfragment2.c | 16 +- src/boot/O2/system_heap.c | 14 +- src/boot/idle.c | 4 +- src/code/TwoHeadArena.c | 8 +- src/code/graph.c | 6 +- src/code/main.c | 4 +- src/code/sched.c | 27 +- src/code/sys_cmpdma.c | 10 +- src/code/sys_flashrom.c | 4 +- src/code/z_DLF.c | 18 +- src/code/z_camera.c | 2 +- src/code/z_kanfont.c | 7 +- src/code/z_lib.c | 10 +- src/code/z_message.c | 18 +- src/code/z_message_tables.inc.c | 2717 ++++++++++------- src/code/z_overlay.c | 2 +- src/code/z_parameter.c | 7 +- src/code/z_play.c | 5 +- src/code/z_player_lib.c | 4 +- src/code/z_rcp.c | 4 +- src/code/z_scene.c | 2 +- src/code/z_skelanime.c | 4 +- src/libultra/io/sptask.c | 2 +- src/libultra/os/createthread.c | 4 +- src/overlays/actors/ovl_En_Dnh/z_en_dnh.h | 2 +- src/overlays/actors/ovl_En_Fish2/z_en_fish2.c | 8 +- src/overlays/actors/ovl_En_Fish2/z_en_fish2.h | 2 +- src/overlays/actors/ovl_En_Go/z_en_go.c | 2 +- src/overlays/actors/ovl_En_Ja/z_en_ja.c | 6 +- src/overlays/actors/ovl_En_Mag/z_en_mag.c | 2 +- src/overlays/actors/ovl_En_Rz/z_en_rz.c | 5 +- src/overlays/actors/ovl_En_Yb/z_en_yb.c | 7 +- .../actors/ovl_player_actor/z_player.c | 4 +- .../ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c | 2 +- .../z_eff_ss_dt_bubble.c | 2 +- .../ovl_Effect_Ss_Extra/z_eff_ss_extra.c | 4 +- .../ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c | 2 +- .../ovl_kaleido_scope/z_kaleido_scope_NES.c | 8 +- 53 files changed, 1753 insertions(+), 1350 deletions(-) diff --git a/Makefile b/Makefile index df9ceaa04..a3d325a38 100644 --- a/Makefile +++ b/Makefile @@ -108,7 +108,7 @@ endif # Check code syntax with host compiler ifneq ($(RUN_CC_CHECK),0) - CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-int-conversion -Wno-unused-but-set-variable -Wno-unused-label -Wno-sign-compare -Wno-tautological-compare + CHECK_WARNINGS := -Wall -Wextra -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces -Wno-unused-but-set-variable -Wno-unused-label -Wno-sign-compare -Wno-tautological-compare CC_CHECK := gcc -fno-builtin -fsyntax-only -funsigned-char -fdiagnostics-color -std=gnu89 -D _LANGUAGE_C -D NON_MATCHING $(IINC) -nostdinc $(CHECK_WARNINGS) ifneq ($(WERROR), 0) CC_CHECK += -Werror diff --git a/include/audiothread_cmd.h b/include/audiothread_cmd.h index c9e6703dc..5fe7021fc 100644 --- a/include/audiothread_cmd.h +++ b/include/audiothread_cmd.h @@ -248,7 +248,7 @@ typedef enum { * @param sfxState */ #define AUDIOCMD_CHANNEL_SET_SFX_STATE(seqPlayerIndex, channelIndex, sfxState) \ - AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_CHANNEL_SET_SFX_STATE, seqPlayerIndex, channelIndex, 0), sfxState) + AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_CHANNEL_SET_SFX_STATE, seqPlayerIndex, channelIndex, 0), (s32)sfxState) /** * Set the reverb index. @@ -493,7 +493,7 @@ typedef enum { * @param functionPtr */ #define AUDIOCMD_GLOBAL_SET_CUSTOM_FUNCTION(functionType, functionPtr) \ - AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_SET_CUSTOM_FUNCTION, 0, 0, functionType), functionPtr) + AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_SET_CUSTOM_FUNCTION, 0, 0, functionType), (s32)functionPtr) /** * Do something related to the unloaded-type audio data in the heap. @@ -514,7 +514,7 @@ typedef enum { * @param data */ #define AUDIOCMD_GLOBAL_SET_REVERB_DATA(reverbIndex, dataType, data) \ - AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_SET_REVERB_DATA, dataType, reverbIndex, 0), data) + AudioThread_QueueCmdS32(AUDIO_MK_CMD(AUDIOCMD_OP_GLOBAL_SET_REVERB_DATA, dataType, reverbIndex, 0), (s32)data) /** * Change the sound mode of audio diff --git a/include/functions.h b/include/functions.h index 5519036a3..c6c3667d6 100644 --- a/include/functions.h +++ b/include/functions.h @@ -541,8 +541,8 @@ void Color_RGB8_Lerp(Color_RGB8* from, Color_RGB8* to, f32 lerp, Color_RGB8* dst void Lib_Nop801004FC(void); void* Lib_SegmentedToVirtual(void* ptr); void* Lib_SegmentedToVirtualNull(void* ptr); -void* Lib_VirtualToPhysical(void* ptr); -void* Lib_PhysicalToVirtual(void* ptr); +uintptr_t Lib_VirtualToPhysical(void* ptr); +void* Lib_PhysicalToVirtual(uintptr_t ptr); void LifeMeter_Init(PlayState* play); void LifeMeter_UpdateColors(PlayState* play); s32 LifeMeter_SaveInterfaceHealth(PlayState* play); diff --git a/include/loadfragment.h b/include/loadfragment.h index db1f3a322..dcf749097 100644 --- a/include/loadfragment.h +++ b/include/loadfragment.h @@ -36,7 +36,7 @@ typedef struct OverlayRelocationSection { } OverlayRelocationSection; // size >= 0x18 // Fragment overlay load functions -size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, uintptr_t vramEnd, void* allocatedRamAddr); -void* Overlay_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, uintptr_t vramEnd); +size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, void* ramStart, void* ramEnd, void* allocatedRamAddr); +void* Overlay_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart, void* vramEnd); #endif diff --git a/include/main.h b/include/main.h index ce794714f..2b25dbb07 100644 --- a/include/main.h +++ b/include/main.h @@ -9,7 +9,7 @@ extern s32 gScreenWidth; extern s32 gScreenHeight; extern size_t gSystemHeapSize; -extern u32 gSegments[NUM_SEGMENTS]; +extern uintptr_t gSegments[NUM_SEGMENTS]; extern SchedContext gSchedContext; extern OSThread gGraphThread; extern PadMgr gPadMgr; diff --git a/include/segment_symbols.h b/include/segment_symbols.h index f2f40820a..4d5824138 100644 --- a/include/segment_symbols.h +++ b/include/segment_symbols.h @@ -24,9 +24,11 @@ #define SEGMENT_END(segment) (_ ## segment ## SegmentEnd) #define SEGMENT_SIZE(segment) ((uintptr_t)SEGMENT_END(segment) - (uintptr_t)SEGMENT_START(segment)) -#define SEGMENT_ROM_START(segment) (_ ## segment ## SegmentRomStart) -#define SEGMENT_ROM_END(segment) (_ ## segment ## SegmentRomEnd) -#define SEGMENT_ROM_SIZE(segment) ((uintptr_t)SEGMENT_ROM_END(segment) - (uintptr_t)SEGMENT_ROM_START(segment)) +#define SEGMENT_ROM_START(segment) ((uintptr_t) _ ## segment ## SegmentRomStart) +#define SEGMENT_ROM_START_OFFSET(segment, offset) ((uintptr_t) (( _ ## segment ## SegmentRomStart ) + (offset))) +#define SEGMENT_ROM_END(segment) ((uintptr_t) _ ## segment ## SegmentRomEnd) +#define SEGMENT_ROM_SIZE(segment) (SEGMENT_ROM_END(segment) - SEGMENT_ROM_START(segment)) +#define SEGMENT_ROM_SIZE_ALT(segment) ((size_t)( _ ## segment ## SegmentRomEnd - _ ## segment ## SegmentRomStart )) #define SEGMENT_BSS_START(segment) (_ ## segment ## SegmentBssStart) #define SEGMENT_BSS_END(segment) (_ ## segment ## SegmentBssEnd) diff --git a/include/sys_flashrom.h b/include/sys_flashrom.h index 5fc2821d6..24044bd64 100644 --- a/include/sys_flashrom.h +++ b/include/sys_flashrom.h @@ -5,7 +5,7 @@ typedef struct { /* 0x00 */ s32 requestType; - /* 0x04 */ OSMesg response; + /* 0x04 */ s32 response; /* 0x08 */ void* addr; /* 0x0C */ s32 pageNum; /* 0x10 */ s32 pageCount; diff --git a/include/tha.h b/include/tha.h index 805d421f9..9bf3c8572 100644 --- a/include/tha.h +++ b/include/tha.h @@ -3,6 +3,7 @@ #include "ultra64.h" #include "libc/stdint.h" +#include "libc/stddef.h" typedef struct TwoHeadArena { /* 0x0 */ size_t size; @@ -19,7 +20,7 @@ void* THA_AllocHeadByte(TwoHeadArena* tha); void* THA_AllocTail(TwoHeadArena* tha, size_t size); void* THA_AllocTailAlign16(TwoHeadArena* tha, size_t size); void* THA_AllocTailAlign(TwoHeadArena* tha, size_t size, uintptr_t mask); -s32 THA_GetRemaining(TwoHeadArena* tha); +ptrdiff_t THA_GetRemaining(TwoHeadArena* tha); u32 THA_IsCrash(TwoHeadArena* tha); void THA_Reset(TwoHeadArena* tha); void THA_Init(TwoHeadArena* tha, void* start, size_t size); diff --git a/include/z64audio.h b/include/z64audio.h index d2a9afd08..7beabf7e8 100644 --- a/include/z64audio.h +++ b/include/z64audio.h @@ -597,6 +597,7 @@ typedef struct { /* 0x4 */ s8 asSbyte; /* 0x4 */ u8 asUbyte; /* 0x4 */ u32 asUInt; + /* 0x4 */ void* asPtr; }; } AudioCmd; // size = 0x8 @@ -931,7 +932,7 @@ typedef struct { typedef void (*AudioCustomUpdateFunction)(void); typedef u32 (*AudioCustomSeqFunction)(s8 value, SequenceChannel* channel); -typedef s32 (*AudioCustomReverbFunction)(Sample*, s32, s8, s32); +typedef void* (*AudioCustomReverbFunction)(Sample*, s32, s8, s32); typedef Acmd* (*AudioCustomSynthFunction)(Acmd*, s32, s32); extern OSVoiceHandle gVoiceHandle; diff --git a/include/z64message.h b/include/z64message.h index 1b84f90db..2a6eab7f3 100644 --- a/include/z64message.h +++ b/include/z64message.h @@ -199,8 +199,8 @@ typedef struct { u16 wchar[640]; // msgBufWide u64 force_structure_alignment_msg; } msgBuf; - /* 0x11D80 */ u32 messageStart; - /* 0x11D84 */ u32 messageEnd; + /* 0x11D80 */ uintptr_t messageStart; + /* 0x11D84 */ uintptr_t messageEnd; /* 0x11D88 */ u8 unk_11D88; // current Char Buffer ? } Font; // size = 0x11D90 diff --git a/src/audio/lib/heap.c b/src/audio/lib/heap.c index 24bb7043d..e4412bc94 100644 --- a/src/audio/lib/heap.c +++ b/src/audio/lib/heap.c @@ -1441,7 +1441,7 @@ void AudioHeap_ApplySampleBankCacheInternal(s32 apply, s32 sampleBankId) { sampleBankTable = gAudioCtx.sampleBankTable; numFonts = gAudioCtx.soundFontTable->numEntries; - change.oldAddr = AudioHeap_SearchCaches(SAMPLE_TABLE, CACHE_EITHER, sampleBankId); + change.oldAddr = (uintptr_t)AudioHeap_SearchCaches(SAMPLE_TABLE, CACHE_EITHER, sampleBankId); if (change.oldAddr == 0) { return; } diff --git a/src/audio/lib/load.c b/src/audio/lib/load.c index 34e8dec9c..d4e23a86a 100644 --- a/src/audio/lib/load.c +++ b/src/audio/lib/load.c @@ -32,7 +32,7 @@ typedef struct { void AudioLoad_DiscardFont(s32 fontId); s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIndex, s32 seqId, s32 arg2); u8* AudioLoad_SyncLoadSeq(s32 seqId); -u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad); +uintptr_t AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad); SoundFontData* AudioLoad_SyncLoadFont(u32 fontId); void* AudioLoad_SyncLoad(s32 tableType, u32 id, s32* didAllocate); u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 id); @@ -414,7 +414,7 @@ void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1, s32 arg2, OSMesgQueue* arg3 AudioLoad_SyncLoadSeq(seqId); } if (arg2 != 0) { - osSendMesg(arg3, arg2 << 0x18, OS_MESG_NOBLOCK); + osSendMesg(arg3, (OSMesg)(arg2 << 0x18), OS_MESG_NOBLOCK); } } } @@ -431,10 +431,10 @@ s32 AudioLoad_SyncLoadSample(Sample* sample, s32 fontId) { } if (sample->medium == MEDIUM_UNK) { - AudioLoad_SyncDmaUnkMedium(sample->sampleAddr, sampleAddr, sample->size, + AudioLoad_SyncDmaUnkMedium((uintptr_t)sample->sampleAddr, sampleAddr, sample->size, gAudioCtx.sampleBankTable->unkMediumParam); } else { - AudioLoad_SyncDma(sample->sampleAddr, sampleAddr, sample->size, sample->medium); + AudioLoad_SyncDma((uintptr_t)sample->sampleAddr, sampleAddr, sample->size, sample->medium); } sample->medium = MEDIUM_RAM; sample->sampleAddr = sampleAddr; @@ -471,7 +471,7 @@ s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId) { void AudioLoad_AsyncLoad(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue) { if (AudioLoad_AsyncLoadInner(tableType, id, nChunks, retData, retQueue) == NULL) { - osSendMesg(retQueue, 0xFFFFFFFF, OS_MESG_NOBLOCK); + osSendMesg(retQueue, (OSMesg)0xFFFFFFFF, OS_MESG_NOBLOCK); } } @@ -632,11 +632,11 @@ u8* AudioLoad_SyncLoadSeq(s32 seqId) { return AudioLoad_SyncLoad(SEQUENCE_TABLE, seqId, &didAllocate); } -u32 AudioLoad_GetSampleBank(u32 sampleBankId, u32* outMedium) { +uintptr_t AudioLoad_GetSampleBank(u32 sampleBankId, u32* outMedium) { return AudioLoad_TrySyncLoadSampleBank(sampleBankId, outMedium, true); } -u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad) { +uintptr_t AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad) { void* addr; AudioTable* sampleBankTable; u32 realTableId = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, sampleBankId); @@ -651,7 +651,7 @@ u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad } *outMedium = MEDIUM_RAM; - return addr; + return (uintptr_t)addr; } cachePolicy = sampleBankTable->entries[sampleBankId].cachePolicy; @@ -664,7 +664,7 @@ u32 AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad addr = AudioLoad_SyncLoad(SAMPLE_TABLE, sampleBankId, &noLoad); if (addr != NULL) { *outMedium = MEDIUM_RAM; - return addr; + return (uintptr_t)addr; } *outMedium = sampleBankTable->entries[sampleBankId].medium; @@ -785,7 +785,7 @@ void* AudioLoad_SyncLoad(s32 tableType, u32 id, s32* didAllocate) { size -= 0x10; } - bcopy(romAddr, ramAddr, size); + bcopy((void*)romAddr, ramAddr, size); } else if (medium2 == mediumUnk) { AudioLoad_SyncDmaUnkMedium(romAddr, ramAddr, size, (s16)table->unkMediumParam); } else { @@ -867,7 +867,7 @@ AudioTable* AudioLoad_GetLoadTable(s32 tableType) { * @param sampleBankReloc information on the sampleBank containing raw audio samples */ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, SampleBankRelocInfo* sampleBankReloc) { - uintptr_t soundOffset; + void* soundOffset; uintptr_t soundListOffset; Instrument* inst; Drum* drum; @@ -876,7 +876,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, Sample s32 numDrums = gAudioCtx.soundFontList[fontId].numDrums; s32 numInstruments = gAudioCtx.soundFontList[fontId].numInstruments; s32 numSfx = gAudioCtx.soundFontList[fontId].numSfx; - u32* fontData = (u32*)fontDataStartAddr; + uintptr_t* fontData = (uintptr_t*)fontDataStartAddr; // Relocate an offset (relative to the start of the font data) to a pointer (a ram address) #define RELOC_TO_RAM(x) (void*)((uintptr_t)(x) + (uintptr_t)(fontDataStartAddr)) @@ -889,7 +889,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, Sample // If the soundFont has drums if ((soundListOffset != 0) && (numDrums != 0)) { - fontData[0] = RELOC_TO_RAM(soundListOffset); + fontData[0] = (uintptr_t)RELOC_TO_RAM(soundListOffset); // Loop through the drum offsets for (i = 0; i < numDrums; i++) { @@ -897,7 +897,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, Sample soundOffset = ((Drum**)fontData[0])[i]; // Some drum data entries are empty, represented by an offset of 0 in the list of drum offsets - if (soundOffset == 0) { + if (soundOffset == NULL) { continue; } soundOffset = RELOC_TO_RAM(soundOffset); @@ -925,7 +925,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, Sample // If the soundFont has sound effects if ((soundListOffset != 0) && (numSfx != 0)) { - fontData[1] = RELOC_TO_RAM(soundListOffset); + fontData[1] = (uintptr_t)RELOC_TO_RAM(soundListOffset); // Loop through the sound effects for (i = 0; i < numSfx; i++) { @@ -955,7 +955,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* fontDataStartAddr, Sample for (i = 2; i <= 2 + numInstruments - 1; i++) { // Some instrument data entries are empty, represented by an offset of 0 in the list of instrument offsets if (fontData[i] != 0) { - fontData[i] = RELOC_TO_RAM(fontData[i]); + fontData[i] = (uintptr_t)RELOC_TO_RAM(fontData[i]); inst = (Instrument*)fontData[i]; // The instrument may be in the list multiple times and already relocated @@ -1097,7 +1097,7 @@ void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, ramAddr = AudioLoad_SearchCaches(tableType, realId); if (ramAddr != NULL) { loadStatus = LOAD_STATUS_COMPLETE; - osSendMesg(retQueue, MK_ASYNC_MSG(retData, 0, 0, LOAD_STATUS_NOT_LOADED), OS_MESG_NOBLOCK); + osSendMesg(retQueue, (OSMesg)MK_ASYNC_MSG(retData, 0, 0, LOAD_STATUS_NOT_LOADED), OS_MESG_NOBLOCK); } else { table = AudioLoad_GetLoadTable(tableType); size = table->entries[realId].size; @@ -1376,7 +1376,7 @@ s32 AudioLoad_SlowLoadSample(s32 fontId, s32 instId, s8* isDone) { slowLoad->status = LOAD_STATUS_START; slowLoad->bytesRemaining = ALIGN16(sample->size); slowLoad->ramAddr = slowLoad->curRamAddr; - slowLoad->curDevAddr = sample->sampleAddr; + slowLoad->curDevAddr = (uintptr_t)sample->sampleAddr; slowLoad->medium = sample->medium; slowLoad->seqOrFontId = fontId; slowLoad->instId = instId; @@ -1464,7 +1464,7 @@ void AudioLoad_ProcessSlowLoads(s32 resetStatus) { if (slowLoad->medium == MEDIUM_UNK) { size_t size = slowLoad->bytesRemaining; - AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, size, + AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, (uintptr_t)slowLoad->curRamAddr, size, slowLoad->unkMediumParam); } else { AudioLoad_DmaSlowCopy(slowLoad, slowLoad->bytesRemaining); @@ -1472,7 +1472,7 @@ void AudioLoad_ProcessSlowLoads(s32 resetStatus) { slowLoad->bytesRemaining = 0; } else { if (slowLoad->medium == MEDIUM_UNK) { - AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, slowLoad->curRamAddr, 0x400, + AudioLoad_DmaSlowCopyUnkMedium(slowLoad->curDevAddr, (uintptr_t)slowLoad->curRamAddr, 0x400, slowLoad->unkMediumParam); } else { AudioLoad_DmaSlowCopy(slowLoad, 0x400); @@ -1671,7 +1671,7 @@ void AudioLoad_FinishAsyncLoad(AudioAsyncLoad* asyncLoad) { break; } - doneMsg = asyncLoad->retMsg; + doneMsg = (OSMesg)asyncLoad->retMsg; if (1) {} asyncLoad->status = LOAD_STATUS_WAITING; osSendMesg(asyncLoad->retQueue, doneMsg, OS_MESG_NOBLOCK); @@ -1743,7 +1743,7 @@ void AudioLoad_AsyncDmaRamUnloaded(AudioAsyncLoad* asyncLoad, size_t size) { size = ALIGN16(size); Audio_InvalDCache(asyncLoad->curRamAddr, size); osCreateMesgQueue(&asyncLoad->msgQueue, &asyncLoad->msg, 1); - bcopy(asyncLoad->curDevAddr, asyncLoad->curRamAddr, size); + bcopy((void*)asyncLoad->curDevAddr, asyncLoad->curRamAddr, size); osSendMesg(&asyncLoad->msgQueue, NULL, OS_MESG_NOBLOCK); } diff --git a/src/audio/lib/synthesis.c b/src/audio/lib/synthesis.c index 71b6a2212..0e95b4a99 100644 --- a/src/audio/lib/synthesis.c +++ b/src/audio/lib/synthesis.c @@ -500,12 +500,12 @@ Acmd* AudioSynth_SaveResampledReverbSamples(Acmd* cmd, SynthesisReverb* reverb, aResample(cmd++, reverb->resampleFlags, entry->saveResamplePitch, reverb->leftSaveResampleBuf); cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, DMEM_WET_SCRATCH, entry->size, - &reverb->leftReverbBuf[entry->startPos]); + (uintptr_t)&reverb->leftReverbBuf[entry->startPos]); if (entry->wrappedSize != 0) { // Ring buffer wrapped cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, entry->size + DMEM_WET_SCRATCH, entry->wrappedSize, - reverb->leftReverbBuf); + (uintptr_t)reverb->leftReverbBuf); } // Right Resample @@ -514,12 +514,12 @@ Acmd* AudioSynth_SaveResampledReverbSamples(Acmd* cmd, SynthesisReverb* reverb, aResample(cmd++, reverb->resampleFlags, entry->saveResamplePitch, reverb->rightSaveResampleBuf); cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, DMEM_WET_SCRATCH, entry->size, - &reverb->rightReverbBuf[entry->startPos]); + (uintptr_t)&reverb->rightReverbBuf[entry->startPos]); if (entry->wrappedSize != 0) { // Ring buffer wrapped cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, entry->size + DMEM_WET_SCRATCH, entry->wrappedSize, - reverb->rightReverbBuf); + (uintptr_t)reverb->rightReverbBuf); } return cmd; @@ -716,16 +716,16 @@ Acmd* AudioSynth_SaveReverbSamples(Acmd* cmd, SynthesisReverb* reverb, s16 updat if (entry->size != 0) { cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, DMEM_WET_LEFT_CH, entry->size, - &reverb->leftReverbBuf[entry->startPos]); + (uintptr_t)&reverb->leftReverbBuf[entry->startPos]); cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, DMEM_WET_RIGHT_CH, entry->size, - &reverb->rightReverbBuf[entry->startPos]); + (uintptr_t)&reverb->rightReverbBuf[entry->startPos]); } if (entry->wrappedSize != 0) { cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, entry->size + DMEM_WET_LEFT_CH, entry->wrappedSize, - reverb->leftReverbBuf); + (uintptr_t)reverb->leftReverbBuf); cmd = AudioSynth_SaveResampledReverbSamplesImpl(cmd, entry->size + DMEM_WET_RIGHT_CH, entry->wrappedSize, - reverb->rightReverbBuf); + (uintptr_t)reverb->rightReverbBuf); } } @@ -1170,7 +1170,7 @@ Acmd* AudioSynth_ProcessSample(s32 noteIndex, NoteSampleState* sampleState, Note } else { // This medium is not in ram, so dma the requested sample into ram samplesToLoadAddr = - AudioLoad_DmaSampleData(sampleAddr + (zeroOffset + sampleAddrOffset), + AudioLoad_DmaSampleData((uintptr_t)(sampleAddr + (zeroOffset + sampleAddrOffset)), ALIGN16((numFramesToDecode * frameSize) + SAMPLES_PER_FRAME), flags, &synthState->sampleDmaIndex, sample->medium); } diff --git a/src/audio/lib/thread.c b/src/audio/lib/thread.c index fe4804693..e1acb1583 100644 --- a/src/audio/lib/thread.c +++ b/src/audio/lib/thread.c @@ -47,7 +47,7 @@ AudioTask* AudioThread_UpdateImpl(void) { return NULL; } - osSendMesg(gAudioCtx.taskStartQueueP, gAudioCtx.totalTaskCount, OS_MESG_NOBLOCK); + osSendMesg(gAudioCtx.taskStartQueueP, (OSMesg)gAudioCtx.totalTaskCount, OS_MESG_NOBLOCK); gAudioCtx.rspTaskIndex ^= 1; gAudioCtx.curAiBufferIndex++; gAudioCtx.curAiBufferIndex %= 3; @@ -96,7 +96,7 @@ AudioTask* AudioThread_UpdateImpl(void) { if (gAudioCtx.resetStatus != 0) { if (AudioHeap_ResetStep() == 0) { if (gAudioCtx.resetStatus == 0) { - osSendMesg(gAudioCtx.audioResetQueueP, gAudioCtx.specId, OS_MESG_NOBLOCK); + osSendMesg(gAudioCtx.audioResetQueueP, (OSMesg)(uintptr_t)gAudioCtx.specId, OS_MESG_NOBLOCK); } sWaitingAudioTask = NULL; @@ -146,7 +146,7 @@ AudioTask* AudioThread_UpdateImpl(void) { } if (gAudioSPDataPtr == (u64*)gAudioCtx.curAbiCmdBuf) { - return -1; + return (void*)-1; } gAudioCtx.curAbiCmdBuf = @@ -297,16 +297,16 @@ void AudioThread_ProcessGlobalCmd(AudioCmd* cmd) { break; case AUDIOCMD_OP_GLOBAL_SET_CUSTOM_UPDATE_FUNCTION: - gAudioCustomUpdateFunction = cmd->asUInt; + gAudioCustomUpdateFunction = cmd->asPtr; break; case AUDIOCMD_OP_GLOBAL_SET_CUSTOM_FUNCTION: if (cmd->arg2 == AUDIO_CUSTOM_FUNCTION_REVERB) { - gAudioCustomReverbFunction = cmd->asUInt; + gAudioCustomReverbFunction = cmd->asPtr; } else if (cmd->arg2 == AUDIO_CUSTOM_FUNCTION_SYNTH) { - gAudioCustomSynthFunction = cmd->asUInt; + gAudioCustomSynthFunction = cmd->asPtr; } else { - gAudioCtx.customSeqFunctions[cmd->arg2] = cmd->asUInt; + gAudioCtx.customSeqFunctions[cmd->arg2] = cmd->asPtr; } break; @@ -314,7 +314,7 @@ void AudioThread_ProcessGlobalCmd(AudioCmd* cmd) { case AUDIOCMD_OP_GLOBAL_SET_SFX_FONT: case AUDIOCMD_OP_GLOBAL_SET_INSTRUMENT_FONT: if (AudioPlayback_SetFontInstrument(cmd->op - AUDIOCMD_OP_GLOBAL_SET_DRUM_FONT, cmd->arg1, cmd->arg2, - cmd->asInt)) {} + cmd->asPtr)) {} break; case AUDIOCMD_OP_GLOBAL_DISABLE_ALL_SEQPLAYERS: { @@ -791,13 +791,13 @@ void AudioThread_ProcessChannelCmd(SequenceChannel* channel, AudioCmd* cmd) { break; case AUDIOCMD_OP_CHANNEL_SET_SFX_STATE: - channel->sfxState = cmd->asUInt; + channel->sfxState = cmd->asPtr; break; case AUDIOCMD_OP_CHANNEL_SET_FILTER: filterCutoff = cmd->arg2; - if (cmd->asUInt != 0) { - channel->filter = cmd->asUInt; + if (cmd->asPtr != NULL) { + channel->filter = cmd->asPtr; } if (channel->filter != NULL) { AudioHeap_LoadFilter(channel->filter, filterCutoff >> 4, filterCutoff & 0xF); diff --git a/src/boot/O2/loadfragment.c b/src/boot/O2/loadfragment.c index b22b1a692..69fa9959c 100644 --- a/src/boot/O2/loadfragment.c +++ b/src/boot/O2/loadfragment.c @@ -135,10 +135,10 @@ void Fragment_Relocate(void* allocatedRamAddr, OverlayRelocationSection* ovlRelo } } -size_t Fragment_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, void* allocatedRamAddr, +size_t Fragment_Load(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart, void* allocatedRamAddr, size_t allocatedBytes) { size_t size = vromEnd - vromStart; - void* end; + uintptr_t end; s32 pad; OverlayRelocationSection* ovlRelocs; @@ -148,7 +148,7 @@ size_t Fragment_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart end = (uintptr_t)allocatedRamAddr + size; DmaMgr_SendRequest0(allocatedRamAddr, vromStart, size); - ovlRelocs = (OverlayRelocationSection*)((uintptr_t)end - ((s32*)end)[-1]); + ovlRelocs = (OverlayRelocationSection*)(end - ((s32*)end)[-1]); if (gLoadLogSeverity >= 3) {} @@ -161,11 +161,11 @@ size_t Fragment_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart if (gLoadLogSeverity >= 3) {} - Fragment_Relocate(allocatedRamAddr, ovlRelocs, vramStart); + Fragment_Relocate(allocatedRamAddr, ovlRelocs, (uintptr_t)vramStart); if (ovlRelocs->bssSize != 0) { if (gLoadLogSeverity >= 3) {} - bzero(end, ovlRelocs->bssSize); + bzero((void*)end, ovlRelocs->bssSize); } osWritebackDCache(allocatedRamAddr, allocatedBytes); @@ -176,9 +176,9 @@ size_t Fragment_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart return allocatedBytes; } -void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart) { +void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart) { size_t size = vromEnd - vromStart; - void* end; + uintptr_t end; void* allocatedRamAddr; uintptr_t ovlOffset; OverlayRelocationSection* ovlRelocs; @@ -195,8 +195,8 @@ void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t if (gLoadLogSeverity >= 3) {} - ovlOffset = (uintptr_t)end - 4; - ovlRelocs = (OverlayRelocationSection*)((uintptr_t)end - ((s32*)end)[-1]); + ovlOffset = end - sizeof(s32); + ovlRelocs = (OverlayRelocationSection*)(end - ((s32*)end)[-1]); if (1) {} @@ -212,15 +212,15 @@ void* Fragment_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t } end = (uintptr_t)allocatedRamAddr + size; - ovlRelocs = (OverlayRelocationSection*)((uintptr_t)end - *(uintptr_t*)ovlOffset); + ovlRelocs = (OverlayRelocationSection*)(end - *(uintptr_t*)ovlOffset); if (gLoadLogSeverity >= 3) {} - Fragment_Relocate(allocatedRamAddr, ovlRelocs, vramStart); + Fragment_Relocate(allocatedRamAddr, ovlRelocs, (uintptr_t)vramStart); if (ovlRelocs->bssSize != 0) { if (gLoadLogSeverity >= 3) {} - bzero(end, ovlRelocs->bssSize); + bzero((void*)end, ovlRelocs->bssSize); } osInvalICache(allocatedRamAddr, allocatedBytes); diff --git a/src/boot/O2/loadfragment2.c b/src/boot/O2/loadfragment2.c index 6925aaaac..02b3ab218 100644 --- a/src/boot/O2/loadfragment2.c +++ b/src/boot/O2/loadfragment2.c @@ -131,11 +131,11 @@ void Overlay_Relocate(void* allocatedRamAddr, OverlayRelocationSection* ovlReloc } } -size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, uintptr_t vramEnd, - void* allocatedRamAddr) { - s32 pad[2]; +size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, void* ramStart, void* ramEnd, void* allocatedRamAddr) { + uintptr_t vramStart = (uintptr_t)ramStart; + uintptr_t vramEnd = (uintptr_t)ramEnd; s32 size = vromEnd - vromStart; - void* end; + uintptr_t end; OverlayRelocationSection* ovlRelocs; if (gOverlayLogSeverity >= 3) {} @@ -144,7 +144,7 @@ size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, end = (uintptr_t)allocatedRamAddr + size; DmaMgr_SendRequest0(allocatedRamAddr, vromStart, size); - ovlRelocs = (OverlayRelocationSection*)((uintptr_t)end - ((s32*)end)[-1]); + ovlRelocs = (OverlayRelocationSection*)(end - ((s32*)end)[-1]); if (gOverlayLogSeverity >= 3) {} if (gOverlayLogSeverity >= 3) {} @@ -153,7 +153,7 @@ size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, if (ovlRelocs->bssSize != 0) { if (gOverlayLogSeverity >= 3) {} - bzero(end, ovlRelocs->bssSize); + bzero((void*)end, ovlRelocs->bssSize); } size = vramEnd - vramStart; @@ -166,8 +166,8 @@ size_t Overlay_Load(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, return size; } -void* Overlay_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, uintptr_t vramStart, uintptr_t vramEnd) { - void* allocatedRamAddr = SystemArena_MallocR(vramEnd - vramStart); +void* Overlay_AllocateAndLoad(uintptr_t vromStart, uintptr_t vromEnd, void* vramStart, void* vramEnd) { + void* allocatedRamAddr = SystemArena_MallocR((uintptr_t)vramEnd - (uintptr_t)vramStart); if (allocatedRamAddr != NULL) { Overlay_Load(vromStart, vromEnd, vramStart, vramEnd, allocatedRamAddr); diff --git a/src/boot/O2/system_heap.c b/src/boot/O2/system_heap.c index 365d94596..c34129f12 100644 --- a/src/boot/O2/system_heap.c +++ b/src/boot/O2/system_heap.c @@ -8,9 +8,9 @@ #include "global.h" #include "system_malloc.h" -typedef void (*BlockFunc)(void*); -typedef void (*BlockFunc1)(void*, u32); -typedef void (*BlockFunc8)(void*, u32, u32, u32, u32, u32, u32, u32, u32); +typedef void (*BlockFunc)(uintptr_t); +typedef void (*BlockFunc1)(uintptr_t, u32); +typedef void (*BlockFunc8)(uintptr_t, u32, u32, u32, u32, u32, u32, u32, u32); typedef struct InitFunc { /* 0x0 */ uintptr_t nextOffset; @@ -41,7 +41,7 @@ void SystemHeap_Free(void* ptr) { } void SystemHeap_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc blockFunc) { - uintptr_t pos = blk; + uintptr_t pos = (uintptr_t)blk; for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { blockFunc(pos); @@ -49,7 +49,7 @@ void SystemHeap_RunBlockFunc(void* blk, size_t nBlk, size_t blkSize, BlockFunc b } void SystemHeap_RunBlockFunc1(void* blk, size_t nBlk, size_t blkSize, BlockFunc1 blockFunc) { - uintptr_t pos = blk; + uintptr_t pos = (uintptr_t)blk; for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { blockFunc(pos, 2); @@ -62,7 +62,7 @@ void* SystemHeap_RunBlockFunc8(void* blk, size_t nBlk, size_t blkSize, BlockFunc } if ((blk != NULL) && (blockFunc != NULL)) { - uintptr_t pos = blk; + uintptr_t pos = (uintptr_t)blk; for (; pos < (uintptr_t)blk + (nBlk * blkSize); pos += (blkSize & ~0)) { blockFunc(pos, 0, 0, 0, 0, 0, 0, 0, 0); @@ -82,7 +82,7 @@ void SystemHeap_RunBlockFunc1Reverse(void* blk, size_t nBlk, size_t blkSize, Blo } if (blockFunc != NULL) { - start = blk; + start = (uintptr_t)blk; maskedBlkSize = (blkSize & ~0); pos = (uintptr_t)start + (nBlk * blkSize); diff --git a/src/boot/idle.c b/src/boot/idle.c index 0bd07813f..08f6d6ec7 100644 --- a/src/boot/idle.c +++ b/src/boot/idle.c @@ -68,8 +68,8 @@ void Main_Init(void) { prevSize = gDmaMgrDmaBuffSize; gDmaMgrDmaBuffSize = 0; - DmaMgr_SendRequestImpl(&dmaReq, SEGMENT_START(code), SEGMENT_ROM_START(code), - SEGMENT_ROM_END(code) - SEGMENT_ROM_START(code), 0, &mq, NULL); + DmaMgr_SendRequestImpl(&dmaReq, SEGMENT_START(code), SEGMENT_ROM_START(code), SEGMENT_ROM_SIZE_ALT(code), 0, &mq, + NULL); Main_InitScreen(); Main_InitMemory(); osRecvMesg(&mq, NULL, OS_MESG_BLOCK); diff --git a/src/code/TwoHeadArena.c b/src/code/TwoHeadArena.c index a476c3d74..c6a802e04 100644 --- a/src/code/TwoHeadArena.c +++ b/src/code/TwoHeadArena.c @@ -32,7 +32,7 @@ void* THA_GetTail(TwoHeadArena* tha) { void* THA_AllocHead(TwoHeadArena* tha, size_t size) { void* start = tha->head; - tha->head = (u8*)tha->head + size; + tha->head = (void*)((uintptr_t)tha->head + size); return start; } @@ -102,8 +102,8 @@ void* THA_AllocTailAlign(TwoHeadArena* tha, size_t size, uintptr_t mask) { * * @return Remaining size. A negative number indicates an overflow. */ -s32 THA_GetRemaining(TwoHeadArena* tha) { - return (s32)((u8*)tha->tail - (u8*)tha->head); +ptrdiff_t THA_GetRemaining(TwoHeadArena* tha) { + return (uintptr_t)tha->tail - (uintptr_t)tha->head; } /** @@ -115,7 +115,7 @@ u32 THA_IsCrash(TwoHeadArena* tha) { void THA_Reset(TwoHeadArena* tha) { tha->head = tha->start; - tha->tail = (u8*)tha->start + tha->size; + tha->tail = (void*)((uintptr_t)tha->start + tha->size); } /** diff --git a/src/code/graph.c b/src/code/graph.c index 3a178d2b8..7b67b8487 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -44,7 +44,7 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) { GfxPool* pool = &gGfxPools[gfxCtx->gfxPoolIdx % 2]; gGfxMasterDL = &pool->master; - gSegments[0x0E] = gGfxMasterDL; + gSegments[0x0E] = (uintptr_t)gGfxMasterDL; pool->headMagic = GFXPOOL_HEAD_MAGIC; pool->tailMagic = GFXPOOL_TAIL_MAGIC; @@ -62,7 +62,7 @@ void Graph_SetNextGfxPool(GraphicsContext* gfxCtx) { gfxCtx->debugBuffer = pool->debugBuffer; gfxCtx->curFrameBuffer = SysCfb_GetFramebuffer(gfxCtx->framebufferIndex % 2); - gSegments[0x0F] = gfxCtx->curFrameBuffer; + gSegments[0x0F] = (uintptr_t)gfxCtx->curFrameBuffer; gfxCtx->zbuffer = SysCfb_GetZBuffer(); @@ -180,7 +180,7 @@ retry: task->dramStack = (u64*)gGfxSPTaskStack; task->dramStackSize = sizeof(gGfxSPTaskStack); task->outputBuff = gGfxSPTaskOutputBufferPtr; - task->outputBuffSize = gGfxSPTaskOutputBufferEnd; + task->outputBuffSize = (void*)gGfxSPTaskOutputBufferEnd; task->dataPtr = (u64*)gGfxMasterDL; task->dataSize = 0; task->yieldDataPtr = (u64*)gGfxSPTaskYieldBuffer; diff --git a/src/code/main.c b/src/code/main.c index d3840eca5..14ee841ce 100644 --- a/src/code/main.c +++ b/src/code/main.c @@ -53,10 +53,10 @@ void Main(void* arg) { Check_RegionIsSupported(); Check_ExpansionPak(); - sysHeap = gSystemHeap; + sysHeap = (intptr_t)gSystemHeap; fb = 0x80780000; gSystemHeapSize = fb - sysHeap; - SystemHeap_Init(sysHeap, gSystemHeapSize); + SystemHeap_Init((void*)sysHeap, gSystemHeapSize); Regs_Init(); diff --git a/src/code/sched.c b/src/code/sched.c index f16880b61..c7fb5a495 100644 --- a/src/code/sched.c +++ b/src/code/sched.c @@ -95,8 +95,9 @@ void Sched_HandleAudioCancel(SchedContext* sched) { // AUDIO SP seems to be stopped osSyncPrintf("AUDIO SP止まっているようです\n"); } + send_mesg: - osSendMesg(&sched->interruptQ, RSP_DONE_MSG, OS_MESG_NOBLOCK); + osSendMesg(&sched->interruptQ, (OSMesg)RSP_DONE_MSG, OS_MESG_NOBLOCK); return; } @@ -157,8 +158,9 @@ void Sched_HandleGfxCancel(SchedContext* sched) { // GRAPH SP seems to be stopped osSyncPrintf("GRAPH SP止まっているようです\n"); } + send_mesg: - osSendMesg(&sched->interruptQ, RSP_DONE_MSG, OS_MESG_NOBLOCK); + osSendMesg(&sched->interruptQ, (OSMesg)RSP_DONE_MSG, OS_MESG_NOBLOCK); goto halt_rdp; } @@ -186,8 +188,8 @@ halt_rdp: if (dpTask->type == M_GFXTASK) { // Try to stop DP osSyncPrintf("DP止めようとします\n"); - bzero(dpTask->outputBuff, (u32)dpTask->outputBuffSize - (u32)dpTask->outputBuff); - osSendMesg(&sched->interruptQ, RDP_DONE_MSG, OS_MESG_NOBLOCK); + bzero(dpTask->outputBuff, (uintptr_t)dpTask->outputBuffSize - (uintptr_t)dpTask->outputBuff); + osSendMesg(&sched->interruptQ, (OSMesg)RDP_DONE_MSG, OS_MESG_NOBLOCK); } } } @@ -503,7 +505,7 @@ void Sched_HandleRDPDone(SchedContext* sched) { * been sent down the command queue. */ void Sched_SendEntryMsg(SchedContext* sched) { - osSendMesg(&sched->interruptQ, ENTRY_MSG, OS_MESG_BLOCK); + osSendMesg(&sched->interruptQ, (OSMesg)ENTRY_MSG, OS_MESG_BLOCK); } /** @@ -511,7 +513,7 @@ void Sched_SendEntryMsg(SchedContext* sched) { * to stop the last dispatched audio task. */ void Sched_SendAudioCancelMsg(SchedContext* sched) { - osSendMesg(&sched->interruptQ, RDP_AUDIO_CANCEL_MSG, OS_MESG_BLOCK); + osSendMesg(&sched->interruptQ, (OSMesg)RDP_AUDIO_CANCEL_MSG, OS_MESG_BLOCK); } /** @@ -519,7 +521,7 @@ void Sched_SendAudioCancelMsg(SchedContext* sched) { * to stop the last dispatched gfx task. */ void Sched_SendGfxCancelMsg(SchedContext* sched) { - osSendMesg(&sched->interruptQ, RSP_GFX_CANCEL_MSG, OS_MESG_BLOCK); + osSendMesg(&sched->interruptQ, (OSMesg)RSP_GFX_CANCEL_MSG, OS_MESG_BLOCK); } /** @@ -554,14 +556,14 @@ void Sched_FaultClient(void* param1, void* param2) { * threads or the OS. */ void Sched_ThreadEntry(void* arg) { - OSMesg msg = NULL; + s32 msg = 0; SchedContext* sched = (SchedContext*)arg; while (true) { - osRecvMesg(&sched->interruptQ, &msg, OS_MESG_BLOCK); + osRecvMesg(&sched->interruptQ, (OSMesg*)&msg, OS_MESG_BLOCK); // Check if it's a message from another thread or the OS - switch ((s32)msg) { + switch (msg) { case RDP_AUDIO_CANCEL_MSG: Sched_HandleAudioCancel(sched); continue; @@ -582,6 +584,7 @@ void Sched_ThreadEntry(void* arg) { Sched_HandleRDPDone(sched); continue; } + // Check if it's a message from the IrqMgr switch (((OSScMsg*)msg)->type) { case OS_SC_RETRACE_MSG: @@ -611,8 +614,8 @@ void Sched_Init(SchedContext* sched, void* stack, OSPri pri, u8 viModeType, UNK_ osCreateMesgQueue(&sched->interruptQ, sched->intBuf, ARRAY_COUNT(sched->intBuf)); osCreateMesgQueue(&sched->cmdQ, sched->cmdMsgBuf, ARRAY_COUNT(sched->cmdMsgBuf)); - osSetEventMesg(OS_EVENT_SP, &sched->interruptQ, RSP_DONE_MSG); - osSetEventMesg(OS_EVENT_DP, &sched->interruptQ, RDP_DONE_MSG); + osSetEventMesg(OS_EVENT_SP, &sched->interruptQ, (OSMesg)RSP_DONE_MSG); + osSetEventMesg(OS_EVENT_DP, &sched->interruptQ, (OSMesg)RDP_DONE_MSG); IrqMgr_AddClient(irqMgr, &sched->irqClient, &sched->interruptQ); Fault_AddClient(&sSchedFaultClient, Sched_FaultClient, sched, NULL); osCreateThread(&sched->thread, Z_THREAD_ID_SCHED, Sched_ThreadEntry, sched, stack, pri); diff --git a/src/code/sys_cmpdma.c b/src/code/sys_cmpdma.c index 715892b49..9e1a66d2e 100644 --- a/src/code/sys_cmpdma.c +++ b/src/code/sys_cmpdma.c @@ -43,9 +43,9 @@ void func_80178AC0(u16* src, void* dst, size_t size) { } } -void CmpDma_GetFileInfo(u8* segmentRom, s32 id, uintptr_t* outFileRom, size_t* size, s32* flag) { - u32 dataStart; - u32 refOff; +void CmpDma_GetFileInfo(uintptr_t segmentRom, s32 id, uintptr_t* outFileRom, size_t* size, s32* flag) { + uintptr_t dataStart; + uintptr_t refOff; DmaMgr_DmaRomToRam(segmentRom, &sDmaBuffer.dataStart, sizeof(sDmaBuffer.dataStart)); @@ -53,12 +53,12 @@ void CmpDma_GetFileInfo(u8* segmentRom, s32 id, uintptr_t* outFileRom, size_t* s refOff = id * sizeof(u32); // if id is >= idMax - if (refOff > (dataStart - 4)) { + if (refOff > (dataStart - sizeof(u32))) { *outFileRom = segmentRom; *size = 0; } else if (refOff == 0) { // get offset start of next file, i.e. size of first file - DmaMgr_DmaRomToRam(segmentRom + 4, &sDmaBuffer.dataSize, sizeof(sDmaBuffer.dataSize)); + DmaMgr_DmaRomToRam(segmentRom + sizeof(u32), &sDmaBuffer.dataSize, sizeof(sDmaBuffer.dataSize)); *outFileRom = segmentRom + dataStart; *size = sDmaBuffer.dataSize; } else { diff --git a/src/code/sys_flashrom.c b/src/code/sys_flashrom.c index 6666a26db..5ebc5dcba 100644 --- a/src/code/sys_flashrom.c +++ b/src/code/sys_flashrom.c @@ -206,12 +206,12 @@ void SysFlashrom_ThreadEntry(void* arg) { switch (req->requestType) { case FLASHROM_REQUEST_WRITE: req->response = SysFlashrom_WriteData(req->addr, req->pageNum, req->pageCount); - osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK); + osSendMesg(&req->messageQueue, (OSMesg)req->response, OS_MESG_BLOCK); break; case FLASHROM_REQUEST_READ: req->response = SysFlashrom_ReadData(req->addr, req->pageNum, req->pageCount); - osSendMesg(&req->messageQueue, req->response, OS_MESG_BLOCK); + osSendMesg(&req->messageQueue, (OSMesg)req->response, OS_MESG_BLOCK); break; } } diff --git a/src/code/z_DLF.c b/src/code/z_DLF.c index cb226b30c..e71339bbb 100644 --- a/src/code/z_DLF.c +++ b/src/code/z_DLF.c @@ -8,15 +8,17 @@ void Overlay_LoadGameState(GameStateOverlay* overlayEntry) { if (overlayEntry->loadedRamAddr != NULL) { return; } + vramStart = overlayEntry->vramStart; if (vramStart == NULL) { overlayEntry->unk_28 = 0; return; } - overlayEntry->loadedRamAddr = Overlay_AllocateAndLoad(overlayEntry->vromStart, overlayEntry->vromEnd, - (uintptr_t)vramStart, (uintptr_t)overlayEntry->vramEnd); - if (overlayEntry->loadedRamAddr != NULL) { + overlayEntry->loadedRamAddr = + Overlay_AllocateAndLoad(overlayEntry->vromStart, overlayEntry->vromEnd, vramStart, overlayEntry->vramEnd); + + if (overlayEntry->loadedRamAddr != NULL) { overlayEntry->unk_14 = (void*)(uintptr_t)((overlayEntry->unk_14 != NULL) ? (void*)((uintptr_t)overlayEntry->unk_14 - (intptr_t)((uintptr_t)overlayEntry->vramStart - @@ -69,11 +71,11 @@ void Overlay_FreeGameState(GameStateOverlay* overlayEntry) { (uintptr_t)overlayEntry->loadedRamAddr)) : NULL); - overlayEntry->destroy = (uintptr_t)((overlayEntry->destroy != NULL) - ? (void*)((uintptr_t)overlayEntry->destroy + - (intptr_t)((uintptr_t)overlayEntry->vramStart - - (uintptr_t)overlayEntry->loadedRamAddr)) - : NULL); + overlayEntry->destroy = (void*)(uintptr_t)((overlayEntry->destroy != NULL) + ? (void*)((uintptr_t)overlayEntry->destroy + + (intptr_t)((uintptr_t)overlayEntry->vramStart - + (uintptr_t)overlayEntry->loadedRamAddr)) + : NULL); overlayEntry->unk_20 = (void*)(uintptr_t)((overlayEntry->unk_20 != NULL) ? (void*)((uintptr_t)overlayEntry->unk_20 + diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 56c6baf15..36ce7e581 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -477,7 +477,7 @@ PlayerMeleeWeaponState func_800CBAAC(Camera* camera) { } } -s32 Camera_GetFocalActorPos(Vec3f* dst, Camera* camera) { +Vec3f* Camera_GetFocalActorPos(Vec3f* dst, Camera* camera) { PosRot focalPosRot; Actor* focalActor = camera->focalActor; diff --git a/src/code/z_kanfont.c b/src/code/z_kanfont.c index 68c0fdd01..2a42998b4 100644 --- a/src/code/z_kanfont.c +++ b/src/code/z_kanfont.c @@ -9,13 +9,13 @@ void Font_LoadCharNES(PlayState* play, u8 codePointIndex, s32 offset) { Font* font = &msgCtx->font; DmaMgr_SendRequest0(&font->charBuf[font->unk_11D88][offset], - &((u8*)SEGMENT_ROM_START(nes_font_static))[(codePointIndex - ' ') * FONT_CHAR_TEX_SIZE], + SEGMENT_ROM_START_OFFSET(nes_font_static, (codePointIndex - ' ') * FONT_CHAR_TEX_SIZE), FONT_CHAR_TEX_SIZE); } void Font_LoadMessageBoxEndIcon(Font* font, u16 icon) { DmaMgr_SendRequest0(&font->iconBuf, - &((u8*)SEGMENT_ROM_START(message_static))[5 * 0x1000 + icon * FONT_CHAR_TEX_SIZE], + SEGMENT_ROM_START_OFFSET(message_static, 5 * 0x1000 + icon * FONT_CHAR_TEX_SIZE), FONT_CHAR_TEX_SIZE); } @@ -39,8 +39,7 @@ void Font_LoadOrderedFont(Font* font) { loadOffset = 0; } - DmaMgr_SendRequest0(writeLocation, (uintptr_t)SEGMENT_ROM_START(nes_font_static) + loadOffset, - FONT_CHAR_TEX_SIZE); + DmaMgr_SendRequest0(writeLocation, SEGMENT_ROM_START(nes_font_static) + loadOffset, FONT_CHAR_TEX_SIZE); if (sFontOrdering[codePointIndex] == 0x8C) { break; } diff --git a/src/code/z_lib.c b/src/code/z_lib.c index cf5666ed4..afbcba0ed 100644 --- a/src/code/z_lib.c +++ b/src/code/z_lib.c @@ -715,11 +715,11 @@ void* Lib_SegmentedToVirtualNull(void* ptr) { * the NULL virtual address being 0x00000000 and not 0x80000000. Used by transition overlays, which store their * addresses in 24-bit fields. */ -void* Lib_VirtualToPhysical(void* ptr) { +uintptr_t Lib_VirtualToPhysical(void* ptr) { if (ptr == NULL) { - return NULL; + return 0; } else { - return (void*)OS_K0_TO_PHYSICAL(ptr); + return OS_K0_TO_PHYSICAL(ptr); } } @@ -728,8 +728,8 @@ void* Lib_VirtualToPhysical(void* ptr) { * the NULL virtual address being 0x00000000 and not 0x80000000. Used by transition overlays, which store their * addresses in 24-bit fields. */ -void* Lib_PhysicalToVirtual(void* ptr) { - if (ptr == NULL) { +void* Lib_PhysicalToVirtual(uintptr_t ptr) { + if (ptr == 0) { return NULL; } else { return OS_PHYSICAL_TO_K0(ptr); diff --git a/src/code/z_message.c b/src/code/z_message.c index 4bc104fec..53f4cbdf7 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -2275,8 +2275,8 @@ void Message_Decode(PlayState* play) { spC0 += playerNameLen * (16.0f * msgCtx->textCharScale); } else if (curChar == 0x201) { DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, - (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); + DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, + 0x900); spE0 = 2; spD2 = 2; msgCtx->unk12012 = msgCtx->textboxY + 8; @@ -3049,7 +3049,7 @@ void func_80150A84(PlayState* play) { if (D_801CFC78[textBoxType] != 14) { DmaMgr_SendRequest0(msgCtx->textboxSegment, - &SEGMENT_ROM_START(message_static)[D_801CFC78[textBoxType] * 0x1000], 0x1000); + SEGMENT_ROM_START(message_static) + D_801CFC78[textBoxType] * 0x1000, 0x1000); if (!play->pauseCtx.bombersNotebookOpen) { if ((textBoxType == TEXTBOX_TYPE_0) || (textBoxType == TEXTBOX_TYPE_6) || (textBoxType == TEXTBOX_TYPE_A) || @@ -3176,17 +3176,17 @@ void Message_OpenText(PlayState* play, u16 textId) { if (msgCtx->textIsCredits) { Message_FindCreditsMessage(play, textId); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(staff_message_data_static)[font->messageStart], + DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(staff_message_data_static) + font->messageStart, font->messageEnd); } else if (gSaveContext.options.language == LANGUAGE_JPN) { Message_FindMessage(play, textId); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, font->messageEnd); } else { Message_FindMessageNES(play, textId); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, font->messageEnd); } @@ -3275,12 +3275,12 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2) { if (gSaveContext.options.language == LANGUAGE_JPN) { Message_FindMessage(play, arg1); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, font->messageEnd); } else { Message_FindMessageNES(play, arg1); msgCtx->msgLength = font->messageEnd; - DmaMgr_SendRequest0(&font->msgBuf, &SEGMENT_ROM_START(message_data_static)[font->messageStart], + DmaMgr_SendRequest0(&font->msgBuf, SEGMENT_ROM_START(message_data_static) + font->messageStart, font->messageEnd); } msgCtx->choiceNum = 0; @@ -3295,7 +3295,7 @@ void func_801514B0(PlayState* play, u16 arg1, u8 arg2) { msgCtx->textBoxPos = arg2; msgCtx->unk11F0C = msgCtx->unk11F08 & 0xF; msgCtx->textUnskippable = true; - DmaMgr_SendRequest0(msgCtx->textboxSegment, &SEGMENT_ROM_START(message_static)[D_801CFC78[0] << 12], 0x1000); + DmaMgr_SendRequest0(msgCtx->textboxSegment, SEGMENT_ROM_START(message_static) + (D_801CFC78[0] << 12), 0x1000); msgCtx->textboxColorRed = 0; msgCtx->textboxColorGreen = 0; msgCtx->textboxColorBlue = 0; diff --git a/src/code/z_message_tables.inc.c b/src/code/z_message_tables.inc.c index fb60e7a14..a7b41c8a9 100644 --- a/src/code/z_message_tables.inc.c +++ b/src/code/z_message_tables.inc.c @@ -2,1171 +2,1560 @@ #include "PR/mbi.h" MessageTableEntry D_801C6B98[4590] = { - { 0, 0, 0x08000000 }, { 2, 0, 0x0800000C }, { 4, 0, 0x08000064 }, { 5, 0, 0x080000B8 }, - { 6, 0, 0x08000110 }, { 7, 0, 0x08000168 }, { 8, 0, 0x080001C4 }, { 9, 0, 0x08000248 }, - { 0xA, 0, 0x080002A8 }, { 0xB, 0, 0x08000310 }, { 0xC, 0, 0x0800031C }, { 0xD, 0, 0x080003E8 }, - { 0xE, 0, 0x08000474 }, { 0xF, 0, 0x080004BC }, { 0x10, 0, 0x08000504 }, { 0x11, 0, 0x08000510 }, - { 0x12, 0, 0x08000554 }, { 0x13, 0, 0x08000560 }, { 0x14, 0, 0x0800056C }, { 0x15, 0, 0x08000604 }, - { 0x16, 0, 0x080006A0 }, { 0x17, 0, 0x0800073C }, { 0x18, 0, 0x080007D8 }, { 0x19, 0, 0x08000874 }, - { 0x1A, 0, 0x08000940 }, { 0x1B, 0, 0x080009E8 }, { 0x1C, 0, 0x08000A84 }, { 0x1D, 0, 0x08000AD4 }, - { 0x1E, 0, 0x08000B28 }, { 0x1F, 0, 0x08000B58 }, { 0x20, 0, 0x08000B88 }, { 0x21, 0, 0x08000BB8 }, - { 0x22, 0, 0x08000BE8 }, { 0x23, 0, 0x08000C78 }, { 0x24, 0, 0x08000CD0 }, { 0x25, 0, 0x08000D30 }, - { 0x26, 0, 0x08000DA4 }, { 0x27, 0, 0x08000E38 }, { 0x28, 0, 0x08000EB4 }, { 0x29, 0, 0x08000F88 }, - { 0x2A, 0, 0x08001060 }, { 0x2B, 0, 0x0800113C }, { 0x2C, 0, 0x08001148 }, { 0x2D, 0, 0x08001154 }, - { 0x2E, 0, 0x08001160 }, { 0x2F, 0, 0x08001210 }, { 0x30, 0, 0x0800121C }, { 0x31, 0, 0x08001228 }, - { 0x32, 0, 0x08001234 }, { 0x33, 0, 0x080012D4 }, { 0x34, 0, 0x0800139C }, { 0x35, 0, 0x08001428 }, - { 0x36, 0, 0x080014B0 }, { 0x37, 0, 0x08001554 }, { 0x38, 0, 0x08001560 }, { 0x39, 0, 0x08001624 }, - { 0x3A, 0, 0x080016B8 }, { 0x3B, 0, 0x08001768 }, { 0x3C, 0, 0x08001814 }, { 0x3D, 0, 0x08001884 }, - { 0x3E, 0, 0x080018E0 }, { 0x3F, 0, 0x080019DC }, { 0x40, 0, 0x08001A48 }, { 0x41, 0, 0x08001A54 }, - { 0x42, 0, 0x08001B0C }, { 0x43, 0, 0x08001BF4 }, { 0x4C, 0, 0x08001CBC }, { 0x4D, 0, 0x08001DBC }, - { 0x4E, 0, 0x08001DC8 }, { 0x50, 0, 0x08001DD4 }, { 0x51, 0, 0x08001EA4 }, { 0x52, 0, 0x08001EB0 }, - { 0x53, 0, 0x08001EFC }, { 0x54, 0, 0x08001F08 }, { 0x55, 0, 0x08001F14 }, { 0x56, 0, 0x08001FB8 }, - { 0x57, 0, 0x08002058 }, { 0x58, 0, 0x080020F8 }, { 0x59, 0, 0x080021A0 }, { 0x5A, 0, 0x08002290 }, - { 0x5B, 0, 0x080022E4 }, { 0x5C, 0, 0x08002388 }, { 0x5D, 0, 0x08002434 }, { 0x5E, 0, 0x080024E8 }, - { 0x5F, 0, 0x08002590 }, { 0x60, 0, 0x0800261C }, { 0x61, 0, 0x080026F0 }, { 0x62, 0, 0x080026FC }, - { 0x63, 0, 0x08002760 }, { 0x64, 0, 0x080027CC }, { 0x65, 0, 0x080027D8 }, { 0x66, 0, 0x0800282C }, - { 0x67, 0, 0x08002884 }, { 0x68, 0, 0x080028EC }, { 0x69, 0, 0x08002950 }, { 0x6A, 0, 0x080029CC }, - { 0x6B, 0, 0x08002A24 }, { 0x6E, 0, 0x08002A7C }, { 0x6F, 0, 0x08002A88 }, { 0x70, 0, 0x08002B54 }, - { 0x71, 0, 0x08002B60 }, { 0x72, 0, 0x08002B6C }, { 0x73, 0, 0x08002B78 }, { 0x74, 0, 0x08002B84 }, - { 0x75, 0, 0x08002B90 }, { 0x76, 0, 0x08002B9C }, { 0x77, 0, 0x08002BA8 }, { 0x78, 0, 0x08002BB4 }, - { 0x79, 0, 0x08002C98 }, { 0x7A, 0, 0x08002D54 }, { 0x7B, 0, 0x08002E14 }, { 0x7C, 0, 0x08002E90 }, - { 0x7D, 0, 0x08002F20 }, { 0x7E, 0, 0x08002F9C }, { 0x7F, 0, 0x0800302C }, { 0x80, 0, 0x0800309C }, - { 0x81, 0, 0x08003144 }, { 0x82, 0, 0x080031B0 }, { 0x83, 0, 0x08003224 }, { 0x84, 0, 0x08003298 }, - { 0x85, 0, 0x08003324 }, { 0x86, 0, 0x08003370 }, { 0x87, 0, 0x08003444 }, { 0x88, 0, 0x080034F8 }, - { 0x89, 0, 0x08003560 }, { 0x8A, 0, 0x080035F4 }, { 0x8B, 0, 0x080036B8 }, { 0x8C, 0, 0x08003710 }, - { 0x8D, 0, 0x080037A0 }, { 0x8E, 0, 0x08003828 }, { 0x8F, 0, 0x080038E0 }, { 0x91, 0, 0x0800396C }, - { 0x92, 0, 0x08003A44 }, { 0x93, 0, 0x08003B08 }, { 0x94, 0, 0x08003B60 }, { 0x95, 0, 0x08003B6C }, - { 0x96, 0, 0x08003BC0 }, { 0x97, 0, 0x08003C1C }, { 0x98, 0, 0x08003C60 }, { 0x99, 0, 0x08003CA8 }, - { 0x9A, 0, 0x08003CF4 }, { 0x9B, 0, 0x08003D40 }, { 0x9C, 0, 0x08003DE0 }, { 0x9D, 0, 0x08003E78 }, - { 0x9E, 0, 0x08003F10 }, { 0x9F, 0, 0x08003FA8 }, { 0xA0, 0, 0x08003FB4 }, { 0xA1, 0, 0x0800401C }, - { 0xA2, 0, 0x08004088 }, { 0xA3, 0, 0x08004094 }, { 0xA4, 0, 0x080040A0 }, { 0xA9, 0, 0x080040AC }, - { 0xAA, 0, 0x08004130 }, { 0xAB, 0, 0x08004198 }, { 0xAC, 0, 0x08004240 }, { 0xAD, 0, 0x0800424C }, - { 0xAE, 0, 0x08004258 }, { 0xAF, 0, 0x08004264 }, { 0xB0, 0, 0x08004270 }, { 0xB1, 0, 0x0800427C }, - { 0xB2, 0, 0x08004288 }, { 0xB4, 0, 0x08004294 }, { 0xB5, 0, 0x08004354 }, { 0xB6, 0, 0x08004418 }, - { 0xB7, 0, 0x080044E0 }, { 0xB8, 0, 0x080045A8 }, { 0xB9, 0, 0x08004670 }, { 0xBA, 0, 0x08004738 }, - { 0xBB, 0, 0x08004744 }, { 0xBC, 0, 0x08004750 }, { 0xBD, 0, 0x0800475C }, { 0xBE, 0, 0x08004768 }, - { 0xBF, 0, 0x08004774 }, { 0xC0, 0, 0x08004780 }, { 0xC4, 0, 0x0800478C }, { 0xC5, 0, 0x080047D0 }, - { 0xC6, 0, 0x08004850 }, { 0xC7, 0, 0x080048D0 }, { 0xC8, 0, 0x08004954 }, { 0xC9, 0, 0x08004A5C }, - { 0xCA, 0, 0x08004AFC }, { 0xCB, 0, 0x08004C14 }, { 0xCC, 0, 0x08004C78 }, { 0xCD, 0, 0x08004CDC }, - { 0xF2, 0, 0x08004D8C }, { 0xF3, 0, 0x08004DC8 }, { 0xF4, 0, 0x08004E3C }, { 0xF5, 0, 0x08004E8C }, - { 0xF6, 0, 0x08004EDC }, { 0xF7, 0, 0x08004F30 }, { 0xF8, 0, 0x08004F70 }, { 0xF9, 0, 0x08004F9C }, - { 0xFA, 0, 0x08005034 }, { 0xFB, 0, 0x08005088 }, { 0xFC, 0, 0x080050FC }, { 0xFD, 0, 0x0800515C }, - { 0xFE, 0, 0x08005184 }, { 0xFF, 0, 0x080051B8 }, { 0x100, 0, 0x08005214 }, { 0x101, 0, 0x08005230 }, - { 0x102, 0, 0x0800524C }, { 0x103, 0, 0x08005268 }, { 0x104, 0, 0x08005284 }, { 0x105, 0, 0x080052A0 }, - { 0x106, 0, 0x080052B8 }, { 0x107, 0, 0x080052D4 }, { 0x108, 0, 0x080052F8 }, { 0x109, 0, 0x0800531C }, - { 0x10A, 0, 0x0800533C }, { 0x10B, 0, 0x08005358 }, { 0x10C, 0, 0x0800537C }, { 0x10D, 0, 0x08005390 }, - { 0x10E, 0, 0x080053A8 }, { 0x10F, 0, 0x080053C4 }, { 0x110, 0, 0x080053DC }, { 0x111, 0, 0x080053FC }, - { 0x112, 0, 0x08005414 }, { 0x113, 0, 0x0800542C }, { 0x114, 0, 0x08005450 }, { 0x115, 0, 0x08005470 }, - { 0x116, 0, 0x0800548C }, { 0x117, 0, 0x080054A8 }, { 0x118, 0, 0x080054BC }, { 0x119, 0, 0x080054D4 }, - { 0x11A, 0, 0x080054F4 }, { 0x11B, 0, 0x08005518 }, { 0x11C, 0, 0x0800553C }, { 0x11D, 0, 0x0800555C }, - { 0x11E, 0, 0x08005578 }, { 0x11F, 0, 0x08005598 }, { 0x120, 0, 0x080055B4 }, { 0x121, 0, 0x080055CC }, - { 0x122, 0, 0x080055E8 }, { 0x123, 0, 0x08005604 }, { 0x124, 0, 0x08005620 }, { 0x125, 0, 0x08005638 }, - { 0x126, 0, 0x0800564C }, { 0x127, 0, 0x08005668 }, { 0x129, 0, 0x08005684 }, { 0x12A, 0, 0x0800569C }, - { 0x12B, 0, 0x080056B8 }, { 0x12C, 0, 0x080056D4 }, { 0x12D, 0, 0x080056F0 }, { 0x12E, 0, 0x0800570C }, - { 0x12F, 0, 0x08005724 }, { 0x130, 0, 0x0800573C }, { 0x131, 0, 0x08005758 }, { 0x132, 0, 0x08005770 }, - { 0x134, 0, 0x08005788 }, { 0x135, 0, 0x080057A4 }, { 0x136, 0, 0x080057C0 }, { 0x137, 0, 0x080057D8 }, - { 0x138, 0, 0x080057F4 }, { 0x139, 0, 0x08005814 }, { 0x13A, 0, 0x0800582C }, { 0x13B, 0, 0x0800584C }, - { 0x13D, 0, 0x08005868 }, { 0x13E, 0, 0x08005884 }, { 0x13F, 0, 0x080058A0 }, { 0x140, 0, 0x080058C4 }, - { 0x141, 0, 0x080058DC }, { 0x142, 0, 0x080058F4 }, { 0x143, 0, 0x08005918 }, { 0x144, 0, 0x08005934 }, - { 0x145, 0, 0x08005954 }, { 0x146, 0, 0x08005970 }, { 0x147, 0, 0x08005988 }, { 0x148, 0, 0x080059A4 }, - { 0x149, 0, 0x080059C0 }, { 0x200, 0, 0x080059D8 }, { 0x201, 0, 0x08005A54 }, { 0x202, 0, 0x08005B48 }, - { 0x203, 0, 0x08005B74 }, { 0x204, 0, 0x08005BE4 }, { 0x205, 0, 0x08005C38 }, { 0x206, 0, 0x08005C94 }, - { 0x207, 0, 0x08005D04 }, { 0x208, 0, 0x08005D2C }, { 0x209, 0, 0x08005D64 }, { 0x20A, 0, 0x08005DB4 }, - { 0x20B, 0, 0x08005E08 }, { 0x20C, 0, 0x08005E14 }, { 0x20D, 0, 0x08005E60 }, { 0x20E, 0, 0x08005ECC }, - { 0x20F, 0, 0x08005ED8 }, { 0x210, 0, 0x08005F74 }, { 0x211, 0, 0x08005FAC }, { 0x212, 0, 0x08005FD4 }, - { 0x213, 0, 0x0800602C }, { 0x214, 0, 0x08006050 }, { 0x215, 0, 0x08006124 }, { 0x216, 0, 0x08006358 }, - { 0x217, 0, 0x080065B8 }, { 0x218, 0, 0x08006620 }, { 0x219, 0, 0x0800668C }, { 0x21A, 0, 0x08006720 }, - { 0x21B, 0, 0x0800674C }, { 0x21D, 0, 0x08006774 }, { 0x21E, 0, 0x080067CC }, { 0x21F, 0, 0x08006874 }, - { 0x220, 0, 0x080068E0 }, { 0x221, 0, 0x08006978 }, { 0x222, 0, 0x08006A04 }, { 0x223, 0, 0x08006A48 }, - { 0x224, 0, 0x08006AE8 }, { 0x225, 0, 0x08006B54 }, { 0x226, 0, 0x08006BB0 }, { 0x227, 0, 0x08006BE8 }, - { 0x228, 0, 0x08006D58 }, { 0x229, 0, 0x08006E18 }, { 0x22A, 0, 0x08006EA0 }, { 0x22B, 0, 0x08006F00 }, - { 0x22C, 0, 0x08006F44 }, { 0x22D, 0, 0x08006F60 }, { 0x22E, 0, 0x08006FB0 }, { 0x22F, 0, 0x08006FC8 }, - { 0x230, 0, 0x08007010 }, { 0x231, 0, 0x080070C0 }, { 0x232, 0, 0x08007110 }, { 0x233, 0, 0x08007158 }, - { 0x234, 0, 0x080071A4 }, { 0x235, 0, 0x08007208 }, { 0x236, 0, 0x0800725C }, { 0x237, 0, 0x080072AC }, - { 0x238, 0, 0x0800730C }, { 0x239, 0, 0x0800734C }, { 0x23A, 0, 0x08007400 }, { 0x23B, 0, 0x08007468 }, - { 0x23C, 0, 0x08007500 }, { 0x23D, 0, 0x08007538 }, { 0x23E, 0, 0x080075E4 }, { 0x23F, 0, 0x080075F0 }, - { 0x240, 0, 0x0800765C }, { 0x241, 0, 0x080076D0 }, { 0x242, 0, 0x08007744 }, { 0x243, 0, 0x080077B0 }, - { 0x244, 0, 0x08007830 }, { 0x245, 0, 0x08007888 }, { 0x246, 0, 0x080078B4 }, { 0x247, 0, 0x08007904 }, - { 0x248, 0, 0x08007950 }, { 0x249, 0, 0x080079A0 }, { 0x24A, 0, 0x080079F0 }, { 0x24B, 0, 0x08007A30 }, - { 0x24C, 0, 0x08007A78 }, { 0x24D, 0, 0x08007AD8 }, { 0x24E, 0, 0x08007B54 }, { 0x24F, 0, 0x08007BE8 }, - { 0x250, 0, 0x08007C88 }, { 0x251, 0, 0x08007CEC }, { 0x252, 0, 0x08007D18 }, { 0x253, 0, 0x08007D68 }, - { 0x254, 0, 0x08007DAC }, { 0x255, 0, 0x08007E04 }, { 0x256, 0, 0x08007E4C }, { 0x257, 0, 0x08007EA4 }, - { 0x258, 0, 0x08007F00 }, { 0x25A, 0, 0x08007F58 }, { 0x25B, 0, 0x08007FA0 }, { 0x25C, 0, 0x08007FDC }, - { 0x25D, 0, 0x08007FF8 }, { 0x25E, 0, 0x08008024 }, { 0x25F, 0, 0x080080E4 }, { 0x260, 0, 0x0800818C }, - { 0x261, 0, 0x080081F8 }, { 0x262, 0, 0x08008288 }, { 0x263, 0, 0x08008304 }, { 0x264, 0, 0x08008344 }, - { 0x265, 0, 0x08008420 }, { 0x302, 0, 0x08008498 }, { 0x303, 0, 0x080085DC }, { 0x304, 0, 0x08008660 }, - { 0x305, 0, 0x080086B4 }, { 0x306, 0, 0x08008720 }, { 0x307, 0, 0x0800872C }, { 0x308, 0, 0x0800875C }, - { 0x309, 0, 0x08008788 }, { 0x30A, 0, 0x080087BC }, { 0x30B, 0, 0x080087E8 }, { 0x30C, 0, 0x08008824 }, - { 0x30D, 0, 0x08008894 }, { 0x30E, 0, 0x080088E4 }, { 0x30F, 0, 0x08008914 }, { 0x310, 0, 0x08008970 }, - { 0x311, 0, 0x080089BC }, { 0x312, 0, 0x080089F0 }, { 0x313, 0, 0x08008A64 }, { 0x314, 0, 0x08008AA4 }, - { 0x315, 0, 0x08008B0C }, { 0x316, 0, 0x08008B64 }, { 0x317, 0, 0x08008BA4 }, { 0x318, 0, 0x08008BF0 }, - { 0x319, 0, 0x08008C48 }, { 0x31A, 0, 0x08008C84 }, { 0x31B, 0, 0x08008CD0 }, { 0x31C, 0, 0x08008D10 }, - { 0x31D, 0, 0x08008D5C }, { 0x31E, 0, 0x08008DCC }, { 0x31F, 0, 0x08008E2C }, { 0x320, 0, 0x08008EBC }, - { 0x321, 0, 0x08008F30 }, { 0x322, 0, 0x08008F60 }, { 0x323, 0, 0x08008F9C }, { 0x324, 0, 0x08008FFC }, - { 0x325, 0, 0x08009044 }, { 0x326, 0, 0x080090A8 }, { 0x327, 0, 0x080090F8 }, { 0x328, 0, 0x08009140 }, - { 0x329, 0, 0x08009188 }, { 0x32A, 0, 0x080091F0 }, { 0x32B, 0, 0x08009240 }, { 0x32C, 0, 0x0800928C }, - { 0x32D, 0, 0x080092F0 }, { 0x32E, 0, 0x08009318 }, { 0x32F, 0, 0x08009358 }, { 0x330, 0, 0x0800939C }, - { 0x331, 0, 0x080093E4 }, { 0x332, 0, 0x08009440 }, { 0x333, 0, 0x0800949C }, { 0x334, 0, 0x08009518 }, - { 0x335, 0, 0x0800955C }, { 0x336, 0, 0x08009598 }, { 0x337, 0, 0x08009658 }, { 0x338, 0, 0x08009680 }, - { 0x339, 0, 0x080096A8 }, { 0x33A, 0, 0x080096C8 }, { 0x33B, 0, 0x080096EC }, { 0x33C, 0, 0x0800973C }, - { 0x33D, 0, 0x08009778 }, { 0x33E, 0, 0x080097BC }, { 0x33F, 0, 0x08009930 }, { 0x340, 0, 0x08009C50 }, - { 0x341, 0, 0x08009CC4 }, { 0x342, 0, 0x08009D30 }, { 0x343, 0, 0x08009D58 }, { 0x3E8, 0, 0x08009D7C }, - { 0x3E9, 0, 0x08009DCC }, { 0x3EA, 0, 0x08009DE8 }, { 0x3EB, 0, 0x08009E2C }, { 0x3EC, 0, 0x08009E54 }, - { 0x3ED, 0, 0x08009EB8 }, { 0x3EE, 0, 0x08009EFC }, { 0x3EF, 0, 0x08009F6C }, { 0x3F0, 0, 0x08009FA0 }, - { 0x3F1, 0, 0x08009FF0 }, { 0x3F2, 0, 0x0800A030 }, { 0x3F3, 0, 0x0800A090 }, { 0x3F4, 0, 0x0800A0D0 }, - { 0x3F5, 0, 0x0800A0F8 }, { 0x3F6, 0, 0x0800A158 }, { 0x3F7, 0, 0x0800A190 }, { 0x3F8, 0, 0x0800A1BC }, - { 0x3F9, 0, 0x0800A214 }, { 0x3FA, 0, 0x0800A25C }, { 0x3FB, 0, 0x0800A29C }, { 0x3FC, 0, 0x0800A2D8 }, - { 0x3FD, 0, 0x0800A31C }, { 0x3FE, 0, 0x0800A40C }, { 0x3FF, 0, 0x0800A478 }, { 0x400, 0, 0x0800A4EC }, - { 0x401, 0, 0x0800A528 }, { 0x402, 0, 0x0800A560 }, { 0x403, 0, 0x0800A5D4 }, { 0x404, 0, 0x0800A608 }, - { 0x405, 0, 0x0800A63C }, { 0x406, 0, 0x0800A680 }, { 0x407, 0, 0x0800A6B8 }, { 0x408, 0, 0x0800A70C }, - { 0x44C, 0, 0x0800A75C }, { 0x44D, 0, 0x0800A850 }, { 0x44E, 0, 0x0800A8B8 }, { 0x44F, 0, 0x0800A904 }, - { 0x450, 0, 0x0800A924 }, { 0x451, 0, 0x0800A974 }, { 0x452, 0, 0x0800A9E8 }, { 0x453, 0, 0x0800AA24 }, - { 0x454, 0, 0x0800AA7C }, { 0x455, 0, 0x0800AAB4 }, { 0x456, 0, 0x0800AB10 }, { 0x457, 0, 0x0800AB44 }, - { 0x458, 0, 0x0800AB78 }, { 0x459, 0, 0x0800AC0C }, { 0x45A, 0, 0x0800AC84 }, { 0x45B, 0, 0x0800ACD0 }, - { 0x45C, 0, 0x0800AD4C }, { 0x45D, 0, 0x0800ADC8 }, { 0x45E, 0, 0x0800AE68 }, { 0x45F, 0, 0x0800AEBC }, - { 0x460, 0, 0x0800AF54 }, { 0x461, 0, 0x0800AF98 }, { 0x462, 0, 0x0800AFC8 }, { 0x463, 0, 0x0800AFE8 }, - { 0x464, 0, 0x0800B044 }, { 0x465, 0, 0x0800B094 }, { 0x466, 0, 0x0800B0CC }, { 0x467, 0, 0x0800B0FC }, - { 0x468, 0, 0x0800B178 }, { 0x469, 0, 0x0800B1B8 }, { 0x46A, 0, 0x0800B1F0 }, { 0x46B, 0, 0x0800B244 }, - { 0x46C, 0, 0x0800B258 }, { 0x46D, 0, 0x0800B2B4 }, { 0x46E, 0, 0x0800B324 }, { 0x46F, 0, 0x0800B374 }, - { 0x470, 0, 0x0800B3A8 }, { 0x471, 0, 0x0800B3F4 }, { 0x472, 0, 0x0800B428 }, { 0x473, 0, 0x0800B484 }, - { 0x474, 0, 0x0800B4A4 }, { 0x475, 0, 0x0800B514 }, { 0x476, 0, 0x0800B570 }, { 0x477, 0, 0x0800B5FC }, - { 0x478, 0, 0x0800B65C }, { 0x479, 0, 0x0800B6CC }, { 0x47A, 0, 0x0800B6FC }, { 0x47B, 0, 0x0800B760 }, - { 0x47C, 0, 0x0800B78C }, { 0x47D, 0, 0x0800B7DC }, { 0x47E, 0, 0x0800B82C }, { 0x4B0, 0, 0x0800B854 }, - { 0x4B1, 0, 0x0800B8B0 }, { 0x4B2, 0, 0x0800B8F8 }, { 0x4B3, 0, 0x0800B93C }, { 0x4B4, 0, 0x0800B994 }, - { 0x4B5, 0, 0x0800B9D0 }, { 0x4B6, 0, 0x0800BA04 }, { 0x4B7, 0, 0x0800BA94 }, { 0x4B8, 0, 0x0800BAC4 }, - { 0x4B9, 0, 0x0800BB4C }, { 0x4BA, 0, 0x0800BB7C }, { 0x4BB, 0, 0x0800BBFC }, { 0x4BC, 0, 0x0800BC28 }, - { 0x4BD, 0, 0x0800BCA4 }, { 0x4BE, 0, 0x0800BCD0 }, { 0x4BF, 0, 0x0800BD58 }, { 0x4C0, 0, 0x0800BD84 }, - { 0x4C1, 0, 0x0800BE18 }, { 0x4C2, 0, 0x0800BE54 }, { 0x4C3, 0, 0x0800BED0 }, { 0x4C4, 0, 0x0800BEEC }, - { 0x4C5, 0, 0x0800BF5C }, { 0x4C6, 0, 0x0800BF78 }, { 0x4C7, 0, 0x0800BFF4 }, { 0x4C8, 0, 0x0800C018 }, - { 0x4C9, 0, 0x0800C0A4 }, { 0x4CA, 0, 0x0800C0D8 }, { 0x4CB, 0, 0x0800C140 }, { 0x4CC, 0, 0x0800C158 }, - { 0x4CD, 0, 0x0800C1E0 }, { 0x4CE, 0, 0x0800C220 }, { 0x4CF, 0, 0x0800C29C }, { 0x4D0, 0, 0x0800C2D0 }, - { 0x4D1, 0, 0x0800C34C }, { 0x4D2, 0, 0x0800C378 }, { 0x4D3, 0, 0x0800C400 }, { 0x4D4, 0, 0x0800C448 }, - { 0x4D5, 0, 0x0800C4BC }, { 0x4D6, 0, 0x0800C4E0 }, { 0x4D7, 0, 0x0800C560 }, { 0x4D8, 0, 0x0800C598 }, - { 0x4D9, 0, 0x0800C604 }, { 0x4DA, 0, 0x0800C63C }, { 0x4DB, 0, 0x0800C6B4 }, { 0x4DC, 0, 0x0800C714 }, - { 0x4DD, 0, 0x0800C784 }, { 0x4DE, 0, 0x0800C7B4 }, { 0x4DF, 0, 0x0800C81C }, { 0x4E0, 0, 0x0800C840 }, - { 0x4E1, 0, 0x0800C8AC }, { 0x4E2, 0, 0x0800C8CC }, { 0x4E3, 0, 0x0800C95C }, { 0x4E4, 0, 0x0800C990 }, - { 0x4E5, 0, 0x0800CA04 }, { 0x4E6, 0, 0x0800CA20 }, { 0x4E7, 0, 0x0800CA9C }, { 0x4E8, 0, 0x0800CAC0 }, - { 0x4E9, 0, 0x0800CB48 }, { 0x4EA, 0, 0x0800CB64 }, { 0x4EB, 0, 0x0800CBE8 }, { 0x4EC, 0, 0x0800CC04 }, - { 0x4ED, 0, 0x0800CC64 }, { 0x4EE, 0, 0x0800CC88 }, { 0x4EF, 0, 0x0800CCE8 }, { 0x4F0, 0, 0x0800CD0C }, - { 0x4F1, 0, 0x0800CD7C }, { 0x514, 0, 0x0800CDA4 }, { 0x515, 0, 0x0800CED0 }, { 0x516, 0, 0x0800CFE8 }, - { 0x517, 0, 0x0800D094 }, { 0x518, 0, 0x0800D128 }, { 0x519, 0, 0x0800D1C8 }, { 0x51A, 0, 0x0800D254 }, - { 0x51B, 0, 0x0800D2A8 }, { 0x51C, 0, 0x0800D318 }, { 0x51D, 0, 0x0800D360 }, { 0x51E, 0, 0x0800D3D0 }, - { 0x51F, 0, 0x0800D418 }, { 0x520, 0, 0x0800D488 }, { 0x521, 0, 0x0800D534 }, { 0x522, 0, 0x0800D5BC }, - { 0x523, 0, 0x0800D65C }, { 0x524, 0, 0x0800D6E4 }, { 0x525, 0, 0x0800D728 }, { 0x526, 0, 0x0800D794 }, - { 0x527, 0, 0x0800D7D0 }, { 0x528, 0, 0x0800D834 }, { 0x529, 0, 0x0800D878 }, { 0x52A, 0, 0x0800D8E4 }, - { 0x52B, 0, 0x0800D98C }, { 0x52C, 0, 0x0800DA2C }, { 0x52D, 0, 0x0800DAC8 }, { 0x52E, 0, 0x0800DB6C }, - { 0x52F, 0, 0x0800DBD4 }, { 0x530, 0, 0x0800DC5C }, { 0x531, 0, 0x0800DCC4 }, { 0x532, 0, 0x0800DD54 }, - { 0x533, 0, 0x0800DDA4 }, { 0x534, 0, 0x0800DE1C }, { 0x535, 0, 0x0800DEC8 }, { 0x536, 0, 0x0800DF50 }, - { 0x537, 0, 0x0800DFF0 }, { 0x538, 0, 0x0800E078 }, { 0x539, 0, 0x0800E0BC }, { 0x53A, 0, 0x0800E128 }, - { 0x53B, 0, 0x0800E16C }, { 0x53C, 0, 0x0800E1D8 }, { 0x53D, 0, 0x0800E21C }, { 0x53E, 0, 0x0800E288 }, - { 0x53F, 0, 0x0800E334 }, { 0x540, 0, 0x0800E414 }, { 0x541, 0, 0x0800E474 }, { 0x542, 0, 0x0800E50C }, - { 0x543, 0, 0x0800E57C }, { 0x544, 0, 0x0800E614 }, { 0x545, 0, 0x0800E678 }, { 0x546, 0, 0x0800E728 }, - { 0x547, 0, 0x0800E794 }, { 0x548, 0, 0x0800E7F4 }, { 0x549, 0, 0x0800E86C }, { 0x54A, 0, 0x0800E8D8 }, - { 0x54B, 0, 0x0800E934 }, { 0x54C, 0, 0x0800E9B4 }, { 0x54D, 0, 0x0800EA28 }, { 0x54E, 0, 0x0800EB08 }, - { 0x54F, 0, 0x0800EB60 }, { 0x550, 0, 0x0800EBC8 }, { 0x551, 0, 0x0800EC2C }, { 0x552, 0, 0x0800ECAC }, - { 0x553, 0, 0x0800ED1C }, { 0x554, 0, 0x0800ED9C }, { 0x555, 0, 0x0800EE00 }, { 0x556, 0, 0x0800EEEC }, - { 0x557, 0, 0x0800EF4C }, { 0x558, 0, 0x0800EFBC }, { 0x559, 0, 0x0800F03C }, { 0x55A, 0, 0x0800F0B4 }, - { 0x55B, 0, 0x0800F110 }, { 0x55C, 0, 0x0800F188 }, { 0x55D, 0, 0x0800F258 }, { 0x55E, 0, 0x0800F300 }, - { 0x55F, 0, 0x0800F398 }, { 0x560, 0, 0x0800F44C }, { 0x561, 0, 0x0800F570 }, { 0x562, 0, 0x0800F688 }, - { 0x563, 0, 0x0800F7A8 }, { 0x564, 0, 0x0800F8B8 }, { 0x565, 0, 0x0800F9D8 }, { 0x566, 0, 0x0800FAEC }, - { 0x567, 0, 0x0800FB84 }, { 0x568, 0, 0x0800FC34 }, { 0x569, 0, 0x0800FCC8 }, { 0x56A, 0, 0x0800FD78 }, - { 0x56B, 0, 0x0800FE0C }, { 0x56C, 0, 0x0800FEBC }, { 0x56D, 0, 0x08010008 }, { 0x56E, 0, 0x08010168 }, - { 0x56F, 0, 0x080102C4 }, { 0x570, 0, 0x0801042C }, { 0x571, 0, 0x08010584 }, { 0x572, 0, 0x080106EC }, - { 0x573, 0, 0x08010844 }, { 0x578, 0, 0x080109A4 }, { 0x579, 0, 0x08010A70 }, { 0x57A, 0, 0x08010B28 }, - { 0x57B, 0, 0x08010C7C }, { 0x57C, 0, 0x08010D98 }, { 0x57D, 0, 0x08010EC4 }, { 0x57E, 0, 0x08010FF4 }, - { 0x57F, 0, 0x080110E4 }, { 0x580, 0, 0x080111D0 }, { 0x582, 0, 0x08011260 }, { 0x583, 0, 0x08011304 }, - { 0x584, 0, 0x08011374 }, { 0x585, 0, 0x08011408 }, { 0x586, 0, 0x080114BC }, { 0x587, 0, 0x08011528 }, - { 0x588, 0, 0x080115C0 }, { 0x589, 0, 0x08011674 }, { 0x58A, 0, 0x080116E4 }, { 0x58B, 0, 0x08011760 }, - { 0x58C, 0, 0x08011820 }, { 0x58D, 0, 0x08011884 }, { 0x58E, 0, 0x0801192C }, { 0x58F, 0, 0x08011A20 }, - { 0x590, 0, 0x08011B08 }, { 0x591, 0, 0x08011B68 }, { 0x592, 0, 0x08011BA4 }, { 0x593, 0, 0x08011BE4 }, - { 0x594, 0, 0x08011C20 }, { 0x595, 0, 0x08011D00 }, { 0x59C, 0, 0x08011DC8 }, { 0x59D, 0, 0x08011E78 }, - { 0x59E, 0, 0x08011EB4 }, { 0x59F, 0, 0x08011EFC }, { 0x5A0, 0, 0x08011FB4 }, { 0x5A1, 0, 0x08012068 }, - { 0x5A2, 0, 0x080120A4 }, { 0x5A3, 0, 0x080120E4 }, { 0x5A4, 0, 0x08012198 }, { 0x5A5, 0, 0x08012248 }, - { 0x5A6, 0, 0x08012284 }, { 0x5A7, 0, 0x080122C4 }, { 0x5A8, 0, 0x08012380 }, { 0x5A9, 0, 0x0801243C }, - { 0x5AA, 0, 0x08012478 }, { 0x5DC, 0, 0x080124B8 }, { 0x5DD, 0, 0x08012548 }, { 0x5DE, 0, 0x080125BC }, - { 0x5DF, 0, 0x08012678 }, { 0x5E0, 0, 0x08012730 }, { 0x5E1, 0, 0x0801276C }, { 0x5E2, 0, 0x08012784 }, - { 0x5E3, 0, 0x080127C4 }, { 0x5E4, 0, 0x080128A8 }, { 0x5E5, 0, 0x080128E0 }, { 0x5E6, 0, 0x0801294C }, - { 0x5E7, 0, 0x08012970 }, { 0x5E8, 0, 0x080129A4 }, { 0x5E9, 0, 0x08012A5C }, { 0x5EA, 0, 0x08012ACC }, - { 0x5EB, 0, 0x08012B4C }, { 0x5EC, 0, 0x08012BF0 }, { 0x5ED, 0, 0x08012CE0 }, { 0x5EE, 0, 0x08012D84 }, - { 0x5EF, 0, 0x08012DE4 }, { 0x5F0, 0, 0x08012E1C }, { 0x5F1, 0, 0x08012E7C }, { 0x5F2, 0, 0x08012EF0 }, - { 0x5F3, 0, 0x08012FAC }, { 0x5F4, 0, 0x08013060 }, { 0x5F5, 0, 0x080130F4 }, { 0x5F6, 0, 0x0801315C }, - { 0x5F7, 0, 0x08013210 }, { 0x5F8, 0, 0x08013258 }, { 0x60E, 0, 0x080132B0 }, { 0x60F, 0, 0x08013368 }, - { 0x610, 0, 0x08013470 }, { 0x611, 0, 0x08013530 }, { 0x612, 0, 0x080135F8 }, { 0x613, 0, 0x08013680 }, - { 0x614, 0, 0x080137D0 }, { 0x615, 0, 0x0801386C }, { 0x616, 0, 0x08013944 }, { 0x617, 0, 0x080139B8 }, - { 0x618, 0, 0x08013A44 }, { 0x619, 0, 0x08013AA8 }, { 0x61A, 0, 0x08013BFC }, { 0x61B, 0, 0x08013C5C }, - { 0x61C, 0, 0x08013CB0 }, { 0x61D, 0, 0x08013D00 }, { 0x61E, 0, 0x08013D60 }, { 0x61F, 0, 0x08013DAC }, - { 0x620, 0, 0x08013DEC }, { 0x621, 0, 0x08013E4C }, { 0x622, 0, 0x08013E80 }, { 0x623, 0, 0x08013ED8 }, - { 0x624, 0, 0x08013F24 }, { 0x625, 0, 0x08013FEC }, { 0x626, 0, 0x08014010 }, { 0x627, 0, 0x08014064 }, - { 0x628, 0, 0x080140C4 }, { 0x629, 0, 0x08014170 }, { 0x62A, 0, 0x08014208 }, { 0x62B, 0, 0x080142D0 }, - { 0x62C, 0, 0x08014398 }, { 0x640, 0, 0x0801454C }, { 0x641, 0, 0x0801458C }, { 0x642, 0, 0x080145B4 }, - { 0x644, 0, 0x080145F0 }, { 0x645, 0, 0x08014608 }, { 0x646, 0, 0x08014648 }, { 0x647, 0, 0x080146B0 }, - { 0x648, 0, 0x080146D4 }, { 0x649, 0, 0x08014760 }, { 0x64A, 0, 0x08014798 }, { 0x64B, 0, 0x08014850 }, - { 0x64C, 0, 0x08014898 }, { 0x64D, 0, 0x080148B4 }, { 0x64E, 0, 0x08014924 }, { 0x64F, 0, 0x08014988 }, - { 0x650, 0, 0x080149F0 }, { 0x651, 0, 0x08014A50 }, { 0x652, 0, 0x08014A8C }, { 0x653, 0, 0x08014AF4 }, - { 0x654, 0, 0x08014B34 }, { 0x655, 0, 0x08014B9C }, { 0x656, 0, 0x08014BD8 }, { 0x657, 0, 0x08014C38 }, - { 0x658, 0, 0x08014C78 }, { 0x659, 0, 0x08014CBC }, { 0x65A, 0, 0x08014D10 }, { 0x65B, 0, 0x08014D94 }, - { 0x65C, 0, 0x08014E68 }, { 0x65D, 0, 0x08014F18 }, { 0x65E, 0, 0x08014F5C }, { 0x65F, 0, 0x08014F88 }, - { 0x660, 0, 0x08014FD0 }, { 0x661, 0, 0x08015024 }, { 0x662, 0, 0x080150F0 }, { 0x663, 0, 0x08015188 }, - { 0x664, 0, 0x080151AC }, { 0x665, 0, 0x080151E4 }, { 0x666, 0, 0x08015248 }, { 0x667, 0, 0x0801529C }, - { 0x668, 0, 0x080152CC }, { 0x669, 0, 0x0801532C }, { 0x66A, 0, 0x08015390 }, { 0x66B, 0, 0x080153E4 }, - { 0x66C, 0, 0x08015450 }, { 0x66D, 0, 0x080154BC }, { 0x66E, 0, 0x08015550 }, { 0x66F, 0, 0x080155C0 }, - { 0x670, 0, 0x08015600 }, { 0x671, 0, 0x08015634 }, { 0x672, 0, 0x0801568C }, { 0x673, 0, 0x080156C8 }, - { 0x674, 0, 0x0801574C }, { 0x675, 0, 0x08015784 }, { 0x676, 0, 0x080157F8 }, { 0x677, 0, 0x0801588C }, - { 0x678, 0, 0x080158E4 }, { 0x679, 0, 0x08015940 }, { 0x67A, 0, 0x08015994 }, { 0x67B, 0, 0x080159E8 }, - { 0x67C, 0, 0x08015A48 }, { 0x67D, 0, 0x08015B58 }, { 0x67E, 0, 0x08015C04 }, { 0x67F, 0, 0x08015C50 }, - { 0x680, 0, 0x08015D64 }, { 0x681, 0, 0x08015E40 }, { 0x682, 0, 0x08015ED0 }, { 0x683, 0, 0x08015F00 }, - { 0x684, 0, 0x08015F90 }, { 0x685, 0, 0x08015FCC }, { 0x686, 0, 0x08016020 }, { 0x687, 0, 0x08016078 }, - { 0x688, 0, 0x080160AC }, { 0x689, 0, 0x08016104 }, { 0x68A, 0, 0x08016130 }, { 0x6A4, 0, 0x08016184 }, - { 0x6A5, 0, 0x080161B8 }, { 0x6A6, 0, 0x0801620C }, { 0x6A7, 0, 0x08016248 }, { 0x6A8, 0, 0x080162A0 }, - { 0x6A9, 0, 0x080162C8 }, { 0x6AA, 0, 0x0801634C }, { 0x6AB, 0, 0x08016398 }, { 0x6AC, 0, 0x080163FC }, - { 0x6AD, 0, 0x08016478 }, { 0x6AE, 0, 0x080164B4 }, { 0x6AF, 0, 0x08016508 }, { 0x6B0, 0, 0x08016548 }, - { 0x6B1, 0, 0x080165C0 }, { 0x6B2, 0, 0x08016600 }, { 0x6B3, 0, 0x08016674 }, { 0x6B4, 0, 0x080166B4 }, - { 0x6B5, 0, 0x0801671C }, { 0x6B6, 0, 0x08016758 }, { 0x6B7, 0, 0x080167C0 }, { 0x6B8, 0, 0x080167F8 }, - { 0x6B9, 0, 0x08016858 }, { 0x6BA, 0, 0x08016894 }, { 0x6BB, 0, 0x08016900 }, { 0x6BC, 0, 0x0801693C }, - { 0x6BD, 0, 0x0801698C }, { 0x6BE, 0, 0x080169CC }, { 0x6BF, 0, 0x08016A04 }, { 0x6C0, 0, 0x08016A28 }, - { 0x6C1, 0, 0x08016A7C }, { 0x6C2, 0, 0x08016A98 }, { 0x6C3, 0, 0x08016AC8 }, { 0x6C4, 0, 0x08016AE4 }, - { 0x6C5, 0, 0x08016B2C }, { 0x6C6, 0, 0x08016B84 }, { 0x6C7, 0, 0x08016BC8 }, { 0x6C8, 0, 0x08016BE0 }, - { 0x6C9, 0, 0x08016C34 }, { 0x6CA, 0, 0x08016C94 }, { 0x6CB, 0, 0x08016CD0 }, { 0x6CC, 0, 0x08016D24 }, - { 0x6CD, 0, 0x08016D64 }, { 0x6CE, 0, 0x08016DC8 }, { 0x6CF, 0, 0x08016E08 }, { 0x6D0, 0, 0x08016E6C }, - { 0x6D1, 0, 0x08016EAC }, { 0x6D2, 0, 0x08016F14 }, { 0x6D3, 0, 0x08016F50 }, { 0x6D4, 0, 0x08016FD0 }, - { 0x6D5, 0, 0x08017008 }, { 0x6D6, 0, 0x08017084 }, { 0x6D7, 0, 0x080170C0 }, { 0x6D8, 0, 0x08017110 }, - { 0x6D9, 0, 0x0801714C }, { 0x6DA, 0, 0x080171A4 }, { 0x6DB, 0, 0x080171E0 }, { 0x6DC, 0, 0x08017218 }, - { 0x6DD, 0, 0x08017264 }, { 0x6DE, 0, 0x080172E0 }, { 0x708, 0, 0x08017330 }, { 0x709, 0, 0x080173C4 }, - { 0x70A, 0, 0x0801741C }, { 0x70B, 0, 0x080174B4 }, { 0x70C, 0, 0x0801753C }, { 0x70D, 0, 0x08017564 }, - { 0x70E, 0, 0x0801758C }, { 0x70F, 0, 0x080175FC }, { 0x710, 0, 0x08017650 }, { 0x711, 0, 0x08017748 }, - { 0x712, 0, 0x0801775C }, { 0x713, 0, 0x080177B0 }, { 0x714, 0, 0x080177D8 }, { 0x715, 0, 0x0801781C }, - { 0x716, 0, 0x0801787C }, { 0x717, 0, 0x08017A6C }, { 0x718, 0, 0x08017AB8 }, { 0x719, 0, 0x08017AE8 }, - { 0x71A, 0, 0x08017B48 }, { 0x71B, 0, 0x08017BA0 }, { 0x721, 0, 0x08017C00 }, { 0x722, 0, 0x08017C44 }, - { 0x723, 0, 0x08017C84 }, { 0x724, 0, 0x08017CC4 }, { 0x725, 0, 0x08017D04 }, { 0x726, 0, 0x08017D90 }, - { 0x727, 0, 0x08017DE4 }, { 0x728, 0, 0x08017DF0 }, { 0x729, 0, 0x08017E50 }, { 0x72A, 0, 0x08017E9C }, - { 0x72B, 0, 0x08017F08 }, { 0x72C, 0, 0x08017F5C }, { 0x72D, 0, 0x08017F8C }, { 0x72E, 0, 0x08017FC8 }, - { 0x72F, 0, 0x0801800C }, { 0x730, 0, 0x08018064 }, { 0x731, 0, 0x080180A0 }, { 0x732, 0, 0x080180E8 }, - { 0x733, 0, 0x08018104 }, { 0x734, 0, 0x08018188 }, { 0x735, 0, 0x08018240 }, { 0x736, 0, 0x080182A8 }, - { 0x737, 0, 0x080182E4 }, { 0x738, 0, 0x080184D0 }, { 0x73A, 0, 0x08018510 }, { 0x73B, 0, 0x08018594 }, - { 0x73C, 0, 0x08018618 }, { 0x73D, 0, 0x080186B0 }, { 0x73E, 0, 0x0801876C }, { 0x73F, 0, 0x08018818 }, - { 0x740, 0, 0x080188CC }, { 0x741, 0, 0x08018908 }, { 0x742, 0, 0x08018938 }, { 0x743, 0, 0x080189A0 }, - { 0x744, 0, 0x08018A00 }, { 0x745, 0, 0x08018A90 }, { 0x746, 0, 0x08018B4C }, { 0x747, 0, 0x08018C18 }, - { 0x748, 0, 0x08018C8C }, { 0x749, 0, 0x08018CE0 }, { 0x74A, 0, 0x08018D78 }, { 0x74B, 0, 0x08018DD0 }, - { 0x74C, 0, 0x08018E38 }, { 0x74D, 0, 0x08018E78 }, { 0x74E, 0, 0x08018EC0 }, { 0x74F, 0, 0x08018F38 }, - { 0x750, 0, 0x08018FF4 }, { 0x751, 0, 0x08019014 }, { 0x752, 0, 0x0801910C }, { 0x753, 0, 0x08019160 }, - { 0x754, 0, 0x080191A4 }, { 0x755, 0, 0x080191FC }, { 0x756, 0, 0x08019254 }, { 0x757, 0, 0x0801927C }, - { 0x758, 0, 0x080192E8 }, { 0x759, 0, 0x08019354 }, { 0x75A, 0, 0x0801939C }, { 0x76C, 0, 0x0801941C }, - { 0x76D, 0, 0x08019468 }, { 0x76E, 0, 0x080194BC }, { 0x76F, 0, 0x080194F8 }, { 0x770, 0, 0x08019530 }, - { 0x771, 0, 0x0801956C }, { 0x772, 0, 0x080195A4 }, { 0x773, 0, 0x080195DC }, { 0x774, 0, 0x08019620 }, - { 0x775, 0, 0x08019654 }, { 0x776, 0, 0x08019688 }, { 0x777, 0, 0x080196A4 }, { 0x778, 0, 0x080196F0 }, - { 0x779, 0, 0x080197A4 }, { 0x77A, 0, 0x080197C0 }, { 0x77B, 0, 0x080197E4 }, { 0x77C, 0, 0x0801982C }, - { 0x77D, 0, 0x08019854 }, { 0x7D0, 0, 0x08019878 }, { 0x7D1, 0, 0x080198BC }, { 0x7D2, 0, 0x080199A8 }, - { 0x7D3, 0, 0x080199BC }, { 0x7D4, 0, 0x080199E4 }, { 0x7D5, 0, 0x08019AD8 }, { 0x7D6, 0, 0x08019B10 }, - { 0x7D7, 0, 0x08019B28 }, { 0x7D8, 0, 0x08019BA4 }, { 0x7D9, 0, 0x08019BC8 }, { 0x7DC, 0, 0x08019C20 }, - { 0x7DD, 0, 0x08019C40 }, { 0x7DE, 0, 0x08019C60 }, { 0x800, 0, 0x08019C80 }, { 0x801, 0, 0x08019D44 }, - { 0x802, 0, 0x08019DD0 }, { 0x803, 0, 0x08019E24 }, { 0x804, 0, 0x08019E44 }, { 0x806, 0, 0x08019F84 }, - { 0x807, 0, 0x0801A0F0 }, { 0x80B, 0, 0x0801A0FC }, { 0x80C, 0, 0x0801A144 }, { 0x80D, 0, 0x0801A1AC }, - { 0x80E, 0, 0x0801A218 }, { 0x80F, 0, 0x0801A288 }, { 0x810, 0, 0x0801A320 }, { 0x811, 0, 0x0801A348 }, - { 0x820, 0, 0x0801A378 }, { 0x821, 0, 0x0801A3B4 }, { 0x822, 0, 0x0801A408 }, { 0x823, 0, 0x0801A484 }, - { 0x824, 0, 0x0801A4D4 }, { 0x825, 0, 0x0801A538 }, { 0x826, 0, 0x0801A5A8 }, { 0x827, 0, 0x0801A614 }, - { 0x828, 0, 0x0801A654 }, { 0x829, 0, 0x0801A680 }, { 0x82A, 0, 0x0801A6EC }, { 0x82B, 0, 0x0801A740 }, - { 0x82C, 0, 0x0801A79C }, { 0x82D, 0, 0x0801A808 }, { 0x82E, 0, 0x0801A868 }, { 0x82F, 0, 0x0801A894 }, - { 0x830, 0, 0x0801A918 }, { 0x831, 0, 0x0801A968 }, { 0x832, 0, 0x0801A9DC }, { 0x833, 0, 0x0801AA5C }, - { 0x834, 0, 0x0801AA80 }, { 0x835, 0, 0x0801AAD0 }, { 0x836, 0, 0x0801AB60 }, { 0x838, 0, 0x0801AC28 }, - { 0x839, 0, 0x0801AC7C }, { 0x83A, 0, 0x0801AD18 }, { 0x83B, 0, 0x0801AD48 }, { 0x83C, 0, 0x0801ADC4 }, - { 0x83D, 0, 0x0801AE2C }, { 0x83E, 0, 0x0801AE84 }, { 0x83F, 0, 0x0801AEC4 }, { 0x840, 0, 0x0801AF0C }, - { 0x841, 0, 0x0801AF48 }, { 0x842, 0, 0x0801AFA4 }, { 0x843, 0, 0x0801AFE4 }, { 0x844, 0, 0x0801B054 }, - { 0x845, 0, 0x0801B090 }, { 0x846, 0, 0x0801B0CC }, { 0x847, 0, 0x0801B114 }, { 0x848, 0, 0x0801B168 }, - { 0x849, 0, 0x0801B190 }, { 0x84A, 0, 0x0801B210 }, { 0x84B, 0, 0x0801B278 }, { 0x84C, 0, 0x0801B2BC }, - { 0x84D, 0, 0x0801B310 }, { 0x84E, 0, 0x0801B380 }, { 0x84F, 0, 0x0801B3A4 }, { 0x850, 0, 0x0801B3CC }, - { 0x851, 0, 0x0801B47C }, { 0x852, 0, 0x0801B488 }, { 0x853, 0, 0x0801B4B4 }, { 0x854, 0, 0x0801B5C4 }, - { 0x855, 0, 0x0801B608 }, { 0x856, 0, 0x0801B678 }, { 0x857, 0, 0x0801B6D8 }, { 0x858, 0, 0x0801B718 }, - { 0x859, 0, 0x0801B78C }, { 0x85A, 0, 0x0801B810 }, { 0x85B, 0, 0x0801B85C }, { 0x85C, 0, 0x0801B8C4 }, - { 0x85D, 0, 0x0801B8F4 }, { 0x85E, 0, 0x0801B900 }, { 0x85F, 0, 0x0801B92C }, { 0x860, 0, 0x0801B968 }, - { 0x861, 0, 0x0801B994 }, { 0x862, 0, 0x0801B9E0 }, { 0x863, 0, 0x0801BA6C }, { 0x864, 0, 0x0801BACC }, - { 0x865, 0, 0x0801BB18 }, { 0x866, 0, 0x0801BB8C }, { 0x867, 0, 0x0801BBA4 }, { 0x868, 0, 0x0801BC0C }, - { 0x869, 0, 0x0801BC88 }, { 0x86A, 0, 0x0801BCC0 }, { 0x86B, 0, 0x0801BD30 }, { 0x86C, 0, 0x0801BD90 }, - { 0x86D, 0, 0x0801BDD4 }, { 0x86E, 0, 0x0801BE60 }, { 0x86F, 0, 0x0801BF1C }, { 0x870, 0, 0x0801BF40 }, - { 0x871, 0, 0x0801BF90 }, { 0x872, 0, 0x0801BFB0 }, { 0x873, 0, 0x0801C004 }, { 0x874, 0, 0x0801C038 }, - { 0x875, 0, 0x0801C0A0 }, { 0x876, 0, 0x0801C0F8 }, { 0x877, 0, 0x0801C170 }, { 0x878, 0, 0x0801C1E0 }, - { 0x879, 0, 0x0801C23C }, { 0x87A, 0, 0x0801C2A0 }, { 0x87B, 0, 0x0801C2D4 }, { 0x87C, 0, 0x0801C314 }, - { 0x87D, 0, 0x0801C384 }, { 0x87E, 0, 0x0801C3DC }, { 0x87F, 0, 0x0801C43C }, { 0x880, 0, 0x0801C494 }, - { 0x881, 0, 0x0801C504 }, { 0x882, 0, 0x0801C580 }, { 0x883, 0, 0x0801C5E8 }, { 0x884, 0, 0x0801C694 }, - { 0x885, 0, 0x0801C6DC }, { 0x886, 0, 0x0801C73C }, { 0x887, 0, 0x0801C798 }, { 0x888, 0, 0x0801C7EC }, - { 0x889, 0, 0x0801C824 }, { 0x88A, 0, 0x0801C86C }, { 0x88B, 0, 0x0801C890 }, { 0x88C, 0, 0x0801C8C4 }, - { 0x88D, 0, 0x0801C914 }, { 0x88E, 0, 0x0801C98C }, { 0x88F, 0, 0x0801CA00 }, { 0x890, 0, 0x0801CA40 }, - { 0x898, 0, 0x0801CADC }, { 0x899, 0, 0x0801CB1C }, { 0x89A, 0, 0x0801CB60 }, { 0x89B, 0, 0x0801CC18 }, - { 0x89C, 0, 0x0801CC74 }, { 0x89D, 0, 0x0801CCCC }, { 0x89E, 0, 0x0801CD40 }, { 0x89F, 0, 0x0801CDA0 }, - { 0x8A0, 0, 0x0801CDE8 }, { 0x8A1, 0, 0x0801CE44 }, { 0x8A2, 0, 0x0801CEB0 }, { 0x8A3, 0, 0x0801CF0C }, - { 0x8A4, 0, 0x0801CF38 }, { 0x8A5, 0, 0x0801CFD0 }, { 0x8CA, 0, 0x0801D010 }, { 0x8CB, 0, 0x0801D0E0 }, - { 0x8CC, 0, 0x0801D108 }, { 0x8CD, 0, 0x0801D138 }, { 0x8CE, 0, 0x0801D170 }, { 0x8CF, 0, 0x0801D1C0 }, - { 0x8D0, 0, 0x0801D200 }, { 0x8D1, 0, 0x0801D238 }, { 0x8D2, 0, 0x0801D268 }, { 0x8D3, 0, 0x0801D340 }, - { 0x8D4, 0, 0x0801D3D4 }, { 0x8D5, 0, 0x0801D444 }, { 0x8D6, 0, 0x0801D488 }, { 0x8D7, 0, 0x0801D4D8 }, - { 0x8D8, 0, 0x0801D508 }, { 0x8D9, 0, 0x0801D574 }, { 0x8DA, 0, 0x0801D5A0 }, { 0x8DB, 0, 0x0801D5D0 }, - { 0x8DC, 0, 0x0801D600 }, { 0x8DD, 0, 0x0801D644 }, { 0x8DE, 0, 0x0801D7C8 }, { 0x8DF, 0, 0x0801D7FC }, - { 0x8E0, 0, 0x0801D844 }, { 0x8E1, 0, 0x0801D898 }, { 0x8E2, 0, 0x0801D938 }, { 0x8E3, 0, 0x0801D9E0 }, - { 0x8E4, 0, 0x0801DA40 }, { 0x8E5, 0, 0x0801DA9C }, { 0x8E6, 0, 0x0801DB20 }, { 0x8E7, 0, 0x0801DB88 }, - { 0x8E8, 0, 0x0801DBB0 }, { 0x8E9, 0, 0x0801DBE4 }, { 0x8EA, 0, 0x0801DC6C }, { 0x8EB, 0, 0x0801DC84 }, - { 0x8EC, 0, 0x0801DD18 }, { 0x910, 0, 0x0801DD64 }, { 0x911, 0, 0x0801DDC0 }, { 0x912, 0, 0x0801DE3C }, - { 0x913, 0, 0x0801DEAC }, { 0x914, 0, 0x0801DF18 }, { 0x915, 0, 0x0801DF88 }, { 0x916, 0, 0x0801DFF0 }, - { 0x917, 0, 0x0801E038 }, { 0x918, 0, 0x0801E164 }, { 0x919, 0, 0x0801E1BC }, { 0x91A, 0, 0x0801E204 }, - { 0x91B, 0, 0x0801E330 }, { 0x91C, 0, 0x0801E370 }, { 0x91E, 0, 0x0801E3CC }, { 0x92E, 0, 0x0801E464 }, - { 0x92F, 0, 0x0801E4C0 }, { 0x930, 0, 0x0801E534 }, { 0x931, 0, 0x0801E5AC }, { 0x932, 0, 0x0801E5B8 }, - { 0x933, 0, 0x0801E608 }, { 0x934, 0, 0x0801E650 }, { 0x935, 0, 0x0801E698 }, { 0x936, 0, 0x0801E6D0 }, - { 0x937, 0, 0x0801E738 }, { 0x938, 0, 0x0801E768 }, { 0x960, 0, 0x0801E774 }, { 0x961, 0, 0x0801E798 }, - { 0x962, 0, 0x0801E810 }, { 0x963, 0, 0x0801E8AC }, { 0x964, 0, 0x0801E97C }, { 0x965, 0, 0x0801E9C8 }, - { 0x966, 0, 0x0801EA1C }, { 0x967, 0, 0x0801EABC }, { 0x968, 0, 0x0801EB08 }, { 0x969, 0, 0x0801EBC8 }, - { 0x96A, 0, 0x0801EC58 }, { 0x96B, 0, 0x0801EC8C }, { 0x96C, 0, 0x0801ECD4 }, { 0x96D, 0, 0x0801ED40 }, - { 0x96E, 0, 0x0801ED88 }, { 0x96F, 0, 0x0801EE4C }, { 0x970, 0, 0x0801EF08 }, { 0x971, 0, 0x0801EF98 }, - { 0x972, 0, 0x0801EFF4 }, { 0x9C4, 0, 0x0801F000 }, { 0x9C5, 0, 0x0801F08C }, { 0x9C6, 0, 0x0801F0B0 }, - { 0x9C7, 0, 0x0801F104 }, { 0x9C8, 0, 0x0801F110 }, { 0x9C9, 0, 0x0801F160 }, { 0x9CA, 0, 0x0801F1D4 }, - { 0x9CB, 0, 0x0801F25C }, { 0x9CC, 0, 0x0801F2A0 }, { 0x9CD, 0, 0x0801F2E8 }, { 0x9CE, 0, 0x0801F338 }, - { 0x9CF, 0, 0x0801F37C }, { 0x9D0, 0, 0x0801F3CC }, { 0x9D1, 0, 0x0801F424 }, { 0x9D2, 0, 0x0801F450 }, - { 0x9D3, 0, 0x0801F510 }, { 0x9D4, 0, 0x0801F558 }, { 0x9D5, 0, 0x0801F580 }, { 0x9D6, 0, 0x0801F5D0 }, - { 0x9D7, 0, 0x0801F61C }, { 0x9D8, 0, 0x0801F65C }, { 0x9D9, 0, 0x0801F69C }, { 0x9DA, 0, 0x0801F6EC }, - { 0x9DB, 0, 0x0801F764 }, { 0x9DC, 0, 0x0801F7B0 }, { 0x9DD, 0, 0x0801F808 }, { 0x9DE, 0, 0x0801F8AC }, - { 0x9DF, 0, 0x0801F91C }, { 0x9E0, 0, 0x0801F990 }, { 0x9E1, 0, 0x0801F9CC }, { 0x9E2, 0, 0x0801FA2C }, - { 0x9E3, 0, 0x0801FA74 }, { 0x9E4, 0, 0x0801FB24 }, { 0x9E5, 0, 0x0801FB90 }, { 0x9E6, 0, 0x0801FBBC }, - { 0x9E7, 0, 0x0801FBE4 }, { 0x9E8, 0, 0x0801FC4C }, { 0x9E9, 0, 0x0801FCA0 }, { 0x9EA, 0, 0x0801FD80 }, - { 0x9EB, 0, 0x0801FDE8 }, { 0x9EC, 0, 0x0801FE70 }, { 0x9ED, 0, 0x0801FEAC }, { 0x9EE, 0, 0x0801FF40 }, - { 0x9EF, 0, 0x0801FF8C }, { 0xA28, 0, 0x0801FFC4 }, { 0xA29, 0, 0x0801FFF4 }, { 0xA2A, 0, 0x08020014 }, - { 0xA2B, 0, 0x08020048 }, { 0xA2C, 0, 0x0802012C }, { 0xA2D, 0, 0x08020190 }, { 0xA2E, 0, 0x080201EC }, - { 0xA2F, 0, 0x08020278 }, { 0xA30, 0, 0x080202E4 }, { 0xA31, 0, 0x0802031C }, { 0xA32, 0, 0x08020360 }, - { 0xA33, 0, 0x080203A4 }, { 0xA34, 0, 0x080203C8 }, { 0xA35, 0, 0x08020424 }, { 0xA36, 0, 0x0802047C }, - { 0xA37, 0, 0x080204F0 }, { 0xA38, 0, 0x08020534 }, { 0xA39, 0, 0x08020570 }, { 0xA3A, 0, 0x080205E4 }, - { 0xBB8, 0, 0x08020668 }, { 0xBB9, 0, 0x080206A4 }, { 0xBBA, 0, 0x080206EC }, { 0xBBB, 0, 0x08020710 }, - { 0xBBC, 0, 0x08020764 }, { 0xBBD, 0, 0x080207A4 }, { 0xBBE, 0, 0x080207E8 }, { 0xBBF, 0, 0x08020814 }, - { 0xBC0, 0, 0x08020858 }, { 0xBC1, 0, 0x080208B0 }, { 0xBC2, 0, 0x08020910 }, { 0xBC3, 0, 0x08020960 }, - { 0xBC4, 0, 0x080209C4 }, { 0xBC5, 0, 0x080209F0 }, { 0xBC6, 0, 0x08020A50 }, { 0xBC7, 0, 0x08020A8C }, - { 0xBC8, 0, 0x08020B00 }, { 0xBC9, 0, 0x08020B3C }, { 0xBCA, 0, 0x08020BB8 }, { 0xBCB, 0, 0x08020BF4 }, - { 0xBCC, 0, 0x08020C4C }, { 0xBCD, 0, 0x08020C88 }, { 0xBCE, 0, 0x08020CF0 }, { 0xBCF, 0, 0x08020D2C }, - { 0xBD0, 0, 0x08020D80 }, { 0xBD1, 0, 0x08020DC0 }, { 0xBD2, 0, 0x08020DFC }, { 0xBD3, 0, 0x08020E58 }, - { 0xBD4, 0, 0x08020E88 }, { 0xBD5, 0, 0x08020EE0 }, { 0xBD6, 0, 0x08020F18 }, { 0xBD7, 0, 0x08020F44 }, - { 0xBEA, 0, 0x08020F60 }, { 0xBEB, 0, 0x08021158 }, { 0xBEC, 0, 0x080211C0 }, { 0xBED, 0, 0x080211EC }, - { 0xBEE, 0, 0x08021350 }, { 0xBEF, 0, 0x08021380 }, { 0xBF0, 0, 0x080213F8 }, { 0xBF1, 0, 0x08021480 }, - { 0xBF2, 0, 0x08021558 }, { 0xBF3, 0, 0x08021588 }, { 0xBF4, 0, 0x080215E0 }, { 0xBF5, 0, 0x080216A0 }, - { 0xBF6, 0, 0x080217CC }, { 0xBF7, 0, 0x08021858 }, { 0xBF8, 0, 0x080218CC }, { 0xBF9, 0, 0x08021974 }, - { 0xBFA, 0, 0x080219F8 }, { 0xBFB, 0, 0x08021A68 }, { 0xBFC, 0, 0x08021AF8 }, { 0xBFD, 0, 0x08021B9C }, - { 0xBFE, 0, 0x08021BE0 }, { 0xBFF, 0, 0x08021C54 }, { 0xC00, 0, 0x08021C80 }, { 0xC01, 0, 0x08021CC8 }, - { 0xC02, 0, 0x08021F20 }, { 0xC03, 0, 0x08021F50 }, { 0xC04, 0, 0x08022024 }, { 0xC1D, 0, 0x08022090 }, - { 0xC1E, 0, 0x080220B8 }, { 0xC1F, 0, 0x080220D0 }, { 0xC20, 0, 0x08022104 }, { 0xC21, 0, 0x08022198 }, - { 0xC22, 0, 0x080221B8 }, { 0xC23, 0, 0x080221DC }, { 0xC24, 0, 0x08022248 }, { 0xC25, 0, 0x08022288 }, - { 0xC26, 0, 0x08022308 }, { 0xC27, 0, 0x0802233C }, { 0xC28, 0, 0x0802239C }, { 0xC29, 0, 0x080223E4 }, - { 0xC2A, 0, 0x08022408 }, { 0xC2B, 0, 0x08022470 }, { 0xC2C, 0, 0x080224C4 }, { 0xC2D, 0, 0x0802255C }, - { 0xC2E, 0, 0x08022584 }, { 0xC2F, 0, 0x080225AC }, { 0xC30, 0, 0x08022640 }, { 0xC31, 0, 0x08022670 }, - { 0xC32, 0, 0x0802268C }, { 0xC33, 0, 0x080226A0 }, { 0xC34, 0, 0x080226E0 }, { 0xC35, 0, 0x08022738 }, - { 0xC36, 0, 0x08022760 }, { 0xC37, 0, 0x08022780 }, { 0xC38, 0, 0x080227B8 }, { 0xC39, 0, 0x080227F0 }, - { 0xC3A, 0, 0x080228DC }, { 0xC3B, 0, 0x08022954 }, { 0xC3C, 0, 0x08022AD4 }, { 0xC3D, 0, 0x08022B48 }, - { 0xC3E, 0, 0x08022C14 }, { 0xC3F, 0, 0x08022C48 }, { 0xC40, 0, 0x08022C78 }, { 0xC41, 0, 0x08022CB0 }, - { 0xC42, 0, 0x08022CFC }, { 0xC43, 0, 0x08022D64 }, { 0xC44, 0, 0x08022D84 }, { 0xC45, 0, 0x08022DEC }, - { 0xC46, 0, 0x08022EBC }, { 0xC47, 0, 0x08022F9C }, { 0xC48, 0, 0x08023004 }, { 0xC49, 0, 0x08023024 }, - { 0xC4A, 0, 0x080230B0 }, { 0xC4B, 0, 0x080230E0 }, { 0xC4C, 0, 0x080231E4 }, { 0xC4D, 0, 0x0802329C }, - { 0xC4E, 0, 0x080232FC }, { 0xC4F, 0, 0x08023360 }, { 0xC50, 0, 0x080233BC }, { 0xC51, 0, 0x080233F4 }, - { 0xC52, 0, 0x0802352C }, { 0xC53, 0, 0x08023550 }, { 0xC54, 0, 0x08023640 }, { 0xC55, 0, 0x08023668 }, - { 0xC56, 0, 0x080236A4 }, { 0xC57, 0, 0x080236F4 }, { 0xC58, 0, 0x08023788 }, { 0xC80, 0, 0x080237C4 }, - { 0xC81, 0, 0x08023824 }, { 0xC82, 0, 0x080238F0 }, { 0xC83, 0, 0x08023920 }, { 0xC84, 0, 0x080239E4 }, - { 0xC85, 0, 0x08023B24 }, { 0xC86, 0, 0x08023B58 }, { 0xC87, 0, 0x08023C3C }, { 0xC88, 0, 0x08023CF0 }, - { 0xC89, 0, 0x08023D44 }, { 0xC8A, 0, 0x08023D80 }, { 0xC8B, 0, 0x08023DB0 }, { 0xC8C, 0, 0x08023E0C }, - { 0xC8D, 0, 0x08023E60 }, { 0xC8E, 0, 0x08023E90 }, { 0xC8F, 0, 0x08023F40 }, { 0xC90, 0, 0x08023FA0 }, - { 0xC91, 0, 0x0802400C }, { 0xC92, 0, 0x08024058 }, { 0xC93, 0, 0x080240D0 }, { 0xC94, 0, 0x0802410C }, - { 0xCE4, 0, 0x08024164 }, { 0xCE5, 0, 0x080241D4 }, { 0xCE6, 0, 0x08024254 }, { 0xCE7, 0, 0x08024304 }, - { 0xCE8, 0, 0x08024330 }, { 0xCE9, 0, 0x08024360 }, { 0xCEA, 0, 0x0802444C }, { 0xCEB, 0, 0x08024470 }, - { 0xCEC, 0, 0x080244E8 }, { 0xCED, 0, 0x08024548 }, { 0xCEE, 0, 0x08024634 }, { 0xCEF, 0, 0x08024718 }, - { 0xCF0, 0, 0x0802476C }, { 0xCF1, 0, 0x080247F8 }, { 0xCF2, 0, 0x0802483C }, { 0xCF3, 0, 0x08024880 }, - { 0xCF4, 0, 0x08024918 }, { 0xCF5, 0, 0x08024994 }, { 0xCF6, 0, 0x08024B58 }, { 0xCF7, 0, 0x08024BD8 }, - { 0xCF8, 0, 0x08024C84 }, { 0xCF9, 0, 0x08024D10 }, { 0xCFA, 0, 0x08024D44 }, { 0xCFB, 0, 0x08024D8C }, - { 0xCFC, 0, 0x08024DB8 }, { 0xCFD, 0, 0x08024DFC }, { 0xCFE, 0, 0x08024E6C }, { 0xCFF, 0, 0x08024EA4 }, - { 0xD00, 0, 0x08024ED4 }, { 0xD01, 0, 0x08024F4C }, { 0xD02, 0, 0x08024F8C }, { 0xD03, 0, 0x08024FDC }, - { 0xD04, 0, 0x08025040 }, { 0xD05, 0, 0x080250D8 }, { 0xD06, 0, 0x08025100 }, { 0xD07, 0, 0x08025134 }, - { 0xD08, 0, 0x0802516C }, { 0xD09, 0, 0x080251B4 }, { 0xD0A, 0, 0x080251E0 }, { 0xD0B, 0, 0x08025260 }, - { 0xD0C, 0, 0x080252AC }, { 0xD0D, 0, 0x080252E4 }, { 0xD0E, 0, 0x08025330 }, { 0xD0F, 0, 0x08025358 }, - { 0xD10, 0, 0x08025394 }, { 0xD11, 0, 0x080253C8 }, { 0xD12, 0, 0x08025434 }, { 0xD13, 0, 0x0802547C }, - { 0xD14, 0, 0x080254C0 }, { 0xD15, 0, 0x0802550C }, { 0xD16, 0, 0x08025550 }, { 0xD17, 0, 0x080255A4 }, - { 0xD18, 0, 0x080255DC }, { 0xD19, 0, 0x080255FC }, { 0xD1A, 0, 0x0802563C }, { 0xD1B, 0, 0x080256C8 }, - { 0xD1C, 0, 0x08025708 }, { 0xD1D, 0, 0x0802575C }, { 0xD1E, 0, 0x080257B8 }, { 0xD1F, 0, 0x08025814 }, - { 0xD20, 0, 0x08025874 }, { 0xD21, 0, 0x080258EC }, { 0xD48, 0, 0x08025960 }, { 0xD49, 0, 0x0802597C }, - { 0xD4A, 0, 0x080259B8 }, { 0xD4B, 0, 0x080259F8 }, { 0xD4C, 0, 0x08025A9C }, { 0xD4D, 0, 0x08025AF4 }, - { 0xD4E, 0, 0x08025B4C }, { 0xD4F, 0, 0x08025B80 }, { 0xD5E, 0, 0x08025BBC }, { 0xD5F, 0, 0x08025BD8 }, - { 0xD60, 0, 0x08025BFC }, { 0xD61, 0, 0x08025C3C }, { 0xD62, 0, 0x08025C7C }, { 0xD63, 0, 0x08025CE0 }, - { 0xD64, 0, 0x08025D64 }, { 0xD65, 0, 0x08025D90 }, { 0xD66, 0, 0x08025DC0 }, { 0xD67, 0, 0x08025E34 }, - { 0xD68, 0, 0x08025E74 }, { 0xD69, 0, 0x08025EB0 }, { 0xD6A, 0, 0x08025EE4 }, { 0xD6B, 0, 0x08025F14 }, - { 0xD6C, 0, 0x08025F4C }, { 0xD6D, 0, 0x08025F9C }, { 0xD6E, 0, 0x08025FEC }, { 0xD6F, 0, 0x08026024 }, - { 0xD70, 0, 0x08026064 }, { 0xD71, 0, 0x080260D4 }, { 0xD72, 0, 0x0802613C }, { 0xD73, 0, 0x08026190 }, - { 0xD74, 0, 0x080261E4 }, { 0xD75, 0, 0x0802621C }, { 0xD76, 0, 0x0802626C }, { 0xD77, 0, 0x08026354 }, - { 0xD78, 0, 0x0802637C }, { 0xD79, 0, 0x080263C8 }, { 0xD7A, 0, 0x08026444 }, { 0xD7B, 0, 0x08026490 }, - { 0xD7C, 0, 0x080264EC }, { 0xD7D, 0, 0x08026548 }, { 0xD7E, 0, 0x08026598 }, { 0xD7F, 0, 0x080265C4 }, - { 0xD80, 0, 0x080265F8 }, { 0xD81, 0, 0x08026628 }, { 0xD82, 0, 0x08026658 }, { 0xD83, 0, 0x08026688 }, - { 0xD84, 0, 0x080266D0 }, { 0xD85, 0, 0x08026728 }, { 0xD86, 0, 0x08026770 }, { 0xD87, 0, 0x080267B4 }, - { 0xD88, 0, 0x08026850 }, { 0xD89, 0, 0x080268B0 }, { 0xD8A, 0, 0x08026998 }, { 0xD8B, 0, 0x08026A5C }, - { 0xDAC, 0, 0x08026AA0 }, { 0xDAD, 0, 0x08026AC8 }, { 0xDAE, 0, 0x08026B04 }, { 0xDAF, 0, 0x08026B9C }, - { 0xDB0, 0, 0x08026BDC }, { 0xDB1, 0, 0x08026C6C }, { 0xDB2, 0, 0x08026CD8 }, { 0xDB3, 0, 0x08026D4C }, - { 0xDB4, 0, 0x08026DB4 }, { 0xDB5, 0, 0x08026E34 }, { 0xDB6, 0, 0x08026EA4 }, { 0xDB7, 0, 0x08026EBC }, - { 0xDB8, 0, 0x08026EE8 }, { 0xDB9, 0, 0x08026F28 }, { 0xDBA, 0, 0x08026F70 }, { 0xDBB, 0, 0x08026FA0 }, - { 0xDBC, 0, 0x0802701C }, { 0xDBD, 0, 0x08027070 }, { 0xDBE, 0, 0x08027088 }, { 0xDBF, 0, 0x080270BC }, - { 0xDC0, 0, 0x080270E0 }, { 0xDC1, 0, 0x0802713C }, { 0xDC2, 0, 0x08027194 }, { 0xDC3, 0, 0x08027220 }, - { 0xDC4, 0, 0x0802727C }, { 0xDC5, 0, 0x08027300 }, { 0xDC6, 0, 0x08027334 }, { 0xDC7, 0, 0x08027370 }, - { 0xDC8, 0, 0x08027394 }, { 0xDC9, 0, 0x080273A8 }, { 0xDCA, 0, 0x080273D0 }, { 0xDCB, 0, 0x08027414 }, - { 0xDCC, 0, 0x0802744C }, { 0xDCD, 0, 0x080274BC }, { 0xDCE, 0, 0x08027500 }, { 0xDCF, 0, 0x080275D4 }, - { 0xDD0, 0, 0x0802762C }, { 0xDD1, 0, 0x08027668 }, { 0xDD2, 0, 0x08027684 }, { 0xDD3, 0, 0x080276D8 }, - { 0xDD4, 0, 0x08027710 }, { 0xDD5, 0, 0x0802773C }, { 0xDD6, 0, 0x08027760 }, { 0xDD7, 0, 0x08027798 }, - { 0xDD8, 0, 0x080277C0 }, { 0xDD9, 0, 0x08027824 }, { 0xDDA, 0, 0x080278AC }, { 0xDDB, 0, 0x08027934 }, - { 0xDDC, 0, 0x08027984 }, { 0xDDD, 0, 0x080279E8 }, { 0xDDE, 0, 0x08027A70 }, { 0xDDF, 0, 0x08027AE8 }, - { 0xDE0, 0, 0x08027B28 }, { 0xDE1, 0, 0x08027B84 }, { 0xDE2, 0, 0x08027BF4 }, { 0xDE3, 0, 0x08027C40 }, - { 0xDE4, 0, 0x08027C84 }, { 0xDE5, 0, 0x08027CC8 }, { 0xDE6, 0, 0x08027D3C }, { 0xDE7, 0, 0x08027D8C }, - { 0xDE8, 0, 0x08027DBC }, { 0xDE9, 0, 0x08027DEC }, { 0xDEA, 0, 0x08027E78 }, { 0xDEB, 0, 0x08027EBC }, - { 0xDEC, 0, 0x08027EE4 }, { 0xDED, 0, 0x08027F4C }, { 0xDEE, 0, 0x08027F9C }, { 0xDEF, 0, 0x0802800C }, - { 0xDF0, 0, 0x08028058 }, { 0xDF1, 0, 0x080280A4 }, { 0xDF2, 0, 0x080280DC }, { 0xDF3, 0, 0x08028134 }, - { 0xDF4, 0, 0x080281B0 }, { 0xDF5, 0, 0x080281E8 }, { 0xDF6, 0, 0x08028234 }, { 0xDF7, 0, 0x08028264 }, - { 0xDF8, 0, 0x080282C0 }, { 0xDF9, 0, 0x080282F8 }, { 0xDFA, 0, 0x08028378 }, { 0xDFB, 0, 0x080283C4 }, - { 0xDFC, 0, 0x080283FC }, { 0xDFD, 0, 0x08028444 }, { 0xDFE, 0, 0x08028478 }, { 0xDFF, 0, 0x080284BC }, - { 0xE02, 0, 0x080284F4 }, { 0xE03, 0, 0x08028540 }, { 0xE04, 0, 0x08028588 }, { 0xE05, 0, 0x080285C8 }, - { 0xE06, 0, 0x08028604 }, { 0xE07, 0, 0x08028620 }, { 0xE10, 0, 0x08028670 }, { 0xE11, 0, 0x080286AC }, - { 0xE12, 0, 0x08028744 }, { 0xE13, 0, 0x080287C4 }, { 0xE14, 0, 0x0802885C }, { 0xE15, 0, 0x08028940 }, - { 0xE16, 0, 0x080289D4 }, { 0xE17, 0, 0x08028A20 }, { 0xE18, 0, 0x08028A58 }, { 0xE19, 0, 0x08028AA8 }, - { 0xE1A, 0, 0x08028B5C }, { 0xE1B, 0, 0x08028B8C }, { 0xE1C, 0, 0x08028BF0 }, { 0xE1D, 0, 0x08028C38 }, - { 0xE1E, 0, 0x08028C98 }, { 0xE1F, 0, 0x08028CBC }, { 0xE20, 0, 0x08028D10 }, { 0xE21, 0, 0x08028D28 }, - { 0xE22, 0, 0x08028D68 }, { 0xE23, 0, 0x08028DC8 }, { 0xE24, 0, 0x08028E24 }, { 0xE25, 0, 0x08028E44 }, - { 0xE26, 0, 0x08028E88 }, { 0xE27, 0, 0x08028ED0 }, { 0xE28, 0, 0x08028EEC }, { 0xE29, 0, 0x08028F40 }, - { 0xE2A, 0, 0x08028F9C }, { 0xE2B, 0, 0x08029010 }, { 0xE2C, 0, 0x08029078 }, { 0xE2D, 0, 0x08029104 }, - { 0xE2E, 0, 0x08029174 }, { 0xE2F, 0, 0x080291D4 }, { 0xE30, 0, 0x08029238 }, { 0xE31, 0, 0x080292B8 }, - { 0xE32, 0, 0x0802933C }, { 0xE42, 0, 0x0802939C }, { 0xE43, 0, 0x080293FC }, { 0xE44, 0, 0x08029428 }, - { 0xE45, 0, 0x080294A8 }, { 0xE46, 0, 0x08029500 }, { 0xE47, 0, 0x080295A0 }, { 0xE48, 0, 0x080295C4 }, - { 0xE49, 0, 0x08029634 }, { 0xE4A, 0, 0x0802969C }, { 0xE4B, 0, 0x08029704 }, { 0xE4C, 0, 0x08029774 }, - { 0xE4D, 0, 0x080297D4 }, { 0xE4E, 0, 0x08029860 }, { 0xE4F, 0, 0x080298C8 }, { 0xE50, 0, 0x08029948 }, - { 0xE51, 0, 0x080299D0 }, { 0xE52, 0, 0x08029A30 }, { 0xE74, 0, 0x08029AC0 }, { 0xE75, 0, 0x08029B20 }, - { 0xE76, 0, 0x08029B74 }, { 0xE77, 0, 0x08029BD4 }, { 0xE78, 0, 0x08029C48 }, { 0xE79, 0, 0x08029C9C }, - { 0xE7A, 0, 0x08029CB0 }, { 0xE7B, 0, 0x08029CCC }, { 0xE7C, 0, 0x08029D58 }, { 0xE7D, 0, 0x08029DAC }, - { 0xE7E, 0, 0x08029DC0 }, { 0xE7F, 0, 0x08029E10 }, { 0xE80, 0, 0x08029E74 }, { 0xE81, 0, 0x08029ED4 }, - { 0xE82, 0, 0x08029F2C }, { 0xE83, 0, 0x08029F54 }, { 0xE84, 0, 0x08029FCC }, { 0xE85, 0, 0x0802A03C }, - { 0xE86, 0, 0x0802A090 }, { 0xE87, 0, 0x0802A0D8 }, { 0xE88, 0, 0x0802A128 }, { 0xE89, 0, 0x0802A1BC }, - { 0xE8A, 0, 0x0802A1F4 }, { 0xE8B, 0, 0x0802A260 }, { 0xE8C, 0, 0x0802A2A4 }, { 0xE8D, 0, 0x0802A2F4 }, - { 0xE8E, 0, 0x0802A334 }, { 0xE8F, 0, 0x0802A37C }, { 0xE90, 0, 0x0802A3DC }, { 0xE91, 0, 0x0802A448 }, - { 0xE92, 0, 0x0802A47C }, { 0xE93, 0, 0x0802A4A8 }, { 0xE94, 0, 0x0802A550 }, { 0xE95, 0, 0x0802A5B0 }, - { 0xE97, 0, 0x0802A608 }, { 0xE98, 0, 0x0802A69C }, { 0xE99, 0, 0x0802A6F0 }, { 0xFA0, 0, 0x0802A760 }, - { 0xFA1, 0, 0x0802A79C }, { 0xFA2, 0, 0x0802A7F4 }, { 0xFA3, 0, 0x0802A84C }, { 0xFA4, 0, 0x0802A8F4 }, - { 0xFA5, 0, 0x0802AA24 }, { 0xFA6, 0, 0x0802AAA0 }, { 0xFA7, 0, 0x0802AB04 }, { 0xFA8, 0, 0x0802ABA0 }, - { 0xFA9, 0, 0x0802AC08 }, { 0xFAA, 0, 0x0802ACA4 }, { 0xFAB, 0, 0x0802AD1C }, { 0xFAC, 0, 0x0802AD8C }, - { 0xFAD, 0, 0x0802ADF4 }, { 0xFAE, 0, 0x0802AE90 }, { 0xFAF, 0, 0x0802AF00 }, { 0xFB0, 0, 0x0802AF70 }, - { 0xFB1, 0, 0x0802B018 }, { 0xFB2, 0, 0x0802B0B8 }, { 0xFB3, 0, 0x0802B110 }, { 0xFB4, 0, 0x0802B190 }, - { 0xFB5, 0, 0x0802B24C }, { 0xFB6, 0, 0x0802B288 }, { 0xFB7, 0, 0x0802B2E4 }, { 0xFB8, 0, 0x0802B314 }, - { 0xFB9, 0, 0x0802B39C }, { 0xFBA, 0, 0x0802B40C }, { 0xFBB, 0, 0x0802B488 }, { 0xFBC, 0, 0x0802B4EC }, - { 0xFBD, 0, 0x0802B598 }, { 0xFBE, 0, 0x0802B650 }, { 0xFBF, 0, 0x0802B6F8 }, { 0x1004, 0, 0x0802B750 }, - { 0x1005, 0, 0x0802B778 }, { 0x1006, 0, 0x0802B7A0 }, { 0x1007, 0, 0x0802B7C8 }, { 0x1008, 0, 0x0802B7EC }, - { 0x1009, 0, 0x0802B84C }, { 0x100A, 0, 0x0802B890 }, { 0x100B, 0, 0x0802B8D8 }, { 0x100C, 0, 0x0802B908 }, - { 0x100D, 0, 0x0802B97C }, { 0x100E, 0, 0x0802BA00 }, { 0x100F, 0, 0x0802BA54 }, { 0x1010, 0, 0x0802BAC0 }, - { 0x1011, 0, 0x0802BB28 }, { 0x1012, 0, 0x0802BB94 }, { 0x1013, 0, 0x0802BC18 }, { 0x1014, 0, 0x0802BC44 }, - { 0x1015, 0, 0x0802BC88 }, { 0x1016, 0, 0x0802BCE0 }, { 0x1017, 0, 0x0802BD24 }, { 0x1018, 0, 0x0802BD8C }, - { 0x1019, 0, 0x0802BE18 }, { 0x101A, 0, 0x0802BE80 }, { 0x101B, 0, 0x0802BF84 }, { 0x101C, 0, 0x0802C048 }, - { 0x101D, 0, 0x0802C064 }, { 0x101E, 0, 0x0802C15C }, { 0x101F, 0, 0x0802C284 }, { 0x1020, 0, 0x0802C3BC }, - { 0x1021, 0, 0x0802C3D4 }, { 0x1022, 0, 0x0802C438 }, { 0x1023, 0, 0x0802C470 }, { 0x1024, 0, 0x0802C494 }, - { 0x1025, 0, 0x0802C4C4 }, { 0x1026, 0, 0x0802C4F8 }, { 0x1027, 0, 0x0802C564 }, { 0x1028, 0, 0x0802C5F8 }, - { 0x1029, 0, 0x0802C67C }, { 0x102A, 0, 0x0802C6DC }, { 0x102B, 0, 0x0802C73C }, { 0x102C, 0, 0x0802C798 }, - { 0x102D, 0, 0x0802C824 }, { 0x102E, 0, 0x0802C87C }, { 0x102F, 0, 0x0802C8B8 }, { 0x1030, 0, 0x0802C928 }, - { 0x1031, 0, 0x0802CA60 }, { 0x1032, 0, 0x0802CAB4 }, { 0x1033, 0, 0x0802CB00 }, { 0x1034, 0, 0x0802CB3C }, - { 0x1035, 0, 0x0802CB94 }, { 0x1036, 0, 0x0802CBF0 }, { 0x1037, 0, 0x0802CC28 }, { 0x1038, 0, 0x0802CC80 }, - { 0x1039, 0, 0x0802CCE0 }, { 0x103A, 0, 0x0802CD30 }, { 0x103B, 0, 0x0802CD64 }, { 0x103C, 0, 0x0802CDDC }, - { 0x1068, 0, 0x0802CE10 }, { 0x1069, 0, 0x0802CE64 }, { 0x106A, 0, 0x0802CF30 }, { 0x106B, 0, 0x0802CF90 }, - { 0x106C, 0, 0x0802CFD4 }, { 0x106D, 0, 0x0802D07C }, { 0x106E, 0, 0x0802D0C0 }, { 0x106F, 0, 0x0802D110 }, - { 0x1070, 0, 0x0802D178 }, { 0x1071, 0, 0x0802D1C4 }, { 0x1072, 0, 0x0802D234 }, { 0x1073, 0, 0x0802D27C }, - { 0x1074, 0, 0x0802D2BC }, { 0x1075, 0, 0x0802D314 }, { 0x1076, 0, 0x0802D354 }, { 0x1077, 0, 0x0802D3AC }, - { 0x1078, 0, 0x0802D3F0 }, { 0x1079, 0, 0x0802D434 }, { 0x107A, 0, 0x0802D4AC }, { 0x107B, 0, 0x0802D4EC }, - { 0x107C, 0, 0x0802D554 }, { 0x107D, 0, 0x0802D5A8 }, { 0x107E, 0, 0x0802D5FC }, { 0x107F, 0, 0x0802D69C }, - { 0x1080, 0, 0x0802D6E8 }, { 0x1081, 0, 0x0802D744 }, { 0x1082, 0, 0x0802D7A4 }, { 0x1083, 0, 0x0802D7EC }, - { 0x1084, 0, 0x0802D82C }, { 0x1085, 0, 0x0802D8B0 }, { 0x1086, 0, 0x0802D8F0 }, { 0x1087, 0, 0x0802D954 }, - { 0x1088, 0, 0x0802D9DC }, { 0x1089, 0, 0x0802DA24 }, { 0x108A, 0, 0x0802DA8C }, { 0x108B, 0, 0x0802DACC }, - { 0x108C, 0, 0x0802DB30 }, { 0x108D, 0, 0x0802DBA0 }, { 0x108E, 0, 0x0802DBF4 }, { 0x108F, 0, 0x0802DC28 }, - { 0x1090, 0, 0x0802DC94 }, { 0x1091, 0, 0x0802DCFC }, { 0x1092, 0, 0x0802DDC0 }, { 0x1093, 0, 0x0802DE18 }, - { 0x1094, 0, 0x0802DEA0 }, { 0x1095, 0, 0x0802DF10 }, { 0x1096, 0, 0x0802DF78 }, { 0x1097, 0, 0x0802DFE0 }, - { 0x1098, 0, 0x0802E024 }, { 0x1099, 0, 0x0802E088 }, { 0x109A, 0, 0x0802E170 }, { 0x109B, 0, 0x0802E1F8 }, - { 0x109C, 0, 0x0802E240 }, { 0x109D, 0, 0x0802E290 }, { 0x109E, 0, 0x0802E2D8 }, { 0x109F, 0, 0x0802E308 }, - { 0x10A0, 0, 0x0802E364 }, { 0x10A1, 0, 0x0802E3B8 }, { 0x10A2, 0, 0x0802E3DC }, { 0x10A3, 0, 0x0802E480 }, - { 0x10A4, 0, 0x0802E4D4 }, { 0x10A5, 0, 0x0802E53C }, { 0x10A6, 0, 0x0802E624 }, { 0x10A7, 0, 0x0802E68C }, - { 0x10A8, 0, 0x0802E738 }, { 0x10A9, 0, 0x0802E78C }, { 0x10CE, 0, 0x0802E830 }, { 0x10CF, 0, 0x0802E878 }, - { 0x10D0, 0, 0x0802E8CC }, { 0x10D1, 0, 0x0802E90C }, { 0x10D2, 0, 0x0802E970 }, { 0x10D3, 0, 0x0802E9A4 }, - { 0x10D4, 0, 0x0802E9D0 }, { 0x10D6, 0, 0x0802EA7C }, { 0x10D7, 0, 0x0802EB50 }, { 0x10D8, 0, 0x0802EB6C }, - { 0x10D9, 0, 0x0802EBA0 }, { 0x10DA, 0, 0x0802EBC8 }, { 0x10DB, 0, 0x0802EC10 }, { 0x10DC, 0, 0x0802EC40 }, - { 0x10DD, 0, 0x0802EC6C }, { 0x10DE, 0, 0x0802ECA8 }, { 0x10DF, 0, 0x0802ECD8 }, { 0x10E0, 0, 0x0802ED14 }, - { 0x10E1, 0, 0x0802ED40 }, { 0x10E2, 0, 0x0802ED68 }, { 0x10E3, 0, 0x0802EDA0 }, { 0x10E4, 0, 0x0802EE18 }, - { 0x10E5, 0, 0x0802EE44 }, { 0x10E6, 0, 0x0802EEB0 }, { 0x10E7, 0, 0x0802EEE8 }, { 0x10E8, 0, 0x0802EF24 }, - { 0x10E9, 0, 0x0802EF84 }, { 0x10EA, 0, 0x0802EFCC }, { 0x10EB, 0, 0x0802EFF8 }, { 0x10EC, 0, 0x0802F030 }, - { 0x10ED, 0, 0x0802F078 }, { 0x10EE, 0, 0x0802F0B4 }, { 0x10EF, 0, 0x0802F0E0 }, { 0x10F0, 0, 0x0802F110 }, - { 0x10F1, 0, 0x0802F14C }, { 0x10F2, 0, 0x0802F184 }, { 0x10F3, 0, 0x0802F1A8 }, { 0x10F4, 0, 0x0802F1D4 }, - { 0x10F5, 0, 0x0802F204 }, { 0x10F6, 0, 0x0802F258 }, { 0x10F7, 0, 0x0802F28C }, { 0x10F8, 0, 0x0802F2D4 }, - { 0x10F9, 0, 0x0802F30C }, { 0x10FA, 0, 0x0802F334 }, { 0x10FB, 0, 0x0802F3A8 }, { 0x10FC, 0, 0x0802F3D8 }, - { 0x10FD, 0, 0x0802F408 }, { 0x10FE, 0, 0x0802F44C }, { 0x10FF, 0, 0x0802F484 }, { 0x1100, 0, 0x0802F4CC }, - { 0x1101, 0, 0x0802F500 }, { 0x1102, 0, 0x0802F590 }, { 0x1103, 0, 0x0802F5CC }, { 0x1104, 0, 0x0802F604 }, - { 0x1105, 0, 0x0802F660 }, { 0x1106, 0, 0x0802F694 }, { 0x1107, 0, 0x0802F6B8 }, { 0x1108, 0, 0x0802F730 }, - { 0x1109, 0, 0x0802F7B4 }, { 0x1130, 0, 0x0802F7D8 }, { 0x1131, 0, 0x0802F7F4 }, { 0x1132, 0, 0x0802F82C }, - { 0x1133, 0, 0x0802F8C0 }, { 0x1134, 0, 0x0802F8E8 }, { 0x1135, 0, 0x0802F8F4 }, { 0x1136, 0, 0x0802F900 }, - { 0x1137, 0, 0x0802F960 }, { 0x1138, 0, 0x0802F9D0 }, { 0x1139, 0, 0x0802FA70 }, { 0x113A, 0, 0x0802FB2C }, - { 0x113B, 0, 0x0802FB64 }, { 0x113C, 0, 0x0802FBF4 }, { 0x113D, 0, 0x0802FC4C }, { 0x113E, 0, 0x0802FCA0 }, - { 0x113F, 0, 0x0802FD10 }, { 0x1140, 0, 0x0802FDA8 }, { 0x1141, 0, 0x0802FE38 }, { 0x1142, 0, 0x0802FE7C }, - { 0x1143, 0, 0x0802FEBC }, { 0x1144, 0, 0x0802FEF8 }, { 0x1145, 0, 0x0802FF58 }, { 0x1146, 0, 0x0802FFB4 }, - { 0x1147, 0, 0x08030004 }, { 0x1148, 0, 0x08030018 }, { 0x1149, 0, 0x080300B8 }, { 0x114A, 0, 0x08030114 }, - { 0x114B, 0, 0x08030170 }, { 0x114C, 0, 0x080301CC }, { 0x114D, 0, 0x08030228 }, { 0x114E, 0, 0x08030284 }, - { 0x114F, 0, 0x080302E0 }, { 0x1150, 0, 0x08030318 }, { 0x1151, 0, 0x080303C8 }, { 0x1152, 0, 0x080303DC }, - { 0x1194, 0, 0x08030438 }, { 0x1195, 0, 0x08030458 }, { 0x1196, 0, 0x080304AC }, { 0x1197, 0, 0x080304E0 }, - { 0x1198, 0, 0x08030578 }, { 0x1199, 0, 0x080305E4 }, { 0x119A, 0, 0x080305FC }, { 0x119B, 0, 0x08030638 }, - { 0x119C, 0, 0x080306D0 }, { 0x119D, 0, 0x08030748 }, { 0x119E, 0, 0x08030770 }, { 0x119F, 0, 0x08030784 }, - { 0x11A0, 0, 0x080307EC }, { 0x11A1, 0, 0x08030828 }, { 0x11A2, 0, 0x080308E0 }, { 0x11A3, 0, 0x08030918 }, - { 0x11A4, 0, 0x08030934 }, { 0x11A5, 0, 0x08030948 }, { 0x11A6, 0, 0x080309BC }, { 0x11A7, 0, 0x080309E8 }, - { 0x11A8, 0, 0x08030A38 }, { 0x11A9, 0, 0x08030A60 }, { 0x11AA, 0, 0x08030AA0 }, { 0x11AB, 0, 0x08030ADC }, - { 0x11AC, 0, 0x08030B10 }, { 0x11AD, 0, 0x08030B40 }, { 0x11AE, 0, 0x08030B80 }, { 0x11AF, 0, 0x08030BB4 }, - { 0x11F8, 0, 0x08030BFC }, { 0x11F9, 0, 0x08030C64 }, { 0x11FA, 0, 0x08030CA0 }, { 0x11FB, 0, 0x08030D28 }, - { 0x11FC, 0, 0x08030D58 }, { 0x11FD, 0, 0x08030E14 }, { 0x11FE, 0, 0x08030E94 }, { 0x11FF, 0, 0x08030F2C }, - { 0x1200, 0, 0x08030F6C }, { 0x1201, 0, 0x08031004 }, { 0x1202, 0, 0x08031038 }, { 0x1203, 0, 0x080310A4 }, - { 0x1204, 0, 0x08031110 }, { 0x1205, 0, 0x08031154 }, { 0x1206, 0, 0x080311EC }, { 0x1207, 0, 0x08031230 }, - { 0x1208, 0, 0x08031290 }, { 0x1209, 0, 0x080312C4 }, { 0x120A, 0, 0x08031304 }, { 0x120B, 0, 0x08031320 }, - { 0x120C, 0, 0x08031348 }, { 0x120D, 0, 0x08031390 }, { 0x120E, 0, 0x080313DC }, { 0x120F, 0, 0x08031470 }, - { 0x1210, 0, 0x08031498 }, { 0x1211, 0, 0x08031520 }, { 0x1212, 0, 0x08031580 }, { 0x1213, 0, 0x080315A8 }, - { 0x1214, 0, 0x08031644 }, { 0x1215, 0, 0x080316AC }, { 0x1216, 0, 0x08031708 }, { 0x1217, 0, 0x0803176C }, - { 0x1218, 0, 0x080317BC }, { 0x1219, 0, 0x080317E8 }, { 0x121A, 0, 0x08031834 }, { 0x121B, 0, 0x080318B8 }, - { 0x121C, 0, 0x08031900 }, { 0x121D, 0, 0x08031930 }, { 0x121E, 0, 0x08031984 }, { 0x121F, 0, 0x080319C8 }, - { 0x1220, 0, 0x08031A08 }, { 0x1221, 0, 0x08031A7C }, { 0x1222, 0, 0x08031AFC }, { 0x1223, 0, 0x08031B68 }, - { 0x1224, 0, 0x08031BC0 }, { 0x1225, 0, 0x08031C10 }, { 0x1226, 0, 0x08031CD4 }, { 0x1227, 0, 0x08031D38 }, - { 0x1228, 0, 0x08031DC0 }, { 0x1229, 0, 0x08031E00 }, { 0x122A, 0, 0x08031E54 }, { 0x122B, 0, 0x08031E80 }, - { 0x122C, 0, 0x08031EF8 }, { 0x122D, 0, 0x08031F1C }, { 0x122E, 0, 0x08031FA4 }, { 0x122F, 0, 0x0803202C }, - { 0x1230, 0, 0x08032050 }, { 0x1231, 0, 0x0803210C }, { 0x1232, 0, 0x08032148 }, { 0x1233, 0, 0x080321B4 }, - { 0x1234, 0, 0x08032200 }, { 0x1235, 0, 0x08032250 }, { 0x1236, 0, 0x080322C4 }, { 0x1237, 0, 0x08032330 }, - { 0x1238, 0, 0x08032364 }, { 0x1239, 0, 0x08032414 }, { 0x123A, 0, 0x08032464 }, { 0x123B, 0, 0x08032504 }, - { 0x123C, 0, 0x08032550 }, { 0x123D, 0, 0x080325A4 }, { 0x123E, 0, 0x08032638 }, { 0x123F, 0, 0x08032698 }, - { 0x1240, 0, 0x080326FC }, { 0x1241, 0, 0x080327D4 }, { 0x1242, 0, 0x0803284C }, { 0x1243, 0, 0x08032904 }, - { 0x1244, 0, 0x08032964 }, { 0x1245, 0, 0x080329B8 }, { 0x1246, 0, 0x080329E4 }, { 0x1247, 0, 0x08032A54 }, - { 0x1248, 0, 0x08032AC0 }, { 0x1249, 0, 0x08032B08 }, { 0x124A, 0, 0x08032B68 }, { 0x124B, 0, 0x08032BC4 }, - { 0x124C, 0, 0x08032BE0 }, { 0x124D, 0, 0x08032C24 }, { 0x124E, 0, 0x08032C68 }, { 0x124F, 0, 0x08032CD8 }, - { 0x1250, 0, 0x08032D1C }, { 0x1251, 0, 0x08032D6C }, { 0x1252, 0, 0x08032DE4 }, { 0x1253, 0, 0x08032E0C }, - { 0x1254, 0, 0x08032E60 }, { 0x1255, 0, 0x08032EC4 }, { 0x1256, 0, 0x08032F38 }, { 0x1257, 0, 0x08032F7C }, - { 0x1258, 0, 0x08032FF4 }, { 0x1259, 0, 0x08033030 }, { 0x125A, 0, 0x080330BC }, { 0x125B, 0, 0x080330F8 }, - { 0x125C, 0, 0x0803319C }, { 0x125D, 0, 0x08033224 }, { 0x125E, 0, 0x080332D0 }, { 0x125F, 0, 0x08033358 }, - { 0x1260, 0, 0x080333CC }, { 0x1261, 0, 0x08033410 }, { 0x1262, 0, 0x08033450 }, { 0x1263, 0, 0x080334BC }, - { 0x1264, 0, 0x080334F4 }, { 0x1265, 0, 0x0803353C }, { 0x1266, 0, 0x08033588 }, { 0x1267, 0, 0x080335F4 }, - { 0x1268, 0, 0x08033678 }, { 0x1269, 0, 0x0803370C }, { 0x126A, 0, 0x08033778 }, { 0x126B, 0, 0x080337CC }, - { 0x126C, 0, 0x08033830 }, { 0x126D, 0, 0x080338B0 }, { 0x126E, 0, 0x08033934 }, { 0x126F, 0, 0x0803397C }, - { 0x1270, 0, 0x080339F0 }, { 0x1271, 0, 0x08033A14 }, { 0x1272, 0, 0x08033A44 }, { 0x1273, 0, 0x08033A88 }, - { 0x1274, 0, 0x08033AE0 }, { 0x1275, 0, 0x08033B74 }, { 0x1276, 0, 0x08033BC0 }, { 0x1277, 0, 0x08033C24 }, - { 0x1278, 0, 0x08033CA0 }, { 0x1279, 0, 0x08033D10 }, { 0x127A, 0, 0x08033D80 }, { 0x127B, 0, 0x08033DB4 }, - { 0x127C, 0, 0x08033E18 }, { 0x127D, 0, 0x08033E68 }, { 0x127E, 0, 0x08033EB4 }, { 0x127F, 0, 0x08033F04 }, - { 0x1280, 0, 0x08033F58 }, { 0x1281, 0, 0x08033FB8 }, { 0x1282, 0, 0x08034014 }, { 0x1283, 0, 0x08034044 }, - { 0x1284, 0, 0x0803409C }, { 0x1285, 0, 0x080340EC }, { 0x1286, 0, 0x08034140 }, { 0x1287, 0, 0x080341A0 }, - { 0x1288, 0, 0x08034204 }, { 0x1289, 0, 0x08034248 }, { 0x128A, 0, 0x080342A8 }, { 0x128B, 0, 0x080342E0 }, - { 0x128C, 0, 0x08034314 }, { 0x128D, 0, 0x08034340 }, { 0x128E, 0, 0x08034368 }, { 0x128F, 0, 0x080343C8 }, - { 0x1290, 0, 0x0803445C }, { 0x1291, 0, 0x080344E8 }, { 0x1292, 0, 0x08034528 }, { 0x1293, 0, 0x08034538 }, - { 0x1294, 0, 0x08034578 }, { 0x1295, 0, 0x080345C4 }, { 0x1296, 0, 0x08034618 }, { 0x1297, 0, 0x08034680 }, - { 0x1298, 0, 0x080346AC }, { 0x1299, 0, 0x08034728 }, { 0x129A, 0, 0x0803479C }, { 0x129B, 0, 0x08034808 }, - { 0x129C, 0, 0x08034854 }, { 0x129D, 0, 0x08034888 }, { 0x129E, 0, 0x080348B4 }, { 0x129F, 0, 0x080348FC }, - { 0x12A0, 0, 0x08034938 }, { 0x12A1, 0, 0x08034984 }, { 0x12A2, 0, 0x080349C4 }, { 0x12A3, 0, 0x08034A24 }, - { 0x12A4, 0, 0x08034A80 }, { 0x12A5, 0, 0x08034AF0 }, { 0x12A6, 0, 0x08034B40 }, { 0x12A7, 0, 0x08034B74 }, - { 0x12A8, 0, 0x08034BCC }, { 0x12A9, 0, 0x08034C2C }, { 0x12AA, 0, 0x08034CA0 }, { 0x12AB, 0, 0x08034CDC }, - { 0x12AC, 0, 0x08034D50 }, { 0x12AD, 0, 0x08034D9C }, { 0x12AE, 0, 0x08034E10 }, { 0x12AF, 0, 0x08034E40 }, - { 0x12B0, 0, 0x08034E70 }, { 0x12B1, 0, 0x08034EDC }, { 0x12B2, 0, 0x08034F28 }, { 0x12B3, 0, 0x08034F74 }, - { 0x12B4, 0, 0x08034FA0 }, { 0x12B5, 0, 0x08034FF4 }, { 0x12B6, 0, 0x08035018 }, { 0x12B7, 0, 0x0803504C }, - { 0x12B8, 0, 0x08035078 }, { 0x12B9, 0, 0x080350C0 }, { 0x12BA, 0, 0x080350F0 }, { 0x12BB, 0, 0x08035134 }, - { 0x12BC, 0, 0x0803516C }, { 0x12BD, 0, 0x080351D0 }, { 0x12BE, 0, 0x0803521C }, { 0x12BF, 0, 0x08035288 }, - { 0x12C0, 0, 0x08035308 }, { 0x12C1, 0, 0x0803534C }, { 0x12C2, 0, 0x0803539C }, { 0x12C3, 0, 0x080353CC }, - { 0x12C4, 0, 0x08035410 }, { 0x12C5, 0, 0x08035470 }, { 0x12C6, 0, 0x080354B8 }, { 0x12C7, 0, 0x08035520 }, - { 0x12C8, 0, 0x08035560 }, { 0x12C9, 0, 0x08035604 }, { 0x12CA, 0, 0x0803566C }, { 0x12CB, 0, 0x080356A4 }, - { 0x12CC, 0, 0x080356E4 }, { 0x12CD, 0, 0x0803577C }, { 0x12CE, 0, 0x080357EC }, { 0x12CF, 0, 0x0803581C }, - { 0x12D0, 0, 0x08035848 }, { 0x12D1, 0, 0x08035888 }, { 0x12D2, 0, 0x080358D0 }, { 0x12D3, 0, 0x080358E8 }, - { 0x12D4, 0, 0x0803590C }, { 0x12D5, 0, 0x0803592C }, { 0x12D6, 0, 0x0803596C }, { 0x12D7, 0, 0x080359C4 }, - { 0x12D8, 0, 0x08035A10 }, { 0x12D9, 0, 0x08035A80 }, { 0x12DA, 0, 0x08035ADC }, { 0x12DB, 0, 0x08035B48 }, - { 0x12DC, 0, 0x08035BB8 }, { 0x12DD, 0, 0x08035BF8 }, { 0x12DE, 0, 0x08035C74 }, { 0x12DF, 0, 0x08035CB0 }, - { 0x12E0, 0, 0x08035D10 }, { 0x12E3, 0, 0x08035D4C }, { 0x12E4, 0, 0x08035D70 }, { 0x12E5, 0, 0x08035DAC }, - { 0x12E6, 0, 0x08035DD8 }, { 0x12E7, 0, 0x08035DF4 }, { 0x12E8, 0, 0x08035E0C }, { 0x12E9, 0, 0x08035E58 }, - { 0x12EA, 0, 0x08035ED4 }, { 0x12EB, 0, 0x08035F44 }, { 0x12EC, 0, 0x08036074 }, { 0x12ED, 0, 0x080360BC }, - { 0x12EE, 0, 0x08036104 }, { 0x12EF, 0, 0x0803613C }, { 0x12F0, 0, 0x080361A0 }, { 0x12F1, 0, 0x080361F0 }, - { 0x12F2, 0, 0x08036248 }, { 0x12F3, 0, 0x08036260 }, { 0x12F4, 0, 0x080362A0 }, { 0x12F5, 0, 0x08036300 }, - { 0x12F6, 0, 0x08036324 }, { 0x12F7, 0, 0x080363A0 }, { 0x12F8, 0, 0x0803640C }, { 0x12F9, 0, 0x08036474 }, - { 0x12FA, 0, 0x080364CC }, { 0x12FB, 0, 0x08036508 }, { 0x12FC, 0, 0x0803655C }, { 0x12FD, 0, 0x08036578 }, - { 0x12FE, 0, 0x080365D4 }, { 0x12FF, 0, 0x080365F8 }, { 0x1300, 0, 0x08036654 }, { 0x1301, 0, 0x080366A4 }, - { 0x1302, 0, 0x080366F0 }, { 0x1303, 0, 0x08036738 }, { 0x1304, 0, 0x08036770 }, { 0x1305, 0, 0x080367AC }, - { 0x1306, 0, 0x080367F0 }, { 0x1307, 0, 0x08036830 }, { 0x1308, 0, 0x08036850 }, { 0x1309, 0, 0x0803688C }, - { 0x130A, 0, 0x080368F0 }, { 0x130B, 0, 0x08036924 }, { 0x130C, 0, 0x0803695C }, { 0x130D, 0, 0x080369A8 }, - { 0x130E, 0, 0x080369FC }, { 0x130F, 0, 0x08036A40 }, { 0x1310, 0, 0x08036A74 }, { 0x1311, 0, 0x08036AB8 }, - { 0x1312, 0, 0x08036B14 }, { 0x1313, 0, 0x08036B4C }, { 0x1314, 0, 0x08036BAC }, { 0x1315, 0, 0x08036C0C }, - { 0x1316, 0, 0x08036C64 }, { 0x1317, 0, 0x08036CBC }, { 0x1318, 0, 0x08036D1C }, { 0x1319, 0, 0x08036D80 }, - { 0x131A, 0, 0x08036DC4 }, { 0x131B, 0, 0x08036E0C }, { 0x131C, 0, 0x08036E8C }, { 0x131D, 0, 0x08036F14 }, - { 0x1388, 0, 0x08036F8C }, { 0x1389, 0, 0x08036FB4 }, { 0x138A, 0, 0x08036FF8 }, { 0x138B, 0, 0x08037034 }, - { 0x138C, 0, 0x08037060 }, { 0x138D, 0, 0x0803709C }, { 0x138E, 0, 0x0803711C }, { 0x138F, 0, 0x08037140 }, - { 0x1390, 0, 0x08037178 }, { 0x1391, 0, 0x080371AC }, { 0x1392, 0, 0x08037204 }, { 0x1393, 0, 0x08037234 }, - { 0x1394, 0, 0x08037288 }, { 0x1395, 0, 0x080372BC }, { 0x1396, 0, 0x080372F0 }, { 0x1397, 0, 0x08037310 }, - { 0x1398, 0, 0x08037338 }, { 0x1399, 0, 0x080373C4 }, { 0x139A, 0, 0x08037438 }, { 0x139B, 0, 0x080374A0 }, - { 0x139C, 0, 0x0803751C }, { 0x139D, 0, 0x0803758C }, { 0x139E, 0, 0x08037620 }, { 0x139F, 0, 0x08037704 }, - { 0x13A0, 0, 0x08037764 }, { 0x13A1, 0, 0x080377F4 }, { 0x13A2, 0, 0x08037838 }, { 0x13A3, 0, 0x08037894 }, - { 0x13A4, 0, 0x08037918 }, { 0x13A5, 0, 0x08037974 }, { 0x13A6, 0, 0x080379CC }, { 0x13A7, 0, 0x08037A68 }, - { 0x13A8, 0, 0x08037ACC }, { 0x13AE, 0, 0x08037B5C }, { 0x13AF, 0, 0x08037BF8 }, { 0x13B0, 0, 0x08037CE0 }, - { 0x13B1, 0, 0x08037D2C }, { 0x13B2, 0, 0x08037D54 }, { 0x13B3, 0, 0x08037D74 }, { 0x13EC, 0, 0x08037DB8 }, - { 0x13ED, 0, 0x08037DCC }, { 0x13EE, 0, 0x08037E30 }, { 0x13EF, 0, 0x08037EB4 }, { 0x13F0, 0, 0x08037EF4 }, - { 0x13F1, 0, 0x08037F34 }, { 0x13F2, 0, 0x08037F74 }, { 0x13F3, 0, 0x08037F8C }, { 0x13F4, 0, 0x08037FA4 }, - { 0x13F5, 0, 0x08037FC8 }, { 0x13F6, 0, 0x08037FF8 }, { 0x13F7, 0, 0x0803800C }, { 0x13F8, 0, 0x0803803C }, - { 0x13F9, 0, 0x08038084 }, { 0x13FA, 0, 0x080380C8 }, { 0x13FB, 0, 0x08038108 }, { 0x13FC, 0, 0x080381A4 }, - { 0x13FD, 0, 0x080381FC }, { 0x13FE, 0, 0x08038254 }, { 0x13FF, 0, 0x080382D8 }, { 0x1400, 0, 0x080383A8 }, - { 0x1401, 0, 0x08038504 }, { 0x1402, 0, 0x080385A8 }, { 0x1403, 0, 0x08038630 }, { 0x1404, 0, 0x0803868C }, - { 0x1405, 0, 0x080386C4 }, { 0x1406, 0, 0x08038728 }, { 0x1407, 0, 0x08038824 }, { 0x1408, 0, 0x08038844 }, - { 0x1409, 0, 0x080388F4 }, { 0x140A, 0, 0x08038984 }, { 0x140B, 0, 0x080389D0 }, { 0x140C, 0, 0x08038A3C }, - { 0x140D, 0, 0x08038A88 }, { 0x140E, 0, 0x08038AE8 }, { 0x140F, 0, 0x08038B20 }, { 0x1410, 0, 0x08038B60 }, - { 0x1411, 0, 0x08038BBC }, { 0x1412, 0, 0x08038BF4 }, { 0x1413, 0, 0x08038C34 }, { 0x1414, 0, 0x08038CC0 }, - { 0x1450, 0, 0x08038D04 }, { 0x1451, 0, 0x08038EC4 }, { 0x1452, 0, 0x08038EF8 }, { 0x1453, 0, 0x08038F10 }, - { 0x1454, 0, 0x08038F50 }, { 0x1455, 0, 0x08038F9C }, { 0x1456, 0, 0x08038FE4 }, { 0x1457, 0, 0x08039064 }, - { 0x1458, 0, 0x080390A8 }, { 0x1459, 0, 0x080390D4 }, { 0x145A, 0, 0x08039128 }, { 0x145B, 0, 0x08039198 }, - { 0x145C, 0, 0x080391C4 }, { 0x145D, 0, 0x080391D8 }, { 0x145E, 0, 0x08039204 }, { 0x145F, 0, 0x080392B0 }, - { 0x1460, 0, 0x08039360 }, { 0x1461, 0, 0x080393A8 }, { 0x1462, 0, 0x080393BC }, { 0x1463, 0, 0x080393EC }, - { 0x1464, 0, 0x0803940C }, { 0x1465, 0, 0x0803942C }, { 0x1466, 0, 0x08039454 }, { 0x1467, 0, 0x0803948C }, - { 0x1468, 0, 0x080394E8 }, { 0x1469, 0, 0x08039548 }, { 0x146A, 0, 0x080395A8 }, { 0x146B, 0, 0x08039638 }, - { 0x146C, 0, 0x08039700 }, { 0x146D, 0, 0x08039738 }, { 0x146E, 0, 0x08039758 }, { 0x146F, 0, 0x080397D8 }, - { 0x1470, 0, 0x08039858 }, { 0x1471, 0, 0x08039880 }, { 0x1472, 0, 0x080398B8 }, { 0x1473, 0, 0x08039924 }, - { 0x1474, 0, 0x08039950 }, { 0x1475, 0, 0x08039A64 }, { 0x1476, 0, 0x08039AE8 }, { 0x1477, 0, 0x08039B4C }, - { 0x1478, 0, 0x08039B70 }, { 0x1479, 0, 0x08039B98 }, { 0x147A, 0, 0x08039BCC }, { 0x147B, 0, 0x08039C00 }, - { 0x147C, 0, 0x08039D6C }, { 0x147D, 0, 0x08039E18 }, { 0x14B4, 0, 0x08039E78 }, { 0x14B5, 0, 0x08039EA8 }, - { 0x14B6, 0, 0x08039EF8 }, { 0x14B7, 0, 0x08039F64 }, { 0x14B8, 0, 0x08039F90 }, { 0x14B9, 0, 0x08039FE4 }, - { 0x14BA, 0, 0x0803A044 }, { 0x14BB, 0, 0x0803A090 }, { 0x14BC, 0, 0x0803A110 }, { 0x14BD, 0, 0x0803A138 }, - { 0x14BE, 0, 0x0803A1B8 }, { 0x14BF, 0, 0x0803A208 }, { 0x14C0, 0, 0x0803A25C }, { 0x14C1, 0, 0x0803A29C }, - { 0x14C2, 0, 0x0803A2E8 }, { 0x14C3, 0, 0x0803A384 }, { 0x14C4, 0, 0x0803A3FC }, { 0x14C5, 0, 0x0803A458 }, - { 0x14C6, 0, 0x0803A514 }, { 0x14C7, 0, 0x0803A540 }, { 0x14C8, 0, 0x0803A570 }, { 0x14C9, 0, 0x0803A5E4 }, - { 0x14CA, 0, 0x0803A614 }, { 0x14CB, 0, 0x0803A684 }, { 0x14CC, 0, 0x0803A700 }, { 0x14CD, 0, 0x0803A79C }, - { 0x14CE, 0, 0x0803A7B8 }, { 0x14CF, 0, 0x0803A880 }, { 0x14D0, 0, 0x0803A8AC }, { 0x14D1, 0, 0x0803A96C }, - { 0x14D2, 0, 0x0803AA08 }, { 0x14D3, 0, 0x0803AA80 }, { 0x14D4, 0, 0x0803AB40 }, { 0x14D5, 0, 0x0803AB80 }, - { 0x14D6, 0, 0x0803ABC0 }, { 0x14D7, 0, 0x0803AC30 }, { 0x14D8, 0, 0x0803AC78 }, { 0x14D9, 0, 0x0803ACEC }, - { 0x14DA, 0, 0x0803AD64 }, { 0x14DB, 0, 0x0803AD8C }, { 0x14DC, 0, 0x0803ADB8 }, { 0x14DD, 0, 0x0803ADEC }, - { 0x14DE, 0, 0x0803AE40 }, { 0x14DF, 0, 0x0803AEAC }, { 0x14E0, 0, 0x0803AEFC }, { 0x14E1, 0, 0x0803AF58 }, - { 0x14E2, 0, 0x0803AFDC }, { 0x14E3, 0, 0x0803B018 }, { 0x14E4, 0, 0x0803B044 }, { 0x14E5, 0, 0x0803B07C }, - { 0x14E6, 0, 0x0803B100 }, { 0x14E7, 0, 0x0803B13C }, { 0x14E8, 0, 0x0803B19C }, { 0x14E9, 0, 0x0803B220 }, - { 0x14EA, 0, 0x0803B2A0 }, { 0x14EB, 0, 0x0803B358 }, { 0x14EC, 0, 0x0803B398 }, { 0x14ED, 0, 0x0803B40C }, - { 0x14EE, 0, 0x0803B518 }, { 0x14EF, 0, 0x0803B5F8 }, { 0x14F0, 0, 0x0803B63C }, { 0x14F1, 0, 0x0803B6A8 }, - { 0x14F2, 0, 0x0803B734 }, { 0x14F3, 0, 0x0803B7B8 }, { 0x14F4, 0, 0x0803B834 }, { 0x14F5, 0, 0x0803B910 }, - { 0x14F6, 0, 0x0803B984 }, { 0x14F7, 0, 0x0803B9F0 }, { 0x14F8, 0, 0x0803BA80 }, { 0x14F9, 0, 0x0803BAB8 }, - { 0x14FA, 0, 0x0803BAF8 }, { 0x14FB, 0, 0x0803BB60 }, { 0x14FC, 0, 0x0803BB8C }, { 0x1518, 0, 0x0803BBFC }, - { 0x1519, 0, 0x0803BC5C }, { 0x151A, 0, 0x0803BCB0 }, { 0x151B, 0, 0x0803BCC8 }, { 0x151C, 0, 0x0803BCF8 }, - { 0x151D, 0, 0x0803BD44 }, { 0x151E, 0, 0x0803BDB8 }, { 0x151F, 0, 0x0803BDFC }, { 0x1520, 0, 0x0803BE9C }, - { 0x1521, 0, 0x0803BF18 }, { 0x1522, 0, 0x0803BF64 }, { 0x1523, 0, 0x0803BF8C }, { 0x1524, 0, 0x0803BFA4 }, - { 0x1525, 0, 0x0803BFD8 }, { 0x1526, 0, 0x0803BFF8 }, { 0x1527, 0, 0x0803C014 }, { 0x1528, 0, 0x0803C068 }, - { 0x1529, 0, 0x0803C0EC }, { 0x152A, 0, 0x0803C174 }, { 0x152B, 0, 0x0803C1CC }, { 0x152C, 0, 0x0803C22C }, - { 0x152D, 0, 0x0803C290 }, { 0x152E, 0, 0x0803C314 }, { 0x152F, 0, 0x0803C398 }, { 0x1530, 0, 0x0803C3F0 }, - { 0x1531, 0, 0x0803C454 }, { 0x1532, 0, 0x0803C4DC }, { 0x1533, 0, 0x0803C518 }, { 0x1534, 0, 0x0803C564 }, - { 0x1535, 0, 0x0803C5A4 }, { 0x1536, 0, 0x0803C5E4 }, { 0x1537, 0, 0x0803C644 }, { 0x1538, 0, 0x0803C6C8 }, - { 0x1539, 0, 0x0803C744 }, { 0x153A, 0, 0x0803C7E0 }, { 0x153B, 0, 0x0803C80C }, { 0x153C, 0, 0x0803C84C }, - { 0x153D, 0, 0x0803C884 }, { 0x153E, 0, 0x0803C89C }, { 0x153F, 0, 0x0803C8DC }, { 0x1540, 0, 0x0803C908 }, - { 0x1541, 0, 0x0803C944 }, { 0x1542, 0, 0x0803C9A0 }, { 0x157C, 0, 0x0803C9BC }, { 0x157D, 0, 0x0803C9D4 }, - { 0x157E, 0, 0x0803CA30 }, { 0x157F, 0, 0x0803CA70 }, { 0x1580, 0, 0x0803CAA0 }, { 0x1581, 0, 0x0803CAEC }, - { 0x1582, 0, 0x0803CB04 }, { 0x1583, 0, 0x0803CB18 }, { 0x1584, 0, 0x0803CB30 }, { 0x1585, 0, 0x0803CB64 }, - { 0x1586, 0, 0x0803CBD8 }, { 0x1587, 0, 0x0803CBF4 }, { 0x1588, 0, 0x0803CC34 }, { 0x1589, 0, 0x0803CC78 }, - { 0x158A, 0, 0x0803CD14 }, { 0x158B, 0, 0x0803CDA0 }, { 0x158C, 0, 0x0803CDE0 }, { 0x158D, 0, 0x0803CE3C }, - { 0x158E, 0, 0x0803CEA8 }, { 0x158F, 0, 0x0803CEE8 }, { 0x1590, 0, 0x0803CF30 }, { 0x1591, 0, 0x0803CFA4 }, - { 0x1592, 0, 0x0803D050 }, { 0x1593, 0, 0x0803D0C8 }, { 0x1594, 0, 0x0803D118 }, { 0x1595, 0, 0x0803D168 }, - { 0x1596, 0, 0x0803D1A8 }, { 0x1597, 0, 0x0803D1F0 }, { 0x1598, 0, 0x0803D228 }, { 0x1599, 0, 0x0803D290 }, - { 0x159A, 0, 0x0803D2FC }, { 0x159B, 0, 0x0803D368 }, { 0x159C, 0, 0x0803D448 }, { 0x159D, 0, 0x0803D4C0 }, - { 0x159E, 0, 0x0803D500 }, { 0x159F, 0, 0x0803D558 }, { 0x15A0, 0, 0x0803D5B4 }, { 0x15A1, 0, 0x0803D628 }, - { 0x15A2, 0, 0x0803D730 }, { 0x15A3, 0, 0x0803D798 }, { 0x15A4, 0, 0x0803D818 }, { 0x15A5, 0, 0x0803D868 }, - { 0x15A6, 0, 0x0803D8C4 }, { 0x15A7, 0, 0x0803D9AC }, { 0x15A8, 0, 0x0803D9FC }, { 0x15E0, 0, 0x0803DA3C }, - { 0x15E1, 0, 0x0803DA80 }, { 0x15E2, 0, 0x0803DB14 }, { 0x15E3, 0, 0x0803DB9C }, { 0x15E4, 0, 0x0803DC1C }, - { 0x15E5, 0, 0x0803DC70 }, { 0x15E6, 0, 0x0803DCA8 }, { 0x15E7, 0, 0x0803DCF8 }, { 0x15E8, 0, 0x0803DD5C }, - { 0x15E9, 0, 0x0803DE00 }, { 0x15EA, 0, 0x0803DE5C }, { 0x15EB, 0, 0x0803DE84 }, { 0x15EC, 0, 0x0803DED0 }, - { 0x15ED, 0, 0x0803DF34 }, { 0x15EE, 0, 0x0803DF64 }, { 0x15EF, 0, 0x0803DF9C }, { 0x15F0, 0, 0x0803DFBC }, - { 0x15F1, 0, 0x0803E018 }, { 0x15F2, 0, 0x0803E0B8 }, { 0x15F3, 0, 0x0803E124 }, { 0x15F4, 0, 0x0803E178 }, - { 0x15F5, 0, 0x0803E1E0 }, { 0x15F6, 0, 0x0803E298 }, { 0x15F7, 0, 0x0803E310 }, { 0x15F8, 0, 0x0803E36C }, - { 0x15F9, 0, 0x0803E3D0 }, { 0x15FA, 0, 0x0803E420 }, { 0x15FB, 0, 0x0803E454 }, { 0x15FC, 0, 0x0803E488 }, - { 0x15FD, 0, 0x0803E4E8 }, { 0x15FE, 0, 0x0803E59C }, { 0x15FF, 0, 0x0803E620 }, { 0x1600, 0, 0x0803E66C }, - { 0x1601, 0, 0x0803E70C }, { 0x1602, 0, 0x0803E74C }, { 0x1603, 0, 0x0803E7A4 }, { 0x1604, 0, 0x0803E7DC }, - { 0x1605, 0, 0x0803E804 }, { 0x1606, 0, 0x0803E864 }, { 0x1607, 0, 0x0803E8E8 }, { 0x1608, 0, 0x0803E930 }, - { 0x1609, 0, 0x0803E9E4 }, { 0x160A, 0, 0x0803EA4C }, { 0x160B, 0, 0x0803EAB0 }, { 0x160C, 0, 0x0803EB18 }, - { 0x160D, 0, 0x0803EB58 }, { 0x160E, 0, 0x0803EBA8 }, { 0x160F, 0, 0x0803EBFC }, { 0x1610, 0, 0x0803EC9C }, - { 0x1611, 0, 0x0803ED14 }, { 0x1612, 0, 0x0803EE08 }, { 0x1613, 0, 0x0803EE48 }, { 0x1614, 0, 0x0803EEB0 }, - { 0x1615, 0, 0x0803EEF0 }, { 0x1616, 0, 0x0803EFAC }, { 0x1617, 0, 0x0803F004 }, { 0x1618, 0, 0x0803F04C }, - { 0x1619, 0, 0x0803F078 }, { 0x161A, 0, 0x0803F0E0 }, { 0x161B, 0, 0x0803F110 }, { 0x161C, 0, 0x0803F15C }, - { 0x161D, 0, 0x0803F1EC }, { 0x161E, 0, 0x0803F264 }, { 0x161F, 0, 0x0803F2CC }, { 0x1620, 0, 0x0803F344 }, - { 0x1621, 0, 0x0803F3A8 }, { 0x1622, 0, 0x0803F3F4 }, { 0x1623, 0, 0x0803F46C }, { 0x1624, 0, 0x0803F4AC }, - { 0x1625, 0, 0x0803F500 }, { 0x1626, 0, 0x0803F608 }, { 0x1627, 0, 0x0803F66C }, { 0x1628, 0, 0x0803F6E8 }, - { 0x1629, 0, 0x0803F718 }, { 0x162A, 0, 0x0803F760 }, { 0x162B, 0, 0x0803F7C0 }, { 0x162C, 0, 0x0803F87C }, - { 0x162D, 0, 0x0803F8A8 }, { 0x162E, 0, 0x0803F8EC }, { 0x162F, 0, 0x0803F94C }, { 0x1630, 0, 0x0803F978 }, - { 0x1631, 0, 0x0803F9DC }, { 0x1632, 0, 0x0803FA3C }, { 0x1633, 0, 0x0803FA78 }, { 0x1634, 0, 0x0803FAC4 }, - { 0x1635, 0, 0x0803FB0C }, { 0x1636, 0, 0x0803FB5C }, { 0x1637, 0, 0x0803FBCC }, { 0x1638, 0, 0x0803FC50 }, - { 0x1644, 0, 0x0803FC6C }, { 0x1645, 0, 0x0803FD0C }, { 0x1646, 0, 0x0803FD5C }, { 0x1647, 0, 0x0803FDC0 }, - { 0x1648, 0, 0x0803FE08 }, { 0x1649, 0, 0x0803FE54 }, { 0x164A, 0, 0x0803FEB4 }, { 0x164B, 0, 0x0803FF88 }, - { 0x164C, 0, 0x0803FFF4 }, { 0x164D, 0, 0x08040064 }, { 0x164E, 0, 0x080400BC }, { 0x164F, 0, 0x0804010C }, - { 0x1650, 0, 0x08040174 }, { 0x1651, 0, 0x0804019C }, { 0x1652, 0, 0x08040208 }, { 0x1653, 0, 0x08040250 }, - { 0x1654, 0, 0x080402B0 }, { 0x1655, 0, 0x080402CC }, { 0x1656, 0, 0x0804032C }, { 0x1657, 0, 0x0804035C }, - { 0x1658, 0, 0x080403C0 }, { 0x1659, 0, 0x08040494 }, { 0x165A, 0, 0x08040530 }, { 0x165B, 0, 0x0804054C }, - { 0x165C, 0, 0x080405AC }, { 0x165D, 0, 0x080405E0 }, { 0x165E, 0, 0x08040624 }, { 0x165F, 0, 0x0804070C }, - { 0x1660, 0, 0x08040798 }, { 0x1661, 0, 0x080407C0 }, { 0x1700, 0, 0x08040848 }, { 0x1701, 0, 0x080408E4 }, - { 0x1702, 0, 0x0804092C }, { 0x1703, 0, 0x08040988 }, { 0x1704, 0, 0x080409D4 }, { 0x1705, 0, 0x08040A28 }, - { 0x1706, 0, 0x08040ABC }, { 0x1707, 0, 0x08040B0C }, { 0x1708, 0, 0x08040B50 }, { 0x1709, 0, 0x08040BA4 }, - { 0x170A, 0, 0x08040C18 }, { 0x170B, 0, 0x08040C60 }, { 0x170C, 0, 0x08040C6C }, { 0x170D, 0, 0x08040CC8 }, - { 0x170E, 0, 0x08040D38 }, { 0x170F, 0, 0x08040DBC }, { 0x1710, 0, 0x08040E0C }, { 0x1711, 0, 0x08040E84 }, - { 0x1712, 0, 0x08040E90 }, { 0x1713, 0, 0x08040EE8 }, { 0x1714, 0, 0x08040F30 }, { 0x1715, 0, 0x08040F78 }, - { 0x1716, 0, 0x08040FD0 }, { 0x1717, 0, 0x08041050 }, { 0x1718, 0, 0x08041084 }, { 0x1719, 0, 0x080410E8 }, - { 0x171A, 0, 0x08041128 }, { 0x171B, 0, 0x08041170 }, { 0x171C, 0, 0x080411BC }, { 0x171D, 0, 0x080411C8 }, - { 0x171E, 0, 0x0804122C }, { 0x171F, 0, 0x0804125C }, { 0x1720, 0, 0x080412A8 }, { 0x1721, 0, 0x080412E8 }, - { 0x1722, 0, 0x0804132C }, { 0x1723, 0, 0x08041378 }, { 0x1724, 0, 0x080413C0 }, { 0x1725, 0, 0x08041414 }, - { 0x1726, 0, 0x08041470 }, { 0x1727, 0, 0x0804147C }, { 0x1728, 0, 0x08041488 }, { 0x1729, 0, 0x080414D0 }, - { 0x172A, 0, 0x08041530 }, { 0x172B, 0, 0x08041588 }, { 0x172C, 0, 0x080415E4 }, { 0x172D, 0, 0x08041640 }, - { 0x172E, 0, 0x08041698 }, { 0x172F, 0, 0x080416FC }, { 0x1730, 0, 0x08041740 }, { 0x1731, 0, 0x08041794 }, - { 0x1732, 0, 0x080417A0 }, { 0x1733, 0, 0x080417F4 }, { 0x1734, 0, 0x08041848 }, { 0x1735, 0, 0x0804189C }, - { 0x1736, 0, 0x08041900 }, { 0x1737, 0, 0x08041958 }, { 0x1738, 0, 0x080419A8 }, { 0x1739, 0, 0x080419F4 }, - { 0x173A, 0, 0x08041A54 }, { 0x173B, 0, 0x08041AA0 }, { 0x173C, 0, 0x08041AF8 }, { 0x173D, 0, 0x08041B54 }, - { 0x173E, 0, 0x08041BA4 }, { 0x173F, 0, 0x08041BF4 }, { 0x1740, 0, 0x08041C48 }, { 0x1741, 0, 0x08041CAC }, - { 0x1742, 0, 0x08041D08 }, { 0x1743, 0, 0x08041D68 }, { 0x1744, 0, 0x08041DB4 }, { 0x1745, 0, 0x08041DF8 }, - { 0x1746, 0, 0x08041E54 }, { 0x1747, 0, 0x08041EB0 }, { 0x1748, 0, 0x08041F2C }, { 0x1749, 0, 0x08041F78 }, - { 0x1784, 0, 0x08041FD0 }, { 0x1785, 0, 0x0804202C }, { 0x1786, 0, 0x08042088 }, { 0x1787, 0, 0x080420E4 }, - { 0x1788, 0, 0x080420F0 }, { 0x1789, 0, 0x0804214C }, { 0x178A, 0, 0x080421B0 }, { 0x178B, 0, 0x080421F4 }, - { 0x178C, 0, 0x0804223C }, { 0x178D, 0, 0x08042288 }, { 0x178E, 0, 0x080422CC }, { 0x178F, 0, 0x08042314 }, - { 0x1798, 0, 0x08042360 }, { 0x1799, 0, 0x080423AC }, { 0x179A, 0, 0x080423F4 }, { 0x179B, 0, 0x08042440 }, - { 0x17AA, 0, 0x08042490 }, { 0x17AC, 0, 0x08042514 }, { 0x17AD, 0, 0x08042568 }, { 0x17AE, 0, 0x080425C0 }, - { 0x17AF, 0, 0x0804262C }, { 0x1800, 0, 0x080426AC }, { 0x1801, 0, 0x080426CC }, { 0x1802, 0, 0x0804272C }, - { 0x1803, 0, 0x08042754 }, { 0x1804, 0, 0x08042784 }, { 0x1805, 0, 0x080427E0 }, { 0x1806, 0, 0x08042834 }, - { 0x1807, 0, 0x08042870 }, { 0x1808, 0, 0x080428D0 }, { 0x1809, 0, 0x08042910 }, { 0x180A, 0, 0x0804293C }, - { 0x180B, 0, 0x08042968 }, { 0x180C, 0, 0x08042990 }, { 0x180D, 0, 0x080429AC }, { 0x180E, 0, 0x08042A04 }, - { 0x180F, 0, 0x08042A50 }, { 0x1810, 0, 0x08042A80 }, { 0x1811, 0, 0x08042AB4 }, { 0x1812, 0, 0x08042AF8 }, - { 0x1813, 0, 0x08042B38 }, { 0x1814, 0, 0x08042B6C }, { 0x1815, 0, 0x08042BAC }, { 0x1816, 0, 0x08042C04 }, - { 0x1817, 0, 0x08042C4C }, { 0x1818, 0, 0x08042C8C }, { 0x1819, 0, 0x08042CB8 }, { 0x181A, 0, 0x08042CEC }, - { 0x181B, 0, 0x08042D28 }, { 0x181C, 0, 0x08042D34 }, { 0x181D, 0, 0x08042D94 }, { 0x181E, 0, 0x08042DD8 }, - { 0x181F, 0, 0x08042DF0 }, { 0x1820, 0, 0x08042E40 }, { 0x1821, 0, 0x08042E7C }, { 0x1822, 0, 0x08042EB0 }, - { 0x1823, 0, 0x08042EE8 }, { 0x1824, 0, 0x08042F20 }, { 0x1883, 0, 0x08042F2C }, { 0x1884, 0, 0x08042F60 }, - { 0x1885, 0, 0x08042F9C }, { 0x1886, 0, 0x08043008 }, { 0x1887, 0, 0x08043054 }, { 0x1888, 0, 0x08043094 }, - { 0x1889, 0, 0x080430E4 }, { 0x188A, 0, 0x08043134 }, { 0x188B, 0, 0x08043150 }, { 0x188C, 0, 0x0804318C }, - { 0x188D, 0, 0x080431E8 }, { 0x188E, 0, 0x08043224 }, { 0x188F, 0, 0x0804326C }, { 0x1890, 0, 0x08043298 }, - { 0x1891, 0, 0x080432D8 }, { 0x1892, 0, 0x0804332C }, { 0x1893, 0, 0x08043378 }, { 0x1901, 0, 0x080433B4 }, - { 0x1902, 0, 0x0804341C }, { 0x1903, 0, 0x08043484 }, { 0x1904, 0, 0x08043508 }, { 0x1905, 0, 0x08043580 }, - { 0x1906, 0, 0x08043610 }, { 0x1907, 0, 0x0804367C }, { 0x1908, 0, 0x08043710 }, { 0x1909, 0, 0x08043784 }, - { 0x190A, 0, 0x0804380C }, { 0x190B, 0, 0x08043880 }, { 0x190C, 0, 0x080438E8 }, { 0x190D, 0, 0x08043948 }, - { 0x190E, 0, 0x080439C4 }, { 0x190F, 0, 0x08043A20 }, { 0x1910, 0, 0x08043AA0 }, { 0x1911, 0, 0x08043B24 }, - { 0x1912, 0, 0x08043BA8 }, { 0x1913, 0, 0x08043C30 }, { 0x1914, 0, 0x08043C9C }, { 0x1915, 0, 0x08043CEC }, - { 0x1916, 0, 0x08043D50 }, { 0x1917, 0, 0x08043DD8 }, { 0x1918, 0, 0x08043E40 }, { 0x1919, 0, 0x08043EB0 }, - { 0x191A, 0, 0x08043F24 }, { 0x191B, 0, 0x08043FB0 }, { 0x191C, 0, 0x0804401C }, { 0x191D, 0, 0x08044098 }, - { 0x191E, 0, 0x0804411C }, { 0x191F, 0, 0x08044184 }, { 0x1921, 0, 0x080441E8 }, { 0x1922, 0, 0x08044258 }, - { 0x1923, 0, 0x080442D4 }, { 0x1924, 0, 0x08044348 }, { 0x1925, 0, 0x080443D0 }, { 0x1926, 0, 0x08044458 }, - { 0x1927, 0, 0x080444DC }, { 0x1928, 0, 0x08044574 }, { 0x1929, 0, 0x080445CC }, { 0x192A, 0, 0x08044630 }, - { 0x192C, 0, 0x080446AC }, { 0x192D, 0, 0x0804471C }, { 0x192E, 0, 0x08044780 }, { 0x1930, 0, 0x08044808 }, - { 0x1931, 0, 0x08044898 }, { 0x1932, 0, 0x08044910 }, { 0x1933, 0, 0x0804498C }, { 0x1934, 0, 0x08044A04 }, - { 0x1935, 0, 0x08044A94 }, { 0x1937, 0, 0x08044B10 }, { 0x1939, 0, 0x08044B9C }, { 0x193A, 0, 0x08044C0C }, - { 0x193B, 0, 0x08044C18 }, { 0x193C, 0, 0x08044C8C }, { 0x1942, 0, 0x08044D04 }, { 0x1944, 0, 0x08044D6C }, - { 0x1945, 0, 0x08044DCC }, { 0x1946, 0, 0x08044E48 }, { 0x1947, 0, 0x08044EAC }, { 0x1948, 0, 0x08044F20 }, - { 0x1949, 0, 0x08044F88 }, { 0x194A, 0, 0x08045004 }, { 0x194B, 0, 0x08045084 }, { 0x194C, 0, 0x080450F4 }, - { 0x194D, 0, 0x08045174 }, { 0x1950, 0, 0x080451C8 }, { 0x1951, 0, 0x08045238 }, { 0x1952, 0, 0x080452A0 }, - { 0x1953, 0, 0x08045310 }, { 0x1954, 0, 0x08045378 }, { 0x1955, 0, 0x080453E8 }, { 0x1956, 0, 0x08045458 }, - { 0x1957, 0, 0x080454CC }, { 0x1958, 0, 0x08045540 }, { 0x1959, 0, 0x080455C4 }, { 0x195A, 0, 0x0804564C }, - { 0x195B, 0, 0x080456AC }, { 0x195C, 0, 0x08045704 }, { 0x195D, 0, 0x0804576C }, { 0x195E, 0, 0x080457E8 }, - { 0x195F, 0, 0x08045838 }, { 0x1960, 0, 0x0804589C }, { 0x1961, 0, 0x08045918 }, { 0x1962, 0, 0x08045988 }, - { 0x1963, 0, 0x080459E4 }, { 0x1964, 0, 0x08045A24 }, { 0x1B58, 0, 0x08045ACC }, { 0x1B59, 0, 0x08045ADC }, - { 0x1B5A, 0, 0x08045B00 }, { 0x1B5B, 0, 0x08045B20 }, { 0x1B5C, 0, 0x08045B2C }, { 0x1B5D, 0, 0x08045B58 }, - { 0x1B5E, 0, 0x08045B7C }, { 0x1B5F, 0, 0x08045BAC }, { 0x1B60, 0, 0x08045BD8 }, { 0x1B61, 0, 0x08045BFC }, - { 0x1B62, 0, 0x08045C18 }, { 0x1B63, 0, 0x08045C3C }, { 0x1B64, 0, 0x08045C60 }, { 0x1B65, 0, 0x08045C90 }, - { 0x1B66, 0, 0x08045CC0 }, { 0x1B67, 0, 0x08045CEC }, { 0x1B6A, 0, 0x08045CF8 }, { 0x1B6B, 0, 0x08045D28 }, - { 0x1B72, 0, 0x08045D58 }, { 0x1B73, 0, 0x08045D8C }, { 0x1B74, 0, 0x08045DB8 }, { 0x1B75, 0, 0x08045DEC }, - { 0x1B76, 0, 0x08045E1C }, { 0x1B77, 0, 0x08045E48 }, { 0x1B78, 0, 0x08045E54 }, { 0x1B79, 0, 0x08045E80 }, - { 0x1B7A, 0, 0x08045EB0 }, { 0x1B7B, 0, 0x08045ED8 }, { 0x1B7C, 0, 0x08045F08 }, { 0x1B7D, 0, 0x08045F34 }, - { 0x1B7E, 0, 0x08045F40 }, { 0x1B7F, 0, 0x08045F74 }, { 0x1B80, 0, 0x08045FA8 }, { 0x1B81, 0, 0x08045FD4 }, - { 0x1B89, 0, 0x08045FE0 }, { 0x1B8A, 0, 0x08045FF0 }, { 0x1B8B, 0, 0x08046038 }, { 0x1B8C, 0, 0x08046060 }, - { 0x1B8D, 0, 0x08046098 }, { 0x1B8E, 0, 0x080460D4 }, { 0x1B8F, 0, 0x08046110 }, { 0x1B90, 0, 0x08046150 }, - { 0x1B91, 0, 0x0804618C }, { 0x1B92, 0, 0x080461CC }, { 0x1B93, 0, 0x08046208 }, { 0x1B94, 0, 0x0804622C }, - { 0x1B95, 0, 0x0804626C }, { 0x1B96, 0, 0x080462A8 }, { 0x1B98, 0, 0x080462B4 }, { 0x1B9E, 0, 0x08046300 }, - { 0x1B9F, 0, 0x08046374 }, { 0x1BA0, 0, 0x080463FC }, { 0x1BA1, 0, 0x08046480 }, { 0x1BA2, 0, 0x08046594 }, - { 0x1BA4, 0, 0x080465C4 }, { 0x1BA5, 0, 0x08046654 }, { 0x1BA6, 0, 0x08046684 }, { 0x1BA7, 0, 0x080466D4 }, - { 0x1BA8, 0, 0x08046760 }, { 0x1BAC, 0, 0x080467E8 }, { 0x1BB2, 0, 0x08046848 }, { 0x1BB3, 0, 0x08046888 }, - { 0x1BB4, 0, 0x080468C4 }, { 0x1BB5, 0, 0x08046904 }, { 0x1BB6, 0, 0x08046944 }, { 0x1C00, 0, 0x08046984 }, - { 0x1C01, 0, 0x08046A4C }, { 0x1C02, 0, 0x08046AB8 }, { 0x1C03, 0, 0x08046BA8 }, { 0x1C04, 0, 0x08046C10 }, - { 0x1C05, 0, 0x08046D68 }, { 0x1C06, 0, 0x08046E44 }, { 0x1C07, 0, 0x08046EAC }, { 0x1C08, 0, 0x08046F0C }, - { 0x1C09, 0, 0x08046F5C }, { 0x1C0A, 0, 0x08046F94 }, { 0x1C0B, 0, 0x08047014 }, { 0x1C0C, 0, 0x080470D4 }, - { 0x1C0D, 0, 0x08047118 }, { 0x1C0E, 0, 0x08047130 }, { 0x1C0F, 0, 0x08047148 }, { 0x1C10, 0, 0x08047164 }, - { 0x1C11, 0, 0x0804717C }, { 0x1C12, 0, 0x0804719C }, { 0x1C13, 0, 0x080471BC }, { 0x1C14, 0, 0x080471D4 }, - { 0x1C15, 0, 0x080471F0 }, { 0x1C16, 0, 0x08047214 }, { 0x1C17, 0, 0x0804730C }, { 0x1C18, 0, 0x0804734C }, - { 0x1D00, 0, 0x080473A4 }, { 0x1D01, 0, 0x08047414 }, { 0x1D02, 0, 0x08047524 }, { 0x1D03, 0, 0x0804758C }, - { 0x1D04, 0, 0x08047644 }, { 0x1D05, 0, 0x08047678 }, { 0x1D06, 0, 0x080476D0 }, { 0x1D07, 0, 0x080476F8 }, - { 0x1D08, 0, 0x08047728 }, { 0x1D09, 0, 0x08047788 }, { 0x1D0A, 0, 0x080477C0 }, { 0x1D0B, 0, 0x080477F4 }, - { 0x1D0C, 0, 0x08047808 }, { 0x1D0D, 0, 0x08047820 }, { 0x1D11, 0, 0x08047844 }, { 0x1D12, 0, 0x08047890 }, - { 0x1D13, 0, 0x080478D8 }, { 0x1D14, 0, 0x08047920 }, { 0x1D15, 0, 0x0804796C }, { 0x1D16, 0, 0x080479B4 }, - { 0x1D17, 0, 0x080479FC }, { 0x1F40, 0, 0x08047A20 }, { 0x1F41, 0, 0x08047ABC }, { 0x1F42, 0, 0x08047B20 }, - { 0x1F43, 0, 0x08047B94 }, { 0x1F44, 0, 0x08047BD8 }, { 0x1F45, 0, 0x08047C40 }, { 0x1F46, 0, 0x08047CB4 }, - { 0x1F47, 0, 0x08047D1C }, { 0x1F48, 0, 0x08047D88 }, { 0x1F49, 0, 0x08047DA8 }, { 0x1F4A, 0, 0x08047E48 }, - { 0x1F4B, 0, 0x08047F30 }, { 0x1F4C, 0, 0x08047F88 }, { 0x1F4D, 0, 0x08048014 }, { 0x1F4E, 0, 0x080480E0 }, - { 0x1F4F, 0, 0x0804819C }, { 0x1F50, 0, 0x08048280 }, { 0x1F51, 0, 0x080482E4 }, { 0x1F52, 0, 0x0804833C }, - { 0x1F53, 0, 0x080483B8 }, { 0x1F54, 0, 0x08048430 }, { 0x1F55, 0, 0x080484AC }, { 0x1F56, 0, 0x080484F8 }, - { 0x1F5F, 0, 0x0804857C }, { 0x1F60, 0, 0x0804859C }, { 0x1F61, 0, 0x080485D4 }, { 0x1F62, 0, 0x08048604 }, - { 0x1F63, 0, 0x0804862C }, { 0x1F64, 0, 0x0804866C }, { 0x1F65, 0, 0x080486A4 }, { 0x1F66, 0, 0x080486E0 }, - { 0x1F67, 0, 0x08048708 }, { 0x1F68, 0, 0x08048774 }, { 0x1F69, 0, 0x080487A4 }, { 0x1F6A, 0, 0x080487E0 }, - { 0x1F6B, 0, 0x08048810 }, { 0x1F6C, 0, 0x08048864 }, { 0x1F6D, 0, 0x08048898 }, { 0x1F6E, 0, 0x08048960 }, - { 0x1F6F, 0, 0x08048990 }, { 0x1F70, 0, 0x080489E8 }, { 0x1F71, 0, 0x08048A44 }, { 0x1F72, 0, 0x08048AB8 }, - { 0x1F73, 0, 0x08048AE8 }, { 0x1F74, 0, 0x08048B94 }, { 0x1F75, 0, 0x08048BB0 }, { 0x1FA4, 0, 0x08048BD8 }, - { 0x1FA5, 0, 0x08048C14 }, { 0x1FA6, 0, 0x08048CF8 }, { 0x1FA7, 0, 0x08048D40 }, { 0x1FA8, 0, 0x08048D88 }, - { 0x1FA9, 0, 0x08048DF4 }, { 0x1FAA, 0, 0x08048E68 }, { 0x1FAB, 0, 0x08048EE0 }, { 0x1FAC, 0, 0x08048FB4 }, - { 0x1FAD, 0, 0x08049034 }, { 0x1FAE, 0, 0x08049068 }, { 0x1FAF, 0, 0x080491B0 }, { 0x1FB0, 0, 0x0804927C }, - { 0x1FB1, 0, 0x080492C8 }, { 0x1FB2, 0, 0x08049318 }, { 0x1FB3, 0, 0x08049384 }, { 0x1FB4, 0, 0x08049424 }, - { 0x1FB5, 0, 0x0804951C }, { 0x1FB6, 0, 0x08049558 }, { 0x1FB7, 0, 0x08049598 }, { 0x1FB8, 0, 0x080495B8 }, - { 0x1FB9, 0, 0x080495D0 }, { 0x1FBA, 0, 0x080495E8 }, { 0x1FBB, 0, 0x08049614 }, { 0x1FBC, 0, 0x0804963C }, - { 0x1FBD, 0, 0x08049688 }, { 0x1FBE, 0, 0x080496DC }, { 0x1FBF, 0, 0x08049758 }, { 0x1FC0, 0, 0x080497BC }, - { 0x1FC1, 0, 0x080497E4 }, { 0x1FC2, 0, 0x0804982C }, { 0x1FC3, 0, 0x080498A0 }, { 0x1FC4, 0, 0x08049920 }, - { 0x1FC5, 0, 0x08049940 }, { 0x1FC6, 0, 0x08049A0C }, { 0x1FC7, 0, 0x08049A38 }, { 0x1FC8, 0, 0x08049AA0 }, - { 0x1FC9, 0, 0x08049AB8 }, { 0x1FCA, 0, 0x08049AF0 }, { 0x1FCB, 0, 0x08049B74 }, { 0x1FCC, 0, 0x08049BD0 }, - { 0x1FCD, 0, 0x08049C34 }, { 0x1FCE, 0, 0x08049D14 }, { 0x1FCF, 0, 0x08049D70 }, { 0x1FD0, 0, 0x08049DAC }, - { 0x1FD1, 0, 0x08049E08 }, { 0x1FD2, 0, 0x08049E24 }, { 0x1FD3, 0, 0x08049E44 }, { 0x1FD4, 0, 0x08049E88 }, - { 0x1FD5, 0, 0x08049EB8 }, { 0x1FD6, 0, 0x08049F00 }, { 0x1FD7, 0, 0x08049F3C }, { 0x1FD8, 0, 0x08049F90 }, - { 0x1FD9, 0, 0x08049FC4 }, { 0x1FDA, 0, 0x0804A018 }, { 0x1FDB, 0, 0x0804A050 }, { 0x1FDC, 0, 0x0804A0BC }, - { 0x1FDD, 0, 0x0804A0F0 }, { 0x1FDE, 0, 0x0804A11C }, { 0x1FDF, 0, 0x0804A14C }, { 0x1FE0, 0, 0x0804A1A0 }, - { 0x1FE1, 0, 0x0804A1D4 }, { 0x1FE2, 0, 0x0804A210 }, { 0x1FE3, 0, 0x0804A244 }, { 0x1FE4, 0, 0x0804A290 }, - { 0x1FE5, 0, 0x0804A2C8 }, { 0x1FE6, 0, 0x0804A334 }, { 0x1FE7, 0, 0x0804A36C }, { 0x1FE8, 0, 0x0804A3EC }, - { 0x1FE9, 0, 0x0804A420 }, { 0x1FEA, 0, 0x0804A484 }, { 0x1FEB, 0, 0x0804A4B8 }, { 0x1FEC, 0, 0x0804A51C }, - { 0x1FED, 0, 0x0804A554 }, { 0x1FEE, 0, 0x0804A59C }, { 0x1FEF, 0, 0x0804A5D0 }, { 0x1FF0, 0, 0x0804A620 }, - { 0x1FF1, 0, 0x0804A658 }, { 0x1FF2, 0, 0x0804A6C0 }, { 0x1FF3, 0, 0x0804A6F4 }, { 0x1FF4, 0, 0x0804A74C }, - { 0x1FF5, 0, 0x0804A788 }, { 0x1FF6, 0, 0x0804A800 }, { 0x1FF7, 0, 0x0804A834 }, { 0x1FF8, 0, 0x0804A888 }, - { 0x1FF9, 0, 0x0804A8B8 }, { 0x1FFA, 0, 0x0804A908 }, { 0x1FFB, 0, 0x0804A940 }, { 0x1FFC, 0, 0x0804A970 }, - { 0x1FFD, 0, 0x0804A9A4 }, { 0x1FFE, 0, 0x0804AA00 }, { 0x1FFF, 0, 0x0804AA60 }, { 0x2000, 0, 0x0804AAA0 }, - { 0x2001, 0, 0x0804AACC }, { 0x2002, 0, 0x0804AB00 }, { 0x2003, 0, 0x0804AB60 }, { 0x2004, 0, 0x0804ABA0 }, - { 0x2005, 0, 0x0804ACE0 }, { 0x2006, 0, 0x0804ADB4 }, { 0x2007, 0, 0x0804AE8C }, { 0x2008, 0, 0x0804AEE0 }, - { 0x2009, 0, 0x0804AEF8 }, { 0x200A, 0, 0x0804AF10 }, { 0x200B, 0, 0x0804AFAC }, { 0x200C, 0, 0x0804B024 }, - { 0x200D, 0, 0x0804B058 }, { 0x200E, 0, 0x0804B0D0 }, { 0x200F, 0, 0x0804B144 }, { 0x2010, 0, 0x0804B168 }, - { 0x2011, 0, 0x0804B1B4 }, { 0x2012, 0, 0x0804B1F8 }, { 0x2013, 0, 0x0804B260 }, { 0x2014, 0, 0x0804B298 }, - { 0x2015, 0, 0x0804B300 }, { 0x2016, 0, 0x0804B338 }, { 0x2017, 0, 0x0804B350 }, { 0x201D, 0, 0x0804B3B0 }, - { 0x201E, 0, 0x0804B3F8 }, { 0x201F, 0, 0x0804B508 }, { 0x2020, 0, 0x0804B58C }, { 0x2021, 0, 0x0804B5F8 }, - { 0x2022, 0, 0x0804B68C }, { 0x2023, 0, 0x0804B6E4 }, { 0x2024, 0, 0x0804B6F0 }, { 0x2026, 0, 0x0804B6FC }, - { 0x2027, 0, 0x0804B71C }, { 0x2028, 0, 0x0804B744 }, { 0x2029, 0, 0x0804B758 }, { 0x202A, 0, 0x0804B770 }, - { 0x202B, 0, 0x0804B7C4 }, { 0x202C, 0, 0x0804B81C }, { 0x202D, 0, 0x0804B860 }, { 0x202E, 0, 0x0804B8A8 }, - { 0x202F, 0, 0x0804B908 }, { 0x2030, 0, 0x0804B93C }, { 0x2031, 0, 0x0804B9B8 }, { 0x2032, 0, 0x0804BA20 }, - { 0x2033, 0, 0x0804BA9C }, { 0x2034, 0, 0x0804BAEC }, { 0x2035, 0, 0x0804BB34 }, { 0x2036, 0, 0x0804BB7C }, - { 0x2037, 0, 0x0804BBAC }, { 0x2038, 0, 0x0804BBDC }, { 0x2039, 0, 0x0804BC20 }, { 0x203A, 0, 0x0804BC98 }, - { 0x203B, 0, 0x0804BCF0 }, { 0x203C, 0, 0x0804BD40 }, { 0x203D, 0, 0x0804BD5C }, { 0x203E, 0, 0x0804BDAC }, - { 0x203F, 0, 0x0804BE24 }, { 0x2040, 0, 0x0804BE4C }, { 0x2041, 0, 0x0804BEB8 }, { 0x2042, 0, 0x0804BEEC }, - { 0x2043, 0, 0x0804BF08 }, { 0x2044, 0, 0x0804BF38 }, { 0x2045, 0, 0x0804BF74 }, { 0x2046, 0, 0x0804BFB4 }, - { 0x2047, 0, 0x0804C028 }, { 0x2048, 0, 0x0804C08C }, { 0x2049, 0, 0x0804C0BC }, { 0x204A, 0, 0x0804C0D8 }, - { 0x204B, 0, 0x0804C114 }, { 0x204C, 0, 0x0804C144 }, { 0x204D, 0, 0x0804C180 }, { 0x204E, 0, 0x0804C204 }, - { 0x206C, 0, 0x0804C264 }, { 0x206D, 0, 0x0804C2A8 }, { 0x206E, 0, 0x0804C2F8 }, { 0x206F, 0, 0x0804C338 }, - { 0x2070, 0, 0x0804C384 }, { 0x2076, 0, 0x0804C390 }, { 0x2077, 0, 0x0804C3C0 }, { 0x2078, 0, 0x0804C404 }, - { 0x2079, 0, 0x0804C480 }, { 0x2080, 0, 0x0804C4C4 }, { 0x2081, 0, 0x0804C5B4 }, { 0x2082, 0, 0x0804C5FC }, - { 0x2083, 0, 0x0804C630 }, { 0x208A, 0, 0x0804C674 }, { 0x208B, 0, 0x0804C6BC }, { 0x208C, 0, 0x0804C708 }, - { 0x208D, 0, 0x0804C7B4 }, { 0x208E, 0, 0x0804C7FC }, { 0x2093, 0, 0x0804C8A4 }, { 0x2094, 0, 0x0804C8C0 }, - { 0x2095, 0, 0x0804C8E8 }, { 0x20B0, 0, 0x0804C920 }, { 0x20B1, 0, 0x0804C984 }, { 0x20B2, 0, 0x0804CA38 }, - { 0x20B3, 0, 0x0804CB34 }, { 0x20B4, 0, 0x0804CC18 }, { 0x20B5, 0, 0x0804CD10 }, { 0x20B6, 0, 0x0804CDD4 }, - { 0x20B7, 0, 0x0804CE8C }, { 0x20B8, 0, 0x0804CF48 }, { 0x20B9, 0, 0x0804CFA4 }, { 0x20BA, 0, 0x0804D018 }, - { 0x20BB, 0, 0x0804D084 }, { 0x20BC, 0, 0x0804D0EC }, { 0x20BD, 0, 0x0804D158 }, { 0x20BE, 0, 0x0804D1C0 }, - { 0x20BF, 0, 0x0804D230 }, { 0x20C0, 0, 0x0804D294 }, { 0x20C1, 0, 0x0804D300 }, { 0x20C2, 0, 0x0804D380 }, - { 0x20C3, 0, 0x0804D3F8 }, { 0x20C4, 0, 0x0804D460 }, { 0x20C5, 0, 0x0804D4AC }, { 0x20C6, 0, 0x0804D52C }, - { 0x20C7, 0, 0x0804D590 }, { 0x20D0, 0, 0x0804D5FC }, { 0x20D1, 0, 0x0804D654 }, { 0x20D2, 0, 0x0804D6C8 }, - { 0x20D4, 0, 0x0804D6EC }, { 0x20D5, 0, 0x0804D75C }, { 0x20D6, 0, 0x0804D7B4 }, { 0x20D7, 0, 0x0804D834 }, - { 0x20D8, 0, 0x0804D8B0 }, { 0x20D9, 0, 0x0804D93C }, { 0x20DA, 0, 0x0804D99C }, { 0x20DB, 0, 0x0804D9FC }, - { 0x20DC, 0, 0x0804DA74 }, { 0x20DD, 0, 0x0804DB20 }, { 0x20DE, 0, 0x0804DBB0 }, { 0x20DF, 0, 0x0804DC18 }, - { 0x20E0, 0, 0x0804DC90 }, { 0x20E1, 0, 0x0804DCFC }, { 0x20E2, 0, 0x0804DD84 }, { 0x20E3, 0, 0x0804DE0C }, - { 0x20E4, 0, 0x0804DEA0 }, { 0x20E5, 0, 0x0804DF10 }, { 0x20E6, 0, 0x0804DF78 }, { 0x20E7, 0, 0x0804DFEC }, - { 0x20F3, 0, 0x0804E05C }, { 0x20F7, 0, 0x0804E0C0 }, { 0x20F8, 0, 0x0804E134 }, { 0x20F9, 0, 0x0804E1AC }, - { 0x2103, 0, 0x0804E220 }, { 0x2104, 0, 0x0804E288 }, { 0x2105, 0, 0x0804E2CC }, { 0x2106, 0, 0x0804E320 }, - { 0x2107, 0, 0x0804E364 }, { 0x2108, 0, 0x0804E3BC }, { 0x2109, 0, 0x0804E408 }, { 0x210A, 0, 0x0804E458 }, - { 0x210B, 0, 0x0804E4B0 }, { 0x210C, 0, 0x0804E4EC }, { 0x210D, 0, 0x0804E52C }, { 0x210E, 0, 0x0804E578 }, - { 0x210F, 0, 0x0804E5D0 }, { 0x2110, 0, 0x0804E618 }, { 0x2111, 0, 0x0804E660 }, { 0x2112, 0, 0x0804E6BC }, - { 0x2113, 0, 0x0804E70C }, { 0x2114, 0, 0x0804E75C }, { 0x2115, 0, 0x0804E7A8 }, { 0x2116, 0, 0x0804E7F0 }, - { 0x2134, 0, 0x0804E83C }, { 0x2135, 0, 0x0804E880 }, { 0x2136, 0, 0x0804E8CC }, { 0x2137, 0, 0x0804E91C }, - { 0x2138, 0, 0x0804E96C }, { 0x2139, 0, 0x0804E9B4 }, { 0x213A, 0, 0x0804E9FC }, { 0x213B, 0, 0x0804EA38 }, - { 0x213C, 0, 0x0804EA88 }, { 0x213D, 0, 0x0804EAD0 }, { 0x213E, 0, 0x0804EB28 }, { 0x213F, 0, 0x0804EB80 }, - { 0x2140, 0, 0x0804EBD0 }, { 0x2141, 0, 0x0804EC1C }, { 0x2142, 0, 0x0804EC60 }, { 0x2143, 0, 0x0804ECAC }, - { 0x2144, 0, 0x0804ECF0 }, { 0x2145, 0, 0x0804ED40 }, { 0x2146, 0, 0x0804ED88 }, { 0x2147, 0, 0x0804EDDC }, - { 0x2152, 0, 0x0804EE34 }, { 0x2153, 0, 0x0804EE78 }, { 0x2154, 0, 0x0804EECC }, { 0x2156, 0, 0x0804EF1C }, - { 0x2157, 0, 0x0804EF64 }, { 0x2158, 0, 0x0804EFC4 }, { 0x2159, 0, 0x0804F014 }, { 0x215A, 0, 0x0804F05C }, - { 0x215B, 0, 0x0804F0C0 }, { 0x215D, 0, 0x0804F124 }, { 0x215E, 0, 0x0804F178 }, { 0x215F, 0, 0x0804F184 }, - { 0x2160, 0, 0x0804F1D8 }, { 0x2161, 0, 0x0804F234 }, { 0x2162, 0, 0x0804F298 }, { 0x2163, 0, 0x0804F2A4 }, - { 0x2164, 0, 0x0804F2F8 }, { 0x2165, 0, 0x0804F358 }, { 0x2166, 0, 0x0804F3B0 }, { 0x2167, 0, 0x0804F400 }, - { 0x2168, 0, 0x0804F458 }, { 0x2169, 0, 0x0804F4B0 }, { 0x216A, 0, 0x0804F504 }, { 0x216B, 0, 0x0804F554 }, - { 0x216C, 0, 0x0804F5A0 }, { 0x216D, 0, 0x0804F5F8 }, { 0x216E, 0, 0x0804F658 }, { 0x216F, 0, 0x0804F6B8 }, - { 0x2170, 0, 0x0804F710 }, { 0x2171, 0, 0x0804F764 }, { 0x2172, 0, 0x0804F7BC }, { 0x2173, 0, 0x0804F814 }, - { 0x2174, 0, 0x0804F870 }, { 0x2198, 0, 0x0804F8CC }, { 0x2199, 0, 0x0804F920 }, { 0x219A, 0, 0x0804F978 }, - { 0x219B, 0, 0x0804F9D0 }, { 0x219C, 0, 0x0804FA2C }, { 0x219D, 0, 0x0804FA80 }, { 0x219E, 0, 0x0804FAD0 }, - { 0x219F, 0, 0x0804FB28 }, { 0x21A0, 0, 0x0804FB80 }, { 0x21A1, 0, 0x0804FBD8 }, { 0x21A2, 0, 0x0804FC30 }, - { 0x21A3, 0, 0x0804FC88 }, { 0x21A4, 0, 0x0804FCD8 }, { 0x21A5, 0, 0x0804FD30 }, { 0x21A6, 0, 0x0804FD84 }, - { 0x21A7, 0, 0x0804FDDC }, { 0x21A8, 0, 0x0804FE34 }, { 0x21A9, 0, 0x0804FE88 }, { 0x21AA, 0, 0x0804FED8 }, - { 0x21AB, 0, 0x0804FF30 }, { 0x21AC, 0, 0x0804FF84 }, { 0x21AD, 0, 0x0804FFDC }, { 0x21AE, 0, 0x08050038 }, - { 0x21AF, 0, 0x08050094 }, { 0x21B0, 0, 0x080500EC }, { 0x21B1, 0, 0x08050140 }, { 0x21B2, 0, 0x08050198 }, - { 0x21B3, 0, 0x080501F4 }, { 0x21B4, 0, 0x0805024C }, { 0x21B5, 0, 0x080502A4 }, { 0x21B6, 0, 0x080502F8 }, - { 0x21B7, 0, 0x08050350 }, { 0x21B8, 0, 0x080503A8 }, { 0x21B9, 0, 0x08050400 }, { 0x21BA, 0, 0x0805045C }, - { 0x21CA, 0, 0x080504AC }, { 0x21CB, 0, 0x080504EC }, { 0x21CC, 0, 0x08050528 }, { 0x21CD, 0, 0x08050580 }, - { 0x21CE, 0, 0x080505C8 }, { 0x21CF, 0, 0x08050604 }, { 0x21D0, 0, 0x08050648 }, { 0x21D1, 0, 0x08050680 }, - { 0x21D2, 0, 0x080506CC }, { 0x21D3, 0, 0x08050700 }, { 0x21D4, 0, 0x0805075C }, { 0x21D5, 0, 0x080507A8 }, - { 0x21D6, 0, 0x080507F0 }, { 0x21D7, 0, 0x08050840 }, { 0x21D8, 0, 0x08050884 }, { 0x21D9, 0, 0x080508CC }, - { 0x21DA, 0, 0x08050910 }, { 0x21DB, 0, 0x0805094C }, { 0x21DC, 0, 0x08050998 }, { 0x21DD, 0, 0x080509D0 }, - { 0x21FC, 0, 0x08050A20 }, { 0x21FD, 0, 0x08050A50 }, { 0x21FE, 0, 0x08050A74 }, { 0x21FF, 0, 0x08050ABC }, - { 0x2200, 0, 0x08050ADC }, { 0x2201, 0, 0x08050AF0 }, { 0x2202, 0, 0x08050B0C }, { 0x2203, 0, 0x08050B44 }, - { 0x2204, 0, 0x08050B74 }, { 0x2205, 0, 0x08050B98 }, { 0x2206, 0, 0x08050BCC }, { 0x2207, 0, 0x08050BF8 }, - { 0x2208, 0, 0x08050C48 }, { 0x2209, 0, 0x08050CB0 }, { 0x220A, 0, 0x08050CC4 }, { 0x220B, 0, 0x08050CE0 }, - { 0x220C, 0, 0x08050D10 }, { 0x220D, 0, 0x08050D44 }, { 0x220E, 0, 0x08050D98 }, { 0x220F, 0, 0x08050DE0 }, - { 0x2210, 0, 0x08050E24 }, { 0x2211, 0, 0x08050E44 }, { 0x2212, 0, 0x08050E78 }, { 0x2213, 0, 0x08050E8C }, - { 0x2214, 0, 0x08050ECC }, { 0x2215, 0, 0x08050F14 }, { 0x2216, 0, 0x08050F44 }, { 0x2217, 0, 0x08050F6C }, - { 0x2218, 0, 0x08050FB4 }, { 0x2219, 0, 0x08050FDC }, { 0x221A, 0, 0x0805100C }, { 0x221B, 0, 0x08051034 }, - { 0x221C, 0, 0x08051054 }, { 0x221D, 0, 0x08051080 }, { 0x221E, 0, 0x080510A0 }, { 0x221F, 0, 0x080510DC }, - { 0x2220, 0, 0x08051104 }, { 0x2221, 0, 0x08051138 }, { 0x2222, 0, 0x0805114C }, { 0x2223, 0, 0x0805117C }, - { 0x2224, 0, 0x080511A8 }, { 0x2225, 0, 0x080511E4 }, { 0x2226, 0, 0x0805122C }, { 0x2227, 0, 0x08051258 }, - { 0x2228, 0, 0x080512AC }, { 0x2229, 0, 0x080512D8 }, { 0x222A, 0, 0x08051338 }, { 0x222B, 0, 0x08051374 }, - { 0x2328, 0, 0x080513C4 }, { 0x2329, 0, 0x08051410 }, { 0x232A, 0, 0x08051454 }, { 0x232B, 0, 0x080514B4 }, - { 0x232C, 0, 0x08051514 }, { 0x232D, 0, 0x08051564 }, { 0x232E, 0, 0x080515A8 }, { 0x232F, 0, 0x080515E4 }, - { 0x2330, 0, 0x08051630 }, { 0x2331, 0, 0x08051680 }, { 0x2332, 0, 0x08051700 }, { 0x2333, 0, 0x08051750 }, - { 0x2334, 0, 0x080517AC }, { 0x2335, 0, 0x08051814 }, { 0x2336, 0, 0x08051868 }, { 0x2337, 0, 0x080518C8 }, - { 0x2338, 0, 0x08051914 }, { 0x2339, 0, 0x08051948 }, { 0x233A, 0, 0x080519A4 }, { 0x233B, 0, 0x080519D8 }, - { 0x233C, 0, 0x08051A10 }, { 0x233D, 0, 0x08051A70 }, { 0x233E, 0, 0x08051AA4 }, { 0x233F, 0, 0x08051ADC }, - { 0x2340, 0, 0x08051B10 }, { 0x2341, 0, 0x08051B54 }, { 0x2342, 0, 0x08051BC8 }, { 0x2343, 0, 0x08051C38 }, - { 0x2344, 0, 0x08051C70 }, { 0x2345, 0, 0x08051CC0 }, { 0x2346, 0, 0x08051CFC }, { 0x2347, 0, 0x08051D24 }, - { 0x2348, 0, 0x08051DA4 }, { 0x2349, 0, 0x08051DE4 }, { 0x234A, 0, 0x08051E44 }, { 0x234B, 0, 0x08051E84 }, - { 0x234C, 0, 0x08051EA4 }, { 0x234D, 0, 0x08051EC4 }, { 0x234E, 0, 0x08051F04 }, { 0x234F, 0, 0x08051F30 }, - { 0x2350, 0, 0x08051F48 }, { 0x2351, 0, 0x08051F7C }, { 0x2352, 0, 0x08051FA8 }, { 0x2353, 0, 0x08051FC0 }, - { 0x2354, 0, 0x08051FE4 }, { 0x2355, 0, 0x08052004 }, { 0x2356, 0, 0x08052020 }, { 0x2357, 0, 0x08052048 }, - { 0x2358, 0, 0x080520AC }, { 0x2359, 0, 0x080520DC }, { 0x235A, 0, 0x08052104 }, { 0x235B, 0, 0x08052138 }, - { 0x235C, 0, 0x0805215C }, { 0x235D, 0, 0x08052188 }, { 0x235E, 0, 0x080522B4 }, { 0x235F, 0, 0x080522DC }, - { 0x2360, 0, 0x08052334 }, { 0x2361, 0, 0x080523A8 }, { 0x2362, 0, 0x08052400 }, { 0x2363, 0, 0x08052450 }, - { 0x2364, 0, 0x0805250C }, { 0x2365, 0, 0x08052644 }, { 0x2366, 0, 0x080526C0 }, { 0x2367, 0, 0x08052718 }, - { 0x2368, 0, 0x080527E4 }, { 0x2369, 0, 0x080528E0 }, { 0x236A, 0, 0x08052930 }, { 0x236B, 0, 0x08052A04 }, - { 0x236C, 0, 0x08052A40 }, { 0x236D, 0, 0x08052A8C }, { 0x236E, 0, 0x08052ABC }, { 0x236F, 0, 0x08052AD8 }, - { 0x2370, 0, 0x08052B34 }, { 0x2371, 0, 0x08052B64 }, { 0x2372, 0, 0x08052BE0 }, { 0x2373, 0, 0x08052BF8 }, - { 0x2374, 0, 0x08052C3C }, { 0x2375, 0, 0x08052C80 }, { 0x2376, 0, 0x08052CE4 }, { 0x2377, 0, 0x08052D08 }, - { 0x2378, 0, 0x08052D54 }, { 0x2710, 0, 0x08052D8C }, { 0x2711, 0, 0x08052E54 }, { 0x2712, 0, 0x08052EA4 }, - { 0x2713, 0, 0x08053008 }, { 0x2714, 0, 0x0805305C }, { 0x2715, 0, 0x080531A0 }, { 0x2716, 0, 0x08053220 }, - { 0x2717, 0, 0x08053284 }, { 0x2718, 0, 0x080532BC }, { 0x2719, 0, 0x08053300 }, { 0x271A, 0, 0x0805332C }, - { 0x271B, 0, 0x08053424 }, { 0x271C, 0, 0x080534AC }, { 0x271D, 0, 0x08053524 }, { 0x271E, 0, 0x0805358C }, - { 0x271F, 0, 0x08053608 }, { 0x2720, 0, 0x0805367C }, { 0x2721, 0, 0x08053718 }, { 0x2722, 0, 0x0805374C }, - { 0x2723, 0, 0x080537A8 }, { 0x2724, 0, 0x080537F4 }, { 0x2725, 0, 0x08053850 }, { 0x2726, 0, 0x080538A8 }, - { 0x2727, 0, 0x08053914 }, { 0x2728, 0, 0x08053974 }, { 0x2729, 0, 0x08053A34 }, { 0x272A, 0, 0x08053A4C }, - { 0x272B, 0, 0x08053A90 }, { 0x272C, 0, 0x08053AB0 }, { 0x272D, 0, 0x08053AF4 }, { 0x272E, 0, 0x08053B3C }, - { 0x272F, 0, 0x08053B9C }, { 0x2730, 0, 0x08053BCC }, { 0x2731, 0, 0x08053C04 }, { 0x2732, 0, 0x08053C70 }, - { 0x2733, 0, 0x08053CD8 }, { 0x2734, 0, 0x08053D4C }, { 0x2735, 0, 0x08053DD4 }, { 0x2736, 0, 0x08053E48 }, - { 0x2737, 0, 0x08053EA8 }, { 0x2738, 0, 0x08053F9C }, { 0x2739, 0, 0x08054038 }, { 0x273A, 0, 0x080540A0 }, - { 0x273B, 0, 0x0805411C }, { 0x273C, 0, 0x08054188 }, { 0x273D, 0, 0x080541D0 }, { 0x273E, 0, 0x08054278 }, - { 0x273F, 0, 0x080542A0 }, { 0x2740, 0, 0x0805432C }, { 0x2741, 0, 0x080543CC }, { 0x2742, 0, 0x08054478 }, - { 0x2743, 0, 0x080544F8 }, { 0x2744, 0, 0x08054580 }, { 0x2745, 0, 0x08054630 }, { 0x2746, 0, 0x08054674 }, - { 0x2747, 0, 0x080546C4 }, { 0x2748, 0, 0x08054784 }, { 0x2749, 0, 0x080547EC }, { 0x274A, 0, 0x0805483C }, - { 0x274B, 0, 0x0805489C }, { 0x274C, 0, 0x08054924 }, { 0x274D, 0, 0x0805494C }, { 0x274E, 0, 0x080549E0 }, - { 0x274F, 0, 0x08054A90 }, { 0x2774, 0, 0x08054B24 }, { 0x2775, 0, 0x08054B7C }, { 0x2776, 0, 0x08054C30 }, - { 0x2777, 0, 0x08054C3C }, { 0x2778, 0, 0x08054CD0 }, { 0x2779, 0, 0x08054CDC }, { 0x277A, 0, 0x08054D00 }, - { 0x277B, 0, 0x08054DA4 }, { 0x277C, 0, 0x08054EC8 }, { 0x277D, 0, 0x08054F54 }, { 0x277E, 0, 0x08054FA0 }, - { 0x277F, 0, 0x08055004 }, { 0x2780, 0, 0x0805503C }, { 0x2781, 0, 0x080550B0 }, { 0x2782, 0, 0x08055110 }, - { 0x2783, 0, 0x08055138 }, { 0x2784, 0, 0x08055160 }, { 0x2785, 0, 0x08055194 }, { 0x2786, 0, 0x080551E0 }, - { 0x2787, 0, 0x08055224 }, { 0x2788, 0, 0x08055264 }, { 0x2789, 0, 0x080552A8 }, { 0x278A, 0, 0x080552E8 }, - { 0x278B, 0, 0x08055310 }, { 0x278C, 0, 0x0805535C }, { 0x278D, 0, 0x080553E0 }, { 0x278E, 0, 0x08055424 }, - { 0x278F, 0, 0x08055448 }, { 0x2790, 0, 0x08055470 }, { 0x2791, 0, 0x080554F0 }, { 0x2792, 0, 0x08055510 }, - { 0x2793, 0, 0x08055534 }, { 0x2794, 0, 0x080555BC }, { 0x2795, 0, 0x080555FC }, { 0x2796, 0, 0x0805565C }, - { 0x2797, 0, 0x08055688 }, { 0x2798, 0, 0x080556CC }, { 0x2799, 0, 0x08055700 }, { 0x279A, 0, 0x0805573C }, - { 0x279B, 0, 0x0805576C }, { 0x279C, 0, 0x080557B0 }, { 0x279D, 0, 0x08055804 }, { 0x279E, 0, 0x08055858 }, - { 0x279F, 0, 0x080558DC }, { 0x27A0, 0, 0x0805591C }, { 0x27A1, 0, 0x08055984 }, { 0x27A2, 0, 0x080559C0 }, - { 0x27A3, 0, 0x08055A10 }, { 0x27A4, 0, 0x08055A38 }, { 0x27A5, 0, 0x08055AB0 }, { 0x27A6, 0, 0x08055AE8 }, - { 0x27A7, 0, 0x08055B1C }, { 0x27A8, 0, 0x08055B60 }, { 0x27A9, 0, 0x08055BA8 }, { 0x27AA, 0, 0x08055BC0 }, - { 0x27AB, 0, 0x08055C10 }, { 0x27AC, 0, 0x08055C34 }, { 0x27AD, 0, 0x08055CAC }, { 0x27AE, 0, 0x08055CC4 }, - { 0x27D8, 0, 0x08055D0C }, { 0x27D9, 0, 0x08055D50 }, { 0x27DA, 0, 0x08055D94 }, { 0x27DB, 0, 0x08055DCC }, - { 0x27DC, 0, 0x08055E10 }, { 0x27DD, 0, 0x08055E50 }, { 0x27DE, 0, 0x08055ED0 }, { 0x27DF, 0, 0x08055F14 }, - { 0x27E0, 0, 0x08055F70 }, { 0x27E1, 0, 0x08056000 }, { 0x27E2, 0, 0x0805609C }, { 0x27E3, 0, 0x080560DC }, - { 0x27E4, 0, 0x080560F8 }, { 0x27E5, 0, 0x08056128 }, { 0x27E6, 0, 0x08056170 }, { 0x27E7, 0, 0x08056220 }, - { 0x27E8, 0, 0x0805627C }, { 0x27E9, 0, 0x080562D8 }, { 0x27EA, 0, 0x08056334 }, { 0x27EB, 0, 0x0805635C }, - { 0x27EC, 0, 0x080563B0 }, { 0x27ED, 0, 0x080563D8 }, { 0x27EE, 0, 0x0805643C }, { 0x27EF, 0, 0x08056468 }, - { 0x27F0, 0, 0x08056488 }, { 0x27F1, 0, 0x080564AC }, { 0x27F2, 0, 0x080564F4 }, { 0x27F3, 0, 0x0805653C }, - { 0x27F4, 0, 0x08056570 }, { 0x27F5, 0, 0x0805662C }, { 0x27F6, 0, 0x0805668C }, { 0x27F7, 0, 0x080566B0 }, - { 0x27F8, 0, 0x080566E4 }, { 0x27F9, 0, 0x08056708 }, { 0x27FA, 0, 0x08056734 }, { 0x283C, 0, 0x0805678C }, - { 0x283D, 0, 0x080567C4 }, { 0x2841, 0, 0x080567FC }, { 0x2842, 0, 0x08056840 }, { 0x2843, 0, 0x08056878 }, - { 0x2844, 0, 0x080568E0 }, { 0x2845, 0, 0x0805696C }, { 0x2846, 0, 0x080569BC }, { 0x2847, 0, 0x08056A18 }, - { 0x2848, 0, 0x08056A54 }, { 0x2849, 0, 0x08056AB0 }, { 0x284A, 0, 0x08056AF4 }, { 0x284B, 0, 0x08056B38 }, - { 0x284C, 0, 0x08056B88 }, { 0x284D, 0, 0x08056BCC }, { 0x284E, 0, 0x08056C2C }, { 0x284F, 0, 0x08056C7C }, - { 0x2850, 0, 0x08056CA8 }, { 0x2851, 0, 0x08056CF8 }, { 0x2852, 0, 0x08056D24 }, { 0x2853, 0, 0x08056D68 }, - { 0x2854, 0, 0x08056DC0 }, { 0x2855, 0, 0x08056E04 }, { 0x2856, 0, 0x08056E50 }, { 0x2857, 0, 0x08056E98 }, - { 0x2858, 0, 0x08056EFC }, { 0x2859, 0, 0x08056F44 }, { 0x285A, 0, 0x08056FA8 }, { 0x285B, 0, 0x08056FE8 }, - { 0x285C, 0, 0x08057014 }, { 0x285D, 0, 0x0805705C }, { 0x285E, 0, 0x08057088 }, { 0x285F, 0, 0x080570C8 }, - { 0x2860, 0, 0x080570FC }, { 0x2861, 0, 0x08057114 }, { 0x2862, 0, 0x08057174 }, { 0x2863, 0, 0x080571C0 }, - { 0x2864, 0, 0x0805722C }, { 0x2865, 0, 0x08057278 }, { 0x2866, 0, 0x080572E4 }, { 0x2867, 0, 0x08057328 }, - { 0x2868, 0, 0x08057358 }, { 0x2869, 0, 0x080573A4 }, { 0x286A, 0, 0x08057410 }, { 0x286B, 0, 0x08057454 }, - { 0x286C, 0, 0x08057484 }, { 0x286D, 0, 0x080574D0 }, { 0x286E, 0, 0x080574F8 }, { 0x286F, 0, 0x0805753C }, - { 0x2870, 0, 0x080575A8 }, { 0x2871, 0, 0x080575E4 }, { 0x2872, 0, 0x08057628 }, { 0x2873, 0, 0x0805765C }, - { 0x2874, 0, 0x080576B4 }, { 0x2875, 0, 0x080576D0 }, { 0x2876, 0, 0x08057728 }, { 0x2877, 0, 0x0805777C }, - { 0x2878, 0, 0x080577D4 }, { 0x2879, 0, 0x08057828 }, { 0x287A, 0, 0x08057890 }, { 0x287B, 0, 0x08057900 }, - { 0x287C, 0, 0x08057968 }, { 0x287D, 0, 0x080579B8 }, { 0x287E, 0, 0x080579E8 }, { 0x287F, 0, 0x08057A5C }, - { 0x2880, 0, 0x08057AA8 }, { 0x2881, 0, 0x08057B24 }, { 0x2882, 0, 0x08057B5C }, { 0x2883, 0, 0x08057B94 }, - { 0x2884, 0, 0x08057BC8 }, { 0x2885, 0, 0x08057BE0 }, { 0x2886, 0, 0x08057BF8 }, { 0x2887, 0, 0x08057C24 }, - { 0x2888, 0, 0x08057C5C }, { 0x2889, 0, 0x08057C88 }, { 0x288A, 0, 0x08057CB4 }, { 0x288B, 0, 0x08057CD4 }, - { 0x28A0, 0, 0x08057CF0 }, { 0x28A1, 0, 0x08057D20 }, { 0x28A2, 0, 0x08057D5C }, { 0x28A3, 0, 0x08057D94 }, - { 0x28A4, 0, 0x08057E80 }, { 0x28A5, 0, 0x08057F64 }, { 0x28A6, 0, 0x08057FA8 }, { 0x28A7, 0, 0x08058080 }, - { 0x28A8, 0, 0x080580B4 }, { 0x28A9, 0, 0x080580F4 }, { 0x28AA, 0, 0x08058130 }, { 0x28AB, 0, 0x08058160 }, - { 0x28AC, 0, 0x080581EC }, { 0x28AD, 0, 0x080582C0 }, { 0x28AF, 0, 0x080582DC }, { 0x28B0, 0, 0x080582F8 }, - { 0x28B1, 0, 0x08058340 }, { 0x28B2, 0, 0x080583A8 }, { 0x28B3, 0, 0x08058400 }, { 0x28B4, 0, 0x08058488 }, - { 0x28B5, 0, 0x080584E8 }, { 0x28B6, 0, 0x08058524 }, { 0x28B7, 0, 0x08058594 }, { 0x28B8, 0, 0x080585F4 }, - { 0x28B9, 0, 0x08058618 }, { 0x28BA, 0, 0x0805864C }, { 0x28BB, 0, 0x08058688 }, { 0x28BC, 0, 0x080586B8 }, - { 0x28BD, 0, 0x080586F8 }, { 0x28BE, 0, 0x0805871C }, { 0x28BF, 0, 0x08058760 }, { 0x28C0, 0, 0x0805878C }, - { 0x28C1, 0, 0x080587B4 }, { 0x28C2, 0, 0x0805881C }, { 0x28C3, 0, 0x08058880 }, { 0x28C4, 0, 0x080589EC }, - { 0x28C5, 0, 0x08058A60 }, { 0x28C6, 0, 0x08058A78 }, { 0x28C7, 0, 0x08058AC0 }, { 0x28C8, 0, 0x08058AF4 }, - { 0x28C9, 0, 0x08058B54 }, { 0x28CA, 0, 0x08058B9C }, { 0x28CB, 0, 0x08058BD4 }, { 0x28CC, 0, 0x08058C24 }, - { 0x28CD, 0, 0x08058C58 }, { 0x28CE, 0, 0x08058C6C }, { 0x28CF, 0, 0x08058C88 }, { 0x28D0, 0, 0x08058CCC }, - { 0x28D1, 0, 0x08058D1C }, { 0x28D2, 0, 0x08058D4C }, { 0x28D3, 0, 0x08058DA0 }, { 0x28D4, 0, 0x08058DF0 }, - { 0x28D5, 0, 0x08058E4C }, { 0x28D6, 0, 0x08058EE8 }, { 0x28D7, 0, 0x08058F10 }, { 0x28D8, 0, 0x08058F60 }, - { 0x28D9, 0, 0x0805901C }, { 0x28DA, 0, 0x08059030 }, { 0x28DB, 0, 0x08059154 }, { 0x28DC, 0, 0x08059184 }, - { 0x28DE, 0, 0x080591A8 }, { 0x28DF, 0, 0x080591E4 }, { 0x28E0, 0, 0x08059220 }, { 0x28E1, 0, 0x08059260 }, - { 0x28E2, 0, 0x080592C8 }, { 0x28E3, 0, 0x0805931C }, { 0x28E4, 0, 0x08059378 }, { 0x28E5, 0, 0x080593A4 }, - { 0x28E6, 0, 0x080593B8 }, { 0x28E7, 0, 0x080593FC }, { 0x28E8, 0, 0x08059420 }, { 0x28E9, 0, 0x0805945C }, - { 0x28EA, 0, 0x08059480 }, { 0x28EB, 0, 0x080594D4 }, { 0x28EC, 0, 0x08059564 }, { 0x28ED, 0, 0x080595B8 }, - { 0x28EE, 0, 0x080595F8 }, { 0x28EF, 0, 0x08059640 }, { 0x28F0, 0, 0x080596F8 }, { 0x28F1, 0, 0x08059754 }, - { 0x28F2, 0, 0x080597D4 }, { 0x28F3, 0, 0x08059814 }, { 0x28F4, 0, 0x080599B0 }, { 0x28F5, 0, 0x080599F8 }, - { 0x28F6, 0, 0x08059AC0 }, { 0x28F7, 0, 0x08059AEC }, { 0x28F8, 0, 0x08059B70 }, { 0x28F9, 0, 0x08059BDC }, - { 0x28FA, 0, 0x08059C00 }, { 0x28FB, 0, 0x08059C60 }, { 0x28FC, 0, 0x08059CBC }, { 0x28FD, 0, 0x08059DA0 }, - { 0x28FE, 0, 0x08059DB0 }, { 0x28FF, 0, 0x08059E2C }, { 0x2900, 0, 0x08059EC8 }, { 0x2901, 0, 0x08059EF4 }, - { 0x2902, 0, 0x08059F70 }, { 0x2903, 0, 0x08059FD0 }, { 0x2904, 0, 0x0805A04C }, { 0x2905, 0, 0x0805A24C }, - { 0x2906, 0, 0x0805A4F8 }, { 0x2907, 0, 0x0805A584 }, { 0x2908, 0, 0x0805A5C0 }, { 0x2909, 0, 0x0805A60C }, - { 0x290A, 0, 0x0805A640 }, { 0x290B, 0, 0x0805A6C8 }, { 0x290C, 0, 0x0805A9C0 }, { 0x290D, 0, 0x0805AD84 }, - { 0x290E, 0, 0x0805ADF8 }, { 0x290F, 0, 0x0805AE40 }, { 0x2910, 0, 0x0805AE74 }, { 0x2911, 0, 0x0805AF50 }, - { 0x2912, 0, 0x0805AFCC }, { 0x2913, 0, 0x0805B044 }, { 0x2914, 0, 0x0805B104 }, { 0x2915, 0, 0x0805B1F8 }, - { 0x2916, 0, 0x0805B224 }, { 0x2917, 0, 0x0805B244 }, { 0x2918, 0, 0x0805B2A0 }, { 0x2919, 0, 0x0805B2D0 }, - { 0x291A, 0, 0x0805B314 }, { 0x291B, 0, 0x0805B354 }, { 0x291C, 0, 0x0805B3B0 }, { 0x291D, 0, 0x0805B400 }, - { 0x291E, 0, 0x0805B454 }, { 0x291F, 0, 0x0805B494 }, { 0x2920, 0, 0x0805B4EC }, { 0x2921, 0, 0x0805B538 }, - { 0x2922, 0, 0x0805B58C }, { 0x2923, 0, 0x0805B600 }, { 0x2924, 0, 0x0805B65C }, { 0x2925, 0, 0x0805B738 }, - { 0x2926, 0, 0x0805B770 }, { 0x2927, 0, 0x0805B794 }, { 0x2928, 0, 0x0805B7C8 }, { 0x2929, 0, 0x0805B7EC }, - { 0x292A, 0, 0x0805B814 }, { 0x292B, 0, 0x0805B8C0 }, { 0x292C, 0, 0x0805B994 }, { 0x292D, 0, 0x0805BA44 }, - { 0x292E, 0, 0x0805BB14 }, { 0x292F, 0, 0x0805BB74 }, { 0x2930, 0, 0x0805BBEC }, { 0x2931, 0, 0x0805BC40 }, - { 0x2932, 0, 0x0805BCBC }, { 0x2933, 0, 0x0805BD3C }, { 0x2934, 0, 0x0805BDA4 }, { 0x2935, 0, 0x0805BDE0 }, - { 0x2936, 0, 0x0805BE20 }, { 0x2937, 0, 0x0805BE90 }, { 0x2938, 0, 0x0805BEE8 }, { 0x2939, 0, 0x0805BF5C }, - { 0x293A, 0, 0x0805BF80 }, { 0x293B, 0, 0x0805BFE4 }, { 0x293C, 0, 0x0805C00C }, { 0x293D, 0, 0x0805C094 }, - { 0x293E, 0, 0x0805C0EC }, { 0x293F, 0, 0x0805C168 }, { 0x2940, 0, 0x0805C1EC }, { 0x2941, 0, 0x0805C258 }, - { 0x2942, 0, 0x0805C2DC }, { 0x2943, 0, 0x0805C350 }, { 0x2944, 0, 0x0805C3B8 }, { 0x2945, 0, 0x0805C3F8 }, - { 0x2946, 0, 0x0805C44C }, { 0x2947, 0, 0x0805C470 }, { 0x2948, 0, 0x0805C4F0 }, { 0x2949, 0, 0x0805C518 }, - { 0x294A, 0, 0x0805C534 }, { 0x294B, 0, 0x0805C54C }, { 0x294C, 0, 0x0805C570 }, { 0x294D, 0, 0x0805C5A8 }, - { 0x294E, 0, 0x0805C680 }, { 0x294F, 0, 0x0805C740 }, { 0x2950, 0, 0x0805C794 }, { 0x2951, 0, 0x0805C7F4 }, - { 0x2952, 0, 0x0805C854 }, { 0x2953, 0, 0x0805C914 }, { 0x2954, 0, 0x0805C940 }, { 0x2955, 0, 0x0805C980 }, - { 0x2956, 0, 0x0805C9DC }, { 0x2957, 0, 0x0805CA08 }, { 0x2958, 0, 0x0805CA2C }, { 0x2959, 0, 0x0805CA48 }, - { 0x295A, 0, 0x0805CA6C }, { 0x295B, 0, 0x0805CAB4 }, { 0x295C, 0, 0x0805CB08 }, { 0x295D, 0, 0x0805CB24 }, - { 0x295E, 0, 0x0805CB44 }, { 0x295F, 0, 0x0805CB60 }, { 0x2960, 0, 0x0805CC3C }, { 0x2961, 0, 0x0805CD14 }, - { 0x2962, 0, 0x0805CD3C }, { 0x2968, 0, 0x0805CE60 }, { 0x2969, 0, 0x0805CE78 }, { 0x296A, 0, 0x0805CEF4 }, - { 0x296B, 0, 0x0805CF24 }, { 0x296C, 0, 0x0805CF64 }, { 0x296D, 0, 0x0805CF9C }, { 0x296E, 0, 0x0805CFB4 }, - { 0x296F, 0, 0x0805D018 }, { 0x2970, 0, 0x0805D08C }, { 0x2971, 0, 0x0805D17C }, { 0x2972, 0, 0x0805D1C4 }, - { 0x2973, 0, 0x0805D234 }, { 0x2974, 0, 0x0805D258 }, { 0x2975, 0, 0x0805D2E4 }, { 0x2976, 0, 0x0805D314 }, - { 0x2977, 0, 0x0805D358 }, { 0x2978, 0, 0x0805D3DC }, { 0x2979, 0, 0x0805D414 }, { 0x297A, 0, 0x0805D458 }, - { 0x29CC, 0, 0x0805D4A8 }, { 0x29CD, 0, 0x0805D4C0 }, { 0x29CE, 0, 0x0805D514 }, { 0x29CF, 0, 0x0805D550 }, - { 0x29D0, 0, 0x0805D580 }, { 0x29D1, 0, 0x0805D5AC }, { 0x29D2, 0, 0x0805D5D4 }, { 0x29D3, 0, 0x0805D620 }, - { 0x29D4, 0, 0x0805D724 }, { 0x29D5, 0, 0x0805D824 }, { 0x29D6, 0, 0x0805D864 }, { 0x29D7, 0, 0x0805D8A8 }, - { 0x29D8, 0, 0x0805D9A8 }, { 0x29D9, 0, 0x0805DAA4 }, { 0x29DA, 0, 0x0805DAFC }, { 0x29DB, 0, 0x0805DB3C }, - { 0x29DC, 0, 0x0805DBA0 }, { 0x29DD, 0, 0x0805DBDC }, { 0x29DE, 0, 0x0805DC00 }, { 0x29DF, 0, 0x0805DC68 }, - { 0x29E0, 0, 0x0805DC94 }, { 0x29E1, 0, 0x0805DCC0 }, { 0x29E2, 0, 0x0805DCE8 }, { 0x29E3, 0, 0x0805DE80 }, - { 0x29E4, 0, 0x0805DEC0 }, { 0x29E5, 0, 0x0805DFAC }, { 0x29E6, 0, 0x0805DFC8 }, { 0x29E7, 0, 0x0805E00C }, - { 0x29E8, 0, 0x0805E098 }, { 0x29E9, 0, 0x0805E0DC }, { 0x29EA, 0, 0x0805E1D0 }, { 0x29EB, 0, 0x0805E204 }, - { 0x29EC, 0, 0x0805E234 }, { 0x29ED, 0, 0x0805E258 }, { 0x29EE, 0, 0x0805E2A4 }, { 0x29EF, 0, 0x0805E2D4 }, - { 0x29F0, 0, 0x0805E314 }, { 0x29F1, 0, 0x0805E344 }, { 0x29F2, 0, 0x0805E390 }, { 0x29F3, 0, 0x0805E3EC }, - { 0x29F4, 0, 0x0805E428 }, { 0x29F5, 0, 0x0805E49C }, { 0x29F8, 0, 0x0805E4D8 }, { 0x29F9, 0, 0x0805E530 }, - { 0x29FA, 0, 0x0805E56C }, { 0x29FB, 0, 0x0805E5B8 }, { 0x29FC, 0, 0x0805E608 }, { 0x29FD, 0, 0x0805E654 }, - { 0x29FE, 0, 0x0805E6C8 }, { 0x29FF, 0, 0x0805E700 }, { 0x2A00, 0, 0x0805E7B4 }, { 0x2A01, 0, 0x0805E7D0 }, - { 0x2A02, 0, 0x0805E81C }, { 0x2A30, 0, 0x0805E878 }, { 0x2A31, 0, 0x0805E898 }, { 0x2A32, 0, 0x0805E8DC }, - { 0x2A33, 0, 0x0805E94C }, { 0x2A34, 0, 0x0805EA04 }, { 0x2A35, 0, 0x0805EA90 }, { 0x2A36, 0, 0x0805EB14 }, - { 0x2A37, 0, 0x0805EB4C }, { 0x2A38, 0, 0x0805EBD0 }, { 0x2A39, 0, 0x0805EC28 }, { 0x2A3A, 0, 0x0805EC40 }, - { 0x2A94, 0, 0x0805EC78 }, { 0x2A95, 0, 0x0805ECA4 }, { 0x2A96, 0, 0x0805ECD0 }, { 0x2A97, 0, 0x0805EDEC }, - { 0x2A98, 0, 0x0805EF18 }, { 0x2A99, 0, 0x0805EF50 }, { 0x2A9A, 0, 0x0805EFE0 }, { 0x2A9B, 0, 0x0805F120 }, - { 0x2A9C, 0, 0x0805F254 }, { 0x2A9D, 0, 0x0805F30C }, { 0x2A9E, 0, 0x0805F3CC }, { 0x2A9F, 0, 0x0805F4B4 }, - { 0x2AA0, 0, 0x0805F5D0 }, { 0x2AA1, 0, 0x0805F604 }, { 0x2AA2, 0, 0x0805F63C }, { 0x2AA3, 0, 0x0805F68C }, - { 0x2AA4, 0, 0x0805F6BC }, { 0x2AA5, 0, 0x0805F71C }, { 0x2AA6, 0, 0x0805F760 }, { 0x2AA7, 0, 0x0805F7E4 }, - { 0x2AA8, 0, 0x0805F81C }, { 0x2AA9, 0, 0x0805F834 }, { 0x2AAA, 0, 0x0805F870 }, { 0x2AAB, 0, 0x0805F888 }, - { 0x2AAC, 0, 0x0805F8B0 }, { 0x2AAD, 0, 0x0805F8D4 }, { 0x2AAE, 0, 0x0805F944 }, { 0x2AAF, 0, 0x0805F988 }, - { 0x2AB0, 0, 0x0805F9B0 }, { 0x2AB1, 0, 0x0805FA58 }, { 0x2AB2, 0, 0x0805FA6C }, { 0x2AB3, 0, 0x0805FA80 }, - { 0x2AB4, 0, 0x0805FB0C }, { 0x2AB5, 0, 0x0805FB20 }, { 0x2AB6, 0, 0x0805FB64 }, { 0x2AB7, 0, 0x0805FB80 }, - { 0x2AB8, 0, 0x0805FB9C }, { 0x2AB9, 0, 0x0805FBF4 }, { 0x2ABA, 0, 0x0805FC24 }, { 0x2ABB, 0, 0x0805FC88 }, - { 0x2ABC, 0, 0x0805FCB0 }, { 0x2ABD, 0, 0x0805FCD8 }, { 0x2ABE, 0, 0x0805FDD8 }, { 0x2ABF, 0, 0x0805FDFC }, - { 0x2AC0, 0, 0x0805FF50 }, { 0x2AC1, 0, 0x0805FF7C }, { 0x2AC2, 0, 0x080600D0 }, { 0x2AC3, 0, 0x080600EC }, - { 0x2AC4, 0, 0x080601F8 }, { 0x2AC5, 0, 0x0806022C }, { 0x2AC6, 0, 0x08060250 }, { 0x2AC7, 0, 0x08060260 }, - { 0x2AC8, 0, 0x08060270 }, { 0x2AC9, 0, 0x08060280 }, { 0x2ACA, 0, 0x080602E0 }, { 0x2ACB, 0, 0x0806030C }, - { 0x2ACC, 0, 0x08060340 }, { 0x2ACD, 0, 0x080603A4 }, { 0x2ACE, 0, 0x080603C0 }, { 0x2ACF, 0, 0x0806047C }, - { 0x2AD0, 0, 0x08060494 }, { 0x2AD1, 0, 0x0806053C }, { 0x2AD2, 0, 0x080605B0 }, { 0x2AD3, 0, 0x080605FC }, - { 0x2AD4, 0, 0x0806067C }, { 0x2AD5, 0, 0x080606A0 }, { 0x2AD6, 0, 0x080606BC }, { 0x2AD7, 0, 0x080606EC }, - { 0x2AD8, 0, 0x08060724 }, { 0x2AD9, 0, 0x08060748 }, { 0x2ADA, 0, 0x08060794 }, { 0x2ADB, 0, 0x08060814 }, - { 0x2ADC, 0, 0x08060874 }, { 0x2ADD, 0, 0x080608B4 }, { 0x2ADE, 0, 0x080608D0 }, { 0x2ADF, 0, 0x08060960 }, - { 0x2AE0, 0, 0x08060A00 }, { 0x2AE1, 0, 0x08060AA8 }, { 0x2AE2, 0, 0x08060AD4 }, { 0x2AE3, 0, 0x08060B10 }, - { 0x2AE4, 0, 0x08060B74 }, { 0x2AE5, 0, 0x08060BD0 }, { 0x2AE6, 0, 0x08060C6C }, { 0x2AEA, 0, 0x08060CDC }, - { 0x2AEB, 0, 0x08060D1C }, { 0x2AEC, 0, 0x08060D70 }, { 0x2AED, 0, 0x08060D98 }, { 0x2AEE, 0, 0x08060DB8 }, - { 0x2AF8, 0, 0x08060DC8 }, { 0x2AF9, 0, 0x08060DE4 }, { 0x2AFA, 0, 0x08060EC8 }, { 0x2AFB, 0, 0x08060FC0 }, - { 0x2AFC, 0, 0x080610CC }, { 0x2AFD, 0, 0x080611BC }, { 0x2AFE, 0, 0x080611F4 }, { 0x2AFF, 0, 0x080612EC }, - { 0x2B00, 0, 0x080613FC }, { 0x2B01, 0, 0x08061448 }, { 0x2B02, 0, 0x08061470 }, { 0x2B03, 0, 0x080614D0 }, - { 0x2B04, 0, 0x08061504 }, { 0x2B05, 0, 0x08061578 }, { 0x2B06, 0, 0x080615DC }, { 0x2B07, 0, 0x08061658 }, - { 0x2B08, 0, 0x0806167C }, { 0x2B09, 0, 0x080616C0 }, { 0x2B0A, 0, 0x08061714 }, { 0x2B0B, 0, 0x08061750 }, - { 0x2B0C, 0, 0x080617A8 }, { 0x2B0D, 0, 0x080617D8 }, { 0x2B0E, 0, 0x08061810 }, { 0x2B0F, 0, 0x08061890 }, - { 0x2B10, 0, 0x080619A0 }, { 0x2B11, 0, 0x08061AD8 }, { 0x2B12, 0, 0x08061B44 }, { 0x2B13, 0, 0x08061BA0 }, - { 0x2B14, 0, 0x08061C0C }, { 0x2B15, 0, 0x08061C44 }, { 0x2B16, 0, 0x08061CE0 }, { 0x2B17, 0, 0x08061D4C }, - { 0x2B18, 0, 0x08061D70 }, { 0x2B19, 0, 0x08061DD4 }, { 0x2B1A, 0, 0x08061EB4 }, { 0x2B1B, 0, 0x08061F10 }, - { 0x2B1C, 0, 0x08061F88 }, { 0x2B1D, 0, 0x08061FC4 }, { 0x2B1E, 0, 0x08061FEC }, { 0x2B1F, 0, 0x08062024 }, - { 0x2B20, 0, 0x0806209C }, { 0x2B21, 0, 0x0806212C }, { 0x2B22, 0, 0x08062164 }, { 0x2B23, 0, 0x080621A8 }, - { 0x2B24, 0, 0x0806229C }, { 0x2B25, 0, 0x080622D8 }, { 0x2B26, 0, 0x080622F8 }, { 0x2B27, 0, 0x08062350 }, - { 0x2B28, 0, 0x080623A0 }, { 0x2B29, 0, 0x080623D0 }, { 0x2B2A, 0, 0x08062428 }, { 0x2B2B, 0, 0x08062478 }, - { 0x2B2C, 0, 0x080624AC }, { 0x2B2D, 0, 0x08062500 }, { 0x2B2E, 0, 0x08062550 }, { 0x2B2F, 0, 0x08062580 }, - { 0x2B30, 0, 0x080625D4 }, { 0x2B31, 0, 0x08062624 }, { 0x2B32, 0, 0x08062650 }, { 0x2B33, 0, 0x08062670 }, - { 0x2B34, 0, 0x080626B0 }, { 0x2B35, 0, 0x080626DC }, { 0x2B36, 0, 0x080626FC }, { 0x2B37, 0, 0x0806273C }, - { 0x2B38, 0, 0x080627D8 }, { 0x2B39, 0, 0x08062890 }, { 0x2B3A, 0, 0x08062910 }, { 0x2B3B, 0, 0x08062968 }, - { 0x2B3C, 0, 0x080629A4 }, { 0x2B3D, 0, 0x080629E0 }, { 0x2B3E, 0, 0x08062A90 }, { 0x2B3F, 0, 0x08062AD8 }, - { 0x2B40, 0, 0x08062B34 }, { 0x2B5C, 0, 0x08062B84 }, { 0x2B5D, 0, 0x08062C3C }, { 0x2B5E, 0, 0x08062C68 }, - { 0x2B5F, 0, 0x08062C94 }, { 0x2B60, 0, 0x08062CE8 }, { 0x2B61, 0, 0x08062D8C }, { 0x2B62, 0, 0x08062E34 }, - { 0x2B63, 0, 0x08062E84 }, { 0x2B64, 0, 0x08062F18 }, { 0x2B65, 0, 0x08062F50 }, { 0x2B66, 0, 0x08062F98 }, - { 0x2B67, 0, 0x08062FE0 }, { 0x32C8, 0, 0x08063054 }, { 0x32C9, 0, 0x080630D8 }, { 0x32CA, 0, 0x08063120 }, - { 0x32CB, 0, 0x08063184 }, { 0x32CC, 0, 0x080631E0 }, { 0x32CD, 0, 0x08063210 }, { 0x32CE, 0, 0x0806326C }, - { 0x32CF, 0, 0x08063294 }, { 0x32D0, 0, 0x080632B4 }, { 0x32D1, 0, 0x08063300 }, { 0x32D2, 0, 0x08063338 }, - { 0x32D3, 0, 0x08063384 }, { 0x32D4, 0, 0x080633B4 }, { 0x332C, 0, 0x080633E8 }, { 0x332D, 0, 0x08063408 }, - { 0x332E, 0, 0x080634FC }, { 0x332F, 0, 0x0806356C }, { 0x3330, 0, 0x08063594 }, { 0x3331, 0, 0x080635AC }, - { 0x3332, 0, 0x080635D0 }, { 0x3333, 0, 0x08063618 }, { 0x3334, 0, 0x0806369C }, { 0x3335, 0, 0x08063714 }, - { 0x3336, 0, 0x08063734 }, { 0x3337, 0, 0x08063788 }, { 0x3338, 0, 0x080637AC }, { 0x3339, 0, 0x080637CC }, - { 0x333A, 0, 0x08063838 }, { 0x333B, 0, 0x08063868 }, { 0x333C, 0, 0x08063898 }, { 0x333D, 0, 0x08063948 }, - { 0x333E, 0, 0x08063988 }, { 0x333F, 0, 0x080639AC }, { 0x3340, 0, 0x08063A58 }, { 0x3341, 0, 0x08063AB0 }, - { 0x3342, 0, 0x08063B24 }, { 0x3343, 0, 0x08063BBC }, { 0x3344, 0, 0x08063C28 }, { 0x3345, 0, 0x08063CF0 }, - { 0x3346, 0, 0x08063D24 }, { 0x3347, 0, 0x08063D5C }, { 0x3348, 0, 0x08063D8C }, { 0x3349, 0, 0x08063DEC }, - { 0x334A, 0, 0x08063E70 }, { 0x334B, 0, 0x08063EA8 }, { 0x334C, 0, 0x08063EC4 }, { 0x334D, 0, 0x08063FB4 }, - { 0x334E, 0, 0x08063FDC }, { 0x334F, 0, 0x08064038 }, { 0x3350, 0, 0x08064058 }, { 0x3351, 0, 0x0806408C }, - { 0x3352, 0, 0x080640B0 }, { 0x3353, 0, 0x080640E0 }, { 0x3354, 0, 0x08064168 }, { 0x3355, 0, 0x080641B4 }, - { 0x3356, 0, 0x080641EC }, { 0x3357, 0, 0x08064218 }, { 0x3358, 0, 0x08064230 }, { 0x3359, 0, 0x08064264 }, - { 0x335A, 0, 0x08064298 }, { 0x335B, 0, 0x080642F0 }, { 0x335C, 0, 0x08064354 }, { 0x335D, 0, 0x0806437C }, - { 0x335E, 0, 0x080643B4 }, { 0x335F, 0, 0x080643E4 }, { 0x3360, 0, 0x0806444C }, { 0x3361, 0, 0x08064498 }, - { 0x3362, 0, 0x080644EC }, { 0x3363, 0, 0x0806453C }, { 0x3364, 0, 0x08064564 }, { 0x3365, 0, 0x08064654 }, - { 0x3366, 0, 0x08064718 }, { 0x3367, 0, 0x080647E4 }, { 0x3368, 0, 0x08064860 }, { 0x3369, 0, 0x080648B8 }, - { 0x336A, 0, 0x08064988 }, { 0x336B, 0, 0x080649F4 }, { 0x336C, 0, 0x08064A44 }, { 0x336D, 0, 0x08064AA0 }, - { 0x336E, 0, 0x08064AE8 }, { 0x336F, 0, 0x08064B10 }, { 0x3370, 0, 0x08064B64 }, { 0x3371, 0, 0x08064BBC }, - { 0x3390, 0, 0x08064BEC }, { 0x3391, 0, 0x08064C24 }, { 0x3392, 0, 0x08064CE0 }, { 0x3393, 0, 0x08064D4C }, - { 0x3394, 0, 0x08064DA0 }, { 0x3395, 0, 0x08064E04 }, { 0x3396, 0, 0x08064F10 }, { 0x3397, 0, 0x08064F84 }, - { 0x3398, 0, 0x08064FBC }, { 0x3399, 0, 0x08065070 }, { 0x339A, 0, 0x080650DC }, { 0x339B, 0, 0x08065144 }, - { 0x339C, 0, 0x0806516C }, { 0x339D, 0, 0x0806519C }, { 0x339E, 0, 0x080651D4 }, { 0x339F, 0, 0x080651F0 }, - { 0x33A0, 0, 0x0806524C }, { 0x33A1, 0, 0x08065358 }, { 0x33A2, 0, 0x080653CC }, { 0x33A3, 0, 0x08065408 }, - { 0x33A4, 0, 0x08065438 }, { 0x33A5, 0, 0x08065470 }, { 0x33A6, 0, 0x080654CC }, { 0x33A7, 0, 0x08065510 }, - { 0x33A8, 0, 0x0806555C }, { 0x33A9, 0, 0x080655A0 }, { 0x33AA, 0, 0x080655C0 }, { 0x33AB, 0, 0x08065600 }, - { 0x33AC, 0, 0x08065658 }, { 0x33AD, 0, 0x08065678 }, { 0x33AE, 0, 0x08065710 }, { 0x33AF, 0, 0x080657A8 }, - { 0x33B0, 0, 0x080657D0 }, { 0x33B1, 0, 0x080657E8 }, { 0x33B2, 0, 0x08065860 }, { 0x33B3, 0, 0x080658E4 }, - { 0x33B4, 0, 0x08065930 }, { 0x33B5, 0, 0x0806597C }, { 0x33B6, 0, 0x080659DC }, { 0x33B7, 0, 0x08065A28 }, - { 0x33B8, 0, 0x08065ABC }, { 0x33B9, 0, 0x08065AE0 }, { 0x33BA, 0, 0x08065B08 }, { 0x33BB, 0, 0x08065B7C }, - { 0x33BC, 0, 0x08065BD8 }, { 0x33BD, 0, 0x08065C5C }, { 0x33BE, 0, 0x08065C88 }, { 0x33BF, 0, 0x08065CCC }, - { 0x33C0, 0, 0x08065D30 }, { 0x33C1, 0, 0x08065DD4 }, { 0x33C2, 0, 0x08065E24 }, { 0x33C3, 0, 0x08065E84 }, - { 0x33C4, 0, 0x08065F4C }, { 0x33C5, 0, 0x08066024 }, { 0x33C6, 0, 0x08066120 }, { 0x33C7, 0, 0x08066144 }, - { 0x33C8, 0, 0x08066200 }, { 0x33C9, 0, 0x08066268 }, { 0x33CA, 0, 0x0806629C }, { 0x33CB, 0, 0x080662D0 }, - { 0x33CC, 0, 0x0806630C }, { 0x33CD, 0, 0x08066324 }, { 0x33CE, 0, 0x0806635C }, { 0x33CF, 0, 0x0806637C }, - { 0x33D0, 0, 0x080663AC }, { 0x33D1, 0, 0x08066464 }, { 0x33D2, 0, 0x08066578 }, { 0x33D3, 0, 0x080665F4 }, - { 0x33D4, 0, 0x0806665C }, { 0x33D5, 0, 0x080666D0 }, { 0x33D6, 0, 0x08066708 }, { 0x33D7, 0, 0x08066788 }, - { 0x33D8, 0, 0x080667D4 }, { 0x33D9, 0, 0x08066834 }, { 0x33F4, 0, 0x080668FC }, { 0x33F5, 0, 0x08066934 }, - { 0x33F6, 0, 0x080669DC }, { 0x33F7, 0, 0x08066A3C }, { 0x33F9, 0, 0x08066B00 }, { 0x3458, 0, 0x08066B40 }, - { 0x3459, 0, 0x08066B60 }, { 0x345A, 0, 0x08066BC0 }, { 0x345B, 0, 0x08066C10 }, { 0x345C, 0, 0x08066C7C }, - { 0x345D, 0, 0x08066CB8 }, { 0x345E, 0, 0x08066D20 }, { 0x345F, 0, 0x08066D90 }, { 0x3460, 0, 0x08066E58 }, - { 0x3461, 0, 0x08066E9C }, { 0x3462, 0, 0x08066EE8 }, { 0x3463, 0, 0x08066F38 }, { 0x3464, 0, 0x08066F64 }, - { 0x3465, 0, 0x08066FF8 }, { 0x3466, 0, 0x080670A4 }, { 0x3467, 0, 0x080670F0 }, { 0x3468, 0, 0x08067144 }, - { 0x3469, 0, 0x08067174 }, { 0x346A, 0, 0x080671E8 }, { 0x346B, 0, 0x08067208 }, { 0x346C, 0, 0x08067224 }, - { 0x346D, 0, 0x0806728C }, { 0x346E, 0, 0x0806731C }, { 0x346F, 0, 0x0806739C }, { 0x3470, 0, 0x08067400 }, - { 0x3471, 0, 0x0806743C }, { 0x3472, 0, 0x0806746C }, { 0x3473, 0, 0x080674B0 }, { 0x3474, 0, 0x08067520 }, - { 0x3475, 0, 0x08067594 }, { 0x3476, 0, 0x080675B8 }, { 0x3477, 0, 0x080675E0 }, { 0x3478, 0, 0x08067618 }, - { 0x3479, 0, 0x08067648 }, { 0x347A, 0, 0x08067688 }, { 0x347B, 0, 0x080676B0 }, { 0x347C, 0, 0x080676F0 }, - { 0x347D, 0, 0x08067760 }, { 0x347E, 0, 0x080677A4 }, { 0x347F, 0, 0x080677F4 }, { 0x3480, 0, 0x0806782C }, - { 0x3481, 0, 0x080678A0 }, { 0x3482, 0, 0x080678C8 }, { 0x3483, 0, 0x080678F8 }, { 0x3484, 0, 0x08067934 }, - { 0x3485, 0, 0x08067990 }, { 0x3486, 0, 0x080679E0 }, { 0x3487, 0, 0x08067A18 }, { 0x3488, 0, 0x08067A68 }, - { 0x3489, 0, 0x08067AE8 }, { 0x348A, 0, 0x08067B54 }, { 0x348B, 0, 0x08067BBC }, { 0x348C, 0, 0x08067C0C }, - { 0x348D, 0, 0x08067C5C }, { 0x348E, 0, 0x08067CB8 }, { 0x348F, 0, 0x08067D6C }, { 0x3490, 0, 0x08067DE0 }, - { 0x3491, 0, 0x08067E2C }, { 0x3492, 0, 0x08067E80 }, { 0x3493, 0, 0x08067EDC }, { 0x3494, 0, 0x08067F20 }, - { 0x3495, 0, 0x08067F44 }, { 0x3496, 0, 0x08067F64 }, { 0x3497, 0, 0x08067FEC }, { 0x3498, 0, 0x0806803C }, - { 0x3499, 0, 0x08068094 }, { 0x349A, 0, 0x080680C8 }, { 0x349B, 0, 0x080680FC }, { 0x349C, 0, 0x0806812C }, - { 0x349D, 0, 0x08068158 }, { 0x349E, 0, 0x08068180 }, { 0x349F, 0, 0x080681C0 }, { 0x34A0, 0, 0x08068224 }, - { 0x34A1, 0, 0x08068278 }, { 0x34A2, 0, 0x080682C0 }, { 0x34A3, 0, 0x0806830C }, { 0x34A4, 0, 0x08068394 }, - { 0x34A5, 0, 0x080683F4 }, { 0x34A6, 0, 0x08068430 }, { 0x34A7, 0, 0x08068498 }, { 0x34A8, 0, 0x080684FC }, - { 0x34A9, 0, 0x08068544 }, { 0x34AA, 0, 0x08068564 }, { 0x34AB, 0, 0x08068598 }, { 0x34AC, 0, 0x0806860C }, - { 0x34AD, 0, 0x08068640 }, { 0x34AE, 0, 0x080686F4 }, { 0x34AF, 0, 0x08068768 }, { 0x34B0, 0, 0x08068780 }, - { 0x34B1, 0, 0x080687E0 }, { 0x34B2, 0, 0x080687F8 }, { 0x34B3, 0, 0x08068860 }, { 0x3520, 0, 0x080688F4 }, - { 0x3521, 0, 0x08068958 }, { 0x3522, 0, 0x080689C8 }, { 0x3523, 0, 0x08068A38 }, { 0x3524, 0, 0x08068A88 }, - { 0x3525, 0, 0x08068B04 }, { 0x3526, 0, 0x08068B30 }, { 0x3527, 0, 0x08068B7C }, { 0x3528, 0, 0x08068CA0 }, - { 0x3529, 0, 0x08068CF4 }, { 0x352A, 0, 0x08068D1C }, { 0x352B, 0, 0x08068DB0 }, { 0x352C, 0, 0x08068E28 }, - { 0x352D, 0, 0x08068E78 }, { 0x352E, 0, 0x08068F14 }, { 0x352F, 0, 0x08068F78 }, { 0x3530, 0, 0x08068FA0 }, - { 0x3531, 0, 0x08069020 }, { 0x3532, 0, 0x080690CC }, { 0x3533, 0, 0x0806913C }, { 0x3534, 0, 0x080691B0 }, - { 0x3535, 0, 0x08069224 }, { 0x3536, 0, 0x0806923C }, { 0x3537, 0, 0x08069284 }, { 0x3538, 0, 0x080692D8 }, - { 0x3539, 0, 0x08069314 }, { 0x353A, 0, 0x08069358 }, { 0x353B, 0, 0x08069390 }, { 0x353C, 0, 0x080693E4 }, - { 0x353D, 0, 0x08069434 }, { 0x353E, 0, 0x08069490 }, { 0x353F, 0, 0x080694C4 }, { 0x3540, 0, 0x08069524 }, - { 0x3541, 0, 0x0806957C }, { 0x3542, 0, 0x080695C0 }, { 0x3543, 0, 0x08069608 }, { 0x3544, 0, 0x08069668 }, - { 0x3545, 0, 0x080696DC }, { 0x3546, 0, 0x08069734 }, { 0x3548, 0, 0x08069774 }, { 0x3549, 0, 0x08069814 }, - { 0x354A, 0, 0x080698A0 }, { 0x354B, 0, 0x08069930 }, { 0x354C, 0, 0x08069998 }, { 0xFFFC, 0, 0x080699C8 }, - { 0xFFFD, 0, 0x080699D4 }, { 0xFFFF, 0, NULL }, + { 0, 0, (void*)0x08000000 }, { 2, 0, (void*)0x0800000C }, { 4, 0, (void*)0x08000064 }, + { 5, 0, (void*)0x080000B8 }, { 6, 0, (void*)0x08000110 }, { 7, 0, (void*)0x08000168 }, + { 8, 0, (void*)0x080001C4 }, { 9, 0, (void*)0x08000248 }, { 0xA, 0, (void*)0x080002A8 }, + { 0xB, 0, (void*)0x08000310 }, { 0xC, 0, (void*)0x0800031C }, { 0xD, 0, (void*)0x080003E8 }, + { 0xE, 0, (void*)0x08000474 }, { 0xF, 0, (void*)0x080004BC }, { 0x10, 0, (void*)0x08000504 }, + { 0x11, 0, (void*)0x08000510 }, { 0x12, 0, (void*)0x08000554 }, { 0x13, 0, (void*)0x08000560 }, + { 0x14, 0, (void*)0x0800056C }, { 0x15, 0, (void*)0x08000604 }, { 0x16, 0, (void*)0x080006A0 }, + { 0x17, 0, (void*)0x0800073C }, { 0x18, 0, (void*)0x080007D8 }, { 0x19, 0, (void*)0x08000874 }, + { 0x1A, 0, (void*)0x08000940 }, { 0x1B, 0, (void*)0x080009E8 }, { 0x1C, 0, (void*)0x08000A84 }, + { 0x1D, 0, (void*)0x08000AD4 }, { 0x1E, 0, (void*)0x08000B28 }, { 0x1F, 0, (void*)0x08000B58 }, + { 0x20, 0, (void*)0x08000B88 }, { 0x21, 0, (void*)0x08000BB8 }, { 0x22, 0, (void*)0x08000BE8 }, + { 0x23, 0, (void*)0x08000C78 }, { 0x24, 0, (void*)0x08000CD0 }, { 0x25, 0, (void*)0x08000D30 }, + { 0x26, 0, (void*)0x08000DA4 }, { 0x27, 0, (void*)0x08000E38 }, { 0x28, 0, (void*)0x08000EB4 }, + { 0x29, 0, (void*)0x08000F88 }, { 0x2A, 0, (void*)0x08001060 }, { 0x2B, 0, (void*)0x0800113C }, + { 0x2C, 0, (void*)0x08001148 }, { 0x2D, 0, (void*)0x08001154 }, { 0x2E, 0, (void*)0x08001160 }, + { 0x2F, 0, (void*)0x08001210 }, { 0x30, 0, (void*)0x0800121C }, { 0x31, 0, (void*)0x08001228 }, + { 0x32, 0, (void*)0x08001234 }, { 0x33, 0, (void*)0x080012D4 }, { 0x34, 0, (void*)0x0800139C }, + { 0x35, 0, (void*)0x08001428 }, { 0x36, 0, (void*)0x080014B0 }, { 0x37, 0, (void*)0x08001554 }, + { 0x38, 0, (void*)0x08001560 }, { 0x39, 0, (void*)0x08001624 }, { 0x3A, 0, (void*)0x080016B8 }, + { 0x3B, 0, (void*)0x08001768 }, { 0x3C, 0, (void*)0x08001814 }, { 0x3D, 0, (void*)0x08001884 }, + { 0x3E, 0, (void*)0x080018E0 }, { 0x3F, 0, (void*)0x080019DC }, { 0x40, 0, (void*)0x08001A48 }, + { 0x41, 0, (void*)0x08001A54 }, { 0x42, 0, (void*)0x08001B0C }, { 0x43, 0, (void*)0x08001BF4 }, + { 0x4C, 0, (void*)0x08001CBC }, { 0x4D, 0, (void*)0x08001DBC }, { 0x4E, 0, (void*)0x08001DC8 }, + { 0x50, 0, (void*)0x08001DD4 }, { 0x51, 0, (void*)0x08001EA4 }, { 0x52, 0, (void*)0x08001EB0 }, + { 0x53, 0, (void*)0x08001EFC }, { 0x54, 0, (void*)0x08001F08 }, { 0x55, 0, (void*)0x08001F14 }, + { 0x56, 0, (void*)0x08001FB8 }, { 0x57, 0, (void*)0x08002058 }, { 0x58, 0, (void*)0x080020F8 }, + { 0x59, 0, (void*)0x080021A0 }, { 0x5A, 0, (void*)0x08002290 }, { 0x5B, 0, (void*)0x080022E4 }, + { 0x5C, 0, (void*)0x08002388 }, { 0x5D, 0, (void*)0x08002434 }, { 0x5E, 0, (void*)0x080024E8 }, + { 0x5F, 0, (void*)0x08002590 }, { 0x60, 0, (void*)0x0800261C }, { 0x61, 0, (void*)0x080026F0 }, + { 0x62, 0, (void*)0x080026FC }, { 0x63, 0, (void*)0x08002760 }, { 0x64, 0, (void*)0x080027CC }, + { 0x65, 0, (void*)0x080027D8 }, { 0x66, 0, (void*)0x0800282C }, { 0x67, 0, (void*)0x08002884 }, + { 0x68, 0, (void*)0x080028EC }, { 0x69, 0, (void*)0x08002950 }, { 0x6A, 0, (void*)0x080029CC }, + { 0x6B, 0, (void*)0x08002A24 }, { 0x6E, 0, (void*)0x08002A7C }, { 0x6F, 0, (void*)0x08002A88 }, + { 0x70, 0, (void*)0x08002B54 }, { 0x71, 0, (void*)0x08002B60 }, { 0x72, 0, (void*)0x08002B6C }, + { 0x73, 0, (void*)0x08002B78 }, { 0x74, 0, (void*)0x08002B84 }, { 0x75, 0, (void*)0x08002B90 }, + { 0x76, 0, (void*)0x08002B9C }, { 0x77, 0, (void*)0x08002BA8 }, { 0x78, 0, (void*)0x08002BB4 }, + { 0x79, 0, (void*)0x08002C98 }, { 0x7A, 0, (void*)0x08002D54 }, { 0x7B, 0, (void*)0x08002E14 }, + { 0x7C, 0, (void*)0x08002E90 }, { 0x7D, 0, (void*)0x08002F20 }, { 0x7E, 0, (void*)0x08002F9C }, + { 0x7F, 0, (void*)0x0800302C }, { 0x80, 0, (void*)0x0800309C }, { 0x81, 0, (void*)0x08003144 }, + { 0x82, 0, (void*)0x080031B0 }, { 0x83, 0, (void*)0x08003224 }, { 0x84, 0, (void*)0x08003298 }, + { 0x85, 0, (void*)0x08003324 }, { 0x86, 0, (void*)0x08003370 }, { 0x87, 0, (void*)0x08003444 }, + { 0x88, 0, (void*)0x080034F8 }, { 0x89, 0, (void*)0x08003560 }, { 0x8A, 0, (void*)0x080035F4 }, + { 0x8B, 0, (void*)0x080036B8 }, { 0x8C, 0, (void*)0x08003710 }, { 0x8D, 0, (void*)0x080037A0 }, + { 0x8E, 0, (void*)0x08003828 }, { 0x8F, 0, (void*)0x080038E0 }, { 0x91, 0, (void*)0x0800396C }, + { 0x92, 0, (void*)0x08003A44 }, { 0x93, 0, (void*)0x08003B08 }, { 0x94, 0, (void*)0x08003B60 }, + { 0x95, 0, (void*)0x08003B6C }, { 0x96, 0, (void*)0x08003BC0 }, { 0x97, 0, (void*)0x08003C1C }, + { 0x98, 0, (void*)0x08003C60 }, { 0x99, 0, (void*)0x08003CA8 }, { 0x9A, 0, (void*)0x08003CF4 }, + { 0x9B, 0, (void*)0x08003D40 }, { 0x9C, 0, (void*)0x08003DE0 }, { 0x9D, 0, (void*)0x08003E78 }, + { 0x9E, 0, (void*)0x08003F10 }, { 0x9F, 0, (void*)0x08003FA8 }, { 0xA0, 0, (void*)0x08003FB4 }, + { 0xA1, 0, (void*)0x0800401C }, { 0xA2, 0, (void*)0x08004088 }, { 0xA3, 0, (void*)0x08004094 }, + { 0xA4, 0, (void*)0x080040A0 }, { 0xA9, 0, (void*)0x080040AC }, { 0xAA, 0, (void*)0x08004130 }, + { 0xAB, 0, (void*)0x08004198 }, { 0xAC, 0, (void*)0x08004240 }, { 0xAD, 0, (void*)0x0800424C }, + { 0xAE, 0, (void*)0x08004258 }, { 0xAF, 0, (void*)0x08004264 }, { 0xB0, 0, (void*)0x08004270 }, + { 0xB1, 0, (void*)0x0800427C }, { 0xB2, 0, (void*)0x08004288 }, { 0xB4, 0, (void*)0x08004294 }, + { 0xB5, 0, (void*)0x08004354 }, { 0xB6, 0, (void*)0x08004418 }, { 0xB7, 0, (void*)0x080044E0 }, + { 0xB8, 0, (void*)0x080045A8 }, { 0xB9, 0, (void*)0x08004670 }, { 0xBA, 0, (void*)0x08004738 }, + { 0xBB, 0, (void*)0x08004744 }, { 0xBC, 0, (void*)0x08004750 }, { 0xBD, 0, (void*)0x0800475C }, + { 0xBE, 0, (void*)0x08004768 }, { 0xBF, 0, (void*)0x08004774 }, { 0xC0, 0, (void*)0x08004780 }, + { 0xC4, 0, (void*)0x0800478C }, { 0xC5, 0, (void*)0x080047D0 }, { 0xC6, 0, (void*)0x08004850 }, + { 0xC7, 0, (void*)0x080048D0 }, { 0xC8, 0, (void*)0x08004954 }, { 0xC9, 0, (void*)0x08004A5C }, + { 0xCA, 0, (void*)0x08004AFC }, { 0xCB, 0, (void*)0x08004C14 }, { 0xCC, 0, (void*)0x08004C78 }, + { 0xCD, 0, (void*)0x08004CDC }, { 0xF2, 0, (void*)0x08004D8C }, { 0xF3, 0, (void*)0x08004DC8 }, + { 0xF4, 0, (void*)0x08004E3C }, { 0xF5, 0, (void*)0x08004E8C }, { 0xF6, 0, (void*)0x08004EDC }, + { 0xF7, 0, (void*)0x08004F30 }, { 0xF8, 0, (void*)0x08004F70 }, { 0xF9, 0, (void*)0x08004F9C }, + { 0xFA, 0, (void*)0x08005034 }, { 0xFB, 0, (void*)0x08005088 }, { 0xFC, 0, (void*)0x080050FC }, + { 0xFD, 0, (void*)0x0800515C }, { 0xFE, 0, (void*)0x08005184 }, { 0xFF, 0, (void*)0x080051B8 }, + { 0x100, 0, (void*)0x08005214 }, { 0x101, 0, (void*)0x08005230 }, { 0x102, 0, (void*)0x0800524C }, + { 0x103, 0, (void*)0x08005268 }, { 0x104, 0, (void*)0x08005284 }, { 0x105, 0, (void*)0x080052A0 }, + { 0x106, 0, (void*)0x080052B8 }, { 0x107, 0, (void*)0x080052D4 }, { 0x108, 0, (void*)0x080052F8 }, + { 0x109, 0, (void*)0x0800531C }, { 0x10A, 0, (void*)0x0800533C }, { 0x10B, 0, (void*)0x08005358 }, + { 0x10C, 0, (void*)0x0800537C }, { 0x10D, 0, (void*)0x08005390 }, { 0x10E, 0, (void*)0x080053A8 }, + { 0x10F, 0, (void*)0x080053C4 }, { 0x110, 0, (void*)0x080053DC }, { 0x111, 0, (void*)0x080053FC }, + { 0x112, 0, (void*)0x08005414 }, { 0x113, 0, (void*)0x0800542C }, { 0x114, 0, (void*)0x08005450 }, + { 0x115, 0, (void*)0x08005470 }, { 0x116, 0, (void*)0x0800548C }, { 0x117, 0, (void*)0x080054A8 }, + { 0x118, 0, (void*)0x080054BC }, { 0x119, 0, (void*)0x080054D4 }, { 0x11A, 0, (void*)0x080054F4 }, + { 0x11B, 0, (void*)0x08005518 }, { 0x11C, 0, (void*)0x0800553C }, { 0x11D, 0, (void*)0x0800555C }, + { 0x11E, 0, (void*)0x08005578 }, { 0x11F, 0, (void*)0x08005598 }, { 0x120, 0, (void*)0x080055B4 }, + { 0x121, 0, (void*)0x080055CC }, { 0x122, 0, (void*)0x080055E8 }, { 0x123, 0, (void*)0x08005604 }, + { 0x124, 0, (void*)0x08005620 }, { 0x125, 0, (void*)0x08005638 }, { 0x126, 0, (void*)0x0800564C }, + { 0x127, 0, (void*)0x08005668 }, { 0x129, 0, (void*)0x08005684 }, { 0x12A, 0, (void*)0x0800569C }, + { 0x12B, 0, (void*)0x080056B8 }, { 0x12C, 0, (void*)0x080056D4 }, { 0x12D, 0, (void*)0x080056F0 }, + { 0x12E, 0, (void*)0x0800570C }, { 0x12F, 0, (void*)0x08005724 }, { 0x130, 0, (void*)0x0800573C }, + { 0x131, 0, (void*)0x08005758 }, { 0x132, 0, (void*)0x08005770 }, { 0x134, 0, (void*)0x08005788 }, + { 0x135, 0, (void*)0x080057A4 }, { 0x136, 0, (void*)0x080057C0 }, { 0x137, 0, (void*)0x080057D8 }, + { 0x138, 0, (void*)0x080057F4 }, { 0x139, 0, (void*)0x08005814 }, { 0x13A, 0, (void*)0x0800582C }, + { 0x13B, 0, (void*)0x0800584C }, { 0x13D, 0, (void*)0x08005868 }, { 0x13E, 0, (void*)0x08005884 }, + { 0x13F, 0, (void*)0x080058A0 }, { 0x140, 0, (void*)0x080058C4 }, { 0x141, 0, (void*)0x080058DC }, + { 0x142, 0, (void*)0x080058F4 }, { 0x143, 0, (void*)0x08005918 }, { 0x144, 0, (void*)0x08005934 }, + { 0x145, 0, (void*)0x08005954 }, { 0x146, 0, (void*)0x08005970 }, { 0x147, 0, (void*)0x08005988 }, + { 0x148, 0, (void*)0x080059A4 }, { 0x149, 0, (void*)0x080059C0 }, { 0x200, 0, (void*)0x080059D8 }, + { 0x201, 0, (void*)0x08005A54 }, { 0x202, 0, (void*)0x08005B48 }, { 0x203, 0, (void*)0x08005B74 }, + { 0x204, 0, (void*)0x08005BE4 }, { 0x205, 0, (void*)0x08005C38 }, { 0x206, 0, (void*)0x08005C94 }, + { 0x207, 0, (void*)0x08005D04 }, { 0x208, 0, (void*)0x08005D2C }, { 0x209, 0, (void*)0x08005D64 }, + { 0x20A, 0, (void*)0x08005DB4 }, { 0x20B, 0, (void*)0x08005E08 }, { 0x20C, 0, (void*)0x08005E14 }, + { 0x20D, 0, (void*)0x08005E60 }, { 0x20E, 0, (void*)0x08005ECC }, { 0x20F, 0, (void*)0x08005ED8 }, + { 0x210, 0, (void*)0x08005F74 }, { 0x211, 0, (void*)0x08005FAC }, { 0x212, 0, (void*)0x08005FD4 }, + { 0x213, 0, (void*)0x0800602C }, { 0x214, 0, (void*)0x08006050 }, { 0x215, 0, (void*)0x08006124 }, + { 0x216, 0, (void*)0x08006358 }, { 0x217, 0, (void*)0x080065B8 }, { 0x218, 0, (void*)0x08006620 }, + { 0x219, 0, (void*)0x0800668C }, { 0x21A, 0, (void*)0x08006720 }, { 0x21B, 0, (void*)0x0800674C }, + { 0x21D, 0, (void*)0x08006774 }, { 0x21E, 0, (void*)0x080067CC }, { 0x21F, 0, (void*)0x08006874 }, + { 0x220, 0, (void*)0x080068E0 }, { 0x221, 0, (void*)0x08006978 }, { 0x222, 0, (void*)0x08006A04 }, + { 0x223, 0, (void*)0x08006A48 }, { 0x224, 0, (void*)0x08006AE8 }, { 0x225, 0, (void*)0x08006B54 }, + { 0x226, 0, (void*)0x08006BB0 }, { 0x227, 0, (void*)0x08006BE8 }, { 0x228, 0, (void*)0x08006D58 }, + { 0x229, 0, (void*)0x08006E18 }, { 0x22A, 0, (void*)0x08006EA0 }, { 0x22B, 0, (void*)0x08006F00 }, + { 0x22C, 0, (void*)0x08006F44 }, { 0x22D, 0, (void*)0x08006F60 }, { 0x22E, 0, (void*)0x08006FB0 }, + { 0x22F, 0, (void*)0x08006FC8 }, { 0x230, 0, (void*)0x08007010 }, { 0x231, 0, (void*)0x080070C0 }, + { 0x232, 0, (void*)0x08007110 }, { 0x233, 0, (void*)0x08007158 }, { 0x234, 0, (void*)0x080071A4 }, + { 0x235, 0, (void*)0x08007208 }, { 0x236, 0, (void*)0x0800725C }, { 0x237, 0, (void*)0x080072AC }, + { 0x238, 0, (void*)0x0800730C }, { 0x239, 0, (void*)0x0800734C }, { 0x23A, 0, (void*)0x08007400 }, + { 0x23B, 0, (void*)0x08007468 }, { 0x23C, 0, (void*)0x08007500 }, { 0x23D, 0, (void*)0x08007538 }, + { 0x23E, 0, (void*)0x080075E4 }, { 0x23F, 0, (void*)0x080075F0 }, { 0x240, 0, (void*)0x0800765C }, + { 0x241, 0, (void*)0x080076D0 }, { 0x242, 0, (void*)0x08007744 }, { 0x243, 0, (void*)0x080077B0 }, + { 0x244, 0, (void*)0x08007830 }, { 0x245, 0, (void*)0x08007888 }, { 0x246, 0, (void*)0x080078B4 }, + { 0x247, 0, (void*)0x08007904 }, { 0x248, 0, (void*)0x08007950 }, { 0x249, 0, (void*)0x080079A0 }, + { 0x24A, 0, (void*)0x080079F0 }, { 0x24B, 0, (void*)0x08007A30 }, { 0x24C, 0, (void*)0x08007A78 }, + { 0x24D, 0, (void*)0x08007AD8 }, { 0x24E, 0, (void*)0x08007B54 }, { 0x24F, 0, (void*)0x08007BE8 }, + { 0x250, 0, (void*)0x08007C88 }, { 0x251, 0, (void*)0x08007CEC }, { 0x252, 0, (void*)0x08007D18 }, + { 0x253, 0, (void*)0x08007D68 }, { 0x254, 0, (void*)0x08007DAC }, { 0x255, 0, (void*)0x08007E04 }, + { 0x256, 0, (void*)0x08007E4C }, { 0x257, 0, (void*)0x08007EA4 }, { 0x258, 0, (void*)0x08007F00 }, + { 0x25A, 0, (void*)0x08007F58 }, { 0x25B, 0, (void*)0x08007FA0 }, { 0x25C, 0, (void*)0x08007FDC }, + { 0x25D, 0, (void*)0x08007FF8 }, { 0x25E, 0, (void*)0x08008024 }, { 0x25F, 0, (void*)0x080080E4 }, + { 0x260, 0, (void*)0x0800818C }, { 0x261, 0, (void*)0x080081F8 }, { 0x262, 0, (void*)0x08008288 }, + { 0x263, 0, (void*)0x08008304 }, { 0x264, 0, (void*)0x08008344 }, { 0x265, 0, (void*)0x08008420 }, + { 0x302, 0, (void*)0x08008498 }, { 0x303, 0, (void*)0x080085DC }, { 0x304, 0, (void*)0x08008660 }, + { 0x305, 0, (void*)0x080086B4 }, { 0x306, 0, (void*)0x08008720 }, { 0x307, 0, (void*)0x0800872C }, + { 0x308, 0, (void*)0x0800875C }, { 0x309, 0, (void*)0x08008788 }, { 0x30A, 0, (void*)0x080087BC }, + { 0x30B, 0, (void*)0x080087E8 }, { 0x30C, 0, (void*)0x08008824 }, { 0x30D, 0, (void*)0x08008894 }, + { 0x30E, 0, (void*)0x080088E4 }, { 0x30F, 0, (void*)0x08008914 }, { 0x310, 0, (void*)0x08008970 }, + { 0x311, 0, (void*)0x080089BC }, { 0x312, 0, (void*)0x080089F0 }, { 0x313, 0, (void*)0x08008A64 }, + { 0x314, 0, (void*)0x08008AA4 }, { 0x315, 0, (void*)0x08008B0C }, { 0x316, 0, (void*)0x08008B64 }, + { 0x317, 0, (void*)0x08008BA4 }, { 0x318, 0, (void*)0x08008BF0 }, { 0x319, 0, (void*)0x08008C48 }, + { 0x31A, 0, (void*)0x08008C84 }, { 0x31B, 0, (void*)0x08008CD0 }, { 0x31C, 0, (void*)0x08008D10 }, + { 0x31D, 0, (void*)0x08008D5C }, { 0x31E, 0, (void*)0x08008DCC }, { 0x31F, 0, (void*)0x08008E2C }, + { 0x320, 0, (void*)0x08008EBC }, { 0x321, 0, (void*)0x08008F30 }, { 0x322, 0, (void*)0x08008F60 }, + { 0x323, 0, (void*)0x08008F9C }, { 0x324, 0, (void*)0x08008FFC }, { 0x325, 0, (void*)0x08009044 }, + { 0x326, 0, (void*)0x080090A8 }, { 0x327, 0, (void*)0x080090F8 }, { 0x328, 0, (void*)0x08009140 }, + { 0x329, 0, (void*)0x08009188 }, { 0x32A, 0, (void*)0x080091F0 }, { 0x32B, 0, (void*)0x08009240 }, + { 0x32C, 0, (void*)0x0800928C }, { 0x32D, 0, (void*)0x080092F0 }, { 0x32E, 0, (void*)0x08009318 }, + { 0x32F, 0, (void*)0x08009358 }, { 0x330, 0, (void*)0x0800939C }, { 0x331, 0, (void*)0x080093E4 }, + { 0x332, 0, (void*)0x08009440 }, { 0x333, 0, (void*)0x0800949C }, { 0x334, 0, (void*)0x08009518 }, + { 0x335, 0, (void*)0x0800955C }, { 0x336, 0, (void*)0x08009598 }, { 0x337, 0, (void*)0x08009658 }, + { 0x338, 0, (void*)0x08009680 }, { 0x339, 0, (void*)0x080096A8 }, { 0x33A, 0, (void*)0x080096C8 }, + { 0x33B, 0, (void*)0x080096EC }, { 0x33C, 0, (void*)0x0800973C }, { 0x33D, 0, (void*)0x08009778 }, + { 0x33E, 0, (void*)0x080097BC }, { 0x33F, 0, (void*)0x08009930 }, { 0x340, 0, (void*)0x08009C50 }, + { 0x341, 0, (void*)0x08009CC4 }, { 0x342, 0, (void*)0x08009D30 }, { 0x343, 0, (void*)0x08009D58 }, + { 0x3E8, 0, (void*)0x08009D7C }, { 0x3E9, 0, (void*)0x08009DCC }, { 0x3EA, 0, (void*)0x08009DE8 }, + { 0x3EB, 0, (void*)0x08009E2C }, { 0x3EC, 0, (void*)0x08009E54 }, { 0x3ED, 0, (void*)0x08009EB8 }, + { 0x3EE, 0, (void*)0x08009EFC }, { 0x3EF, 0, (void*)0x08009F6C }, { 0x3F0, 0, (void*)0x08009FA0 }, + { 0x3F1, 0, (void*)0x08009FF0 }, { 0x3F2, 0, (void*)0x0800A030 }, { 0x3F3, 0, (void*)0x0800A090 }, + { 0x3F4, 0, (void*)0x0800A0D0 }, { 0x3F5, 0, (void*)0x0800A0F8 }, { 0x3F6, 0, (void*)0x0800A158 }, + { 0x3F7, 0, (void*)0x0800A190 }, { 0x3F8, 0, (void*)0x0800A1BC }, { 0x3F9, 0, (void*)0x0800A214 }, + { 0x3FA, 0, (void*)0x0800A25C }, { 0x3FB, 0, (void*)0x0800A29C }, { 0x3FC, 0, (void*)0x0800A2D8 }, + { 0x3FD, 0, (void*)0x0800A31C }, { 0x3FE, 0, (void*)0x0800A40C }, { 0x3FF, 0, (void*)0x0800A478 }, + { 0x400, 0, (void*)0x0800A4EC }, { 0x401, 0, (void*)0x0800A528 }, { 0x402, 0, (void*)0x0800A560 }, + { 0x403, 0, (void*)0x0800A5D4 }, { 0x404, 0, (void*)0x0800A608 }, { 0x405, 0, (void*)0x0800A63C }, + { 0x406, 0, (void*)0x0800A680 }, { 0x407, 0, (void*)0x0800A6B8 }, { 0x408, 0, (void*)0x0800A70C }, + { 0x44C, 0, (void*)0x0800A75C }, { 0x44D, 0, (void*)0x0800A850 }, { 0x44E, 0, (void*)0x0800A8B8 }, + { 0x44F, 0, (void*)0x0800A904 }, { 0x450, 0, (void*)0x0800A924 }, { 0x451, 0, (void*)0x0800A974 }, + { 0x452, 0, (void*)0x0800A9E8 }, { 0x453, 0, (void*)0x0800AA24 }, { 0x454, 0, (void*)0x0800AA7C }, + { 0x455, 0, (void*)0x0800AAB4 }, { 0x456, 0, (void*)0x0800AB10 }, { 0x457, 0, (void*)0x0800AB44 }, + { 0x458, 0, (void*)0x0800AB78 }, { 0x459, 0, (void*)0x0800AC0C }, { 0x45A, 0, (void*)0x0800AC84 }, + { 0x45B, 0, (void*)0x0800ACD0 }, { 0x45C, 0, (void*)0x0800AD4C }, { 0x45D, 0, (void*)0x0800ADC8 }, + { 0x45E, 0, (void*)0x0800AE68 }, { 0x45F, 0, (void*)0x0800AEBC }, { 0x460, 0, (void*)0x0800AF54 }, + { 0x461, 0, (void*)0x0800AF98 }, { 0x462, 0, (void*)0x0800AFC8 }, { 0x463, 0, (void*)0x0800AFE8 }, + { 0x464, 0, (void*)0x0800B044 }, { 0x465, 0, (void*)0x0800B094 }, { 0x466, 0, (void*)0x0800B0CC }, + { 0x467, 0, (void*)0x0800B0FC }, { 0x468, 0, (void*)0x0800B178 }, { 0x469, 0, (void*)0x0800B1B8 }, + { 0x46A, 0, (void*)0x0800B1F0 }, { 0x46B, 0, (void*)0x0800B244 }, { 0x46C, 0, (void*)0x0800B258 }, + { 0x46D, 0, (void*)0x0800B2B4 }, { 0x46E, 0, (void*)0x0800B324 }, { 0x46F, 0, (void*)0x0800B374 }, + { 0x470, 0, (void*)0x0800B3A8 }, { 0x471, 0, (void*)0x0800B3F4 }, { 0x472, 0, (void*)0x0800B428 }, + { 0x473, 0, (void*)0x0800B484 }, { 0x474, 0, (void*)0x0800B4A4 }, { 0x475, 0, (void*)0x0800B514 }, + { 0x476, 0, (void*)0x0800B570 }, { 0x477, 0, (void*)0x0800B5FC }, { 0x478, 0, (void*)0x0800B65C }, + { 0x479, 0, (void*)0x0800B6CC }, { 0x47A, 0, (void*)0x0800B6FC }, { 0x47B, 0, (void*)0x0800B760 }, + { 0x47C, 0, (void*)0x0800B78C }, { 0x47D, 0, (void*)0x0800B7DC }, { 0x47E, 0, (void*)0x0800B82C }, + { 0x4B0, 0, (void*)0x0800B854 }, { 0x4B1, 0, (void*)0x0800B8B0 }, { 0x4B2, 0, (void*)0x0800B8F8 }, + { 0x4B3, 0, (void*)0x0800B93C }, { 0x4B4, 0, (void*)0x0800B994 }, { 0x4B5, 0, (void*)0x0800B9D0 }, + { 0x4B6, 0, (void*)0x0800BA04 }, { 0x4B7, 0, (void*)0x0800BA94 }, { 0x4B8, 0, (void*)0x0800BAC4 }, + { 0x4B9, 0, (void*)0x0800BB4C }, { 0x4BA, 0, (void*)0x0800BB7C }, { 0x4BB, 0, (void*)0x0800BBFC }, + { 0x4BC, 0, (void*)0x0800BC28 }, { 0x4BD, 0, (void*)0x0800BCA4 }, { 0x4BE, 0, (void*)0x0800BCD0 }, + { 0x4BF, 0, (void*)0x0800BD58 }, { 0x4C0, 0, (void*)0x0800BD84 }, { 0x4C1, 0, (void*)0x0800BE18 }, + { 0x4C2, 0, (void*)0x0800BE54 }, { 0x4C3, 0, (void*)0x0800BED0 }, { 0x4C4, 0, (void*)0x0800BEEC }, + { 0x4C5, 0, (void*)0x0800BF5C }, { 0x4C6, 0, (void*)0x0800BF78 }, { 0x4C7, 0, (void*)0x0800BFF4 }, + { 0x4C8, 0, (void*)0x0800C018 }, { 0x4C9, 0, (void*)0x0800C0A4 }, { 0x4CA, 0, (void*)0x0800C0D8 }, + { 0x4CB, 0, (void*)0x0800C140 }, { 0x4CC, 0, (void*)0x0800C158 }, { 0x4CD, 0, (void*)0x0800C1E0 }, + { 0x4CE, 0, (void*)0x0800C220 }, { 0x4CF, 0, (void*)0x0800C29C }, { 0x4D0, 0, (void*)0x0800C2D0 }, + { 0x4D1, 0, (void*)0x0800C34C }, { 0x4D2, 0, (void*)0x0800C378 }, { 0x4D3, 0, (void*)0x0800C400 }, + { 0x4D4, 0, (void*)0x0800C448 }, { 0x4D5, 0, (void*)0x0800C4BC }, { 0x4D6, 0, (void*)0x0800C4E0 }, + { 0x4D7, 0, (void*)0x0800C560 }, { 0x4D8, 0, (void*)0x0800C598 }, { 0x4D9, 0, (void*)0x0800C604 }, + { 0x4DA, 0, (void*)0x0800C63C }, { 0x4DB, 0, (void*)0x0800C6B4 }, { 0x4DC, 0, (void*)0x0800C714 }, + { 0x4DD, 0, (void*)0x0800C784 }, { 0x4DE, 0, (void*)0x0800C7B4 }, { 0x4DF, 0, (void*)0x0800C81C }, + { 0x4E0, 0, (void*)0x0800C840 }, { 0x4E1, 0, (void*)0x0800C8AC }, { 0x4E2, 0, (void*)0x0800C8CC }, + { 0x4E3, 0, (void*)0x0800C95C }, { 0x4E4, 0, (void*)0x0800C990 }, { 0x4E5, 0, (void*)0x0800CA04 }, + { 0x4E6, 0, (void*)0x0800CA20 }, { 0x4E7, 0, (void*)0x0800CA9C }, { 0x4E8, 0, (void*)0x0800CAC0 }, + { 0x4E9, 0, (void*)0x0800CB48 }, { 0x4EA, 0, (void*)0x0800CB64 }, { 0x4EB, 0, (void*)0x0800CBE8 }, + { 0x4EC, 0, (void*)0x0800CC04 }, { 0x4ED, 0, (void*)0x0800CC64 }, { 0x4EE, 0, (void*)0x0800CC88 }, + { 0x4EF, 0, (void*)0x0800CCE8 }, { 0x4F0, 0, (void*)0x0800CD0C }, { 0x4F1, 0, (void*)0x0800CD7C }, + { 0x514, 0, (void*)0x0800CDA4 }, { 0x515, 0, (void*)0x0800CED0 }, { 0x516, 0, (void*)0x0800CFE8 }, + { 0x517, 0, (void*)0x0800D094 }, { 0x518, 0, (void*)0x0800D128 }, { 0x519, 0, (void*)0x0800D1C8 }, + { 0x51A, 0, (void*)0x0800D254 }, { 0x51B, 0, (void*)0x0800D2A8 }, { 0x51C, 0, (void*)0x0800D318 }, + { 0x51D, 0, (void*)0x0800D360 }, { 0x51E, 0, (void*)0x0800D3D0 }, { 0x51F, 0, (void*)0x0800D418 }, + { 0x520, 0, (void*)0x0800D488 }, { 0x521, 0, (void*)0x0800D534 }, { 0x522, 0, (void*)0x0800D5BC }, + { 0x523, 0, (void*)0x0800D65C }, { 0x524, 0, (void*)0x0800D6E4 }, { 0x525, 0, (void*)0x0800D728 }, + { 0x526, 0, (void*)0x0800D794 }, { 0x527, 0, (void*)0x0800D7D0 }, { 0x528, 0, (void*)0x0800D834 }, + { 0x529, 0, (void*)0x0800D878 }, { 0x52A, 0, (void*)0x0800D8E4 }, { 0x52B, 0, (void*)0x0800D98C }, + { 0x52C, 0, (void*)0x0800DA2C }, { 0x52D, 0, (void*)0x0800DAC8 }, { 0x52E, 0, (void*)0x0800DB6C }, + { 0x52F, 0, (void*)0x0800DBD4 }, { 0x530, 0, (void*)0x0800DC5C }, { 0x531, 0, (void*)0x0800DCC4 }, + { 0x532, 0, (void*)0x0800DD54 }, { 0x533, 0, (void*)0x0800DDA4 }, { 0x534, 0, (void*)0x0800DE1C }, + { 0x535, 0, (void*)0x0800DEC8 }, { 0x536, 0, (void*)0x0800DF50 }, { 0x537, 0, (void*)0x0800DFF0 }, + { 0x538, 0, (void*)0x0800E078 }, { 0x539, 0, (void*)0x0800E0BC }, { 0x53A, 0, (void*)0x0800E128 }, + { 0x53B, 0, (void*)0x0800E16C }, { 0x53C, 0, (void*)0x0800E1D8 }, { 0x53D, 0, (void*)0x0800E21C }, + { 0x53E, 0, (void*)0x0800E288 }, { 0x53F, 0, (void*)0x0800E334 }, { 0x540, 0, (void*)0x0800E414 }, + { 0x541, 0, (void*)0x0800E474 }, { 0x542, 0, (void*)0x0800E50C }, { 0x543, 0, (void*)0x0800E57C }, + { 0x544, 0, (void*)0x0800E614 }, { 0x545, 0, (void*)0x0800E678 }, { 0x546, 0, (void*)0x0800E728 }, + { 0x547, 0, (void*)0x0800E794 }, { 0x548, 0, (void*)0x0800E7F4 }, { 0x549, 0, (void*)0x0800E86C }, + { 0x54A, 0, (void*)0x0800E8D8 }, { 0x54B, 0, (void*)0x0800E934 }, { 0x54C, 0, (void*)0x0800E9B4 }, + { 0x54D, 0, (void*)0x0800EA28 }, { 0x54E, 0, (void*)0x0800EB08 }, { 0x54F, 0, (void*)0x0800EB60 }, + { 0x550, 0, (void*)0x0800EBC8 }, { 0x551, 0, (void*)0x0800EC2C }, { 0x552, 0, (void*)0x0800ECAC }, + { 0x553, 0, (void*)0x0800ED1C }, { 0x554, 0, (void*)0x0800ED9C }, { 0x555, 0, (void*)0x0800EE00 }, + { 0x556, 0, (void*)0x0800EEEC }, { 0x557, 0, (void*)0x0800EF4C }, { 0x558, 0, (void*)0x0800EFBC }, + { 0x559, 0, (void*)0x0800F03C }, { 0x55A, 0, (void*)0x0800F0B4 }, { 0x55B, 0, (void*)0x0800F110 }, + { 0x55C, 0, (void*)0x0800F188 }, { 0x55D, 0, (void*)0x0800F258 }, { 0x55E, 0, (void*)0x0800F300 }, + { 0x55F, 0, (void*)0x0800F398 }, { 0x560, 0, (void*)0x0800F44C }, { 0x561, 0, (void*)0x0800F570 }, + { 0x562, 0, (void*)0x0800F688 }, { 0x563, 0, (void*)0x0800F7A8 }, { 0x564, 0, (void*)0x0800F8B8 }, + { 0x565, 0, (void*)0x0800F9D8 }, { 0x566, 0, (void*)0x0800FAEC }, { 0x567, 0, (void*)0x0800FB84 }, + { 0x568, 0, (void*)0x0800FC34 }, { 0x569, 0, (void*)0x0800FCC8 }, { 0x56A, 0, (void*)0x0800FD78 }, + { 0x56B, 0, (void*)0x0800FE0C }, { 0x56C, 0, (void*)0x0800FEBC }, { 0x56D, 0, (void*)0x08010008 }, + { 0x56E, 0, (void*)0x08010168 }, { 0x56F, 0, (void*)0x080102C4 }, { 0x570, 0, (void*)0x0801042C }, + { 0x571, 0, (void*)0x08010584 }, { 0x572, 0, (void*)0x080106EC }, { 0x573, 0, (void*)0x08010844 }, + { 0x578, 0, (void*)0x080109A4 }, { 0x579, 0, (void*)0x08010A70 }, { 0x57A, 0, (void*)0x08010B28 }, + { 0x57B, 0, (void*)0x08010C7C }, { 0x57C, 0, (void*)0x08010D98 }, { 0x57D, 0, (void*)0x08010EC4 }, + { 0x57E, 0, (void*)0x08010FF4 }, { 0x57F, 0, (void*)0x080110E4 }, { 0x580, 0, (void*)0x080111D0 }, + { 0x582, 0, (void*)0x08011260 }, { 0x583, 0, (void*)0x08011304 }, { 0x584, 0, (void*)0x08011374 }, + { 0x585, 0, (void*)0x08011408 }, { 0x586, 0, (void*)0x080114BC }, { 0x587, 0, (void*)0x08011528 }, + { 0x588, 0, (void*)0x080115C0 }, { 0x589, 0, (void*)0x08011674 }, { 0x58A, 0, (void*)0x080116E4 }, + { 0x58B, 0, (void*)0x08011760 }, { 0x58C, 0, (void*)0x08011820 }, { 0x58D, 0, (void*)0x08011884 }, + { 0x58E, 0, (void*)0x0801192C }, { 0x58F, 0, (void*)0x08011A20 }, { 0x590, 0, (void*)0x08011B08 }, + { 0x591, 0, (void*)0x08011B68 }, { 0x592, 0, (void*)0x08011BA4 }, { 0x593, 0, (void*)0x08011BE4 }, + { 0x594, 0, (void*)0x08011C20 }, { 0x595, 0, (void*)0x08011D00 }, { 0x59C, 0, (void*)0x08011DC8 }, + { 0x59D, 0, (void*)0x08011E78 }, { 0x59E, 0, (void*)0x08011EB4 }, { 0x59F, 0, (void*)0x08011EFC }, + { 0x5A0, 0, (void*)0x08011FB4 }, { 0x5A1, 0, (void*)0x08012068 }, { 0x5A2, 0, (void*)0x080120A4 }, + { 0x5A3, 0, (void*)0x080120E4 }, { 0x5A4, 0, (void*)0x08012198 }, { 0x5A5, 0, (void*)0x08012248 }, + { 0x5A6, 0, (void*)0x08012284 }, { 0x5A7, 0, (void*)0x080122C4 }, { 0x5A8, 0, (void*)0x08012380 }, + { 0x5A9, 0, (void*)0x0801243C }, { 0x5AA, 0, (void*)0x08012478 }, { 0x5DC, 0, (void*)0x080124B8 }, + { 0x5DD, 0, (void*)0x08012548 }, { 0x5DE, 0, (void*)0x080125BC }, { 0x5DF, 0, (void*)0x08012678 }, + { 0x5E0, 0, (void*)0x08012730 }, { 0x5E1, 0, (void*)0x0801276C }, { 0x5E2, 0, (void*)0x08012784 }, + { 0x5E3, 0, (void*)0x080127C4 }, { 0x5E4, 0, (void*)0x080128A8 }, { 0x5E5, 0, (void*)0x080128E0 }, + { 0x5E6, 0, (void*)0x0801294C }, { 0x5E7, 0, (void*)0x08012970 }, { 0x5E8, 0, (void*)0x080129A4 }, + { 0x5E9, 0, (void*)0x08012A5C }, { 0x5EA, 0, (void*)0x08012ACC }, { 0x5EB, 0, (void*)0x08012B4C }, + { 0x5EC, 0, (void*)0x08012BF0 }, { 0x5ED, 0, (void*)0x08012CE0 }, { 0x5EE, 0, (void*)0x08012D84 }, + { 0x5EF, 0, (void*)0x08012DE4 }, { 0x5F0, 0, (void*)0x08012E1C }, { 0x5F1, 0, (void*)0x08012E7C }, + { 0x5F2, 0, (void*)0x08012EF0 }, { 0x5F3, 0, (void*)0x08012FAC }, { 0x5F4, 0, (void*)0x08013060 }, + { 0x5F5, 0, (void*)0x080130F4 }, { 0x5F6, 0, (void*)0x0801315C }, { 0x5F7, 0, (void*)0x08013210 }, + { 0x5F8, 0, (void*)0x08013258 }, { 0x60E, 0, (void*)0x080132B0 }, { 0x60F, 0, (void*)0x08013368 }, + { 0x610, 0, (void*)0x08013470 }, { 0x611, 0, (void*)0x08013530 }, { 0x612, 0, (void*)0x080135F8 }, + { 0x613, 0, (void*)0x08013680 }, { 0x614, 0, (void*)0x080137D0 }, { 0x615, 0, (void*)0x0801386C }, + { 0x616, 0, (void*)0x08013944 }, { 0x617, 0, (void*)0x080139B8 }, { 0x618, 0, (void*)0x08013A44 }, + { 0x619, 0, (void*)0x08013AA8 }, { 0x61A, 0, (void*)0x08013BFC }, { 0x61B, 0, (void*)0x08013C5C }, + { 0x61C, 0, (void*)0x08013CB0 }, { 0x61D, 0, (void*)0x08013D00 }, { 0x61E, 0, (void*)0x08013D60 }, + { 0x61F, 0, (void*)0x08013DAC }, { 0x620, 0, (void*)0x08013DEC }, { 0x621, 0, (void*)0x08013E4C }, + { 0x622, 0, (void*)0x08013E80 }, { 0x623, 0, (void*)0x08013ED8 }, { 0x624, 0, (void*)0x08013F24 }, + { 0x625, 0, (void*)0x08013FEC }, { 0x626, 0, (void*)0x08014010 }, { 0x627, 0, (void*)0x08014064 }, + { 0x628, 0, (void*)0x080140C4 }, { 0x629, 0, (void*)0x08014170 }, { 0x62A, 0, (void*)0x08014208 }, + { 0x62B, 0, (void*)0x080142D0 }, { 0x62C, 0, (void*)0x08014398 }, { 0x640, 0, (void*)0x0801454C }, + { 0x641, 0, (void*)0x0801458C }, { 0x642, 0, (void*)0x080145B4 }, { 0x644, 0, (void*)0x080145F0 }, + { 0x645, 0, (void*)0x08014608 }, { 0x646, 0, (void*)0x08014648 }, { 0x647, 0, (void*)0x080146B0 }, + { 0x648, 0, (void*)0x080146D4 }, { 0x649, 0, (void*)0x08014760 }, { 0x64A, 0, (void*)0x08014798 }, + { 0x64B, 0, (void*)0x08014850 }, { 0x64C, 0, (void*)0x08014898 }, { 0x64D, 0, (void*)0x080148B4 }, + { 0x64E, 0, (void*)0x08014924 }, { 0x64F, 0, (void*)0x08014988 }, { 0x650, 0, (void*)0x080149F0 }, + { 0x651, 0, (void*)0x08014A50 }, { 0x652, 0, (void*)0x08014A8C }, { 0x653, 0, (void*)0x08014AF4 }, + { 0x654, 0, (void*)0x08014B34 }, { 0x655, 0, (void*)0x08014B9C }, { 0x656, 0, (void*)0x08014BD8 }, + { 0x657, 0, (void*)0x08014C38 }, { 0x658, 0, (void*)0x08014C78 }, { 0x659, 0, (void*)0x08014CBC }, + { 0x65A, 0, (void*)0x08014D10 }, { 0x65B, 0, (void*)0x08014D94 }, { 0x65C, 0, (void*)0x08014E68 }, + { 0x65D, 0, (void*)0x08014F18 }, { 0x65E, 0, (void*)0x08014F5C }, { 0x65F, 0, (void*)0x08014F88 }, + { 0x660, 0, (void*)0x08014FD0 }, { 0x661, 0, (void*)0x08015024 }, { 0x662, 0, (void*)0x080150F0 }, + { 0x663, 0, (void*)0x08015188 }, { 0x664, 0, (void*)0x080151AC }, { 0x665, 0, (void*)0x080151E4 }, + { 0x666, 0, (void*)0x08015248 }, { 0x667, 0, (void*)0x0801529C }, { 0x668, 0, (void*)0x080152CC }, + { 0x669, 0, (void*)0x0801532C }, { 0x66A, 0, (void*)0x08015390 }, { 0x66B, 0, (void*)0x080153E4 }, + { 0x66C, 0, (void*)0x08015450 }, { 0x66D, 0, (void*)0x080154BC }, { 0x66E, 0, (void*)0x08015550 }, + { 0x66F, 0, (void*)0x080155C0 }, { 0x670, 0, (void*)0x08015600 }, { 0x671, 0, (void*)0x08015634 }, + { 0x672, 0, (void*)0x0801568C }, { 0x673, 0, (void*)0x080156C8 }, { 0x674, 0, (void*)0x0801574C }, + { 0x675, 0, (void*)0x08015784 }, { 0x676, 0, (void*)0x080157F8 }, { 0x677, 0, (void*)0x0801588C }, + { 0x678, 0, (void*)0x080158E4 }, { 0x679, 0, (void*)0x08015940 }, { 0x67A, 0, (void*)0x08015994 }, + { 0x67B, 0, (void*)0x080159E8 }, { 0x67C, 0, (void*)0x08015A48 }, { 0x67D, 0, (void*)0x08015B58 }, + { 0x67E, 0, (void*)0x08015C04 }, { 0x67F, 0, (void*)0x08015C50 }, { 0x680, 0, (void*)0x08015D64 }, + { 0x681, 0, (void*)0x08015E40 }, { 0x682, 0, (void*)0x08015ED0 }, { 0x683, 0, (void*)0x08015F00 }, + { 0x684, 0, (void*)0x08015F90 }, { 0x685, 0, (void*)0x08015FCC }, { 0x686, 0, (void*)0x08016020 }, + { 0x687, 0, (void*)0x08016078 }, { 0x688, 0, (void*)0x080160AC }, { 0x689, 0, (void*)0x08016104 }, + { 0x68A, 0, (void*)0x08016130 }, { 0x6A4, 0, (void*)0x08016184 }, { 0x6A5, 0, (void*)0x080161B8 }, + { 0x6A6, 0, (void*)0x0801620C }, { 0x6A7, 0, (void*)0x08016248 }, { 0x6A8, 0, (void*)0x080162A0 }, + { 0x6A9, 0, (void*)0x080162C8 }, { 0x6AA, 0, (void*)0x0801634C }, { 0x6AB, 0, (void*)0x08016398 }, + { 0x6AC, 0, (void*)0x080163FC }, { 0x6AD, 0, (void*)0x08016478 }, { 0x6AE, 0, (void*)0x080164B4 }, + { 0x6AF, 0, (void*)0x08016508 }, { 0x6B0, 0, (void*)0x08016548 }, { 0x6B1, 0, (void*)0x080165C0 }, + { 0x6B2, 0, (void*)0x08016600 }, { 0x6B3, 0, (void*)0x08016674 }, { 0x6B4, 0, (void*)0x080166B4 }, + { 0x6B5, 0, (void*)0x0801671C }, { 0x6B6, 0, (void*)0x08016758 }, { 0x6B7, 0, (void*)0x080167C0 }, + { 0x6B8, 0, (void*)0x080167F8 }, { 0x6B9, 0, (void*)0x08016858 }, { 0x6BA, 0, (void*)0x08016894 }, + { 0x6BB, 0, (void*)0x08016900 }, { 0x6BC, 0, (void*)0x0801693C }, { 0x6BD, 0, (void*)0x0801698C }, + { 0x6BE, 0, (void*)0x080169CC }, { 0x6BF, 0, (void*)0x08016A04 }, { 0x6C0, 0, (void*)0x08016A28 }, + { 0x6C1, 0, (void*)0x08016A7C }, { 0x6C2, 0, (void*)0x08016A98 }, { 0x6C3, 0, (void*)0x08016AC8 }, + { 0x6C4, 0, (void*)0x08016AE4 }, { 0x6C5, 0, (void*)0x08016B2C }, { 0x6C6, 0, (void*)0x08016B84 }, + { 0x6C7, 0, (void*)0x08016BC8 }, { 0x6C8, 0, (void*)0x08016BE0 }, { 0x6C9, 0, (void*)0x08016C34 }, + { 0x6CA, 0, (void*)0x08016C94 }, { 0x6CB, 0, (void*)0x08016CD0 }, { 0x6CC, 0, (void*)0x08016D24 }, + { 0x6CD, 0, (void*)0x08016D64 }, { 0x6CE, 0, (void*)0x08016DC8 }, { 0x6CF, 0, (void*)0x08016E08 }, + { 0x6D0, 0, (void*)0x08016E6C }, { 0x6D1, 0, (void*)0x08016EAC }, { 0x6D2, 0, (void*)0x08016F14 }, + { 0x6D3, 0, (void*)0x08016F50 }, { 0x6D4, 0, (void*)0x08016FD0 }, { 0x6D5, 0, (void*)0x08017008 }, + { 0x6D6, 0, (void*)0x08017084 }, { 0x6D7, 0, (void*)0x080170C0 }, { 0x6D8, 0, (void*)0x08017110 }, + { 0x6D9, 0, (void*)0x0801714C }, { 0x6DA, 0, (void*)0x080171A4 }, { 0x6DB, 0, (void*)0x080171E0 }, + { 0x6DC, 0, (void*)0x08017218 }, { 0x6DD, 0, (void*)0x08017264 }, { 0x6DE, 0, (void*)0x080172E0 }, + { 0x708, 0, (void*)0x08017330 }, { 0x709, 0, (void*)0x080173C4 }, { 0x70A, 0, (void*)0x0801741C }, + { 0x70B, 0, (void*)0x080174B4 }, { 0x70C, 0, (void*)0x0801753C }, { 0x70D, 0, (void*)0x08017564 }, + { 0x70E, 0, (void*)0x0801758C }, { 0x70F, 0, (void*)0x080175FC }, { 0x710, 0, (void*)0x08017650 }, + { 0x711, 0, (void*)0x08017748 }, { 0x712, 0, (void*)0x0801775C }, { 0x713, 0, (void*)0x080177B0 }, + { 0x714, 0, (void*)0x080177D8 }, { 0x715, 0, (void*)0x0801781C }, { 0x716, 0, (void*)0x0801787C }, + { 0x717, 0, (void*)0x08017A6C }, { 0x718, 0, (void*)0x08017AB8 }, { 0x719, 0, (void*)0x08017AE8 }, + { 0x71A, 0, (void*)0x08017B48 }, { 0x71B, 0, (void*)0x08017BA0 }, { 0x721, 0, (void*)0x08017C00 }, + { 0x722, 0, (void*)0x08017C44 }, { 0x723, 0, (void*)0x08017C84 }, { 0x724, 0, (void*)0x08017CC4 }, + { 0x725, 0, (void*)0x08017D04 }, { 0x726, 0, (void*)0x08017D90 }, { 0x727, 0, (void*)0x08017DE4 }, + { 0x728, 0, (void*)0x08017DF0 }, { 0x729, 0, (void*)0x08017E50 }, { 0x72A, 0, (void*)0x08017E9C }, + { 0x72B, 0, (void*)0x08017F08 }, { 0x72C, 0, (void*)0x08017F5C }, { 0x72D, 0, (void*)0x08017F8C }, + { 0x72E, 0, (void*)0x08017FC8 }, { 0x72F, 0, (void*)0x0801800C }, { 0x730, 0, (void*)0x08018064 }, + { 0x731, 0, (void*)0x080180A0 }, { 0x732, 0, (void*)0x080180E8 }, { 0x733, 0, (void*)0x08018104 }, + { 0x734, 0, (void*)0x08018188 }, { 0x735, 0, (void*)0x08018240 }, { 0x736, 0, (void*)0x080182A8 }, + { 0x737, 0, (void*)0x080182E4 }, { 0x738, 0, (void*)0x080184D0 }, { 0x73A, 0, (void*)0x08018510 }, + { 0x73B, 0, (void*)0x08018594 }, { 0x73C, 0, (void*)0x08018618 }, { 0x73D, 0, (void*)0x080186B0 }, + { 0x73E, 0, (void*)0x0801876C }, { 0x73F, 0, (void*)0x08018818 }, { 0x740, 0, (void*)0x080188CC }, + { 0x741, 0, (void*)0x08018908 }, { 0x742, 0, (void*)0x08018938 }, { 0x743, 0, (void*)0x080189A0 }, + { 0x744, 0, (void*)0x08018A00 }, { 0x745, 0, (void*)0x08018A90 }, { 0x746, 0, (void*)0x08018B4C }, + { 0x747, 0, (void*)0x08018C18 }, { 0x748, 0, (void*)0x08018C8C }, { 0x749, 0, (void*)0x08018CE0 }, + { 0x74A, 0, (void*)0x08018D78 }, { 0x74B, 0, (void*)0x08018DD0 }, { 0x74C, 0, (void*)0x08018E38 }, + { 0x74D, 0, (void*)0x08018E78 }, { 0x74E, 0, (void*)0x08018EC0 }, { 0x74F, 0, (void*)0x08018F38 }, + { 0x750, 0, (void*)0x08018FF4 }, { 0x751, 0, (void*)0x08019014 }, { 0x752, 0, (void*)0x0801910C }, + { 0x753, 0, (void*)0x08019160 }, { 0x754, 0, (void*)0x080191A4 }, { 0x755, 0, (void*)0x080191FC }, + { 0x756, 0, (void*)0x08019254 }, { 0x757, 0, (void*)0x0801927C }, { 0x758, 0, (void*)0x080192E8 }, + { 0x759, 0, (void*)0x08019354 }, { 0x75A, 0, (void*)0x0801939C }, { 0x76C, 0, (void*)0x0801941C }, + { 0x76D, 0, (void*)0x08019468 }, { 0x76E, 0, (void*)0x080194BC }, { 0x76F, 0, (void*)0x080194F8 }, + { 0x770, 0, (void*)0x08019530 }, { 0x771, 0, (void*)0x0801956C }, { 0x772, 0, (void*)0x080195A4 }, + { 0x773, 0, (void*)0x080195DC }, { 0x774, 0, (void*)0x08019620 }, { 0x775, 0, (void*)0x08019654 }, + { 0x776, 0, (void*)0x08019688 }, { 0x777, 0, (void*)0x080196A4 }, { 0x778, 0, (void*)0x080196F0 }, + { 0x779, 0, (void*)0x080197A4 }, { 0x77A, 0, (void*)0x080197C0 }, { 0x77B, 0, (void*)0x080197E4 }, + { 0x77C, 0, (void*)0x0801982C }, { 0x77D, 0, (void*)0x08019854 }, { 0x7D0, 0, (void*)0x08019878 }, + { 0x7D1, 0, (void*)0x080198BC }, { 0x7D2, 0, (void*)0x080199A8 }, { 0x7D3, 0, (void*)0x080199BC }, + { 0x7D4, 0, (void*)0x080199E4 }, { 0x7D5, 0, (void*)0x08019AD8 }, { 0x7D6, 0, (void*)0x08019B10 }, + { 0x7D7, 0, (void*)0x08019B28 }, { 0x7D8, 0, (void*)0x08019BA4 }, { 0x7D9, 0, (void*)0x08019BC8 }, + { 0x7DC, 0, (void*)0x08019C20 }, { 0x7DD, 0, (void*)0x08019C40 }, { 0x7DE, 0, (void*)0x08019C60 }, + { 0x800, 0, (void*)0x08019C80 }, { 0x801, 0, (void*)0x08019D44 }, { 0x802, 0, (void*)0x08019DD0 }, + { 0x803, 0, (void*)0x08019E24 }, { 0x804, 0, (void*)0x08019E44 }, { 0x806, 0, (void*)0x08019F84 }, + { 0x807, 0, (void*)0x0801A0F0 }, { 0x80B, 0, (void*)0x0801A0FC }, { 0x80C, 0, (void*)0x0801A144 }, + { 0x80D, 0, (void*)0x0801A1AC }, { 0x80E, 0, (void*)0x0801A218 }, { 0x80F, 0, (void*)0x0801A288 }, + { 0x810, 0, (void*)0x0801A320 }, { 0x811, 0, (void*)0x0801A348 }, { 0x820, 0, (void*)0x0801A378 }, + { 0x821, 0, (void*)0x0801A3B4 }, { 0x822, 0, (void*)0x0801A408 }, { 0x823, 0, (void*)0x0801A484 }, + { 0x824, 0, (void*)0x0801A4D4 }, { 0x825, 0, (void*)0x0801A538 }, { 0x826, 0, (void*)0x0801A5A8 }, + { 0x827, 0, (void*)0x0801A614 }, { 0x828, 0, (void*)0x0801A654 }, { 0x829, 0, (void*)0x0801A680 }, + { 0x82A, 0, (void*)0x0801A6EC }, { 0x82B, 0, (void*)0x0801A740 }, { 0x82C, 0, (void*)0x0801A79C }, + { 0x82D, 0, (void*)0x0801A808 }, { 0x82E, 0, (void*)0x0801A868 }, { 0x82F, 0, (void*)0x0801A894 }, + { 0x830, 0, (void*)0x0801A918 }, { 0x831, 0, (void*)0x0801A968 }, { 0x832, 0, (void*)0x0801A9DC }, + { 0x833, 0, (void*)0x0801AA5C }, { 0x834, 0, (void*)0x0801AA80 }, { 0x835, 0, (void*)0x0801AAD0 }, + { 0x836, 0, (void*)0x0801AB60 }, { 0x838, 0, (void*)0x0801AC28 }, { 0x839, 0, (void*)0x0801AC7C }, + { 0x83A, 0, (void*)0x0801AD18 }, { 0x83B, 0, (void*)0x0801AD48 }, { 0x83C, 0, (void*)0x0801ADC4 }, + { 0x83D, 0, (void*)0x0801AE2C }, { 0x83E, 0, (void*)0x0801AE84 }, { 0x83F, 0, (void*)0x0801AEC4 }, + { 0x840, 0, (void*)0x0801AF0C }, { 0x841, 0, (void*)0x0801AF48 }, { 0x842, 0, (void*)0x0801AFA4 }, + { 0x843, 0, (void*)0x0801AFE4 }, { 0x844, 0, (void*)0x0801B054 }, { 0x845, 0, (void*)0x0801B090 }, + { 0x846, 0, (void*)0x0801B0CC }, { 0x847, 0, (void*)0x0801B114 }, { 0x848, 0, (void*)0x0801B168 }, + { 0x849, 0, (void*)0x0801B190 }, { 0x84A, 0, (void*)0x0801B210 }, { 0x84B, 0, (void*)0x0801B278 }, + { 0x84C, 0, (void*)0x0801B2BC }, { 0x84D, 0, (void*)0x0801B310 }, { 0x84E, 0, (void*)0x0801B380 }, + { 0x84F, 0, (void*)0x0801B3A4 }, { 0x850, 0, (void*)0x0801B3CC }, { 0x851, 0, (void*)0x0801B47C }, + { 0x852, 0, (void*)0x0801B488 }, { 0x853, 0, (void*)0x0801B4B4 }, { 0x854, 0, (void*)0x0801B5C4 }, + { 0x855, 0, (void*)0x0801B608 }, { 0x856, 0, (void*)0x0801B678 }, { 0x857, 0, (void*)0x0801B6D8 }, + { 0x858, 0, (void*)0x0801B718 }, { 0x859, 0, (void*)0x0801B78C }, { 0x85A, 0, (void*)0x0801B810 }, + { 0x85B, 0, (void*)0x0801B85C }, { 0x85C, 0, (void*)0x0801B8C4 }, { 0x85D, 0, (void*)0x0801B8F4 }, + { 0x85E, 0, (void*)0x0801B900 }, { 0x85F, 0, (void*)0x0801B92C }, { 0x860, 0, (void*)0x0801B968 }, + { 0x861, 0, (void*)0x0801B994 }, { 0x862, 0, (void*)0x0801B9E0 }, { 0x863, 0, (void*)0x0801BA6C }, + { 0x864, 0, (void*)0x0801BACC }, { 0x865, 0, (void*)0x0801BB18 }, { 0x866, 0, (void*)0x0801BB8C }, + { 0x867, 0, (void*)0x0801BBA4 }, { 0x868, 0, (void*)0x0801BC0C }, { 0x869, 0, (void*)0x0801BC88 }, + { 0x86A, 0, (void*)0x0801BCC0 }, { 0x86B, 0, (void*)0x0801BD30 }, { 0x86C, 0, (void*)0x0801BD90 }, + { 0x86D, 0, (void*)0x0801BDD4 }, { 0x86E, 0, (void*)0x0801BE60 }, { 0x86F, 0, (void*)0x0801BF1C }, + { 0x870, 0, (void*)0x0801BF40 }, { 0x871, 0, (void*)0x0801BF90 }, { 0x872, 0, (void*)0x0801BFB0 }, + { 0x873, 0, (void*)0x0801C004 }, { 0x874, 0, (void*)0x0801C038 }, { 0x875, 0, (void*)0x0801C0A0 }, + { 0x876, 0, (void*)0x0801C0F8 }, { 0x877, 0, (void*)0x0801C170 }, { 0x878, 0, (void*)0x0801C1E0 }, + { 0x879, 0, (void*)0x0801C23C }, { 0x87A, 0, (void*)0x0801C2A0 }, { 0x87B, 0, (void*)0x0801C2D4 }, + { 0x87C, 0, (void*)0x0801C314 }, { 0x87D, 0, (void*)0x0801C384 }, { 0x87E, 0, (void*)0x0801C3DC }, + { 0x87F, 0, (void*)0x0801C43C }, { 0x880, 0, (void*)0x0801C494 }, { 0x881, 0, (void*)0x0801C504 }, + { 0x882, 0, (void*)0x0801C580 }, { 0x883, 0, (void*)0x0801C5E8 }, { 0x884, 0, (void*)0x0801C694 }, + { 0x885, 0, (void*)0x0801C6DC }, { 0x886, 0, (void*)0x0801C73C }, { 0x887, 0, (void*)0x0801C798 }, + { 0x888, 0, (void*)0x0801C7EC }, { 0x889, 0, (void*)0x0801C824 }, { 0x88A, 0, (void*)0x0801C86C }, + { 0x88B, 0, (void*)0x0801C890 }, { 0x88C, 0, (void*)0x0801C8C4 }, { 0x88D, 0, (void*)0x0801C914 }, + { 0x88E, 0, (void*)0x0801C98C }, { 0x88F, 0, (void*)0x0801CA00 }, { 0x890, 0, (void*)0x0801CA40 }, + { 0x898, 0, (void*)0x0801CADC }, { 0x899, 0, (void*)0x0801CB1C }, { 0x89A, 0, (void*)0x0801CB60 }, + { 0x89B, 0, (void*)0x0801CC18 }, { 0x89C, 0, (void*)0x0801CC74 }, { 0x89D, 0, (void*)0x0801CCCC }, + { 0x89E, 0, (void*)0x0801CD40 }, { 0x89F, 0, (void*)0x0801CDA0 }, { 0x8A0, 0, (void*)0x0801CDE8 }, + { 0x8A1, 0, (void*)0x0801CE44 }, { 0x8A2, 0, (void*)0x0801CEB0 }, { 0x8A3, 0, (void*)0x0801CF0C }, + { 0x8A4, 0, (void*)0x0801CF38 }, { 0x8A5, 0, (void*)0x0801CFD0 }, { 0x8CA, 0, (void*)0x0801D010 }, + { 0x8CB, 0, (void*)0x0801D0E0 }, { 0x8CC, 0, (void*)0x0801D108 }, { 0x8CD, 0, (void*)0x0801D138 }, + { 0x8CE, 0, (void*)0x0801D170 }, { 0x8CF, 0, (void*)0x0801D1C0 }, { 0x8D0, 0, (void*)0x0801D200 }, + { 0x8D1, 0, (void*)0x0801D238 }, { 0x8D2, 0, (void*)0x0801D268 }, { 0x8D3, 0, (void*)0x0801D340 }, + { 0x8D4, 0, (void*)0x0801D3D4 }, { 0x8D5, 0, (void*)0x0801D444 }, { 0x8D6, 0, (void*)0x0801D488 }, + { 0x8D7, 0, (void*)0x0801D4D8 }, { 0x8D8, 0, (void*)0x0801D508 }, { 0x8D9, 0, (void*)0x0801D574 }, + { 0x8DA, 0, (void*)0x0801D5A0 }, { 0x8DB, 0, (void*)0x0801D5D0 }, { 0x8DC, 0, (void*)0x0801D600 }, + { 0x8DD, 0, (void*)0x0801D644 }, { 0x8DE, 0, (void*)0x0801D7C8 }, { 0x8DF, 0, (void*)0x0801D7FC }, + { 0x8E0, 0, (void*)0x0801D844 }, { 0x8E1, 0, (void*)0x0801D898 }, { 0x8E2, 0, (void*)0x0801D938 }, + { 0x8E3, 0, (void*)0x0801D9E0 }, { 0x8E4, 0, (void*)0x0801DA40 }, { 0x8E5, 0, (void*)0x0801DA9C }, + { 0x8E6, 0, (void*)0x0801DB20 }, { 0x8E7, 0, (void*)0x0801DB88 }, { 0x8E8, 0, (void*)0x0801DBB0 }, + { 0x8E9, 0, (void*)0x0801DBE4 }, { 0x8EA, 0, (void*)0x0801DC6C }, { 0x8EB, 0, (void*)0x0801DC84 }, + { 0x8EC, 0, (void*)0x0801DD18 }, { 0x910, 0, (void*)0x0801DD64 }, { 0x911, 0, (void*)0x0801DDC0 }, + { 0x912, 0, (void*)0x0801DE3C }, { 0x913, 0, (void*)0x0801DEAC }, { 0x914, 0, (void*)0x0801DF18 }, + { 0x915, 0, (void*)0x0801DF88 }, { 0x916, 0, (void*)0x0801DFF0 }, { 0x917, 0, (void*)0x0801E038 }, + { 0x918, 0, (void*)0x0801E164 }, { 0x919, 0, (void*)0x0801E1BC }, { 0x91A, 0, (void*)0x0801E204 }, + { 0x91B, 0, (void*)0x0801E330 }, { 0x91C, 0, (void*)0x0801E370 }, { 0x91E, 0, (void*)0x0801E3CC }, + { 0x92E, 0, (void*)0x0801E464 }, { 0x92F, 0, (void*)0x0801E4C0 }, { 0x930, 0, (void*)0x0801E534 }, + { 0x931, 0, (void*)0x0801E5AC }, { 0x932, 0, (void*)0x0801E5B8 }, { 0x933, 0, (void*)0x0801E608 }, + { 0x934, 0, (void*)0x0801E650 }, { 0x935, 0, (void*)0x0801E698 }, { 0x936, 0, (void*)0x0801E6D0 }, + { 0x937, 0, (void*)0x0801E738 }, { 0x938, 0, (void*)0x0801E768 }, { 0x960, 0, (void*)0x0801E774 }, + { 0x961, 0, (void*)0x0801E798 }, { 0x962, 0, (void*)0x0801E810 }, { 0x963, 0, (void*)0x0801E8AC }, + { 0x964, 0, (void*)0x0801E97C }, { 0x965, 0, (void*)0x0801E9C8 }, { 0x966, 0, (void*)0x0801EA1C }, + { 0x967, 0, (void*)0x0801EABC }, { 0x968, 0, (void*)0x0801EB08 }, { 0x969, 0, (void*)0x0801EBC8 }, + { 0x96A, 0, (void*)0x0801EC58 }, { 0x96B, 0, (void*)0x0801EC8C }, { 0x96C, 0, (void*)0x0801ECD4 }, + { 0x96D, 0, (void*)0x0801ED40 }, { 0x96E, 0, (void*)0x0801ED88 }, { 0x96F, 0, (void*)0x0801EE4C }, + { 0x970, 0, (void*)0x0801EF08 }, { 0x971, 0, (void*)0x0801EF98 }, { 0x972, 0, (void*)0x0801EFF4 }, + { 0x9C4, 0, (void*)0x0801F000 }, { 0x9C5, 0, (void*)0x0801F08C }, { 0x9C6, 0, (void*)0x0801F0B0 }, + { 0x9C7, 0, (void*)0x0801F104 }, { 0x9C8, 0, (void*)0x0801F110 }, { 0x9C9, 0, (void*)0x0801F160 }, + { 0x9CA, 0, (void*)0x0801F1D4 }, { 0x9CB, 0, (void*)0x0801F25C }, { 0x9CC, 0, (void*)0x0801F2A0 }, + { 0x9CD, 0, (void*)0x0801F2E8 }, { 0x9CE, 0, (void*)0x0801F338 }, { 0x9CF, 0, (void*)0x0801F37C }, + { 0x9D0, 0, (void*)0x0801F3CC }, { 0x9D1, 0, (void*)0x0801F424 }, { 0x9D2, 0, (void*)0x0801F450 }, + { 0x9D3, 0, (void*)0x0801F510 }, { 0x9D4, 0, (void*)0x0801F558 }, { 0x9D5, 0, (void*)0x0801F580 }, + { 0x9D6, 0, (void*)0x0801F5D0 }, { 0x9D7, 0, (void*)0x0801F61C }, { 0x9D8, 0, (void*)0x0801F65C }, + { 0x9D9, 0, (void*)0x0801F69C }, { 0x9DA, 0, (void*)0x0801F6EC }, { 0x9DB, 0, (void*)0x0801F764 }, + { 0x9DC, 0, (void*)0x0801F7B0 }, { 0x9DD, 0, (void*)0x0801F808 }, { 0x9DE, 0, (void*)0x0801F8AC }, + { 0x9DF, 0, (void*)0x0801F91C }, { 0x9E0, 0, (void*)0x0801F990 }, { 0x9E1, 0, (void*)0x0801F9CC }, + { 0x9E2, 0, (void*)0x0801FA2C }, { 0x9E3, 0, (void*)0x0801FA74 }, { 0x9E4, 0, (void*)0x0801FB24 }, + { 0x9E5, 0, (void*)0x0801FB90 }, { 0x9E6, 0, (void*)0x0801FBBC }, { 0x9E7, 0, (void*)0x0801FBE4 }, + { 0x9E8, 0, (void*)0x0801FC4C }, { 0x9E9, 0, (void*)0x0801FCA0 }, { 0x9EA, 0, (void*)0x0801FD80 }, + { 0x9EB, 0, (void*)0x0801FDE8 }, { 0x9EC, 0, (void*)0x0801FE70 }, { 0x9ED, 0, (void*)0x0801FEAC }, + { 0x9EE, 0, (void*)0x0801FF40 }, { 0x9EF, 0, (void*)0x0801FF8C }, { 0xA28, 0, (void*)0x0801FFC4 }, + { 0xA29, 0, (void*)0x0801FFF4 }, { 0xA2A, 0, (void*)0x08020014 }, { 0xA2B, 0, (void*)0x08020048 }, + { 0xA2C, 0, (void*)0x0802012C }, { 0xA2D, 0, (void*)0x08020190 }, { 0xA2E, 0, (void*)0x080201EC }, + { 0xA2F, 0, (void*)0x08020278 }, { 0xA30, 0, (void*)0x080202E4 }, { 0xA31, 0, (void*)0x0802031C }, + { 0xA32, 0, (void*)0x08020360 }, { 0xA33, 0, (void*)0x080203A4 }, { 0xA34, 0, (void*)0x080203C8 }, + { 0xA35, 0, (void*)0x08020424 }, { 0xA36, 0, (void*)0x0802047C }, { 0xA37, 0, (void*)0x080204F0 }, + { 0xA38, 0, (void*)0x08020534 }, { 0xA39, 0, (void*)0x08020570 }, { 0xA3A, 0, (void*)0x080205E4 }, + { 0xBB8, 0, (void*)0x08020668 }, { 0xBB9, 0, (void*)0x080206A4 }, { 0xBBA, 0, (void*)0x080206EC }, + { 0xBBB, 0, (void*)0x08020710 }, { 0xBBC, 0, (void*)0x08020764 }, { 0xBBD, 0, (void*)0x080207A4 }, + { 0xBBE, 0, (void*)0x080207E8 }, { 0xBBF, 0, (void*)0x08020814 }, { 0xBC0, 0, (void*)0x08020858 }, + { 0xBC1, 0, (void*)0x080208B0 }, { 0xBC2, 0, (void*)0x08020910 }, { 0xBC3, 0, (void*)0x08020960 }, + { 0xBC4, 0, (void*)0x080209C4 }, { 0xBC5, 0, (void*)0x080209F0 }, { 0xBC6, 0, (void*)0x08020A50 }, + { 0xBC7, 0, (void*)0x08020A8C }, { 0xBC8, 0, (void*)0x08020B00 }, { 0xBC9, 0, (void*)0x08020B3C }, + { 0xBCA, 0, (void*)0x08020BB8 }, { 0xBCB, 0, (void*)0x08020BF4 }, { 0xBCC, 0, (void*)0x08020C4C }, + { 0xBCD, 0, (void*)0x08020C88 }, { 0xBCE, 0, (void*)0x08020CF0 }, { 0xBCF, 0, (void*)0x08020D2C }, + { 0xBD0, 0, (void*)0x08020D80 }, { 0xBD1, 0, (void*)0x08020DC0 }, { 0xBD2, 0, (void*)0x08020DFC }, + { 0xBD3, 0, (void*)0x08020E58 }, { 0xBD4, 0, (void*)0x08020E88 }, { 0xBD5, 0, (void*)0x08020EE0 }, + { 0xBD6, 0, (void*)0x08020F18 }, { 0xBD7, 0, (void*)0x08020F44 }, { 0xBEA, 0, (void*)0x08020F60 }, + { 0xBEB, 0, (void*)0x08021158 }, { 0xBEC, 0, (void*)0x080211C0 }, { 0xBED, 0, (void*)0x080211EC }, + { 0xBEE, 0, (void*)0x08021350 }, { 0xBEF, 0, (void*)0x08021380 }, { 0xBF0, 0, (void*)0x080213F8 }, + { 0xBF1, 0, (void*)0x08021480 }, { 0xBF2, 0, (void*)0x08021558 }, { 0xBF3, 0, (void*)0x08021588 }, + { 0xBF4, 0, (void*)0x080215E0 }, { 0xBF5, 0, (void*)0x080216A0 }, { 0xBF6, 0, (void*)0x080217CC }, + { 0xBF7, 0, (void*)0x08021858 }, { 0xBF8, 0, (void*)0x080218CC }, { 0xBF9, 0, (void*)0x08021974 }, + { 0xBFA, 0, (void*)0x080219F8 }, { 0xBFB, 0, (void*)0x08021A68 }, { 0xBFC, 0, (void*)0x08021AF8 }, + { 0xBFD, 0, (void*)0x08021B9C }, { 0xBFE, 0, (void*)0x08021BE0 }, { 0xBFF, 0, (void*)0x08021C54 }, + { 0xC00, 0, (void*)0x08021C80 }, { 0xC01, 0, (void*)0x08021CC8 }, { 0xC02, 0, (void*)0x08021F20 }, + { 0xC03, 0, (void*)0x08021F50 }, { 0xC04, 0, (void*)0x08022024 }, { 0xC1D, 0, (void*)0x08022090 }, + { 0xC1E, 0, (void*)0x080220B8 }, { 0xC1F, 0, (void*)0x080220D0 }, { 0xC20, 0, (void*)0x08022104 }, + { 0xC21, 0, (void*)0x08022198 }, { 0xC22, 0, (void*)0x080221B8 }, { 0xC23, 0, (void*)0x080221DC }, + { 0xC24, 0, (void*)0x08022248 }, { 0xC25, 0, (void*)0x08022288 }, { 0xC26, 0, (void*)0x08022308 }, + { 0xC27, 0, (void*)0x0802233C }, { 0xC28, 0, (void*)0x0802239C }, { 0xC29, 0, (void*)0x080223E4 }, + { 0xC2A, 0, (void*)0x08022408 }, { 0xC2B, 0, (void*)0x08022470 }, { 0xC2C, 0, (void*)0x080224C4 }, + { 0xC2D, 0, (void*)0x0802255C }, { 0xC2E, 0, (void*)0x08022584 }, { 0xC2F, 0, (void*)0x080225AC }, + { 0xC30, 0, (void*)0x08022640 }, { 0xC31, 0, (void*)0x08022670 }, { 0xC32, 0, (void*)0x0802268C }, + { 0xC33, 0, (void*)0x080226A0 }, { 0xC34, 0, (void*)0x080226E0 }, { 0xC35, 0, (void*)0x08022738 }, + { 0xC36, 0, (void*)0x08022760 }, { 0xC37, 0, (void*)0x08022780 }, { 0xC38, 0, (void*)0x080227B8 }, + { 0xC39, 0, (void*)0x080227F0 }, { 0xC3A, 0, (void*)0x080228DC }, { 0xC3B, 0, (void*)0x08022954 }, + { 0xC3C, 0, (void*)0x08022AD4 }, { 0xC3D, 0, (void*)0x08022B48 }, { 0xC3E, 0, (void*)0x08022C14 }, + { 0xC3F, 0, (void*)0x08022C48 }, { 0xC40, 0, (void*)0x08022C78 }, { 0xC41, 0, (void*)0x08022CB0 }, + { 0xC42, 0, (void*)0x08022CFC }, { 0xC43, 0, (void*)0x08022D64 }, { 0xC44, 0, (void*)0x08022D84 }, + { 0xC45, 0, (void*)0x08022DEC }, { 0xC46, 0, (void*)0x08022EBC }, { 0xC47, 0, (void*)0x08022F9C }, + { 0xC48, 0, (void*)0x08023004 }, { 0xC49, 0, (void*)0x08023024 }, { 0xC4A, 0, (void*)0x080230B0 }, + { 0xC4B, 0, (void*)0x080230E0 }, { 0xC4C, 0, (void*)0x080231E4 }, { 0xC4D, 0, (void*)0x0802329C }, + { 0xC4E, 0, (void*)0x080232FC }, { 0xC4F, 0, (void*)0x08023360 }, { 0xC50, 0, (void*)0x080233BC }, + { 0xC51, 0, (void*)0x080233F4 }, { 0xC52, 0, (void*)0x0802352C }, { 0xC53, 0, (void*)0x08023550 }, + { 0xC54, 0, (void*)0x08023640 }, { 0xC55, 0, (void*)0x08023668 }, { 0xC56, 0, (void*)0x080236A4 }, + { 0xC57, 0, (void*)0x080236F4 }, { 0xC58, 0, (void*)0x08023788 }, { 0xC80, 0, (void*)0x080237C4 }, + { 0xC81, 0, (void*)0x08023824 }, { 0xC82, 0, (void*)0x080238F0 }, { 0xC83, 0, (void*)0x08023920 }, + { 0xC84, 0, (void*)0x080239E4 }, { 0xC85, 0, (void*)0x08023B24 }, { 0xC86, 0, (void*)0x08023B58 }, + { 0xC87, 0, (void*)0x08023C3C }, { 0xC88, 0, (void*)0x08023CF0 }, { 0xC89, 0, (void*)0x08023D44 }, + { 0xC8A, 0, (void*)0x08023D80 }, { 0xC8B, 0, (void*)0x08023DB0 }, { 0xC8C, 0, (void*)0x08023E0C }, + { 0xC8D, 0, (void*)0x08023E60 }, { 0xC8E, 0, (void*)0x08023E90 }, { 0xC8F, 0, (void*)0x08023F40 }, + { 0xC90, 0, (void*)0x08023FA0 }, { 0xC91, 0, (void*)0x0802400C }, { 0xC92, 0, (void*)0x08024058 }, + { 0xC93, 0, (void*)0x080240D0 }, { 0xC94, 0, (void*)0x0802410C }, { 0xCE4, 0, (void*)0x08024164 }, + { 0xCE5, 0, (void*)0x080241D4 }, { 0xCE6, 0, (void*)0x08024254 }, { 0xCE7, 0, (void*)0x08024304 }, + { 0xCE8, 0, (void*)0x08024330 }, { 0xCE9, 0, (void*)0x08024360 }, { 0xCEA, 0, (void*)0x0802444C }, + { 0xCEB, 0, (void*)0x08024470 }, { 0xCEC, 0, (void*)0x080244E8 }, { 0xCED, 0, (void*)0x08024548 }, + { 0xCEE, 0, (void*)0x08024634 }, { 0xCEF, 0, (void*)0x08024718 }, { 0xCF0, 0, (void*)0x0802476C }, + { 0xCF1, 0, (void*)0x080247F8 }, { 0xCF2, 0, (void*)0x0802483C }, { 0xCF3, 0, (void*)0x08024880 }, + { 0xCF4, 0, (void*)0x08024918 }, { 0xCF5, 0, (void*)0x08024994 }, { 0xCF6, 0, (void*)0x08024B58 }, + { 0xCF7, 0, (void*)0x08024BD8 }, { 0xCF8, 0, (void*)0x08024C84 }, { 0xCF9, 0, (void*)0x08024D10 }, + { 0xCFA, 0, (void*)0x08024D44 }, { 0xCFB, 0, (void*)0x08024D8C }, { 0xCFC, 0, (void*)0x08024DB8 }, + { 0xCFD, 0, (void*)0x08024DFC }, { 0xCFE, 0, (void*)0x08024E6C }, { 0xCFF, 0, (void*)0x08024EA4 }, + { 0xD00, 0, (void*)0x08024ED4 }, { 0xD01, 0, (void*)0x08024F4C }, { 0xD02, 0, (void*)0x08024F8C }, + { 0xD03, 0, (void*)0x08024FDC }, { 0xD04, 0, (void*)0x08025040 }, { 0xD05, 0, (void*)0x080250D8 }, + { 0xD06, 0, (void*)0x08025100 }, { 0xD07, 0, (void*)0x08025134 }, { 0xD08, 0, (void*)0x0802516C }, + { 0xD09, 0, (void*)0x080251B4 }, { 0xD0A, 0, (void*)0x080251E0 }, { 0xD0B, 0, (void*)0x08025260 }, + { 0xD0C, 0, (void*)0x080252AC }, { 0xD0D, 0, (void*)0x080252E4 }, { 0xD0E, 0, (void*)0x08025330 }, + { 0xD0F, 0, (void*)0x08025358 }, { 0xD10, 0, (void*)0x08025394 }, { 0xD11, 0, (void*)0x080253C8 }, + { 0xD12, 0, (void*)0x08025434 }, { 0xD13, 0, (void*)0x0802547C }, { 0xD14, 0, (void*)0x080254C0 }, + { 0xD15, 0, (void*)0x0802550C }, { 0xD16, 0, (void*)0x08025550 }, { 0xD17, 0, (void*)0x080255A4 }, + { 0xD18, 0, (void*)0x080255DC }, { 0xD19, 0, (void*)0x080255FC }, { 0xD1A, 0, (void*)0x0802563C }, + { 0xD1B, 0, (void*)0x080256C8 }, { 0xD1C, 0, (void*)0x08025708 }, { 0xD1D, 0, (void*)0x0802575C }, + { 0xD1E, 0, (void*)0x080257B8 }, { 0xD1F, 0, (void*)0x08025814 }, { 0xD20, 0, (void*)0x08025874 }, + { 0xD21, 0, (void*)0x080258EC }, { 0xD48, 0, (void*)0x08025960 }, { 0xD49, 0, (void*)0x0802597C }, + { 0xD4A, 0, (void*)0x080259B8 }, { 0xD4B, 0, (void*)0x080259F8 }, { 0xD4C, 0, (void*)0x08025A9C }, + { 0xD4D, 0, (void*)0x08025AF4 }, { 0xD4E, 0, (void*)0x08025B4C }, { 0xD4F, 0, (void*)0x08025B80 }, + { 0xD5E, 0, (void*)0x08025BBC }, { 0xD5F, 0, (void*)0x08025BD8 }, { 0xD60, 0, (void*)0x08025BFC }, + { 0xD61, 0, (void*)0x08025C3C }, { 0xD62, 0, (void*)0x08025C7C }, { 0xD63, 0, (void*)0x08025CE0 }, + { 0xD64, 0, (void*)0x08025D64 }, { 0xD65, 0, (void*)0x08025D90 }, { 0xD66, 0, (void*)0x08025DC0 }, + { 0xD67, 0, (void*)0x08025E34 }, { 0xD68, 0, (void*)0x08025E74 }, { 0xD69, 0, (void*)0x08025EB0 }, + { 0xD6A, 0, (void*)0x08025EE4 }, { 0xD6B, 0, (void*)0x08025F14 }, { 0xD6C, 0, (void*)0x08025F4C }, + { 0xD6D, 0, (void*)0x08025F9C }, { 0xD6E, 0, (void*)0x08025FEC }, { 0xD6F, 0, (void*)0x08026024 }, + { 0xD70, 0, (void*)0x08026064 }, { 0xD71, 0, (void*)0x080260D4 }, { 0xD72, 0, (void*)0x0802613C }, + { 0xD73, 0, (void*)0x08026190 }, { 0xD74, 0, (void*)0x080261E4 }, { 0xD75, 0, (void*)0x0802621C }, + { 0xD76, 0, (void*)0x0802626C }, { 0xD77, 0, (void*)0x08026354 }, { 0xD78, 0, (void*)0x0802637C }, + { 0xD79, 0, (void*)0x080263C8 }, { 0xD7A, 0, (void*)0x08026444 }, { 0xD7B, 0, (void*)0x08026490 }, + { 0xD7C, 0, (void*)0x080264EC }, { 0xD7D, 0, (void*)0x08026548 }, { 0xD7E, 0, (void*)0x08026598 }, + { 0xD7F, 0, (void*)0x080265C4 }, { 0xD80, 0, (void*)0x080265F8 }, { 0xD81, 0, (void*)0x08026628 }, + { 0xD82, 0, (void*)0x08026658 }, { 0xD83, 0, (void*)0x08026688 }, { 0xD84, 0, (void*)0x080266D0 }, + { 0xD85, 0, (void*)0x08026728 }, { 0xD86, 0, (void*)0x08026770 }, { 0xD87, 0, (void*)0x080267B4 }, + { 0xD88, 0, (void*)0x08026850 }, { 0xD89, 0, (void*)0x080268B0 }, { 0xD8A, 0, (void*)0x08026998 }, + { 0xD8B, 0, (void*)0x08026A5C }, { 0xDAC, 0, (void*)0x08026AA0 }, { 0xDAD, 0, (void*)0x08026AC8 }, + { 0xDAE, 0, (void*)0x08026B04 }, { 0xDAF, 0, (void*)0x08026B9C }, { 0xDB0, 0, (void*)0x08026BDC }, + { 0xDB1, 0, (void*)0x08026C6C }, { 0xDB2, 0, (void*)0x08026CD8 }, { 0xDB3, 0, (void*)0x08026D4C }, + { 0xDB4, 0, (void*)0x08026DB4 }, { 0xDB5, 0, (void*)0x08026E34 }, { 0xDB6, 0, (void*)0x08026EA4 }, + { 0xDB7, 0, (void*)0x08026EBC }, { 0xDB8, 0, (void*)0x08026EE8 }, { 0xDB9, 0, (void*)0x08026F28 }, + { 0xDBA, 0, (void*)0x08026F70 }, { 0xDBB, 0, (void*)0x08026FA0 }, { 0xDBC, 0, (void*)0x0802701C }, + { 0xDBD, 0, (void*)0x08027070 }, { 0xDBE, 0, (void*)0x08027088 }, { 0xDBF, 0, (void*)0x080270BC }, + { 0xDC0, 0, (void*)0x080270E0 }, { 0xDC1, 0, (void*)0x0802713C }, { 0xDC2, 0, (void*)0x08027194 }, + { 0xDC3, 0, (void*)0x08027220 }, { 0xDC4, 0, (void*)0x0802727C }, { 0xDC5, 0, (void*)0x08027300 }, + { 0xDC6, 0, (void*)0x08027334 }, { 0xDC7, 0, (void*)0x08027370 }, { 0xDC8, 0, (void*)0x08027394 }, + { 0xDC9, 0, (void*)0x080273A8 }, { 0xDCA, 0, (void*)0x080273D0 }, { 0xDCB, 0, (void*)0x08027414 }, + { 0xDCC, 0, (void*)0x0802744C }, { 0xDCD, 0, (void*)0x080274BC }, { 0xDCE, 0, (void*)0x08027500 }, + { 0xDCF, 0, (void*)0x080275D4 }, { 0xDD0, 0, (void*)0x0802762C }, { 0xDD1, 0, (void*)0x08027668 }, + { 0xDD2, 0, (void*)0x08027684 }, { 0xDD3, 0, (void*)0x080276D8 }, { 0xDD4, 0, (void*)0x08027710 }, + { 0xDD5, 0, (void*)0x0802773C }, { 0xDD6, 0, (void*)0x08027760 }, { 0xDD7, 0, (void*)0x08027798 }, + { 0xDD8, 0, (void*)0x080277C0 }, { 0xDD9, 0, (void*)0x08027824 }, { 0xDDA, 0, (void*)0x080278AC }, + { 0xDDB, 0, (void*)0x08027934 }, { 0xDDC, 0, (void*)0x08027984 }, { 0xDDD, 0, (void*)0x080279E8 }, + { 0xDDE, 0, (void*)0x08027A70 }, { 0xDDF, 0, (void*)0x08027AE8 }, { 0xDE0, 0, (void*)0x08027B28 }, + { 0xDE1, 0, (void*)0x08027B84 }, { 0xDE2, 0, (void*)0x08027BF4 }, { 0xDE3, 0, (void*)0x08027C40 }, + { 0xDE4, 0, (void*)0x08027C84 }, { 0xDE5, 0, (void*)0x08027CC8 }, { 0xDE6, 0, (void*)0x08027D3C }, + { 0xDE7, 0, (void*)0x08027D8C }, { 0xDE8, 0, (void*)0x08027DBC }, { 0xDE9, 0, (void*)0x08027DEC }, + { 0xDEA, 0, (void*)0x08027E78 }, { 0xDEB, 0, (void*)0x08027EBC }, { 0xDEC, 0, (void*)0x08027EE4 }, + { 0xDED, 0, (void*)0x08027F4C }, { 0xDEE, 0, (void*)0x08027F9C }, { 0xDEF, 0, (void*)0x0802800C }, + { 0xDF0, 0, (void*)0x08028058 }, { 0xDF1, 0, (void*)0x080280A4 }, { 0xDF2, 0, (void*)0x080280DC }, + { 0xDF3, 0, (void*)0x08028134 }, { 0xDF4, 0, (void*)0x080281B0 }, { 0xDF5, 0, (void*)0x080281E8 }, + { 0xDF6, 0, (void*)0x08028234 }, { 0xDF7, 0, (void*)0x08028264 }, { 0xDF8, 0, (void*)0x080282C0 }, + { 0xDF9, 0, (void*)0x080282F8 }, { 0xDFA, 0, (void*)0x08028378 }, { 0xDFB, 0, (void*)0x080283C4 }, + { 0xDFC, 0, (void*)0x080283FC }, { 0xDFD, 0, (void*)0x08028444 }, { 0xDFE, 0, (void*)0x08028478 }, + { 0xDFF, 0, (void*)0x080284BC }, { 0xE02, 0, (void*)0x080284F4 }, { 0xE03, 0, (void*)0x08028540 }, + { 0xE04, 0, (void*)0x08028588 }, { 0xE05, 0, (void*)0x080285C8 }, { 0xE06, 0, (void*)0x08028604 }, + { 0xE07, 0, (void*)0x08028620 }, { 0xE10, 0, (void*)0x08028670 }, { 0xE11, 0, (void*)0x080286AC }, + { 0xE12, 0, (void*)0x08028744 }, { 0xE13, 0, (void*)0x080287C4 }, { 0xE14, 0, (void*)0x0802885C }, + { 0xE15, 0, (void*)0x08028940 }, { 0xE16, 0, (void*)0x080289D4 }, { 0xE17, 0, (void*)0x08028A20 }, + { 0xE18, 0, (void*)0x08028A58 }, { 0xE19, 0, (void*)0x08028AA8 }, { 0xE1A, 0, (void*)0x08028B5C }, + { 0xE1B, 0, (void*)0x08028B8C }, { 0xE1C, 0, (void*)0x08028BF0 }, { 0xE1D, 0, (void*)0x08028C38 }, + { 0xE1E, 0, (void*)0x08028C98 }, { 0xE1F, 0, (void*)0x08028CBC }, { 0xE20, 0, (void*)0x08028D10 }, + { 0xE21, 0, (void*)0x08028D28 }, { 0xE22, 0, (void*)0x08028D68 }, { 0xE23, 0, (void*)0x08028DC8 }, + { 0xE24, 0, (void*)0x08028E24 }, { 0xE25, 0, (void*)0x08028E44 }, { 0xE26, 0, (void*)0x08028E88 }, + { 0xE27, 0, (void*)0x08028ED0 }, { 0xE28, 0, (void*)0x08028EEC }, { 0xE29, 0, (void*)0x08028F40 }, + { 0xE2A, 0, (void*)0x08028F9C }, { 0xE2B, 0, (void*)0x08029010 }, { 0xE2C, 0, (void*)0x08029078 }, + { 0xE2D, 0, (void*)0x08029104 }, { 0xE2E, 0, (void*)0x08029174 }, { 0xE2F, 0, (void*)0x080291D4 }, + { 0xE30, 0, (void*)0x08029238 }, { 0xE31, 0, (void*)0x080292B8 }, { 0xE32, 0, (void*)0x0802933C }, + { 0xE42, 0, (void*)0x0802939C }, { 0xE43, 0, (void*)0x080293FC }, { 0xE44, 0, (void*)0x08029428 }, + { 0xE45, 0, (void*)0x080294A8 }, { 0xE46, 0, (void*)0x08029500 }, { 0xE47, 0, (void*)0x080295A0 }, + { 0xE48, 0, (void*)0x080295C4 }, { 0xE49, 0, (void*)0x08029634 }, { 0xE4A, 0, (void*)0x0802969C }, + { 0xE4B, 0, (void*)0x08029704 }, { 0xE4C, 0, (void*)0x08029774 }, { 0xE4D, 0, (void*)0x080297D4 }, + { 0xE4E, 0, (void*)0x08029860 }, { 0xE4F, 0, (void*)0x080298C8 }, { 0xE50, 0, (void*)0x08029948 }, + { 0xE51, 0, (void*)0x080299D0 }, { 0xE52, 0, (void*)0x08029A30 }, { 0xE74, 0, (void*)0x08029AC0 }, + { 0xE75, 0, (void*)0x08029B20 }, { 0xE76, 0, (void*)0x08029B74 }, { 0xE77, 0, (void*)0x08029BD4 }, + { 0xE78, 0, (void*)0x08029C48 }, { 0xE79, 0, (void*)0x08029C9C }, { 0xE7A, 0, (void*)0x08029CB0 }, + { 0xE7B, 0, (void*)0x08029CCC }, { 0xE7C, 0, (void*)0x08029D58 }, { 0xE7D, 0, (void*)0x08029DAC }, + { 0xE7E, 0, (void*)0x08029DC0 }, { 0xE7F, 0, (void*)0x08029E10 }, { 0xE80, 0, (void*)0x08029E74 }, + { 0xE81, 0, (void*)0x08029ED4 }, { 0xE82, 0, (void*)0x08029F2C }, { 0xE83, 0, (void*)0x08029F54 }, + { 0xE84, 0, (void*)0x08029FCC }, { 0xE85, 0, (void*)0x0802A03C }, { 0xE86, 0, (void*)0x0802A090 }, + { 0xE87, 0, (void*)0x0802A0D8 }, { 0xE88, 0, (void*)0x0802A128 }, { 0xE89, 0, (void*)0x0802A1BC }, + { 0xE8A, 0, (void*)0x0802A1F4 }, { 0xE8B, 0, (void*)0x0802A260 }, { 0xE8C, 0, (void*)0x0802A2A4 }, + { 0xE8D, 0, (void*)0x0802A2F4 }, { 0xE8E, 0, (void*)0x0802A334 }, { 0xE8F, 0, (void*)0x0802A37C }, + { 0xE90, 0, (void*)0x0802A3DC }, { 0xE91, 0, (void*)0x0802A448 }, { 0xE92, 0, (void*)0x0802A47C }, + { 0xE93, 0, (void*)0x0802A4A8 }, { 0xE94, 0, (void*)0x0802A550 }, { 0xE95, 0, (void*)0x0802A5B0 }, + { 0xE97, 0, (void*)0x0802A608 }, { 0xE98, 0, (void*)0x0802A69C }, { 0xE99, 0, (void*)0x0802A6F0 }, + { 0xFA0, 0, (void*)0x0802A760 }, { 0xFA1, 0, (void*)0x0802A79C }, { 0xFA2, 0, (void*)0x0802A7F4 }, + { 0xFA3, 0, (void*)0x0802A84C }, { 0xFA4, 0, (void*)0x0802A8F4 }, { 0xFA5, 0, (void*)0x0802AA24 }, + { 0xFA6, 0, (void*)0x0802AAA0 }, { 0xFA7, 0, (void*)0x0802AB04 }, { 0xFA8, 0, (void*)0x0802ABA0 }, + { 0xFA9, 0, (void*)0x0802AC08 }, { 0xFAA, 0, (void*)0x0802ACA4 }, { 0xFAB, 0, (void*)0x0802AD1C }, + { 0xFAC, 0, (void*)0x0802AD8C }, { 0xFAD, 0, (void*)0x0802ADF4 }, { 0xFAE, 0, (void*)0x0802AE90 }, + { 0xFAF, 0, (void*)0x0802AF00 }, { 0xFB0, 0, (void*)0x0802AF70 }, { 0xFB1, 0, (void*)0x0802B018 }, + { 0xFB2, 0, (void*)0x0802B0B8 }, { 0xFB3, 0, (void*)0x0802B110 }, { 0xFB4, 0, (void*)0x0802B190 }, + { 0xFB5, 0, (void*)0x0802B24C }, { 0xFB6, 0, (void*)0x0802B288 }, { 0xFB7, 0, (void*)0x0802B2E4 }, + { 0xFB8, 0, (void*)0x0802B314 }, { 0xFB9, 0, (void*)0x0802B39C }, { 0xFBA, 0, (void*)0x0802B40C }, + { 0xFBB, 0, (void*)0x0802B488 }, { 0xFBC, 0, (void*)0x0802B4EC }, { 0xFBD, 0, (void*)0x0802B598 }, + { 0xFBE, 0, (void*)0x0802B650 }, { 0xFBF, 0, (void*)0x0802B6F8 }, { 0x1004, 0, (void*)0x0802B750 }, + { 0x1005, 0, (void*)0x0802B778 }, { 0x1006, 0, (void*)0x0802B7A0 }, { 0x1007, 0, (void*)0x0802B7C8 }, + { 0x1008, 0, (void*)0x0802B7EC }, { 0x1009, 0, (void*)0x0802B84C }, { 0x100A, 0, (void*)0x0802B890 }, + { 0x100B, 0, (void*)0x0802B8D8 }, { 0x100C, 0, (void*)0x0802B908 }, { 0x100D, 0, (void*)0x0802B97C }, + { 0x100E, 0, (void*)0x0802BA00 }, { 0x100F, 0, (void*)0x0802BA54 }, { 0x1010, 0, (void*)0x0802BAC0 }, + { 0x1011, 0, (void*)0x0802BB28 }, { 0x1012, 0, (void*)0x0802BB94 }, { 0x1013, 0, (void*)0x0802BC18 }, + { 0x1014, 0, (void*)0x0802BC44 }, { 0x1015, 0, (void*)0x0802BC88 }, { 0x1016, 0, (void*)0x0802BCE0 }, + { 0x1017, 0, (void*)0x0802BD24 }, { 0x1018, 0, (void*)0x0802BD8C }, { 0x1019, 0, (void*)0x0802BE18 }, + { 0x101A, 0, (void*)0x0802BE80 }, { 0x101B, 0, (void*)0x0802BF84 }, { 0x101C, 0, (void*)0x0802C048 }, + { 0x101D, 0, (void*)0x0802C064 }, { 0x101E, 0, (void*)0x0802C15C }, { 0x101F, 0, (void*)0x0802C284 }, + { 0x1020, 0, (void*)0x0802C3BC }, { 0x1021, 0, (void*)0x0802C3D4 }, { 0x1022, 0, (void*)0x0802C438 }, + { 0x1023, 0, (void*)0x0802C470 }, { 0x1024, 0, (void*)0x0802C494 }, { 0x1025, 0, (void*)0x0802C4C4 }, + { 0x1026, 0, (void*)0x0802C4F8 }, { 0x1027, 0, (void*)0x0802C564 }, { 0x1028, 0, (void*)0x0802C5F8 }, + { 0x1029, 0, (void*)0x0802C67C }, { 0x102A, 0, (void*)0x0802C6DC }, { 0x102B, 0, (void*)0x0802C73C }, + { 0x102C, 0, (void*)0x0802C798 }, { 0x102D, 0, (void*)0x0802C824 }, { 0x102E, 0, (void*)0x0802C87C }, + { 0x102F, 0, (void*)0x0802C8B8 }, { 0x1030, 0, (void*)0x0802C928 }, { 0x1031, 0, (void*)0x0802CA60 }, + { 0x1032, 0, (void*)0x0802CAB4 }, { 0x1033, 0, (void*)0x0802CB00 }, { 0x1034, 0, (void*)0x0802CB3C }, + { 0x1035, 0, (void*)0x0802CB94 }, { 0x1036, 0, (void*)0x0802CBF0 }, { 0x1037, 0, (void*)0x0802CC28 }, + { 0x1038, 0, (void*)0x0802CC80 }, { 0x1039, 0, (void*)0x0802CCE0 }, { 0x103A, 0, (void*)0x0802CD30 }, + { 0x103B, 0, (void*)0x0802CD64 }, { 0x103C, 0, (void*)0x0802CDDC }, { 0x1068, 0, (void*)0x0802CE10 }, + { 0x1069, 0, (void*)0x0802CE64 }, { 0x106A, 0, (void*)0x0802CF30 }, { 0x106B, 0, (void*)0x0802CF90 }, + { 0x106C, 0, (void*)0x0802CFD4 }, { 0x106D, 0, (void*)0x0802D07C }, { 0x106E, 0, (void*)0x0802D0C0 }, + { 0x106F, 0, (void*)0x0802D110 }, { 0x1070, 0, (void*)0x0802D178 }, { 0x1071, 0, (void*)0x0802D1C4 }, + { 0x1072, 0, (void*)0x0802D234 }, { 0x1073, 0, (void*)0x0802D27C }, { 0x1074, 0, (void*)0x0802D2BC }, + { 0x1075, 0, (void*)0x0802D314 }, { 0x1076, 0, (void*)0x0802D354 }, { 0x1077, 0, (void*)0x0802D3AC }, + { 0x1078, 0, (void*)0x0802D3F0 }, { 0x1079, 0, (void*)0x0802D434 }, { 0x107A, 0, (void*)0x0802D4AC }, + { 0x107B, 0, (void*)0x0802D4EC }, { 0x107C, 0, (void*)0x0802D554 }, { 0x107D, 0, (void*)0x0802D5A8 }, + { 0x107E, 0, (void*)0x0802D5FC }, { 0x107F, 0, (void*)0x0802D69C }, { 0x1080, 0, (void*)0x0802D6E8 }, + { 0x1081, 0, (void*)0x0802D744 }, { 0x1082, 0, (void*)0x0802D7A4 }, { 0x1083, 0, (void*)0x0802D7EC }, + { 0x1084, 0, (void*)0x0802D82C }, { 0x1085, 0, (void*)0x0802D8B0 }, { 0x1086, 0, (void*)0x0802D8F0 }, + { 0x1087, 0, (void*)0x0802D954 }, { 0x1088, 0, (void*)0x0802D9DC }, { 0x1089, 0, (void*)0x0802DA24 }, + { 0x108A, 0, (void*)0x0802DA8C }, { 0x108B, 0, (void*)0x0802DACC }, { 0x108C, 0, (void*)0x0802DB30 }, + { 0x108D, 0, (void*)0x0802DBA0 }, { 0x108E, 0, (void*)0x0802DBF4 }, { 0x108F, 0, (void*)0x0802DC28 }, + { 0x1090, 0, (void*)0x0802DC94 }, { 0x1091, 0, (void*)0x0802DCFC }, { 0x1092, 0, (void*)0x0802DDC0 }, + { 0x1093, 0, (void*)0x0802DE18 }, { 0x1094, 0, (void*)0x0802DEA0 }, { 0x1095, 0, (void*)0x0802DF10 }, + { 0x1096, 0, (void*)0x0802DF78 }, { 0x1097, 0, (void*)0x0802DFE0 }, { 0x1098, 0, (void*)0x0802E024 }, + { 0x1099, 0, (void*)0x0802E088 }, { 0x109A, 0, (void*)0x0802E170 }, { 0x109B, 0, (void*)0x0802E1F8 }, + { 0x109C, 0, (void*)0x0802E240 }, { 0x109D, 0, (void*)0x0802E290 }, { 0x109E, 0, (void*)0x0802E2D8 }, + { 0x109F, 0, (void*)0x0802E308 }, { 0x10A0, 0, (void*)0x0802E364 }, { 0x10A1, 0, (void*)0x0802E3B8 }, + { 0x10A2, 0, (void*)0x0802E3DC }, { 0x10A3, 0, (void*)0x0802E480 }, { 0x10A4, 0, (void*)0x0802E4D4 }, + { 0x10A5, 0, (void*)0x0802E53C }, { 0x10A6, 0, (void*)0x0802E624 }, { 0x10A7, 0, (void*)0x0802E68C }, + { 0x10A8, 0, (void*)0x0802E738 }, { 0x10A9, 0, (void*)0x0802E78C }, { 0x10CE, 0, (void*)0x0802E830 }, + { 0x10CF, 0, (void*)0x0802E878 }, { 0x10D0, 0, (void*)0x0802E8CC }, { 0x10D1, 0, (void*)0x0802E90C }, + { 0x10D2, 0, (void*)0x0802E970 }, { 0x10D3, 0, (void*)0x0802E9A4 }, { 0x10D4, 0, (void*)0x0802E9D0 }, + { 0x10D6, 0, (void*)0x0802EA7C }, { 0x10D7, 0, (void*)0x0802EB50 }, { 0x10D8, 0, (void*)0x0802EB6C }, + { 0x10D9, 0, (void*)0x0802EBA0 }, { 0x10DA, 0, (void*)0x0802EBC8 }, { 0x10DB, 0, (void*)0x0802EC10 }, + { 0x10DC, 0, (void*)0x0802EC40 }, { 0x10DD, 0, (void*)0x0802EC6C }, { 0x10DE, 0, (void*)0x0802ECA8 }, + { 0x10DF, 0, (void*)0x0802ECD8 }, { 0x10E0, 0, (void*)0x0802ED14 }, { 0x10E1, 0, (void*)0x0802ED40 }, + { 0x10E2, 0, (void*)0x0802ED68 }, { 0x10E3, 0, (void*)0x0802EDA0 }, { 0x10E4, 0, (void*)0x0802EE18 }, + { 0x10E5, 0, (void*)0x0802EE44 }, { 0x10E6, 0, (void*)0x0802EEB0 }, { 0x10E7, 0, (void*)0x0802EEE8 }, + { 0x10E8, 0, (void*)0x0802EF24 }, { 0x10E9, 0, (void*)0x0802EF84 }, { 0x10EA, 0, (void*)0x0802EFCC }, + { 0x10EB, 0, (void*)0x0802EFF8 }, { 0x10EC, 0, (void*)0x0802F030 }, { 0x10ED, 0, (void*)0x0802F078 }, + { 0x10EE, 0, (void*)0x0802F0B4 }, { 0x10EF, 0, (void*)0x0802F0E0 }, { 0x10F0, 0, (void*)0x0802F110 }, + { 0x10F1, 0, (void*)0x0802F14C }, { 0x10F2, 0, (void*)0x0802F184 }, { 0x10F3, 0, (void*)0x0802F1A8 }, + { 0x10F4, 0, (void*)0x0802F1D4 }, { 0x10F5, 0, (void*)0x0802F204 }, { 0x10F6, 0, (void*)0x0802F258 }, + { 0x10F7, 0, (void*)0x0802F28C }, { 0x10F8, 0, (void*)0x0802F2D4 }, { 0x10F9, 0, (void*)0x0802F30C }, + { 0x10FA, 0, (void*)0x0802F334 }, { 0x10FB, 0, (void*)0x0802F3A8 }, { 0x10FC, 0, (void*)0x0802F3D8 }, + { 0x10FD, 0, (void*)0x0802F408 }, { 0x10FE, 0, (void*)0x0802F44C }, { 0x10FF, 0, (void*)0x0802F484 }, + { 0x1100, 0, (void*)0x0802F4CC }, { 0x1101, 0, (void*)0x0802F500 }, { 0x1102, 0, (void*)0x0802F590 }, + { 0x1103, 0, (void*)0x0802F5CC }, { 0x1104, 0, (void*)0x0802F604 }, { 0x1105, 0, (void*)0x0802F660 }, + { 0x1106, 0, (void*)0x0802F694 }, { 0x1107, 0, (void*)0x0802F6B8 }, { 0x1108, 0, (void*)0x0802F730 }, + { 0x1109, 0, (void*)0x0802F7B4 }, { 0x1130, 0, (void*)0x0802F7D8 }, { 0x1131, 0, (void*)0x0802F7F4 }, + { 0x1132, 0, (void*)0x0802F82C }, { 0x1133, 0, (void*)0x0802F8C0 }, { 0x1134, 0, (void*)0x0802F8E8 }, + { 0x1135, 0, (void*)0x0802F8F4 }, { 0x1136, 0, (void*)0x0802F900 }, { 0x1137, 0, (void*)0x0802F960 }, + { 0x1138, 0, (void*)0x0802F9D0 }, { 0x1139, 0, (void*)0x0802FA70 }, { 0x113A, 0, (void*)0x0802FB2C }, + { 0x113B, 0, (void*)0x0802FB64 }, { 0x113C, 0, (void*)0x0802FBF4 }, { 0x113D, 0, (void*)0x0802FC4C }, + { 0x113E, 0, (void*)0x0802FCA0 }, { 0x113F, 0, (void*)0x0802FD10 }, { 0x1140, 0, (void*)0x0802FDA8 }, + { 0x1141, 0, (void*)0x0802FE38 }, { 0x1142, 0, (void*)0x0802FE7C }, { 0x1143, 0, (void*)0x0802FEBC }, + { 0x1144, 0, (void*)0x0802FEF8 }, { 0x1145, 0, (void*)0x0802FF58 }, { 0x1146, 0, (void*)0x0802FFB4 }, + { 0x1147, 0, (void*)0x08030004 }, { 0x1148, 0, (void*)0x08030018 }, { 0x1149, 0, (void*)0x080300B8 }, + { 0x114A, 0, (void*)0x08030114 }, { 0x114B, 0, (void*)0x08030170 }, { 0x114C, 0, (void*)0x080301CC }, + { 0x114D, 0, (void*)0x08030228 }, { 0x114E, 0, (void*)0x08030284 }, { 0x114F, 0, (void*)0x080302E0 }, + { 0x1150, 0, (void*)0x08030318 }, { 0x1151, 0, (void*)0x080303C8 }, { 0x1152, 0, (void*)0x080303DC }, + { 0x1194, 0, (void*)0x08030438 }, { 0x1195, 0, (void*)0x08030458 }, { 0x1196, 0, (void*)0x080304AC }, + { 0x1197, 0, (void*)0x080304E0 }, { 0x1198, 0, (void*)0x08030578 }, { 0x1199, 0, (void*)0x080305E4 }, + { 0x119A, 0, (void*)0x080305FC }, { 0x119B, 0, (void*)0x08030638 }, { 0x119C, 0, (void*)0x080306D0 }, + { 0x119D, 0, (void*)0x08030748 }, { 0x119E, 0, (void*)0x08030770 }, { 0x119F, 0, (void*)0x08030784 }, + { 0x11A0, 0, (void*)0x080307EC }, { 0x11A1, 0, (void*)0x08030828 }, { 0x11A2, 0, (void*)0x080308E0 }, + { 0x11A3, 0, (void*)0x08030918 }, { 0x11A4, 0, (void*)0x08030934 }, { 0x11A5, 0, (void*)0x08030948 }, + { 0x11A6, 0, (void*)0x080309BC }, { 0x11A7, 0, (void*)0x080309E8 }, { 0x11A8, 0, (void*)0x08030A38 }, + { 0x11A9, 0, (void*)0x08030A60 }, { 0x11AA, 0, (void*)0x08030AA0 }, { 0x11AB, 0, (void*)0x08030ADC }, + { 0x11AC, 0, (void*)0x08030B10 }, { 0x11AD, 0, (void*)0x08030B40 }, { 0x11AE, 0, (void*)0x08030B80 }, + { 0x11AF, 0, (void*)0x08030BB4 }, { 0x11F8, 0, (void*)0x08030BFC }, { 0x11F9, 0, (void*)0x08030C64 }, + { 0x11FA, 0, (void*)0x08030CA0 }, { 0x11FB, 0, (void*)0x08030D28 }, { 0x11FC, 0, (void*)0x08030D58 }, + { 0x11FD, 0, (void*)0x08030E14 }, { 0x11FE, 0, (void*)0x08030E94 }, { 0x11FF, 0, (void*)0x08030F2C }, + { 0x1200, 0, (void*)0x08030F6C }, { 0x1201, 0, (void*)0x08031004 }, { 0x1202, 0, (void*)0x08031038 }, + { 0x1203, 0, (void*)0x080310A4 }, { 0x1204, 0, (void*)0x08031110 }, { 0x1205, 0, (void*)0x08031154 }, + { 0x1206, 0, (void*)0x080311EC }, { 0x1207, 0, (void*)0x08031230 }, { 0x1208, 0, (void*)0x08031290 }, + { 0x1209, 0, (void*)0x080312C4 }, { 0x120A, 0, (void*)0x08031304 }, { 0x120B, 0, (void*)0x08031320 }, + { 0x120C, 0, (void*)0x08031348 }, { 0x120D, 0, (void*)0x08031390 }, { 0x120E, 0, (void*)0x080313DC }, + { 0x120F, 0, (void*)0x08031470 }, { 0x1210, 0, (void*)0x08031498 }, { 0x1211, 0, (void*)0x08031520 }, + { 0x1212, 0, (void*)0x08031580 }, { 0x1213, 0, (void*)0x080315A8 }, { 0x1214, 0, (void*)0x08031644 }, + { 0x1215, 0, (void*)0x080316AC }, { 0x1216, 0, (void*)0x08031708 }, { 0x1217, 0, (void*)0x0803176C }, + { 0x1218, 0, (void*)0x080317BC }, { 0x1219, 0, (void*)0x080317E8 }, { 0x121A, 0, (void*)0x08031834 }, + { 0x121B, 0, (void*)0x080318B8 }, { 0x121C, 0, (void*)0x08031900 }, { 0x121D, 0, (void*)0x08031930 }, + { 0x121E, 0, (void*)0x08031984 }, { 0x121F, 0, (void*)0x080319C8 }, { 0x1220, 0, (void*)0x08031A08 }, + { 0x1221, 0, (void*)0x08031A7C }, { 0x1222, 0, (void*)0x08031AFC }, { 0x1223, 0, (void*)0x08031B68 }, + { 0x1224, 0, (void*)0x08031BC0 }, { 0x1225, 0, (void*)0x08031C10 }, { 0x1226, 0, (void*)0x08031CD4 }, + { 0x1227, 0, (void*)0x08031D38 }, { 0x1228, 0, (void*)0x08031DC0 }, { 0x1229, 0, (void*)0x08031E00 }, + { 0x122A, 0, (void*)0x08031E54 }, { 0x122B, 0, (void*)0x08031E80 }, { 0x122C, 0, (void*)0x08031EF8 }, + { 0x122D, 0, (void*)0x08031F1C }, { 0x122E, 0, (void*)0x08031FA4 }, { 0x122F, 0, (void*)0x0803202C }, + { 0x1230, 0, (void*)0x08032050 }, { 0x1231, 0, (void*)0x0803210C }, { 0x1232, 0, (void*)0x08032148 }, + { 0x1233, 0, (void*)0x080321B4 }, { 0x1234, 0, (void*)0x08032200 }, { 0x1235, 0, (void*)0x08032250 }, + { 0x1236, 0, (void*)0x080322C4 }, { 0x1237, 0, (void*)0x08032330 }, { 0x1238, 0, (void*)0x08032364 }, + { 0x1239, 0, (void*)0x08032414 }, { 0x123A, 0, (void*)0x08032464 }, { 0x123B, 0, (void*)0x08032504 }, + { 0x123C, 0, (void*)0x08032550 }, { 0x123D, 0, (void*)0x080325A4 }, { 0x123E, 0, (void*)0x08032638 }, + { 0x123F, 0, (void*)0x08032698 }, { 0x1240, 0, (void*)0x080326FC }, { 0x1241, 0, (void*)0x080327D4 }, + { 0x1242, 0, (void*)0x0803284C }, { 0x1243, 0, (void*)0x08032904 }, { 0x1244, 0, (void*)0x08032964 }, + { 0x1245, 0, (void*)0x080329B8 }, { 0x1246, 0, (void*)0x080329E4 }, { 0x1247, 0, (void*)0x08032A54 }, + { 0x1248, 0, (void*)0x08032AC0 }, { 0x1249, 0, (void*)0x08032B08 }, { 0x124A, 0, (void*)0x08032B68 }, + { 0x124B, 0, (void*)0x08032BC4 }, { 0x124C, 0, (void*)0x08032BE0 }, { 0x124D, 0, (void*)0x08032C24 }, + { 0x124E, 0, (void*)0x08032C68 }, { 0x124F, 0, (void*)0x08032CD8 }, { 0x1250, 0, (void*)0x08032D1C }, + { 0x1251, 0, (void*)0x08032D6C }, { 0x1252, 0, (void*)0x08032DE4 }, { 0x1253, 0, (void*)0x08032E0C }, + { 0x1254, 0, (void*)0x08032E60 }, { 0x1255, 0, (void*)0x08032EC4 }, { 0x1256, 0, (void*)0x08032F38 }, + { 0x1257, 0, (void*)0x08032F7C }, { 0x1258, 0, (void*)0x08032FF4 }, { 0x1259, 0, (void*)0x08033030 }, + { 0x125A, 0, (void*)0x080330BC }, { 0x125B, 0, (void*)0x080330F8 }, { 0x125C, 0, (void*)0x0803319C }, + { 0x125D, 0, (void*)0x08033224 }, { 0x125E, 0, (void*)0x080332D0 }, { 0x125F, 0, (void*)0x08033358 }, + { 0x1260, 0, (void*)0x080333CC }, { 0x1261, 0, (void*)0x08033410 }, { 0x1262, 0, (void*)0x08033450 }, + { 0x1263, 0, (void*)0x080334BC }, { 0x1264, 0, (void*)0x080334F4 }, { 0x1265, 0, (void*)0x0803353C }, + { 0x1266, 0, (void*)0x08033588 }, { 0x1267, 0, (void*)0x080335F4 }, { 0x1268, 0, (void*)0x08033678 }, + { 0x1269, 0, (void*)0x0803370C }, { 0x126A, 0, (void*)0x08033778 }, { 0x126B, 0, (void*)0x080337CC }, + { 0x126C, 0, (void*)0x08033830 }, { 0x126D, 0, (void*)0x080338B0 }, { 0x126E, 0, (void*)0x08033934 }, + { 0x126F, 0, (void*)0x0803397C }, { 0x1270, 0, (void*)0x080339F0 }, { 0x1271, 0, (void*)0x08033A14 }, + { 0x1272, 0, (void*)0x08033A44 }, { 0x1273, 0, (void*)0x08033A88 }, { 0x1274, 0, (void*)0x08033AE0 }, + { 0x1275, 0, (void*)0x08033B74 }, { 0x1276, 0, (void*)0x08033BC0 }, { 0x1277, 0, (void*)0x08033C24 }, + { 0x1278, 0, (void*)0x08033CA0 }, { 0x1279, 0, (void*)0x08033D10 }, { 0x127A, 0, (void*)0x08033D80 }, + { 0x127B, 0, (void*)0x08033DB4 }, { 0x127C, 0, (void*)0x08033E18 }, { 0x127D, 0, (void*)0x08033E68 }, + { 0x127E, 0, (void*)0x08033EB4 }, { 0x127F, 0, (void*)0x08033F04 }, { 0x1280, 0, (void*)0x08033F58 }, + { 0x1281, 0, (void*)0x08033FB8 }, { 0x1282, 0, (void*)0x08034014 }, { 0x1283, 0, (void*)0x08034044 }, + { 0x1284, 0, (void*)0x0803409C }, { 0x1285, 0, (void*)0x080340EC }, { 0x1286, 0, (void*)0x08034140 }, + { 0x1287, 0, (void*)0x080341A0 }, { 0x1288, 0, (void*)0x08034204 }, { 0x1289, 0, (void*)0x08034248 }, + { 0x128A, 0, (void*)0x080342A8 }, { 0x128B, 0, (void*)0x080342E0 }, { 0x128C, 0, (void*)0x08034314 }, + { 0x128D, 0, (void*)0x08034340 }, { 0x128E, 0, (void*)0x08034368 }, { 0x128F, 0, (void*)0x080343C8 }, + { 0x1290, 0, (void*)0x0803445C }, { 0x1291, 0, (void*)0x080344E8 }, { 0x1292, 0, (void*)0x08034528 }, + { 0x1293, 0, (void*)0x08034538 }, { 0x1294, 0, (void*)0x08034578 }, { 0x1295, 0, (void*)0x080345C4 }, + { 0x1296, 0, (void*)0x08034618 }, { 0x1297, 0, (void*)0x08034680 }, { 0x1298, 0, (void*)0x080346AC }, + { 0x1299, 0, (void*)0x08034728 }, { 0x129A, 0, (void*)0x0803479C }, { 0x129B, 0, (void*)0x08034808 }, + { 0x129C, 0, (void*)0x08034854 }, { 0x129D, 0, (void*)0x08034888 }, { 0x129E, 0, (void*)0x080348B4 }, + { 0x129F, 0, (void*)0x080348FC }, { 0x12A0, 0, (void*)0x08034938 }, { 0x12A1, 0, (void*)0x08034984 }, + { 0x12A2, 0, (void*)0x080349C4 }, { 0x12A3, 0, (void*)0x08034A24 }, { 0x12A4, 0, (void*)0x08034A80 }, + { 0x12A5, 0, (void*)0x08034AF0 }, { 0x12A6, 0, (void*)0x08034B40 }, { 0x12A7, 0, (void*)0x08034B74 }, + { 0x12A8, 0, (void*)0x08034BCC }, { 0x12A9, 0, (void*)0x08034C2C }, { 0x12AA, 0, (void*)0x08034CA0 }, + { 0x12AB, 0, (void*)0x08034CDC }, { 0x12AC, 0, (void*)0x08034D50 }, { 0x12AD, 0, (void*)0x08034D9C }, + { 0x12AE, 0, (void*)0x08034E10 }, { 0x12AF, 0, (void*)0x08034E40 }, { 0x12B0, 0, (void*)0x08034E70 }, + { 0x12B1, 0, (void*)0x08034EDC }, { 0x12B2, 0, (void*)0x08034F28 }, { 0x12B3, 0, (void*)0x08034F74 }, + { 0x12B4, 0, (void*)0x08034FA0 }, { 0x12B5, 0, (void*)0x08034FF4 }, { 0x12B6, 0, (void*)0x08035018 }, + { 0x12B7, 0, (void*)0x0803504C }, { 0x12B8, 0, (void*)0x08035078 }, { 0x12B9, 0, (void*)0x080350C0 }, + { 0x12BA, 0, (void*)0x080350F0 }, { 0x12BB, 0, (void*)0x08035134 }, { 0x12BC, 0, (void*)0x0803516C }, + { 0x12BD, 0, (void*)0x080351D0 }, { 0x12BE, 0, (void*)0x0803521C }, { 0x12BF, 0, (void*)0x08035288 }, + { 0x12C0, 0, (void*)0x08035308 }, { 0x12C1, 0, (void*)0x0803534C }, { 0x12C2, 0, (void*)0x0803539C }, + { 0x12C3, 0, (void*)0x080353CC }, { 0x12C4, 0, (void*)0x08035410 }, { 0x12C5, 0, (void*)0x08035470 }, + { 0x12C6, 0, (void*)0x080354B8 }, { 0x12C7, 0, (void*)0x08035520 }, { 0x12C8, 0, (void*)0x08035560 }, + { 0x12C9, 0, (void*)0x08035604 }, { 0x12CA, 0, (void*)0x0803566C }, { 0x12CB, 0, (void*)0x080356A4 }, + { 0x12CC, 0, (void*)0x080356E4 }, { 0x12CD, 0, (void*)0x0803577C }, { 0x12CE, 0, (void*)0x080357EC }, + { 0x12CF, 0, (void*)0x0803581C }, { 0x12D0, 0, (void*)0x08035848 }, { 0x12D1, 0, (void*)0x08035888 }, + { 0x12D2, 0, (void*)0x080358D0 }, { 0x12D3, 0, (void*)0x080358E8 }, { 0x12D4, 0, (void*)0x0803590C }, + { 0x12D5, 0, (void*)0x0803592C }, { 0x12D6, 0, (void*)0x0803596C }, { 0x12D7, 0, (void*)0x080359C4 }, + { 0x12D8, 0, (void*)0x08035A10 }, { 0x12D9, 0, (void*)0x08035A80 }, { 0x12DA, 0, (void*)0x08035ADC }, + { 0x12DB, 0, (void*)0x08035B48 }, { 0x12DC, 0, (void*)0x08035BB8 }, { 0x12DD, 0, (void*)0x08035BF8 }, + { 0x12DE, 0, (void*)0x08035C74 }, { 0x12DF, 0, (void*)0x08035CB0 }, { 0x12E0, 0, (void*)0x08035D10 }, + { 0x12E3, 0, (void*)0x08035D4C }, { 0x12E4, 0, (void*)0x08035D70 }, { 0x12E5, 0, (void*)0x08035DAC }, + { 0x12E6, 0, (void*)0x08035DD8 }, { 0x12E7, 0, (void*)0x08035DF4 }, { 0x12E8, 0, (void*)0x08035E0C }, + { 0x12E9, 0, (void*)0x08035E58 }, { 0x12EA, 0, (void*)0x08035ED4 }, { 0x12EB, 0, (void*)0x08035F44 }, + { 0x12EC, 0, (void*)0x08036074 }, { 0x12ED, 0, (void*)0x080360BC }, { 0x12EE, 0, (void*)0x08036104 }, + { 0x12EF, 0, (void*)0x0803613C }, { 0x12F0, 0, (void*)0x080361A0 }, { 0x12F1, 0, (void*)0x080361F0 }, + { 0x12F2, 0, (void*)0x08036248 }, { 0x12F3, 0, (void*)0x08036260 }, { 0x12F4, 0, (void*)0x080362A0 }, + { 0x12F5, 0, (void*)0x08036300 }, { 0x12F6, 0, (void*)0x08036324 }, { 0x12F7, 0, (void*)0x080363A0 }, + { 0x12F8, 0, (void*)0x0803640C }, { 0x12F9, 0, (void*)0x08036474 }, { 0x12FA, 0, (void*)0x080364CC }, + { 0x12FB, 0, (void*)0x08036508 }, { 0x12FC, 0, (void*)0x0803655C }, { 0x12FD, 0, (void*)0x08036578 }, + { 0x12FE, 0, (void*)0x080365D4 }, { 0x12FF, 0, (void*)0x080365F8 }, { 0x1300, 0, (void*)0x08036654 }, + { 0x1301, 0, (void*)0x080366A4 }, { 0x1302, 0, (void*)0x080366F0 }, { 0x1303, 0, (void*)0x08036738 }, + { 0x1304, 0, (void*)0x08036770 }, { 0x1305, 0, (void*)0x080367AC }, { 0x1306, 0, (void*)0x080367F0 }, + { 0x1307, 0, (void*)0x08036830 }, { 0x1308, 0, (void*)0x08036850 }, { 0x1309, 0, (void*)0x0803688C }, + { 0x130A, 0, (void*)0x080368F0 }, { 0x130B, 0, (void*)0x08036924 }, { 0x130C, 0, (void*)0x0803695C }, + { 0x130D, 0, (void*)0x080369A8 }, { 0x130E, 0, (void*)0x080369FC }, { 0x130F, 0, (void*)0x08036A40 }, + { 0x1310, 0, (void*)0x08036A74 }, { 0x1311, 0, (void*)0x08036AB8 }, { 0x1312, 0, (void*)0x08036B14 }, + { 0x1313, 0, (void*)0x08036B4C }, { 0x1314, 0, (void*)0x08036BAC }, { 0x1315, 0, (void*)0x08036C0C }, + { 0x1316, 0, (void*)0x08036C64 }, { 0x1317, 0, (void*)0x08036CBC }, { 0x1318, 0, (void*)0x08036D1C }, + { 0x1319, 0, (void*)0x08036D80 }, { 0x131A, 0, (void*)0x08036DC4 }, { 0x131B, 0, (void*)0x08036E0C }, + { 0x131C, 0, (void*)0x08036E8C }, { 0x131D, 0, (void*)0x08036F14 }, { 0x1388, 0, (void*)0x08036F8C }, + { 0x1389, 0, (void*)0x08036FB4 }, { 0x138A, 0, (void*)0x08036FF8 }, { 0x138B, 0, (void*)0x08037034 }, + { 0x138C, 0, (void*)0x08037060 }, { 0x138D, 0, (void*)0x0803709C }, { 0x138E, 0, (void*)0x0803711C }, + { 0x138F, 0, (void*)0x08037140 }, { 0x1390, 0, (void*)0x08037178 }, { 0x1391, 0, (void*)0x080371AC }, + { 0x1392, 0, (void*)0x08037204 }, { 0x1393, 0, (void*)0x08037234 }, { 0x1394, 0, (void*)0x08037288 }, + { 0x1395, 0, (void*)0x080372BC }, { 0x1396, 0, (void*)0x080372F0 }, { 0x1397, 0, (void*)0x08037310 }, + { 0x1398, 0, (void*)0x08037338 }, { 0x1399, 0, (void*)0x080373C4 }, { 0x139A, 0, (void*)0x08037438 }, + { 0x139B, 0, (void*)0x080374A0 }, { 0x139C, 0, (void*)0x0803751C }, { 0x139D, 0, (void*)0x0803758C }, + { 0x139E, 0, (void*)0x08037620 }, { 0x139F, 0, (void*)0x08037704 }, { 0x13A0, 0, (void*)0x08037764 }, + { 0x13A1, 0, (void*)0x080377F4 }, { 0x13A2, 0, (void*)0x08037838 }, { 0x13A3, 0, (void*)0x08037894 }, + { 0x13A4, 0, (void*)0x08037918 }, { 0x13A5, 0, (void*)0x08037974 }, { 0x13A6, 0, (void*)0x080379CC }, + { 0x13A7, 0, (void*)0x08037A68 }, { 0x13A8, 0, (void*)0x08037ACC }, { 0x13AE, 0, (void*)0x08037B5C }, + { 0x13AF, 0, (void*)0x08037BF8 }, { 0x13B0, 0, (void*)0x08037CE0 }, { 0x13B1, 0, (void*)0x08037D2C }, + { 0x13B2, 0, (void*)0x08037D54 }, { 0x13B3, 0, (void*)0x08037D74 }, { 0x13EC, 0, (void*)0x08037DB8 }, + { 0x13ED, 0, (void*)0x08037DCC }, { 0x13EE, 0, (void*)0x08037E30 }, { 0x13EF, 0, (void*)0x08037EB4 }, + { 0x13F0, 0, (void*)0x08037EF4 }, { 0x13F1, 0, (void*)0x08037F34 }, { 0x13F2, 0, (void*)0x08037F74 }, + { 0x13F3, 0, (void*)0x08037F8C }, { 0x13F4, 0, (void*)0x08037FA4 }, { 0x13F5, 0, (void*)0x08037FC8 }, + { 0x13F6, 0, (void*)0x08037FF8 }, { 0x13F7, 0, (void*)0x0803800C }, { 0x13F8, 0, (void*)0x0803803C }, + { 0x13F9, 0, (void*)0x08038084 }, { 0x13FA, 0, (void*)0x080380C8 }, { 0x13FB, 0, (void*)0x08038108 }, + { 0x13FC, 0, (void*)0x080381A4 }, { 0x13FD, 0, (void*)0x080381FC }, { 0x13FE, 0, (void*)0x08038254 }, + { 0x13FF, 0, (void*)0x080382D8 }, { 0x1400, 0, (void*)0x080383A8 }, { 0x1401, 0, (void*)0x08038504 }, + { 0x1402, 0, (void*)0x080385A8 }, { 0x1403, 0, (void*)0x08038630 }, { 0x1404, 0, (void*)0x0803868C }, + { 0x1405, 0, (void*)0x080386C4 }, { 0x1406, 0, (void*)0x08038728 }, { 0x1407, 0, (void*)0x08038824 }, + { 0x1408, 0, (void*)0x08038844 }, { 0x1409, 0, (void*)0x080388F4 }, { 0x140A, 0, (void*)0x08038984 }, + { 0x140B, 0, (void*)0x080389D0 }, { 0x140C, 0, (void*)0x08038A3C }, { 0x140D, 0, (void*)0x08038A88 }, + { 0x140E, 0, (void*)0x08038AE8 }, { 0x140F, 0, (void*)0x08038B20 }, { 0x1410, 0, (void*)0x08038B60 }, + { 0x1411, 0, (void*)0x08038BBC }, { 0x1412, 0, (void*)0x08038BF4 }, { 0x1413, 0, (void*)0x08038C34 }, + { 0x1414, 0, (void*)0x08038CC0 }, { 0x1450, 0, (void*)0x08038D04 }, { 0x1451, 0, (void*)0x08038EC4 }, + { 0x1452, 0, (void*)0x08038EF8 }, { 0x1453, 0, (void*)0x08038F10 }, { 0x1454, 0, (void*)0x08038F50 }, + { 0x1455, 0, (void*)0x08038F9C }, { 0x1456, 0, (void*)0x08038FE4 }, { 0x1457, 0, (void*)0x08039064 }, + { 0x1458, 0, (void*)0x080390A8 }, { 0x1459, 0, (void*)0x080390D4 }, { 0x145A, 0, (void*)0x08039128 }, + { 0x145B, 0, (void*)0x08039198 }, { 0x145C, 0, (void*)0x080391C4 }, { 0x145D, 0, (void*)0x080391D8 }, + { 0x145E, 0, (void*)0x08039204 }, { 0x145F, 0, (void*)0x080392B0 }, { 0x1460, 0, (void*)0x08039360 }, + { 0x1461, 0, (void*)0x080393A8 }, { 0x1462, 0, (void*)0x080393BC }, { 0x1463, 0, (void*)0x080393EC }, + { 0x1464, 0, (void*)0x0803940C }, { 0x1465, 0, (void*)0x0803942C }, { 0x1466, 0, (void*)0x08039454 }, + { 0x1467, 0, (void*)0x0803948C }, { 0x1468, 0, (void*)0x080394E8 }, { 0x1469, 0, (void*)0x08039548 }, + { 0x146A, 0, (void*)0x080395A8 }, { 0x146B, 0, (void*)0x08039638 }, { 0x146C, 0, (void*)0x08039700 }, + { 0x146D, 0, (void*)0x08039738 }, { 0x146E, 0, (void*)0x08039758 }, { 0x146F, 0, (void*)0x080397D8 }, + { 0x1470, 0, (void*)0x08039858 }, { 0x1471, 0, (void*)0x08039880 }, { 0x1472, 0, (void*)0x080398B8 }, + { 0x1473, 0, (void*)0x08039924 }, { 0x1474, 0, (void*)0x08039950 }, { 0x1475, 0, (void*)0x08039A64 }, + { 0x1476, 0, (void*)0x08039AE8 }, { 0x1477, 0, (void*)0x08039B4C }, { 0x1478, 0, (void*)0x08039B70 }, + { 0x1479, 0, (void*)0x08039B98 }, { 0x147A, 0, (void*)0x08039BCC }, { 0x147B, 0, (void*)0x08039C00 }, + { 0x147C, 0, (void*)0x08039D6C }, { 0x147D, 0, (void*)0x08039E18 }, { 0x14B4, 0, (void*)0x08039E78 }, + { 0x14B5, 0, (void*)0x08039EA8 }, { 0x14B6, 0, (void*)0x08039EF8 }, { 0x14B7, 0, (void*)0x08039F64 }, + { 0x14B8, 0, (void*)0x08039F90 }, { 0x14B9, 0, (void*)0x08039FE4 }, { 0x14BA, 0, (void*)0x0803A044 }, + { 0x14BB, 0, (void*)0x0803A090 }, { 0x14BC, 0, (void*)0x0803A110 }, { 0x14BD, 0, (void*)0x0803A138 }, + { 0x14BE, 0, (void*)0x0803A1B8 }, { 0x14BF, 0, (void*)0x0803A208 }, { 0x14C0, 0, (void*)0x0803A25C }, + { 0x14C1, 0, (void*)0x0803A29C }, { 0x14C2, 0, (void*)0x0803A2E8 }, { 0x14C3, 0, (void*)0x0803A384 }, + { 0x14C4, 0, (void*)0x0803A3FC }, { 0x14C5, 0, (void*)0x0803A458 }, { 0x14C6, 0, (void*)0x0803A514 }, + { 0x14C7, 0, (void*)0x0803A540 }, { 0x14C8, 0, (void*)0x0803A570 }, { 0x14C9, 0, (void*)0x0803A5E4 }, + { 0x14CA, 0, (void*)0x0803A614 }, { 0x14CB, 0, (void*)0x0803A684 }, { 0x14CC, 0, (void*)0x0803A700 }, + { 0x14CD, 0, (void*)0x0803A79C }, { 0x14CE, 0, (void*)0x0803A7B8 }, { 0x14CF, 0, (void*)0x0803A880 }, + { 0x14D0, 0, (void*)0x0803A8AC }, { 0x14D1, 0, (void*)0x0803A96C }, { 0x14D2, 0, (void*)0x0803AA08 }, + { 0x14D3, 0, (void*)0x0803AA80 }, { 0x14D4, 0, (void*)0x0803AB40 }, { 0x14D5, 0, (void*)0x0803AB80 }, + { 0x14D6, 0, (void*)0x0803ABC0 }, { 0x14D7, 0, (void*)0x0803AC30 }, { 0x14D8, 0, (void*)0x0803AC78 }, + { 0x14D9, 0, (void*)0x0803ACEC }, { 0x14DA, 0, (void*)0x0803AD64 }, { 0x14DB, 0, (void*)0x0803AD8C }, + { 0x14DC, 0, (void*)0x0803ADB8 }, { 0x14DD, 0, (void*)0x0803ADEC }, { 0x14DE, 0, (void*)0x0803AE40 }, + { 0x14DF, 0, (void*)0x0803AEAC }, { 0x14E0, 0, (void*)0x0803AEFC }, { 0x14E1, 0, (void*)0x0803AF58 }, + { 0x14E2, 0, (void*)0x0803AFDC }, { 0x14E3, 0, (void*)0x0803B018 }, { 0x14E4, 0, (void*)0x0803B044 }, + { 0x14E5, 0, (void*)0x0803B07C }, { 0x14E6, 0, (void*)0x0803B100 }, { 0x14E7, 0, (void*)0x0803B13C }, + { 0x14E8, 0, (void*)0x0803B19C }, { 0x14E9, 0, (void*)0x0803B220 }, { 0x14EA, 0, (void*)0x0803B2A0 }, + { 0x14EB, 0, (void*)0x0803B358 }, { 0x14EC, 0, (void*)0x0803B398 }, { 0x14ED, 0, (void*)0x0803B40C }, + { 0x14EE, 0, (void*)0x0803B518 }, { 0x14EF, 0, (void*)0x0803B5F8 }, { 0x14F0, 0, (void*)0x0803B63C }, + { 0x14F1, 0, (void*)0x0803B6A8 }, { 0x14F2, 0, (void*)0x0803B734 }, { 0x14F3, 0, (void*)0x0803B7B8 }, + { 0x14F4, 0, (void*)0x0803B834 }, { 0x14F5, 0, (void*)0x0803B910 }, { 0x14F6, 0, (void*)0x0803B984 }, + { 0x14F7, 0, (void*)0x0803B9F0 }, { 0x14F8, 0, (void*)0x0803BA80 }, { 0x14F9, 0, (void*)0x0803BAB8 }, + { 0x14FA, 0, (void*)0x0803BAF8 }, { 0x14FB, 0, (void*)0x0803BB60 }, { 0x14FC, 0, (void*)0x0803BB8C }, + { 0x1518, 0, (void*)0x0803BBFC }, { 0x1519, 0, (void*)0x0803BC5C }, { 0x151A, 0, (void*)0x0803BCB0 }, + { 0x151B, 0, (void*)0x0803BCC8 }, { 0x151C, 0, (void*)0x0803BCF8 }, { 0x151D, 0, (void*)0x0803BD44 }, + { 0x151E, 0, (void*)0x0803BDB8 }, { 0x151F, 0, (void*)0x0803BDFC }, { 0x1520, 0, (void*)0x0803BE9C }, + { 0x1521, 0, (void*)0x0803BF18 }, { 0x1522, 0, (void*)0x0803BF64 }, { 0x1523, 0, (void*)0x0803BF8C }, + { 0x1524, 0, (void*)0x0803BFA4 }, { 0x1525, 0, (void*)0x0803BFD8 }, { 0x1526, 0, (void*)0x0803BFF8 }, + { 0x1527, 0, (void*)0x0803C014 }, { 0x1528, 0, (void*)0x0803C068 }, { 0x1529, 0, (void*)0x0803C0EC }, + { 0x152A, 0, (void*)0x0803C174 }, { 0x152B, 0, (void*)0x0803C1CC }, { 0x152C, 0, (void*)0x0803C22C }, + { 0x152D, 0, (void*)0x0803C290 }, { 0x152E, 0, (void*)0x0803C314 }, { 0x152F, 0, (void*)0x0803C398 }, + { 0x1530, 0, (void*)0x0803C3F0 }, { 0x1531, 0, (void*)0x0803C454 }, { 0x1532, 0, (void*)0x0803C4DC }, + { 0x1533, 0, (void*)0x0803C518 }, { 0x1534, 0, (void*)0x0803C564 }, { 0x1535, 0, (void*)0x0803C5A4 }, + { 0x1536, 0, (void*)0x0803C5E4 }, { 0x1537, 0, (void*)0x0803C644 }, { 0x1538, 0, (void*)0x0803C6C8 }, + { 0x1539, 0, (void*)0x0803C744 }, { 0x153A, 0, (void*)0x0803C7E0 }, { 0x153B, 0, (void*)0x0803C80C }, + { 0x153C, 0, (void*)0x0803C84C }, { 0x153D, 0, (void*)0x0803C884 }, { 0x153E, 0, (void*)0x0803C89C }, + { 0x153F, 0, (void*)0x0803C8DC }, { 0x1540, 0, (void*)0x0803C908 }, { 0x1541, 0, (void*)0x0803C944 }, + { 0x1542, 0, (void*)0x0803C9A0 }, { 0x157C, 0, (void*)0x0803C9BC }, { 0x157D, 0, (void*)0x0803C9D4 }, + { 0x157E, 0, (void*)0x0803CA30 }, { 0x157F, 0, (void*)0x0803CA70 }, { 0x1580, 0, (void*)0x0803CAA0 }, + { 0x1581, 0, (void*)0x0803CAEC }, { 0x1582, 0, (void*)0x0803CB04 }, { 0x1583, 0, (void*)0x0803CB18 }, + { 0x1584, 0, (void*)0x0803CB30 }, { 0x1585, 0, (void*)0x0803CB64 }, { 0x1586, 0, (void*)0x0803CBD8 }, + { 0x1587, 0, (void*)0x0803CBF4 }, { 0x1588, 0, (void*)0x0803CC34 }, { 0x1589, 0, (void*)0x0803CC78 }, + { 0x158A, 0, (void*)0x0803CD14 }, { 0x158B, 0, (void*)0x0803CDA0 }, { 0x158C, 0, (void*)0x0803CDE0 }, + { 0x158D, 0, (void*)0x0803CE3C }, { 0x158E, 0, (void*)0x0803CEA8 }, { 0x158F, 0, (void*)0x0803CEE8 }, + { 0x1590, 0, (void*)0x0803CF30 }, { 0x1591, 0, (void*)0x0803CFA4 }, { 0x1592, 0, (void*)0x0803D050 }, + { 0x1593, 0, (void*)0x0803D0C8 }, { 0x1594, 0, (void*)0x0803D118 }, { 0x1595, 0, (void*)0x0803D168 }, + { 0x1596, 0, (void*)0x0803D1A8 }, { 0x1597, 0, (void*)0x0803D1F0 }, { 0x1598, 0, (void*)0x0803D228 }, + { 0x1599, 0, (void*)0x0803D290 }, { 0x159A, 0, (void*)0x0803D2FC }, { 0x159B, 0, (void*)0x0803D368 }, + { 0x159C, 0, (void*)0x0803D448 }, { 0x159D, 0, (void*)0x0803D4C0 }, { 0x159E, 0, (void*)0x0803D500 }, + { 0x159F, 0, (void*)0x0803D558 }, { 0x15A0, 0, (void*)0x0803D5B4 }, { 0x15A1, 0, (void*)0x0803D628 }, + { 0x15A2, 0, (void*)0x0803D730 }, { 0x15A3, 0, (void*)0x0803D798 }, { 0x15A4, 0, (void*)0x0803D818 }, + { 0x15A5, 0, (void*)0x0803D868 }, { 0x15A6, 0, (void*)0x0803D8C4 }, { 0x15A7, 0, (void*)0x0803D9AC }, + { 0x15A8, 0, (void*)0x0803D9FC }, { 0x15E0, 0, (void*)0x0803DA3C }, { 0x15E1, 0, (void*)0x0803DA80 }, + { 0x15E2, 0, (void*)0x0803DB14 }, { 0x15E3, 0, (void*)0x0803DB9C }, { 0x15E4, 0, (void*)0x0803DC1C }, + { 0x15E5, 0, (void*)0x0803DC70 }, { 0x15E6, 0, (void*)0x0803DCA8 }, { 0x15E7, 0, (void*)0x0803DCF8 }, + { 0x15E8, 0, (void*)0x0803DD5C }, { 0x15E9, 0, (void*)0x0803DE00 }, { 0x15EA, 0, (void*)0x0803DE5C }, + { 0x15EB, 0, (void*)0x0803DE84 }, { 0x15EC, 0, (void*)0x0803DED0 }, { 0x15ED, 0, (void*)0x0803DF34 }, + { 0x15EE, 0, (void*)0x0803DF64 }, { 0x15EF, 0, (void*)0x0803DF9C }, { 0x15F0, 0, (void*)0x0803DFBC }, + { 0x15F1, 0, (void*)0x0803E018 }, { 0x15F2, 0, (void*)0x0803E0B8 }, { 0x15F3, 0, (void*)0x0803E124 }, + { 0x15F4, 0, (void*)0x0803E178 }, { 0x15F5, 0, (void*)0x0803E1E0 }, { 0x15F6, 0, (void*)0x0803E298 }, + { 0x15F7, 0, (void*)0x0803E310 }, { 0x15F8, 0, (void*)0x0803E36C }, { 0x15F9, 0, (void*)0x0803E3D0 }, + { 0x15FA, 0, (void*)0x0803E420 }, { 0x15FB, 0, (void*)0x0803E454 }, { 0x15FC, 0, (void*)0x0803E488 }, + { 0x15FD, 0, (void*)0x0803E4E8 }, { 0x15FE, 0, (void*)0x0803E59C }, { 0x15FF, 0, (void*)0x0803E620 }, + { 0x1600, 0, (void*)0x0803E66C }, { 0x1601, 0, (void*)0x0803E70C }, { 0x1602, 0, (void*)0x0803E74C }, + { 0x1603, 0, (void*)0x0803E7A4 }, { 0x1604, 0, (void*)0x0803E7DC }, { 0x1605, 0, (void*)0x0803E804 }, + { 0x1606, 0, (void*)0x0803E864 }, { 0x1607, 0, (void*)0x0803E8E8 }, { 0x1608, 0, (void*)0x0803E930 }, + { 0x1609, 0, (void*)0x0803E9E4 }, { 0x160A, 0, (void*)0x0803EA4C }, { 0x160B, 0, (void*)0x0803EAB0 }, + { 0x160C, 0, (void*)0x0803EB18 }, { 0x160D, 0, (void*)0x0803EB58 }, { 0x160E, 0, (void*)0x0803EBA8 }, + { 0x160F, 0, (void*)0x0803EBFC }, { 0x1610, 0, (void*)0x0803EC9C }, { 0x1611, 0, (void*)0x0803ED14 }, + { 0x1612, 0, (void*)0x0803EE08 }, { 0x1613, 0, (void*)0x0803EE48 }, { 0x1614, 0, (void*)0x0803EEB0 }, + { 0x1615, 0, (void*)0x0803EEF0 }, { 0x1616, 0, (void*)0x0803EFAC }, { 0x1617, 0, (void*)0x0803F004 }, + { 0x1618, 0, (void*)0x0803F04C }, { 0x1619, 0, (void*)0x0803F078 }, { 0x161A, 0, (void*)0x0803F0E0 }, + { 0x161B, 0, (void*)0x0803F110 }, { 0x161C, 0, (void*)0x0803F15C }, { 0x161D, 0, (void*)0x0803F1EC }, + { 0x161E, 0, (void*)0x0803F264 }, { 0x161F, 0, (void*)0x0803F2CC }, { 0x1620, 0, (void*)0x0803F344 }, + { 0x1621, 0, (void*)0x0803F3A8 }, { 0x1622, 0, (void*)0x0803F3F4 }, { 0x1623, 0, (void*)0x0803F46C }, + { 0x1624, 0, (void*)0x0803F4AC }, { 0x1625, 0, (void*)0x0803F500 }, { 0x1626, 0, (void*)0x0803F608 }, + { 0x1627, 0, (void*)0x0803F66C }, { 0x1628, 0, (void*)0x0803F6E8 }, { 0x1629, 0, (void*)0x0803F718 }, + { 0x162A, 0, (void*)0x0803F760 }, { 0x162B, 0, (void*)0x0803F7C0 }, { 0x162C, 0, (void*)0x0803F87C }, + { 0x162D, 0, (void*)0x0803F8A8 }, { 0x162E, 0, (void*)0x0803F8EC }, { 0x162F, 0, (void*)0x0803F94C }, + { 0x1630, 0, (void*)0x0803F978 }, { 0x1631, 0, (void*)0x0803F9DC }, { 0x1632, 0, (void*)0x0803FA3C }, + { 0x1633, 0, (void*)0x0803FA78 }, { 0x1634, 0, (void*)0x0803FAC4 }, { 0x1635, 0, (void*)0x0803FB0C }, + { 0x1636, 0, (void*)0x0803FB5C }, { 0x1637, 0, (void*)0x0803FBCC }, { 0x1638, 0, (void*)0x0803FC50 }, + { 0x1644, 0, (void*)0x0803FC6C }, { 0x1645, 0, (void*)0x0803FD0C }, { 0x1646, 0, (void*)0x0803FD5C }, + { 0x1647, 0, (void*)0x0803FDC0 }, { 0x1648, 0, (void*)0x0803FE08 }, { 0x1649, 0, (void*)0x0803FE54 }, + { 0x164A, 0, (void*)0x0803FEB4 }, { 0x164B, 0, (void*)0x0803FF88 }, { 0x164C, 0, (void*)0x0803FFF4 }, + { 0x164D, 0, (void*)0x08040064 }, { 0x164E, 0, (void*)0x080400BC }, { 0x164F, 0, (void*)0x0804010C }, + { 0x1650, 0, (void*)0x08040174 }, { 0x1651, 0, (void*)0x0804019C }, { 0x1652, 0, (void*)0x08040208 }, + { 0x1653, 0, (void*)0x08040250 }, { 0x1654, 0, (void*)0x080402B0 }, { 0x1655, 0, (void*)0x080402CC }, + { 0x1656, 0, (void*)0x0804032C }, { 0x1657, 0, (void*)0x0804035C }, { 0x1658, 0, (void*)0x080403C0 }, + { 0x1659, 0, (void*)0x08040494 }, { 0x165A, 0, (void*)0x08040530 }, { 0x165B, 0, (void*)0x0804054C }, + { 0x165C, 0, (void*)0x080405AC }, { 0x165D, 0, (void*)0x080405E0 }, { 0x165E, 0, (void*)0x08040624 }, + { 0x165F, 0, (void*)0x0804070C }, { 0x1660, 0, (void*)0x08040798 }, { 0x1661, 0, (void*)0x080407C0 }, + { 0x1700, 0, (void*)0x08040848 }, { 0x1701, 0, (void*)0x080408E4 }, { 0x1702, 0, (void*)0x0804092C }, + { 0x1703, 0, (void*)0x08040988 }, { 0x1704, 0, (void*)0x080409D4 }, { 0x1705, 0, (void*)0x08040A28 }, + { 0x1706, 0, (void*)0x08040ABC }, { 0x1707, 0, (void*)0x08040B0C }, { 0x1708, 0, (void*)0x08040B50 }, + { 0x1709, 0, (void*)0x08040BA4 }, { 0x170A, 0, (void*)0x08040C18 }, { 0x170B, 0, (void*)0x08040C60 }, + { 0x170C, 0, (void*)0x08040C6C }, { 0x170D, 0, (void*)0x08040CC8 }, { 0x170E, 0, (void*)0x08040D38 }, + { 0x170F, 0, (void*)0x08040DBC }, { 0x1710, 0, (void*)0x08040E0C }, { 0x1711, 0, (void*)0x08040E84 }, + { 0x1712, 0, (void*)0x08040E90 }, { 0x1713, 0, (void*)0x08040EE8 }, { 0x1714, 0, (void*)0x08040F30 }, + { 0x1715, 0, (void*)0x08040F78 }, { 0x1716, 0, (void*)0x08040FD0 }, { 0x1717, 0, (void*)0x08041050 }, + { 0x1718, 0, (void*)0x08041084 }, { 0x1719, 0, (void*)0x080410E8 }, { 0x171A, 0, (void*)0x08041128 }, + { 0x171B, 0, (void*)0x08041170 }, { 0x171C, 0, (void*)0x080411BC }, { 0x171D, 0, (void*)0x080411C8 }, + { 0x171E, 0, (void*)0x0804122C }, { 0x171F, 0, (void*)0x0804125C }, { 0x1720, 0, (void*)0x080412A8 }, + { 0x1721, 0, (void*)0x080412E8 }, { 0x1722, 0, (void*)0x0804132C }, { 0x1723, 0, (void*)0x08041378 }, + { 0x1724, 0, (void*)0x080413C0 }, { 0x1725, 0, (void*)0x08041414 }, { 0x1726, 0, (void*)0x08041470 }, + { 0x1727, 0, (void*)0x0804147C }, { 0x1728, 0, (void*)0x08041488 }, { 0x1729, 0, (void*)0x080414D0 }, + { 0x172A, 0, (void*)0x08041530 }, { 0x172B, 0, (void*)0x08041588 }, { 0x172C, 0, (void*)0x080415E4 }, + { 0x172D, 0, (void*)0x08041640 }, { 0x172E, 0, (void*)0x08041698 }, { 0x172F, 0, (void*)0x080416FC }, + { 0x1730, 0, (void*)0x08041740 }, { 0x1731, 0, (void*)0x08041794 }, { 0x1732, 0, (void*)0x080417A0 }, + { 0x1733, 0, (void*)0x080417F4 }, { 0x1734, 0, (void*)0x08041848 }, { 0x1735, 0, (void*)0x0804189C }, + { 0x1736, 0, (void*)0x08041900 }, { 0x1737, 0, (void*)0x08041958 }, { 0x1738, 0, (void*)0x080419A8 }, + { 0x1739, 0, (void*)0x080419F4 }, { 0x173A, 0, (void*)0x08041A54 }, { 0x173B, 0, (void*)0x08041AA0 }, + { 0x173C, 0, (void*)0x08041AF8 }, { 0x173D, 0, (void*)0x08041B54 }, { 0x173E, 0, (void*)0x08041BA4 }, + { 0x173F, 0, (void*)0x08041BF4 }, { 0x1740, 0, (void*)0x08041C48 }, { 0x1741, 0, (void*)0x08041CAC }, + { 0x1742, 0, (void*)0x08041D08 }, { 0x1743, 0, (void*)0x08041D68 }, { 0x1744, 0, (void*)0x08041DB4 }, + { 0x1745, 0, (void*)0x08041DF8 }, { 0x1746, 0, (void*)0x08041E54 }, { 0x1747, 0, (void*)0x08041EB0 }, + { 0x1748, 0, (void*)0x08041F2C }, { 0x1749, 0, (void*)0x08041F78 }, { 0x1784, 0, (void*)0x08041FD0 }, + { 0x1785, 0, (void*)0x0804202C }, { 0x1786, 0, (void*)0x08042088 }, { 0x1787, 0, (void*)0x080420E4 }, + { 0x1788, 0, (void*)0x080420F0 }, { 0x1789, 0, (void*)0x0804214C }, { 0x178A, 0, (void*)0x080421B0 }, + { 0x178B, 0, (void*)0x080421F4 }, { 0x178C, 0, (void*)0x0804223C }, { 0x178D, 0, (void*)0x08042288 }, + { 0x178E, 0, (void*)0x080422CC }, { 0x178F, 0, (void*)0x08042314 }, { 0x1798, 0, (void*)0x08042360 }, + { 0x1799, 0, (void*)0x080423AC }, { 0x179A, 0, (void*)0x080423F4 }, { 0x179B, 0, (void*)0x08042440 }, + { 0x17AA, 0, (void*)0x08042490 }, { 0x17AC, 0, (void*)0x08042514 }, { 0x17AD, 0, (void*)0x08042568 }, + { 0x17AE, 0, (void*)0x080425C0 }, { 0x17AF, 0, (void*)0x0804262C }, { 0x1800, 0, (void*)0x080426AC }, + { 0x1801, 0, (void*)0x080426CC }, { 0x1802, 0, (void*)0x0804272C }, { 0x1803, 0, (void*)0x08042754 }, + { 0x1804, 0, (void*)0x08042784 }, { 0x1805, 0, (void*)0x080427E0 }, { 0x1806, 0, (void*)0x08042834 }, + { 0x1807, 0, (void*)0x08042870 }, { 0x1808, 0, (void*)0x080428D0 }, { 0x1809, 0, (void*)0x08042910 }, + { 0x180A, 0, (void*)0x0804293C }, { 0x180B, 0, (void*)0x08042968 }, { 0x180C, 0, (void*)0x08042990 }, + { 0x180D, 0, (void*)0x080429AC }, { 0x180E, 0, (void*)0x08042A04 }, { 0x180F, 0, (void*)0x08042A50 }, + { 0x1810, 0, (void*)0x08042A80 }, { 0x1811, 0, (void*)0x08042AB4 }, { 0x1812, 0, (void*)0x08042AF8 }, + { 0x1813, 0, (void*)0x08042B38 }, { 0x1814, 0, (void*)0x08042B6C }, { 0x1815, 0, (void*)0x08042BAC }, + { 0x1816, 0, (void*)0x08042C04 }, { 0x1817, 0, (void*)0x08042C4C }, { 0x1818, 0, (void*)0x08042C8C }, + { 0x1819, 0, (void*)0x08042CB8 }, { 0x181A, 0, (void*)0x08042CEC }, { 0x181B, 0, (void*)0x08042D28 }, + { 0x181C, 0, (void*)0x08042D34 }, { 0x181D, 0, (void*)0x08042D94 }, { 0x181E, 0, (void*)0x08042DD8 }, + { 0x181F, 0, (void*)0x08042DF0 }, { 0x1820, 0, (void*)0x08042E40 }, { 0x1821, 0, (void*)0x08042E7C }, + { 0x1822, 0, (void*)0x08042EB0 }, { 0x1823, 0, (void*)0x08042EE8 }, { 0x1824, 0, (void*)0x08042F20 }, + { 0x1883, 0, (void*)0x08042F2C }, { 0x1884, 0, (void*)0x08042F60 }, { 0x1885, 0, (void*)0x08042F9C }, + { 0x1886, 0, (void*)0x08043008 }, { 0x1887, 0, (void*)0x08043054 }, { 0x1888, 0, (void*)0x08043094 }, + { 0x1889, 0, (void*)0x080430E4 }, { 0x188A, 0, (void*)0x08043134 }, { 0x188B, 0, (void*)0x08043150 }, + { 0x188C, 0, (void*)0x0804318C }, { 0x188D, 0, (void*)0x080431E8 }, { 0x188E, 0, (void*)0x08043224 }, + { 0x188F, 0, (void*)0x0804326C }, { 0x1890, 0, (void*)0x08043298 }, { 0x1891, 0, (void*)0x080432D8 }, + { 0x1892, 0, (void*)0x0804332C }, { 0x1893, 0, (void*)0x08043378 }, { 0x1901, 0, (void*)0x080433B4 }, + { 0x1902, 0, (void*)0x0804341C }, { 0x1903, 0, (void*)0x08043484 }, { 0x1904, 0, (void*)0x08043508 }, + { 0x1905, 0, (void*)0x08043580 }, { 0x1906, 0, (void*)0x08043610 }, { 0x1907, 0, (void*)0x0804367C }, + { 0x1908, 0, (void*)0x08043710 }, { 0x1909, 0, (void*)0x08043784 }, { 0x190A, 0, (void*)0x0804380C }, + { 0x190B, 0, (void*)0x08043880 }, { 0x190C, 0, (void*)0x080438E8 }, { 0x190D, 0, (void*)0x08043948 }, + { 0x190E, 0, (void*)0x080439C4 }, { 0x190F, 0, (void*)0x08043A20 }, { 0x1910, 0, (void*)0x08043AA0 }, + { 0x1911, 0, (void*)0x08043B24 }, { 0x1912, 0, (void*)0x08043BA8 }, { 0x1913, 0, (void*)0x08043C30 }, + { 0x1914, 0, (void*)0x08043C9C }, { 0x1915, 0, (void*)0x08043CEC }, { 0x1916, 0, (void*)0x08043D50 }, + { 0x1917, 0, (void*)0x08043DD8 }, { 0x1918, 0, (void*)0x08043E40 }, { 0x1919, 0, (void*)0x08043EB0 }, + { 0x191A, 0, (void*)0x08043F24 }, { 0x191B, 0, (void*)0x08043FB0 }, { 0x191C, 0, (void*)0x0804401C }, + { 0x191D, 0, (void*)0x08044098 }, { 0x191E, 0, (void*)0x0804411C }, { 0x191F, 0, (void*)0x08044184 }, + { 0x1921, 0, (void*)0x080441E8 }, { 0x1922, 0, (void*)0x08044258 }, { 0x1923, 0, (void*)0x080442D4 }, + { 0x1924, 0, (void*)0x08044348 }, { 0x1925, 0, (void*)0x080443D0 }, { 0x1926, 0, (void*)0x08044458 }, + { 0x1927, 0, (void*)0x080444DC }, { 0x1928, 0, (void*)0x08044574 }, { 0x1929, 0, (void*)0x080445CC }, + { 0x192A, 0, (void*)0x08044630 }, { 0x192C, 0, (void*)0x080446AC }, { 0x192D, 0, (void*)0x0804471C }, + { 0x192E, 0, (void*)0x08044780 }, { 0x1930, 0, (void*)0x08044808 }, { 0x1931, 0, (void*)0x08044898 }, + { 0x1932, 0, (void*)0x08044910 }, { 0x1933, 0, (void*)0x0804498C }, { 0x1934, 0, (void*)0x08044A04 }, + { 0x1935, 0, (void*)0x08044A94 }, { 0x1937, 0, (void*)0x08044B10 }, { 0x1939, 0, (void*)0x08044B9C }, + { 0x193A, 0, (void*)0x08044C0C }, { 0x193B, 0, (void*)0x08044C18 }, { 0x193C, 0, (void*)0x08044C8C }, + { 0x1942, 0, (void*)0x08044D04 }, { 0x1944, 0, (void*)0x08044D6C }, { 0x1945, 0, (void*)0x08044DCC }, + { 0x1946, 0, (void*)0x08044E48 }, { 0x1947, 0, (void*)0x08044EAC }, { 0x1948, 0, (void*)0x08044F20 }, + { 0x1949, 0, (void*)0x08044F88 }, { 0x194A, 0, (void*)0x08045004 }, { 0x194B, 0, (void*)0x08045084 }, + { 0x194C, 0, (void*)0x080450F4 }, { 0x194D, 0, (void*)0x08045174 }, { 0x1950, 0, (void*)0x080451C8 }, + { 0x1951, 0, (void*)0x08045238 }, { 0x1952, 0, (void*)0x080452A0 }, { 0x1953, 0, (void*)0x08045310 }, + { 0x1954, 0, (void*)0x08045378 }, { 0x1955, 0, (void*)0x080453E8 }, { 0x1956, 0, (void*)0x08045458 }, + { 0x1957, 0, (void*)0x080454CC }, { 0x1958, 0, (void*)0x08045540 }, { 0x1959, 0, (void*)0x080455C4 }, + { 0x195A, 0, (void*)0x0804564C }, { 0x195B, 0, (void*)0x080456AC }, { 0x195C, 0, (void*)0x08045704 }, + { 0x195D, 0, (void*)0x0804576C }, { 0x195E, 0, (void*)0x080457E8 }, { 0x195F, 0, (void*)0x08045838 }, + { 0x1960, 0, (void*)0x0804589C }, { 0x1961, 0, (void*)0x08045918 }, { 0x1962, 0, (void*)0x08045988 }, + { 0x1963, 0, (void*)0x080459E4 }, { 0x1964, 0, (void*)0x08045A24 }, { 0x1B58, 0, (void*)0x08045ACC }, + { 0x1B59, 0, (void*)0x08045ADC }, { 0x1B5A, 0, (void*)0x08045B00 }, { 0x1B5B, 0, (void*)0x08045B20 }, + { 0x1B5C, 0, (void*)0x08045B2C }, { 0x1B5D, 0, (void*)0x08045B58 }, { 0x1B5E, 0, (void*)0x08045B7C }, + { 0x1B5F, 0, (void*)0x08045BAC }, { 0x1B60, 0, (void*)0x08045BD8 }, { 0x1B61, 0, (void*)0x08045BFC }, + { 0x1B62, 0, (void*)0x08045C18 }, { 0x1B63, 0, (void*)0x08045C3C }, { 0x1B64, 0, (void*)0x08045C60 }, + { 0x1B65, 0, (void*)0x08045C90 }, { 0x1B66, 0, (void*)0x08045CC0 }, { 0x1B67, 0, (void*)0x08045CEC }, + { 0x1B6A, 0, (void*)0x08045CF8 }, { 0x1B6B, 0, (void*)0x08045D28 }, { 0x1B72, 0, (void*)0x08045D58 }, + { 0x1B73, 0, (void*)0x08045D8C }, { 0x1B74, 0, (void*)0x08045DB8 }, { 0x1B75, 0, (void*)0x08045DEC }, + { 0x1B76, 0, (void*)0x08045E1C }, { 0x1B77, 0, (void*)0x08045E48 }, { 0x1B78, 0, (void*)0x08045E54 }, + { 0x1B79, 0, (void*)0x08045E80 }, { 0x1B7A, 0, (void*)0x08045EB0 }, { 0x1B7B, 0, (void*)0x08045ED8 }, + { 0x1B7C, 0, (void*)0x08045F08 }, { 0x1B7D, 0, (void*)0x08045F34 }, { 0x1B7E, 0, (void*)0x08045F40 }, + { 0x1B7F, 0, (void*)0x08045F74 }, { 0x1B80, 0, (void*)0x08045FA8 }, { 0x1B81, 0, (void*)0x08045FD4 }, + { 0x1B89, 0, (void*)0x08045FE0 }, { 0x1B8A, 0, (void*)0x08045FF0 }, { 0x1B8B, 0, (void*)0x08046038 }, + { 0x1B8C, 0, (void*)0x08046060 }, { 0x1B8D, 0, (void*)0x08046098 }, { 0x1B8E, 0, (void*)0x080460D4 }, + { 0x1B8F, 0, (void*)0x08046110 }, { 0x1B90, 0, (void*)0x08046150 }, { 0x1B91, 0, (void*)0x0804618C }, + { 0x1B92, 0, (void*)0x080461CC }, { 0x1B93, 0, (void*)0x08046208 }, { 0x1B94, 0, (void*)0x0804622C }, + { 0x1B95, 0, (void*)0x0804626C }, { 0x1B96, 0, (void*)0x080462A8 }, { 0x1B98, 0, (void*)0x080462B4 }, + { 0x1B9E, 0, (void*)0x08046300 }, { 0x1B9F, 0, (void*)0x08046374 }, { 0x1BA0, 0, (void*)0x080463FC }, + { 0x1BA1, 0, (void*)0x08046480 }, { 0x1BA2, 0, (void*)0x08046594 }, { 0x1BA4, 0, (void*)0x080465C4 }, + { 0x1BA5, 0, (void*)0x08046654 }, { 0x1BA6, 0, (void*)0x08046684 }, { 0x1BA7, 0, (void*)0x080466D4 }, + { 0x1BA8, 0, (void*)0x08046760 }, { 0x1BAC, 0, (void*)0x080467E8 }, { 0x1BB2, 0, (void*)0x08046848 }, + { 0x1BB3, 0, (void*)0x08046888 }, { 0x1BB4, 0, (void*)0x080468C4 }, { 0x1BB5, 0, (void*)0x08046904 }, + { 0x1BB6, 0, (void*)0x08046944 }, { 0x1C00, 0, (void*)0x08046984 }, { 0x1C01, 0, (void*)0x08046A4C }, + { 0x1C02, 0, (void*)0x08046AB8 }, { 0x1C03, 0, (void*)0x08046BA8 }, { 0x1C04, 0, (void*)0x08046C10 }, + { 0x1C05, 0, (void*)0x08046D68 }, { 0x1C06, 0, (void*)0x08046E44 }, { 0x1C07, 0, (void*)0x08046EAC }, + { 0x1C08, 0, (void*)0x08046F0C }, { 0x1C09, 0, (void*)0x08046F5C }, { 0x1C0A, 0, (void*)0x08046F94 }, + { 0x1C0B, 0, (void*)0x08047014 }, { 0x1C0C, 0, (void*)0x080470D4 }, { 0x1C0D, 0, (void*)0x08047118 }, + { 0x1C0E, 0, (void*)0x08047130 }, { 0x1C0F, 0, (void*)0x08047148 }, { 0x1C10, 0, (void*)0x08047164 }, + { 0x1C11, 0, (void*)0x0804717C }, { 0x1C12, 0, (void*)0x0804719C }, { 0x1C13, 0, (void*)0x080471BC }, + { 0x1C14, 0, (void*)0x080471D4 }, { 0x1C15, 0, (void*)0x080471F0 }, { 0x1C16, 0, (void*)0x08047214 }, + { 0x1C17, 0, (void*)0x0804730C }, { 0x1C18, 0, (void*)0x0804734C }, { 0x1D00, 0, (void*)0x080473A4 }, + { 0x1D01, 0, (void*)0x08047414 }, { 0x1D02, 0, (void*)0x08047524 }, { 0x1D03, 0, (void*)0x0804758C }, + { 0x1D04, 0, (void*)0x08047644 }, { 0x1D05, 0, (void*)0x08047678 }, { 0x1D06, 0, (void*)0x080476D0 }, + { 0x1D07, 0, (void*)0x080476F8 }, { 0x1D08, 0, (void*)0x08047728 }, { 0x1D09, 0, (void*)0x08047788 }, + { 0x1D0A, 0, (void*)0x080477C0 }, { 0x1D0B, 0, (void*)0x080477F4 }, { 0x1D0C, 0, (void*)0x08047808 }, + { 0x1D0D, 0, (void*)0x08047820 }, { 0x1D11, 0, (void*)0x08047844 }, { 0x1D12, 0, (void*)0x08047890 }, + { 0x1D13, 0, (void*)0x080478D8 }, { 0x1D14, 0, (void*)0x08047920 }, { 0x1D15, 0, (void*)0x0804796C }, + { 0x1D16, 0, (void*)0x080479B4 }, { 0x1D17, 0, (void*)0x080479FC }, { 0x1F40, 0, (void*)0x08047A20 }, + { 0x1F41, 0, (void*)0x08047ABC }, { 0x1F42, 0, (void*)0x08047B20 }, { 0x1F43, 0, (void*)0x08047B94 }, + { 0x1F44, 0, (void*)0x08047BD8 }, { 0x1F45, 0, (void*)0x08047C40 }, { 0x1F46, 0, (void*)0x08047CB4 }, + { 0x1F47, 0, (void*)0x08047D1C }, { 0x1F48, 0, (void*)0x08047D88 }, { 0x1F49, 0, (void*)0x08047DA8 }, + { 0x1F4A, 0, (void*)0x08047E48 }, { 0x1F4B, 0, (void*)0x08047F30 }, { 0x1F4C, 0, (void*)0x08047F88 }, + { 0x1F4D, 0, (void*)0x08048014 }, { 0x1F4E, 0, (void*)0x080480E0 }, { 0x1F4F, 0, (void*)0x0804819C }, + { 0x1F50, 0, (void*)0x08048280 }, { 0x1F51, 0, (void*)0x080482E4 }, { 0x1F52, 0, (void*)0x0804833C }, + { 0x1F53, 0, (void*)0x080483B8 }, { 0x1F54, 0, (void*)0x08048430 }, { 0x1F55, 0, (void*)0x080484AC }, + { 0x1F56, 0, (void*)0x080484F8 }, { 0x1F5F, 0, (void*)0x0804857C }, { 0x1F60, 0, (void*)0x0804859C }, + { 0x1F61, 0, (void*)0x080485D4 }, { 0x1F62, 0, (void*)0x08048604 }, { 0x1F63, 0, (void*)0x0804862C }, + { 0x1F64, 0, (void*)0x0804866C }, { 0x1F65, 0, (void*)0x080486A4 }, { 0x1F66, 0, (void*)0x080486E0 }, + { 0x1F67, 0, (void*)0x08048708 }, { 0x1F68, 0, (void*)0x08048774 }, { 0x1F69, 0, (void*)0x080487A4 }, + { 0x1F6A, 0, (void*)0x080487E0 }, { 0x1F6B, 0, (void*)0x08048810 }, { 0x1F6C, 0, (void*)0x08048864 }, + { 0x1F6D, 0, (void*)0x08048898 }, { 0x1F6E, 0, (void*)0x08048960 }, { 0x1F6F, 0, (void*)0x08048990 }, + { 0x1F70, 0, (void*)0x080489E8 }, { 0x1F71, 0, (void*)0x08048A44 }, { 0x1F72, 0, (void*)0x08048AB8 }, + { 0x1F73, 0, (void*)0x08048AE8 }, { 0x1F74, 0, (void*)0x08048B94 }, { 0x1F75, 0, (void*)0x08048BB0 }, + { 0x1FA4, 0, (void*)0x08048BD8 }, { 0x1FA5, 0, (void*)0x08048C14 }, { 0x1FA6, 0, (void*)0x08048CF8 }, + { 0x1FA7, 0, (void*)0x08048D40 }, { 0x1FA8, 0, (void*)0x08048D88 }, { 0x1FA9, 0, (void*)0x08048DF4 }, + { 0x1FAA, 0, (void*)0x08048E68 }, { 0x1FAB, 0, (void*)0x08048EE0 }, { 0x1FAC, 0, (void*)0x08048FB4 }, + { 0x1FAD, 0, (void*)0x08049034 }, { 0x1FAE, 0, (void*)0x08049068 }, { 0x1FAF, 0, (void*)0x080491B0 }, + { 0x1FB0, 0, (void*)0x0804927C }, { 0x1FB1, 0, (void*)0x080492C8 }, { 0x1FB2, 0, (void*)0x08049318 }, + { 0x1FB3, 0, (void*)0x08049384 }, { 0x1FB4, 0, (void*)0x08049424 }, { 0x1FB5, 0, (void*)0x0804951C }, + { 0x1FB6, 0, (void*)0x08049558 }, { 0x1FB7, 0, (void*)0x08049598 }, { 0x1FB8, 0, (void*)0x080495B8 }, + { 0x1FB9, 0, (void*)0x080495D0 }, { 0x1FBA, 0, (void*)0x080495E8 }, { 0x1FBB, 0, (void*)0x08049614 }, + { 0x1FBC, 0, (void*)0x0804963C }, { 0x1FBD, 0, (void*)0x08049688 }, { 0x1FBE, 0, (void*)0x080496DC }, + { 0x1FBF, 0, (void*)0x08049758 }, { 0x1FC0, 0, (void*)0x080497BC }, { 0x1FC1, 0, (void*)0x080497E4 }, + { 0x1FC2, 0, (void*)0x0804982C }, { 0x1FC3, 0, (void*)0x080498A0 }, { 0x1FC4, 0, (void*)0x08049920 }, + { 0x1FC5, 0, (void*)0x08049940 }, { 0x1FC6, 0, (void*)0x08049A0C }, { 0x1FC7, 0, (void*)0x08049A38 }, + { 0x1FC8, 0, (void*)0x08049AA0 }, { 0x1FC9, 0, (void*)0x08049AB8 }, { 0x1FCA, 0, (void*)0x08049AF0 }, + { 0x1FCB, 0, (void*)0x08049B74 }, { 0x1FCC, 0, (void*)0x08049BD0 }, { 0x1FCD, 0, (void*)0x08049C34 }, + { 0x1FCE, 0, (void*)0x08049D14 }, { 0x1FCF, 0, (void*)0x08049D70 }, { 0x1FD0, 0, (void*)0x08049DAC }, + { 0x1FD1, 0, (void*)0x08049E08 }, { 0x1FD2, 0, (void*)0x08049E24 }, { 0x1FD3, 0, (void*)0x08049E44 }, + { 0x1FD4, 0, (void*)0x08049E88 }, { 0x1FD5, 0, (void*)0x08049EB8 }, { 0x1FD6, 0, (void*)0x08049F00 }, + { 0x1FD7, 0, (void*)0x08049F3C }, { 0x1FD8, 0, (void*)0x08049F90 }, { 0x1FD9, 0, (void*)0x08049FC4 }, + { 0x1FDA, 0, (void*)0x0804A018 }, { 0x1FDB, 0, (void*)0x0804A050 }, { 0x1FDC, 0, (void*)0x0804A0BC }, + { 0x1FDD, 0, (void*)0x0804A0F0 }, { 0x1FDE, 0, (void*)0x0804A11C }, { 0x1FDF, 0, (void*)0x0804A14C }, + { 0x1FE0, 0, (void*)0x0804A1A0 }, { 0x1FE1, 0, (void*)0x0804A1D4 }, { 0x1FE2, 0, (void*)0x0804A210 }, + { 0x1FE3, 0, (void*)0x0804A244 }, { 0x1FE4, 0, (void*)0x0804A290 }, { 0x1FE5, 0, (void*)0x0804A2C8 }, + { 0x1FE6, 0, (void*)0x0804A334 }, { 0x1FE7, 0, (void*)0x0804A36C }, { 0x1FE8, 0, (void*)0x0804A3EC }, + { 0x1FE9, 0, (void*)0x0804A420 }, { 0x1FEA, 0, (void*)0x0804A484 }, { 0x1FEB, 0, (void*)0x0804A4B8 }, + { 0x1FEC, 0, (void*)0x0804A51C }, { 0x1FED, 0, (void*)0x0804A554 }, { 0x1FEE, 0, (void*)0x0804A59C }, + { 0x1FEF, 0, (void*)0x0804A5D0 }, { 0x1FF0, 0, (void*)0x0804A620 }, { 0x1FF1, 0, (void*)0x0804A658 }, + { 0x1FF2, 0, (void*)0x0804A6C0 }, { 0x1FF3, 0, (void*)0x0804A6F4 }, { 0x1FF4, 0, (void*)0x0804A74C }, + { 0x1FF5, 0, (void*)0x0804A788 }, { 0x1FF6, 0, (void*)0x0804A800 }, { 0x1FF7, 0, (void*)0x0804A834 }, + { 0x1FF8, 0, (void*)0x0804A888 }, { 0x1FF9, 0, (void*)0x0804A8B8 }, { 0x1FFA, 0, (void*)0x0804A908 }, + { 0x1FFB, 0, (void*)0x0804A940 }, { 0x1FFC, 0, (void*)0x0804A970 }, { 0x1FFD, 0, (void*)0x0804A9A4 }, + { 0x1FFE, 0, (void*)0x0804AA00 }, { 0x1FFF, 0, (void*)0x0804AA60 }, { 0x2000, 0, (void*)0x0804AAA0 }, + { 0x2001, 0, (void*)0x0804AACC }, { 0x2002, 0, (void*)0x0804AB00 }, { 0x2003, 0, (void*)0x0804AB60 }, + { 0x2004, 0, (void*)0x0804ABA0 }, { 0x2005, 0, (void*)0x0804ACE0 }, { 0x2006, 0, (void*)0x0804ADB4 }, + { 0x2007, 0, (void*)0x0804AE8C }, { 0x2008, 0, (void*)0x0804AEE0 }, { 0x2009, 0, (void*)0x0804AEF8 }, + { 0x200A, 0, (void*)0x0804AF10 }, { 0x200B, 0, (void*)0x0804AFAC }, { 0x200C, 0, (void*)0x0804B024 }, + { 0x200D, 0, (void*)0x0804B058 }, { 0x200E, 0, (void*)0x0804B0D0 }, { 0x200F, 0, (void*)0x0804B144 }, + { 0x2010, 0, (void*)0x0804B168 }, { 0x2011, 0, (void*)0x0804B1B4 }, { 0x2012, 0, (void*)0x0804B1F8 }, + { 0x2013, 0, (void*)0x0804B260 }, { 0x2014, 0, (void*)0x0804B298 }, { 0x2015, 0, (void*)0x0804B300 }, + { 0x2016, 0, (void*)0x0804B338 }, { 0x2017, 0, (void*)0x0804B350 }, { 0x201D, 0, (void*)0x0804B3B0 }, + { 0x201E, 0, (void*)0x0804B3F8 }, { 0x201F, 0, (void*)0x0804B508 }, { 0x2020, 0, (void*)0x0804B58C }, + { 0x2021, 0, (void*)0x0804B5F8 }, { 0x2022, 0, (void*)0x0804B68C }, { 0x2023, 0, (void*)0x0804B6E4 }, + { 0x2024, 0, (void*)0x0804B6F0 }, { 0x2026, 0, (void*)0x0804B6FC }, { 0x2027, 0, (void*)0x0804B71C }, + { 0x2028, 0, (void*)0x0804B744 }, { 0x2029, 0, (void*)0x0804B758 }, { 0x202A, 0, (void*)0x0804B770 }, + { 0x202B, 0, (void*)0x0804B7C4 }, { 0x202C, 0, (void*)0x0804B81C }, { 0x202D, 0, (void*)0x0804B860 }, + { 0x202E, 0, (void*)0x0804B8A8 }, { 0x202F, 0, (void*)0x0804B908 }, { 0x2030, 0, (void*)0x0804B93C }, + { 0x2031, 0, (void*)0x0804B9B8 }, { 0x2032, 0, (void*)0x0804BA20 }, { 0x2033, 0, (void*)0x0804BA9C }, + { 0x2034, 0, (void*)0x0804BAEC }, { 0x2035, 0, (void*)0x0804BB34 }, { 0x2036, 0, (void*)0x0804BB7C }, + { 0x2037, 0, (void*)0x0804BBAC }, { 0x2038, 0, (void*)0x0804BBDC }, { 0x2039, 0, (void*)0x0804BC20 }, + { 0x203A, 0, (void*)0x0804BC98 }, { 0x203B, 0, (void*)0x0804BCF0 }, { 0x203C, 0, (void*)0x0804BD40 }, + { 0x203D, 0, (void*)0x0804BD5C }, { 0x203E, 0, (void*)0x0804BDAC }, { 0x203F, 0, (void*)0x0804BE24 }, + { 0x2040, 0, (void*)0x0804BE4C }, { 0x2041, 0, (void*)0x0804BEB8 }, { 0x2042, 0, (void*)0x0804BEEC }, + { 0x2043, 0, (void*)0x0804BF08 }, { 0x2044, 0, (void*)0x0804BF38 }, { 0x2045, 0, (void*)0x0804BF74 }, + { 0x2046, 0, (void*)0x0804BFB4 }, { 0x2047, 0, (void*)0x0804C028 }, { 0x2048, 0, (void*)0x0804C08C }, + { 0x2049, 0, (void*)0x0804C0BC }, { 0x204A, 0, (void*)0x0804C0D8 }, { 0x204B, 0, (void*)0x0804C114 }, + { 0x204C, 0, (void*)0x0804C144 }, { 0x204D, 0, (void*)0x0804C180 }, { 0x204E, 0, (void*)0x0804C204 }, + { 0x206C, 0, (void*)0x0804C264 }, { 0x206D, 0, (void*)0x0804C2A8 }, { 0x206E, 0, (void*)0x0804C2F8 }, + { 0x206F, 0, (void*)0x0804C338 }, { 0x2070, 0, (void*)0x0804C384 }, { 0x2076, 0, (void*)0x0804C390 }, + { 0x2077, 0, (void*)0x0804C3C0 }, { 0x2078, 0, (void*)0x0804C404 }, { 0x2079, 0, (void*)0x0804C480 }, + { 0x2080, 0, (void*)0x0804C4C4 }, { 0x2081, 0, (void*)0x0804C5B4 }, { 0x2082, 0, (void*)0x0804C5FC }, + { 0x2083, 0, (void*)0x0804C630 }, { 0x208A, 0, (void*)0x0804C674 }, { 0x208B, 0, (void*)0x0804C6BC }, + { 0x208C, 0, (void*)0x0804C708 }, { 0x208D, 0, (void*)0x0804C7B4 }, { 0x208E, 0, (void*)0x0804C7FC }, + { 0x2093, 0, (void*)0x0804C8A4 }, { 0x2094, 0, (void*)0x0804C8C0 }, { 0x2095, 0, (void*)0x0804C8E8 }, + { 0x20B0, 0, (void*)0x0804C920 }, { 0x20B1, 0, (void*)0x0804C984 }, { 0x20B2, 0, (void*)0x0804CA38 }, + { 0x20B3, 0, (void*)0x0804CB34 }, { 0x20B4, 0, (void*)0x0804CC18 }, { 0x20B5, 0, (void*)0x0804CD10 }, + { 0x20B6, 0, (void*)0x0804CDD4 }, { 0x20B7, 0, (void*)0x0804CE8C }, { 0x20B8, 0, (void*)0x0804CF48 }, + { 0x20B9, 0, (void*)0x0804CFA4 }, { 0x20BA, 0, (void*)0x0804D018 }, { 0x20BB, 0, (void*)0x0804D084 }, + { 0x20BC, 0, (void*)0x0804D0EC }, { 0x20BD, 0, (void*)0x0804D158 }, { 0x20BE, 0, (void*)0x0804D1C0 }, + { 0x20BF, 0, (void*)0x0804D230 }, { 0x20C0, 0, (void*)0x0804D294 }, { 0x20C1, 0, (void*)0x0804D300 }, + { 0x20C2, 0, (void*)0x0804D380 }, { 0x20C3, 0, (void*)0x0804D3F8 }, { 0x20C4, 0, (void*)0x0804D460 }, + { 0x20C5, 0, (void*)0x0804D4AC }, { 0x20C6, 0, (void*)0x0804D52C }, { 0x20C7, 0, (void*)0x0804D590 }, + { 0x20D0, 0, (void*)0x0804D5FC }, { 0x20D1, 0, (void*)0x0804D654 }, { 0x20D2, 0, (void*)0x0804D6C8 }, + { 0x20D4, 0, (void*)0x0804D6EC }, { 0x20D5, 0, (void*)0x0804D75C }, { 0x20D6, 0, (void*)0x0804D7B4 }, + { 0x20D7, 0, (void*)0x0804D834 }, { 0x20D8, 0, (void*)0x0804D8B0 }, { 0x20D9, 0, (void*)0x0804D93C }, + { 0x20DA, 0, (void*)0x0804D99C }, { 0x20DB, 0, (void*)0x0804D9FC }, { 0x20DC, 0, (void*)0x0804DA74 }, + { 0x20DD, 0, (void*)0x0804DB20 }, { 0x20DE, 0, (void*)0x0804DBB0 }, { 0x20DF, 0, (void*)0x0804DC18 }, + { 0x20E0, 0, (void*)0x0804DC90 }, { 0x20E1, 0, (void*)0x0804DCFC }, { 0x20E2, 0, (void*)0x0804DD84 }, + { 0x20E3, 0, (void*)0x0804DE0C }, { 0x20E4, 0, (void*)0x0804DEA0 }, { 0x20E5, 0, (void*)0x0804DF10 }, + { 0x20E6, 0, (void*)0x0804DF78 }, { 0x20E7, 0, (void*)0x0804DFEC }, { 0x20F3, 0, (void*)0x0804E05C }, + { 0x20F7, 0, (void*)0x0804E0C0 }, { 0x20F8, 0, (void*)0x0804E134 }, { 0x20F9, 0, (void*)0x0804E1AC }, + { 0x2103, 0, (void*)0x0804E220 }, { 0x2104, 0, (void*)0x0804E288 }, { 0x2105, 0, (void*)0x0804E2CC }, + { 0x2106, 0, (void*)0x0804E320 }, { 0x2107, 0, (void*)0x0804E364 }, { 0x2108, 0, (void*)0x0804E3BC }, + { 0x2109, 0, (void*)0x0804E408 }, { 0x210A, 0, (void*)0x0804E458 }, { 0x210B, 0, (void*)0x0804E4B0 }, + { 0x210C, 0, (void*)0x0804E4EC }, { 0x210D, 0, (void*)0x0804E52C }, { 0x210E, 0, (void*)0x0804E578 }, + { 0x210F, 0, (void*)0x0804E5D0 }, { 0x2110, 0, (void*)0x0804E618 }, { 0x2111, 0, (void*)0x0804E660 }, + { 0x2112, 0, (void*)0x0804E6BC }, { 0x2113, 0, (void*)0x0804E70C }, { 0x2114, 0, (void*)0x0804E75C }, + { 0x2115, 0, (void*)0x0804E7A8 }, { 0x2116, 0, (void*)0x0804E7F0 }, { 0x2134, 0, (void*)0x0804E83C }, + { 0x2135, 0, (void*)0x0804E880 }, { 0x2136, 0, (void*)0x0804E8CC }, { 0x2137, 0, (void*)0x0804E91C }, + { 0x2138, 0, (void*)0x0804E96C }, { 0x2139, 0, (void*)0x0804E9B4 }, { 0x213A, 0, (void*)0x0804E9FC }, + { 0x213B, 0, (void*)0x0804EA38 }, { 0x213C, 0, (void*)0x0804EA88 }, { 0x213D, 0, (void*)0x0804EAD0 }, + { 0x213E, 0, (void*)0x0804EB28 }, { 0x213F, 0, (void*)0x0804EB80 }, { 0x2140, 0, (void*)0x0804EBD0 }, + { 0x2141, 0, (void*)0x0804EC1C }, { 0x2142, 0, (void*)0x0804EC60 }, { 0x2143, 0, (void*)0x0804ECAC }, + { 0x2144, 0, (void*)0x0804ECF0 }, { 0x2145, 0, (void*)0x0804ED40 }, { 0x2146, 0, (void*)0x0804ED88 }, + { 0x2147, 0, (void*)0x0804EDDC }, { 0x2152, 0, (void*)0x0804EE34 }, { 0x2153, 0, (void*)0x0804EE78 }, + { 0x2154, 0, (void*)0x0804EECC }, { 0x2156, 0, (void*)0x0804EF1C }, { 0x2157, 0, (void*)0x0804EF64 }, + { 0x2158, 0, (void*)0x0804EFC4 }, { 0x2159, 0, (void*)0x0804F014 }, { 0x215A, 0, (void*)0x0804F05C }, + { 0x215B, 0, (void*)0x0804F0C0 }, { 0x215D, 0, (void*)0x0804F124 }, { 0x215E, 0, (void*)0x0804F178 }, + { 0x215F, 0, (void*)0x0804F184 }, { 0x2160, 0, (void*)0x0804F1D8 }, { 0x2161, 0, (void*)0x0804F234 }, + { 0x2162, 0, (void*)0x0804F298 }, { 0x2163, 0, (void*)0x0804F2A4 }, { 0x2164, 0, (void*)0x0804F2F8 }, + { 0x2165, 0, (void*)0x0804F358 }, { 0x2166, 0, (void*)0x0804F3B0 }, { 0x2167, 0, (void*)0x0804F400 }, + { 0x2168, 0, (void*)0x0804F458 }, { 0x2169, 0, (void*)0x0804F4B0 }, { 0x216A, 0, (void*)0x0804F504 }, + { 0x216B, 0, (void*)0x0804F554 }, { 0x216C, 0, (void*)0x0804F5A0 }, { 0x216D, 0, (void*)0x0804F5F8 }, + { 0x216E, 0, (void*)0x0804F658 }, { 0x216F, 0, (void*)0x0804F6B8 }, { 0x2170, 0, (void*)0x0804F710 }, + { 0x2171, 0, (void*)0x0804F764 }, { 0x2172, 0, (void*)0x0804F7BC }, { 0x2173, 0, (void*)0x0804F814 }, + { 0x2174, 0, (void*)0x0804F870 }, { 0x2198, 0, (void*)0x0804F8CC }, { 0x2199, 0, (void*)0x0804F920 }, + { 0x219A, 0, (void*)0x0804F978 }, { 0x219B, 0, (void*)0x0804F9D0 }, { 0x219C, 0, (void*)0x0804FA2C }, + { 0x219D, 0, (void*)0x0804FA80 }, { 0x219E, 0, (void*)0x0804FAD0 }, { 0x219F, 0, (void*)0x0804FB28 }, + { 0x21A0, 0, (void*)0x0804FB80 }, { 0x21A1, 0, (void*)0x0804FBD8 }, { 0x21A2, 0, (void*)0x0804FC30 }, + { 0x21A3, 0, (void*)0x0804FC88 }, { 0x21A4, 0, (void*)0x0804FCD8 }, { 0x21A5, 0, (void*)0x0804FD30 }, + { 0x21A6, 0, (void*)0x0804FD84 }, { 0x21A7, 0, (void*)0x0804FDDC }, { 0x21A8, 0, (void*)0x0804FE34 }, + { 0x21A9, 0, (void*)0x0804FE88 }, { 0x21AA, 0, (void*)0x0804FED8 }, { 0x21AB, 0, (void*)0x0804FF30 }, + { 0x21AC, 0, (void*)0x0804FF84 }, { 0x21AD, 0, (void*)0x0804FFDC }, { 0x21AE, 0, (void*)0x08050038 }, + { 0x21AF, 0, (void*)0x08050094 }, { 0x21B0, 0, (void*)0x080500EC }, { 0x21B1, 0, (void*)0x08050140 }, + { 0x21B2, 0, (void*)0x08050198 }, { 0x21B3, 0, (void*)0x080501F4 }, { 0x21B4, 0, (void*)0x0805024C }, + { 0x21B5, 0, (void*)0x080502A4 }, { 0x21B6, 0, (void*)0x080502F8 }, { 0x21B7, 0, (void*)0x08050350 }, + { 0x21B8, 0, (void*)0x080503A8 }, { 0x21B9, 0, (void*)0x08050400 }, { 0x21BA, 0, (void*)0x0805045C }, + { 0x21CA, 0, (void*)0x080504AC }, { 0x21CB, 0, (void*)0x080504EC }, { 0x21CC, 0, (void*)0x08050528 }, + { 0x21CD, 0, (void*)0x08050580 }, { 0x21CE, 0, (void*)0x080505C8 }, { 0x21CF, 0, (void*)0x08050604 }, + { 0x21D0, 0, (void*)0x08050648 }, { 0x21D1, 0, (void*)0x08050680 }, { 0x21D2, 0, (void*)0x080506CC }, + { 0x21D3, 0, (void*)0x08050700 }, { 0x21D4, 0, (void*)0x0805075C }, { 0x21D5, 0, (void*)0x080507A8 }, + { 0x21D6, 0, (void*)0x080507F0 }, { 0x21D7, 0, (void*)0x08050840 }, { 0x21D8, 0, (void*)0x08050884 }, + { 0x21D9, 0, (void*)0x080508CC }, { 0x21DA, 0, (void*)0x08050910 }, { 0x21DB, 0, (void*)0x0805094C }, + { 0x21DC, 0, (void*)0x08050998 }, { 0x21DD, 0, (void*)0x080509D0 }, { 0x21FC, 0, (void*)0x08050A20 }, + { 0x21FD, 0, (void*)0x08050A50 }, { 0x21FE, 0, (void*)0x08050A74 }, { 0x21FF, 0, (void*)0x08050ABC }, + { 0x2200, 0, (void*)0x08050ADC }, { 0x2201, 0, (void*)0x08050AF0 }, { 0x2202, 0, (void*)0x08050B0C }, + { 0x2203, 0, (void*)0x08050B44 }, { 0x2204, 0, (void*)0x08050B74 }, { 0x2205, 0, (void*)0x08050B98 }, + { 0x2206, 0, (void*)0x08050BCC }, { 0x2207, 0, (void*)0x08050BF8 }, { 0x2208, 0, (void*)0x08050C48 }, + { 0x2209, 0, (void*)0x08050CB0 }, { 0x220A, 0, (void*)0x08050CC4 }, { 0x220B, 0, (void*)0x08050CE0 }, + { 0x220C, 0, (void*)0x08050D10 }, { 0x220D, 0, (void*)0x08050D44 }, { 0x220E, 0, (void*)0x08050D98 }, + { 0x220F, 0, (void*)0x08050DE0 }, { 0x2210, 0, (void*)0x08050E24 }, { 0x2211, 0, (void*)0x08050E44 }, + { 0x2212, 0, (void*)0x08050E78 }, { 0x2213, 0, (void*)0x08050E8C }, { 0x2214, 0, (void*)0x08050ECC }, + { 0x2215, 0, (void*)0x08050F14 }, { 0x2216, 0, (void*)0x08050F44 }, { 0x2217, 0, (void*)0x08050F6C }, + { 0x2218, 0, (void*)0x08050FB4 }, { 0x2219, 0, (void*)0x08050FDC }, { 0x221A, 0, (void*)0x0805100C }, + { 0x221B, 0, (void*)0x08051034 }, { 0x221C, 0, (void*)0x08051054 }, { 0x221D, 0, (void*)0x08051080 }, + { 0x221E, 0, (void*)0x080510A0 }, { 0x221F, 0, (void*)0x080510DC }, { 0x2220, 0, (void*)0x08051104 }, + { 0x2221, 0, (void*)0x08051138 }, { 0x2222, 0, (void*)0x0805114C }, { 0x2223, 0, (void*)0x0805117C }, + { 0x2224, 0, (void*)0x080511A8 }, { 0x2225, 0, (void*)0x080511E4 }, { 0x2226, 0, (void*)0x0805122C }, + { 0x2227, 0, (void*)0x08051258 }, { 0x2228, 0, (void*)0x080512AC }, { 0x2229, 0, (void*)0x080512D8 }, + { 0x222A, 0, (void*)0x08051338 }, { 0x222B, 0, (void*)0x08051374 }, { 0x2328, 0, (void*)0x080513C4 }, + { 0x2329, 0, (void*)0x08051410 }, { 0x232A, 0, (void*)0x08051454 }, { 0x232B, 0, (void*)0x080514B4 }, + { 0x232C, 0, (void*)0x08051514 }, { 0x232D, 0, (void*)0x08051564 }, { 0x232E, 0, (void*)0x080515A8 }, + { 0x232F, 0, (void*)0x080515E4 }, { 0x2330, 0, (void*)0x08051630 }, { 0x2331, 0, (void*)0x08051680 }, + { 0x2332, 0, (void*)0x08051700 }, { 0x2333, 0, (void*)0x08051750 }, { 0x2334, 0, (void*)0x080517AC }, + { 0x2335, 0, (void*)0x08051814 }, { 0x2336, 0, (void*)0x08051868 }, { 0x2337, 0, (void*)0x080518C8 }, + { 0x2338, 0, (void*)0x08051914 }, { 0x2339, 0, (void*)0x08051948 }, { 0x233A, 0, (void*)0x080519A4 }, + { 0x233B, 0, (void*)0x080519D8 }, { 0x233C, 0, (void*)0x08051A10 }, { 0x233D, 0, (void*)0x08051A70 }, + { 0x233E, 0, (void*)0x08051AA4 }, { 0x233F, 0, (void*)0x08051ADC }, { 0x2340, 0, (void*)0x08051B10 }, + { 0x2341, 0, (void*)0x08051B54 }, { 0x2342, 0, (void*)0x08051BC8 }, { 0x2343, 0, (void*)0x08051C38 }, + { 0x2344, 0, (void*)0x08051C70 }, { 0x2345, 0, (void*)0x08051CC0 }, { 0x2346, 0, (void*)0x08051CFC }, + { 0x2347, 0, (void*)0x08051D24 }, { 0x2348, 0, (void*)0x08051DA4 }, { 0x2349, 0, (void*)0x08051DE4 }, + { 0x234A, 0, (void*)0x08051E44 }, { 0x234B, 0, (void*)0x08051E84 }, { 0x234C, 0, (void*)0x08051EA4 }, + { 0x234D, 0, (void*)0x08051EC4 }, { 0x234E, 0, (void*)0x08051F04 }, { 0x234F, 0, (void*)0x08051F30 }, + { 0x2350, 0, (void*)0x08051F48 }, { 0x2351, 0, (void*)0x08051F7C }, { 0x2352, 0, (void*)0x08051FA8 }, + { 0x2353, 0, (void*)0x08051FC0 }, { 0x2354, 0, (void*)0x08051FE4 }, { 0x2355, 0, (void*)0x08052004 }, + { 0x2356, 0, (void*)0x08052020 }, { 0x2357, 0, (void*)0x08052048 }, { 0x2358, 0, (void*)0x080520AC }, + { 0x2359, 0, (void*)0x080520DC }, { 0x235A, 0, (void*)0x08052104 }, { 0x235B, 0, (void*)0x08052138 }, + { 0x235C, 0, (void*)0x0805215C }, { 0x235D, 0, (void*)0x08052188 }, { 0x235E, 0, (void*)0x080522B4 }, + { 0x235F, 0, (void*)0x080522DC }, { 0x2360, 0, (void*)0x08052334 }, { 0x2361, 0, (void*)0x080523A8 }, + { 0x2362, 0, (void*)0x08052400 }, { 0x2363, 0, (void*)0x08052450 }, { 0x2364, 0, (void*)0x0805250C }, + { 0x2365, 0, (void*)0x08052644 }, { 0x2366, 0, (void*)0x080526C0 }, { 0x2367, 0, (void*)0x08052718 }, + { 0x2368, 0, (void*)0x080527E4 }, { 0x2369, 0, (void*)0x080528E0 }, { 0x236A, 0, (void*)0x08052930 }, + { 0x236B, 0, (void*)0x08052A04 }, { 0x236C, 0, (void*)0x08052A40 }, { 0x236D, 0, (void*)0x08052A8C }, + { 0x236E, 0, (void*)0x08052ABC }, { 0x236F, 0, (void*)0x08052AD8 }, { 0x2370, 0, (void*)0x08052B34 }, + { 0x2371, 0, (void*)0x08052B64 }, { 0x2372, 0, (void*)0x08052BE0 }, { 0x2373, 0, (void*)0x08052BF8 }, + { 0x2374, 0, (void*)0x08052C3C }, { 0x2375, 0, (void*)0x08052C80 }, { 0x2376, 0, (void*)0x08052CE4 }, + { 0x2377, 0, (void*)0x08052D08 }, { 0x2378, 0, (void*)0x08052D54 }, { 0x2710, 0, (void*)0x08052D8C }, + { 0x2711, 0, (void*)0x08052E54 }, { 0x2712, 0, (void*)0x08052EA4 }, { 0x2713, 0, (void*)0x08053008 }, + { 0x2714, 0, (void*)0x0805305C }, { 0x2715, 0, (void*)0x080531A0 }, { 0x2716, 0, (void*)0x08053220 }, + { 0x2717, 0, (void*)0x08053284 }, { 0x2718, 0, (void*)0x080532BC }, { 0x2719, 0, (void*)0x08053300 }, + { 0x271A, 0, (void*)0x0805332C }, { 0x271B, 0, (void*)0x08053424 }, { 0x271C, 0, (void*)0x080534AC }, + { 0x271D, 0, (void*)0x08053524 }, { 0x271E, 0, (void*)0x0805358C }, { 0x271F, 0, (void*)0x08053608 }, + { 0x2720, 0, (void*)0x0805367C }, { 0x2721, 0, (void*)0x08053718 }, { 0x2722, 0, (void*)0x0805374C }, + { 0x2723, 0, (void*)0x080537A8 }, { 0x2724, 0, (void*)0x080537F4 }, { 0x2725, 0, (void*)0x08053850 }, + { 0x2726, 0, (void*)0x080538A8 }, { 0x2727, 0, (void*)0x08053914 }, { 0x2728, 0, (void*)0x08053974 }, + { 0x2729, 0, (void*)0x08053A34 }, { 0x272A, 0, (void*)0x08053A4C }, { 0x272B, 0, (void*)0x08053A90 }, + { 0x272C, 0, (void*)0x08053AB0 }, { 0x272D, 0, (void*)0x08053AF4 }, { 0x272E, 0, (void*)0x08053B3C }, + { 0x272F, 0, (void*)0x08053B9C }, { 0x2730, 0, (void*)0x08053BCC }, { 0x2731, 0, (void*)0x08053C04 }, + { 0x2732, 0, (void*)0x08053C70 }, { 0x2733, 0, (void*)0x08053CD8 }, { 0x2734, 0, (void*)0x08053D4C }, + { 0x2735, 0, (void*)0x08053DD4 }, { 0x2736, 0, (void*)0x08053E48 }, { 0x2737, 0, (void*)0x08053EA8 }, + { 0x2738, 0, (void*)0x08053F9C }, { 0x2739, 0, (void*)0x08054038 }, { 0x273A, 0, (void*)0x080540A0 }, + { 0x273B, 0, (void*)0x0805411C }, { 0x273C, 0, (void*)0x08054188 }, { 0x273D, 0, (void*)0x080541D0 }, + { 0x273E, 0, (void*)0x08054278 }, { 0x273F, 0, (void*)0x080542A0 }, { 0x2740, 0, (void*)0x0805432C }, + { 0x2741, 0, (void*)0x080543CC }, { 0x2742, 0, (void*)0x08054478 }, { 0x2743, 0, (void*)0x080544F8 }, + { 0x2744, 0, (void*)0x08054580 }, { 0x2745, 0, (void*)0x08054630 }, { 0x2746, 0, (void*)0x08054674 }, + { 0x2747, 0, (void*)0x080546C4 }, { 0x2748, 0, (void*)0x08054784 }, { 0x2749, 0, (void*)0x080547EC }, + { 0x274A, 0, (void*)0x0805483C }, { 0x274B, 0, (void*)0x0805489C }, { 0x274C, 0, (void*)0x08054924 }, + { 0x274D, 0, (void*)0x0805494C }, { 0x274E, 0, (void*)0x080549E0 }, { 0x274F, 0, (void*)0x08054A90 }, + { 0x2774, 0, (void*)0x08054B24 }, { 0x2775, 0, (void*)0x08054B7C }, { 0x2776, 0, (void*)0x08054C30 }, + { 0x2777, 0, (void*)0x08054C3C }, { 0x2778, 0, (void*)0x08054CD0 }, { 0x2779, 0, (void*)0x08054CDC }, + { 0x277A, 0, (void*)0x08054D00 }, { 0x277B, 0, (void*)0x08054DA4 }, { 0x277C, 0, (void*)0x08054EC8 }, + { 0x277D, 0, (void*)0x08054F54 }, { 0x277E, 0, (void*)0x08054FA0 }, { 0x277F, 0, (void*)0x08055004 }, + { 0x2780, 0, (void*)0x0805503C }, { 0x2781, 0, (void*)0x080550B0 }, { 0x2782, 0, (void*)0x08055110 }, + { 0x2783, 0, (void*)0x08055138 }, { 0x2784, 0, (void*)0x08055160 }, { 0x2785, 0, (void*)0x08055194 }, + { 0x2786, 0, (void*)0x080551E0 }, { 0x2787, 0, (void*)0x08055224 }, { 0x2788, 0, (void*)0x08055264 }, + { 0x2789, 0, (void*)0x080552A8 }, { 0x278A, 0, (void*)0x080552E8 }, { 0x278B, 0, (void*)0x08055310 }, + { 0x278C, 0, (void*)0x0805535C }, { 0x278D, 0, (void*)0x080553E0 }, { 0x278E, 0, (void*)0x08055424 }, + { 0x278F, 0, (void*)0x08055448 }, { 0x2790, 0, (void*)0x08055470 }, { 0x2791, 0, (void*)0x080554F0 }, + { 0x2792, 0, (void*)0x08055510 }, { 0x2793, 0, (void*)0x08055534 }, { 0x2794, 0, (void*)0x080555BC }, + { 0x2795, 0, (void*)0x080555FC }, { 0x2796, 0, (void*)0x0805565C }, { 0x2797, 0, (void*)0x08055688 }, + { 0x2798, 0, (void*)0x080556CC }, { 0x2799, 0, (void*)0x08055700 }, { 0x279A, 0, (void*)0x0805573C }, + { 0x279B, 0, (void*)0x0805576C }, { 0x279C, 0, (void*)0x080557B0 }, { 0x279D, 0, (void*)0x08055804 }, + { 0x279E, 0, (void*)0x08055858 }, { 0x279F, 0, (void*)0x080558DC }, { 0x27A0, 0, (void*)0x0805591C }, + { 0x27A1, 0, (void*)0x08055984 }, { 0x27A2, 0, (void*)0x080559C0 }, { 0x27A3, 0, (void*)0x08055A10 }, + { 0x27A4, 0, (void*)0x08055A38 }, { 0x27A5, 0, (void*)0x08055AB0 }, { 0x27A6, 0, (void*)0x08055AE8 }, + { 0x27A7, 0, (void*)0x08055B1C }, { 0x27A8, 0, (void*)0x08055B60 }, { 0x27A9, 0, (void*)0x08055BA8 }, + { 0x27AA, 0, (void*)0x08055BC0 }, { 0x27AB, 0, (void*)0x08055C10 }, { 0x27AC, 0, (void*)0x08055C34 }, + { 0x27AD, 0, (void*)0x08055CAC }, { 0x27AE, 0, (void*)0x08055CC4 }, { 0x27D8, 0, (void*)0x08055D0C }, + { 0x27D9, 0, (void*)0x08055D50 }, { 0x27DA, 0, (void*)0x08055D94 }, { 0x27DB, 0, (void*)0x08055DCC }, + { 0x27DC, 0, (void*)0x08055E10 }, { 0x27DD, 0, (void*)0x08055E50 }, { 0x27DE, 0, (void*)0x08055ED0 }, + { 0x27DF, 0, (void*)0x08055F14 }, { 0x27E0, 0, (void*)0x08055F70 }, { 0x27E1, 0, (void*)0x08056000 }, + { 0x27E2, 0, (void*)0x0805609C }, { 0x27E3, 0, (void*)0x080560DC }, { 0x27E4, 0, (void*)0x080560F8 }, + { 0x27E5, 0, (void*)0x08056128 }, { 0x27E6, 0, (void*)0x08056170 }, { 0x27E7, 0, (void*)0x08056220 }, + { 0x27E8, 0, (void*)0x0805627C }, { 0x27E9, 0, (void*)0x080562D8 }, { 0x27EA, 0, (void*)0x08056334 }, + { 0x27EB, 0, (void*)0x0805635C }, { 0x27EC, 0, (void*)0x080563B0 }, { 0x27ED, 0, (void*)0x080563D8 }, + { 0x27EE, 0, (void*)0x0805643C }, { 0x27EF, 0, (void*)0x08056468 }, { 0x27F0, 0, (void*)0x08056488 }, + { 0x27F1, 0, (void*)0x080564AC }, { 0x27F2, 0, (void*)0x080564F4 }, { 0x27F3, 0, (void*)0x0805653C }, + { 0x27F4, 0, (void*)0x08056570 }, { 0x27F5, 0, (void*)0x0805662C }, { 0x27F6, 0, (void*)0x0805668C }, + { 0x27F7, 0, (void*)0x080566B0 }, { 0x27F8, 0, (void*)0x080566E4 }, { 0x27F9, 0, (void*)0x08056708 }, + { 0x27FA, 0, (void*)0x08056734 }, { 0x283C, 0, (void*)0x0805678C }, { 0x283D, 0, (void*)0x080567C4 }, + { 0x2841, 0, (void*)0x080567FC }, { 0x2842, 0, (void*)0x08056840 }, { 0x2843, 0, (void*)0x08056878 }, + { 0x2844, 0, (void*)0x080568E0 }, { 0x2845, 0, (void*)0x0805696C }, { 0x2846, 0, (void*)0x080569BC }, + { 0x2847, 0, (void*)0x08056A18 }, { 0x2848, 0, (void*)0x08056A54 }, { 0x2849, 0, (void*)0x08056AB0 }, + { 0x284A, 0, (void*)0x08056AF4 }, { 0x284B, 0, (void*)0x08056B38 }, { 0x284C, 0, (void*)0x08056B88 }, + { 0x284D, 0, (void*)0x08056BCC }, { 0x284E, 0, (void*)0x08056C2C }, { 0x284F, 0, (void*)0x08056C7C }, + { 0x2850, 0, (void*)0x08056CA8 }, { 0x2851, 0, (void*)0x08056CF8 }, { 0x2852, 0, (void*)0x08056D24 }, + { 0x2853, 0, (void*)0x08056D68 }, { 0x2854, 0, (void*)0x08056DC0 }, { 0x2855, 0, (void*)0x08056E04 }, + { 0x2856, 0, (void*)0x08056E50 }, { 0x2857, 0, (void*)0x08056E98 }, { 0x2858, 0, (void*)0x08056EFC }, + { 0x2859, 0, (void*)0x08056F44 }, { 0x285A, 0, (void*)0x08056FA8 }, { 0x285B, 0, (void*)0x08056FE8 }, + { 0x285C, 0, (void*)0x08057014 }, { 0x285D, 0, (void*)0x0805705C }, { 0x285E, 0, (void*)0x08057088 }, + { 0x285F, 0, (void*)0x080570C8 }, { 0x2860, 0, (void*)0x080570FC }, { 0x2861, 0, (void*)0x08057114 }, + { 0x2862, 0, (void*)0x08057174 }, { 0x2863, 0, (void*)0x080571C0 }, { 0x2864, 0, (void*)0x0805722C }, + { 0x2865, 0, (void*)0x08057278 }, { 0x2866, 0, (void*)0x080572E4 }, { 0x2867, 0, (void*)0x08057328 }, + { 0x2868, 0, (void*)0x08057358 }, { 0x2869, 0, (void*)0x080573A4 }, { 0x286A, 0, (void*)0x08057410 }, + { 0x286B, 0, (void*)0x08057454 }, { 0x286C, 0, (void*)0x08057484 }, { 0x286D, 0, (void*)0x080574D0 }, + { 0x286E, 0, (void*)0x080574F8 }, { 0x286F, 0, (void*)0x0805753C }, { 0x2870, 0, (void*)0x080575A8 }, + { 0x2871, 0, (void*)0x080575E4 }, { 0x2872, 0, (void*)0x08057628 }, { 0x2873, 0, (void*)0x0805765C }, + { 0x2874, 0, (void*)0x080576B4 }, { 0x2875, 0, (void*)0x080576D0 }, { 0x2876, 0, (void*)0x08057728 }, + { 0x2877, 0, (void*)0x0805777C }, { 0x2878, 0, (void*)0x080577D4 }, { 0x2879, 0, (void*)0x08057828 }, + { 0x287A, 0, (void*)0x08057890 }, { 0x287B, 0, (void*)0x08057900 }, { 0x287C, 0, (void*)0x08057968 }, + { 0x287D, 0, (void*)0x080579B8 }, { 0x287E, 0, (void*)0x080579E8 }, { 0x287F, 0, (void*)0x08057A5C }, + { 0x2880, 0, (void*)0x08057AA8 }, { 0x2881, 0, (void*)0x08057B24 }, { 0x2882, 0, (void*)0x08057B5C }, + { 0x2883, 0, (void*)0x08057B94 }, { 0x2884, 0, (void*)0x08057BC8 }, { 0x2885, 0, (void*)0x08057BE0 }, + { 0x2886, 0, (void*)0x08057BF8 }, { 0x2887, 0, (void*)0x08057C24 }, { 0x2888, 0, (void*)0x08057C5C }, + { 0x2889, 0, (void*)0x08057C88 }, { 0x288A, 0, (void*)0x08057CB4 }, { 0x288B, 0, (void*)0x08057CD4 }, + { 0x28A0, 0, (void*)0x08057CF0 }, { 0x28A1, 0, (void*)0x08057D20 }, { 0x28A2, 0, (void*)0x08057D5C }, + { 0x28A3, 0, (void*)0x08057D94 }, { 0x28A4, 0, (void*)0x08057E80 }, { 0x28A5, 0, (void*)0x08057F64 }, + { 0x28A6, 0, (void*)0x08057FA8 }, { 0x28A7, 0, (void*)0x08058080 }, { 0x28A8, 0, (void*)0x080580B4 }, + { 0x28A9, 0, (void*)0x080580F4 }, { 0x28AA, 0, (void*)0x08058130 }, { 0x28AB, 0, (void*)0x08058160 }, + { 0x28AC, 0, (void*)0x080581EC }, { 0x28AD, 0, (void*)0x080582C0 }, { 0x28AF, 0, (void*)0x080582DC }, + { 0x28B0, 0, (void*)0x080582F8 }, { 0x28B1, 0, (void*)0x08058340 }, { 0x28B2, 0, (void*)0x080583A8 }, + { 0x28B3, 0, (void*)0x08058400 }, { 0x28B4, 0, (void*)0x08058488 }, { 0x28B5, 0, (void*)0x080584E8 }, + { 0x28B6, 0, (void*)0x08058524 }, { 0x28B7, 0, (void*)0x08058594 }, { 0x28B8, 0, (void*)0x080585F4 }, + { 0x28B9, 0, (void*)0x08058618 }, { 0x28BA, 0, (void*)0x0805864C }, { 0x28BB, 0, (void*)0x08058688 }, + { 0x28BC, 0, (void*)0x080586B8 }, { 0x28BD, 0, (void*)0x080586F8 }, { 0x28BE, 0, (void*)0x0805871C }, + { 0x28BF, 0, (void*)0x08058760 }, { 0x28C0, 0, (void*)0x0805878C }, { 0x28C1, 0, (void*)0x080587B4 }, + { 0x28C2, 0, (void*)0x0805881C }, { 0x28C3, 0, (void*)0x08058880 }, { 0x28C4, 0, (void*)0x080589EC }, + { 0x28C5, 0, (void*)0x08058A60 }, { 0x28C6, 0, (void*)0x08058A78 }, { 0x28C7, 0, (void*)0x08058AC0 }, + { 0x28C8, 0, (void*)0x08058AF4 }, { 0x28C9, 0, (void*)0x08058B54 }, { 0x28CA, 0, (void*)0x08058B9C }, + { 0x28CB, 0, (void*)0x08058BD4 }, { 0x28CC, 0, (void*)0x08058C24 }, { 0x28CD, 0, (void*)0x08058C58 }, + { 0x28CE, 0, (void*)0x08058C6C }, { 0x28CF, 0, (void*)0x08058C88 }, { 0x28D0, 0, (void*)0x08058CCC }, + { 0x28D1, 0, (void*)0x08058D1C }, { 0x28D2, 0, (void*)0x08058D4C }, { 0x28D3, 0, (void*)0x08058DA0 }, + { 0x28D4, 0, (void*)0x08058DF0 }, { 0x28D5, 0, (void*)0x08058E4C }, { 0x28D6, 0, (void*)0x08058EE8 }, + { 0x28D7, 0, (void*)0x08058F10 }, { 0x28D8, 0, (void*)0x08058F60 }, { 0x28D9, 0, (void*)0x0805901C }, + { 0x28DA, 0, (void*)0x08059030 }, { 0x28DB, 0, (void*)0x08059154 }, { 0x28DC, 0, (void*)0x08059184 }, + { 0x28DE, 0, (void*)0x080591A8 }, { 0x28DF, 0, (void*)0x080591E4 }, { 0x28E0, 0, (void*)0x08059220 }, + { 0x28E1, 0, (void*)0x08059260 }, { 0x28E2, 0, (void*)0x080592C8 }, { 0x28E3, 0, (void*)0x0805931C }, + { 0x28E4, 0, (void*)0x08059378 }, { 0x28E5, 0, (void*)0x080593A4 }, { 0x28E6, 0, (void*)0x080593B8 }, + { 0x28E7, 0, (void*)0x080593FC }, { 0x28E8, 0, (void*)0x08059420 }, { 0x28E9, 0, (void*)0x0805945C }, + { 0x28EA, 0, (void*)0x08059480 }, { 0x28EB, 0, (void*)0x080594D4 }, { 0x28EC, 0, (void*)0x08059564 }, + { 0x28ED, 0, (void*)0x080595B8 }, { 0x28EE, 0, (void*)0x080595F8 }, { 0x28EF, 0, (void*)0x08059640 }, + { 0x28F0, 0, (void*)0x080596F8 }, { 0x28F1, 0, (void*)0x08059754 }, { 0x28F2, 0, (void*)0x080597D4 }, + { 0x28F3, 0, (void*)0x08059814 }, { 0x28F4, 0, (void*)0x080599B0 }, { 0x28F5, 0, (void*)0x080599F8 }, + { 0x28F6, 0, (void*)0x08059AC0 }, { 0x28F7, 0, (void*)0x08059AEC }, { 0x28F8, 0, (void*)0x08059B70 }, + { 0x28F9, 0, (void*)0x08059BDC }, { 0x28FA, 0, (void*)0x08059C00 }, { 0x28FB, 0, (void*)0x08059C60 }, + { 0x28FC, 0, (void*)0x08059CBC }, { 0x28FD, 0, (void*)0x08059DA0 }, { 0x28FE, 0, (void*)0x08059DB0 }, + { 0x28FF, 0, (void*)0x08059E2C }, { 0x2900, 0, (void*)0x08059EC8 }, { 0x2901, 0, (void*)0x08059EF4 }, + { 0x2902, 0, (void*)0x08059F70 }, { 0x2903, 0, (void*)0x08059FD0 }, { 0x2904, 0, (void*)0x0805A04C }, + { 0x2905, 0, (void*)0x0805A24C }, { 0x2906, 0, (void*)0x0805A4F8 }, { 0x2907, 0, (void*)0x0805A584 }, + { 0x2908, 0, (void*)0x0805A5C0 }, { 0x2909, 0, (void*)0x0805A60C }, { 0x290A, 0, (void*)0x0805A640 }, + { 0x290B, 0, (void*)0x0805A6C8 }, { 0x290C, 0, (void*)0x0805A9C0 }, { 0x290D, 0, (void*)0x0805AD84 }, + { 0x290E, 0, (void*)0x0805ADF8 }, { 0x290F, 0, (void*)0x0805AE40 }, { 0x2910, 0, (void*)0x0805AE74 }, + { 0x2911, 0, (void*)0x0805AF50 }, { 0x2912, 0, (void*)0x0805AFCC }, { 0x2913, 0, (void*)0x0805B044 }, + { 0x2914, 0, (void*)0x0805B104 }, { 0x2915, 0, (void*)0x0805B1F8 }, { 0x2916, 0, (void*)0x0805B224 }, + { 0x2917, 0, (void*)0x0805B244 }, { 0x2918, 0, (void*)0x0805B2A0 }, { 0x2919, 0, (void*)0x0805B2D0 }, + { 0x291A, 0, (void*)0x0805B314 }, { 0x291B, 0, (void*)0x0805B354 }, { 0x291C, 0, (void*)0x0805B3B0 }, + { 0x291D, 0, (void*)0x0805B400 }, { 0x291E, 0, (void*)0x0805B454 }, { 0x291F, 0, (void*)0x0805B494 }, + { 0x2920, 0, (void*)0x0805B4EC }, { 0x2921, 0, (void*)0x0805B538 }, { 0x2922, 0, (void*)0x0805B58C }, + { 0x2923, 0, (void*)0x0805B600 }, { 0x2924, 0, (void*)0x0805B65C }, { 0x2925, 0, (void*)0x0805B738 }, + { 0x2926, 0, (void*)0x0805B770 }, { 0x2927, 0, (void*)0x0805B794 }, { 0x2928, 0, (void*)0x0805B7C8 }, + { 0x2929, 0, (void*)0x0805B7EC }, { 0x292A, 0, (void*)0x0805B814 }, { 0x292B, 0, (void*)0x0805B8C0 }, + { 0x292C, 0, (void*)0x0805B994 }, { 0x292D, 0, (void*)0x0805BA44 }, { 0x292E, 0, (void*)0x0805BB14 }, + { 0x292F, 0, (void*)0x0805BB74 }, { 0x2930, 0, (void*)0x0805BBEC }, { 0x2931, 0, (void*)0x0805BC40 }, + { 0x2932, 0, (void*)0x0805BCBC }, { 0x2933, 0, (void*)0x0805BD3C }, { 0x2934, 0, (void*)0x0805BDA4 }, + { 0x2935, 0, (void*)0x0805BDE0 }, { 0x2936, 0, (void*)0x0805BE20 }, { 0x2937, 0, (void*)0x0805BE90 }, + { 0x2938, 0, (void*)0x0805BEE8 }, { 0x2939, 0, (void*)0x0805BF5C }, { 0x293A, 0, (void*)0x0805BF80 }, + { 0x293B, 0, (void*)0x0805BFE4 }, { 0x293C, 0, (void*)0x0805C00C }, { 0x293D, 0, (void*)0x0805C094 }, + { 0x293E, 0, (void*)0x0805C0EC }, { 0x293F, 0, (void*)0x0805C168 }, { 0x2940, 0, (void*)0x0805C1EC }, + { 0x2941, 0, (void*)0x0805C258 }, { 0x2942, 0, (void*)0x0805C2DC }, { 0x2943, 0, (void*)0x0805C350 }, + { 0x2944, 0, (void*)0x0805C3B8 }, { 0x2945, 0, (void*)0x0805C3F8 }, { 0x2946, 0, (void*)0x0805C44C }, + { 0x2947, 0, (void*)0x0805C470 }, { 0x2948, 0, (void*)0x0805C4F0 }, { 0x2949, 0, (void*)0x0805C518 }, + { 0x294A, 0, (void*)0x0805C534 }, { 0x294B, 0, (void*)0x0805C54C }, { 0x294C, 0, (void*)0x0805C570 }, + { 0x294D, 0, (void*)0x0805C5A8 }, { 0x294E, 0, (void*)0x0805C680 }, { 0x294F, 0, (void*)0x0805C740 }, + { 0x2950, 0, (void*)0x0805C794 }, { 0x2951, 0, (void*)0x0805C7F4 }, { 0x2952, 0, (void*)0x0805C854 }, + { 0x2953, 0, (void*)0x0805C914 }, { 0x2954, 0, (void*)0x0805C940 }, { 0x2955, 0, (void*)0x0805C980 }, + { 0x2956, 0, (void*)0x0805C9DC }, { 0x2957, 0, (void*)0x0805CA08 }, { 0x2958, 0, (void*)0x0805CA2C }, + { 0x2959, 0, (void*)0x0805CA48 }, { 0x295A, 0, (void*)0x0805CA6C }, { 0x295B, 0, (void*)0x0805CAB4 }, + { 0x295C, 0, (void*)0x0805CB08 }, { 0x295D, 0, (void*)0x0805CB24 }, { 0x295E, 0, (void*)0x0805CB44 }, + { 0x295F, 0, (void*)0x0805CB60 }, { 0x2960, 0, (void*)0x0805CC3C }, { 0x2961, 0, (void*)0x0805CD14 }, + { 0x2962, 0, (void*)0x0805CD3C }, { 0x2968, 0, (void*)0x0805CE60 }, { 0x2969, 0, (void*)0x0805CE78 }, + { 0x296A, 0, (void*)0x0805CEF4 }, { 0x296B, 0, (void*)0x0805CF24 }, { 0x296C, 0, (void*)0x0805CF64 }, + { 0x296D, 0, (void*)0x0805CF9C }, { 0x296E, 0, (void*)0x0805CFB4 }, { 0x296F, 0, (void*)0x0805D018 }, + { 0x2970, 0, (void*)0x0805D08C }, { 0x2971, 0, (void*)0x0805D17C }, { 0x2972, 0, (void*)0x0805D1C4 }, + { 0x2973, 0, (void*)0x0805D234 }, { 0x2974, 0, (void*)0x0805D258 }, { 0x2975, 0, (void*)0x0805D2E4 }, + { 0x2976, 0, (void*)0x0805D314 }, { 0x2977, 0, (void*)0x0805D358 }, { 0x2978, 0, (void*)0x0805D3DC }, + { 0x2979, 0, (void*)0x0805D414 }, { 0x297A, 0, (void*)0x0805D458 }, { 0x29CC, 0, (void*)0x0805D4A8 }, + { 0x29CD, 0, (void*)0x0805D4C0 }, { 0x29CE, 0, (void*)0x0805D514 }, { 0x29CF, 0, (void*)0x0805D550 }, + { 0x29D0, 0, (void*)0x0805D580 }, { 0x29D1, 0, (void*)0x0805D5AC }, { 0x29D2, 0, (void*)0x0805D5D4 }, + { 0x29D3, 0, (void*)0x0805D620 }, { 0x29D4, 0, (void*)0x0805D724 }, { 0x29D5, 0, (void*)0x0805D824 }, + { 0x29D6, 0, (void*)0x0805D864 }, { 0x29D7, 0, (void*)0x0805D8A8 }, { 0x29D8, 0, (void*)0x0805D9A8 }, + { 0x29D9, 0, (void*)0x0805DAA4 }, { 0x29DA, 0, (void*)0x0805DAFC }, { 0x29DB, 0, (void*)0x0805DB3C }, + { 0x29DC, 0, (void*)0x0805DBA0 }, { 0x29DD, 0, (void*)0x0805DBDC }, { 0x29DE, 0, (void*)0x0805DC00 }, + { 0x29DF, 0, (void*)0x0805DC68 }, { 0x29E0, 0, (void*)0x0805DC94 }, { 0x29E1, 0, (void*)0x0805DCC0 }, + { 0x29E2, 0, (void*)0x0805DCE8 }, { 0x29E3, 0, (void*)0x0805DE80 }, { 0x29E4, 0, (void*)0x0805DEC0 }, + { 0x29E5, 0, (void*)0x0805DFAC }, { 0x29E6, 0, (void*)0x0805DFC8 }, { 0x29E7, 0, (void*)0x0805E00C }, + { 0x29E8, 0, (void*)0x0805E098 }, { 0x29E9, 0, (void*)0x0805E0DC }, { 0x29EA, 0, (void*)0x0805E1D0 }, + { 0x29EB, 0, (void*)0x0805E204 }, { 0x29EC, 0, (void*)0x0805E234 }, { 0x29ED, 0, (void*)0x0805E258 }, + { 0x29EE, 0, (void*)0x0805E2A4 }, { 0x29EF, 0, (void*)0x0805E2D4 }, { 0x29F0, 0, (void*)0x0805E314 }, + { 0x29F1, 0, (void*)0x0805E344 }, { 0x29F2, 0, (void*)0x0805E390 }, { 0x29F3, 0, (void*)0x0805E3EC }, + { 0x29F4, 0, (void*)0x0805E428 }, { 0x29F5, 0, (void*)0x0805E49C }, { 0x29F8, 0, (void*)0x0805E4D8 }, + { 0x29F9, 0, (void*)0x0805E530 }, { 0x29FA, 0, (void*)0x0805E56C }, { 0x29FB, 0, (void*)0x0805E5B8 }, + { 0x29FC, 0, (void*)0x0805E608 }, { 0x29FD, 0, (void*)0x0805E654 }, { 0x29FE, 0, (void*)0x0805E6C8 }, + { 0x29FF, 0, (void*)0x0805E700 }, { 0x2A00, 0, (void*)0x0805E7B4 }, { 0x2A01, 0, (void*)0x0805E7D0 }, + { 0x2A02, 0, (void*)0x0805E81C }, { 0x2A30, 0, (void*)0x0805E878 }, { 0x2A31, 0, (void*)0x0805E898 }, + { 0x2A32, 0, (void*)0x0805E8DC }, { 0x2A33, 0, (void*)0x0805E94C }, { 0x2A34, 0, (void*)0x0805EA04 }, + { 0x2A35, 0, (void*)0x0805EA90 }, { 0x2A36, 0, (void*)0x0805EB14 }, { 0x2A37, 0, (void*)0x0805EB4C }, + { 0x2A38, 0, (void*)0x0805EBD0 }, { 0x2A39, 0, (void*)0x0805EC28 }, { 0x2A3A, 0, (void*)0x0805EC40 }, + { 0x2A94, 0, (void*)0x0805EC78 }, { 0x2A95, 0, (void*)0x0805ECA4 }, { 0x2A96, 0, (void*)0x0805ECD0 }, + { 0x2A97, 0, (void*)0x0805EDEC }, { 0x2A98, 0, (void*)0x0805EF18 }, { 0x2A99, 0, (void*)0x0805EF50 }, + { 0x2A9A, 0, (void*)0x0805EFE0 }, { 0x2A9B, 0, (void*)0x0805F120 }, { 0x2A9C, 0, (void*)0x0805F254 }, + { 0x2A9D, 0, (void*)0x0805F30C }, { 0x2A9E, 0, (void*)0x0805F3CC }, { 0x2A9F, 0, (void*)0x0805F4B4 }, + { 0x2AA0, 0, (void*)0x0805F5D0 }, { 0x2AA1, 0, (void*)0x0805F604 }, { 0x2AA2, 0, (void*)0x0805F63C }, + { 0x2AA3, 0, (void*)0x0805F68C }, { 0x2AA4, 0, (void*)0x0805F6BC }, { 0x2AA5, 0, (void*)0x0805F71C }, + { 0x2AA6, 0, (void*)0x0805F760 }, { 0x2AA7, 0, (void*)0x0805F7E4 }, { 0x2AA8, 0, (void*)0x0805F81C }, + { 0x2AA9, 0, (void*)0x0805F834 }, { 0x2AAA, 0, (void*)0x0805F870 }, { 0x2AAB, 0, (void*)0x0805F888 }, + { 0x2AAC, 0, (void*)0x0805F8B0 }, { 0x2AAD, 0, (void*)0x0805F8D4 }, { 0x2AAE, 0, (void*)0x0805F944 }, + { 0x2AAF, 0, (void*)0x0805F988 }, { 0x2AB0, 0, (void*)0x0805F9B0 }, { 0x2AB1, 0, (void*)0x0805FA58 }, + { 0x2AB2, 0, (void*)0x0805FA6C }, { 0x2AB3, 0, (void*)0x0805FA80 }, { 0x2AB4, 0, (void*)0x0805FB0C }, + { 0x2AB5, 0, (void*)0x0805FB20 }, { 0x2AB6, 0, (void*)0x0805FB64 }, { 0x2AB7, 0, (void*)0x0805FB80 }, + { 0x2AB8, 0, (void*)0x0805FB9C }, { 0x2AB9, 0, (void*)0x0805FBF4 }, { 0x2ABA, 0, (void*)0x0805FC24 }, + { 0x2ABB, 0, (void*)0x0805FC88 }, { 0x2ABC, 0, (void*)0x0805FCB0 }, { 0x2ABD, 0, (void*)0x0805FCD8 }, + { 0x2ABE, 0, (void*)0x0805FDD8 }, { 0x2ABF, 0, (void*)0x0805FDFC }, { 0x2AC0, 0, (void*)0x0805FF50 }, + { 0x2AC1, 0, (void*)0x0805FF7C }, { 0x2AC2, 0, (void*)0x080600D0 }, { 0x2AC3, 0, (void*)0x080600EC }, + { 0x2AC4, 0, (void*)0x080601F8 }, { 0x2AC5, 0, (void*)0x0806022C }, { 0x2AC6, 0, (void*)0x08060250 }, + { 0x2AC7, 0, (void*)0x08060260 }, { 0x2AC8, 0, (void*)0x08060270 }, { 0x2AC9, 0, (void*)0x08060280 }, + { 0x2ACA, 0, (void*)0x080602E0 }, { 0x2ACB, 0, (void*)0x0806030C }, { 0x2ACC, 0, (void*)0x08060340 }, + { 0x2ACD, 0, (void*)0x080603A4 }, { 0x2ACE, 0, (void*)0x080603C0 }, { 0x2ACF, 0, (void*)0x0806047C }, + { 0x2AD0, 0, (void*)0x08060494 }, { 0x2AD1, 0, (void*)0x0806053C }, { 0x2AD2, 0, (void*)0x080605B0 }, + { 0x2AD3, 0, (void*)0x080605FC }, { 0x2AD4, 0, (void*)0x0806067C }, { 0x2AD5, 0, (void*)0x080606A0 }, + { 0x2AD6, 0, (void*)0x080606BC }, { 0x2AD7, 0, (void*)0x080606EC }, { 0x2AD8, 0, (void*)0x08060724 }, + { 0x2AD9, 0, (void*)0x08060748 }, { 0x2ADA, 0, (void*)0x08060794 }, { 0x2ADB, 0, (void*)0x08060814 }, + { 0x2ADC, 0, (void*)0x08060874 }, { 0x2ADD, 0, (void*)0x080608B4 }, { 0x2ADE, 0, (void*)0x080608D0 }, + { 0x2ADF, 0, (void*)0x08060960 }, { 0x2AE0, 0, (void*)0x08060A00 }, { 0x2AE1, 0, (void*)0x08060AA8 }, + { 0x2AE2, 0, (void*)0x08060AD4 }, { 0x2AE3, 0, (void*)0x08060B10 }, { 0x2AE4, 0, (void*)0x08060B74 }, + { 0x2AE5, 0, (void*)0x08060BD0 }, { 0x2AE6, 0, (void*)0x08060C6C }, { 0x2AEA, 0, (void*)0x08060CDC }, + { 0x2AEB, 0, (void*)0x08060D1C }, { 0x2AEC, 0, (void*)0x08060D70 }, { 0x2AED, 0, (void*)0x08060D98 }, + { 0x2AEE, 0, (void*)0x08060DB8 }, { 0x2AF8, 0, (void*)0x08060DC8 }, { 0x2AF9, 0, (void*)0x08060DE4 }, + { 0x2AFA, 0, (void*)0x08060EC8 }, { 0x2AFB, 0, (void*)0x08060FC0 }, { 0x2AFC, 0, (void*)0x080610CC }, + { 0x2AFD, 0, (void*)0x080611BC }, { 0x2AFE, 0, (void*)0x080611F4 }, { 0x2AFF, 0, (void*)0x080612EC }, + { 0x2B00, 0, (void*)0x080613FC }, { 0x2B01, 0, (void*)0x08061448 }, { 0x2B02, 0, (void*)0x08061470 }, + { 0x2B03, 0, (void*)0x080614D0 }, { 0x2B04, 0, (void*)0x08061504 }, { 0x2B05, 0, (void*)0x08061578 }, + { 0x2B06, 0, (void*)0x080615DC }, { 0x2B07, 0, (void*)0x08061658 }, { 0x2B08, 0, (void*)0x0806167C }, + { 0x2B09, 0, (void*)0x080616C0 }, { 0x2B0A, 0, (void*)0x08061714 }, { 0x2B0B, 0, (void*)0x08061750 }, + { 0x2B0C, 0, (void*)0x080617A8 }, { 0x2B0D, 0, (void*)0x080617D8 }, { 0x2B0E, 0, (void*)0x08061810 }, + { 0x2B0F, 0, (void*)0x08061890 }, { 0x2B10, 0, (void*)0x080619A0 }, { 0x2B11, 0, (void*)0x08061AD8 }, + { 0x2B12, 0, (void*)0x08061B44 }, { 0x2B13, 0, (void*)0x08061BA0 }, { 0x2B14, 0, (void*)0x08061C0C }, + { 0x2B15, 0, (void*)0x08061C44 }, { 0x2B16, 0, (void*)0x08061CE0 }, { 0x2B17, 0, (void*)0x08061D4C }, + { 0x2B18, 0, (void*)0x08061D70 }, { 0x2B19, 0, (void*)0x08061DD4 }, { 0x2B1A, 0, (void*)0x08061EB4 }, + { 0x2B1B, 0, (void*)0x08061F10 }, { 0x2B1C, 0, (void*)0x08061F88 }, { 0x2B1D, 0, (void*)0x08061FC4 }, + { 0x2B1E, 0, (void*)0x08061FEC }, { 0x2B1F, 0, (void*)0x08062024 }, { 0x2B20, 0, (void*)0x0806209C }, + { 0x2B21, 0, (void*)0x0806212C }, { 0x2B22, 0, (void*)0x08062164 }, { 0x2B23, 0, (void*)0x080621A8 }, + { 0x2B24, 0, (void*)0x0806229C }, { 0x2B25, 0, (void*)0x080622D8 }, { 0x2B26, 0, (void*)0x080622F8 }, + { 0x2B27, 0, (void*)0x08062350 }, { 0x2B28, 0, (void*)0x080623A0 }, { 0x2B29, 0, (void*)0x080623D0 }, + { 0x2B2A, 0, (void*)0x08062428 }, { 0x2B2B, 0, (void*)0x08062478 }, { 0x2B2C, 0, (void*)0x080624AC }, + { 0x2B2D, 0, (void*)0x08062500 }, { 0x2B2E, 0, (void*)0x08062550 }, { 0x2B2F, 0, (void*)0x08062580 }, + { 0x2B30, 0, (void*)0x080625D4 }, { 0x2B31, 0, (void*)0x08062624 }, { 0x2B32, 0, (void*)0x08062650 }, + { 0x2B33, 0, (void*)0x08062670 }, { 0x2B34, 0, (void*)0x080626B0 }, { 0x2B35, 0, (void*)0x080626DC }, + { 0x2B36, 0, (void*)0x080626FC }, { 0x2B37, 0, (void*)0x0806273C }, { 0x2B38, 0, (void*)0x080627D8 }, + { 0x2B39, 0, (void*)0x08062890 }, { 0x2B3A, 0, (void*)0x08062910 }, { 0x2B3B, 0, (void*)0x08062968 }, + { 0x2B3C, 0, (void*)0x080629A4 }, { 0x2B3D, 0, (void*)0x080629E0 }, { 0x2B3E, 0, (void*)0x08062A90 }, + { 0x2B3F, 0, (void*)0x08062AD8 }, { 0x2B40, 0, (void*)0x08062B34 }, { 0x2B5C, 0, (void*)0x08062B84 }, + { 0x2B5D, 0, (void*)0x08062C3C }, { 0x2B5E, 0, (void*)0x08062C68 }, { 0x2B5F, 0, (void*)0x08062C94 }, + { 0x2B60, 0, (void*)0x08062CE8 }, { 0x2B61, 0, (void*)0x08062D8C }, { 0x2B62, 0, (void*)0x08062E34 }, + { 0x2B63, 0, (void*)0x08062E84 }, { 0x2B64, 0, (void*)0x08062F18 }, { 0x2B65, 0, (void*)0x08062F50 }, + { 0x2B66, 0, (void*)0x08062F98 }, { 0x2B67, 0, (void*)0x08062FE0 }, { 0x32C8, 0, (void*)0x08063054 }, + { 0x32C9, 0, (void*)0x080630D8 }, { 0x32CA, 0, (void*)0x08063120 }, { 0x32CB, 0, (void*)0x08063184 }, + { 0x32CC, 0, (void*)0x080631E0 }, { 0x32CD, 0, (void*)0x08063210 }, { 0x32CE, 0, (void*)0x0806326C }, + { 0x32CF, 0, (void*)0x08063294 }, { 0x32D0, 0, (void*)0x080632B4 }, { 0x32D1, 0, (void*)0x08063300 }, + { 0x32D2, 0, (void*)0x08063338 }, { 0x32D3, 0, (void*)0x08063384 }, { 0x32D4, 0, (void*)0x080633B4 }, + { 0x332C, 0, (void*)0x080633E8 }, { 0x332D, 0, (void*)0x08063408 }, { 0x332E, 0, (void*)0x080634FC }, + { 0x332F, 0, (void*)0x0806356C }, { 0x3330, 0, (void*)0x08063594 }, { 0x3331, 0, (void*)0x080635AC }, + { 0x3332, 0, (void*)0x080635D0 }, { 0x3333, 0, (void*)0x08063618 }, { 0x3334, 0, (void*)0x0806369C }, + { 0x3335, 0, (void*)0x08063714 }, { 0x3336, 0, (void*)0x08063734 }, { 0x3337, 0, (void*)0x08063788 }, + { 0x3338, 0, (void*)0x080637AC }, { 0x3339, 0, (void*)0x080637CC }, { 0x333A, 0, (void*)0x08063838 }, + { 0x333B, 0, (void*)0x08063868 }, { 0x333C, 0, (void*)0x08063898 }, { 0x333D, 0, (void*)0x08063948 }, + { 0x333E, 0, (void*)0x08063988 }, { 0x333F, 0, (void*)0x080639AC }, { 0x3340, 0, (void*)0x08063A58 }, + { 0x3341, 0, (void*)0x08063AB0 }, { 0x3342, 0, (void*)0x08063B24 }, { 0x3343, 0, (void*)0x08063BBC }, + { 0x3344, 0, (void*)0x08063C28 }, { 0x3345, 0, (void*)0x08063CF0 }, { 0x3346, 0, (void*)0x08063D24 }, + { 0x3347, 0, (void*)0x08063D5C }, { 0x3348, 0, (void*)0x08063D8C }, { 0x3349, 0, (void*)0x08063DEC }, + { 0x334A, 0, (void*)0x08063E70 }, { 0x334B, 0, (void*)0x08063EA8 }, { 0x334C, 0, (void*)0x08063EC4 }, + { 0x334D, 0, (void*)0x08063FB4 }, { 0x334E, 0, (void*)0x08063FDC }, { 0x334F, 0, (void*)0x08064038 }, + { 0x3350, 0, (void*)0x08064058 }, { 0x3351, 0, (void*)0x0806408C }, { 0x3352, 0, (void*)0x080640B0 }, + { 0x3353, 0, (void*)0x080640E0 }, { 0x3354, 0, (void*)0x08064168 }, { 0x3355, 0, (void*)0x080641B4 }, + { 0x3356, 0, (void*)0x080641EC }, { 0x3357, 0, (void*)0x08064218 }, { 0x3358, 0, (void*)0x08064230 }, + { 0x3359, 0, (void*)0x08064264 }, { 0x335A, 0, (void*)0x08064298 }, { 0x335B, 0, (void*)0x080642F0 }, + { 0x335C, 0, (void*)0x08064354 }, { 0x335D, 0, (void*)0x0806437C }, { 0x335E, 0, (void*)0x080643B4 }, + { 0x335F, 0, (void*)0x080643E4 }, { 0x3360, 0, (void*)0x0806444C }, { 0x3361, 0, (void*)0x08064498 }, + { 0x3362, 0, (void*)0x080644EC }, { 0x3363, 0, (void*)0x0806453C }, { 0x3364, 0, (void*)0x08064564 }, + { 0x3365, 0, (void*)0x08064654 }, { 0x3366, 0, (void*)0x08064718 }, { 0x3367, 0, (void*)0x080647E4 }, + { 0x3368, 0, (void*)0x08064860 }, { 0x3369, 0, (void*)0x080648B8 }, { 0x336A, 0, (void*)0x08064988 }, + { 0x336B, 0, (void*)0x080649F4 }, { 0x336C, 0, (void*)0x08064A44 }, { 0x336D, 0, (void*)0x08064AA0 }, + { 0x336E, 0, (void*)0x08064AE8 }, { 0x336F, 0, (void*)0x08064B10 }, { 0x3370, 0, (void*)0x08064B64 }, + { 0x3371, 0, (void*)0x08064BBC }, { 0x3390, 0, (void*)0x08064BEC }, { 0x3391, 0, (void*)0x08064C24 }, + { 0x3392, 0, (void*)0x08064CE0 }, { 0x3393, 0, (void*)0x08064D4C }, { 0x3394, 0, (void*)0x08064DA0 }, + { 0x3395, 0, (void*)0x08064E04 }, { 0x3396, 0, (void*)0x08064F10 }, { 0x3397, 0, (void*)0x08064F84 }, + { 0x3398, 0, (void*)0x08064FBC }, { 0x3399, 0, (void*)0x08065070 }, { 0x339A, 0, (void*)0x080650DC }, + { 0x339B, 0, (void*)0x08065144 }, { 0x339C, 0, (void*)0x0806516C }, { 0x339D, 0, (void*)0x0806519C }, + { 0x339E, 0, (void*)0x080651D4 }, { 0x339F, 0, (void*)0x080651F0 }, { 0x33A0, 0, (void*)0x0806524C }, + { 0x33A1, 0, (void*)0x08065358 }, { 0x33A2, 0, (void*)0x080653CC }, { 0x33A3, 0, (void*)0x08065408 }, + { 0x33A4, 0, (void*)0x08065438 }, { 0x33A5, 0, (void*)0x08065470 }, { 0x33A6, 0, (void*)0x080654CC }, + { 0x33A7, 0, (void*)0x08065510 }, { 0x33A8, 0, (void*)0x0806555C }, { 0x33A9, 0, (void*)0x080655A0 }, + { 0x33AA, 0, (void*)0x080655C0 }, { 0x33AB, 0, (void*)0x08065600 }, { 0x33AC, 0, (void*)0x08065658 }, + { 0x33AD, 0, (void*)0x08065678 }, { 0x33AE, 0, (void*)0x08065710 }, { 0x33AF, 0, (void*)0x080657A8 }, + { 0x33B0, 0, (void*)0x080657D0 }, { 0x33B1, 0, (void*)0x080657E8 }, { 0x33B2, 0, (void*)0x08065860 }, + { 0x33B3, 0, (void*)0x080658E4 }, { 0x33B4, 0, (void*)0x08065930 }, { 0x33B5, 0, (void*)0x0806597C }, + { 0x33B6, 0, (void*)0x080659DC }, { 0x33B7, 0, (void*)0x08065A28 }, { 0x33B8, 0, (void*)0x08065ABC }, + { 0x33B9, 0, (void*)0x08065AE0 }, { 0x33BA, 0, (void*)0x08065B08 }, { 0x33BB, 0, (void*)0x08065B7C }, + { 0x33BC, 0, (void*)0x08065BD8 }, { 0x33BD, 0, (void*)0x08065C5C }, { 0x33BE, 0, (void*)0x08065C88 }, + { 0x33BF, 0, (void*)0x08065CCC }, { 0x33C0, 0, (void*)0x08065D30 }, { 0x33C1, 0, (void*)0x08065DD4 }, + { 0x33C2, 0, (void*)0x08065E24 }, { 0x33C3, 0, (void*)0x08065E84 }, { 0x33C4, 0, (void*)0x08065F4C }, + { 0x33C5, 0, (void*)0x08066024 }, { 0x33C6, 0, (void*)0x08066120 }, { 0x33C7, 0, (void*)0x08066144 }, + { 0x33C8, 0, (void*)0x08066200 }, { 0x33C9, 0, (void*)0x08066268 }, { 0x33CA, 0, (void*)0x0806629C }, + { 0x33CB, 0, (void*)0x080662D0 }, { 0x33CC, 0, (void*)0x0806630C }, { 0x33CD, 0, (void*)0x08066324 }, + { 0x33CE, 0, (void*)0x0806635C }, { 0x33CF, 0, (void*)0x0806637C }, { 0x33D0, 0, (void*)0x080663AC }, + { 0x33D1, 0, (void*)0x08066464 }, { 0x33D2, 0, (void*)0x08066578 }, { 0x33D3, 0, (void*)0x080665F4 }, + { 0x33D4, 0, (void*)0x0806665C }, { 0x33D5, 0, (void*)0x080666D0 }, { 0x33D6, 0, (void*)0x08066708 }, + { 0x33D7, 0, (void*)0x08066788 }, { 0x33D8, 0, (void*)0x080667D4 }, { 0x33D9, 0, (void*)0x08066834 }, + { 0x33F4, 0, (void*)0x080668FC }, { 0x33F5, 0, (void*)0x08066934 }, { 0x33F6, 0, (void*)0x080669DC }, + { 0x33F7, 0, (void*)0x08066A3C }, { 0x33F9, 0, (void*)0x08066B00 }, { 0x3458, 0, (void*)0x08066B40 }, + { 0x3459, 0, (void*)0x08066B60 }, { 0x345A, 0, (void*)0x08066BC0 }, { 0x345B, 0, (void*)0x08066C10 }, + { 0x345C, 0, (void*)0x08066C7C }, { 0x345D, 0, (void*)0x08066CB8 }, { 0x345E, 0, (void*)0x08066D20 }, + { 0x345F, 0, (void*)0x08066D90 }, { 0x3460, 0, (void*)0x08066E58 }, { 0x3461, 0, (void*)0x08066E9C }, + { 0x3462, 0, (void*)0x08066EE8 }, { 0x3463, 0, (void*)0x08066F38 }, { 0x3464, 0, (void*)0x08066F64 }, + { 0x3465, 0, (void*)0x08066FF8 }, { 0x3466, 0, (void*)0x080670A4 }, { 0x3467, 0, (void*)0x080670F0 }, + { 0x3468, 0, (void*)0x08067144 }, { 0x3469, 0, (void*)0x08067174 }, { 0x346A, 0, (void*)0x080671E8 }, + { 0x346B, 0, (void*)0x08067208 }, { 0x346C, 0, (void*)0x08067224 }, { 0x346D, 0, (void*)0x0806728C }, + { 0x346E, 0, (void*)0x0806731C }, { 0x346F, 0, (void*)0x0806739C }, { 0x3470, 0, (void*)0x08067400 }, + { 0x3471, 0, (void*)0x0806743C }, { 0x3472, 0, (void*)0x0806746C }, { 0x3473, 0, (void*)0x080674B0 }, + { 0x3474, 0, (void*)0x08067520 }, { 0x3475, 0, (void*)0x08067594 }, { 0x3476, 0, (void*)0x080675B8 }, + { 0x3477, 0, (void*)0x080675E0 }, { 0x3478, 0, (void*)0x08067618 }, { 0x3479, 0, (void*)0x08067648 }, + { 0x347A, 0, (void*)0x08067688 }, { 0x347B, 0, (void*)0x080676B0 }, { 0x347C, 0, (void*)0x080676F0 }, + { 0x347D, 0, (void*)0x08067760 }, { 0x347E, 0, (void*)0x080677A4 }, { 0x347F, 0, (void*)0x080677F4 }, + { 0x3480, 0, (void*)0x0806782C }, { 0x3481, 0, (void*)0x080678A0 }, { 0x3482, 0, (void*)0x080678C8 }, + { 0x3483, 0, (void*)0x080678F8 }, { 0x3484, 0, (void*)0x08067934 }, { 0x3485, 0, (void*)0x08067990 }, + { 0x3486, 0, (void*)0x080679E0 }, { 0x3487, 0, (void*)0x08067A18 }, { 0x3488, 0, (void*)0x08067A68 }, + { 0x3489, 0, (void*)0x08067AE8 }, { 0x348A, 0, (void*)0x08067B54 }, { 0x348B, 0, (void*)0x08067BBC }, + { 0x348C, 0, (void*)0x08067C0C }, { 0x348D, 0, (void*)0x08067C5C }, { 0x348E, 0, (void*)0x08067CB8 }, + { 0x348F, 0, (void*)0x08067D6C }, { 0x3490, 0, (void*)0x08067DE0 }, { 0x3491, 0, (void*)0x08067E2C }, + { 0x3492, 0, (void*)0x08067E80 }, { 0x3493, 0, (void*)0x08067EDC }, { 0x3494, 0, (void*)0x08067F20 }, + { 0x3495, 0, (void*)0x08067F44 }, { 0x3496, 0, (void*)0x08067F64 }, { 0x3497, 0, (void*)0x08067FEC }, + { 0x3498, 0, (void*)0x0806803C }, { 0x3499, 0, (void*)0x08068094 }, { 0x349A, 0, (void*)0x080680C8 }, + { 0x349B, 0, (void*)0x080680FC }, { 0x349C, 0, (void*)0x0806812C }, { 0x349D, 0, (void*)0x08068158 }, + { 0x349E, 0, (void*)0x08068180 }, { 0x349F, 0, (void*)0x080681C0 }, { 0x34A0, 0, (void*)0x08068224 }, + { 0x34A1, 0, (void*)0x08068278 }, { 0x34A2, 0, (void*)0x080682C0 }, { 0x34A3, 0, (void*)0x0806830C }, + { 0x34A4, 0, (void*)0x08068394 }, { 0x34A5, 0, (void*)0x080683F4 }, { 0x34A6, 0, (void*)0x08068430 }, + { 0x34A7, 0, (void*)0x08068498 }, { 0x34A8, 0, (void*)0x080684FC }, { 0x34A9, 0, (void*)0x08068544 }, + { 0x34AA, 0, (void*)0x08068564 }, { 0x34AB, 0, (void*)0x08068598 }, { 0x34AC, 0, (void*)0x0806860C }, + { 0x34AD, 0, (void*)0x08068640 }, { 0x34AE, 0, (void*)0x080686F4 }, { 0x34AF, 0, (void*)0x08068768 }, + { 0x34B0, 0, (void*)0x08068780 }, { 0x34B1, 0, (void*)0x080687E0 }, { 0x34B2, 0, (void*)0x080687F8 }, + { 0x34B3, 0, (void*)0x08068860 }, { 0x3520, 0, (void*)0x080688F4 }, { 0x3521, 0, (void*)0x08068958 }, + { 0x3522, 0, (void*)0x080689C8 }, { 0x3523, 0, (void*)0x08068A38 }, { 0x3524, 0, (void*)0x08068A88 }, + { 0x3525, 0, (void*)0x08068B04 }, { 0x3526, 0, (void*)0x08068B30 }, { 0x3527, 0, (void*)0x08068B7C }, + { 0x3528, 0, (void*)0x08068CA0 }, { 0x3529, 0, (void*)0x08068CF4 }, { 0x352A, 0, (void*)0x08068D1C }, + { 0x352B, 0, (void*)0x08068DB0 }, { 0x352C, 0, (void*)0x08068E28 }, { 0x352D, 0, (void*)0x08068E78 }, + { 0x352E, 0, (void*)0x08068F14 }, { 0x352F, 0, (void*)0x08068F78 }, { 0x3530, 0, (void*)0x08068FA0 }, + { 0x3531, 0, (void*)0x08069020 }, { 0x3532, 0, (void*)0x080690CC }, { 0x3533, 0, (void*)0x0806913C }, + { 0x3534, 0, (void*)0x080691B0 }, { 0x3535, 0, (void*)0x08069224 }, { 0x3536, 0, (void*)0x0806923C }, + { 0x3537, 0, (void*)0x08069284 }, { 0x3538, 0, (void*)0x080692D8 }, { 0x3539, 0, (void*)0x08069314 }, + { 0x353A, 0, (void*)0x08069358 }, { 0x353B, 0, (void*)0x08069390 }, { 0x353C, 0, (void*)0x080693E4 }, + { 0x353D, 0, (void*)0x08069434 }, { 0x353E, 0, (void*)0x08069490 }, { 0x353F, 0, (void*)0x080694C4 }, + { 0x3540, 0, (void*)0x08069524 }, { 0x3541, 0, (void*)0x0806957C }, { 0x3542, 0, (void*)0x080695C0 }, + { 0x3543, 0, (void*)0x08069608 }, { 0x3544, 0, (void*)0x08069668 }, { 0x3545, 0, (void*)0x080696DC }, + { 0x3546, 0, (void*)0x08069734 }, { 0x3548, 0, (void*)0x08069774 }, { 0x3549, 0, (void*)0x08069814 }, + { 0x354A, 0, (void*)0x080698A0 }, { 0x354B, 0, (void*)0x08069930 }, { 0x354C, 0, (void*)0x08069998 }, + { 0xFFFC, 0, (void*)0x080699C8 }, { 0xFFFD, 0, (void*)0x080699D4 }, { 0xFFFF, 0, NULL }, }; MessageTableEntry D_801CFB08[46] = { - { 0x4E20, 0xB0, 0x07000000 }, { 0x4E21, 0xB0, 0x0700003C }, { 0x4E22, 0xB0, 0x07000094 }, - { 0x4E23, 0xB0, 0x070000F0 }, { 0x4E24, 0xB0, 0x07000140 }, { 0x4E25, 0xB0, 0x0700019C }, - { 0x4E26, 0xB0, 0x070001D8 }, { 0x4E27, 0xB0, 0x07000248 }, { 0x4E28, 0xB0, 0x0700027C }, - { 0x4E29, 0xB0, 0x070002E0 }, { 0x4E2A, 0xB0, 0x0700033C }, { 0x4E2B, 0xB0, 0x07000384 }, - { 0x4E2C, 0xB0, 0x070003C8 }, { 0x4E2D, 0xB0, 0x0700040C }, { 0x4E2E, 0xB0, 0x07000450 }, - { 0x4E2F, 0xB0, 0x070004A8 }, { 0x4E30, 0xB0, 0x07000504 }, { 0x4E31, 0xB0, 0x07000564 }, - { 0x4E32, 0xB0, 0x070005CC }, { 0x4E33, 0xB0, 0x07000610 }, { 0x4E34, 0xB0, 0x07000654 }, - { 0x4E35, 0xB0, 0x07000698 }, { 0x4E36, 0xB0, 0x070006F8 }, { 0x4E37, 0xB0, 0x07000750 }, - { 0x4E38, 0xB0, 0x07000798 }, { 0x4E39, 0xB0, 0x0700081C }, { 0x4E3A, 0xB0, 0x07000888 }, - { 0x4E3B, 0xB0, 0x07000924 }, { 0x4E3C, 0xB0, 0x070009B4 }, { 0x4E3D, 0xB0, 0x070009E8 }, - { 0x4E3E, 0xB0, 0x07000A78 }, { 0x4E3F, 0xB0, 0x07000AB0 }, { 0x4E40, 0xB0, 0x07000B2C }, - { 0x4E41, 0xB0, 0x07000B54 }, { 0x4E42, 0xB0, 0x07000B7C }, { 0x4E43, 0xB0, 0x07000BA4 }, - { 0x4E44, 0xB0, 0x07000BCC }, { 0x4E45, 0xB0, 0x07000BF4 }, { 0x4E46, 0xB0, 0x07000C1C }, - { 0x4E47, 0xB0, 0x07000C44 }, { 0x4E48, 0xB0, 0x07000C6C }, { 0x4E49, 0xB0, 0x07000CEC }, - { 0x4E4A, 0xB0, 0x07000D5C }, { 0x4E4B, 0xB0, 0x07000DC8 }, { 0x4E4C, 0xB0, 0x07000E54 }, - { 0xFFFF, 0, NULL }, + { 0x4E20, 0xB0, (void*)0x07000000 }, { 0x4E21, 0xB0, (void*)0x0700003C }, + { 0x4E22, 0xB0, (void*)0x07000094 }, { 0x4E23, 0xB0, (void*)0x070000F0 }, + { 0x4E24, 0xB0, (void*)0x07000140 }, { 0x4E25, 0xB0, (void*)0x0700019C }, + { 0x4E26, 0xB0, (void*)0x070001D8 }, { 0x4E27, 0xB0, (void*)0x07000248 }, + { 0x4E28, 0xB0, (void*)0x0700027C }, { 0x4E29, 0xB0, (void*)0x070002E0 }, + { 0x4E2A, 0xB0, (void*)0x0700033C }, { 0x4E2B, 0xB0, (void*)0x07000384 }, + { 0x4E2C, 0xB0, (void*)0x070003C8 }, { 0x4E2D, 0xB0, (void*)0x0700040C }, + { 0x4E2E, 0xB0, (void*)0x07000450 }, { 0x4E2F, 0xB0, (void*)0x070004A8 }, + { 0x4E30, 0xB0, (void*)0x07000504 }, { 0x4E31, 0xB0, (void*)0x07000564 }, + { 0x4E32, 0xB0, (void*)0x070005CC }, { 0x4E33, 0xB0, (void*)0x07000610 }, + { 0x4E34, 0xB0, (void*)0x07000654 }, { 0x4E35, 0xB0, (void*)0x07000698 }, + { 0x4E36, 0xB0, (void*)0x070006F8 }, { 0x4E37, 0xB0, (void*)0x07000750 }, + { 0x4E38, 0xB0, (void*)0x07000798 }, { 0x4E39, 0xB0, (void*)0x0700081C }, + { 0x4E3A, 0xB0, (void*)0x07000888 }, { 0x4E3B, 0xB0, (void*)0x07000924 }, + { 0x4E3C, 0xB0, (void*)0x070009B4 }, { 0x4E3D, 0xB0, (void*)0x070009E8 }, + { 0x4E3E, 0xB0, (void*)0x07000A78 }, { 0x4E3F, 0xB0, (void*)0x07000AB0 }, + { 0x4E40, 0xB0, (void*)0x07000B2C }, { 0x4E41, 0xB0, (void*)0x07000B54 }, + { 0x4E42, 0xB0, (void*)0x07000B7C }, { 0x4E43, 0xB0, (void*)0x07000BA4 }, + { 0x4E44, 0xB0, (void*)0x07000BCC }, { 0x4E45, 0xB0, (void*)0x07000BF4 }, + { 0x4E46, 0xB0, (void*)0x07000C1C }, { 0x4E47, 0xB0, (void*)0x07000C44 }, + { 0x4E48, 0xB0, (void*)0x07000C6C }, { 0x4E49, 0xB0, (void*)0x07000CEC }, + { 0x4E4A, 0xB0, (void*)0x07000D5C }, { 0x4E4B, 0xB0, (void*)0x07000DC8 }, + { 0x4E4C, 0xB0, (void*)0x07000E54 }, { 0xFFFF, 0, NULL }, }; diff --git a/src/code/z_overlay.c b/src/code/z_overlay.c index 2e348c336..fe0857820 100644 --- a/src/code/z_overlay.c +++ b/src/code/z_overlay.c @@ -19,7 +19,7 @@ void* TransitionOverlay_VramToRam(TransitionOverlay* overlayEntry, void* vramAdd void* loadedRamAddr = Lib_PhysicalToVirtual(overlayEntry->loadInfo.addr); if ((loadedRamAddr != NULL) && (vramAddr >= overlayEntry->vramStart) && (vramAddr < overlayEntry->vramEnd)) { - return ((uintptr_t)loadedRamAddr - (uintptr_t)overlayEntry->vramStart) + (uintptr_t)vramAddr; + return (void*)(((uintptr_t)loadedRamAddr - (uintptr_t)overlayEntry->vramStart) + (uintptr_t)vramAddr); } return vramAddr; } diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index cbfcd0481..898de0b41 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -916,8 +916,8 @@ void Interface_NewDay(PlayState* play, s32 day) { } // Loads day number from week_static for the three-day clock - DmaMgr_SendRequest0((u32)play->interfaceCtx.doActionSegment + 0x780, - (u32)SEGMENT_ROM_START(week_static) + i * 0x510, 0x510); + DmaMgr_SendRequest0((void*)(play->interfaceCtx.doActionSegment + 0x780), + SEGMENT_ROM_START_OFFSET(week_static, i * 0x510), 0x510); // i is used to store sceneId for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.permanentSceneFlags); i++) { @@ -7121,7 +7121,8 @@ void Interface_Init(PlayState* play) { interfaceCtx->doActionSegment = THA_AllocTailAlign16(&play->state.tha, 0xC90); DmaMgr_SendRequest0(interfaceCtx->doActionSegment, SEGMENT_ROM_START(do_action_static), 0x300); - DmaMgr_SendRequest0(interfaceCtx->doActionSegment + 0x300, SEGMENT_ROM_START(do_action_static) + 0x480, 0x180); + DmaMgr_SendRequest0(interfaceCtx->doActionSegment + 0x300, SEGMENT_ROM_START_OFFSET(do_action_static, 0x480), + 0x180); Interface_NewDay(play, CURRENT_DAY); diff --git a/src/code/z_play.c b/src/code/z_play.c index bec7f5f44..0f506c5fe 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -2329,7 +2329,10 @@ void Play_Init(GameState* thisx) { THA_GetRemaining(&this->state.tha); zAllocSize = THA_GetRemaining(&this->state.tha); zAlloc = (uintptr_t)THA_AllocTailAlign16(&this->state.tha, zAllocSize); - ZeldaArena_Init(((zAlloc + 8) & ~0xF), (zAllocSize - ((zAlloc + 8) & ~0xF)) + zAlloc); //! @bug: Incorrect ALIGN16s + + //! @bug: Incorrect ALIGN16s + ZeldaArena_Init((void*)((zAlloc + 8) & ~0xF), (zAllocSize - ((zAlloc + 8) & ~0xF)) + zAlloc); + Actor_InitContext(this, &this->actorCtx, this->linkActorEntry); while (!Room_HandleLoadCallbacks(this, &this->roomCtx)) {} diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index 3d7010c0d..749096a06 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -1037,7 +1037,7 @@ Gfx* sPlayerFirstPersonRightShoulderDLs[PLAYER_FORM_MAX] = { Gfx* sPlayerFirstPersonRightHandDLs[PLAYER_FORM_MAX] = { gLinkFierceDeityRightHandDL, //! @bug This is in the middle of a texture in the link_goron object. It has the same offset as a link_nuts dlist - 0x060038C0, + (Gfx*)0x060038C0, gLinkZoraRightHandOpenDL, gLinkDekuRightHandDL, object_link_child_DL_018490, @@ -1046,7 +1046,7 @@ Gfx* sPlayerFirstPersonRightHandDLs[PLAYER_FORM_MAX] = { Gfx* sPlayerFirstPersonRightHandHookshotDLs[PLAYER_FORM_MAX] = { gLinkFierceDeityRightHandDL, //! @bug This is in the middle of a texture in the link_goron object. It has the same offset as a link_nuts dlist - 0x060038C0, + (Gfx*)0x060038C0, gLinkZoraRightHandOpenDL, gLinkDekuRightHandDL, object_link_child_DL_017B40, diff --git a/src/code/z_rcp.c b/src/code/z_rcp.c index 0830fa572..b30e22440 100644 --- a/src/code/z_rcp.c +++ b/src/code/z_rcp.c @@ -1449,8 +1449,8 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g s32 i; gSegments[0x00] = 0; - gSegments[0x0F] = gfxCtx->curFrameBuffer; - gSegments[0x0E] = gGfxMasterDL; + gSegments[0x0F] = (uintptr_t)gfxCtx->curFrameBuffer; + gSegments[0x0E] = (uintptr_t)gGfxMasterDL; zbuffer = gfxCtx->zbuffer; diff --git a/src/code/z_scene.c b/src/code/z_scene.c index 326e010ea..66edf4b38 100644 --- a/src/code/z_scene.c +++ b/src/code/z_scene.c @@ -26,7 +26,7 @@ s32 Object_SpawnPersistent(ObjectContext* objectCtx, s16 id) { if (objectCtx->numEntries < ARRAY_COUNT(objectCtx->slots) - 1) { objectCtx->slots[objectCtx->numEntries + 1].segment = - ALIGN16((u32)objectCtx->slots[objectCtx->numEntries].segment + size); + (void*)ALIGN16((uintptr_t)objectCtx->slots[objectCtx->numEntries].segment + size); } objectCtx->numEntries++; diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index 675487072..bb900b994 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1007,11 +1007,11 @@ void AnimationContext_SetLoadFrame(PlayState* play, PlayerAnimationHeader* anima if (entry != NULL) { PlayerAnimationHeader* playerAnimHeader = Lib_SegmentedToVirtual(animation); - void* ram = (void*)frameTable; + s32 pad; osCreateMesgQueue(&entry->data.load.msgQueue, entry->data.load.msg, ARRAY_COUNT(entry->data.load.msg)); DmaMgr_SendRequestImpl( - &entry->data.load.req, ram, + &entry->data.load.req, frameTable, LINK_ANIMETION_OFFSET(playerAnimHeader->linkAnimSegment, (sizeof(Vec3s) * limbCount + sizeof(s16)) * frame), sizeof(Vec3s) * limbCount + sizeof(s16), 0, &entry->data.load.msgQueue, NULL); } diff --git a/src/libultra/io/sptask.c b/src/libultra/io/sptask.c index b261664f0..511461faf 100644 --- a/src/libultra/io/sptask.c +++ b/src/libultra/io/sptask.c @@ -33,7 +33,7 @@ void osSpTaskLoad(OSTask* intp) { intp->t.flags &= ~OS_TASK_YIELDED; if (tp->t.flags & OS_TASK_LOADABLE) { - tp->t.ucode = IO_READ((uintptr_t)intp->t.yieldDataPtr + OS_YIELD_DATA_SIZE - 4); + tp->t.ucode = (void*)IO_READ((uintptr_t)intp->t.yieldDataPtr + OS_YIELD_DATA_SIZE - 4); } } diff --git a/src/libultra/os/createthread.c b/src/libultra/os/createthread.c index d0f3a7419..eaddc0884 100644 --- a/src/libultra/os/createthread.c +++ b/src/libultra/os/createthread.c @@ -9,9 +9,9 @@ void osCreateThread(OSThread* thread, OSId id, void* entry, void* arg, void* sp, thread->next = NULL; thread->queue = NULL; thread->context.pc = (u32)entry; - thread->context.a0 = arg; + thread->context.a0 = (intptr_t)arg; thread->context.sp = (u64)(s32)sp - 16; - thread->context.ra = __osCleanupThread; + thread->context.ra = (intptr_t)__osCleanupThread; mask = OS_IM_ALL; thread->context.sr = (mask & (SR_IMASK | SR_IE)) | SR_EXL; diff --git a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h index 3aa83d154..90f49b84d 100644 --- a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h +++ b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.h @@ -14,7 +14,7 @@ typedef struct EnDnh { /* 0x144 */ EnDnhActionFunc actionFunc; /* 0x148 */ SkelAnime skelAnime; /* 0x18C */ u16 unk18C; - /* 0x190 */ s32 msgEventScript; + /* 0x190 */ s32* msgEventScript; /* 0x194 */ s32 unk194; /* 0x198 */ s16 unk198; /* 0x19A */ UNK_TYPE1 pad19A[0x2]; diff --git a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c index 5e36b20f9..aceda34c4 100644 --- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c +++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.c @@ -1112,15 +1112,15 @@ void func_80B2ADB0(EnFish2* this, Vec3f* vec, s16 arg2) { for (i = 0; i < ARRAY_COUNT(this->unk_3F8); i++, ptr++) { if (!ptr->unk_00) { - TexturePtr phi_v0; + TexturePtr texture; if (Rand_ZeroOne() < 0.5f) { - phi_v0 = gEffBubble2Tex; + texture = gEffBubble2Tex; } else { - phi_v0 = gEffBubble1Tex; + texture = gEffBubble1Tex; } - ptr->unk_20 = OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(phi_v0)); + ptr->unk_20 = (TexturePtr)OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(texture)); ptr->unk_00 = true; ptr->unk_04 = *vec; ptr->unk_04.x += Rand_CenteredFloat(ptr->unk_00 + (this->unk_330 * 4000.0f)); diff --git a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h index a324e0bab..16485d8b5 100644 --- a/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h +++ b/src/overlays/actors/ovl_En_Fish2/z_en_fish2.h @@ -15,7 +15,7 @@ typedef struct { /* 0x14 */ f32 unk_14; /* 0x18 */ f32 unk_18; /* 0x1C */ s16 unk_1C; - /* 0x20 */ void* unk_20; + /* 0x20 */ TexturePtr unk_20; } EnFish2UnkStruct; // size = 0x24 typedef struct EnFish2 { diff --git a/src/overlays/actors/ovl_En_Go/z_en_go.c b/src/overlays/actors/ovl_En_Go/z_en_go.c index ea2476902..513070a92 100644 --- a/src/overlays/actors/ovl_En_Go/z_en_go.c +++ b/src/overlays/actors/ovl_En_Go/z_en_go.c @@ -2318,7 +2318,7 @@ void EnGo_Snowball(EnGo* this, PlayState* play) { * Return the MsgEvent script appropriate for the actor. */ s32* EnGo_GetMsgEventScript(EnGo* this, PlayState* play) { - static s32 sMsgScriptGraveyard[] = { + static s32* sMsgScriptGraveyard[] = { sMsgScriptGoronGravemaker, sMsgScriptGoronFrozen, }; diff --git a/src/overlays/actors/ovl_En_Ja/z_en_ja.c b/src/overlays/actors/ovl_En_Ja/z_en_ja.c index dbe0b20fe..0668b00b4 100644 --- a/src/overlays/actors/ovl_En_Ja/z_en_ja.c +++ b/src/overlays/actors/ovl_En_Ja/z_en_ja.c @@ -155,7 +155,7 @@ void func_80BC1A68(EnJa* this) { } } -s32 func_80BC1AE0(EnJa* this, PlayState* play) { +Actor* func_80BC1AE0(EnJa* this, PlayState* play) { Actor* ja = SubS_FindNearestActor(&this->actor, play, ACTORCAT_NPC, ACTOR_EN_JA); Vec3f sp30; Vec3f sp24; @@ -256,7 +256,7 @@ void func_80BC1E40(EnJa* this, PlayState* play) { s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) { s32 ret = false; - if (func_80BC1AE0(this, play)) { + if (func_80BC1AE0(this, play) != NULL) { SubS_SetOfferMode(&this->unk_340, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); this->unk_340 |= 0x10; EnJa_ChangeAnim(this, ENJA_ANIM_5); @@ -269,7 +269,7 @@ s32 func_80BC1FC8(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) { s32 func_80BC203C(EnJa* this, PlayState* play, ScheduleOutput* scheduleOutput) { s32 ret = false; - if (func_80BC1AE0(this, play)) { + if (func_80BC1AE0(this, play) != NULL) { if (ENJA_GET_3(&this->actor) == 0) { EnJa_ChangeAnim(this, ENJA_ANIM_1); } else { diff --git a/src/overlays/actors/ovl_En_Mag/z_en_mag.c b/src/overlays/actors/ovl_En_Mag/z_en_mag.c index 4b94b1994..f048aec74 100644 --- a/src/overlays/actors/ovl_En_Mag/z_en_mag.c +++ b/src/overlays/actors/ovl_En_Mag/z_en_mag.c @@ -556,7 +556,7 @@ void EnMag_DrawImageRGBA32(Gfx** gfxp, s16 centerX, s16 centerY, TexturePtr sour Gfx_SetupDL56_Ptr(&gfx); - curTexture = source; + curTexture = (uintptr_t)source; rectLeft = centerX - (width / 2); rectTop = centerY - (height / 2); textureHeight = TMEM_SIZE / (width << 2); diff --git a/src/overlays/actors/ovl_En_Rz/z_en_rz.c b/src/overlays/actors/ovl_En_Rz/z_en_rz.c index 537c3f527..ebd8523ad 100644 --- a/src/overlays/actors/ovl_En_Rz/z_en_rz.c +++ b/src/overlays/actors/ovl_En_Rz/z_en_rz.c @@ -101,9 +101,10 @@ void EnRz_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.01f); ActorShape_Init(&this->actor.shape, 0.0f, EnRz_ActorShadowFunc, 20.0f); - // @bug this alignment is because of player animations, but should be using ALIGN16 + //! @bug this alignment is because of player animations, but should be using ALIGN16 SkelAnime_InitFlex(play, &this->skelAnime, &object_rz_Skel_00D8D8, &gRosaSistersStandingAnim, - (uintptr_t)this->jointTable & ~0xF, (uintptr_t)this->morphTable & ~0xF, OBJECT_RZ_LIMB_MAX); + (void*)((uintptr_t)this->jointTable & ~0xF), (void*)((uintptr_t)this->morphTable & ~0xF), + OBJECT_RZ_LIMB_MAX); Animation_PlayLoop(&this->skelAnime, &gRosaSistersStandingAnim); Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); diff --git a/src/overlays/actors/ovl_En_Yb/z_en_yb.c b/src/overlays/actors/ovl_En_Yb/z_en_yb.c index 02f9dbb3d..950fd5ee3 100644 --- a/src/overlays/actors/ovl_En_Yb/z_en_yb.c +++ b/src/overlays/actors/ovl_En_Yb/z_en_yb.c @@ -87,9 +87,10 @@ void EnYb_Init(Actor* thisx, PlayState* play) { Actor_SetScale(&this->actor, 0.01f); ActorShape_Init(&this->actor.shape, 0.0f, EnYb_ActorShadowFunc, 20.0f); - // @bug this alignment is because of player animations, but should be using ALIGN16 - SkelAnime_InitFlex(play, &this->skelAnime, &gYbSkel, &object_yb_Anim_000200, (uintptr_t)this->jointTable & ~0xF, - (uintptr_t)this->morphTable & ~0xF, YB_LIMB_MAX); + //! @bug this alignment is because of player animations, but should be using ALIGN16 + SkelAnime_InitFlex(play, &this->skelAnime, &gYbSkel, &object_yb_Anim_000200, + (void*)((uintptr_t)this->jointTable & ~0xF), (void*)((uintptr_t)this->morphTable & ~0xF), + YB_LIMB_MAX); Animation_PlayLoop(&this->skelAnime, &object_yb_Anim_000200); diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index b74580dc2..75923376a 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -16715,9 +16715,9 @@ void func_80851F18(PlayState* play, Player* this) { temp_v0 = &this->unk_B10[this->unk_B86[i]]; AnimationContext_SetLoadFrame(play, temp->unk_4, *temp_v0, this->skelAnime.limbCount, - ALIGN16((uintptr_t)this->blendTableBuffer)); + (void*)ALIGN16((uintptr_t)this->blendTableBuffer)); AnimationContext_SetCopyTrue(play, this->skelAnime.limbCount, this->skelAnime.jointTable, - ALIGN16((uintptr_t)this->blendTableBuffer), D_8085BA20); + (void*)ALIGN16((uintptr_t)this->blendTableBuffer), D_8085BA20); } temp_v0 = this->unk_B10; diff --git a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c index 38ef2b709..90c142829 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c +++ b/src/overlays/effects/ovl_Effect_Ss_Bubble/z_eff_ss_bubble.c @@ -34,7 +34,7 @@ u32 EffectSsBubble_Init(PlayState* play, u32 index, EffectSs* this, void* initPa { TexturePtr tex = (Rand_ZeroOne() < 0.5f) ? gEffBubble1Tex : gEffBubble2Tex; - this->gfx = OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(tex)); + this->gfx = (void*)OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(tex)); } this->pos.x = ((Rand_ZeroOne() - 0.5f) * initParams->xzPosRandScale) + initParams->pos.x; diff --git a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c index 094f8bbf9..60743c687 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c +++ b/src/overlays/effects/ovl_Effect_Ss_Dt_Bubble/z_eff_ss_dt_bubble.c @@ -50,7 +50,7 @@ u32 EffectSsDtBubble_Init(PlayState* play, u32 index, EffectSs* this, void* init { TexturePtr tex = (Rand_ZeroOne() < 0.5f) ? gEffBubble1Tex : gEffBubble2Tex; - this->gfx = OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(tex)); + this->gfx = (void*)OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(tex)); } Math_Vec3f_Copy(&this->pos, &initParams->pos); diff --git a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c index 9c6a4c341..9434dbd41 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c +++ b/src/overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.c @@ -34,8 +34,8 @@ u32 EffectSsExtra_Init(PlayState* play, u32 index, EffectSs* this, void* initPar s32 objectSlot; objectSlot = Object_GetSlot(&play->objectCtx, OBJECT_YABUSAME_POINT); - if ((objectSlot > OBJECT_SLOT_NONE) && (Object_IsLoaded(&play->objectCtx, objectSlot))) { - void* segBackup = gSegments[6]; + if ((objectSlot > OBJECT_SLOT_NONE) && Object_IsLoaded(&play->objectCtx, objectSlot)) { + uintptr_t segBackup = gSegments[6]; gSegments[6] = OS_K0_TO_PHYSICAL(play->objectCtx.slots[objectSlot].segment); diff --git a/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c b/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c index 93d221e09..011e96104 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c +++ b/src/overlays/effects/ovl_Effect_Ss_Sibuki/z_eff_ss_sibuki.c @@ -40,7 +40,7 @@ u32 EffectSsSibuki_Init(PlayState* play, u32 index, EffectSs* this, void* initPa { TexturePtr tex = (KREG(2) != 0) ? gEffBubble2Tex : gEffBubble1Tex; - this->gfx = OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(tex)); + this->gfx = (void*)OS_K0_TO_PHYSICAL(SEGMENTED_TO_K0(tex)); } this->life = ((s32)((Rand_ZeroOne() * (500.0f + KREG(64))) * 0.01f)) + KREG(65) + 10; diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c index 0782309ca..d3034bab1 100644 --- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c +++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c @@ -7,6 +7,7 @@ #include "z_kaleido_scope.h" #include "z64view.h" #include "overlays/gamestates/ovl_opening/z_opening.h" + #include "archives/icon_item_static/icon_item_static_yar.h" #include "interface/icon_item_gameover_static/icon_item_gameover_static.h" #include "interface/icon_item_jpn_static/icon_item_jpn_static.h" @@ -2858,7 +2859,7 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->iconItemSegment = (void*)ALIGN16((uintptr_t)play->objectCtx.spaceStart); size0 = SEGMENT_ROM_SIZE(icon_item_static_syms); - CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_static_yar), pauseCtx->iconItemSegment, size0); + CmpDma_LoadAllFiles(SEGMENT_ROM_START(icon_item_static_yar), pauseCtx->iconItemSegment, size0); gSegments[0x08] = OS_K0_TO_PHYSICAL(pauseCtx->iconItemSegment); @@ -2870,8 +2871,7 @@ void KaleidoScope_Update(PlayState* play) { pauseCtx->iconItem24Segment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemSegment + size0); size1 = SEGMENT_ROM_SIZE(icon_item_24_static_syms); - CmpDma_LoadAllFiles((uintptr_t)SEGMENT_ROM_START(icon_item_24_static_yar), pauseCtx->iconItem24Segment, - size1); + CmpDma_LoadAllFiles(SEGMENT_ROM_START(icon_item_24_static_yar), pauseCtx->iconItem24Segment, size1); pauseCtx->iconItemAltSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItem24Segment + size1); if (func_8010A0A4(play)) { @@ -2886,7 +2886,7 @@ void KaleidoScope_Update(PlayState* play) { sInDungeonScene = false; size = SEGMENT_ROM_SIZE(icon_item_field_static); - DmaMgr_SendRequest0(pauseCtx->iconItemAltSegment, _icon_item_field_staticSegmentRomStart, size); + DmaMgr_SendRequest0(pauseCtx->iconItemAltSegment, SEGMENT_ROM_START(icon_item_field_static), size); iconItemLangSegment = (void*)ALIGN16((uintptr_t)pauseCtx->iconItemAltSegment + size); } From 10a14feb2c9a484597fce6e29df0ab5f7fa62848 Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo Nitti <96613413+sonicdcer@users.noreply.github.com> Date: Fri, 3 Nov 2023 08:45:35 -0300 Subject: [PATCH 03/28] ovl_Dm_Tsg: OK (#1458) * z_dm_tsg Matching * play2 prototype * * gSaveContext.save.entrance * cueChannel constant * THIS * i++ * remove actionFunc * bool * PR review * pr review * DMTSG_UNK_SIZE * i % 16U * review --- spec | 3 +- src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.c | 68 ++++++++++++++++++++--- src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.h | 11 +++- 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/spec b/spec index 0df798cee..0cf255dea 100644 --- a/spec +++ b/spec @@ -2577,8 +2577,7 @@ beginseg name "ovl_Dm_Tsg" compress include "build/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.o" - include "build/data/ovl_Dm_Tsg/ovl_Dm_Tsg.data.o" - include "build/data/ovl_Dm_Tsg/ovl_Dm_Tsg.reloc.o" + include "build/src/overlays/actors/ovl_Dm_Tsg/ovl_Dm_Tsg_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.c b/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.c index 6d7839896..ff64bdef2 100644 --- a/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.c +++ b/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.c @@ -5,6 +5,7 @@ */ #include "z_dm_tsg.h" +#include "objects/object_open_obj/object_open_obj.h" #define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20) @@ -13,9 +14,8 @@ void DmTsg_Init(Actor* thisx, PlayState* play); void DmTsg_Destroy(Actor* thisx, PlayState* play); void DmTsg_Update(Actor* thisx, PlayState* play); -void DmTsg_Draw(Actor* thisx, PlayState* play); +void DmTsg_Draw(Actor* thisx, PlayState* play2); -#if 0 ActorInit Dm_Tsg_InitVars = { /**/ ACTOR_DM_TSG, /**/ ACTORCAT_ITEMACTION, @@ -28,14 +28,66 @@ ActorInit Dm_Tsg_InitVars = { /**/ DmTsg_Draw, }; -#endif +void DmTsg_Init(Actor* thisx, PlayState* play) { + DmTsg* this = THIS; + s32 i; -extern UNK_TYPE D_06011458; + if (gSaveContext.save.entrance == ENTRANCE(OPENING_DUNGEON, 0)) { + Actor_SetScale(&this->actor, 0.1f); + for (i = 0; i < DMTSG_UNK_SIZE; i++) { + this->unk_78C[i] = Rand_ZeroOne() * 0xFFFF; + this->unk_856[i] = TRUNCF_BINANG(Rand_ZeroOne() * 200.0f) + 100; + } + } else { + Actor_Kill(&this->actor); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Tsg/DmTsg_Init.s") +void DmTsg_Destroy(Actor* thisx, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Tsg/DmTsg_Destroy.s") +void DmTsg_Update(Actor* thisx, PlayState* play) { + DmTsg* this = THIS; + s32 cueChannel; + s16 i; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Tsg/DmTsg_Update.s") + for (i = 0; i < DMTSG_UNK_SIZE; i++) { + this->unk_5F8[i] = (Math_SinS((i % 16U) * this->unk_854) * 60.0f) + 120.0f; + this->unk_148[i].x = Math_CosS(this->unk_78C[i]) * this->unk_5F8[i]; + this->unk_148[i].y = this->unk_788 + (i * 16); + this->unk_148[i].z = Math_SinS(this->unk_78C[i]) * this->unk_5F8[i]; + this->unk_78C[i] += this->unk_856[i]; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Tsg/DmTsg_Draw.s") + this->canDraw = false; + this->unk_854 += 40; + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_514)) { + cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_514); + if (play->csCtx.actorCues[cueChannel]->id != 1) { + this->canDraw = true; + } + Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); + } +} + +void DmTsg_Draw(Actor* thisx, PlayState* play2) { + PlayState* play = play2; + DmTsg* this = THIS; + s32 i; + u32 j; + + if (this->canDraw) { + for (i = 0, j = 0; i < DMTSG_UNK_SIZE; i++) { + Matrix_Translate(this->unk_148[i].x + this->actor.world.pos.x, this->unk_148[i].y + this->actor.world.pos.y, + this->unk_148[i].z + this->actor.world.pos.z, MTXMODE_NEW); + Matrix_Scale(0.3f, 0.3f, 0.3f, MTXMODE_APPLY); + AnimatedMat_DrawStep(play, Lib_SegmentedToVirtual(object_open_obj_Matanimheader_011458), j++); + Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY); + Gfx_DrawDListXlu(play, object_open_obj_DL_002D30); + if (j >= 10) { + j = 0; + } + } + } +} diff --git a/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.h b/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.h index e8e62b6c2..cfd8c0214 100644 --- a/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.h +++ b/src/overlays/actors/ovl_Dm_Tsg/z_dm_tsg.h @@ -5,9 +5,18 @@ struct DmTsg; +#define DMTSG_UNK_SIZE 100 + typedef struct DmTsg { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x7DC]; + /* 0x144 */ UNK_TYPE1 unk_144[0x4]; + /* 0x148 */ Vec3f unk_148[DMTSG_UNK_SIZE]; + /* 0x5F8 */ f32 unk_5F8[DMTSG_UNK_SIZE]; + /* 0x788 */ f32 unk_788; + /* 0x78C */ s16 unk_78C[DMTSG_UNK_SIZE]; + /* 0x854 */ s16 unk_854; + /* 0x856 */ s16 unk_856[DMTSG_UNK_SIZE]; + /* 0x91E */ u8 canDraw; } DmTsg; // size = 0x920 #endif // Z_DM_TSG_H From f8a5f11d6d53f5bb3982eef9a8fdebd491ec98ff Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Mon, 6 Nov 2023 10:34:53 +1100 Subject: [PATCH 04/28] Player Docs: public facing csAction things (#1459) * public cs * comments --- include/functions.h | 4 +- include/z64.h | 2 +- include/z64player.h | 3 +- src/code/z_actor.c | 29 +++++++-- src/code/z_eventmgr.c | 6 +- .../z_bg_ikana_rotaryroom.c | 2 +- .../actors/ovl_Bg_Ingate/z_bg_ingate.c | 14 ++-- src/overlays/actors/ovl_Boss_01/z_boss_01.c | 16 ++--- src/overlays/actors/ovl_Boss_02/z_boss_02.c | 8 +-- src/overlays/actors/ovl_Boss_03/z_boss_03.c | 14 ++-- src/overlays/actors/ovl_Boss_04/z_boss_04.c | 6 +- src/overlays/actors/ovl_Boss_06/z_boss_06.c | 6 +- src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c | 4 +- .../actors/ovl_Door_Shutter/z_door_shutter.c | 6 +- .../actors/ovl_Door_Warp1/z_door_warp1.c | 10 +-- .../actors/ovl_En_Aob_01/z_en_aob_01.c | 2 +- .../actors/ovl_En_Bigokuta/z_en_bigokuta.c | 4 +- src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c | 4 +- .../actors/ovl_En_Bigslime/z_en_bigslime.c | 10 +-- .../ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c | 6 +- src/overlays/actors/ovl_En_Box/z_en_box.c | 4 +- .../actors/ovl_En_Clear_Tag/z_en_clear_tag.c | 4 +- .../actors/ovl_En_Dinofos/z_en_dinofos.c | 4 +- src/overlays/actors/ovl_En_Dnh/z_en_dnh.c | 2 +- .../actors/ovl_En_Dragon/z_en_dragon.c | 2 +- .../actors/ovl_En_Fishing/z_en_fishing.c | 10 +-- src/overlays/actors/ovl_En_Gb2/z_en_gb2.c | 4 +- src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 4 +- src/overlays/actors/ovl_En_Ge3/z_en_ge3.c | 2 +- src/overlays/actors/ovl_En_Gs/z_en_gs.c | 2 +- src/overlays/actors/ovl_En_Hs/z_en_hs.c | 2 +- src/overlays/actors/ovl_En_Jso/z_en_jso.c | 6 +- .../actors/ovl_En_Kaizoku/z_en_kaizoku.c | 16 ++--- .../actors/ovl_En_Kakasi/z_en_kakasi.c | 16 ++--- .../actors/ovl_En_Look_Nuts/z_en_look_nuts.c | 2 +- .../actors/ovl_En_Ma_Yto/z_en_ma_yto.c | 2 +- src/overlays/actors/ovl_En_Mnk/z_en_mnk.c | 4 +- .../actors/ovl_En_Mt_tag/z_en_mt_tag.c | 8 +-- .../actors/ovl_En_Pametfrog/z_en_pametfrog.c | 4 +- .../actors/ovl_En_Sellnuts/z_en_sellnuts.c | 2 +- src/overlays/actors/ovl_En_Shn/z_en_shn.c | 2 +- .../actors/ovl_En_Takaraya/z_en_takaraya.c | 2 +- src/overlays/actors/ovl_En_Test3/z_en_test3.c | 18 +++--- src/overlays/actors/ovl_En_Test6/z_en_test6.c | 24 +++---- .../actors/ovl_En_Time_Tag/z_en_time_tag.c | 4 +- src/overlays/actors/ovl_En_Toto/z_en_toto.c | 14 ++-- .../actors/ovl_En_Wallmas/z_en_wallmas.c | 2 +- .../actors/ovl_En_Warp_tag/z_en_warp_tag.c | 6 +- src/overlays/actors/ovl_En_Zod/z_en_zod.c | 2 +- src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c | 4 +- src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c | 4 +- .../actors/ovl_Obj_Iceblock/z_obj_iceblock.c | 6 +- .../ovl_Obj_Makekinsuta/z_obj_makekinsuta.c | 2 +- .../ovl_Obj_Skateblock/z_obj_skateblock.c | 4 +- .../ovl_Obj_Spidertent/z_obj_spidertent.c | 2 +- .../actors/ovl_Obj_Wturn/z_obj_wturn.c | 4 +- .../actors/ovl_player_actor/z_player.c | 64 +++++++++++-------- tools/disasm/functions.txt | 10 +-- tools/namefixer.py | 2 + tools/sizes/code_functions.csv | 4 +- 60 files changed, 234 insertions(+), 202 deletions(-) diff --git a/include/functions.h b/include/functions.h index c6c3667d6..9d4e9617d 100644 --- a/include/functions.h +++ b/include/functions.h @@ -312,8 +312,8 @@ s32 func_800B7128(Player* player); s32 func_800B715C(PlayState* play); void Actor_SetCameraHorseSetting(PlayState* play, Player* player); void Actor_MountHorse(PlayState* play, Player* player, Actor* horse); -s32 func_800B724C(PlayState* play, Actor* actor, u8 csAction); -s32 func_800B7298(PlayState* play, Actor* actor, u8 csAction); +s32 Player_SetCsAction(PlayState* play, Actor* csActor, u8 csAction); +s32 Player_SetCsActionWithHaltedActors(PlayState* play, Actor* csActor, u8 csAction); void func_800B72F8(DynaPolyActor* dyna, f32 extraPushForce, s16 yRotation); s32 Player_IsFacingActor(Actor* actor, s16 maxAngleDiff, PlayState* play); diff --git a/include/z64.h b/include/z64.h index 072a1296a..28ae04de7 100644 --- a/include/z64.h +++ b/include/z64.h @@ -208,7 +208,7 @@ typedef struct PlayState { /* 0x18770 */ void (*unk_18770)(struct PlayState* play, Player* player); /* 0x18774 */ s32 (*startPlayerFishing)(struct PlayState* play); /* 0x18778 */ s32 (*grabPlayer)(struct PlayState* play, Player* player); - /* 0x1877C */ s32 (*startPlayerCutscene)(struct PlayState* play, Player* player, PlayerCsAction csAction); + /* 0x1877C */ s32 (*tryPlayerCsAction)(struct PlayState* play, Player* player, PlayerCsAction csAction); /* 0x18780 */ void (*func_18780)(Player* player, struct PlayState* play); /* 0x18784 */ s32 (*damagePlayer)(struct PlayState* play, s32 damage); /* 0x18788 */ void (*talkWithPlayer)(struct PlayState* play, Actor* actor); diff --git a/include/z64player.h b/include/z64player.h index fac153052..32b673fe4 100644 --- a/include/z64player.h +++ b/include/z64player.h @@ -607,6 +607,7 @@ typedef struct struct_80122744_arg1 { } struct_80122744_arg1; // size = 0x8 typedef enum PlayerCsAction { + /* -1 */ PLAYER_CSACTION_NEG1 = -1, // Specific to Kafei, any negative number works /* 0x00 */ PLAYER_CSACTION_NONE, /* 0x01 */ PLAYER_CSACTION_1, /* 0x02 */ PLAYER_CSACTION_2, @@ -1145,7 +1146,7 @@ typedef struct Player { /* 0x395 */ u8 prevCsAction; // PlayerCsAction enum /* 0x396 */ u8 cueId; // PlayerCueId enum /* 0x397 */ u8 unk_397; // PlayerDoorType enum - /* 0x398 */ Actor* csActor; + /* 0x398 */ Actor* csActor; // Actor involved in a `csAction`. Typically the actor that invoked the cutscene. /* 0x39C */ UNK_TYPE1 unk_39C[0x4]; /* 0x3A0 */ Vec3f unk_3A0; /* 0x3AC */ Vec3f unk_3AC; diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 3b68a0853..aacee620b 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -1402,7 +1402,17 @@ void Actor_SpawnHorse(PlayState* play, Player* player) { Horse_Spawn(play, player); } -s32 func_800B724C(PlayState* play, Actor* actor, u8 csAction) { +/** + * Sets a Player Cutscene Action specified by `csAction`. + * + * `haltActorsDuringCsAction` being set to false in this function means that all actors will + * be able to update while Player is performing the cutscene action. + * + * Note: due to how player implements initializing the cutscene action state, `haltActorsDuringCsAction` + * will only be considered the first time player starts a `csAction`. + * Player must leave the cutscene action state and enter it again before halting actors can be toggled. + */ +s32 Player_SetCsAction(PlayState* play, Actor* csActor, u8 csAction) { Player* player = GET_PLAYER(play); if ((player->csAction == PLAYER_CSACTION_5) || @@ -1411,15 +1421,26 @@ s32 func_800B724C(PlayState* play, Actor* actor, u8 csAction) { } player->csAction = csAction; - player->csActor = actor; + player->csActor = csActor; player->cv.haltActorsDuringCsAction = false; return true; } -s32 func_800B7298(PlayState* play, Actor* actor, u8 csAction) { +/** + * Sets a Player Cutscene Action specified by `csAction`. + * + * `haltActorsDuringCsAction` being set to true in this function means that eventually `PLAYER_STATE1_20000000` will be + * set. This makes it so actors belonging to categories `ACTORCAT_ENEMY` and `ACTORCAT_MISC` will not update while + * Player is performing the cutscene action. + * + * Note: due to how player implements initializing the cutscene action state, `haltActorsDuringCsAction` + * will only be considered the first time player starts a `csAction`. + * Player must leave the cutscene action state and enter it again before halting actors can be toggled. + */ +s32 Player_SetCsActionWithHaltedActors(PlayState* play, Actor* csActor, u8 csAction) { Player* player = GET_PLAYER(play); - if (func_800B724C(play, actor, csAction)) { + if (Player_SetCsAction(play, csActor, csAction)) { player->cv.haltActorsDuringCsAction = true; return true; } diff --git a/src/code/z_eventmgr.c b/src/code/z_eventmgr.c index 9f08806f9..d682ed4f4 100644 --- a/src/code/z_eventmgr.c +++ b/src/code/z_eventmgr.c @@ -213,7 +213,7 @@ void CutsceneManager_End(void) { sCutsceneMgr.targetActor->flags &= ~ACTOR_FLAG_100000; // fallthrough case CS_START_1: - func_800B7298(sCutsceneMgr.play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(sCutsceneMgr.play, NULL, PLAYER_CSACTION_END); sCutsceneMgr.startMethod = CS_START_0; break; @@ -344,7 +344,7 @@ s16 CutsceneManager_StartWithPlayerCs(s16 csId, Actor* actor) { s16 startCsId = CutsceneManager_Start(csId, actor); if (startCsId >= 0) { - func_800B7298(sCutsceneMgr.play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(sCutsceneMgr.play, NULL, PLAYER_CSACTION_WAIT); if (sCutsceneMgr.length == 0) { CutsceneManager_Stop(sCutsceneMgr.csId); } @@ -360,7 +360,7 @@ s16 CutsceneManager_StartWithPlayerCsAndSetFlag(s16 csId, Actor* actor) { s16 startCsId = CutsceneManager_Start(csId, actor); if (startCsId >= 0) { - func_800B7298(sCutsceneMgr.play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(sCutsceneMgr.play, NULL, PLAYER_CSACTION_WAIT); if (sCutsceneMgr.length == 0) { CutsceneManager_Stop(sCutsceneMgr.csId); } diff --git a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c index 8af51f000..ecc6a718c 100644 --- a/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c +++ b/src/overlays/actors/ovl_Bg_Ikana_Rotaryroom/z_bg_ikana_rotaryroom.c @@ -794,7 +794,7 @@ void func_80B819F0(Actor* thisx, PlayState* play) { if (CutsceneManager_IsNext(this->dyna.actor.csId)) { CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor); if (this->dyna.actor.csId >= 0) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); } func_80B81A64(this); } else { diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c index 736e11e36..5c7d40d2c 100644 --- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c +++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c @@ -126,7 +126,7 @@ s32 func_80953DA8(BgIngate* this, PlayState* play) { Camera* mainCam = Play_GetCamera(play, CAM_ID_MAIN); if (CHECK_EVENTINF(EVENTINF_35)) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); } else { SET_EVENTINF(EVENTINF_41); } @@ -149,7 +149,7 @@ void func_80953E38(PlayState* play) { void func_80953EA4(BgIngate* this, PlayState* play) { Player* player = GET_PLAYER(play); - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_58); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_58); player->unk_3A0.x = this->dyna.actor.world.pos.x; player->unk_3A0.z = this->dyna.actor.world.pos.z; this->unk160 &= ~0x4; @@ -192,7 +192,7 @@ void func_80953F9C(BgIngate* this, PlayState* play) { if (this->timePath->additionalPathIndex != ADDITIONAL_PATH_INDEX_NONE) { func_80953E38(play); - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); this->dyna.actor.textId = 0x9E4; Message_StartTextbox(play, this->dyna.actor.textId, NULL); this->unk16C += 1; @@ -231,7 +231,7 @@ void func_809541B8(BgIngate* this, PlayState* play) { if ((player->transformation == PLAYER_FORM_HUMAN) && (player->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && (this->dyna.actor.xzDistToPlayer < 40.0f)) { if (this->dyna.actor.playerHeightRel > 15.0f) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); this->dyna.actor.textId = 0x9E6; Message_StartTextbox(play, this->dyna.actor.textId, NULL); this->actionFunc = func_809543D4; @@ -261,7 +261,7 @@ void func_809542A0(BgIngate* this, PlayState* play) { void func_80954340(BgIngate* this, PlayState* play) { if (DECR(this->unk16A) == 0) { if (this->timePath != NULL) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); this->timePath = &play->setupPathList[this->timePath->additionalPathIndex]; func_80953F14(this, play); Environment_StopTime(); @@ -280,7 +280,7 @@ void func_809543D4(BgIngate* this, PlayState* play) { break; case 0x9E5: if (play->msgCtx.choiceIndex == 0) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); this->unk160 &= ~0x4; this->actionFunc = func_809541B8; Environment_StartTime(); @@ -301,7 +301,7 @@ void func_809543D4(BgIngate* this, PlayState* play) { CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40); Audio_PlaySfx_MessageDecide(); } else { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); this->unk160 &= ~0x4; this->actionFunc = func_809541B8; Environment_StartTime(); diff --git a/src/overlays/actors/ovl_Boss_01/z_boss_01.c b/src/overlays/actors/ovl_Boss_01/z_boss_01.c index 6adf386d7..3674a227b 100644 --- a/src/overlays/actors/ovl_Boss_01/z_boss_01.c +++ b/src/overlays/actors/ovl_Boss_01/z_boss_01.c @@ -1001,7 +1001,7 @@ void Boss01_IntroCutscene(Boss01* this, PlayState* play) { } Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -1036,11 +1036,11 @@ void Boss01_IntroCutscene(Boss01* this, PlayState* play) { } if (this->cutsceneTimer == 40) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_21); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_21); } if (this->cutsceneTimer == 100) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); } if (this->cutsceneTimer >= 90) { @@ -1136,7 +1136,7 @@ void Boss01_IntroCutscene(Boss01* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->actor.flags |= ACTOR_FLAG_TARGETABLE; SET_EVENTINF(EVENTINF_54); } @@ -1189,7 +1189,7 @@ void Boss01_SummonBugsCutscene(Boss01* this, PlayState* play) { } Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -1232,7 +1232,7 @@ void Boss01_SummonBugsCutscene(Boss01* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->actor.flags |= ACTOR_FLAG_TARGETABLE; player->actor.world.rot.y = player->actor.shape.rot.y = -0x8000; player->actor.world.pos.x = 0.0f; @@ -2135,7 +2135,7 @@ void Boss01_DeathCutscene(Boss01* this, PlayState* play) { } Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_1); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -2252,7 +2252,7 @@ void Boss01_DeathCutscene(Boss01* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; } break; diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/src/overlays/actors/ovl_Boss_02/z_boss_02.c index e202a08cb..691931fce 100644 --- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c +++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c @@ -2172,7 +2172,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) { } if (this->unk_1D1C == 45) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_21); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_21); sTwinmoldMusicStartTimer = KREG(91) + 43; } @@ -2186,7 +2186,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) { } if (this->unk_1D1C == 100) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_115); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_115); } if (this->unk_1D1C == 112) { @@ -2225,7 +2225,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->actor.flags |= ACTOR_FLAG_TARGETABLE; this->unk_1D20 = 0; sRedTwinmold->unk_0144 = sBlueTwinmold->unk_0144 = 3; @@ -2286,7 +2286,7 @@ void func_809DEAC4(Boss02* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->unk_1D20 = 0; this->actor.flags |= ACTOR_FLAG_TARGETABLE; sp68->unk_0144 = 10; diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/src/overlays/actors/ovl_Boss_03/z_boss_03.c index f96626785..7eebfac5d 100644 --- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c +++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c @@ -1149,7 +1149,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) { case 0: if (player->actor.world.pos.y < 1350.0f) { Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -1260,7 +1260,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) { if (this->csTimer == 5) { // Rotates Player towards Gyorg - func_800B7298(play, &this->actor, PLAYER_CSACTION_8); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_8); } this->subCamEye.x = player->actor.world.pos.x + 30.0f; @@ -1371,7 +1371,7 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->subCamId = SUB_CAM_ID_DONE; func_809E344C(this, play); @@ -1449,7 +1449,7 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) { case 0: if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) { Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_1); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -1628,7 +1628,7 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->csState = 3; Play_DisableMotionBlur(); Boss03_PlayUnderwaterSfx(&this->actor.projectedPos, NA_SE_EN_KONB_INIT_OLD); @@ -1662,7 +1662,7 @@ void Boss03_SpawnSmallFishesCutscene(Boss03* this, PlayState* play) { case 0: if (CutsceneManager_GetCurrentCsId() == CS_ID_NONE) { Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_1); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -1723,7 +1723,7 @@ void Boss03_SpawnSmallFishesCutscene(Boss03* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); func_809E344C(this, play); this->workTimer[WORK_TIMER_UNK1_A] = 50; diff --git a/src/overlays/actors/ovl_Boss_04/z_boss_04.c b/src/overlays/actors/ovl_Boss_04/z_boss_04.c index 62250d6a4..1e9736b5f 100644 --- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c +++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c @@ -264,7 +264,7 @@ void func_809EC568(Boss04* this, PlayState* play) { this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); player->actor.world.pos.x = this->unk_6E8; player->actor.world.pos.z = this->unk_6F0 + 410.0f; player->actor.shape.rot.y = 0x7FFF; @@ -314,7 +314,7 @@ void func_809EC568(Boss04* this, PlayState* play) { if (this->unk_704 == 45) { this->unk_708 = 1; this->unk_704 = 0; - func_800B7298(play, &this->actor, PLAYER_CSACTION_21); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_21); this->actor.gravity = 0.0f; break; } @@ -391,7 +391,7 @@ void func_809EC568(Boss04* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); Play_DisableMotionBlur(); SET_EVENTINF(EVENTINF_60); } diff --git a/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/src/overlays/actors/ovl_Boss_06/z_boss_06.c index 5ae65a343..92db6dc89 100644 --- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c +++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c @@ -200,7 +200,7 @@ void func_809F24C8(Boss06* this, PlayState* play) { } Cutscene_StartManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); @@ -240,7 +240,7 @@ void func_809F24C8(Boss06* this, PlayState* play) { this->unk_1D8 = 0.0f; if (this->unk_1CA == 60) { D_809F4970->unk_154++; - func_800B7298(play, &this->actor, PLAYER_CSACTION_132); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_132); player->actor.shape.rot.y = 0; player->actor.world.rot.y = player->actor.shape.rot.y; } @@ -333,7 +333,7 @@ void func_809F24C8(Boss06* this, PlayState* play) { func_80169AFC(play, this->subCamId, 0); this->subCamId = SUB_CAM_ID_DONE; Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); D_809F4970->unk_151 = 0; } break; diff --git a/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c b/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c index 86dcf4955..9e179f4d1 100644 --- a/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c +++ b/src/overlays/actors/ovl_Dm_Tag/z_dm_tag.c @@ -154,7 +154,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) { break; case 6: - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); play->nextEntrance = ENTRANCE(STOCK_POT_INN, 5); gSaveContext.nextCutsceneIndex = 0; play->transitionTrigger = TRANS_TRIGGER_START; @@ -171,7 +171,7 @@ s32 func_80C224D8(DmTag* this, PlayState* play) { s32 func_80C227E8(DmTag* this, PlayState* play) { if (this->unk_1A4 == 0) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); play->nextEntrance = ENTRANCE(STOCK_POT_INN, 4); gSaveContext.nextCutsceneIndex = 0; play->transitionTrigger = TRANS_TRIGGER_START; diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c index 3d94e261a..e14bd9935 100644 --- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c +++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c @@ -462,7 +462,7 @@ s32 func_808A1478(DoorShutter* this, PlayState* play, f32 arg2) { } if ((this->csId != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == this->csId)) { - func_800B724C(play, &this->slidingDoor.dyna.actor, PLAYER_CSACTION_1); + Player_SetCsAction(play, &this->slidingDoor.dyna.actor, PLAYER_CSACTION_1); } } @@ -582,7 +582,7 @@ void func_808A1884(DoorShutter* this, PlayState* play) { if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_DOOR) { func_801226E0(play, ((void)0, gSaveContext.respawn[RESPAWN_MODE_DOWN].data)); player->csId = CS_ID_NONE; - func_800B7298(play, NULL, PLAYER_CSACTION_115); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_115); } } } @@ -637,7 +637,7 @@ void func_808A1B48(DoorShutter* this, PlayState* play) { void func_808A1C50(DoorShutter* this, PlayState* play) { if (this->unk_167++ > 30) { if (GET_PLAYER(play)->csAction == PLAYER_CSACTION_115) { - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); } DoorShutter_SetupDoor(this, play); } diff --git a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c index 5f491f431..938f41edb 100644 --- a/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c +++ b/src/overlays/actors/ovl_Door_Warp1/z_door_warp1.c @@ -344,7 +344,7 @@ void func_808B921C(DoorWarp1* this, PlayState* play) { } if (func_808B866C(this, play) && !Play_InCsMode(play)) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); Message_StartTextbox(play, 0xF2, &this->dyna.actor); DoorWarp1_SetupAction(this, func_808B93A0); } @@ -360,14 +360,14 @@ void func_808B93A0(DoorWarp1* this, PlayState* play) { Message_CloseTextbox(play); if (play->msgCtx.choiceIndex == 0) { Audio_PlaySfx_MessageDecide(); - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_9); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_9); player->unk_3A0.x = this->dyna.actor.world.pos.x; player->unk_3A0.z = this->dyna.actor.world.pos.z; this->unk_1CA = 1; DoorWarp1_SetupAction(this, func_808B9524); } else { Audio_PlaySfx_MessageCancel(); - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); DoorWarp1_SetupAction(this, func_808B94A4); } } @@ -448,7 +448,7 @@ void func_808B977C(DoorWarp1* this, PlayState* play) { AudioSfx_PlaySfx(NA_SE_EV_LINK_WARP, &player->actor.projectedPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_9); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_9); player->unk_3A0.x = this->dyna.actor.world.pos.x; player->unk_3A0.z = this->dyna.actor.world.pos.z; this->unk_1CA = 1; @@ -602,7 +602,7 @@ void func_808B9F10(DoorWarp1* this, PlayState* play) { Player* player = GET_PLAYER(play); Interface_SetHudVisibility(HUD_VISIBILITY_NONE); - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_9); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_9); player->unk_3A0.x = this->dyna.actor.world.pos.x; player->unk_3A0.z = this->dyna.actor.world.pos.z; this->unk_1CA = 20; diff --git a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c index 90ba60b78..fb88bb043 100644 --- a/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c +++ b/src/overlays/actors/ovl_En_Aob_01/z_en_aob_01.c @@ -448,7 +448,7 @@ void EnAob01_BeforeRace_HandleConversation(EnAob01* this, PlayState* play) { if (this->stateFlags & ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE) { this->stateFlags &= ~ENAOB01_FLAG_PLAYER_CONFIRMED_CHOICE; Rupees_ChangeBy(-this->rupeesBet); - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = EnAob01_BeforeRace_StartRace; diff --git a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c index 837e3560c..cf06ca1ff 100644 --- a/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c +++ b/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c @@ -378,7 +378,7 @@ void EnBigokuta_PlayDeathCutscene(EnBigokuta* this, PlayState* play) { CutsceneManager_Start(this->csId, &this->picto.actor); if (!CHECK_EVENTINF(EVENTINF_41) && !CHECK_EVENTINF(EVENTINF_35)) { - func_800B724C(play, &this->picto.actor, PLAYER_CSACTION_WAIT); + Player_SetCsAction(play, &this->picto.actor, PLAYER_CSACTION_WAIT); } else { player = GET_PLAYER(play); player->stateFlags1 |= PLAYER_STATE1_20; @@ -454,7 +454,7 @@ void EnBigokuta_PlayDeathEffects(EnBigokuta* this, PlayState* play) { Actor_Kill(&this->picto.actor); if (!CHECK_EVENTINF(EVENTINF_41) && !CHECK_EVENTINF(EVENTINF_35)) { - func_800B724C(play, &this->picto.actor, PLAYER_CSACTION_END); + Player_SetCsAction(play, &this->picto.actor, PLAYER_CSACTION_END); } else { Player* player = GET_PLAYER(play); diff --git a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c index e9f1a263a..92e542f4d 100644 --- a/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c +++ b/src/overlays/actors/ovl_En_Bigpo/z_en_bigpo.c @@ -308,7 +308,7 @@ void EnBigpo_SetupSpawnCutscene(EnBigpo* this) { void EnBigpo_WaitCutsceneQueue(EnBigpo* this, PlayState* play) { if (CutsceneManager_IsNext(this->actor.csId)) { CutsceneManager_Start(this->actor.csId, &this->actor); - func_800B724C(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_WAIT); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId); if (this->actor.params == BIG_POE_TYPE_REGULAR) { // and SUMMONED, got switched earlier EnBigpo_SpawnCutsceneStage1(this, play); @@ -478,7 +478,7 @@ void EnBigpo_SpawnCutsceneStage8(EnBigpo* this, PlayState* play) { } else { // BIG_POE_TYPE_REGULAR CutsceneManager_Stop(this->actor.csId); } - func_800B724C(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_END); EnBigpo_SetupIdleFlying(this); // setup idle flying } } diff --git a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c index 2e04e768a..3c64f0338 100644 --- a/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c +++ b/src/overlays/actors/ovl_En_Bigslime/z_en_bigslime.c @@ -850,7 +850,7 @@ void EnBigslime_EndCutscene(EnBigslime* this, PlayState* play) { this->subCamId = SUB_CAM_ID_DONE; CutsceneManager_Stop(this->csId); this->csId = CutsceneManager_GetAdditionalCsId(this->actor.csId); - func_800B724C(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_END); } } @@ -939,7 +939,7 @@ void EnBigslime_SetupCutsceneStartBattle(EnBigslime* this, PlayState* play) { this->bigslimeCollider[0].base.acFlags &= ~AC_ON; Math_Vec3f_Copy(&subCam->at, &this->actor.focus.pos); - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); player->actor.shape.rot.y = this->actor.yawTowardsPlayer + 0x8000; player->actor.world.pos.x = Math_SinS(this->actor.yawTowardsPlayer) * 347.0f + this->actor.world.pos.x; @@ -987,7 +987,7 @@ void EnBigslime_SetupCallMinislime(EnBigslime* this, PlayState* play) { Animation_MorphToPlayOnce(&this->skelAnime, &gGekkoCallAnim, 5.0f); EnBigslime_GekkoSfxOutsideBigslime(this, NA_SE_EN_FROG_GREET); this->callTimer = 0; - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->actionFunc = EnBigslime_CallMinislime; } @@ -1011,7 +1011,7 @@ void EnBigslime_CallMinislime(EnBigslime* this, PlayState* play) { EnBigslime_InitFallMinislime(this); play->envCtx.lightSettingOverride = LIGHT_SETTING_OVERRIDE_NONE; this->callTimer = 35; - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); } } @@ -2546,7 +2546,7 @@ void EnBigslime_PlayCutscene(EnBigslime* this, PlayState* play) { } else if (CutsceneManager_IsNext(this->csId)) { CutsceneManager_Start(this->csId, &this->actor); if (this->actionFuncStored != EnBigslime_SquishFlat) { - func_800B724C(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_WAIT); } this->subCamId = CutsceneManager_GetCurrentSubCamId(this->csId); diff --git a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c index 1f2073db6..c31a28966 100644 --- a/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c +++ b/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.c @@ -427,7 +427,7 @@ void func_809C5310(EnBomBowlMan* this, PlayState* play) { if (player->actor.world.pos.x < 1510.0f) { if (player->transformation != PLAYER_FORM_DEKU) { if (this->actor.xzDistToPlayer < this->unk_2C8) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); func_809C53A4(this); } } else { @@ -485,7 +485,7 @@ void func_809C5598(EnBomBowlMan* this, PlayState* play) { } else if (this->actor.textId == 0x734) { this->actor.textId = 0x715; } else if (this->actor.textId == 0x715) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); EnBomBowlMan_ChangeAnim(this, ENBOMBOWLMAN_ANIM_17, 1.0f); func_809C59A4(this, play); return; @@ -497,7 +497,7 @@ void func_809C5598(EnBomBowlMan* this, PlayState* play) { Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_LEARNED_SECRET_CODE); Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_RECEIVED_BOMBERS_NOTEBOOK); Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_BOMBERS); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->actionFunc = func_809C5738; return; } diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.c b/src/overlays/actors/ovl_En_Box/z_en_box.c index c27583eac..2cf81e94e 100644 --- a/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -425,9 +425,9 @@ void func_80868B74(EnBox* this, PlayState* play) { this->unk_1A0++; if ((this->csId1 != CS_ID_NONE) && (CutsceneManager_GetCurrentCsId() == this->csId1)) { if (this->unk_1A0 == 2) { - func_800B724C(play, &this->dyna.actor, PLAYER_CSACTION_4); + Player_SetCsAction(play, &this->dyna.actor, PLAYER_CSACTION_4); } else if (this->unk_1A0 == 22) { - func_800B724C(play, &this->dyna.actor, PLAYER_CSACTION_1); + Player_SetCsAction(play, &this->dyna.actor, PLAYER_CSACTION_1); } } } else if (this->unk_1A0 < 60) { diff --git a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c index 3bef992a9..226dc567b 100644 --- a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c +++ b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c @@ -560,7 +560,7 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) { this->subCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, this->subCamId, CAM_STATUS_ACTIVE); - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); mainCam = Play_GetCamera(play, CAM_ID_MAIN); this->subCamEye.x = mainCam->eye.x; this->subCamEye.y = mainCam->eye.y; @@ -586,7 +586,7 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) { mainCam->at = this->subCamAt; func_80169AFC(play, this->subCamId, 0); Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->cameraState = 0; this->subCamId = SUB_CAM_ID_DONE; this->activeTimer = 20; diff --git a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c index 0c52ca7b7..88f8fad24 100644 --- a/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c +++ b/src/overlays/actors/ovl_En_Dinofos/z_en_dinofos.c @@ -369,7 +369,7 @@ void func_8089ABF4(EnDinofos* this, PlayState* play) { this->subCamId = SUB_CAM_ID_DONE; CutsceneManager_Stop(this->actor.csId); if (this->actor.colChkInfo.health == 0) { - func_800B724C(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_END); } } } @@ -1209,7 +1209,7 @@ void func_8089D318(EnDinofos* this, PlayState* play) { if (CutsceneManager_IsNext(this->actor.csId)) { if (this->actor.colChkInfo.health == 0) { CutsceneManager_Start(this->actor.csId, &this->actor); - func_800B724C(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_WAIT); } else { CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); } diff --git a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c index ce2c6f82a..c2c08bfe6 100644 --- a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c +++ b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c @@ -71,7 +71,7 @@ static TexturePtr sEyeTextures[] = { }; s32 func_80A50D40(Actor* actor, PlayState* play) { - func_800B7298(play, actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, actor, PLAYER_CSACTION_WAIT); if (CHECK_EVENTINF(EVENTINF_35)) { play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_CLEARED, 6); } else { diff --git a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c index bb1d60c2c..5ec892f13 100644 --- a/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c +++ b/src/overlays/actors/ovl_En_Dragon/z_en_dragon.c @@ -542,7 +542,7 @@ void EnDragon_Grab(EnDragon* this, PlayState* play) { if (this->grabTimer > sMaxGrabTimerPerPython[this->pythonIndex]) { if (this->state == DEEP_PYTHON_GRAB_STATE_START) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); this->state = DEEP_PYTHON_GRAB_STATE_GRABBED; } diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c index c1320150a..115bbf007 100644 --- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c +++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c @@ -5324,7 +5324,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { sSubCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, sSubCamId, CAM_STATUS_ACTIVE); - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); mainCam = Play_GetCamera(play, CAM_ID_MAIN); sSubCamEye.x = mainCam->eye.x; @@ -5351,7 +5351,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { func_80169AFC(play, sSubCamId, 0); Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); D_8090CD4C = 0; sSubCamId = SUB_CAM_ID_DONE; D_8090CD50 = 30; @@ -5365,7 +5365,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { sSubCamId = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); Play_ChangeCameraStatus(play, sSubCamId, CAM_STATUS_ACTIVE); - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); mainCam = Play_GetCamera(play, CAM_ID_MAIN); sSubCamEye.x = mainCam->eye.x; @@ -5383,7 +5383,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { if ((D_8090CD50 == 0) && Message_ShouldAdvance(play)) { D_8090CD4C = 22; D_8090CD50 = 40; - // func_800B7298 call removed in MM + // Player_SetCsActionWithHaltedActors call removed in MM D_80911F64 = 0.0f; } break; @@ -5452,7 +5452,7 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { mainCam->at = sSubCamAt; func_80169AFC(play, sSubCamId, 0); Cutscene_StopManual(play, &play->csCtx); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); D_8090CD4C = 0; sSubCamId = SUB_CAM_ID_DONE; player->unk_B28 = -5; diff --git a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c index fa31aa428..f5ffeee9c 100644 --- a/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c +++ b/src/overlays/actors/ovl_En_Gb2/z_en_gb2.c @@ -445,7 +445,7 @@ void func_80B0FFA8(EnGb2* this, PlayState* play) { Rupees_ChangeBy(-this->unk_288); play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); this->actionFunc = func_80B11344; break; @@ -600,7 +600,7 @@ void func_80B10634(EnGb2* this, PlayState* play) { Rupees_ChangeBy(-this->unk_288); play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); this->actionFunc = func_80B11344; } break; diff --git a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index 78a79f14a..a6f201813 100644 --- a/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -494,7 +494,7 @@ void EnGe2_PatrolDuties(EnGe2* this, PlayState* play) { this->picto.actor.shape.rot.y, 0x1800, visionRange, this->verticalDetectRange)) { if ((GERUDO_PURPLE_GET_EXIT(&this->picto.actor) != GERUDO_PURPLE_EXIT_NONE) && !Play_InCsMode(play)) { this->picto.actor.speed = 0.0f; - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_26); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_26); Lib_PlaySfx(NA_SE_SY_FOUND); Message_StartTextbox(play, 0x1194, &this->picto.actor); this->actionFunc = EnGe2_SetupCharge; @@ -682,7 +682,7 @@ void EnGe2_GuardStationary(EnGe2* this, PlayState* play) { if (EnGe2_LookForPlayer(play, &this->picto.actor, &this->picto.actor.focus.pos, this->picto.actor.shape.rot.y, 0x4000, 720.0f, this->verticalDetectRange)) { if ((GERUDO_PURPLE_GET_EXIT(&this->picto.actor) != GERUDO_PURPLE_EXIT_NONE) && !Play_InCsMode(play)) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_26); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_26); Lib_PlaySfx(NA_SE_SY_FOUND); Message_StartTextbox(play, 0x1194, &this->picto.actor); this->timer = 50; diff --git a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c index c9623136e..3115453f5 100644 --- a/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c +++ b/src/overlays/actors/ovl_En_Ge3/z_en_ge3.c @@ -273,7 +273,7 @@ void EnGe3_AveilsChamberIdle(EnGe3* this, PlayState* play) { } } else if ((this->picto.actor.xzDistToPlayer < 700.0f) && (fabsf(this->picto.actor.playerHeightRel) < 100.0f) && !Play_InCsMode(play)) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_26); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_26); Lib_PlaySfx(NA_SE_SY_FOUND); if (Player_GetMask(play) == PLAYER_MASK_STONE) { // Not fooled by Stone Mask diff --git a/src/overlays/actors/ovl_En_Gs/z_en_gs.c b/src/overlays/actors/ovl_En_Gs/z_en_gs.c index c8c3016c2..cae85e03c 100644 --- a/src/overlays/actors/ovl_En_Gs/z_en_gs.c +++ b/src/overlays/actors/ovl_En_Gs/z_en_gs.c @@ -389,7 +389,7 @@ void func_809984F4(EnGs* this, PlayState* play) { } } while (gossipStone != NULL); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->actionFunc = func_809985B8; } diff --git a/src/overlays/actors/ovl_En_Hs/z_en_hs.c b/src/overlays/actors/ovl_En_Hs/z_en_hs.c index c171ec958..95e4abf84 100644 --- a/src/overlays/actors/ovl_En_Hs/z_en_hs.c +++ b/src/overlays/actors/ovl_En_Hs/z_en_hs.c @@ -225,7 +225,7 @@ void EnHs_SceneTransitToBunnyHoodDialogue(EnHs* this, PlayState* play) { void func_80953354(EnHs* this, PlayState* play) { if (!Play_InCsMode(play)) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->actionFunc = EnHs_SceneTransitToBunnyHoodDialogue; } } diff --git a/src/overlays/actors/ovl_En_Jso/z_en_jso.c b/src/overlays/actors/ovl_En_Jso/z_en_jso.c index 48b9e0b40..637552704 100644 --- a/src/overlays/actors/ovl_En_Jso/z_en_jso.c +++ b/src/overlays/actors/ovl_En_Jso/z_en_jso.c @@ -367,7 +367,7 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { } CutsceneManager_StartWithPlayerCs(this->csId, &this->actor); - func_800B7298(play, &this->actor, PLAYER_CSACTION_21); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_21); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId); player->actor.world.pos.x = this->actor.home.pos.x + 30.0f; player->actor.world.pos.z = this->actor.home.pos.z + 30.0f; @@ -472,7 +472,7 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { } if (showTextbox) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); Message_StartTextbox(play, sTextIds[this->textIndex], &this->actor); this->textIndex++; this->actor.shape.yOffset = 970.0f; @@ -573,7 +573,7 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { this->introCsTimer++; if (this->introCsTimer >= 10) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); CutsceneManager_Stop(this->csId); this->rightArmRot.x = this->rightArmRot.y = this->rightArmRot.z = this->robeRightRot.x = this->robeRightRot.y = this->robeRightRot.z = 0; diff --git a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c index 6dff9c532..febdaed83 100644 --- a/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c +++ b/src/overlays/actors/ovl_En_Kaizoku/z_en_kaizoku.c @@ -481,7 +481,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) { } CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_21); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_21); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId); this->picto.actor.shape.rot.y = this->picto.actor.world.rot.y = this->picto.actor.yawTowardsPlayer; @@ -538,7 +538,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) { this->unk_2D8 = 0; this->picto.actor.world.pos.y = this->picto.actor.floorHeight; this->picto.actor.velocity.y = 0.0f; - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_4); Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0); Actor_SpawnFloorDustRing(play, &this->picto.actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0); Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_ONGND); @@ -609,7 +609,7 @@ void func_80B85FA8(EnKaizoku* this, PlayState* play) { case 7: if (this->unk_598 == 0) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_END); CutsceneManager_Stop(this->csId); this->unk_59C = 0; this->subCamId = SUB_CAM_ID_DONE; @@ -674,7 +674,7 @@ void func_80B86804(EnKaizoku* this, PlayState* play) { CutsceneManager_StartWithPlayerCs(this->csId, &this->picto.actor); } - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_96); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_96); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId); this->unk_2B2 = 30; this->picto.actor.flags &= ~ACTOR_FLAG_TARGETABLE; @@ -724,7 +724,7 @@ void func_80B868B8(EnKaizoku* this, PlayState* play) { case 2: if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_END); CutsceneManager_Stop(this->csId); this->subCamId = SUB_CAM_ID_DONE; play->nextEntrance = play->setupExitList[this->exitIndex]; @@ -799,7 +799,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); EnKaizoku_ChangeAnim(this, EN_KAIZOKU_ANIM_18); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_133); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_133); this->unk_5A0 = 0; this->unk_598 = 0; this->unk_59C++; @@ -865,7 +865,7 @@ void func_80B86B74(EnKaizoku* this, PlayState* play) { play->envCtx.fillScreen = false; this->unk_59C = 0; this->subCamId = SUB_CAM_ID_DONE; - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_END); CutsceneManager_Stop(this->csId); if (this->switchFlag > SWITCH_FLAG_NONE) { Flags_SetSwitch(play, this->switchFlag); @@ -1681,7 +1681,7 @@ void func_80B8960C(EnKaizoku* this, PlayState* play) { } this->picto.actor.speed = 0.0f; this->unk_2D8 = 1; - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_123); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_123); Enemy_StartFinishingBlow(play, &this->picto.actor); Actor_PlaySfx(&this->picto.actor, NA_SE_EN_PIRATE_DEAD); this->picto.actor.flags |= ACTOR_FLAG_CANT_LOCK_ON; diff --git a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c index 2a0f05201..4e2e27cf6 100644 --- a/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c +++ b/src/overlays/actors/ovl_En_Kakasi/z_en_kakasi.c @@ -425,7 +425,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) { } if ((this->unkState1A8 == 2) && (this->unkState196 == 2)) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_73); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_73); this->unkState1A8 = 0; } @@ -434,7 +434,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) { if (this->talkState == TEXT_STATE_5) { // bad song input if ((this->unkState196 == 2) && (this->picto.actor.textId == 0x1647)) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_END); } // after timeskip @@ -461,7 +461,7 @@ void EnKakasi_RegularDialogue(EnKakasi* this, PlayState* play) { } else if ((this->picto.actor.textId == 0x165D) || (this->picto.actor.textId == 0x165F) || (this->picto.actor.textId == 0x1660) || (this->picto.actor.textId == 0x1652)) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_4); if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) { CutsceneManager_Stop(CS_ID_GLOBAL_TALK); CutsceneManager_Queue(this->csIdList[0]); @@ -690,7 +690,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) { if (this->unk190 == 0) { Message_CloseTextbox(play); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_86); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_86); this->picto.actor.textId = 0x1648; Message_StartTextbox(play, (this->picto.actor.textId), &this->picto.actor); this->unkState1A8 = 0; @@ -726,7 +726,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) { Math_Vec3f_Copy(&this->unk22C, &this->picto.actor.home.pos); CutsceneManager_StartWithPlayerCs(this->csIdList[0], &this->picto.actor); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->picto.actor.csId); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_86); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_86); this->unkState1A8 = 1; } @@ -759,7 +759,7 @@ void EnKakasi_PostSongLearnDialogue(EnKakasi* this, PlayState* play) { } if (this->picto.actor.textId == 0x1648) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_WAIT); this->picto.actor.textId = 0x1649; if (this->animIndex != ENKAKASI_ANIM_ARMS_CROSSED_ROCKING) { EnKakasi_ChangeAnim(this, ENKAKASI_ANIM_ARMS_CROSSED_ROCKING); @@ -936,7 +936,7 @@ void EnKakasi_DancingNightAway(EnKakasi* this, PlayState* play) { this->unk190++; this->unk204 = 0xA; if (this->unk190 == 0xE) { - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_73); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_73); Play_DisableMotionBlur(); this->unk204 = 0x14; } @@ -1036,7 +1036,7 @@ void EnKakasi_DiggingAway(EnKakasi* this, PlayState* play) { Math_ApproachF(&this->picto.actor.shape.yOffset, -6000.0f, 0.5f, 200.0f); if (fabsf(this->picto.actor.shape.yOffset + 6000.0f) < 10.0f) { SET_WEEKEVENTREG(WEEKEVENTREG_79_08); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_END); CutsceneManager_Stop(this->csIdList[0]); this->aboveGroundStatus = ENKAKASI_ABOVE_GROUND_TYPE; this->songSummonDist = 80.0f; diff --git a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c index e06fff62b..947ac60c6 100644 --- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c +++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c @@ -359,7 +359,7 @@ void EnLookNuts_Update(Actor* thisx, PlayState* play) { Math_Vec3f_Copy(&this->headRotTarget, &gZeroVec3f); this->state = PALACE_GUARD_RUNNING_TO_PLAYER; Audio_PlaySfx(NA_SE_SY_FOUND); - func_800B7298(play, &this->actor, PLAYER_CSACTION_26); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_26); D_80A6862C = 1; this->actor.flags |= (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_10); this->actor.gravity = 0.0f; diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c index a37405713..0e95ee354 100644 --- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c +++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c @@ -1081,7 +1081,7 @@ void EnMaYto_SetupPostMilkRunWaitDialogueEnd(EnMaYto* this) { void EnMaYto_PostMilkRunWaitDialogueEnd(EnMaYto* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) || (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) { if (Message_ShouldAdvance(play) && (Message_GetState(&play->msgCtx) == TEXT_STATE_5)) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); Message_CloseTextbox(play); } } diff --git a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c index 3c4e9f3e5..a4356b66e 100644 --- a/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c +++ b/src/overlays/actors/ovl_En_Mnk/z_en_mnk.c @@ -1620,7 +1620,7 @@ void EnMnk_MonkeyHanging_WaitForTextboxAfterDunk(EnMnk* this, PlayState* play) { } Message_CloseTextbox(play); this->actionFunc = EnMnk_MonkeyHanging_WaitAfterDunk; - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); CLEAR_WEEKEVENTREG(WEEKEVENTREG_83_08); } } @@ -1693,7 +1693,7 @@ void EnMnk_MonkeyHanging_Plead(EnMnk* this, PlayState* play) { case 0x8E9: this->actionFunc = EnMnk_MonkeyHanging_Dunk2; Message_CloseTextbox(play); - func_800B7298(play, &this->picto.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->picto.actor, PLAYER_CSACTION_WAIT); this->unk_3C8 = 60; break; diff --git a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c index 3175e736b..db3463345 100644 --- a/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c +++ b/src/overlays/actors/ovl_En_Mt_tag/z_en_mt_tag.c @@ -256,7 +256,7 @@ s32 EnMttag_ExitRace(PlayState* play, s32 transitionType, s32 nextTransitionType void EnMttag_ShowFalseStartMessage(EnMttag* this, PlayState* play) { gSaveContext.timerStates[TIMER_ID_MINIGAME_2] = TIMER_STATE_OFF; Message_StartTextbox(play, 0xE95, NULL); // An entrant made a false start - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 20); this->actionFunc = EnMttag_PotentiallyRestartRace; } @@ -267,7 +267,7 @@ void EnMttag_ShowFalseStartMessage(EnMttag* this, PlayState* play) { */ void EnMttag_ShowCantWinMessage(EnMttag* this, PlayState* play) { Message_StartTextbox(play, 0xE97, NULL); // You can't win now... - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->actionFunc = EnMttag_HandleCantWinChoice; } @@ -433,7 +433,7 @@ void EnMttag_PotentiallyRestartRace(EnMttag* this, PlayState* play) { play->transitionType = TRANS_TYPE_FADE_BLACK; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK; Message_CloseTextbox(play); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); Magic_Add(play, MAGIC_FILL_TO_CAPACITY); CLEAR_EVENTINF(EVENTINF_10); @@ -468,7 +468,7 @@ void EnMttag_HandleCantWinChoice(EnMttag* this, PlayState* play) { // Keep racing Audio_PlaySfx_MessageDecide(); Message_CloseTextbox(play); - func_800B7298(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); CLEAR_EVENTINF(EVENTINF_13); this->timer = 100; this->actionFunc = EnMttag_Race; diff --git a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c index 09ef040ae..f941ee00f 100644 --- a/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c +++ b/src/overlays/actors/ovl_En_Pametfrog/z_en_pametfrog.c @@ -343,7 +343,7 @@ void EnPametfrog_StopCutscene(EnPametfrog* this, PlayState* play) { Play_SetCameraAtEye(play, CAM_ID_MAIN, &subCam->at, &subCam->eye); this->subCamId = SUB_CAM_ID_DONE; CutsceneManager_Stop(this->csId); - func_800B724C(play, &this->actor, PLAYER_CSACTION_END); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_END); } } @@ -1007,7 +1007,7 @@ void EnPametfrog_PlayCutscene(EnPametfrog* this, PlayState* play) { if (CutsceneManager_IsNext(this->csId)) { CutsceneManager_Start(this->csId, &this->actor); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->csId); - func_800B724C(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_WAIT); if (this->actor.colChkInfo.health == 0) { if (this->actor.params == GEKKO_PRE_SNAPPER) { EnPametfrog_SetupCallSnapper(this, play); diff --git a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c index 4f55a9593..86359c430 100644 --- a/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c +++ b/src/overlays/actors/ovl_En_Sellnuts/z_en_sellnuts.c @@ -473,7 +473,7 @@ void func_80ADBAB8(EnSellnuts* this, PlayState* play) { play->msgCtx.msgMode = MSGMODE_TEXT_CLOSING; play->msgCtx.stateTimer = 4; this->actionFunc = func_80ADBBEC; - func_800B7298(play, NULL, PLAYER_CSACTION_19); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_19); } } diff --git a/src/overlays/actors/ovl_En_Shn/z_en_shn.c b/src/overlays/actors/ovl_En_Shn/z_en_shn.c index db44bd738..2d00a81e3 100644 --- a/src/overlays/actors/ovl_En_Shn/z_en_shn.c +++ b/src/overlays/actors/ovl_En_Shn/z_en_shn.c @@ -259,7 +259,7 @@ s32 func_80AE6704(Actor* thisx, PlayState* play) { case 6: CLEAR_WEEKEVENTREG(WEEKEVENTREG_90_40); - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); play->nextEntrance = ENTRANCE(SOUTHERN_SWAMP_POISONED, 6); gSaveContext.nextCutsceneIndex = 0; play->transitionTrigger = TRANS_TRIGGER_START; diff --git a/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c b/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c index 24cd5779c..4683173a4 100644 --- a/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c +++ b/src/overlays/actors/ovl_En_Takaraya/z_en_takaraya.c @@ -323,7 +323,7 @@ void func_80ADF520(EnTakaraya* this, PlayState* play) { } void func_80ADF608(EnTakaraya* this, PlayState* play) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); this->unk2AD = true; this->actionFunc = func_80ADF654; } diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c index 89ba11090..4fa177013 100644 --- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c +++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c @@ -528,7 +528,7 @@ void func_80A3F0B0(EnTest3* this, PlayState* play) { void func_80A3F114(EnTest3* this, PlayState* play) { if (this->player.csAction != PLAYER_CSACTION_NONE) { - play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_END); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_END); } } @@ -645,7 +645,7 @@ s32 func_80A3F62C(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul this->player.actor.home.rot.y = this->player.actor.shape.rot.y + 0x8000; } this->player.stateFlags2 |= PLAYER_STATE2_40000; - play->startPlayerCutscene(play, &this->player, -1); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_NEG1); } this->unk_D78 = D_80A418A8[arg2->unk_1_4]; return true; @@ -668,7 +668,7 @@ s32 func_80A3F73C(EnTest3* this, PlayState* play) { func_800BC154(play, &play->actorCtx, &this->unk_D90->actor, 4); func_800BC154(play, &play->actorCtx, &this->player.actor, 2); CutsceneManager_SetReturnCamera(this->subCamId); - play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_WAIT); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_WAIT); } Actor_OfferTalkNearColChkInfoCylinder(&this->player.actor, play); if (this->unk_D88 == 3) { @@ -690,7 +690,7 @@ s32 func_80A3F8D4(EnTest3* this, PlayState* play, struct_80A41828* arg2, Schedul ((postActor = func_80A3F2BC(play, this, ACTOR_EN_PM, ACTORCAT_NPC, 100.0f, 20.0f)) != NULL)) { this->player.actor.home.rot.y = Actor_WorldYawTowardActor(&this->player.actor, postActor); } - play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_97); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_97); return true; } @@ -737,7 +737,7 @@ s32 func_80A3FA58(EnTest3* this, PlayState* play) { return false; } if (this->unk_D8A == 90) { - play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_21); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_21); } } else { this->unk_D8A++; @@ -857,7 +857,7 @@ s32 func_80A3FFD0(EnTest3* this, PlayState* play2) { } } else { SET_WEEKEVENTREG(WEEKEVENTREG_COUPLES_MASK_CUTSCENE_FINISHED); - play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_110); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_110); } return false; } @@ -983,7 +983,7 @@ void func_80A40678(EnTest3* this, PlayState* play) { if (scheduleOutput.result == 6) { this->player.actor.home.rot.y = 0x7FFF; this->player.stateFlags2 |= PLAYER_STATE2_40000; - play->startPlayerCutscene(play, &this->player, -1); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_NEG1); } } } else { @@ -1060,12 +1060,12 @@ void EnTest3_Update(Actor* thisx, PlayState* play2) { !((this->player.actor.category == ACTORCAT_PLAYER) && ((play->actorCtx.flags & ACTORCTX_FLAG_5) || (play->actorCtx.flags & ACTORCTX_FLAG_4)))) { if (this->player.csAction != PLAYER_CSACTION_5) { - play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_5); + play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_5); } play->actorCtx.flags &= ~ACTORCTX_FLAG_4; } else if (this->player.actor.category == ACTORCAT_PLAYER) { func_80A409D4(this, play); - } else if (play->startPlayerCutscene(play, &this->player, PLAYER_CSACTION_NONE)) { + } else if (play->tryPlayerCsAction(play, &this->player, PLAYER_CSACTION_NONE)) { if (this->unk_D88 >= 7) { Vec3f worldPos; diff --git a/src/overlays/actors/ovl_En_Test6/z_en_test6.c b/src/overlays/actors/ovl_En_Test6/z_en_test6.c index 6f1ed5090..bfa096a38 100644 --- a/src/overlays/actors/ovl_En_Test6/z_en_test6.c +++ b/src/overlays/actors/ovl_En_Test6/z_en_test6.c @@ -451,7 +451,7 @@ void EnTest6_StopInvertedSoTCutscene(EnTest6* this, PlayState* play) { player->actor.freezeTimer = 0; play->unk_18844 = false; CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]); - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); EnTest6_DisableMotionBlur(); Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME); Actor_Kill(&this->actor); @@ -615,30 +615,30 @@ void EnTest6_InvertedSoTCutscene(EnTest6* this, PlayState* play) { // Update Player Cutscene Animation if (this->screenFillAlpha != 0) { - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); } else { if (this->timer == 90) { // Look side-to-side but downwards, with chin down // gPlayerAnim_al_elf_tobidasi - func_800B7298(play, NULL, PLAYER_CSACTION_66); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_66); } if (this->timer == 70) { // close eyes and sway body in circles // gPlayerAnim_alink_yurayura - func_800B7298(play, NULL, PLAYER_CSACTION_82); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_82); } if (this->timer == 30) { // Look side-to-side but upwards, with chin up // gPlayerAnim_alink_kyoro - func_800B7298(play, NULL, PLAYER_CSACTION_81); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_81); } if (this->timer == 5) { // Give a big nod of approval // gPlayerAnim_al_yes - func_800B7298(play, NULL, PLAYER_CSACTION_74); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_74); } } @@ -705,7 +705,7 @@ void EnTest6_StopDoubleSoTCutscene(EnTest6* this, PlayState* play) { player->actor.freezeTimer = 0; play->unk_18844 = false; CutsceneManager_Stop(play->playerCsIds[PLAYER_CS_ID_SONG_WARP]); - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); EnTest6_DisableMotionBlur(); Distortion_RemoveRequest(DISTORTION_TYPE_SONG_OF_TIME); Actor_Kill(&this->actor); @@ -864,23 +864,23 @@ void EnTest6_DoubleSoTCutscene(EnTest6* this, PlayState* play) { break; case 98: - func_800B7298(play, NULL, PLAYER_CSACTION_64); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_64); break; case 68: - func_800B7298(play, NULL, PLAYER_CSACTION_65); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_65); break; case 52: - func_800B7298(play, NULL, PLAYER_CSACTION_88); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_88); break; case 43: - func_800B7298(play, NULL, PLAYER_CSACTION_114); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_114); break; case 38: - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); break; case 14: diff --git a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c index 81527654f..da37e9c17 100644 --- a/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c +++ b/src/overlays/actors/ovl_En_Time_Tag/z_en_time_tag.c @@ -301,7 +301,7 @@ void EnTimeTag_KickOut_Transition(EnTimeTag* this, PlayState* play) { */ void EnTimeTag_KickOut_WaitForTrigger(EnTimeTag* this, PlayState* play) { if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_WAIT) && !CHECK_WEEKEVENTREG(WEEKEVENTREG_KICKOUT_TIME_PASSED)) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); Message_StartTextbox(play, 0x1883 + TIMETAG_KICKOUT_GET_TEXT(&this->actor), NULL); this->actionFunc = EnTimeTag_KickOut_Transition; } @@ -334,7 +334,7 @@ void EnTimeTag_KickOut_WaitForTime(EnTimeTag* this, PlayState* play) { } } else if ((hour == TIMETAG_KICKOUT_HOUR(&this->actor)) && (minute == TIMETAG_KICKOUT_MINUTE(&this->actor)) && !Play_InCsMode(play)) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); Message_StartTextbox(play, 0x1883 + TIMETAG_KICKOUT_GET_TEXT(&this->actor), NULL); this->actionFunc = EnTimeTag_KickOut_Transition; } diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.c b/src/overlays/actors/ovl_En_Toto/z_en_toto.c index 672c79857..aae103cc1 100644 --- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c +++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c @@ -361,7 +361,7 @@ s32 func_80BA3ED4(EnToto* this, PlayState* play) { s32 func_80BA3EE8(EnToto* this, PlayState* play) { if (this->text->unk1 == 2) { - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); } return 0; } @@ -456,7 +456,7 @@ s32 func_80BA42BC(EnToto* this, PlayState* play) { Vec3s* end = &D_80BA510C[3]; func_80BA3FB0(this, play); - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); if (player->actor.world.pos.z > -310.0f) { if ((player->actor.world.pos.x > -150.0f) || (player->actor.world.pos.z > -172.0f)) { phi_s0 = 3; @@ -476,7 +476,7 @@ s32 func_80BA42BC(EnToto* this, PlayState* play) { s32 func_80BA43F4(EnToto* this, PlayState* play) { func_80BA3C88(this); if (func_80122760(play, &this->unk_2BC, 60.0f)) { - func_800B7298(play, NULL, PLAYER_CSACTION_19); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_19); return func_80BA4204(this, play); } return 0; @@ -484,7 +484,7 @@ s32 func_80BA43F4(EnToto* this, PlayState* play) { s32 func_80BA445C(EnToto* this, PlayState* play) { if (func_80BA4128(this, play)) { - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); return 1; } return 0; @@ -546,7 +546,7 @@ s32 func_80BA4530(EnToto* this, PlayState* play) { } s32 func_80BA46D8(EnToto* this, PlayState* play) { - func_800B7298(play, NULL, PLAYER_CSACTION_68); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_68); Message_DisplayOcarinaStaff(play, sOcarinaActionWindFishPrompts[CUR_FORM]); return 0; } @@ -603,7 +603,7 @@ s32 func_80BA47E0(EnToto* this, PlayState* play) { } s32 func_80BA49A4(EnToto* this, PlayState* play) { - func_800B7298(play, NULL, PLAYER_CSACTION_68); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_68); Audio_PlayFanfareWithPlayerIOCustomPort(NA_BGM_BALLAD_OF_THE_WIND_FISH, 4, this->unk2B3 ^ 0xF); this->unk2B1 = 4; return 0; @@ -623,7 +623,7 @@ s32 func_80BA4A00(EnToto* this, PlayState* play) { if (this->spotlights != NULL) { Actor_Kill(this->spotlights); } - func_800B7298(play, NULL, PLAYER_CSACTION_69); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_69); if (this->unk2B3 == 0xF) { if (CURRENT_DAY == 1) { SET_WEEKEVENTREG(WEEKEVENTREG_50_01); diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c index 6eaf13b70..cf43eeff6 100644 --- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c +++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c @@ -457,7 +457,7 @@ void EnWallmas_SetupTakePlayer(EnWallmas* this, PlayState* play) { this->actor.speed = 0.0f; this->actor.velocity.y = 0.0f; this->yTarget = this->actor.playerHeightRel; - func_800B724C(play, &this->actor, PLAYER_CSACTION_18); + Player_SetCsAction(play, &this->actor, PLAYER_CSACTION_18); } void EnWallmas_TakePlayer(EnWallmas* this, PlayState* play) { diff --git a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c index 21d9ff069..57153ea88 100644 --- a/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c +++ b/src/overlays/actors/ovl_En_Warp_tag/z_en_warp_tag.c @@ -97,10 +97,10 @@ void EnWarpTag_WaitForPlayer(EnWarptag* this, PlayState* play) { if (!Player_InCsMode(play) && (this->dyna.actor.xzDistToPlayer <= 30.0f) && (this->dyna.actor.playerHeightRel <= 10.0f)) { if (WARPTAG_GET_INVISIBLE(&this->dyna.actor)) { - func_800B7298(play, NULL, PLAYER_CSACTION_81); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_81); this->actionFunc = EnWarpTag_GrottoReturn; } else { - func_800B7298(play, NULL, PLAYER_CSACTION_15); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_15); this->actionFunc = EnWarpTag_RespawnPlayer; } } @@ -129,7 +129,7 @@ void EnWarpTag_Unused809C09A0(EnWarptag* this, PlayState* play) { */ void EnWarpTag_Unused809C0A20(EnWarptag* this, PlayState* play) { if (play->msgCtx.ocarinaMode == OCARINA_MODE_PLAYED_STORMS) { - func_800B7298(play, NULL, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_WAIT); this->actionFunc = EnWarpTag_RespawnPlayer; CutsceneManager_Stop(CutsceneManager_GetCurrentCsId()); diff --git a/src/overlays/actors/ovl_En_Zod/z_en_zod.c b/src/overlays/actors/ovl_En_Zod/z_en_zod.c index be2d1bc5a..b4227edee 100644 --- a/src/overlays/actors/ovl_En_Zod/z_en_zod.c +++ b/src/overlays/actors/ovl_En_Zod/z_en_zod.c @@ -480,7 +480,7 @@ void func_80BAFDB4(EnZod* this, PlayState* play) { EnZod_UpdateAnimation(this); if (CutsceneManager_IsNext(this->actor.csId)) { CutsceneManager_Start(this->actor.csId, &this->actor); - func_800B7298(play, NULL, PLAYER_CSACTION_68); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_68); Message_StartTextbox(play, 0x103A, &this->actor); this->actionFunc = EnZod_SetupRehearse; } else { diff --git a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c index 60eacb8f9..347b6b91e 100644 --- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c +++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c @@ -593,7 +593,7 @@ void func_809381C4(ObjBean* this, PlayState* play) { if (CutsceneManager_IsNext(this->dyna.actor.csId)) { CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor); if (this->dyna.actor.csId >= 0) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_1); } this->unk_1E4 = 2; func_80938284(this); @@ -750,7 +750,7 @@ void func_80938780(ObjBean* this, PlayState* play) { if (CutsceneManager_IsNext(this->dyna.actor.csId)) { CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor); if (this->dyna.actor.csId >= 0) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_1); } this->unk_1B4 = 36; func_80937130(this); diff --git a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c index fdbc54e5c..6544e67ea 100644 --- a/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c +++ b/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.c @@ -495,7 +495,7 @@ void func_8098E0B8(ObjComb* this, PlayState* play) { if ((this->unk_1B4 == 10) && (this->unk_1B6 != 0) && (this->unk_1B5 == 2) && (this->actor.csId >= 0)) { if (CutsceneManager_GetCurrentCsId() == this->actor.csId) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_4); } } } @@ -529,7 +529,7 @@ void ObjComb_Update(Actor* thisx, PlayState* play) { if (CutsceneManager_IsNext(this->actor.csId)) { CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); if (this->actor.csId >= 0) { - func_800B7298(play, &this->actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_1); } if (((OBJCOMB_GET_8000(&this->actor) | OBJCOMB_GET_80(&this->actor)) == 1) && diff --git a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c index 9b9a30010..251d6d2cd 100644 --- a/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c +++ b/src/overlays/actors/ovl_Obj_Iceblock/z_obj_iceblock.c @@ -1209,7 +1209,7 @@ void func_80A25FD4(ObjIceblock* this, PlayState* play) { func_80A23370(this, sp2C); func_80A260E8(this); sp30 = false; - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); this->unk_1B0 |= 1; } @@ -1255,7 +1255,7 @@ void func_80A26144(ObjIceblock* this, PlayState* play) { if ((this->unk_1B0 & 1) && (isBool || sp28 || (this->dyna.actor.xzDistToPlayer > 400.0f))) { this->unk_1B0 &= ~1; - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); } if (isBool) { @@ -1454,7 +1454,7 @@ void ObjIceblock_Update(Actor* thisx, PlayState* play) { this->unk_1B0 &= ~0x100; if (this->unk_1B0 & 1) { this->unk_1B0 &= ~1; - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); } func_80A266C4(this); } diff --git a/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c b/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c index 9a1b309ca..992b9c5a9 100644 --- a/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c +++ b/src/overlays/actors/ovl_Obj_Makekinsuta/z_obj_makekinsuta.c @@ -130,7 +130,7 @@ void func_8099FD7C(Actor* thisx, PlayState* play) { if (CutsceneManager_IsNext(thisx->csId)) { CutsceneManager_StartWithPlayerCs(thisx->csId, thisx); if (thisx->csId >= 0) { - func_800B7298(play, thisx, PLAYER_CSACTION_4); + Player_SetCsActionWithHaltedActors(play, thisx, PLAYER_CSACTION_4); } func_8099FB64(thisx, play); thisx->update = Actor_Noop; diff --git a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c index 0a951b0fe..d99c041e0 100644 --- a/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c +++ b/src/overlays/actors/ovl_Obj_Skateblock/z_obj_skateblock.c @@ -535,7 +535,7 @@ void func_80A22334(ObjSkateblock* this, PlayState* play) { func_80A21C88(this, sp2C); func_80A2244C(this); sp30 = false; - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_WAIT); this->unk_1C1 |= 1; } @@ -591,7 +591,7 @@ void func_80A224A4(ObjSkateblock* this, PlayState* play) { if ((this->unk_1C1 & 1) && (sp24 || sp28 || (this->dyna.actor.xzDistToPlayer > 400.0f))) { this->unk_1C1 &= ~1; - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_END); } func_80A21F74(this, play); diff --git a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c index 2df0a57af..252952586 100644 --- a/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c +++ b/src/overlays/actors/ovl_Obj_Spidertent/z_obj_spidertent.c @@ -679,7 +679,7 @@ void func_80B30A4C(ObjSpidertent* this, PlayState* play) { if (CutsceneManager_IsNext(this->dyna.actor.csId)) { CutsceneManager_StartWithPlayerCs(this->dyna.actor.csId, &this->dyna.actor); if (this->dyna.actor.csId >= 0) { - func_800B7298(play, &this->dyna.actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, &this->dyna.actor, PLAYER_CSACTION_1); } Flags_SetSwitch(play, OBJSPIDERTENT_GET_SWITCH_FLAG(&this->dyna.actor)); func_80B30AD4(this); diff --git a/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c b/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c index 72192320c..ba576b3b4 100644 --- a/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c +++ b/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.c @@ -79,7 +79,7 @@ void func_808A7AAC(ObjWturn* this, PlayState* play) { CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); Play_EnableMotionBlur(140); this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId); - func_800B7298(play, &this->actor, PLAYER_CSACTION_21); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_21); subCamAt.x = player->actor.focus.pos.x; subCamAt.z = player->actor.focus.pos.z; subCamAt.y = player->actor.focus.pos.y; @@ -103,7 +103,7 @@ void func_808A7C04(ObjWturn* this, PlayState* play) { this->actor.world.pos.y += this->actor.playerHeightRel; player->actor.shape.shadowAlpha = 0; - func_800B7298(play, &this->actor, PLAYER_CSACTION_84); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_84); Player_PlaySfx(player, NA_SE_VO_NAVY_ENEMY); this->unk_14A = 0; Play_DisableMotionBlur(); diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 75923376a..38f62b2b0 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -52,7 +52,7 @@ void Player_Update(Actor* thisx, PlayState* play); void Player_Draw(Actor* thisx, PlayState* play); s32 Player_GrabPlayer(PlayState* play, Player* this); -s32 func_8085B28C(PlayState* play, Player* this, PlayerCsAction csAction); +s32 Player_TryCsAction(PlayState* play, Player* this, PlayerCsAction csAction); void func_8085B384(Player* this, PlayState* play); s32 Player_InflictDamage(PlayState* play, s32 damage); void Player_TalkWithPlayer(PlayState* play, Actor* actor); @@ -207,7 +207,7 @@ void Player_Action_93(Player* this, PlayState* play); void Player_Action_94(Player* this, PlayState* play); void Player_Action_95(Player* this, PlayState* play); void Player_Action_96(Player* this, PlayState* play); -void Player_Action_97(Player* this, PlayState* play); +void Player_Action_CsAction(Player* this, PlayState* play); s32 Player_UpperAction_0(Player* this, PlayState* play); s32 Player_UpperAction_1(Player* this, PlayState* play); @@ -7282,11 +7282,17 @@ void Player_StopCutscene(Player* this) { } } -s32 func_808387A0(PlayState* play, Player* this) { +/** + * @brief If appropriate, setup action for performing a `csAction` + * + * @return true if a `csAction` is started, false if not + */ +s32 Player_StartCsAction(PlayState* play, Player* this) { if (this->unk_AA5 == PLAYER_UNKAA5_4) { Player_StopCutscene(this); this->actor.flags &= ~ACTOR_FLAG_TALK_REQUESTED; - Player_SetAction(play, this, Player_Action_97, 0); + Player_SetAction(play, this, Player_Action_CsAction, 0); + if (this->cv.haltActorsDuringCsAction) { this->stateFlags1 |= PLAYER_STATE1_20000000; } @@ -7470,7 +7476,7 @@ s32 Player_ActionChange_13(Player* this, PlayState* play) { func_80833AA0(this, play); return true; } - if (!func_808387A0(play, this)) { + if (!Player_StartCsAction(play, this)) { if (this->unk_AA5 == PLAYER_UNKAA5_5) { if ((this->itemAction >= PLAYER_IA_MASK_MIN) && (this->itemAction <= PLAYER_IA_MASK_MAX)) { PlayerMask maskId = GET_MASK_FROM_IA(this->itemAction); @@ -8411,7 +8417,7 @@ s32 func_8083B3B4(PlayState* play, Player* this, Input* input) { ((ABS_ALT(this->unk_AAA) < 0x2EE0) && (this->currentBoots < PLAYER_BOOTS_ZORA_UNDERWATER) && ((s32)SurfaceType_GetConveyorSpeed(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId) <= CONVEYOR_SPEED_SLOW))))) { - if (Player_Action_97 != this->actionFunc) { + if (Player_Action_CsAction != this->actionFunc) { Player_SetAction(play, this, Player_Action_59, 0); } @@ -10328,7 +10334,7 @@ s32 func_80840A30(PlayState* play, Player* this, f32* arg2, f32 arg3) { } s32 func_80840CD4(Player* this, PlayState* play) { - if (func_808387A0(play, this)) { + if (Player_StartCsAction(play, this)) { this->stateFlags2 |= PLAYER_STATE2_20000; } else if (!CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_B)) { PlayerMeleeWeaponAnimation meleeWeaponAnim; @@ -10645,7 +10651,7 @@ void Player_Init(Actor* thisx, PlayState* play) { play->unk_18770 = func_8085B170; play->startPlayerFishing = Player_StartFishing; play->grabPlayer = Player_GrabPlayer; - play->startPlayerCutscene = func_8085B28C; + play->tryPlayerCsAction = Player_TryCsAction; play->func_18780 = func_8085B384; play->damagePlayer = Player_InflictDamage; play->talkWithPlayer = Player_TalkWithPlayer; @@ -10741,7 +10747,7 @@ void Player_Init(Actor* thisx, PlayState* play) { } if ((this->csAction == PLAYER_CSACTION_9) || (this->csAction == PLAYER_CSACTION_93)) { - Player_SetAction(play, this, Player_Action_97, 0); + Player_SetAction(play, this, Player_Action_CsAction, 0); this->stateFlags1 |= PLAYER_STATE1_20000000; } else { Player_SetAction(play, this, Player_Action_87, 0); @@ -10779,7 +10785,7 @@ void Player_Init(Actor* thisx, PlayState* play) { if (this->actor.shape.rot.x != 0) { this->actor.shape.rot.x = 0; this->csAction = PLAYER_CSACTION_68; - Player_SetAction(play, this, Player_Action_97, 0); + Player_SetAction(play, this, Player_Action_CsAction, 0); this->stateFlags1 |= PLAYER_STATE1_20000000; return; } @@ -12143,12 +12149,12 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { if (!(this->stateFlags2 & PLAYER_STATE2_80) && (this->actor.id == ACTOR_PLAYER)) { if ((play->csCtx.playerCue != NULL) && (sPlayerCueToCsActionMap[play->csCtx.playerCue->id] != PLAYER_CSACTION_NONE)) { - func_800B7298(play, NULL, PLAYER_CSACTION_5); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_5); Player_StopHorizontalMovement(this); } else if (((u32)this->csAction == PLAYER_CSACTION_NONE) && !(this->stateFlags2 & (PLAYER_STATE2_400 | PLAYER_STATE2_8000000)) && (play->csCtx.state != CS_STATE_STOP)) { - func_800B7298(play, NULL, PLAYER_CSACTION_20); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_20); Player_StopHorizontalMovement(this); } } @@ -12159,14 +12165,14 @@ void Player_UpdateCommon(Player* this, PlayState* play, Input* input) { if ((this->csAction != PLAYER_CSACTION_END) || !(this->stateFlags1 & (PLAYER_STATE1_4 | PLAYER_STATE1_2000 | PLAYER_STATE1_4000 | PLAYER_STATE1_200000 | PLAYER_STATE1_4000000))) { - if (Player_Action_97 != this->actionFunc) { + if (Player_Action_CsAction != this->actionFunc) { this->unk_AA5 = PLAYER_UNKAA5_4; if (this->csAction == PLAYER_CSACTION_5) { - func_808387A0(play, this); + Player_StartCsAction(play, this); func_8082DAD4(this); } } - } else if (Player_Action_97 != this->actionFunc) { + } else if (Player_Action_CsAction != this->actionFunc) { Player_CsAction_End(play, this, NULL); } } else { @@ -13190,7 +13196,7 @@ s32 func_808482E0(PlayState* play, Player* this) { play->transitionType = TRANS_TYPE_FADE_WHITE; gSaveContext.nextTransitionType = TRANS_TYPE_FADE_WHITE; this->stateFlags1 &= ~PLAYER_STATE1_20000000; - func_8085B28C(play, NULL, PLAYER_CSACTION_WAIT); + Player_TryCsAction(play, NULL, PLAYER_CSACTION_WAIT); } this->getItemId = GI_NONE; } @@ -15497,7 +15503,7 @@ void Player_Action_44(Player* this, PlayState* play) { func_80837BD0(play, this); this->av2.actionVar2 = sp44; - } else if (!func_80847994(play, this) && !func_80847880(play, this) && !func_808387A0(play, this) && + } else if (!func_80847994(play, this) && !func_80847880(play, this) && !Player_StartCsAction(play, this) && ((this->talkActor != this->interactRangeActor) || !Player_ActionChange_2(this, play))) { if (func_801242B4(this)) { func_808353DC(play, this); @@ -16898,7 +16904,7 @@ void Player_Action_63(Player* this, PlayState* play) { if (actor != NULL) { this->stateFlags1 &= ~PLAYER_STATE1_20000000; this->csAction = PLAYER_CSACTION_NONE; - func_8085B28C(play, NULL, PLAYER_CSACTION_19); + Player_TryCsAction(play, NULL, PLAYER_CSACTION_19); this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000; } else { func_80836A5C(this, play); @@ -16984,7 +16990,7 @@ void Player_Action_65(Player* this, PlayState* play) { Player_StopCutscene(this); func_80848250(play, this); this->stateFlags1 &= ~PLAYER_STATE1_20000000; - func_8085B28C(play, NULL, PLAYER_CSACTION_93); + Player_TryCsAction(play, NULL, PLAYER_CSACTION_93); } else { s32 var_a2 = ((this->talkActor != NULL) && (this->exchangeItemAction <= PLAYER_IA_MINUS1)) || (this->stateFlags3 & PLAYER_STATE3_20); @@ -17515,10 +17521,10 @@ void Player_Action_73(Player* this, PlayState* play) { void func_80859CE0(PlayState* play, Player* this, s32 arg2); void Player_Action_74(Player* this, PlayState* play) { - if ((DECR(this->av2.actionVar2) == 0) && func_808387A0(play, this)) { + if ((DECR(this->av2.actionVar2) == 0) && Player_StartCsAction(play, this)) { func_80859CE0(play, this, 0); - Player_SetAction(play, this, Player_Action_97, 0); - Player_Action_97(this, play); + Player_SetAction(play, this, Player_Action_CsAction, 0); + Player_Action_CsAction(this, play); } } @@ -19799,7 +19805,7 @@ void Player_CsAction_2(PlayState* play, Player* this, CsCmdActorCue* cue) { } if ((this->csAction == PLAYER_CSACTION_20) && (play->csCtx.state == CS_STATE_IDLE)) { - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); } else if (this->stateFlags1 & PLAYER_STATE1_8000000) { func_80859300(play, this, 0); this->actor.velocity.y = 0.0f; @@ -20358,7 +20364,7 @@ void Player_CsAction_48(PlayState* play, Player* this, CsCmdActorCue* cue) { if (sPlayerCueToCsActionMap[this->cueId] != PLAYER_CSACTION_16) { this->csAction = PLAYER_CSACTION_END; - func_800B7298(play, NULL, PLAYER_CSACTION_END); + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_END); this->cueId = PLAYER_CUEID_NONE; Player_StopHorizontalMovement(this); return; @@ -20408,7 +20414,7 @@ void Player_CsAction_48(PlayState* play, Player* this, CsCmdActorCue* cue) { } } -void Player_Action_97(Player* this, PlayState* play) { +void Player_Action_CsAction(Player* this, PlayState* play) { if (this->csAction != this->prevCsAction) { D_80862B6C = this->skelAnime.moveFlags; func_8082E794(this); @@ -20453,7 +20459,7 @@ s32 Player_GrabPlayer(PlayState* play, Player* this) { return false; } -s32 func_8085B28C(PlayState* play, Player* this, PlayerCsAction csAction) { +s32 Player_TryCsAction(PlayState* play, Player* this, PlayerCsAction csAction) { Player* player = GET_PLAYER(play); if (this != NULL) { @@ -20461,7 +20467,9 @@ s32 func_8085B28C(PlayState* play, Player* this, PlayerCsAction csAction) { return Player_Action_36 == this->actionFunc; } + // Specific to Kafei, any negative csAction works if ((this->actor.id == ACTOR_EN_TEST3) && (csAction < 0)) { + // PLAYER_CSACTION_NEG1 func_8083B0E4(play, this, this->actor.home.rot.y); return false; } @@ -20473,7 +20481,7 @@ s32 func_8085B28C(PlayState* play, Player* this, PlayerCsAction csAction) { if ((player->actor.id == ACTOR_EN_TEST3) || !Player_InBlockingCsMode(play, player)) { func_8082DE50(play, player); - Player_SetAction(play, player, Player_Action_97, 0); + Player_SetAction(play, player, Player_Action_CsAction, 0); player->csAction = csAction; player->csActor = &this->actor; func_8082DAD4(player); @@ -20522,7 +20530,7 @@ void Player_TalkWithPlayer(PlayState* play, Actor* actor) { player->lockOnActor = actor; if (actor->textId == 0xFFFF) { - func_800B7298(play, actor, PLAYER_CSACTION_1); + Player_SetCsActionWithHaltedActors(play, actor, PLAYER_CSACTION_1); actor->flags |= ACTOR_FLAG_TALK_REQUESTED; func_8082DE14(play, player); } else { diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 9f816e5c8..e93ec53ae 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -744,8 +744,8 @@ 0x800B71DC:("Actor_MountHorse",), 0x800B7200:("func_800B7200",), 0x800B722C:("Actor_SpawnHorse",), - 0x800B724C:("func_800B724C",), - 0x800B7298:("func_800B7298",), + 0x800B724C:("Player_SetCsAction",), + 0x800B7298:("Player_SetCsActionWithHaltedActors",), 0x800B72E0:("func_800B72E0",), 0x800B72F8:("func_800B72F8",), 0x800B7320:("Player_IsFacingActor",), @@ -4465,7 +4465,7 @@ 0x8083827C:("func_8083827C",), 0x8083868C:("func_8083868C",), 0x80838760:("Player_StopCutscene",), - 0x808387A0:("func_808387A0",), + 0x808387A0:("Player_StartCsAction",), 0x80838830:("func_80838830",), 0x808388B8:("func_808388B8",), 0x808389BC:("func_808389BC",), @@ -4874,11 +4874,11 @@ 0x8085AC9C:("func_8085AC9C",), 0x8085AD5C:("func_8085AD5C",), 0x8085ADA0:("Player_CsAction_48",), - 0x8085B08C:("Player_Action_97",), + 0x8085B08C:("Player_Action_CsAction",), 0x8085B134:("Player_StartFishing",), 0x8085B170:("func_8085B170",), 0x8085B1F0:("Player_GrabPlayer",), - 0x8085B28C:("func_8085B28C",), + 0x8085B28C:("Player_TryCsAction",), 0x8085B384:("func_8085B384",), 0x8085B3E0:("Player_InflictDamage",), 0x8085B460:("Player_TalkWithPlayer",), diff --git a/tools/namefixer.py b/tools/namefixer.py index 3a1fc4683..65ce23846 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -114,6 +114,8 @@ wordReplace = { "func_8012405C": "Player_HasMirrorShieldEquipped", "func_80124088": "Player_IsHoldingMirrorShield", "func_8012697C": "Player_DrawGetItem", + "func_800B724C": "Player_SetCsAction", + "func_800B7298": "Player_SetCsActionWithHaltedActors", "Actor_SpawnWithParentAndCutscene": "Actor_SpawnAsChildAndCutscene", "Actor_SpawnWithParent": "Actor_SpawnAsChild", "Actor_IsLinkFacingActor": "Player_IsFacingActor", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 4430810d3..e18a940c3 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -258,8 +258,8 @@ asm/non_matchings/code/z_actor/Actor_SetCameraHorseSetting.s,Actor_SetCameraHors asm/non_matchings/code/z_actor/Actor_MountHorse.s,Actor_MountHorse,0x800B71DC,0x9 asm/non_matchings/code/z_actor/func_800B7200.s,func_800B7200,0x800B7200,0xB asm/non_matchings/code/z_actor/Actor_SpawnHorse.s,Actor_SpawnHorse,0x800B722C,0x8 -asm/non_matchings/code/z_actor/func_800B724C.s,func_800B724C,0x800B724C,0x13 -asm/non_matchings/code/z_actor/func_800B7298.s,func_800B7298,0x800B7298,0x12 +asm/non_matchings/code/z_actor/Player_SetCsAction.s,Player_SetCsAction,0x800B724C,0x13 +asm/non_matchings/code/z_actor/Player_SetCsActionWithHaltedActors.s,Player_SetCsActionWithHaltedActors,0x800B7298,0x12 asm/non_matchings/code/z_actor/func_800B72E0.s,func_800B72E0,0x800B72E0,0x6 asm/non_matchings/code/z_actor/func_800B72F8.s,func_800B72F8,0x800B72F8,0xA asm/non_matchings/code/z_actor/Player_IsFacingActor.s,Player_IsFacingActor,0x800B7320,0x16 From 5b4fddf16e3564a6703bc7601495365d5e57a3b9 Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo Nitti <96613413+sonicdcer@users.noreply.github.com> Date: Sun, 5 Nov 2023 20:48:19 -0300 Subject: [PATCH 05/28] Fix Camera_Update fake, match Play_UpdateMain & Play_DrawMain NON_MATCHINGs (#1463) * Fix Camera_Update fake, match Play_UpdateMain & Play_DrawMain NON_MATCHINGS * remove unnecessary parenthesis * extra parenthesis * review * NUM_CAMS --- include/functions.h | 2 +- src/code/z_camera.c | 15 +++++---------- src/code/z_play.c | 46 ++++++++++++++++++--------------------------- 3 files changed, 24 insertions(+), 39 deletions(-) diff --git a/include/functions.h b/include/functions.h index 9d4e9617d..84c6c0615 100644 --- a/include/functions.h +++ b/include/functions.h @@ -471,7 +471,7 @@ void Camera_EarthquakeDay3(Camera* camera); s32 Camera_UpdateHotRoom(Camera* camera); s32 Camera_SetSwordDistortion(Camera* camera); s32 Camera_RequestGiantsMaskSetting(Camera* camera); -Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera); +Vec3s Camera_Update(Camera* camera); s32 func_800DF498(Camera* camera); s32 Camera_ChangeModeFlags(Camera* camera, s16 mode, u8 forceChange); s32 Camera_ChangeMode(Camera* camera, s16 mode); diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 36ce7e581..a64793632 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -7368,7 +7368,7 @@ s32 Camera_RequestGiantsMaskSetting(Camera* camera) { } } -Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) { +Vec3s Camera_Update(Camera* camera) { Vec3f viewAt; Vec3f viewEye; Vec3f viewUp; @@ -7392,8 +7392,7 @@ Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) { // Camera of status CUT only updates to this point if (camera->status == CAM_STATUS_CUT) { - *inputDir = camera->inputDir; - return inputDir; + return camera->inputDir; } sUpdateCameraDirection = false; @@ -7537,8 +7536,7 @@ Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) { // Camera of status WAIT only updates to this point if (camera->status == CAM_STATUS_WAIT) { - *inputDir = camera->inputDir; - return inputDir; + return camera->inputDir; } camera->behaviorFlags = 0; @@ -7568,8 +7566,7 @@ Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) { // Camera of status UNK3 only updates to this point if (camera->status == CAM_STATUS_UNK3) { - *inputDir = camera->inputDir; - return inputDir; + return camera->inputDir; } /** @@ -7627,9 +7624,7 @@ Vec3s* Camera_Update(Vec3s* inputDir, Camera* camera) { camera->inputDir.z = 0; } - *inputDir = camera->inputDir; - - return inputDir; + return camera->inputDir; } s32 func_800DF498(Camera* camera) { diff --git a/src/code/z_play.c b/src/code/z_play.c index 0f506c5fe..709b128ae 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -916,12 +916,11 @@ const char D_801DFA34[][4] = { "h", "i", "f", "fa", "fb", "fc", "fd", "fe", "ff", "fg", "fh", "fi", "fj", "fk", }; -#ifdef NON_MATCHING -// Stack issues void Play_UpdateMain(PlayState* this) { + s32 pad; Input* input = this->state.input; - u8 freezeFlashTimer; s32 sp5C = false; + u8 freezeFlashTimer; gSegments[4] = OS_K0_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.mainKeepSlot].segment); gSegments[5] = OS_K0_TO_PHYSICAL(this->objectCtx.slots[this->objectCtx.subKeepSlot].segment); @@ -933,6 +932,7 @@ void Play_UpdateMain(PlayState* this) { Play_TakePictoPhoto(&this->pauseBgPreRender); R_PICTO_PHOTO_STATE = PICTO_PHOTO_STATE_OFF; } + Actor_SetMovementScale(this->state.framerateDivisor); if (FrameAdvance_Update(&this->frameAdvCtx, &input[1])) { @@ -960,7 +960,9 @@ void Play_UpdateMain(PlayState* this) { break; } } + Play_UpdateTransition(this); + if (gTransitionTileState != TRANS_TILE_READY) { if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (((this->msgCtx.msgMode == MSGMODE_NONE)) || @@ -979,6 +981,7 @@ void Play_UpdateMain(PlayState* this) { if (!sp5C && (IREG(72) == 0)) { this->gameplayFrames++; Rumble_SetUpdateEnabled(true); + if ((this->actorCtx.freezeFlashTimer != 0) && (this->actorCtx.freezeFlashTimer-- < 5)) { freezeFlashTimer = this->actorCtx.freezeFlashTimer; if ((freezeFlashTimer > 0) && ((freezeFlashTimer % 2) != 0)) { @@ -1028,16 +1031,15 @@ void Play_UpdateMain(PlayState* this) { } if (!sp5C || gDbgCamEnabled) { - s32 sp54; // camId - Vec3s sp48; // InputDir + s32 i; this->nextCamera = this->activeCamId; - for (sp54 = 0; sp54 < 4; sp54++) { - if ((sp54 != this->nextCamera) && (this->cameraPtrs[sp54] != NULL)) { - Camera_Update(&sp48, this->cameraPtrs[sp54]); + for (i = 0; i < NUM_CAMS; i++) { + if ((i != this->nextCamera) && (this->cameraPtrs[i] != NULL)) { + Camera_Update(this->cameraPtrs[i]); } } - Camera_Update(&sp48, this->cameraPtrs[this->nextCamera]); + Camera_Update(this->cameraPtrs[this->nextCamera]); } if (!sp5C) { @@ -1056,10 +1058,6 @@ void Play_UpdateMain(PlayState* this) { } } } -#else -void Play_UpdateMain(PlayState* this); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_UpdateMain.s") -#endif void Play_Update(PlayState* this) { if (!sBombersNotebookOpen) { @@ -1129,13 +1127,12 @@ void Play_PostWorldDraw(PlayState* this) { } } -#ifdef NON_MATCHING -// Something weird going on with the stack of the unused arg0 of `Camera_Update` void Play_DrawMain(PlayState* this) { GraphicsContext* gfxCtx = this->state.gfxCtx; Lights* sp268; - Vec3f sp25C; + Vec3f temp; u8 sp25B = false; + f32 var_fv0; // zFar if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_UNK4) { PreRender_ApplyFiltersSlowlyDestroy(&this->pauseBgPreRender); @@ -1172,7 +1169,6 @@ void Play_DrawMain(PlayState* this) { gSPSegment(OVERLAY_DISP++, 0x02, this->sceneSegment); if (1) { - f32 var_fv0; // zFar ShrinkWindow_Draw(gfxCtx); @@ -1341,10 +1337,10 @@ void Play_DrawMain(PlayState* this) { if (1) { if (!this->envCtx.sunDisabled) { - sp25C.x = this->view.eye.x + this->envCtx.sunPos.x; - sp25C.y = this->view.eye.y + this->envCtx.sunPos.y; - sp25C.z = this->view.eye.z + this->envCtx.sunPos.z; - Environment_DrawSunLensFlare(this, &this->envCtx, &this->view, gfxCtx, sp25C); + temp.x = this->view.eye.x + this->envCtx.sunPos.x; + temp.y = this->view.eye.y + this->envCtx.sunPos.y; + temp.z = this->view.eye.z + this->envCtx.sunPos.z; + Environment_DrawSunLensFlare(this, &this->envCtx, &this->view, gfxCtx, temp); } Environment_DrawCustomLensFlare(this); @@ -1431,9 +1427,7 @@ void Play_DrawMain(PlayState* this) { SkipPostWorldDraw: if ((this->view.unk164 != 0) && !gDbgCamEnabled) { - Vec3s sp4C; - - Camera_Update(&sp4C, GET_ACTIVE_CAM(this)); + Camera_Update(GET_ACTIVE_CAM(this)); View_UpdateViewingMatrix(&this->view); this->view.unk164 = 0; if ((this->skyboxId != SKYBOX_NONE) && !this->envCtx.skyboxDisabled) { @@ -1447,10 +1441,6 @@ SkipPostWorldDraw: CLOSE_DISPS(gfxCtx); } -#else -void Play_DrawMain(PlayState* this); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_play/Play_DrawMain.s") -#endif void Play_Draw(PlayState* this) { GraphicsContext* gfxCtx = this->state.gfxCtx; From ddb63dcec217104580cced6bf00a88ef91f5563f Mon Sep 17 00:00:00 2001 From: mzxrules Date: Mon, 6 Nov 2023 07:02:52 -0500 Subject: [PATCH 06/28] z_hono_trap OK (#1437) * match first couple of funcs * Attempt all functions * add flags, func_80930190 OK * z_en_honotrap OK * clean things up * implement most suggestions * space out OPEN/CLOSE_DISP * more improvements * implement suggestions * implement alf suggestions * u substitution * nitpicky * format --- spec | 5 +- .../actors/ovl_En_Honotrap/z_en_honotrap.c | 797 ++++++++++++++++-- .../actors/ovl_En_Honotrap/z_en_honotrap.h | 41 +- 3 files changed, 760 insertions(+), 83 deletions(-) diff --git a/spec b/spec index 0cf255dea..ab0bf4a69 100644 --- a/spec +++ b/spec @@ -655,7 +655,7 @@ beginseg include "build/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.o" #ifdef NON_MATCHING include "build/src/overlays/gamestates/ovl_file_choose/ovl_file_choose_reloc.o" - #else + #else include "build/data/ovl_file_choose/ovl_file_choose.reloc.o" #endif endseg @@ -1339,8 +1339,7 @@ beginseg name "ovl_En_Honotrap" compress include "build/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.o" - include "build/data/ovl_En_Honotrap/ovl_En_Honotrap.data.o" - include "build/data/ovl_En_Honotrap/ovl_En_Honotrap.reloc.o" + include "build/src/overlays/actors/ovl_En_Honotrap/ovl_En_Honotrap_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c index bcc83766a..a1a7af60e 100644 --- a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c +++ b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c @@ -5,32 +5,74 @@ */ #include "z_en_honotrap.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" +#include "assets/objects/gameplay_dangeon_keep/gameplay_dangeon_keep.h" #define FLAGS (ACTOR_FLAG_10) -#define THIS ((EnHonotrap*)thisx) +#define HONOTRAP_AT_ACTIVE (1 << 0) +#define HONOTRAP_AC_ACTIVE (1 << 1) +#define HONOTRAP_OC_ACTIVE (1 << 2) + +typedef enum { + /* 0 */ HONOTRAP_EYE_OPEN, + /* 1 */ HONOTRAP_EYE_HALF, + /* 2 */ HONOTRAP_EYE_CLOSE, + /* 3 */ HONOTRAP_EYE_SHUT, + /* 4 */ HONOTRAP_EYE_MAX +} EnHonotrapEyeState; void EnHonotrap_Init(Actor* thisx, PlayState* play); void EnHonotrap_Destroy(Actor* thisx, PlayState* play); void EnHonotrap_Update(Actor* thisx, PlayState* play); void EnHonotrap_Draw(Actor* thisx, PlayState* play); -void func_8092EBDC(EnHonotrap* this, PlayState* play); -void func_8092ECF0(EnHonotrap* this, PlayState* play); -void func_8092EDD8(EnHonotrap* this, PlayState* play); -void func_8092EE1C(EnHonotrap* this, PlayState* play); -void func_8092EE90(EnHonotrap* this, PlayState* play); -void func_8092EF98(EnHonotrap* this, PlayState* play); -void func_8092F074(EnHonotrap* this, PlayState* play); -void func_8092F0B8(EnHonotrap* this, PlayState* play); -void func_8092F10C(EnHonotrap* this, PlayState* play); -void func_8092F208(EnHonotrap* this, PlayState* play); -void func_8092F3D8(EnHonotrap* this, PlayState* play); -void func_8092F5EC(EnHonotrap* this, PlayState* play); -void func_8092F7BC(EnHonotrap* this, PlayState* play); -void func_8092F878(EnHonotrap* this, PlayState* play); +void EnHonotrap_GetNormal(Vec3f* normal, Vec3f* vec); +void EnHonotrap_InitEye(EnHonotrap* this, PlayState* play); +void EnHonotrap_InitFlame(EnHonotrap* this, PlayState* play); +void EnHonotrap_InitFlameGroup(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeIdle(EnHonotrap* this); +void EnHonotrap_EyeIdle(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeOpen(EnHonotrap* this); +void EnHonotrap_EyeOpen(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeAttack(EnHonotrap* this); +void EnHonotrap_EyeAttack(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeClose(EnHonotrap* this); +void EnHonotrap_EyeClose(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeIdle2(EnHonotrap* this); +void EnHonotrap_EyeIdle2(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeOpen2(EnHonotrap* this); +void EnHonotrap_EyeOpen2(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeAttack2(EnHonotrap* this); +void EnHonotrap_EyeAttack2(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupEyeClose2(EnHonotrap* this); +void EnHonotrap_EyeClose2(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupFlameGrow(EnHonotrap* this); +void EnHonotrap_FlameGrow(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupFlameDrop(EnHonotrap* this); +void EnHonotrap_FlameDrop(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupFlameMove(EnHonotrap* this); +void EnHonotrap_FlameMove(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupFlameChase(EnHonotrap* this); +void EnHonotrap_FlameChase(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupFlameVanish(EnHonotrap* this); +void EnHonotrap_FlameVanish(EnHonotrap* this, PlayState* play); +void EnHonotrap_SetupFlameGroup(EnHonotrap* this); +void EnHonotrap_FlameGroup(EnHonotrap* this, PlayState* play); +void EnHonotrap_UpdateFlame(Actor* thisx, PlayState* play); +void EnHonotrap_UpdateFlameGroup(Actor* thisx, PlayState* play); +void EnHonotrap_DrawFlame(Actor* thisx, PlayState* play); +void EnHonotrap_DrawFlameGroup(Actor* thisx, PlayState* play); + +static TexturePtr sSilverEyeTextures[HONOTRAP_EYE_MAX] = { + gEyeSwitchSilverOpenTex, + gEyeSwitchSilverHalfTex, + gEyeSwitchSilverClosedTex, + gEyeSwitchSilverClosedTex, +}; + +static s32 sIsFirstInitEye = true; -#if 0 ActorInit En_Honotrap_InitVars = { /**/ ACTOR_EN_HONOTRAP, /**/ ACTORCAT_PROP, @@ -43,127 +85,724 @@ ActorInit En_Honotrap_InitVars = { /**/ EnHonotrap_Draw, }; -// static ColliderTrisElementInit sTrisElementsInit[2] = { -static ColliderTrisElementInit D_80930424[2] = { +static ColliderTrisElementInit sTrisElementsInit[] = { { - { ELEMTYPE_UNK4, { 0x00000000, 0x00, 0x00 }, { 0x00003820, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, }, + { + ELEMTYPE_UNK4, + { 0x00000000, 0x00, 0x00 }, + { 0x00003820, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_NONE, + }, { { { 0.0f, 23.0f, 8.5f }, { -23.0f, 0.0f, 8.5f }, { 0.0f, -23.0f, 8.5f } } }, }, { - { ELEMTYPE_UNK4, { 0x00000000, 0x00, 0x00 }, { 0x00003820, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, }, + { + ELEMTYPE_UNK4, + { 0x00000000, 0x00, 0x00 }, + { 0x00003820, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_NONE, + }, { { { 0.0f, 23.0f, 8.5f }, { 0.0f, -23.0f, 8.5f }, { 23.0f, 0.0f, 8.5f } } }, }, }; -// static ColliderTrisInit sTrisInit = { -static ColliderTrisInit D_8093049C = { - { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_TRIS, }, - ARRAY_COUNT(sTrisElementsInit), D_80930424, // sTrisElementsInit, +static ColliderTrisInit sTrisInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_ON | AC_TYPE_PLAYER, + OC1_NONE, + OC2_NONE, + COLSHAPE_TRIS, + }, + ARRAY_COUNT(sTrisElementsInit), + sTrisElementsInit, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_809304AC = { - { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_2, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x01, 0x04 }, { 0x00100000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NONE, BUMP_ON, OCELEM_ON, }, +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_ON | AT_TYPE_ENEMY, + AC_ON | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0xF7CFFFFF, 0x01, 0x04 }, + { 0x00100000, 0x00, 0x00 }, + TOUCH_ON | TOUCH_SFX_NONE, + BUMP_ON, + OCELEM_ON, + }, { 10, 25, 0, { 0, 0, 0 } }, }; -// sColChkInfoInit -static CollisionCheckInfoInit D_809304D8 = { 0, 9, 23, 1 }; +static CollisionCheckInfoInit sColChkInfoInit = { 0, 9, 23, 1 }; -// static InitChainEntry sInitChain[] = { -static InitChainEntry D_809304E0[] = { +static InitChainEntry sInitChain[] = { ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 100, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneDownward, 100, ICHAIN_STOP), }; -#endif +void EnHonotrap_FlameCollisionCheck(EnHonotrap* this, PlayState* play) { + s32 pad[3]; -extern ColliderTrisElementInit D_80930424[2]; -extern ColliderTrisInit D_8093049C; -extern ColliderCylinderInit D_809304AC; -extern CollisionCheckInfoInit D_809304D8; -extern InitChainEntry D_809304E0[]; + Collider_UpdateCylinder(&this->actor, &this->collider.cyl); + CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.tris.base); + CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.tris.base); + CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.tris.base); + this->colChkFlags |= HONOTRAP_AT_ACTIVE; + this->colChkFlags |= HONOTRAP_AC_ACTIVE; + this->colChkFlags |= HONOTRAP_OC_ACTIVE; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092E510.s") +void EnHonotrap_GetNormal(Vec3f* normal, Vec3f* vec) { + f32 magnitude = Math3D_Vec3fMagnitude(vec); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092E5A4.s") + if (magnitude < 0.001f) { + normal->x = normal->y = 0.0f; + normal->z = 1.0f; + } else { + normal->x = vec->x * (1.0f / magnitude); + normal->y = vec->y * (1.0f / magnitude); + normal->z = vec->z * (1.0f / magnitude); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092E638.s") +void EnHonotrap_InitEye(EnHonotrap* this, PlayState* play) { + s32 i; + s32 j; + s32 k; + f32 sin = Math_SinS(this->actor.home.rot.y); + f32 cos = Math_CosS(this->actor.home.rot.y); + Vec3f triangle[3]; + Vec3f* vtx; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092E840.s") + Actor_SetScale(&this->actor, 0.1f); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092E988.s") + if (sIsFirstInitEye) { + sIsFirstInitEye = false; + for (k = 0; k < HONOTRAP_EYE_MAX; k++) { + sSilverEyeTextures[k] = Lib_SegmentedToVirtual(sSilverEyeTextures[k]); + } + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/EnHonotrap_Init.s") + Collider_InitTris(play, &this->collider.tris); + Collider_SetTris(play, &this->collider.tris, &this->actor, &sTrisInit, this->collider.elements); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/EnHonotrap_Destroy.s") + for (i = 0; i < 2; i++) { + for (j = 0, vtx = triangle; j < 3; j++, vtx++) { + Vec3f* baseVtx = &sTrisInit.elements[i].dim.vtx[j]; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EBC0.s") + vtx->x = (baseVtx->z * sin) + (baseVtx->x * cos); + vtx->y = baseVtx->y; + vtx->z = (baseVtx->z * cos) - (baseVtx->x * sin); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EBDC.s") + Math_Vec3f_Sum(vtx, &this->actor.world.pos, vtx); + } + Collider_SetTrisVertices(&this->collider.tris, i, &triangle[0], &triangle[1], &triangle[2]); + } + Actor_SetFocus(&this->actor, 0.0f); + if (this->actor.params == HONOTRAP_TYPE_EYE) { + EnHonotrap_SetupEyeIdle(this); + } else { // HONOTRAP_TYPE_EYE_MUTI_FLAME + EnHonotrap_SetupEyeIdle2(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EC9C.s") +void EnHonotrap_InitFlame(EnHonotrap* this, PlayState* play) { + s32 pad[2]; + s32 params = this->actor.params; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092ECF0.s") + Actor_SetScale(&this->actor, 0.0001f); + Collider_InitCylinder(play, &this->collider.cyl); + Collider_SetCylinder(play, &this->collider.cyl, &this->actor, &sCylinderInit); + Collider_UpdateCylinder(&this->actor, &this->collider.cyl); + this->actor.terminalVelocity = -1.0f; + CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit); + ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); + this->actor.shape.shadowAlpha = 128; + this->targetPos = GET_PLAYER(play)->actor.world.pos; + this->targetPos.y += 10.0f; + this->flameScroll = Rand_ZeroOne() * 511.0f; + Actor_PlaySfx(&this->actor, NA_SE_EV_FLAME_IGNITION); + if (params == HONOTRAP_TYPE_FLAME_DROP) { + this->actor.room = -1; + this->collider.cyl.dim.radius = 12; + this->collider.cyl.dim.height = 30; + this->actor.shape.yOffset = -1000.0f; + } + EnHonotrap_SetupFlameGrow(this); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EDC0.s") +void EnHonotrap_InitFlameGroup(EnHonotrap* this, PlayState* play) { + EnHonotrapFlameGroup* flameGroup; + s32 flameScroll; + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EDD8.s") + Actor_SetScale(&this->actor, 0.0001f); + Collider_InitCylinder(play, &this->collider.cyl); + Collider_SetCylinder(play, &this->collider.cyl, &this->actor, &sCylinderInit); + CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sColChkInfoInit); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EE08.s") + flameScroll = Rand_ZeroOne() * 511.0f; + flameGroup = &this->flameGroup; + for (i = 0; i < ARRAY_COUNT(flameGroup->flameList); i++) { + flameGroup->flameList[i].flameScroll = flameScroll; + flameScroll += (s32)Rand_ZeroFloat(300.0f) + 100; + flameScroll %= 0x200U; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EE1C.s") + Actor_PlaySfx(&this->actor, NA_SE_EV_FLAME_IGNITION); + EnHonotrap_SetupFlameGroup(this); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EE68.s") +void EnHonotrap_Init(Actor* thisx, PlayState* play) { + s32 params; + EnHonotrap* this = (EnHonotrap*)thisx; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EE90.s") + params = this->actor.params; + Actor_ProcessInitChain(&this->actor, sInitChain); + if ((params == HONOTRAP_TYPE_EYE) || (params == HONOTRAP_TYPE_EYE_MUTI_FLAME)) { + EnHonotrap_InitEye(this, play); + } else if (params == HONOTRAP_TYPE_FLAME_GROUP) { + EnHonotrap_InitFlameGroup(this, play); + this->actor.update = EnHonotrap_UpdateFlameGroup; + this->actor.draw = EnHonotrap_DrawFlameGroup; + this->actor.uncullZoneScale = 500.0f; + this->actor.uncullZoneDownward = 500.0f; + } else { // HONOTRAP_TYPE_FLAME_MOVE, HONOTRAP_TYPE_FLAME_DROP + EnHonotrap_InitFlame(this, play); + this->actor.update = EnHonotrap_UpdateFlame; + this->actor.draw = EnHonotrap_DrawFlame; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EF3C.s") +void EnHonotrap_Destroy(Actor* thisx, PlayState* play) { + s16 params; + EnHonotrap* this = (EnHonotrap*)thisx; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092EF98.s") + params = this->actor.params; + if ((params == HONOTRAP_TYPE_EYE) || (params == HONOTRAP_TYPE_EYE_MUTI_FLAME)) { + Collider_DestroyTris(play, &this->collider.tris); + } else { + Collider_DestroyCylinder(play, &this->collider.cyl); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F05C.s") +void EnHonotrap_SetupEyeIdle(EnHonotrap* this) { + this->actionFunc = EnHonotrap_EyeIdle; + this->eyeState = HONOTRAP_EYE_SHUT; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F074.s") +void EnHonotrap_EyeIdle(EnHonotrap* this, PlayState* play) { + if (this->actor.child != NULL) { + this->timer = 200; + } else if ((this->timer <= 0) && (this->actor.xzDistToPlayer < 750.0f)) { + if ((this->actor.playerHeightRel < 0.0f) && (this->actor.playerHeightRel > -700.0f)) { + s16 angle = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F0A4.s") + if ((angle > -0x4000) && (angle < 0x4000)) { + EnHonotrap_SetupEyeOpen(this); + } + } + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F0B8.s") +void EnHonotrap_SetupEyeOpen(EnHonotrap* this) { + this->actionFunc = EnHonotrap_EyeOpen; + Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40); + this->timer = 30; + Actor_PlaySfx(&this->actor, NA_SE_EV_RED_EYE); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F0F8.s") +void EnHonotrap_EyeOpen(EnHonotrap* this, PlayState* play) { + this->eyeState--; + if (this->eyeState <= HONOTRAP_EYE_OPEN) { + EnHonotrap_SetupEyeAttack(this); + Actor_SpawnAsChild( + &play->actorCtx, &this->actor, play, ACTOR_EN_HONOTRAP, + (Math_SinS(this->actor.shape.rot.y) * 12.0f) + this->actor.home.pos.x, this->actor.home.pos.y - 10.0f, + (Math_CosS(this->actor.shape.rot.y) * 12.0f) + this->actor.home.pos.z, this->actor.home.rot.x, + this->actor.home.rot.y, this->actor.home.rot.z, HONOTRAP_TYPE_FLAME_MOVE); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F10C.s") +void EnHonotrap_SetupEyeAttack(EnHonotrap* this) { + this->actionFunc = EnHonotrap_EyeAttack; + this->eyeState = HONOTRAP_EYE_OPEN; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F1A0.s") +void EnHonotrap_EyeAttack(EnHonotrap* this, PlayState* play) { + if (this->timer <= 0) { + EnHonotrap_SetupEyeClose(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F208.s") +void EnHonotrap_SetupEyeClose(EnHonotrap* this) { + this->actionFunc = EnHonotrap_EyeClose; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F34C.s") +void EnHonotrap_EyeClose(EnHonotrap* this, PlayState* play) { + this->eyeState++; + if (this->eyeState >= HONOTRAP_EYE_SHUT) { + EnHonotrap_SetupEyeIdle(this); + this->timer = 200; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F3D8.s") +void EnHonotrap_SetupEyeIdle2(EnHonotrap* this) { + this->eyeState = HONOTRAP_EYE_SHUT; + this->timer = 80; + this->unk224 = 0; + this->actionFunc = EnHonotrap_EyeIdle2; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F5AC.s") +void EnHonotrap_EyeIdle2(EnHonotrap* this, PlayState* play) { + if ((this->timer <= 0) && (this->actor.xzDistToPlayer < 120.0f)) { + if ((this->actor.playerHeightRel < 0.0f) && (this->actor.playerHeightRel > -700.0f)) { + s16 angle = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F5EC.s") + if ((angle > -0x4000) && (angle < 0x4000)) { + EnHonotrap_SetupEyeOpen2(this); + } + } + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F7A8.s") +void EnHonotrap_SetupEyeOpen2(EnHonotrap* this) { + Actor_PlaySfx(&this->actor, NA_SE_EV_RED_EYE); + Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 40); + this->timer = 40; + this->actionFunc = EnHonotrap_EyeOpen2; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F7BC.s") +void EnHonotrap_EyeOpen2(EnHonotrap* this, PlayState* play) { + s32 pad; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F854.s") + this->eyeState--; + if (this->eyeState <= HONOTRAP_EYE_OPEN) { + Actor_SpawnAsChild( + &play->actorCtx, &this->actor, play, ACTOR_EN_HONOTRAP, + (Math_SinS(this->actor.shape.rot.y) * 12.0f) + this->actor.home.pos.x, this->actor.home.pos.y, + (Math_CosS(this->actor.shape.rot.y) * 12.0f) + this->actor.home.pos.z, this->actor.home.rot.x, + this->actor.home.rot.y, this->actor.home.rot.z, HONOTRAP_TYPE_FLAME_GROUP); + EnHonotrap_SetupEyeAttack2(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092F878.s") +void EnHonotrap_SetupEyeAttack2(EnHonotrap* this) { + this->actionFunc = EnHonotrap_EyeAttack2; + this->eyeState = HONOTRAP_EYE_OPEN; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/EnHonotrap_Update.s") +void EnHonotrap_EyeAttack2(EnHonotrap* this, PlayState* play) { + if (this->timer <= 0) { + EnHonotrap_SetupEyeClose2(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092FE44.s") +void EnHonotrap_SetupEyeClose2(EnHonotrap* this) { + this->actionFunc = EnHonotrap_EyeClose2; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_8092FEFC.s") +void EnHonotrap_EyeClose2(EnHonotrap* this, PlayState* play) { + this->eyeState++; + if (this->eyeState >= HONOTRAP_EYE_SHUT) { + EnHonotrap_SetupEyeIdle2(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/EnHonotrap_Draw.s") +void EnHonotrap_SetupFlameGrow(EnHonotrap* this) { + this->actionFunc = EnHonotrap_FlameGrow; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_80930030.s") +void EnHonotrap_FlameGrow(EnHonotrap* this, PlayState* play) { + f32 targetScale = (this->actor.params == HONOTRAP_TYPE_FLAME_MOVE) ? 0.004f : 0.0048f; + s32 targetReached = Math_StepToF(&this->actor.scale.x, targetScale, 0.0006f); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Honotrap/func_80930190.s") + this->actor.scale.z = this->actor.scale.y = this->actor.scale.x; + if (targetReached) { + if (this->actor.params == HONOTRAP_TYPE_FLAME_MOVE) { + EnHonotrap_SetupFlameMove(this); + } else { // HONOTRAP_TYPE_FLAME_DROP + EnHonotrap_SetupFlameDrop(this); + } + } +} + +void EnHonotrap_SetupFlameDrop(EnHonotrap* this) { + this->timer = 40; + this->actor.velocity.y = 1.0f; + this->actor.velocity.x = 2.0f * Math_SinS(this->actor.world.rot.y); + this->actor.velocity.z = 2.0f * Math_CosS(this->actor.world.rot.y); + this->actionFunc = EnHonotrap_FlameDrop; +} + +void EnHonotrap_FlameDrop(EnHonotrap* this, PlayState* play) { + if ((this->collider.tris.base.atFlags & AT_HIT) || (this->timer <= 0)) { + if ((this->collider.tris.base.atFlags & AT_HIT) && !(this->collider.tris.base.atFlags & AT_BOUNCED)) { + func_800B8D98(play, &this->actor, 5.0f, this->actor.yawTowardsPlayer, 0.0f); + } + this->actor.velocity.z = 0.0f; + this->actor.velocity.y = 0.0f; + this->actor.velocity.x = 0.0f; + EnHonotrap_SetupFlameVanish(this); + return; + } + if (this->actor.velocity.y > 0.0f) { + this->actor.world.pos.x += this->actor.velocity.x; + this->actor.world.pos.z += this->actor.velocity.z; + Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4); + } + if (!Math_StepToF(&this->actor.world.pos.y, this->actor.floorHeight + 1.0f, this->actor.velocity.y)) { + this->actor.velocity.y += 1.0f; + } else { + this->actor.velocity.y = 0.0f; + } + EnHonotrap_FlameCollisionCheck(this, play); +} + +void EnHonotrap_SetupFlameMove(EnHonotrap* this) { + f32 distInverse; + + this->actionFunc = EnHonotrap_FlameMove; + distInverse = 1.0f / (Actor_WorldDistXYZToPoint(&this->actor, &this->targetPos) + 1.0f); + this->actor.velocity.x = (this->targetPos.x - this->actor.world.pos.x) * distInverse; + this->actor.velocity.y = (this->targetPos.y - this->actor.world.pos.y) * distInverse; + this->actor.velocity.z = (this->targetPos.z - this->actor.world.pos.z) * distInverse; + this->speedMod = 0.0f; + this->timer = 160; +} + +void EnHonotrap_FlameMove(EnHonotrap* this, PlayState* play) { + Actor* thisx = &this->actor; + Vec3f speed; + s32 cond; + + Math_StepToF(&this->speedMod, 13.0f, 0.5f); + speed.x = fabsf(this->speedMod * thisx->velocity.x); + speed.y = fabsf(this->speedMod * thisx->velocity.y); + speed.z = fabsf(this->speedMod * thisx->velocity.z); + cond = true; + cond &= Math_StepToF(&thisx->world.pos.x, this->targetPos.x, speed.x); + cond &= Math_StepToF(&thisx->world.pos.y, this->targetPos.y, speed.y); + cond &= Math_StepToF(&thisx->world.pos.z, this->targetPos.z, speed.z); + Actor_UpdateBgCheckInfo(play, thisx, 10.0f, 10.0f, 0.0f, + UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | + UPDBGCHECKINFO_FLAG_10); + + if (this->collider.tris.base.atFlags & AT_BOUNCED) { + Player* player = GET_PLAYER(play); + Vec3f shieldNorm; + Vec3f tempVel; + Vec3f shieldVec; + + shieldVec.x = -player->shieldMf.xz; + shieldVec.y = -player->shieldMf.yz; + shieldVec.z = -player->shieldMf.zz; + EnHonotrap_GetNormal(&shieldNorm, &shieldVec); + tempVel = thisx->velocity; + func_80179F64(&tempVel, &shieldNorm, &thisx->velocity); + thisx->speed = this->speedMod * 0.5f; + thisx->world.rot.y = Math_Atan2S_XY(thisx->velocity.z, thisx->velocity.x); + EnHonotrap_SetupFlameVanish(this); + } else if (this->collider.tris.base.atFlags & AT_HIT) { + thisx->speed = 0.0f; + thisx->velocity.y = 0.0f; + EnHonotrap_SetupFlameVanish(this); + } else if (this->timer <= 0) { + EnHonotrap_SetupFlameVanish(this); + } else { + EnHonotrap_FlameCollisionCheck(this, play); + if (cond != 0) { + EnHonotrap_SetupFlameChase(this); + } + } +} + +void EnHonotrap_SetupFlameChase(EnHonotrap* this) { + this->actionFunc = EnHonotrap_FlameChase; + this->actor.speed = 0.0f; + this->actor.velocity.x = this->actor.velocity.y = this->actor.velocity.z = 0.0f; + this->timer = 100; + this->actor.world.rot.x = this->actor.world.rot.y = this->actor.world.rot.z = 0; +} + +void EnHonotrap_FlameChase(EnHonotrap* this, PlayState* play) { + s32 pad; + + Math_ScaledStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0x300); + Math_StepToF(&this->actor.speed, 3.0f, 0.1f); + this->actor.gravity = (-this->actor.playerHeightRel < 10.0f) ? 0.08f : -0.08f; + Actor_UpdateVelocityWithGravity(&this->actor); + if (this->actor.velocity.y > 1.0f) { + this->actor.velocity.y = 1.0f; + } + this->actor.velocity.y *= 0.95f; + Actor_UpdatePos(&this->actor); + Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 0.0f, + UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | + UPDBGCHECKINFO_FLAG_10); + + if (this->collider.tris.base.atFlags & AT_BOUNCED) { + Player* player = GET_PLAYER(play); + Vec3s shieldRot; + + Matrix_MtxFToYXZRot(&player->shieldMf, &shieldRot, 0); + this->actor.world.rot.y = ((shieldRot.y * 2) - this->actor.world.rot.y) + 0x8000; + EnHonotrap_SetupFlameVanish(this); + } else if (this->collider.tris.base.atFlags & AT_HIT) { + this->actor.speed *= 0.1f; + this->actor.velocity.y *= 0.1f; + EnHonotrap_SetupFlameVanish(this); + } else if ((this->actor.bgCheckFlags & BGCHECKFLAG_WALL) || (this->timer <= 0)) { + EnHonotrap_SetupFlameVanish(this); + } else { + EnHonotrap_FlameCollisionCheck(this, play); + } +} + +void EnHonotrap_SetupFlameVanish(EnHonotrap* this) { + this->actionFunc = EnHonotrap_FlameVanish; +} + +void EnHonotrap_FlameVanish(EnHonotrap* this, PlayState* play) { + s32 pad; + s32 targetReached = Math_StepToF(&this->actor.scale.x, 0.0001f, 0.00015f); + + this->actor.scale.z = this->actor.scale.y = this->actor.scale.x; + Actor_MoveWithGravity(&this->actor); + Actor_UpdateBgCheckInfo(play, &this->actor, 10.0f, 10.0f, 0.0f, + UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | + UPDBGCHECKINFO_FLAG_10); + if (targetReached) { + Actor_Kill(&this->actor); + } +} + +void EnHonotrap_SetupFlameGroup(EnHonotrap* this) { + this->actionFunc = EnHonotrap_FlameGroup; + this->timer = 80; + this->flameGroup.unk8 = 0.0f; +} + +void EnHonotrap_FlameGroup(EnHonotrap* this, PlayState* play) { + s32 i; + EnHonotrapFlameGroup* flameGroup = &this->flameGroup; + f32 var_fs0; + f32 temp_fs0; + f32 temp_fs1; + f32 sp88; + f32 sp84; + f32 sp80; + s32 flameScrollDisplacement; + s32 sp78 = false; + f32 var_fs0_2; + Vec3f sp68; + EnHonotrapFlameElement* flameElem; + + sp80 = fabsf(Math_CosS(Camera_GetCamDirPitch(GET_ACTIVE_CAM(play)))); + flameScrollDisplacement = (s32)(sp80 * -10.5f) - 10; + Math_StepToF(&flameGroup->unk0, 1.0f, 0.05f); + if (this->timer <= 40) { + sp78 = Math_StepToF(&flameGroup->unk4, 1.0f, 0.05f); + } else if (this->actor.parent == NULL) { + this->timer = 40; + } + for (i = 0; i < ARRAY_COUNT(flameGroup->flameList); i++) { + flameGroup->flameList[i].isDrawn = false; + } + + sp88 = Math_SinS(this->actor.shape.rot.y) * 120.0f; + sp84 = Math_CosS(this->actor.shape.rot.y) * 120.0f; + + flameGroup->unk8 += 0.050f * (1.0f - flameGroup->unk4); + + if (flameGroup->unk8 > 1.0f / 6) { + flameGroup->unk8 -= 1.0f / 6; + } + var_fs0 = flameGroup->unk4 + flameGroup->unk8; + + for (i = 0; i < ARRAY_COUNT(flameGroup->flameList) && (var_fs0 <= flameGroup->unk0); i++) { + flameElem = &flameGroup->flameList[i]; + flameElem->isDrawn = true; + + flameElem->pos.x = (sp88 * var_fs0) + this->actor.world.pos.x; + flameElem->pos.y = this->actor.world.pos.y; + flameElem->pos.z = (sp84 * var_fs0) + this->actor.world.pos.z; + + flameElem->unkC = Math_SinS((s16)(s32)(var_fs0 * 25486.223f)) * 1.6f; + if (flameElem->unkC > 1.0f) { + flameElem->unkC = 1.0f; + } else if (flameElem->unkC < 0.0f) { + flameElem->unkC = 0.0f; + } + + var_fs0 += 1.0f / 6; + flameElem->unkC *= (0.006f * (((1.0f - flameGroup->unk4) * 0.8f) + 0.2f)); + flameElem->flameScroll += flameScrollDisplacement; + flameElem->flameScroll %= 0x200U; + } + + if (sp78 || (this->timer <= 0)) { + Actor_Kill(&this->actor); + return; + } + temp_fs0 = flameGroup->unk0 * 120.0f; + temp_fs1 = flameGroup->unk4 * 120.0f; + Actor_OffsetOfPointInActorCoords(&this->actor, &sp68, &GET_PLAYER(play)->actor.world.pos); + + if (sp68.z < temp_fs1) { + sp68.z = temp_fs1; + } else if (temp_fs0 < sp68.z) { + sp68.z = temp_fs0; + } + + var_fs0_2 = Math_SinS((s16)(s32)(sp68.z * 212.3852f)) * 1.6f; + if (var_fs0_2 > 1.0f) { + var_fs0_2 = 1.0f; + } + sp80 *= ((1.0f - flameGroup->unk4) * 0.8f) + 0.2f; + if (sp80 > 0.2f) { + this->collider.cyl.dim.pos.x = + (s16)(s32)((Math_SinS(this->actor.shape.rot.y) * sp68.z) + this->actor.world.pos.x); + this->collider.cyl.dim.pos.y = (s16)(s32)(this->actor.world.pos.y - (24.0f * var_fs0_2)); + this->collider.cyl.dim.pos.z = + (s16)(s32)((Math_CosS(this->actor.shape.rot.y) * sp68.z) + this->actor.world.pos.z); + this->collider.cyl.dim.radius = (s16)(s32)(15.0f * var_fs0_2); + this->collider.cyl.dim.height = (s16)(s32)(37.5f * var_fs0_2); + CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.tris.base); + CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.tris.base); + CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.tris.base); + } +} + +void EnHonotrap_Update(Actor* thisx, PlayState* play) { + static Vec3f sVelocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f sAccel = { 0.0f, 0.1f, 0.0f }; + EnHonotrap* this = (EnHonotrap*)thisx; + + if (this->timer > 0) { + this->timer--; + } + if ((this->actor.child != NULL) && (this->actor.child->update == NULL)) { + this->actor.child = NULL; + } + this->actionFunc(this, play); + if (this->collider.tris.base.acFlags & AC_HIT) { + EffectSsBomb2_SpawnLayered(play, &this->actor.world.pos, &sVelocity, &sAccel, 15, 8); + Actor_Kill(&this->actor); + return; + } + if (this->eyeState < HONOTRAP_EYE_SHUT) { + this->collider.tris.base.acFlags &= ~AC_HIT; + CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.tris.base); + } +} + +void EnHonotrap_UpdateFlame(Actor* thisx, PlayState* play) { + EnHonotrap* this = (EnHonotrap*)thisx; + + if (this->timer > 0) { + this->timer--; + } + this->colChkFlags = 0; + this->bobPhase += 0x640; + if (this->actor.params != HONOTRAP_TYPE_FLAME_GROUP) { + this->actor.shape.yOffset = Math_SinS(this->bobPhase) * 1000.0f + 600.0f; + } + Actor_SetFocus(&this->actor, 5.0f); + Actor_PlaySfx(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG); + this->actionFunc(this, play); + this->flameScroll -= 20; + this->flameScroll %= 0x200U; +} + +void EnHonotrap_UpdateFlameGroup(Actor* thisx, PlayState* play) { + EnHonotrap* this = (EnHonotrap*)thisx; + Actor* parent = this->actor.parent; + + if ((parent != NULL) && (parent->update == NULL)) { + this->actor.parent = NULL; + } + if (this->timer > 0) { + this->timer--; + } + this->bobPhase += 0x640; + Actor_PlaySfx(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG); + this->actionFunc(this, play); +} + +void EnHonotrap_Draw(Actor* thisx, PlayState* play) { + EnHonotrap* this = (EnHonotrap*)thisx; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Opa(play->state.gfxCtx); + gSPSegment(POLY_OPA_DISP++, 0x08, sSilverEyeTextures[this->eyeState]); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, &gEyeSwitchSilverDL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void EnHonotrap_DrawFlame(Actor* thisx, PlayState* play) { + s32 pad; + EnHonotrap* this = (EnHonotrap*)thisx; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, this->flameScroll, 32, 128)); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0); + Matrix_RotateYS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000, MTXMODE_APPLY); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void EnHonotrap_DrawFlameGroup(Actor* thisx, PlayState* play) { + s32 pad; + EnHonotrap* this = (EnHonotrap*)thisx; + EnHonotrapFlameElement* flameElem; + EnHonotrapFlameGroup* flameGroup = &this->flameGroup; + s32 i; + s32 pad2; + Vec3s camDir; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0); + Camera_GetCamDir(&camDir, GET_ACTIVE_CAM(play)); + camDir.y += 0x8000; + + for (i = 0; i < ARRAY_COUNT(flameGroup->flameList); i++) { + flameElem = &flameGroup->flameList[i]; + if (flameElem->isDrawn) { + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, 0, 32, 64, 1, 0, flameElem->flameScroll, 32, 128)); + Matrix_SetTranslateRotateYXZ(flameElem->pos.x, flameElem->pos.y - (4000.0f * flameElem->unkC), + flameElem->pos.z, &camDir); + Matrix_Scale(((fabsf(Math_SinS((s16)(camDir.y - thisx->shape.rot.y) >> 1)) * 0.2f) + 1.7f) * + flameElem->unkC, + flameElem->unkC, 1.0f, MTXMODE_APPLY); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL); + } + } + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.h b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.h index 570269fe2..db78f30ff 100644 --- a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.h +++ b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.h @@ -7,10 +7,49 @@ struct EnHonotrap; typedef void (*EnHonotrapActionFunc)(struct EnHonotrap*, PlayState*); +typedef union { + struct { + /* 0x00 */ ColliderTris tris; + /* 0x20 */ ColliderTrisElement elements[2]; + }; + /* 0x00 */ ColliderCylinder cyl; +} EnHonotrapCollider; // size = 0xD8 + +typedef struct { + /* 0x00 */ Vec3f pos; + /* 0x0C */ f32 unkC; + /* 0x10 */ s16 flameScroll; + /* 0x12 */ u8 isDrawn; +} EnHonotrapFlameElement; // size = 0x14 + +typedef struct { + /* 0x0 */ f32 unk0; + /* 0x4 */ f32 unk4; + /* 0x8 */ f32 unk8; + /* 0xC */ EnHonotrapFlameElement flameList[6]; +} EnHonotrapFlameGroup; // size = 0x84; + typedef struct EnHonotrap { /* 0x000 */ Actor actor; /* 0x144 */ EnHonotrapActionFunc actionFunc; - /* 0x148 */ char unk_148[0x17C]; + /* 0x148 */ EnHonotrapCollider collider; + /* 0x220 */ s16 timer; + /* 0x222 */ s16 eyeState; + /* 0x224 */ s16 unk224; + /* 0x228 */ Vec3f targetPos; + /* 0x234 */ f32 speedMod; + /* 0x238 */ s16 bobPhase; + /* 0x23A */ s16 flameScroll; + /* 0x23C */ EnHonotrapFlameGroup flameGroup; + /* 0x2C0 */ u8 colChkFlags; } EnHonotrap; // size = 0x2C4 +typedef enum { + /* 0 */ HONOTRAP_TYPE_EYE, + /* 1 */ HONOTRAP_TYPE_FLAME_MOVE, + /* 2 */ HONOTRAP_TYPE_FLAME_DROP, + /* 3 */ HONOTRAP_TYPE_EYE_MUTI_FLAME, + /* 4 */ HONOTRAP_TYPE_FLAME_GROUP +} EnHonotrapType; + #endif // Z_EN_HONOTRAP_H From 864748c6f96eed0e084a30df9d1f76918bb69415 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 7 Nov 2023 07:58:28 +1100 Subject: [PATCH 07/28] match Sram_CopySave (#1467) --- src/code/z_sram_NES.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index 83e271edc..696d79823 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -1694,8 +1694,6 @@ void Sram_EraseSave(FileSelectState* fileSelect2, SramContext* sramCtx, s32 file gSaveContext.flashSaveAvailable = D_801F6AF2; } -#ifdef NON_MATCHING -// v0/v1 void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) { FileSelectState* fileSelect = fileSelect2; u16 i; @@ -1737,13 +1735,11 @@ void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) { // clear buffer bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); // read to buffer - SysFlashrom_ReadData(&sramCtx->saveBuf[0], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2], - gFlashSaveNumPages[fileSelect->selectedFileIndex * 2]); - if (1) {} + if (SysFlashrom_ReadData(&sramCtx->saveBuf[0], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2], + gFlashSaveNumPages[fileSelect->selectedFileIndex * 2])) {} - SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2 + 1], - gFlashSaveNumPages[fileSelect->selectedFileIndex * 2 + 1]); - if (1) {} + if (SysFlashrom_ReadData(&sramCtx->saveBuf[0x2000], gFlashSaveStartPages[fileSelect->selectedFileIndex * 2 + 1], + gFlashSaveNumPages[fileSelect->selectedFileIndex * 2 + 1])) {} // copy buffer to save context Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); @@ -1780,9 +1776,6 @@ void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) { gSaveContext.save.time = D_801F6AF0; gSaveContext.flashSaveAvailable = D_801F6AF2; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/Sram_CopySave.s") -#endif void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { s32 phi_v0; From 72bdfdee3f4862551863bfca5321cb7413050090 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 7 Nov 2023 08:12:32 +1100 Subject: [PATCH 08/28] Match Message_Update (#1469) --- src/code/z_message.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/code/z_message.c b/src/code/z_message.c index 53f4cbdf7..3cc79e649 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -5211,10 +5211,6 @@ s16 D_801D0464[] = { 0x1B8E, }; -#ifdef NON_MATCHING -// Down to a single compiler-managed stack variable -// Also contains in-function data -// https://decomp.me/scratch/QcQ0a void Message_Update(PlayState* play) { static u8 D_801D0468 = 0; MessageContext* msgCtx = &play->msgCtx; @@ -5730,7 +5726,7 @@ void Message_Update(PlayState* play) { ((play->activeCamId == CAM_ID_MAIN) || ((play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF))) && (play->msgCtx.ocarinaMode == OCARINA_MODE_END)) { - if ((gSaveContext.prevHudVisibility == HUD_VISIBILITY_IDLE) || + if (((u32)gSaveContext.prevHudVisibility == HUD_VISIBILITY_IDLE) || (gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE) || (gSaveContext.prevHudVisibility == HUD_VISIBILITY_NONE_ALT)) { gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL; @@ -6001,10 +5997,6 @@ void Message_Update(PlayState* play) { break; } } -#else -u8 D_801D0468 = 0; -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Update.s") -#endif void Message_SetTables(PlayState* play) { play->msgCtx.messageEntryTableNes = D_801C6B98; From 23fdf697343d8abeac43dd0c334cd68d3560060b Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 7 Nov 2023 15:29:04 +1100 Subject: [PATCH 09/28] Match `AudioOcarina_CreateCustomSequence` (code_8019AF00.c OK) (#1468) * match AudioOcarina_CreateCustomSequence * cleanup --- src/audio/code_8019AF00.c | 97 ++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 57 deletions(-) diff --git a/src/audio/code_8019AF00.c b/src/audio/code_8019AF00.c index 3f684cbf9..039c8f5c5 100644 --- a/src/audio/code_8019AF00.c +++ b/src/audio/code_8019AF00.c @@ -3424,26 +3424,18 @@ void AudioOcarina_PlayCustomSequence(void) { } // Unused -// Regalloc Swap https://decomp.me/scratch/QEovr -#ifdef NON_MATCHING s32 AudioOcarina_CreateCustomSequence(void) { OcarinaNote* prevNote; u16 i; - u16 phi_s4; - u16 temp_a0; // delay1 - u16 phi_a2; // delay2 + u16 delay = 0; u8 absPitch; - s8 phi_a0; // adjBendIndex - s8 phi_s2; // prevBend - u8 phi_t1; // vibrato - u8 phi_t5; // isLegato - u16 temp_t4; // prevNoteLength - - phi_a2 = 0; - phi_t1 = 0; - phi_s2 = 0; - phi_t5 = 0; - phi_s4 = 0; + s8 adjBendIndex; + u8 prevVibrato = 0; + s8 prevBend = 0; + u8 isLegato = false; + u16 phi_s4 = 0; + u16 temp1; // prevNoteLength, reused temp + u16 temp2; sCustomSequencePc = 39; // .channel chan_loop @@ -3454,41 +3446,41 @@ s32 AudioOcarina_CreateCustomSequence(void) { for (; (prevNote->length != 0) && (sCustomSequencePc < 394); i++) { - temp_a0 = ((prevNote->length * 48) / 30); + temp1 = ((prevNote->length * 48) / 30); - if (phi_t1 != prevNote->vibrato) { + if (prevVibrato != prevNote->vibrato) { sCustomSequenceScript[sCustomSequencePc++] = 0xFD; // delay cmd - if (phi_a2 >= 0x80) { + if (delay >= 0x80) { // Store as compressed u16 - sCustomSequenceScript[sCustomSequencePc++] = (((phi_a2 >> 8) & 0xFF) & 0x7F) + 0x80; // delay arg - sCustomSequenceScript[sCustomSequencePc++] = phi_a2 & 0xFF; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = (((delay >> 8) & 0xFF) & 0x7F) + 0x80; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = delay & 0xFF; // delay arg } else { // Store as u8 - sCustomSequenceScript[sCustomSequencePc++] = phi_a2; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = delay; // delay arg } sCustomSequenceScript[sCustomSequencePc++] = 0xD8; // vibdepth cmd sCustomSequenceScript[sCustomSequencePc++] = prevNote->vibrato; // vibdepth arg - phi_a2 = temp_a0; - phi_t1 = prevNote->vibrato; + delay = temp1; + prevVibrato = prevNote->vibrato; } else { - phi_a2 += temp_a0; + delay += temp1; } prevNote = &sScarecrowsLongSongNotes[i]; } - if (phi_a2 != 0) { + if (delay != 0) { sCustomSequenceScript[sCustomSequencePc++] = 0xFD; // delay cmd - if (phi_a2 >= 0x80) { + if (delay >= 0x80) { // Store as compressed u16 - sCustomSequenceScript[sCustomSequencePc++] = (((phi_a2 >> 8) & 0xFF) & 0x7F) + 0x80; // delay arg - sCustomSequenceScript[sCustomSequencePc++] = phi_a2 & 0xFF; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = (((delay >> 8) & 0xFF) & 0x7F) + 0x80; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = delay & 0xFF; // delay arg } else { // Store as u8 - sCustomSequenceScript[sCustomSequencePc++] = phi_a2; // delay arg + sCustomSequenceScript[sCustomSequencePc++] = delay; // delay arg } } @@ -3514,46 +3506,42 @@ s32 AudioOcarina_CreateCustomSequence(void) { sCustomSequenceScript[sCustomSequencePc++] = 0xC9; // shortgate cmd sCustomSequenceScript[sCustomSequencePc++] = 0; // shortgate arg - if (1) {} - if (1) {} // TODO: Needed? - prevNote = &sScarecrowsLongSongNotes[0]; for (i = 1; ((prevNote->pitch == OCARINA_PITCH_NONE) && (prevNote->length != 0)); i++) { prevNote = &sScarecrowsLongSongNotes[i]; } - for (; ((temp_t4 = prevNote->length) != 0) && (sCustomSequencePc < 394); i++) { - + for (; ((temp1 = prevNote->length) != 0) && (sCustomSequencePc < 394); i++) { if (prevNote->pitch == sScarecrowsLongSongNotes[i].pitch) { - if ((sScarecrowsLongSongNotes[i].length != 0) && (phi_t5 == 0)) { + if ((sScarecrowsLongSongNotes[i].length != 0) && !isLegato) { sCustomSequenceScript[sCustomSequencePc++] = 0xC4; // legato cmd - phi_t5 = 1; + isLegato = true; } - } else if ((phi_t5 == 1) && (sScarecrowsLongSongNotes[i].pitch != OCARINA_PITCH_NONE) && + } else if ((isLegato == true) && (sScarecrowsLongSongNotes[i].pitch != OCARINA_PITCH_NONE) && (sScarecrowsLongSongNotes[i].pitch != OCARINA_PITCH_C4)) { sCustomSequenceScript[sCustomSequencePc++] = 0xC5; // nolegato cmd - phi_t5 = 0; + isLegato = false; } - if (phi_s2 != prevNote->bend) { + if (prevBend != prevNote->bend) { sCustomSequenceScript[sCustomSequencePc++] = 0xCE; // bendfine cmd if (ABS_ALT(prevNote->bend) > 64) { - phi_a0 = 127; + adjBendIndex = 127; } else if (prevNote->bend < 0) { - phi_a0 = -prevNote->bend; + adjBendIndex = -prevNote->bend; } else { - phi_a0 = ((prevNote->bend * 127) / 64); + adjBendIndex = ((prevNote->bend * 127) / 64); } if (prevNote->bend < 0) { - phi_a0 *= -1; + adjBendIndex *= -1; } - sCustomSequenceScript[sCustomSequencePc++] = phi_a0; // bendfine arg + sCustomSequenceScript[sCustomSequencePc++] = adjBendIndex; // bendfine arg - phi_s2 = prevNote->bend; + prevBend = prevNote->bend; } absPitch = prevNote->pitch + 39; // convert ocarina pitch to absolute pitch, + PITCH_C4 (Middle C) @@ -3564,20 +3552,18 @@ s32 AudioOcarina_CreateCustomSequence(void) { } // delay/duration - temp_a0 = ((temp_t4 * 48) + phi_s4) / 30; + temp2 = ((temp1 * 48) + phi_s4) / 30; - if (temp_a0 < 0x80) { + if (temp2 < 0x80) { // Store as u8 - sCustomSequenceScript[sCustomSequencePc++] = temp_a0; // shortdvg/ldelay arg + sCustomSequenceScript[sCustomSequencePc++] = temp2; // shortdvg/ldelay arg } else { // Store as compressed u16 - sCustomSequenceScript[sCustomSequencePc++] = (((temp_a0 >> 8) & 0xFF) & 0x7F) + 0x80; // shortdvg/ldelay arg - sCustomSequenceScript[sCustomSequencePc++] = temp_a0 & 0xFF; // shortdvg/ldelay arg + sCustomSequenceScript[sCustomSequencePc++] = (((temp2 >> 8) & 0xFF) & 0x7F) + 0x80; // shortdvg/ldelay arg + sCustomSequenceScript[sCustomSequencePc++] = temp2 & 0xFF; // shortdvg/ldelay arg } - if (1) {} - - phi_s4 = ((temp_t4 * 48) + phi_s4) - (temp_a0 * 30); + phi_s4 = ((temp1 * 48) + phi_s4) - (temp2 * 30); prevNote = &sScarecrowsLongSongNotes[i]; } @@ -3592,9 +3578,6 @@ s32 AudioOcarina_CreateCustomSequence(void) { return 0; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/code_8019AF00/AudioOcarina_CreateCustomSequence.s") -#endif void AudioOcarina_ResetInstrument(void) { if (sOcarinaInstrumentId != OCARINA_INSTRUMENT_OFF) { From ffd9c8418425f491234747db1742be3c839609f3 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 7 Nov 2023 15:58:29 +1100 Subject: [PATCH 10/28] Match Message_DrawTextCredits (#1470) --- src/code/z_message_staff.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/code/z_message_staff.c b/src/code/z_message_staff.c index a093ef5c1..392266d81 100644 --- a/src/code/z_message_staff.c +++ b/src/code/z_message_staff.c @@ -35,12 +35,9 @@ f32 sCreditsFontWidths[144] = { 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, 14.0f, }; -#ifdef NON_MATCHING -// https://decomp.me/scratch/yc8Or -// v0/v1 swap between `character` and `i` void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) { MessageContext* msgCtx = &play->msgCtx; - u16 lookAheadCharacter; + u16 pad; u16 j; u16 i; u16 sfxHi; @@ -122,14 +119,13 @@ void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) { ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26)))) { j = i; while (true) { - lookAheadCharacter = msgCtx->decodedBuffer.schar[j]; - if (lookAheadCharacter == 6) { + character = msgCtx->decodedBuffer.schar[j]; + if (character == 6) { j += 2; continue; } - if ((lookAheadCharacter != 9) && (lookAheadCharacter != 0xA) && (lookAheadCharacter != 0xB) && - (lookAheadCharacter != 0xC) && (lookAheadCharacter != 0xD) && (lookAheadCharacter != 4) && - (lookAheadCharacter != 2)) { + if ((character != 9) && (character != 0xA) && (character != 0xB) && (character != 0xC) && + (character != 0xD) && (character != 4) && (character != 2)) { j++; continue; } @@ -329,9 +325,6 @@ void Message_DrawTextCredits(PlayState* play, Gfx** gfxP) { *gfxP = gfx; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_staff/Message_DrawTextCredits.s") -#endif void Message_DecodeCredits(PlayState* play) { u16 curChar; From 1d75f6aff5c6bcef5e02bb20df7d727644075e35 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:16:38 +1100 Subject: [PATCH 11/28] Match FileSelect_SetWindowContentVtx (#1471) --- spec | 6 +-- .../ovl_file_choose/z_file_choose_NES.c | 38 +++++++------------ 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/spec b/spec index ab0bf4a69..c8e02a251 100644 --- a/spec +++ b/spec @@ -653,11 +653,7 @@ beginseg include "build/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.o" include "build/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.o" include "build/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.o" - #ifdef NON_MATCHING - include "build/src/overlays/gamestates/ovl_file_choose/ovl_file_choose_reloc.o" - #else - include "build/data/ovl_file_choose/ovl_file_choose.reloc.o" - #endif + include "build/src/overlays/gamestates/ovl_file_choose/ovl_file_choose_reloc.o" endseg beginseg diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c index 3957466b1..9ec0a396f 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c @@ -659,22 +659,19 @@ s16 D_80814650[] = { 940, 944 }; * fileSelect->windowContentVtx[956] -> Warning labels */ -#ifdef NON_MATCHING -// regalloc at the beginning is fixed by removing FAKE: labelled code void FileSelect_SetWindowContentVtx(GameState* thisx) { FileSelectState* this = (FileSelectState*)thisx; u16 vtxId; s16 j; - s16 index; + s16 i; s16 spAC; - s16 i; // a3 u16 spA4[3]; u16* ptr; - s32 posY; // sp9C - s32 relPosY; // sp98 + s32 posY; + s32 relPosY; s32 tempPosY; - s32 posX; // s1 - s32 temp_t5; + s32 posX; + s32 index; this->windowContentVtx = GRAPH_ALLOC(this->state.gfxCtx, 960 * sizeof(Vtx)); @@ -696,9 +693,6 @@ void FileSelect_SetWindowContentVtx(GameState* thisx) { this->windowContentVtx[vtxId + 0].v.ob[2] = this->windowContentVtx[vtxId + 1].v.ob[2] = this->windowContentVtx[vtxId + 2].v.ob[2] = this->windowContentVtx[vtxId + 3].v.ob[2] = 0; - //! FAKE: - if (index && index && index) {} - // flag this->windowContentVtx[vtxId + 0].v.flag = this->windowContentVtx[vtxId + 1].v.flag = this->windowContentVtx[vtxId + 2].v.flag = this->windowContentVtx[vtxId + 3].v.flag = 0; @@ -1193,7 +1187,7 @@ void FileSelect_SetWindowContentVtx(GameState* thisx) { /* Time Digits */ posX += 6; - temp_t5 = vtxId; + index = vtxId; for (i = 0; i < 5; i++, vtxId += 4, posX += 8) { @@ -1220,17 +1214,17 @@ void FileSelect_SetWindowContentVtx(GameState* thisx) { } // Adjust the colon to the right - this->windowContentVtx[temp_t5 + 8].v.ob[0] = this->windowContentVtx[temp_t5 + 10].v.ob[0] = - this->windowContentVtx[temp_t5 + 8].v.ob[0] + 3; + this->windowContentVtx[index + 8].v.ob[0] = this->windowContentVtx[index + 10].v.ob[0] = + this->windowContentVtx[index + 8].v.ob[0] + 3; - this->windowContentVtx[temp_t5 + 9].v.ob[0] = this->windowContentVtx[temp_t5 + 11].v.ob[0] = - this->windowContentVtx[temp_t5 + 8].v.ob[0] + 0xC; + this->windowContentVtx[index + 9].v.ob[0] = this->windowContentVtx[index + 11].v.ob[0] = + this->windowContentVtx[index + 8].v.ob[0] + 0xC; - this->windowContentVtx[temp_t5 + 0x1C].v.ob[0] = this->windowContentVtx[temp_t5 + 0x1E].v.ob[0] = - this->windowContentVtx[temp_t5 + 8].v.ob[0] + 1; + this->windowContentVtx[index + 0x1C].v.ob[0] = this->windowContentVtx[index + 0x1E].v.ob[0] = + this->windowContentVtx[index + 8].v.ob[0] + 1; - this->windowContentVtx[temp_t5 + 0x1D].v.ob[0] = this->windowContentVtx[temp_t5 + 0x1F].v.ob[0] = - this->windowContentVtx[temp_t5 + 0x1C].v.ob[0] + 0xC; + this->windowContentVtx[index + 0x1D].v.ob[0] = this->windowContentVtx[index + 0x1F].v.ob[0] = + this->windowContentVtx[index + 0x1C].v.ob[0] + 0xC; vtxId += 20; } @@ -1312,10 +1306,6 @@ void FileSelect_SetWindowContentVtx(GameState* thisx) { this->windowContentVtx[vtxId + 5].v.tc[0] = this->windowContentVtx[vtxId + 7].v.tc[0] = 0x1000; } -#else -void FileSelect_SetWindowContentVtx(GameState* thisx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_file_choose/FileSelect_SetWindowContentVtx.s") -#endif u16 D_80814654[] = { 0x88, From 277c184cb418db1f937edc5891db5c4c1b031f15 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Wed, 8 Nov 2023 00:17:29 +1100 Subject: [PATCH 12/28] Match `Environment_Init` (#1474) * Match Environment_Init (fake) * that's much better --- src/code/z_kankyo.c | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index 0326dcd24..86aeaa330 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -525,14 +525,10 @@ s32 Environment_ZBufValToFixedPoint(s32 zBufferVal) { return ret; } -#ifdef NON_MATCHING -// The 2 constant from the `gWeatherMode` switch branch is reused when checking `CURRENT_DAY` -// A near identical issue is present in the non-matching `func_809F24C8` from `z_boss_06.c` void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 arg2) { PlayState* play = play2; f32 temp_ft4; u8 var_a0; - u8 temp; s16 i; CREG(1) = 0; @@ -672,8 +668,7 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 arg2) { var_a0 = 0; if (((void)0, gSaveContext.save.day) != 0) { - //! FAKE: temp - var_a0 = ((void)0, temp = gSaveContext.save.day) - 1; + var_a0 = ((void)0, gSaveContext.save.day) - 1; } envCtx->skyboxConfig = var_a0 + (D_801F4E31 * 3); envCtx->changeSkyboxNextConfig = envCtx->skyboxConfig; @@ -723,19 +718,7 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 arg2) { } if (gSaveContext.retainWeatherMode || (gSaveContext.respawnFlag != 0)) { - // if (gWeatherMode == WEATHER_MODE_2) { - // if (1) {} - // if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) { - // play->skyboxId = SKYBOX_3; - // envCtx->lightConfig = 5; - // envCtx->changeLightNextConfig = 5; - // D_801F4E74 = 1.0f; - // } else { - // gWeatherMode = WEATHER_MODE_CLEAR; - // } - // } - - switch (gWeatherMode) { + switch ((u32)gWeatherMode) { case WEATHER_MODE_2: if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_CLEARED_STONE_TOWER_TEMPLE)) { play->skyboxId = SKYBOX_3; @@ -755,7 +738,7 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 arg2) { play->envCtx.precipitation[PRECIP_SNOW_MAX] = 0; if (gWeatherMode == WEATHER_MODE_1) { - if ((CURRENT_DAY == 2) && (((void)0, gSaveContext.save.time) >= CLOCK_TIME(7, 0)) && + if (((u32)CURRENT_DAY == 2) && (((void)0, gSaveContext.save.time) >= CLOCK_TIME(7, 0)) && (((void)0, gSaveContext.save.time) < CLOCK_TIME(17, 30))) { if (Environment_GetStormState(play) != STORM_STATE_OFF) { play->envCtx.precipitation[PRECIP_RAIN_MAX] = 60; @@ -821,9 +804,6 @@ void Environment_Init(PlayState* play2, EnvironmentContext* envCtx, s32 arg2) { Environment_UpdatePostmanEvents(play); } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_Init.s") -#endif u8 Environment_SmoothStepToU8(u8* pvalue, u8 target, u8 scale, u8 step, u8 minStep) { s16 stepSize = 0; From 28e2da2a18ddf1fc2dd81199e73eb18252684b43 Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo Nitti <96613413+sonicdcer@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:32:25 -0300 Subject: [PATCH 13/28] Match func_809F24C8 NON_MATCHING (#1465) * fix func_809F24C8 * reloc --- spec | 4 ---- src/overlays/actors/ovl_Boss_06/z_boss_06.c | 5 ----- src/overlays/actors/ovl_En_Knight/z_en_knight.h | 4 ++-- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/spec b/spec index c8e02a251..705786d9b 100644 --- a/spec +++ b/spec @@ -2328,11 +2328,7 @@ beginseg name "ovl_Boss_06" compress include "build/src/overlays/actors/ovl_Boss_06/z_boss_06.o" -#ifdef NON_MATCHING include "build/src/overlays/actors/ovl_Boss_06/ovl_Boss_06_reloc.o" -#else - include "build/data/ovl_Boss_06/ovl_Boss_06.reloc.o" -#endif endseg beginseg diff --git a/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/src/overlays/actors/ovl_Boss_06/z_boss_06.c index 92db6dc89..a06fe25d1 100644 --- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c +++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c @@ -182,8 +182,6 @@ void func_809F24A8(Boss06* this) { this->unk_1AC = 0.0f; } -#ifdef NON_MATCHING -// The 1 constant from the switch branch is reused in case 2 for some reason. void func_809F24C8(Boss06* this, PlayState* play) { s16 sp4E = 0; Player* player = GET_PLAYER(play); @@ -344,9 +342,6 @@ void func_809F24C8(Boss06* this, PlayState* play) { Play_SetCameraAtEye(play, this->subCamId, &this->subCamAt, &this->subCamEye); } } -#else -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Boss_06/func_809F24C8.s") -#endif void func_809F2B64(Boss06* this, PlayState* play) { this->actionFunc = func_809F2C44; diff --git a/src/overlays/actors/ovl_En_Knight/z_en_knight.h b/src/overlays/actors/ovl_En_Knight/z_en_knight.h index 2d413fea3..dc8fb1bca 100644 --- a/src/overlays/actors/ovl_En_Knight/z_en_knight.h +++ b/src/overlays/actors/ovl_En_Knight/z_en_knight.h @@ -11,9 +11,9 @@ typedef struct EnKnight { /* 0x000 */ Actor actor; /* 0x144 */ s16 unk_144; /* 0x146 */ char unk_146[0x2]; - /* 0x148 */ s8 unk_148; + /* 0x148 */ u8 unk_148; /* 0x149 */ char unk_149[0x8]; - /* 0x151 */ s8 unk_151; + /* 0x151 */ u8 unk_151; /* 0x152 */ char unk_152[0x1]; /* 0x153 */ u8 unk_153; /* 0x154 */ u8 unk_154; From dfb6c5b02c1d0c201d7201aa4b0b121d3f2d5683 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Wed, 8 Nov 2023 00:52:09 +1100 Subject: [PATCH 14/28] Struct Returns (#1466) * change args * more funcs * cleanup * play cleanup * missed a file * weird warnings * missed some * fix func from honotrap --- include/functions.h | 34 +- src/code/cutscene_camera.c | 4 +- src/code/z_actor.c | 17 +- src/code/z_camera.c | 444 +++++++++--------- src/code/z_olib.c | 82 ++-- src/code/z_play.c | 30 +- src/code/z_quake.c | 10 +- src/code/z_room.c | 5 +- src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c | 2 +- src/overlays/actors/ovl_En_Butte/z_en_butte.c | 2 +- .../actors/ovl_En_Honotrap/z_en_honotrap.c | 2 +- .../actors/ovl_Oceff_Wipe/z_oceff_wipe.c | 4 +- .../actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c | 4 +- .../actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c | 4 +- .../actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c | 4 +- .../actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c | 2 +- .../actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c | 7 +- .../actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c | 4 +- 18 files changed, 303 insertions(+), 358 deletions(-) diff --git a/include/functions.h b/include/functions.h index 84c6c0615..0e0e3dcbb 100644 --- a/include/functions.h +++ b/include/functions.h @@ -328,9 +328,9 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight, Hilite* Hilite_DrawOpa(Vec3f* object, Vec3f* eye, Vec3f* lightDir, GraphicsContext* gfxCtx); void func_800B8050(Actor* actor, PlayState* play, s32 flag); void func_800B8118(Actor* actor, PlayState* play, s32 flag); -PosRot* Actor_GetFocus(PosRot* dest, Actor* actor); -PosRot* Actor_GetWorld(PosRot* dest, Actor* actor); -PosRot* Actor_GetWorldPosShapeRot(PosRot* dest, Actor* actor); +PosRot Actor_GetFocus(Actor* actor); +PosRot Actor_GetWorld(Actor* actor); +PosRot Actor_GetWorldPosShapeRot(Actor* actor); s32 Target_OutsideLeashRange(Actor* actor, Player* player, s32 ignoreLeash); s32 Actor_ProcessTalkRequest(Actor* actor, GameState* gameState); @@ -479,10 +479,10 @@ s32 Camera_CheckValidMode(Camera* camera, s16 mode); s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags); s32 Camera_ChangeSetting(Camera* camera, s16 setting); s32 Camera_ChangeActorCsCamIndex(Camera* camera, s32 bgCamIndex); -Vec3s* Camera_GetInputDir(Vec3s* dst, Camera* camera); +Vec3s Camera_GetInputDir(Camera* camera); s16 Camera_GetInputDirPitch(Camera* camera); s16 Camera_GetInputDirYaw(Camera* camera); -Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera); +Vec3s Camera_GetCamDir(Camera* camera); s16 Camera_GetCamDirPitch(Camera* camera); s16 Camera_GetCamDirYaw(Camera* camera); s32 Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown); @@ -494,7 +494,7 @@ s16 Camera_UnsetStateFlag(Camera* camera, s16 flags); s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2, s16 timer3); s32 Camera_Copy(Camera* dstCam, Camera* srcCam); s32 Camera_IsDbgCamEnabled(void); -Vec3f* Camera_GetQuakeOffset(Vec3f* quakeOffset, Camera* camera); +Vec3f Camera_GetQuakeOffset(Camera* camera); void Camera_SetCameraData(Camera* camera, s16 setDataFlags, void* data0, void* data1, s16 data2, s16 data3); s32 Camera_GetNegOne(void); s16 func_800E0238(Camera* camera); @@ -757,17 +757,17 @@ f32 OLib_Vec3fDistOutDiff(Vec3f* a, Vec3f* b, Vec3f* dest); f32 OLib_Vec3fDistXZ(Vec3f* a, Vec3f* b); f32 OLib_ClampMinDist(f32 val, f32 min); f32 OLib_ClampMaxDist(f32 val, f32 max); -Vec3f* OLib_Vec3fDistNormalize(Vec3f* dest, Vec3f* a, Vec3f* b); -Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph); -Vec3f* OLib_VecGeoToVec3f(Vec3f* dest, VecGeo* geo); -VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec); -VecGeo* OLib_Vec3fToVecGeo(VecGeo* dest, Vec3f* vec); -VecSph* OLib_Vec3fDiffToVecSph(VecSph* dest, Vec3f* a, Vec3f* b); -VecGeo* OLib_Vec3fDiffToVecGeo(VecGeo* dest, Vec3f* a, Vec3f* b); -Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo); -Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b); -Vec3f* OLib_Vec3fDiffDegF(Vec3f* dest, Vec3f* a, Vec3f* b); -Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b); +Vec3f OLib_Vec3fDistNormalize(Vec3f* a, Vec3f* b); +Vec3f OLib_VecSphToVec3f(VecSph* sph); +Vec3f OLib_VecGeoToVec3f(VecGeo* geo); +VecSph OLib_Vec3fToVecSph(Vec3f* vec); +VecGeo OLib_Vec3fToVecGeo(Vec3f* vec); +VecSph OLib_Vec3fDiffToVecSph(Vec3f* a, Vec3f* b); +VecGeo OLib_Vec3fDiffToVecGeo(Vec3f* a, Vec3f* b); +Vec3f OLib_AddVecGeoToVec3f(Vec3f* a, VecGeo* geo); +Vec3f OLib_Vec3fDiffRad(Vec3f* a, Vec3f* b); +Vec3f OLib_Vec3fDiffDegF(Vec3f* a, Vec3f* b); +Vec3s OLib_Vec3fDiffBinAng(Vec3f* a, Vec3f* b); void OLib_Vec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode); void OLib_Vec3fAdd(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode); diff --git a/src/code/cutscene_camera.c b/src/code/cutscene_camera.c index 24f6fcc18..d5f3ef4a3 100644 --- a/src/code/cutscene_camera.c +++ b/src/code/cutscene_camera.c @@ -516,9 +516,9 @@ s16 CutsceneCamera_Interp_Geo(Vec3f* camPos, f32* camFov, s16* camRoll, CsCmdCam interpState->curFrame++; if (camPos != NULL) { - OLib_Vec3fDiffToVecGeo(&sp40, &interpState->curPos, camPos); + sp40 = OLib_Vec3fDiffToVecGeo(&interpState->curPos, camPos); sp40.r = interpState->unk_20 / Math_FTanF(DEG_TO_RAD(*camFov)); - OLib_AddVecGeoToVec3f(camPos, &interpState->curPos, &sp40); + *camPos = OLib_AddVecGeoToVec3f(&interpState->curPos, &sp40); } if (camFov != NULL) { diff --git a/src/code/z_actor.c b/src/code/z_actor.c index aacee620b..887e08dcd 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -1815,19 +1815,15 @@ void func_800B8118(Actor* actor, PlayState* play, s32 flag) { } } -PosRot* Actor_GetFocus(PosRot* dest, Actor* actor) { - *dest = actor->focus; - - return dest; +PosRot Actor_GetFocus(Actor* actor) { + return actor->focus; } -PosRot* Actor_GetWorld(PosRot* dest, Actor* actor) { - *dest = actor->world; - - return dest; +PosRot Actor_GetWorld(Actor* actor) { + return actor->world; } -PosRot* Actor_GetWorldPosShapeRot(PosRot* dest, Actor* actor) { +PosRot Actor_GetWorldPosShapeRot(Actor* actor) { PosRot sp1C; Math_Vec3f_Copy(&sp1C.pos, &actor->world.pos); @@ -1837,9 +1833,8 @@ PosRot* Actor_GetWorldPosShapeRot(PosRot* dest, Actor* actor) { sp1C.pos.y += player->unk_AC0 * actor->scale.y; } sp1C.rot = actor->shape.rot; - *dest = sp1C; - return dest; + return sp1C; } /** diff --git a/src/code/z_camera.c b/src/code/z_camera.c index a64793632..b0721592a 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -246,14 +246,13 @@ void Camera_SetUpdateRatesSlow(Camera* camera) { camera->fovUpdateRate = 0.01f; } -Vec3f* Camera_Vec3sToVec3f(Vec3f* dest, Vec3s* src) { - Vec3f copy; +Vec3f Camera_Vec3sToVec3f(Vec3s* src) { + Vec3f dest; - copy.x = src->x; - copy.y = src->y; - copy.z = src->z; + dest.x = src->x; + dest.y = src->y; + dest.z = src->z; - *dest = copy; return dest; } @@ -281,7 +280,7 @@ f32 Camera_GetFocalActorHeight(Camera* camera) { if (focalActor == &GET_PLAYER(camera->play)->actor) { focalActorHeight = Player_GetHeight((Player*)focalActor); } else { - Actor_GetFocus(&focalActorFocus, focalActor); + focalActorFocus = Actor_GetFocus(focalActor); focalActorHeight = focalActorFocus.pos.y - camera->focalActorPosRot.pos.y; if (focalActorHeight == 0.0f) { focalActorHeight = 10.0f; @@ -477,17 +476,15 @@ PlayerMeleeWeaponState func_800CBAAC(Camera* camera) { } } -Vec3f* Camera_GetFocalActorPos(Vec3f* dst, Camera* camera) { +Vec3f Camera_GetFocalActorPos(Camera* camera) { PosRot focalPosRot; Actor* focalActor = camera->focalActor; if (camera->focalActor == &GET_PLAYER(camera->play)->actor) { - *dst = ((Player*)focalActor)->bodyPartsPos[PLAYER_BODYPART_WAIST]; - return dst; + return ((Player*)focalActor)->bodyPartsPos[PLAYER_BODYPART_WAIST]; } else { - Actor_GetWorldPosShapeRot(&focalPosRot, camera->focalActor); - *dst = focalPosRot.pos; - return dst; + focalPosRot = Actor_GetWorldPosShapeRot(camera->focalActor); + return focalPosRot.pos; } } @@ -551,7 +548,7 @@ s32 func_800CBC84(Camera* camera, Vec3f* from, CameraCollision* to, s32 arg3) { CollisionPoly** floorPoly; s32 floorBgId; - OLib_Vec3fDistNormalize(&fromToNorm, from, &to->pos); + fromToNorm = OLib_Vec3fDistNormalize(from, &to->pos); toPoint.x = to->pos.x + fromToNorm.x; toPoint.y = to->pos.y + fromToNorm.y; toPoint.z = to->pos.z + fromToNorm.z; @@ -630,7 +627,7 @@ s32 Camera_BgCheckInfo(Camera* camera, Vec3f* from, CameraCollision* to) { return to->bgId + 1; } - OLib_Vec3fDistNormalize(&fromToNorm, from, &to->pos); + fromToNorm = OLib_Vec3fDistNormalize(from, &to->pos); to->norm.x = -fromToNorm.x; to->norm.y = -fromToNorm.y; to->norm.z = -fromToNorm.z; @@ -686,13 +683,13 @@ s16 func_800CC260(Camera* camera, Vec3f* arg1, Vec3f* arg2, VecGeo* arg3, Actor* s32 i; sp64 = *arg2; - Actor_GetFocus(&playerFocus, &player->actor); // playerFocus unused + playerFocus = Actor_GetFocus(&player->actor); // playerFocus unused sp90 = *arg3; angleCount = ARRAY_COUNT(D_801B9E18); for (i = 0; i < angleCount; i++) { - OLib_AddVecGeoToVec3f(arg1, arg2, &sp90); + *arg1 = OLib_AddVecGeoToVec3f(arg2, &sp90); if (!Camera_CheckOOB(camera, arg1, &sp64) && !func_800CBC30(camera, arg2->y, arg1->y) && !CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, arg2, arg1, exclusions, @@ -848,7 +845,7 @@ s32 Camera_GetWaterBoxBgCamSetting(Camera* camera, f32* waterY) { s32 camSetting; s32 bgId; - Actor_GetWorldPosShapeRot(&playerPosShape, camera->focalActor); + playerPosShape = Actor_GetWorldPosShapeRot(camera->focalActor); *waterY = playerPosShape.pos.y; if (!WaterBox_GetSurfaceImpl(camera->play, &camera->play->colCtx, playerPosShape.pos.x, playerPosShape.pos.z, @@ -1076,7 +1073,7 @@ f32 func_800CCCEC(Camera* camera, s16 reset) { /** * Calculates a new Up vector from the pitch, yaw, roll */ -Vec3f* Camera_CalcUpVec(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) { +Vec3f Camera_CalcUpVec(s16 pitch, s16 yaw, s16 roll) { f32 sinP = Math_SinS(pitch); f32 cosP = Math_CosS(pitch); f32 sinY = Math_SinS(yaw); @@ -1119,9 +1116,7 @@ Vec3f* Camera_CalcUpVec(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) { up.y = DOTXYZ(baseUp, rollMtxRow2); up.z = DOTXYZ(baseUp, rollMtxRow3); - *viewUp = up; - - return viewUp; + return up; } f32 Camera_ClampLerpScale(Camera* camera, f32 maxLerpScale) { @@ -1183,14 +1178,13 @@ void Camera_UpdateInterface(s32 interfaceFlags) { } } -Vec3f* Camera_BgCheckCorner(Vec3f* dst, Vec3f* linePointA, Vec3f* linePointB, CameraCollision* pointAColChk, - CameraCollision* pointBColChk) { +Vec3f Camera_BgCheckCorner(Vec3f* linePointA, Vec3f* linePointB, CameraCollision* pointAColChk, + CameraCollision* pointBColChk) { Vec3f closestPoint; func_800CAA14(pointAColChk->poly, pointBColChk->poly, linePointA, linePointB, &closestPoint); - *dst = closestPoint; - return dst; + return closestPoint; } /** @@ -1221,7 +1215,7 @@ s32 func_800CD44C(Camera* camera, VecGeo* diffGeo, CameraCollision* camEyeCollis // collision found between at->ey camAtCollision->pos = *at; - OLib_Vec3fToVecGeo(&camEyeCollision->geoNorm, &camEyeCollision->norm); + camEyeCollision->geoNorm = OLib_Vec3fToVecGeo(&camEyeCollision->norm); if (camEyeCollision->geoNorm.pitch > 0x2EE0) { // 65.9 degrees camEyeCollision->geoNorm.yaw = diffGeo->yaw; @@ -1247,7 +1241,7 @@ s32 func_800CD44C(Camera* camera, VecGeo* diffGeo, CameraCollision* camEyeCollis return 3; } - OLib_Vec3fToVecGeo(&camAtCollision->geoNorm, &camAtCollision->norm); + camAtCollision->geoNorm = OLib_Vec3fToVecGeo(&camAtCollision->norm); if (camAtCollision->geoNorm.pitch > 0x2EE0) { // 65.9 degrees camAtCollision->geoNorm.yaw = BINANG_ROT180(diffGeo->yaw); @@ -1277,7 +1271,7 @@ f32 Camera_CalcSlopeYAdj(Vec3f* floorNorm, s16 playerYRot, s16 eyeAtYaw, f32 adj f32 tmp; VecGeo floorNormGeo; - OLib_Vec3fToVecGeo(&floorNormGeo, floorNorm); + floorNormGeo = OLib_Vec3fToVecGeo(floorNorm); tmp = Math_CosS(floorNormGeo.pitch) * Math_CosS(playerYRot - floorNormGeo.yaw); @@ -1425,7 +1419,7 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32 xzOf focalActorAtOffsetTargetGeo.r = func_800CCCEC(camera, flags & 0x10); focalActorAtOffsetTargetGeo.yaw = focalActorPosRot->rot.y + 0x4000; focalActorAtOffsetTargetGeo.pitch = 0; - OLib_VecGeoToVec3f(&focalActorAtOffsetTarget, &focalActorAtOffsetTargetGeo); + focalActorAtOffsetTarget = OLib_VecGeoToVec3f(&focalActorAtOffsetTargetGeo); } else { f32 xOffset = camera->focalActorAtOffset.x + camera->unk_0F0.x; f32 zOffset = camera->focalActorAtOffset.z + camera->unk_0F0.z; @@ -1512,9 +1506,9 @@ s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targ atTarget = focalActorPosRot->pos; atTarget.y += focalActorHeight; - OLib_Vec3fDiffToVecGeo(outPlayerToTargetDir, &atTarget, targetPos); - + *outPlayerToTargetDir = OLib_Vec3fDiffToVecGeo(&atTarget, targetPos); sp5C = *outPlayerToTargetDir; + sp5C.r = (distance < sp5C.r) ? (sp5C.r * 0.2f) : ((sp5C.r * 0.9f) - (sp5C.r * 0.7f * (sp5C.r / distance))); if (flags & FLG_OFFGROUND) { @@ -1522,7 +1516,7 @@ s32 Camera_CalcAtForFriendlyLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targ camera->yOffsetUpdateRate = camera->xzOffsetUpdateRate = 0.01f; } - OLib_VecGeoToVec3f(&sp68, &sp5C); + sp68 = OLib_VecGeoToVec3f(&sp5C); focalActorAtOffsetTarget.x += sp68.x; focalActorAtOffsetTarget.y += sp68.y; @@ -1604,7 +1598,7 @@ s32 Camera_CalcAtForEnemyLockOn(Camera* camera, VecGeo* arg1, Vec3f* arg2, f32 y camera->xzOffsetUpdateRate = 0.01f; } - OLib_VecGeoToVec3f(&sp60, &sp58); + sp60 = OLib_VecGeoToVec3f(&sp58); focalActorAtOffsetTarget.x += sp60.x; focalActorAtOffsetTarget.y += sp60.y; @@ -1672,7 +1666,7 @@ s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yP Player* player = (Player*)camera->focalActor; PosRot horsePosRot; - Actor_GetWorld(&horsePosRot, player->rideActor); + horsePosRot = Actor_GetWorld(player->rideActor); if (EN_HORSE_CHECK_JUMPING((EnHorse*)player->rideActor)) { horsePosRot.pos.y -= 49.0f; @@ -1891,8 +1885,8 @@ void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg switch (sp8C) { case 1: - Camera_BgCheckCorner(&swing->collisionClosePoint, &camera->at, &camera->eyeNext, &swing->atEyeColChk, - &swing->eyeAtColChk); + swing->collisionClosePoint = + Camera_BgCheckCorner(&camera->at, &camera->eyeNext, &swing->atEyeColChk, &swing->eyeAtColChk); // fallthrough case 2: peekAroundPoint.x = swing->collisionClosePoint.x + (swing->atEyeColChk.norm.x + swing->eyeAtColChk.norm.x); @@ -1900,11 +1894,11 @@ void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg peekAroundPoint.z = swing->collisionClosePoint.z + (swing->atEyeColChk.norm.z + swing->eyeAtColChk.norm.z); sp30 = &camera->eyeNext; - OLib_Vec3fDiffToVecGeo(&sp50, at, &peekAroundPoint); + sp50 = OLib_Vec3fDiffToVecGeo(at, &peekAroundPoint); sp50.r = arg1->r; swing->unk_64 = 1; swing->swingUpdateRate = 1.5f; - OLib_AddVecGeoToVec3f(&sp58.pos, at, &sp50); + sp58.pos = OLib_AddVecGeoToVec3f(at, &sp50); if (func_800CBC84(camera, &swing->eyeAtColChk.pos, &sp58, 0) == 0) { sp50.yaw = @@ -1934,12 +1928,12 @@ void Camera_CalcDefaultSwing(Camera* camera, VecGeo* arg1, VecGeo* arg2, f32 arg sp50.pitch = Math_CosS(swing->atEyeColChk.geoNorm.pitch) * 0x3FFC; } sp50.r = 60.0f - sp88; - OLib_AddVecGeoToVec3f(&sp58.pos, sp30, &sp50); + sp58.pos = OLib_AddVecGeoToVec3f(sp30, &sp50); } else { sp50.yaw = Camera_AngleDiffAndScale(arg1->yaw, arg2->yaw, camera->speedRatio) + arg2->yaw; sp50.pitch = Camera_AngleDiffAndScale(arg1->pitch, arg2->pitch, camera->speedRatio) + arg2->pitch; sp50.r = arg1->r; - OLib_AddVecGeoToVec3f(&sp58.pos, at, &sp50); + sp58.pos = OLib_AddVecGeoToVec3f(at, &sp50); } func_800CBC84(camera, at, &sp58, 0); *eye = sp58.pos; @@ -2007,8 +2001,8 @@ s32 Camera_Normal1(Camera* camera) { sCameraInterfaceFlags = roData->interfaceFlags; - OLib_Vec3fDiffToVecGeo(&spA4, at, eye); - OLib_Vec3fDiffToVecGeo(&sp9C, at, eyeNext); + spA4 = OLib_Vec3fDiffToVecGeo(at, eye); + sp9C = OLib_Vec3fDiffToVecGeo(at, eyeNext); switch (camera->animState) { case 20: @@ -2168,7 +2162,7 @@ s32 Camera_Normal1(Camera* camera) { rwData->unk_10 = 120.0f; } - OLib_Vec3fDiffToVecGeo(&spB4, at, eyeNext); + spB4 = OLib_Vec3fDiffToVecGeo(at, eyeNext); if ((roData->interfaceFlags & NORMAL1_FLAG_7) && (rwData->unk_0A < 0)) { if (camera->focalActor == &GET_PLAYER(camera->play)->actor) { @@ -2225,7 +2219,7 @@ s32 Camera_Normal1(Camera* camera) { if (1) {} temp = &D_801ED920->world.pos; - OLib_Vec3fDiffToVecGeo(&sp74, &sp40->pos, temp); + sp74 = OLib_Vec3fDiffToVecGeo(&sp40->pos, temp); sp72 = sp40->rot.y - sp74.yaw; // Interface and shrink-window flags if ((roData->interfaceFlags & 0xFF00) == 0xFF00) { @@ -2252,7 +2246,7 @@ s32 Camera_Normal1(Camera* camera) { VecGeo sp64; if ((camera->speedRatio > 0.1f) || (rwData->unk_0A > 0x4B0)) { - OLib_Vec3fToVecGeo(&sp64, &camera->unk_0F0); + sp64 = OLib_Vec3fToVecGeo(&camera->unk_0F0); if (!(roData->interfaceFlags & NORMAL1_FLAG_3) || !func_800CB924(camera)) { spB4.yaw = Camera_CalcDefaultYaw(camera, sp9C.yaw, sp64.yaw, roData->unk_14, spC0); } @@ -2282,7 +2276,7 @@ s32 Camera_Normal1(Camera* camera) { spB4.pitch = -0x36B0; } - OLib_AddVecGeoToVec3f(eyeNext, at, &spB4); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spB4); if ((camera->status == CAM_STATUS_ACTIVE) && !(roData->interfaceFlags & NORMAL1_FLAG_4) && (spC4 <= 0.9f)) { if (!func_800CBA7C(camera)) { @@ -2308,7 +2302,7 @@ s32 Camera_Normal1(Camera* camera) { } } - OLib_Vec3fDiffToVecGeo(&spAC, eye, at); + spAC = OLib_Vec3fDiffToVecGeo(eye, at); camera->inputDir.x = spAC.pitch; camera->inputDir.y = spAC.yaw; camera->inputDir.z = 0; @@ -2404,8 +2398,8 @@ s32 Camera_Normal3(Camera* camera) { roData->interfaceFlags = GET_NEXT_RO_DATA(values); } - OLib_Vec3fDiffToVecGeo(&sp70, at, eye); - OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext); + sp70 = OLib_Vec3fDiffToVecGeo(at, eye); + sp68 = OLib_Vec3fDiffToVecGeo(at, eyeNext); sUpdateCameraDirection = true; sCameraInterfaceFlags = roData->interfaceFlags; @@ -2470,7 +2464,7 @@ s32 Camera_Normal3(Camera* camera) { } sp88 = (roData->distMax + roData->distMin) * 0.5f; - OLib_Vec3fDiffToVecGeo(&sp80, at, eyeNext); + sp80 = OLib_Vec3fDiffToVecGeo(at, eyeNext); temp_f2 = Camera_ClampDist1(camera, sp80.r, roData->distMin, roData->distMax, rwData->distTimer); phi_f2 = sp88 - temp_f2; @@ -2495,7 +2489,7 @@ s32 Camera_Normal3(Camera* camera) { temp_f2 = 1.0f; } else { sp62 = BINANG_SUB(focalActorPosRot->rot.y, BINANG_ROT180(sp68.yaw)); - OLib_Vec3fToVecGeo(&sp78, &camera->unk_0F0); + sp78 = OLib_Vec3fToVecGeo(&camera->unk_0F0); phi_v1_2 = focalActorPosRot->rot.y - sp78.yaw; if (phi_v1_2 < 0) { phi_v1_2 *= -1; @@ -2521,7 +2515,7 @@ s32 Camera_Normal3(Camera* camera) { } } - OLib_AddVecGeoToVec3f(eyeNext, at, &sp80); + *eyeNext = OLib_AddVecGeoToVec3f(at, &sp80); if (camera->status == CAM_STATUS_ACTIVE) { *eye = *eyeNext; @@ -2610,7 +2604,7 @@ s32 Camera_Normal0(Camera* camera) { if (RELOAD_PARAMS(camera)) { bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex); - Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos); + rwData->unk_00 = Camera_Vec3sToVec3f(&bgCamFuncData->pos); rwData->unk_20 = bgCamFuncData->rot.x; rwData->unk_22 = bgCamFuncData->rot.y; rwData->unk_24 = focalActorPosRot->pos.y; @@ -2638,7 +2632,7 @@ s32 Camera_Normal0(Camera* camera) { sp88.pitch = rwData->unk_20; sp88.yaw = rwData->unk_22; sp88.r = 100.0f; - OLib_VecGeoToVec3f(&rwData->unk_0C, &sp88); + rwData->unk_0C = OLib_VecGeoToVec3f(&sp88); } camera->animState = 1; camera->yawUpdateRateInv = 50.0f; @@ -2650,8 +2644,8 @@ s32 Camera_Normal0(Camera* camera) { if (1) {} } - OLib_Vec3fDiffToVecGeo(&sp80, at, eye); - OLib_Vec3fDiffToVecGeo(&sp78, at, eyeNext); + sp80 = OLib_Vec3fDiffToVecGeo(at, eye); + sp78 = OLib_Vec3fDiffToVecGeo(at, eyeNext); camera->speedRatio *= 0.50f; spA4 = camera->speedRatio * 0.5f; @@ -2680,8 +2674,8 @@ s32 Camera_Normal0(Camera* camera) { } rwData->unk_00.y = focalActorPosRot->pos.y; - OLib_Vec3fDiffToVecGeo(&sp88, &rwData->unk_00, at); - OLib_Vec3fDiffToVecGeo(&sp90, at, eyeNext); + sp88 = OLib_Vec3fDiffToVecGeo(&rwData->unk_00, at); + sp90 = OLib_Vec3fDiffToVecGeo(at, eyeNext); if (rwData->unk_2C & 2) { phi_a1 = rwData->unk_22; @@ -2727,7 +2721,7 @@ s32 Camera_Normal0(Camera* camera) { sp98.pitch += ((s16)(-0x38E - sp98.pitch) >> 2); } } - OLib_AddVecGeoToVec3f(eyeNext, at, &sp98); + *eyeNext = OLib_AddVecGeoToVec3f(at, &sp98); *eye = *eyeNext; @@ -2736,7 +2730,7 @@ s32 Camera_Normal0(Camera* camera) { Camera_BgCheck(camera, at, eye); } else { func_800CBFA4(camera, at, eye, 3); - OLib_Vec3fDiffToVecGeo(&sp98, eye, at); + sp98 = OLib_Vec3fDiffToVecGeo(eye, at); camera->inputDir.x = sp98.pitch; camera->inputDir.y = sp98.yaw; camera->inputDir.z = 0; @@ -2800,9 +2794,9 @@ s32 Camera_Parallel1(Camera* camera) { rwData->unk_00 = roData->unk_04; } - OLib_Vec3fDiffToVecGeo(&sp80, at, eye); - OLib_Vec3fDiffToVecGeo(&sp78, at, eyeNext); - Camera_GetFocalActorPos(&spA4, camera); + sp80 = OLib_Vec3fDiffToVecGeo(at, eye); + sp78 = OLib_Vec3fDiffToVecGeo(at, eyeNext); + spA4 = Camera_GetFocalActorPos(camera); switch (camera->animState) { case 20: @@ -2831,7 +2825,7 @@ s32 Camera_Parallel1(Camera* camera) { camera->dist = 2.0f * roData->unk_04; sp78.r = camera->dist; sp80.r = sp78.r; - OLib_AddVecGeoToVec3f(eye, at, &sp80); + *eye = OLib_AddVecGeoToVec3f(at, &sp80); *eyeNext = *eye; } @@ -2895,7 +2889,7 @@ s32 Camera_Parallel1(Camera* camera) { case (PARALLEL1_FLAG_2 | PARALLEL1_FLAG_1): if (rwData->timer3 == 1) { - OLib_Vec3fDiffToVecGeo(&sp88, &rwData->unk_10, &spA4); + sp88 = OLib_Vec3fDiffToVecGeo(&rwData->unk_10, &spA4); rwData->unk_1E = ((ABS(BINANG_SUB(sp88.yaw, sp80.yaw)) < 0x3A98) || Camera_IsClimbingLedge(camera)) ? sp80.yaw : sp80.yaw + (s16)((BINANG_SUB(sp88.yaw, sp80.yaw) >> 2) * 3); @@ -3025,7 +3019,7 @@ s32 Camera_Parallel1(Camera* camera) { sp90.r = camera->dist; } } else { - OLib_Vec3fDiffToVecGeo(&sp90, at, eyeNext); + sp90 = OLib_Vec3fDiffToVecGeo(at, eyeNext); sp90.r = camera->dist; if (roData->interfaceFlags & PARALLEL1_FLAG_1) { @@ -3061,7 +3055,7 @@ s32 Camera_Parallel1(Camera* camera) { rwData->timer3--; } - OLib_AddVecGeoToVec3f(eyeNext, at, &sp90); + *eyeNext = OLib_AddVecGeoToVec3f(at, &sp90); if (camera->status == CAM_STATUS_ACTIVE) { if ((camera->play->envCtx.skyboxDisabled == 0) || (roData->interfaceFlags & PARALLEL1_FLAG_4)) { @@ -3167,8 +3161,8 @@ s32 Camera_Jump2(Camera* camera) { roData->interfaceFlags = GET_NEXT_RO_DATA(values); } - OLib_Vec3fDiffToVecGeo(&sp9C, at, eye); - OLib_Vec3fDiffToVecGeo(&spA4, at, eyeNext); + sp9C = OLib_Vec3fDiffToVecGeo(at, eye); + spA4 = OLib_Vec3fDiffToVecGeo(at, eyeNext); sCameraInterfaceFlags = roData->interfaceFlags; @@ -3215,7 +3209,7 @@ s32 Camera_Jump2(Camera* camera) { camera->rUpdateRateInv = 1800.0f; Camera_CalcAtDefault(camera, &spA4, roData->unk_00, 0); - OLib_Vec3fDiffToVecGeo(&spB4, at, eye); + spB4 = OLib_Vec3fDiffToVecGeo(at, eye); //! FAKE: Unused yNormal = roData->unk_04; @@ -3271,7 +3265,7 @@ s32 Camera_Jump2(Camera* camera) { spB4.pitch = CLAMP_MAX(spB4.pitch, DEG_TO_BINANG(60.43f)); spB4.pitch = CLAMP_MIN(spB4.pitch, -DEG_TO_BINANG(60.43f)); - OLib_AddVecGeoToVec3f(eyeNext, at, &spB4); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spB4); sp60.pos = *eyeNext; if (func_800CBC84(camera, at, &sp60, 0) != 0) { @@ -3279,12 +3273,12 @@ s32 Camera_Jump2(Camera* camera) { spAC.pitch = 0; spAC.r = spB4.r; spAC.yaw = spB4.yaw; - OLib_AddVecGeoToVec3f(&sp60.pos, at, &spAC); + sp60.pos = OLib_AddVecGeoToVec3f(at, &spAC); if (func_800CBC84(camera, at, &sp60, 0) != 0) { *eye = spC8; } else { spB4.pitch = Camera_ScaledStepToCeilS(0, spB4.pitch, 0.2f, 5); - OLib_AddVecGeoToVec3f(eye, at, &spB4); + *eye = OLib_AddVecGeoToVec3f(at, &spB4); func_800CBFA4(camera, at, eye, 0); } } else { @@ -3330,7 +3324,7 @@ s32 Camera_Jump3(Camera* camera) { s32 sp58; focalActorHeight = Camera_GetFocalActorHeight(camera); - Actor_GetFocus(&focalActorFocus, camera->focalActor); + focalActorFocus = Actor_GetFocus(camera->focalActor); sp60 = camera->waterYPos - sp48->y; sp58 = false; @@ -3367,8 +3361,8 @@ s32 Camera_Jump3(Camera* camera) { rwData->timer2--; } - OLib_Vec3fDiffToVecGeo(&sp9C, sp44, sp48); - OLib_Vec3fDiffToVecGeo(&sp94, sp44, sp40); + sp9C = OLib_Vec3fDiffToVecGeo(sp44, sp48); + sp94 = OLib_Vec3fDiffToVecGeo(sp44, sp40); if (!RELOAD_PARAMS(camera) && !sp58) { } else { @@ -3456,7 +3450,7 @@ s32 Camera_Jump3(Camera* camera) { Camera_CalcAtDefault(camera, &sp94, roData->unk_00, roData->interfaceFlags); } - OLib_Vec3fDiffToVecGeo(&spAC, sp44, sp40); + spAC = OLib_Vec3fDiffToVecGeo(sp44, sp40); spAC.r = Camera_ClampDist1(camera, spAC.r, roData->unk_04, roData->unk_08, rwData->timer1); camera->dist = spAC.r; @@ -3501,7 +3495,7 @@ s32 Camera_Jump3(Camera* camera) { spAC.pitch = -DEG_TO_BINANG(29.995f); } - OLib_AddVecGeoToVec3f(sp40, sp44, &spAC); + *sp40 = OLib_AddVecGeoToVec3f(sp44, &spAC); if ((camera->status == CAM_STATUS_ACTIVE) && !(roData->interfaceFlags & JUMP3_FLAG_6)) { if (func_800CBA7C(camera) == 0) { @@ -3514,7 +3508,7 @@ s32 Camera_Jump3(Camera* camera) { camera->inputDir.y = sp9C.yaw + 0x8000; camera->inputDir.z = 0; } else { - OLib_Vec3fDiffToVecGeo(&spAC, sp48, sp44); + spAC = OLib_Vec3fDiffToVecGeo(sp48, sp44); camera->inputDir.x = spAC.pitch; camera->inputDir.y = spAC.yaw; camera->inputDir.z = 0; @@ -3651,8 +3645,8 @@ s32 Camera_Battle1(Camera* camera) { focalActorHeight += roData->yOffset; - OLib_Vec3fDiffToVecGeo(&atToEyeDir, at, eye); - OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext); + atToEyeDir = OLib_Vec3fDiffToVecGeo(at, eye); + atToEyeNextDir = OLib_Vec3fDiffToVecGeo(at, eyeNext); if ((camera->target == NULL) || (camera->target->update == NULL)) { camera->target = NULL; @@ -3676,7 +3670,7 @@ s32 Camera_Battle1(Camera* camera) { camera->dist = 2.0f * roData->unk_04; atToEyeNextDir.r = camera->dist; atToEyeDir.r = atToEyeNextDir.r; - OLib_AddVecGeoToVec3f(eye, at, &atToEyeDir); + *eye = OLib_AddVecGeoToVec3f(at, &atToEyeDir); *eyeNext = *eye; } } @@ -3699,7 +3693,7 @@ s32 Camera_Battle1(Camera* camera) { camera->atLerpStepScale = Camera_ClampLerpScale(camera, isOffGround ? roData->unk_28 : roData->unk_24); } - Actor_GetFocus(&camera->targetPosRot, camera->target); + camera->targetPosRot = Actor_GetFocus(camera->target); if (rwData->unk_08 != camera->target) { camera->animState = 0; @@ -3708,7 +3702,7 @@ s32 Camera_Battle1(Camera* camera) { sp120 = camera->focalActorPosRot.pos; sp120.y += focalActorHeight; - OLib_Vec3fDiffToVecGeo(&spA4, &sp120, &camera->targetPosRot.pos); + spA4 = OLib_Vec3fDiffToVecGeo(&sp120, &camera->targetPosRot.pos); sp104 = func_800CD6CC(camera->target); if (sp104 > (PREG(86) + 800.0f)) { @@ -3729,12 +3723,12 @@ s32 Camera_Battle1(Camera* camera) { roData->interfaceFlags); sp88 = spA4.yaw; - OLib_Vec3fDiffToVecGeo(&spBC, at, eyeNext); + spBC = OLib_Vec3fDiffToVecGeo(at, eyeNext); spF4 = F32_LERPIMP(roData->unk_04, roData->unk_08, distRatio); camera->rUpdateRateInv = Camera_ScaledStepToCeilF(spF8, camera->rUpdateRateInv, 0.5f, 0.1f); spBC.r = camera->dist = Camera_ScaledStepToCeilF(spF4, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f); - OLib_Vec3fDiffToVecGeo(&atToTargetDir, at, &camera->targetPosRot.pos); + atToTargetDir = OLib_Vec3fDiffToVecGeo(at, &camera->targetPosRot.pos); atToTargetDir.r = spBC.r - (((spBC.r >= atToTargetDir.r) ? atToTargetDir.r : spBC.r) * 0.5f); @@ -3750,7 +3744,7 @@ s32 Camera_Battle1(Camera* camera) { if (rwData->unk_16 != 0) { if (rwData->unk_16 > 0) { sp86 = rwData->unk_16 - 1; - OLib_Vec3fDiffToVecGeo(&spB4, at, eye); + spB4 = OLib_Vec3fDiffToVecGeo(at, eye); spB4.yaw = sp88 + 0x8000; spF8 = (rwData->unk_00 - spB4.r) * (1.0f / 6.0f); sp8A = (s16)(rwData->unk_12 - spB4.yaw) * (1.0f / 6.0f); @@ -3795,7 +3789,7 @@ s32 Camera_Battle1(Camera* camera) { } spBC.pitch = Camera_ScaledStepToCeilS(sp8A, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 5); - OLib_AddVecGeoToVec3f(eyeNext, at, &spBC); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spBC); spC4.pos = *eyeNext; if (camera->status == CAM_STATUS_ACTIVE) { @@ -3809,7 +3803,7 @@ s32 Camera_Battle1(Camera* camera) { } else if (roData->interfaceFlags & BATTLE1_FLAG_1) { func_800CBC84(camera, at, &spC4, 3); } else { - OLib_Vec3fDistNormalize(&sp114, at, &spC4.pos); + sp114 = OLib_Vec3fDistNormalize(at, &spC4.pos); spC4.pos.x -= sp114.x; spC4.pos.y -= sp114.y; spC4.pos.z -= sp114.z; @@ -3839,7 +3833,7 @@ s32 Camera_Battle1(Camera* camera) { spB4.r = 40.0f; sp114 = sp8C->pos; sp114.y += 40.0f; - OLib_AddVecGeoToVec3f(&sp120, &sp114, &spB4); + sp120 = OLib_AddVecGeoToVec3f(&sp114, &spB4); Camera_ScaledStepToCeilVec3f(&sp120, eye, 0.15f, 0.15f, 0.2f); } else if (rwData->unk_1A & 0x10) { if (OLib_Vec3fDist(&spC4.pos, eye) < 20.0f) { @@ -3875,7 +3869,7 @@ s32 Camera_Battle1(Camera* camera) { } } else { rwData->unk_1A &= ~0x10; - OLib_Vec3fDistNormalize(&sp114, at, &spC4.pos); + sp114 = OLib_Vec3fDistNormalize(at, &spC4.pos); spC4.pos.x -= sp114.x; spC4.pos.y -= sp114.y; spC4.pos.z -= sp114.z; @@ -3993,8 +3987,8 @@ s32 Camera_KeepOn1(Camera* camera) { focalActorHeight += roData->yOffset; - OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); - OLib_Vec3fDiffToVecGeo(&atToEyeNext, at, eyeNext); + atToEye = OLib_Vec3fDiffToVecGeo(at, eye); + atToEyeNext = OLib_Vec3fDiffToVecGeo(at, eyeNext); sCameraInterfaceFlags = roData->interfaceFlags; @@ -4013,7 +4007,7 @@ s32 Camera_KeepOn1(Camera* camera) { camera->dist = 2.0f * roData->unk_04; atToEyeNext.r = camera->dist; atToEye.r = atToEyeNext.r; - OLib_AddVecGeoToVec3f(eye, at, &atToEye); + *eye = OLib_AddVecGeoToVec3f(at, &atToEye); *eyeNext = *eye; } } @@ -4032,11 +4026,11 @@ s32 Camera_KeepOn1(Camera* camera) { sp114 = roData->unk_04; if (camera->target->id != ACTOR_EN_BOOM) { - Actor_GetWorldPosShapeRot(&camera->targetPosRot, camera->target); - Actor_GetFocus(&spA8, camera->target); + camera->targetPosRot = Actor_GetWorldPosShapeRot(camera->target); + spA8 = Actor_GetFocus(camera->target); camera->targetPosRot.pos.y = spA8.pos.y; } else { - Actor_GetFocus(&camera->targetPosRot, camera->target); + camera->targetPosRot = Actor_GetFocus(camera->target); } if (rwData->unk_0C != camera->target) { rwData->unk_0C = camera->target; @@ -4063,7 +4057,7 @@ s32 Camera_KeepOn1(Camera* camera) { sp124 = focalActorPosRot->pos; sp124.y += focalActorHeight; - OLib_Vec3fDiffToVecGeo(&spD0, &sp124, &camera->targetPosRot.pos); + spD0 = OLib_Vec3fDiffToVecGeo(&sp124, &camera->targetPosRot.pos); if (spD0.r > sp114) { sp74 = 1.0f; @@ -4071,7 +4065,7 @@ s32 Camera_KeepOn1(Camera* camera) { sp74 = spD0.r / sp114; } - OLib_Vec3fDiffToVecGeo(&spE8, at, eyeNext); + spE8 = OLib_Vec3fDiffToVecGeo(at, eyeNext); if (spE8.r < roData->unk_04) { sp114 = roData->unk_04; @@ -4088,7 +4082,7 @@ s32 Camera_KeepOn1(Camera* camera) { spE8.r = spF8 = camera->dist = Camera_ScaledStepToCeilF(sp114, camera->dist, 1.0f / camera->rUpdateRateInv, 0.1f); sp118 = camera->targetPosRot.pos; - OLib_Vec3fDiffToVecGeo(&spD8, at, &sp118); + spD8 = OLib_Vec3fDiffToVecGeo(at, &sp118); spD8.r = spF8 - (((spD8.r <= spF8) ? spD8.r : spF8) * 0.5f); spE8.r = camera->dist = Camera_ScaledStepToCeilF(spF8, camera->dist, 0.06f, 0.1f); @@ -4102,7 +4096,7 @@ s32 Camera_KeepOn1(Camera* camera) { if (rwData->unk_16 > 0) { sp72 = rwData->unk_16 - 1; spF2 = spD0.yaw; - OLib_Vec3fDiffToVecGeo(&spD0, at, eye); + spD0 = OLib_Vec3fDiffToVecGeo(at, eye); spD0.yaw = spF2 + 0x8000; @@ -4150,7 +4144,7 @@ s32 Camera_KeepOn1(Camera* camera) { } spE8.pitch = Camera_ScaledStepToCeilS(spF2, atToEyeNext.pitch, 1.0f / 9.0f, 5); - OLib_AddVecGeoToVec3f(eyeNext, at, &spE8); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spE8); sp7C.pos = *eyeNext; if (camera->status == CAM_STATUS_ACTIVE) { @@ -4164,7 +4158,7 @@ s32 Camera_KeepOn1(Camera* camera) { } else if (roData->interfaceFlags & KEEPON1_FLAG_1) { func_800CBC84(camera, at, &sp7C, 3); } else { - OLib_Vec3fDistNormalize(&sp130, at, &sp7C.pos); + sp130 = OLib_Vec3fDistNormalize(at, &sp7C.pos); sp7C.pos.x -= sp130.x; sp7C.pos.y -= sp130.y; sp7C.pos.z -= sp130.z; @@ -4191,7 +4185,7 @@ s32 Camera_KeepOn1(Camera* camera) { spE0.r = 40.0f; sp130 = spA4->pos; sp130.y += 40.0f; - OLib_AddVecGeoToVec3f(&sp124, &sp130, &spE0); + sp124 = OLib_AddVecGeoToVec3f(&sp130, &spE0); Camera_ScaledStepToCeilVec3f(&sp124, eye, 0.15f, 0.15f, 0.2f); } else if (rwData->unk_18 & 0x10) { if (OLib_Vec3fDist(&sp7C.pos, eye) < 20.0f) { @@ -4227,7 +4221,7 @@ s32 Camera_KeepOn1(Camera* camera) { } } else { rwData->unk_18 &= ~0x10; - OLib_Vec3fDistNormalize(&sp130, at, &sp7C.pos); + sp130 = OLib_Vec3fDistNormalize(at, &sp7C.pos); sp7C.pos.x -= sp130.x; sp7C.pos.y -= sp130.y; sp7C.pos.z -= sp130.z; @@ -4330,12 +4324,12 @@ s32 Camera_KeepOn3(Camera* camera) { } } - OLib_Vec3fDiffToVecGeo(&sp88, at, eye); - OLib_Vec3fDiffToVecGeo(&sp80, at, eyeNext); - Actor_GetFocus(&camera->targetPosRot, camera->target); + sp88 = OLib_Vec3fDiffToVecGeo(at, eye); + sp80 = OLib_Vec3fDiffToVecGeo(at, eyeNext); + camera->targetPosRot = Actor_GetFocus(camera->target); spD8 = focalActorPosRot->pos; spD8.y += focalActorHeight; - OLib_Vec3fDiffToVecGeo(&spA0, &spD8, &camera->targetPosRot.pos); + spA0 = OLib_Vec3fDiffToVecGeo(&spD8, &camera->targetPosRot.pos); if (RELOAD_PARAMS(camera)) { camera->animState++; @@ -4373,11 +4367,11 @@ s32 Camera_KeepOn3(Camera* camera) { sp90.pitch = -spA0.pitch; spCC = sp70->pos; spCC.y += 30.0f; - OLib_AddVecGeoToVec3f(&spC0, &spCC, &sp90); + spC0 = OLib_AddVecGeoToVec3f(&spCC, &sp90); spCC.x = (camera->targetPosRot.pos.x + spD8.x) * 0.5f; spCC.y = (camera->targetPosRot.pos.y + spD8.y) * 0.5f; spCC.z = (camera->targetPosRot.pos.z + spD8.z) * 0.5f; - OLib_Vec3fDiffToVecGeo(&sp98, &spCC, &spC0); + sp98 = OLib_Vec3fDiffToVecGeo(&spCC, &spC0); if (sp98.pitch < -0x2328) { // 49.4 degrees sp98.pitch = -0x2328; } @@ -4410,7 +4404,7 @@ s32 Camera_KeepOn3(Camera* camera) { spD8 = focalActorPosRot->pos; spD8.y += focalActorHeight; - OLib_AddVecGeoToVec3f(&rwData->unk_10, &spD8, &spA0); + rwData->unk_10 = OLib_AddVecGeoToVec3f(&spD8, &spA0); rwData->unk_10.y += roData->unk_00; spA0.r = spB4; @@ -4418,13 +4412,13 @@ s32 Camera_KeepOn3(Camera* camera) { sp98.r = ((roData->unk_04 + (spA0.r * 0.5f)) - sp80.r) + sp80.r; i = 0; sp78 = 14; - OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98); + spCC = OLib_AddVecGeoToVec3f(&rwData->unk_10, &sp98); if (!(roData->interfaceFlags & KEEPON3_FLAG_7)) { if (CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &rwData->unk_10, &spCC, spA8, 2) || Camera_BgCheck(camera, &rwData->unk_10, &spCC)) { sp98.yaw = sp6A; - OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98); + spCC = OLib_AddVecGeoToVec3f(&rwData->unk_10, &sp98); } while (i < sp78) { if (!CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &rwData->unk_10, &spCC, @@ -4434,7 +4428,7 @@ s32 Camera_KeepOn3(Camera* camera) { } sp98.yaw = sp6C + D_801B9E18[i]; sp98.pitch = sp6E + D_801B9E34[i]; - OLib_AddVecGeoToVec3f(&spCC, &rwData->unk_10, &sp98); + spCC = OLib_AddVecGeoToVec3f(&rwData->unk_10, &sp98); i++; } } @@ -4462,7 +4456,7 @@ s32 Camera_KeepOn3(Camera* camera) { sp98.r = (rwData->unk_00 * timer) + sp80.r + 1.0f; sp98.yaw = sp80.yaw + (s16)(rwData->unk_04 * timer); sp98.pitch = sp80.pitch + (s16)(rwData->unk_08 * timer); - OLib_AddVecGeoToVec3f(eyeNext, at, &sp98); + *eyeNext = OLib_AddVecGeoToVec3f(at, &sp98); *eye = *eyeNext; camera->fov = Camera_ScaledStepToCeilF(roData->unk_20, camera->fov, 0.5f, 0.1f); camera->roll = Camera_ScaledStepToCeilS(0, camera->roll, 0.5f, 5); @@ -4605,9 +4599,9 @@ s32 Camera_KeepOn4(Camera* camera) { sUpdateCameraDirection = true; sCameraInterfaceFlags = roData->interfaceFlags; - OLib_Vec3fDiffToVecGeo(&spB0, at, eye); + spB0 = OLib_Vec3fDiffToVecGeo(at, eye); data = &D_801EDDD0; - OLib_Vec3fDiffToVecGeo(&spA8, at, eyeNext); + spA8 = OLib_Vec3fDiffToVecGeo(at, eyeNext); D_801EDDD0 = focalActorPosRot->pos; D_801EDDD0.y = data->y + focalActorHeight; temp_f0_2 = BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &spC0, &bgId, &D_801EDDD0); @@ -4623,7 +4617,7 @@ s32 Camera_KeepOn4(Camera* camera) { spB8.r = roData->unk_10; spB8.pitch = 0; spB8.yaw = focalActorPosRot->rot.y; - OLib_AddVecGeoToVec3f(&D_801EDDD0, &D_801EDDD0, &spB8); + D_801EDDD0 = OLib_AddVecGeoToVec3f(&D_801EDDD0, &spB8); } sp9C = 0; @@ -4664,7 +4658,7 @@ s32 Camera_KeepOn4(Camera* camera) { case KEEPON4_FLAG_3: if (camera->target != NULL) { - Actor_GetWorldPosShapeRot(&sp60, camera->target); + sp60 = Actor_GetWorldPosShapeRot(camera->target); spA2 = CAM_DEG_TO_BINANG(roData->unk_08) - sp60.rot.x; spA0 = (BINANG_SUB(BINANG_ROT180(sp60.rot.y), spA8.yaw) > 0) ? BINANG_ROT180(sp60.rot.y) + CAM_DEG_TO_BINANG(roData->unk_0C) @@ -4677,7 +4671,7 @@ s32 Camera_KeepOn4(Camera* camera) { // fallthrough case (KEEPON4_FLAG_3 | KEEPON4_FLAG_1): if (camera->target != 0) { - Actor_GetWorld(&sp4C, camera->target); + sp4C = Actor_GetWorld(camera->target); spA2 = CAM_DEG_TO_BINANG(roData->unk_08); sp9E = Camera_CalcXZAngle(&sp4C.pos, &focalActorPosRot->pos); spA0 = (BINANG_SUB(sp9E, spA8.yaw) > 0) ? sp9E + CAM_DEG_TO_BINANG(roData->unk_0C) @@ -4749,7 +4743,7 @@ s32 Camera_KeepOn4(Camera* camera) { spB8.yaw = Camera_ScaledStepToCeilS(rwData->unk_10, spA8.yaw, roData->unk_14, 5); spB8.pitch = Camera_ScaledStepToCeilS(rwData->unk_12, spA8.pitch, roData->unk_14, 5); - OLib_AddVecGeoToVec3f(eyeNext, at, &spB8); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spB8); *eye = *eyeNext; func_800CBFA4(camera, at, eye, 3); @@ -4786,13 +4780,13 @@ s32 Camera_Fixed1(Camera* camera) { Fixed1ReadOnlyData* roData = &camera->paramData.fixd1.roData; Fixed1ReadWriteData* rwData = &camera->paramData.fixd1.rwData; - OLib_Vec3fDiffToVecGeo(&sp7C, at, eye); + sp7C = OLib_Vec3fDiffToVecGeo(at, eye); if (!RELOAD_PARAMS(camera)) { } else { values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex); - Camera_Vec3sToVec3f(&rwData->eyePosRotTarget.pos, &bgCamFuncData->pos); + rwData->eyePosRotTarget.pos = Camera_Vec3sToVec3f(&bgCamFuncData->pos); rwData->eyePosRotTarget.rot = bgCamFuncData->rot; rwData->fov = bgCamFuncData->fov; @@ -4811,9 +4805,9 @@ s32 Camera_Fixed1(Camera* camera) { targetHome = &camera->target->home; targetWorld = &camera->target->world; - OLib_Vec3fDiffToVecGeo(&sp44, &targetHome->pos, &rwData->eyePosRotTarget.pos); + sp44 = OLib_Vec3fDiffToVecGeo(&targetHome->pos, &rwData->eyePosRotTarget.pos); sp44.yaw = targetWorld->rot.y + (s16)(sp44.yaw - targetHome->rot.y); - OLib_AddVecGeoToVec3f(&rwData->eyePosRotTarget.pos, &targetWorld->pos, &sp44); + rwData->eyePosRotTarget.pos = OLib_AddVecGeoToVec3f(&targetWorld->pos, &sp44); yawDiff = (s16)(rwData->eyePosRotTarget.rot.y - targetHome->rot.y); rwData->eyePosRotTarget.rot.y = targetWorld->rot.y + yawDiff; } @@ -4845,7 +4839,7 @@ s32 Camera_Fixed1(Camera* camera) { } } - OLib_Vec3fDiffToVecGeo(&eyeAtOffset, eye, at); + eyeAtOffset = OLib_Vec3fDiffToVecGeo(eye, at); Camera_ScaledStepToCeilVec3f(&rwData->eyePosRotTarget.pos, eye, roData->unk_04, roData->unk_04, 0.2f); adjustedPos = focalActorPosRot->pos; adjustedPos.y += focalActorHeight; @@ -4854,7 +4848,7 @@ s32 Camera_Fixed1(Camera* camera) { eyeOffset.pitch = Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.x * -1, eyeAtOffset.pitch, roData->unk_04, 5); eyeOffset.yaw = Camera_ScaledStepToCeilS(rwData->eyePosRotTarget.rot.y, eyeAtOffset.yaw, roData->unk_04, 5); - OLib_AddVecGeoToVec3f(at, eye, &eyeOffset); + *at = OLib_AddVecGeoToVec3f(eye, &eyeOffset); camera->eyeNext = *eye; Camera_BgCheck(camera, eye, at); @@ -4913,11 +4907,11 @@ s32 Camera_Fixed2(Camera* camera) { bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex); if (bgCamFuncData != NULL) { if (!(roData->interfaceFlags & FIXED2_FLAG_1)) { - Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos); + rwData->unk_00 = Camera_Vec3sToVec3f(&bgCamFuncData->pos); } else { if (camera->focalActor != &GET_PLAYER(camera->play)->actor) { player = GET_PLAYER(camera->play); - OLib_Vec3fDiffToVecGeo(&sp70, &player->actor.focus.pos, eye); + sp70 = OLib_Vec3fDiffToVecGeo(&player->actor.focus.pos, eye); if (sp70.r < roData->unk_04) { sp70.r = roData->unk_04; if (sp70.pitch < 0xBB8) { // 16.5 degrees @@ -4926,7 +4920,7 @@ s32 Camera_Fixed2(Camera* camera) { new_var1 = &player->actor.focus.pos; - OLib_AddVecGeoToVec3f(&rwData->unk_00, new_var1, &sp70); + rwData->unk_00 = OLib_AddVecGeoToVec3f(new_var1, &sp70); } else { rwData->unk_00 = *eye; //! FAKE: @@ -4973,9 +4967,9 @@ s32 Camera_Fixed2(Camera* camera) { } sp7C = &camera->target->home; sp78 = &camera->target->world; - OLib_Vec3fDiffToVecGeo(&sp70, &sp7C->pos, &rwData->unk_00); + sp70 = OLib_Vec3fDiffToVecGeo(&sp7C->pos, &rwData->unk_00); sp70.yaw = sp78->rot.y + (s16)(sp70.yaw - sp7C->rot.y); - OLib_AddVecGeoToVec3f(&rwData->unk_00, &sp78->pos, &sp70); + rwData->unk_00 = OLib_AddVecGeoToVec3f(&sp78->pos, &sp70); } } else { rwData->unk_00 = camera->eye; @@ -5066,14 +5060,14 @@ s32 Camera_Fixed2(Camera* camera) { Camera_SetUpdateRatesSlow(camera); if (!(roData->interfaceFlags & FIXED2_FLAG_0)) { *at = spB0; - OLib_Vec3fDiffToVecGeo(&sp80, at, &rwData->unk_00); + sp80 = OLib_Vec3fDiffToVecGeo(at, &rwData->unk_00); if ((rwData->unk_0C < sp80.r) || (roData->interfaceFlags & FIXED2_FLAG_5)) { sp80.r = rwData->unk_0C; - OLib_AddVecGeoToVec3f(&spA4, at, &sp80); + spA4 = OLib_AddVecGeoToVec3f(at, &sp80); } else { if (sp80.r < roData->unk_04) { sp80.r = roData->unk_04; - OLib_AddVecGeoToVec3f(&spA4, at, &sp80); + spA4 = OLib_AddVecGeoToVec3f(at, &sp80); } else { spA4 = rwData->unk_00; } @@ -5086,13 +5080,13 @@ s32 Camera_Fixed2(Camera* camera) { } Camera_ScaledStepToCeilVec3f(&spB0, at, rwData->unk_14, rwData->unk_14, 1.0f); - OLib_Vec3fDiffToVecGeo(&sp80, at, &rwData->unk_00); + sp80 = OLib_Vec3fDiffToVecGeo(at, &rwData->unk_00); if ((rwData->unk_0C < sp80.r) || (roData->interfaceFlags & FIXED2_FLAG_5)) { sp80.r = rwData->unk_0C; - OLib_AddVecGeoToVec3f(&spA4, at, &sp80); + spA4 = OLib_AddVecGeoToVec3f(at, &sp80); } else if (sp80.r < roData->unk_04) { sp80.r = roData->unk_04; - OLib_AddVecGeoToVec3f(&spA4, at, &sp80); + spA4 = OLib_AddVecGeoToVec3f(at, &sp80); } else { spA4 = rwData->unk_00; } @@ -5149,7 +5143,7 @@ s32 Camera_Subject1(Camera* camera) { f32 temp_f0; f32 focalActorHeight; - Actor_GetFocus(&sp58, camera->focalActor); + sp58 = Actor_GetFocus(camera->focalActor); focalActorHeight = Camera_GetFocalActorHeight(camera); Camera_SetUpdateRatesFastPitch(camera); @@ -5170,8 +5164,8 @@ s32 Camera_Subject1(Camera* camera) { sp90 = sp58.pos; sp90.y += roData->unk_00; - OLib_AddVecGeoToVec3f(&sp84, &sp90, &sp7C); - OLib_Vec3fDiffToVecGeo(&sp74, &camera->at, eye); + sp84 = OLib_AddVecGeoToVec3f(&sp90, &sp7C); + sp74 = OLib_Vec3fDiffToVecGeo(&camera->at, eye); sCameraInterfaceFlags = roData->interfaceFlags; if (camera->play->view.unk164 == 0) { @@ -5213,7 +5207,7 @@ s32 Camera_Subject1(Camera* camera) { sp74.yaw = Camera_ScaledStepToCeilS(sp7C.yaw + (sp4E * rwData->timer), sp74.yaw, 0.5f, 5); sp74.pitch = Camera_ScaledStepToCeilS(sp7C.pitch + (sp4C * rwData->timer), sp74.pitch, 0.5f, 5); - OLib_AddVecGeoToVec3f(eyeNext, at, &sp74); + *eyeNext = OLib_AddVecGeoToVec3f(at, &sp74); *eye = *eyeNext; rwData->timer--; } else { @@ -5239,9 +5233,9 @@ s32 Camera_Subject1(Camera* camera) { sp74.yaw = BINANG_ROT180(sp58.rot.y); sp74.pitch = sp58.rot.x; - OLib_AddVecGeoToVec3f(&camera->eyeNext, at, &sp74); + camera->eyeNext = OLib_AddVecGeoToVec3f(at, &sp74); sp74.r = roData->unk_04; - OLib_AddVecGeoToVec3f(eye, at, &sp74); + *eye = OLib_AddVecGeoToVec3f(at, &sp74); } // TODO: is skyboxDisabled accurate here? @@ -5316,7 +5310,7 @@ s32 Camera_Unique2(Camera* camera) { Vec3f* eyeNext = &camera->eyeNext; CameraModeValue* values; - OLib_Vec3fDiffToVecGeo(&sp60, at, eye); + sp60 = OLib_Vec3fDiffToVecGeo(at, eye); if (RELOAD_PARAMS(camera)) { values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; @@ -5360,17 +5354,17 @@ s32 Camera_Unique2(Camera* camera) { rwData->unk_00 = rwData->unk_00 + ((2.0f - rwData->unk_00) * 0.05f); if (roData->interfaceFlags & UNIQUE2_FLAG_0) { - OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext); + sp68 = OLib_Vec3fDiffToVecGeo(at, eyeNext); sp68.r = roData->unk_04; - OLib_AddVecGeoToVec3f(&sp70, at, &sp68); + sp70 = OLib_AddVecGeoToVec3f(at, &sp68); Camera_ScaledStepToCeilVec3f(&sp70, eye, roData->unk_08, roData->unk_08, 0.2f); } else if (roData->interfaceFlags & UNIQUE2_FLAG_1) { if (OLib_Vec3fDistXZ(at, eyeNext) < roData->unk_04) { - OLib_Vec3fDiffToVecGeo(&sp68, at, eyeNext); + sp68 = OLib_Vec3fDiffToVecGeo(at, eyeNext); sp68.yaw = Camera_ScaledStepToCeilS(sp68.yaw, sp60.yaw, 0.1f, 5); sp68.r = roData->unk_04; sp68.pitch = 0; - OLib_AddVecGeoToVec3f(eye, at, &sp68); + *eye = OLib_AddVecGeoToVec3f(at, &sp68); eye->y = eyeNext->y; } else { Camera_ScaledStepToCeilVec3f(eyeNext, eye, roData->unk_08, roData->unk_08, 0.2f); @@ -5455,10 +5449,10 @@ s32 Camera_Unique0(Camera* camera) { roData->interfaceFlags = GET_NEXT_RO_DATA(values); } - OLib_Vec3fDiffToVecGeo(&sp7C, &camera->at, &camera->eye); + sp7C = OLib_Vec3fDiffToVecGeo(&camera->at, &camera->eye); if (player->rideActor != NULL) { - Actor_GetWorld(&sp9C, player->rideActor); + sp9C = Actor_GetWorld(player->rideActor); sp8C = sp9C.pos; sp8C.y += playerHeight + 20.0f; } else { @@ -5471,7 +5465,7 @@ s32 Camera_Unique0(Camera* camera) { switch (camera->animState) { case 0: bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex); - Camera_Vec3sToVec3f(&rwData->unk_1C, &bgCamFuncData->pos); + rwData->unk_1C = Camera_Vec3sToVec3f(&bgCamFuncData->pos); camera->eye = camera->eyeNext = rwData->unk_1C; rwData->unk_34 = bgCamFuncData->rot; @@ -5511,7 +5505,7 @@ s32 Camera_Unique0(Camera* camera) { sp84.r = OLib_Vec3fDist(&sp8C, &camera->eye); sp84.yaw = rwData->unk_34.y; sp84.pitch = -rwData->unk_34.x; - OLib_VecGeoToVec3f(&rwData->unk_28, &sp84); + rwData->unk_28 = OLib_VecGeoToVec3f(&sp84); func_80179A44(&rwData->unk_1C, focalActorPosRot, &rwData->unk_0C); camera->at = rwData->unk_0C; @@ -5592,7 +5586,7 @@ s32 Camera_Unique0(Camera* camera) { sp84.yaw = sp7C.yaw; sp84.r = Camera_ScaledStepToCeilF(100.0f, sp84.r, sp74, 1.0f); - OLib_AddVecGeoToVec3f(&sp8C, &camera->at, &sp84); + sp8C = OLib_AddVecGeoToVec3f(&camera->at, &sp84); sp74 = (QREG(64) * 0.01f) + 0.2f; @@ -5711,10 +5705,10 @@ s32 Camera_Demo1(Camera* camera) { if (camera->animState == 0) { rwData->unk_1C = 0; - OLib_Vec3fDiffToVecGeo(&rwData->unk_0C, &camera->targetPosRot.pos, eye); - OLib_Vec3fDiffToVecGeo(&rwData->unk_14, &camera->at, eye); - Actor_GetFocus(&targetHead, camera->target); - Actor_GetWorld(&sp74, camera->target); + rwData->unk_0C = OLib_Vec3fDiffToVecGeo(&camera->targetPosRot.pos, eye); + rwData->unk_14 = OLib_Vec3fDiffToVecGeo(&camera->at, eye); + targetHead = Actor_GetFocus(camera->target); + sp74 = Actor_GetWorld(camera->target); camera->targetPosRot.pos.x = (sp74.pos.x + targetHead.pos.x) * 0.5f; camera->targetPosRot.pos.y = (sp74.pos.y + targetHead.pos.y) * 0.5f; camera->targetPosRot.pos.z = (sp74.pos.z + targetHead.pos.z) * 0.5f; @@ -5760,9 +5754,9 @@ s32 Camera_Demo1(Camera* camera) { case 1: Camera_ScaledStepToCeilVec3f(&camera->targetPosRot.pos, at, 0.1f, 0.1f, 0.1f); - OLib_Vec3fDiffToVecGeo(&sp88, at, eye); + sp88 = OLib_Vec3fDiffToVecGeo(at, eye); sp88.r = rwData->unk_0C.r; - OLib_AddVecGeoToVec3f(eyeNext, at, &sp88); + *eyeNext = OLib_AddVecGeoToVec3f(at, &sp88); *eye = *eyeNext; Camera_BgCheck(camera, at, eye); break; @@ -5922,7 +5916,7 @@ s32 Camera_Demo2(Camera* camera) { roData->interfaceFlags = GET_NEXT_RO_DATA(values); } - OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); + atToEye = OLib_Vec3fDiffToVecGeo(at, eye); sCameraInterfaceFlags = roData->interfaceFlags; @@ -5955,9 +5949,9 @@ s32 Camera_Demo2(Camera* camera) { rwData->yawDir = -rwData->yawDir; } - OLib_Vec3fToVecGeo(&atOffset, &sp48[0]); + atOffset = OLib_Vec3fToVecGeo(&sp48[0]); atOffset.yaw += focalActorPosRot->rot.y; - OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset); + *at = OLib_AddVecGeoToVec3f(&rwData->initialAt, &atOffset); eyeOffset.r = sp4C[0].r; eyeOffset.pitch = sp4C[0].pitch; @@ -5972,9 +5966,9 @@ s32 Camera_Demo2(Camera* camera) { VEC3F_LERPIMPDST(&sp64, &sp48[0], &sp48[1], sp60); - OLib_Vec3fToVecGeo(&atOffset, &sp64); + atOffset = OLib_Vec3fToVecGeo(&sp64); atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y; - OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset); + *at = OLib_AddVecGeoToVec3f(&rwData->initialAt, &atOffset); atOffset.r = LERPIMP(sp4C[0].r, sp4C[1].r, sp60); atOffset.pitch = BINANG_LERPIMP(sp4C[0].pitch, sp4C[1].pitch, sp60); @@ -5995,9 +5989,9 @@ s32 Camera_Demo2(Camera* camera) { sp64.y += playerHeight; sp64.z = LERPIMP(sp48[1].z, sp48[2].z, sp60); - OLib_Vec3fToVecGeo(&atOffset, &sp64); + atOffset = OLib_Vec3fToVecGeo(&sp64); atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y; - OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset); + *at = OLib_AddVecGeoToVec3f(&rwData->initialAt, &atOffset); atOffset.r = LERPIMP(sp4C[1].r, sp4C[2].r, sp60); atOffset.pitch = BINANG_LERPIMP(sp4C[1].pitch, sp4C[2].pitch, sp60); @@ -6018,9 +6012,9 @@ s32 Camera_Demo2(Camera* camera) { sp64.y += playerHeight; sp64.z = LERPIMP(sp48[2].z, sp48[3].z, sp60); - OLib_Vec3fToVecGeo(&atOffset, &sp64); + atOffset = OLib_Vec3fToVecGeo(&sp64); atOffset.yaw = (atOffset.yaw * rwData->yawDir) + focalActorPosRot->rot.y; - OLib_AddVecGeoToVec3f(at, &rwData->initialAt, &atOffset); + *at = OLib_AddVecGeoToVec3f(&rwData->initialAt, &atOffset); atOffset.r = LERPIMP(sp4C[2].r, sp4C[3].r, sp60); atOffset.pitch = BINANG_LERPIMP(sp4C[2].pitch, sp4C[3].pitch, sp60); @@ -6105,7 +6099,7 @@ s32 Camera_Demo2(Camera* camera) { eyeOffset.r = Camera_ScaledStepToCeilF(eyeOffset.r, atToEye.r, rwData->unk_0C, 1.0f); eyeOffset.pitch = Camera_ScaledStepToCeilS(eyeOffset.pitch, atToEye.pitch, rwData->unk_0C, 5); eyeOffset.yaw = Camera_ScaledStepToCeilS(eyeOffset.yaw, atToEye.yaw, rwData->unk_0C, 5); - OLib_AddVecGeoToVec3f(eyeNext, at, &eyeOffset); + *eyeNext = OLib_AddVecGeoToVec3f(at, &eyeOffset); *eye = *eyeNext; } @@ -6131,8 +6125,8 @@ s32 Camera_Demo3(Camera* camera) { Demo3ReadOnlyData* roData = &camera->paramData.demo3.roData; Demo3ReadWriteData* rwData = &camera->paramData.demo3.rwData; - OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); - Actor_GetFocus(&focalActorFocus, camera->focalActor); + atToEye = OLib_Vec3fDiffToVecGeo(at, eye); + focalActorFocus = Actor_GetFocus(camera->focalActor); focalActorFocus.pos.x = camera->focalActorPosRot.pos.x; focalActorFocus.pos.z = camera->focalActorPosRot.pos.z; focalActorFocus.pos.y -= (focalActorFocus.pos.y - camera->focalActorPosRot.pos.y) * 0.4f; @@ -6194,7 +6188,7 @@ s32 Camera_Demo3(Camera* camera) { break; } - OLib_AddVecGeoToVec3f(eyeNext, at, &atToEye); + *eyeNext = OLib_AddVecGeoToVec3f(at, &atToEye); *eye = *eyeNext; return true; } @@ -6216,7 +6210,7 @@ s32 Camera_Demo4(Camera* camera) { Demo4ReadWriteData* rwData = &camera->paramData.demo4.rwData; s32 pad[2]; - OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); + atToEye = OLib_Vec3fDiffToVecGeo(at, eye); if (RELOAD_PARAMS(camera)) { values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; @@ -6227,7 +6221,7 @@ s32 Camera_Demo4(Camera* camera) { rwData->unk_14 = camera->fov; } - Actor_GetFocus(&focalActorFocus, camera->focalActor); + focalActorFocus = Actor_GetFocus(camera->focalActor); sCameraInterfaceFlags = roData->interfaceFlags; switch (camera->animState) { @@ -6336,7 +6330,7 @@ s32 Camera_Demo4(Camera* camera) { break; case 999: - Actor_GetFocus(&focalActorFocus, camera->focalActor); + focalActorFocus = Actor_GetFocus(camera->focalActor); Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1); Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_2); camera->animState = 4; @@ -6352,7 +6346,7 @@ s32 Camera_Demo4(Camera* camera) { break; } - OLib_AddVecGeoToVec3f(&camera->eyeNext, at, &atToEye); + camera->eyeNext = OLib_AddVecGeoToVec3f(at, &atToEye); *eye = camera->eyeNext; return true; @@ -6376,7 +6370,7 @@ s32 Camera_Demo5(Camera* camera) { Demo5ReadWriteData* rwData = &camera->paramData.demo5.rwData; CameraModeValue* values; - OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); + atToEye = OLib_Vec3fDiffToVecGeo(at, eye); if (RELOAD_PARAMS(camera)) { values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; @@ -6387,7 +6381,7 @@ s32 Camera_Demo5(Camera* camera) { rwData->unk_18 = camera->fov; } - Actor_GetFocus(&focalActorFocus, camera->focalActor); + focalActorFocus = Actor_GetFocus(camera->focalActor); sCameraInterfaceFlags = roData->interfaceFlags; @@ -6442,7 +6436,7 @@ s32 Camera_Demo5(Camera* camera) { break; case 999: - Actor_GetFocus(&focalActorFocus, camera->focalActor); + focalActorFocus = Actor_GetFocus(camera->focalActor); camera->animState = 3; Distortion_RemoveRequest(DISTORTION_TYPE_MASK_TRANSFORM_1); break; @@ -6457,7 +6451,7 @@ s32 Camera_Demo5(Camera* camera) { break; } - OLib_AddVecGeoToVec3f(eyeNext, at, &atToEye); + *eyeNext = OLib_AddVecGeoToVec3f(at, &atToEye); *eye = *eyeNext; return true; @@ -6503,8 +6497,8 @@ s32 Camera_Demo0(Camera* camera) { // Initialize if (camera->animState == 0) { - OLib_Vec3fDiffToVecGeo(&rwData->subAtToEye, &subCam->at, subEye); - OLib_Vec3fDiffToVecGeo(&rwData->atToEye, &camera->at, eye); + rwData->subAtToEye = OLib_Vec3fDiffToVecGeo(&subCam->at, subEye); + rwData->atToEye = OLib_Vec3fDiffToVecGeo(&camera->at, eye); if (rwData->subAtToEye.r < 50.0f) { rwData->subAtToEye.r = 50.0f; if (rwData->subAtToEye.pitch < 0x7D0) { // 11 degrees @@ -6585,7 +6579,7 @@ s32 Camera_Demo0(Camera* camera) { camera->roll += rwData->unk_18; // Update Eye - OLib_AddVecGeoToVec3f(eye, at, &rwData->atToEye); + *eye = OLib_AddVecGeoToVec3f(at, &rwData->atToEye); camera->eyeNext = *eye; rwData->timer--; @@ -6653,9 +6647,9 @@ s32 Camera_Special5(Camera* camera) { roData->interfaceFlags = GET_NEXT_RO_DATA(values); } - OLib_Vec3fDiffToVecGeo(&atToEye, at, eye); - OLib_Vec3fDiffToVecGeo(&atToEyeNext, at, eyeNext); - Actor_GetWorld(&spA8, camera->target); + atToEye = OLib_Vec3fDiffToVecGeo(at, eye); + atToEyeNext = OLib_Vec3fDiffToVecGeo(at, eyeNext); + spA8 = Actor_GetWorld(camera->target); sCameraInterfaceFlags = roData->interfaceFlags; @@ -6677,9 +6671,9 @@ s32 Camera_Special5(Camera* camera) { sp6C.yaw = focalActorPosRot->rot.y; sp6C.pitch = -focalActorPosRot->rot.x; sp6C.r = 20.0f; - OLib_AddVecGeoToVec3f(&sp7C.pos, &spA8.pos, &sp6C); + sp7C.pos = OLib_AddVecGeoToVec3f(&spA8.pos, &sp6C); func_800CBC84(camera, at, &sp7C, 0); - OLib_Vec3fToVecGeo(&sp6C, &sp7C.norm); + sp6C = OLib_Vec3fToVecGeo(&sp7C.norm); spA4 = BINANG_SUB(focalActorPosRot->rot.y, sp6C.yaw); sp74.r = roData->eyeDist; rand = Rand_ZeroOne(); @@ -6687,7 +6681,7 @@ s32 Camera_Special5(Camera* camera) { BINANG_ROT180(focalActorPosRot->rot.y) + (s16)((spA4 < 0) ? -(s16)(0x1553 + (s16)(rand * 2730.0f)) : (s16)(0x1553 + (s16)(rand * 2730.0f))); sp74.pitch = roData->pitch; - OLib_AddVecGeoToVec3f(eyeNext, &spA8.pos, &sp74); + *eyeNext = OLib_AddVecGeoToVec3f(&spA8.pos, &sp74); *eye = *eyeNext; Camera_BgCheck(camera, &spA8.pos, eye); } @@ -6850,14 +6844,14 @@ s32 Camera_Special9(Camera* camera) { } if (doorParams->doorActor != NULL) { - Actor_GetWorldPosShapeRot(&sp84, doorParams->doorActor); + sp84 = Actor_GetWorldPosShapeRot(doorParams->doorActor); } else { sp84 = *focalActorPosRot; sp84.pos.y += focalActorHeight + roData->yOffset; sp84.rot.x = 0; } - OLib_Vec3fDiffToVecGeo(&spA8, at, eye); + spA8 = OLib_Vec3fDiffToVecGeo(at, eye); sCameraInterfaceFlags = roData->interfaceFlags; @@ -6884,7 +6878,7 @@ s32 Camera_Special9(Camera* camera) { // Setup for the camera moving behind the door if (roData->interfaceFlags & SPECIAL9_FLAG_0) { bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamOrActorCsCamFuncData(camera, camera->bgCamIndex); - Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos); + *eyeNext = Camera_Vec3sToVec3f(&bgCamFuncData->pos); spB8 = *eye = *eyeNext; } else { s16 camEyeSide; @@ -6899,14 +6893,14 @@ s32 Camera_Special9(Camera* camera) { spB0.yaw = rwData->unk_00 + camEyeSide; spB0.r = 200.0f * yNormal; - OLib_AddVecGeoToVec3f(eyeNext, at, &spB0); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spB0); spB8 = *eye = *eyeNext; // If the side chosen moves the camera out-of-bounds, move to the other side if (Camera_CheckOOB(camera, &spB8, &focalActorPosRot->pos)) { camEyeSide = (s16)-camEyeSide; spB0.yaw = rwData->unk_00 + camEyeSide; - OLib_AddVecGeoToVec3f(eyeNext, at, &spB0); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spB0); *eye = *eyeNext; } } @@ -6935,7 +6929,7 @@ s32 Camera_Special9(Camera* camera) { spB0.pitch = Camera_ScaledStepToCeilS(0xAAA, spA8.pitch, 0.3f, 5); spB0.yaw = Camera_ScaledStepToCeilS(rwData->unk_00, spA8.yaw, 0.3f, 5); spB0.r = Camera_ScaledStepToCeilF(60.0f, spA8.r, 0.3f, 1.0f); - OLib_AddVecGeoToVec3f(eyeNext, at, &spB0); + *eyeNext = OLib_AddVecGeoToVec3f(at, &spB0); *eye = *eyeNext; @@ -7110,7 +7104,7 @@ void Camera_InitFocalActorSettings(Camera* camera, Actor* focalActor) { f32 focalActorHeight; Vec3f* eye = &camera->eye; - Actor_GetWorldPosShapeRot(&focalActorPosRot, focalActor); + focalActorPosRot = Actor_GetWorldPosShapeRot(focalActor); camera->focalActor = focalActor; focalActorHeight = Camera_GetFocalActorHeight(camera); @@ -7130,7 +7124,7 @@ void Camera_InitFocalActorSettings(Camera* camera, Actor* focalActor) { camera->focalActorAtOffset.y = focalActorHeight; camera->focalActorAtOffset.z = 0; - OLib_AddVecGeoToVec3f(&camera->eyeNext, &camera->at, &eyeNextAtOffset); + camera->eyeNext = OLib_AddVecGeoToVec3f(&camera->at, &eyeNextAtOffset); *eye = camera->eyeNext; camera->roll = 0; @@ -7403,9 +7397,9 @@ Vec3s Camera_Update(Camera* camera) { // Updates camera info on the actor it's tracking if (camera->focalActor == &GET_PLAYER(camera->play)->actor) { - Actor_GetWorldPosShapeRot(&focalActorPosRot, camera->focalActor); + focalActorPosRot = Actor_GetWorldPosShapeRot(camera->focalActor); } else { - Actor_GetWorld(&focalActorPosRot, camera->focalActor); + focalActorPosRot = Actor_GetWorld(camera->focalActor); } camera->unk_0F0.x = focalActorPosRot.pos.x - camera->focalActorPosRot.pos.x; camera->unk_0F0.y = focalActorPosRot.pos.y - camera->focalActorPosRot.pos.y; @@ -7584,21 +7578,21 @@ Vec3s Camera_Update(Camera* camera) { viewEye.x = camera->eye.x + camShake.eyeOffset.x; viewEye.y = camera->eye.y + camShake.eyeOffset.y; viewEye.z = camera->eye.z + camShake.eyeOffset.z; - OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt); - Camera_CalcUpVec(&viewUp, sp3C.pitch, sp3C.yaw, camera->roll + camShake.upRollOffset); + sp3C = OLib_Vec3fDiffToVecGeo(&viewEye, &viewAt); + viewUp = Camera_CalcUpVec(sp3C.pitch, sp3C.yaw, camera->roll + camShake.upRollOffset); viewFov = camera->fov + CAM_BINANG_TO_DEG(camShake.fovOffset); } else if (sIsFalse) { //! condition is impossible to achieve viewAt = camera->at; viewEye = camera->eye; - OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt); + sp3C = OLib_Vec3fDiffToVecGeo(&viewEye, &viewAt); viewUp = camera->up; viewFov = camera->fov; } else { viewAt = camera->at; viewEye = camera->eye; - OLib_Vec3fDiffToVecGeo(&sp3C, &viewEye, &viewAt); - Camera_CalcUpVec(&viewUp, sp3C.pitch, sp3C.yaw, camera->roll); + sp3C = OLib_Vec3fDiffToVecGeo(&viewEye, &viewAt); + viewUp = Camera_CalcUpVec(sp3C.pitch, sp3C.yaw, camera->roll); viewFov = camera->fov; } @@ -7918,41 +7912,35 @@ s32 Camera_ChangeActorCsCamIndex(Camera* camera, s32 bgCamIndex) { return bgCamIndex | 0x80000000; } -Vec3s* Camera_GetInputDir(Vec3s* dst, Camera* camera) { - *dst = camera->inputDir; - return dst; +Vec3s Camera_GetInputDir(Camera* camera) { + return camera->inputDir; } s16 Camera_GetInputDirPitch(Camera* camera) { - Vec3s dir; + Vec3s dir = Camera_GetInputDir(camera); - Camera_GetInputDir(&dir, camera); return dir.x; } s16 Camera_GetInputDirYaw(Camera* camera) { - Vec3s dir; + Vec3s dir = Camera_GetInputDir(camera); - Camera_GetInputDir(&dir, camera); return dir.y; } -Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera) { - *dst = camera->camDir; - return dst; +Vec3s Camera_GetCamDir(Camera* camera) { + return camera->camDir; } s16 Camera_GetCamDirPitch(Camera* camera) { - Vec3s camDir; + Vec3s camDir = Camera_GetCamDir(camera); - Camera_GetCamDir(&camDir, camera); return camDir.x; } s16 Camera_GetCamDirYaw(Camera* camera) { - Vec3s camDir; + Vec3s camDir = Camera_GetCamDir(camera); - Camera_GetCamDir(&camDir, camera); return camDir.y; } @@ -8098,9 +8086,9 @@ s32 Camera_Copy(Camera* dstCam, Camera* srcCam) { if (dstCam->focalActor != NULL) { if (dstCam->focalActor == &GET_PLAYER(dstCam->play)->actor) { - Actor_GetWorldPosShapeRot(&dstCam->focalActorPosRot, dstCam->focalActor); + dstCam->focalActorPosRot = Actor_GetWorldPosShapeRot(dstCam->focalActor); } else { - Actor_GetWorld(&dstCam->focalActorPosRot, dstCam->focalActor); + dstCam->focalActorPosRot = Actor_GetWorld(dstCam->focalActor); } Camera_SetFocalActorAtOffset(dstCam, &dstCam->focalActorPosRot.pos); } @@ -8114,10 +8102,8 @@ s32 Camera_IsDbgCamEnabled(void) { return false; } -Vec3f* Camera_GetQuakeOffset(Vec3f* quakeOffset, Camera* camera) { - *quakeOffset = camera->quakeOffset; - - return quakeOffset; +Vec3f Camera_GetQuakeOffset(Camera* camera) { + return camera->quakeOffset; } void Camera_SetCameraData(Camera* camera, s16 setDataFlags, void* data0, void* data1, s16 data2, s16 data3) { @@ -8155,9 +8141,9 @@ s16 func_800E0238(Camera* camera) { void Camera_SetFocalActor(Camera* camera, Actor* actor) { camera->focalActor = actor; if (actor == &GET_PLAYER(camera->play)->actor) { - Actor_GetWorldPosShapeRot(&camera->focalActorPosRot, actor); + camera->focalActorPosRot = Actor_GetWorldPosShapeRot(actor); } else { - Actor_GetWorld(&camera->focalActorPosRot, camera->focalActor); + camera->focalActorPosRot = Actor_GetWorld(camera->focalActor); } camera->animState = 0; diff --git a/src/code/z_olib.c b/src/code/z_olib.c index 848a48a72..86fa656f9 100644 --- a/src/code/z_olib.c +++ b/src/code/z_olib.c @@ -57,7 +57,7 @@ f32 OLib_ClampMaxDist(f32 val, f32 max) { /** * Takes the difference of points b and a, and creates a normal vector */ -Vec3f* OLib_Vec3fDistNormalize(Vec3f* dest, Vec3f* a, Vec3f* b) { +Vec3f OLib_Vec3fDistNormalize(Vec3f* a, Vec3f* b) { Vec3f v1; Vec3f v2; f32 dist; @@ -72,15 +72,13 @@ Vec3f* OLib_Vec3fDistNormalize(Vec3f* dest, Vec3f* a, Vec3f* b) { v2.y = v1.y / dist; v2.z = v1.z / dist; - *dest = v2; - - return dest; + return v2; } /** * Takes the spherical coordinate `sph`, and converts it into a x,y,z position */ -Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph) { +Vec3f OLib_VecSphToVec3f(VecSph* sph) { Vec3f v; f32 sinPitch; f32 cosPitch = Math_CosS(sph->pitch); @@ -94,28 +92,26 @@ Vec3f* OLib_VecSphToVec3f(Vec3f* dest, VecSph* sph) { v.y = sph->r * cosPitch; v.z = sph->r * sinPitch * cosYaw; - *dest = v; - - return dest; + return v; } /** * Takes the geographic point `geo` and converts it into a x,y,z position */ -Vec3f* OLib_VecGeoToVec3f(Vec3f* dest, VecGeo* geo) { +Vec3f OLib_VecGeoToVec3f(VecGeo* geo) { VecSph sph; sph.r = geo->r; sph.pitch = 0x4000 - geo->pitch; sph.yaw = geo->yaw; - return OLib_VecSphToVec3f(dest, &sph); + return OLib_VecSphToVec3f(&sph); } /** * Takes the point `vec`, and converts it into a spherical coordinate */ -VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) { +VecSph OLib_Vec3fToVecSph(Vec3f* vec) { VecSph sph; f32 distXZSq = SQ(vec->x) + SQ(vec->z); f32 distXZ = sqrtf(distXZSq); @@ -133,118 +129,100 @@ VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) { sph.yaw = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(vec->x, vec->z))); } - *dest = sph; - - return dest; + return sph; } /** * Takes the point `vec`, and converts it to a geographic coordinate */ -VecGeo* OLib_Vec3fToVecGeo(VecGeo* dest, Vec3f* vec) { - VecSph sph; +VecGeo OLib_Vec3fToVecGeo(Vec3f* vec) { + VecSph sph = OLib_Vec3fToVecSph(vec); - OLib_Vec3fToVecSph(&sph, vec); sph.pitch = 0x4000 - sph.pitch; - *dest = sph; - - return dest; + return sph; } /** * Takes the differences of positions `a` and `b`, and converts them to spherical coordinates */ -VecSph* OLib_Vec3fDiffToVecSph(VecSph* dest, Vec3f* a, Vec3f* b) { +VecSph OLib_Vec3fDiffToVecSph(Vec3f* a, Vec3f* b) { Vec3f diff; diff.x = b->x - a->x; diff.y = b->y - a->y; diff.z = b->z - a->z; - return OLib_Vec3fToVecSph(dest, &diff); + return OLib_Vec3fToVecSph(&diff); } /** * Takes the difference of positions `a` and `b`, and converts them to geographic coordinates */ -VecGeo* OLib_Vec3fDiffToVecGeo(VecGeo* dest, Vec3f* a, Vec3f* b) { +VecGeo OLib_Vec3fDiffToVecGeo(Vec3f* a, Vec3f* b) { Vec3f diff; diff.x = b->x - a->x; diff.y = b->y - a->y; diff.z = b->z - a->z; - return OLib_Vec3fToVecGeo(dest, &diff); + return OLib_Vec3fToVecGeo(&diff); } /** * Takes the sum of positions `a` (x,y,z coordinates) and `geo` (geographic coordinates), result is in x,y,z position * Identical to Quake_AddVec from OoT */ -Vec3f* OLib_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo) { +Vec3f OLib_AddVecGeoToVec3f(Vec3f* a, VecGeo* geo) { Vec3f sum; - Vec3f b; + Vec3f b = OLib_VecGeoToVec3f(geo); - OLib_VecGeoToVec3f(&b, geo); sum.x = a->x + b.x; sum.y = a->y + b.y; sum.z = a->z + b.z; - *dest = sum; - - return dest; + return sum; } /** * Gets the pitch/yaw of the vector formed from `b`-`a`, result is in radians */ -Vec3f* OLib_Vec3fDiffRad(Vec3f* dest, Vec3f* a, Vec3f* b) { +Vec3f OLib_Vec3fDiffRad(Vec3f* a, Vec3f* b) { Vec3f anglesRad; anglesRad.x = Math_FAtan2F(b->z - a->z, b->y - a->y); anglesRad.y = Math_FAtan2F(b->x - a->x, b->z - a->z); anglesRad.z = 0; - *dest = anglesRad; - - return dest; + return anglesRad; } /** * Gets the pitch/yaw of the vector formed from `b`-`a`, result is in degrees */ -Vec3f* OLib_Vec3fDiffDegF(Vec3f* dest, Vec3f* a, Vec3f* b) { - Vec3f anglesRad; +Vec3f OLib_Vec3fDiffDegF(Vec3f* a, Vec3f* b) { + Vec3f anglesRad = OLib_Vec3fDiffRad(a, b); Vec3f anglesDegrees; - OLib_Vec3fDiffRad(&anglesRad, a, b); - anglesDegrees.x = RAD_TO_DEG(anglesRad.x); anglesDegrees.y = RAD_TO_DEG(anglesRad.y); anglesDegrees.z = 0.0f; - *dest = anglesDegrees; - - return dest; + return anglesDegrees; } /** * Gets the pitch/yaw of the vector formed from `b`-`a`, result is in binary degrees */ -Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b) { - Vec3f anglesRad; +Vec3s OLib_Vec3fDiffBinAng(Vec3f* a, Vec3f* b) { + Vec3f anglesRad = OLib_Vec3fDiffRad(a, b); Vec3s anglesBinAng; - OLib_Vec3fDiffRad(&anglesRad, a, b); - anglesBinAng.x = CAM_DEG_TO_BINANG(RAD_TO_DEG(anglesRad.x)); anglesBinAng.y = CAM_DEG_TO_BINANG(RAD_TO_DEG(anglesRad.y)); anglesBinAng.z = 0.0f; - *dest = anglesBinAng; - - return dest; + return anglesBinAng; } /** @@ -255,9 +233,9 @@ void OLib_Vec3fDiff(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) { switch (mode) { case OLIB_DIFF_OFFSET: - OLib_Vec3fDiffToVecGeo(&geo, &a->pos, b); + geo = OLib_Vec3fDiffToVecGeo(&a->pos, b); geo.yaw -= a->rot.y; - OLib_VecGeoToVec3f(dest, &geo); + *dest = OLib_VecGeoToVec3f(&geo); break; case OLIB_DIFF: @@ -280,9 +258,9 @@ void OLib_Vec3fAdd(PosRot* a, Vec3f* b, Vec3f* dest, s16 mode) { switch (mode) { case OLIB_ADD_OFFSET: - OLib_Vec3fToVecGeo(&geo, b); + geo = OLib_Vec3fToVecGeo(b); geo.yaw += a->rot.y; - OLib_AddVecGeoToVec3f(dest, &a->pos, &geo); + *dest = OLib_AddVecGeoToVec3f(&a->pos, &geo); break; case OLIB_ADD: diff --git a/src/code/z_play.c b/src/code/z_play.c index 709b128ae..d2110c1e2 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1129,10 +1129,10 @@ void Play_PostWorldDraw(PlayState* this) { void Play_DrawMain(PlayState* this) { GraphicsContext* gfxCtx = this->state.gfxCtx; - Lights* sp268; + Lights* lights; Vec3f temp; u8 sp25B = false; - f32 var_fv0; // zFar + f32 zFar; if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_UNK4) { PreRender_ApplyFiltersSlowlyDestroy(&this->pauseBgPreRender); @@ -1169,19 +1169,17 @@ void Play_DrawMain(PlayState* this) { gSPSegment(OVERLAY_DISP++, 0x02, this->sceneSegment); if (1) { - ShrinkWindow_Draw(gfxCtx); POLY_OPA_DISP = Play_SetFog(this, POLY_OPA_DISP); POLY_XLU_DISP = Play_SetFog(this, POLY_XLU_DISP); - // zFar - var_fv0 = this->lightCtx.zFar; - if (var_fv0 > 12800.0f) { - var_fv0 = 12800.0f; + zFar = this->lightCtx.zFar; + if (zFar > 12800.0f) { + zFar = 12800.0f; } - View_SetPerspective(&this->view, this->view.fovy, this->view.zNear, var_fv0); + View_SetPerspective(&this->view, this->view.fovy, this->view.zNear, zFar); View_Apply(&this->view, 0xF); @@ -1293,14 +1291,14 @@ void Play_DrawMain(PlayState* this) { Environment_Draw(this); } - sp268 = LightContext_NewLights(&this->lightCtx, gfxCtx); + lights = LightContext_NewLights(&this->lightCtx, gfxCtx); if (this->roomCtx.curRoom.enablePosLights || (MREG(93) != 0)) { - sp268->enablePosLights = true; + lights->enablePosLights = true; } - Lights_BindAll(sp268, this->lightCtx.listHead, NULL, this); - Lights_Draw(sp268, gfxCtx); + Lights_BindAll(lights, this->lightCtx.listHead, NULL, this); + Lights_Draw(lights, gfxCtx); if (1) { u32 roomDrawFlags = ((1) ? 1 : 0) | (((void)0, 1) ? 2 : 0); // FAKE: @@ -1313,12 +1311,12 @@ void Play_DrawMain(PlayState* this) { } if (this->skyboxCtx.skyboxShouldDraw) { - Vec3f sp78; + Vec3f quakeOffset; if (1) { - Camera_GetQuakeOffset(&sp78, GET_ACTIVE_CAM(this)); - Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + sp78.x, - this->view.eye.y + sp78.y, this->view.eye.z + sp78.z); + quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(this)); + Skybox_Draw(&this->skyboxCtx, gfxCtx, this->skyboxId, 0, this->view.eye.x + quakeOffset.x, + this->view.eye.y + quakeOffset.y, this->view.eye.z + quakeOffset.z); } } diff --git a/src/code/z_quake.c b/src/code/z_quake.c index 8225c6347..19db37c63 100644 --- a/src/code/z_quake.c +++ b/src/code/z_quake.c @@ -55,7 +55,7 @@ void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 yOffset, f32 atEyeOffset.x = 0; atEyeOffset.y = 0; atEyeOffset.z = 0; - OLib_Vec3fDiffToVecGeo(&eyeToAtGeo, eye, at); + eyeToAtGeo = OLib_Vec3fDiffToVecGeo(eye, at); // y shake geo.r = req->y * yOffset; @@ -63,7 +63,7 @@ void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 yOffset, f32 geo.pitch = eyeToAtGeo.pitch + req->orientation.x + 0x4000; geo.yaw = eyeToAtGeo.yaw + req->orientation.y; // apply y shake - OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo); + atEyeOffset = OLib_AddVecGeoToVec3f(&atEyeOffset, &geo); // x shake geo.r = req->x * xOffset; @@ -71,7 +71,7 @@ void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 yOffset, f32 geo.pitch = eyeToAtGeo.pitch + req->orientation.x; geo.yaw = eyeToAtGeo.yaw + req->orientation.y + 0x4000; // apply x shake - OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo); + atEyeOffset = OLib_AddVecGeoToVec3f(&atEyeOffset, &geo); } else { atEyeOffset.x = 0; atEyeOffset.y = req->y * yOffset; @@ -81,7 +81,7 @@ void Quake_UpdateShakeInfo(QuakeRequest* req, ShakeInfo* shake, f32 yOffset, f32 geo.pitch = req->orientation.x; geo.yaw = req->orientation.y; - OLib_AddVecGeoToVec3f(&atEyeOffset, &atEyeOffset, &geo); + atEyeOffset = OLib_AddVecGeoToVec3f(&atEyeOffset, &geo); } shake->atOffset = shake->eyeOffset = atEyeOffset; @@ -752,7 +752,7 @@ void Distortion_Update(void) { player = GET_PLAYER(play); if (player != NULL) { - Actor_GetWorldPosShapeRot(&playerPosRot, &player->actor); + playerPosRot = Actor_GetWorldPosShapeRot(&player->actor); } depthPhaseStep = 359.2f; diff --git a/src/code/z_room.c b/src/code/z_room.c index 758bfaa38..5dc9c452f 100644 --- a/src/code/z_room.c +++ b/src/code/z_room.c @@ -332,7 +332,7 @@ void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) { { Vec3f quakeOffset; - Camera_GetQuakeOffset(&quakeOffset, activeCam); + quakeOffset = Camera_GetQuakeOffset(activeCam); Prerender_DrawBackground2D( &gfx, roomShape->source, roomShape->tlut, roomShape->width, roomShape->height, roomShape->fmt, @@ -431,7 +431,8 @@ void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) { { Vec3f quakeOffset; - Camera_GetQuakeOffset(&quakeOffset, activeCam); + quakeOffset = Camera_GetQuakeOffset(activeCam); + Prerender_DrawBackground2D(&gfx, bgEntry->source, bgEntry->tlut, bgEntry->width, bgEntry->height, bgEntry->fmt, bgEntry->siz, bgEntry->tlutMode, bgEntry->tlutCount, (quakeOffset.x + quakeOffset.z) * 1.2f + quakeOffset.y * 0.6f, diff --git a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c index e6e2694c3..cf4e978e0 100644 --- a/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c +++ b/src/overlays/actors/ovl_Eff_Stk/z_eff_stk.c @@ -83,7 +83,7 @@ void EffStk_Draw(Actor* thisx, PlayState* play) { Vec3f eye = activeCam->eye; Vec3f quakeOffset; - Camera_GetQuakeOffset(&quakeOffset, activeCam); + quakeOffset = Camera_GetQuakeOffset(activeCam); OPEN_DISPS(play->state.gfxCtx); diff --git a/src/overlays/actors/ovl_En_Butte/z_en_butte.c b/src/overlays/actors/ovl_En_Butte/z_en_butte.c index 4f11479db..77414e0e4 100644 --- a/src/overlays/actors/ovl_En_Butte/z_en_butte.c +++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.c @@ -144,7 +144,7 @@ void func_8091C178(EnButte* this, PlayState* play) { sp48 = Math_SinS(D_8091D3A0) * 250.0f; sp48 = CLAMP(sp48, 0, 255); - Camera_GetCamDir(&sp40, GET_ACTIVE_CAM(play)); + sp40 = Camera_GetCamDir(GET_ACTIVE_CAM(play)); Matrix_RotateYS(sp40.y, MTXMODE_NEW); Matrix_RotateXS(sp40.x, MTXMODE_APPLY); Matrix_RotateZS(sp40.z, MTXMODE_APPLY); diff --git a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c index a1a7af60e..e1be146e2 100644 --- a/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c +++ b/src/overlays/actors/ovl_En_Honotrap/z_en_honotrap.c @@ -786,7 +786,7 @@ void EnHonotrap_DrawFlameGroup(Actor* thisx, PlayState* play) { Gfx_SetupDL25_Xlu(play->state.gfxCtx); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0); - Camera_GetCamDir(&camDir, GET_ACTIVE_CAM(play)); + camDir = Camera_GetCamDir(GET_ACTIVE_CAM(play)); camDir.y += 0x8000; for (i = 0; i < ARRAY_COUNT(flameGroup->flameList); i++) { diff --git a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c index fa0bf7821..66d650564 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c +++ b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c @@ -71,9 +71,7 @@ void OceffWipe_Draw(Actor* thisx, PlayState* play) { s32 i; Vec3f eye = GET_ACTIVE_CAM(play)->eye; Vtx* vtxPtr; - Vec3f quakeOffset; - - Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); + Vec3f quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(play)); OPEN_DISPS(play->state.gfxCtx); diff --git a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c index 59f9386a5..f87f4b8ef 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c +++ b/src/overlays/actors/ovl_Oceff_Wipe2/z_oceff_wipe2.c @@ -65,9 +65,7 @@ void OceffWipe2_Draw(Actor* thisx, PlayState* play) { s32 pad[2]; Vec3f eye = GET_ACTIVE_CAM(play)->eye; Vtx* vtxPtr; - Vec3f quakeOffset; - - Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); + Vec3f quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(play)); vtxPtr = sEponaSongFrustumVtx; diff --git a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c index 070fa9965..d1564d7e1 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c +++ b/src/overlays/actors/ovl_Oceff_Wipe3/z_oceff_wipe3.c @@ -66,9 +66,7 @@ void OceffWipe3_Draw(Actor* thisx, PlayState* play) { s32 pad[2]; Vec3f eye = GET_ACTIVE_CAM(play)->eye; Vtx* vtxPtr; - Vec3f quakeOffset; - - Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); + Vec3f quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(play)); vtxPtr = sSariaSongFrustumVtx; diff --git a/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c b/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c index cccb3e169..7f5f43fee 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c +++ b/src/overlays/actors/ovl_Oceff_Wipe4/z_oceff_wipe4.c @@ -65,9 +65,7 @@ void OceffWipe4_Draw(Actor* thisx, PlayState* play) { s32 pad[2]; Vec3f eye = GET_ACTIVE_CAM(play)->eye; Vtx* vtxPtr; - Vec3f quakeOffset; - - Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); + Vec3f quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(play)); if (this->counter < 16) { z = Math_SinS(this->counter * 0x400) * 1220.0f; diff --git a/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c b/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c index 3d98236b2..43542180a 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c +++ b/src/overlays/actors/ovl_Oceff_Wipe5/z_oceff_wipe5.c @@ -88,7 +88,7 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) { colorIndex = 0; } - Camera_GetQuakeOffset(&quakeOffset, activeCam); + quakeOffset = Camera_GetQuakeOffset(activeCam); if (this->counter < 32) { z = Math_SinS(this->counter << 9) * phi_fv1; diff --git a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c index 601c62d5d..0bf8d89d0 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c +++ b/src/overlays/actors/ovl_Oceff_Wipe6/z_oceff_wipe6.c @@ -59,14 +59,11 @@ void OceffWipe6_Draw(Actor* thisx, PlayState* play) { u8 alpha; s32 i; s32 counter; - Vec3f activeCamEye; + Vec3f activeCamEye = GET_ACTIVE_CAM(play)->eye; s32 pad; - Vec3f quakeOffset; + Vec3f quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(play)); s32 pad2; - activeCamEye = GET_ACTIVE_CAM(play)->eye; - Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); - if (this->counter < 32) { counter = this->counter; z = Math_SinS(counter * 0x200) * 1220.0f; diff --git a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c index 76946aa83..81c32a5e5 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c +++ b/src/overlays/actors/ovl_Oceff_Wipe7/z_oceff_wipe7.c @@ -65,11 +65,9 @@ void OceffWipe7_Draw(Actor* thisx, PlayState* play) { s32 counter; Vec3f activeCamEye = GET_ACTIVE_CAM(play)->eye; s32 pad; - Vec3f quakeOffset; + Vec3f quakeOffset = Camera_GetQuakeOffset(GET_ACTIVE_CAM(play)); s32 pad2; - Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); - if (this->counter < 32) { z = Math_SinS(this->counter * 0x200) * 1220.0f; } else { From 54e2eff9618db5eb88f1efd23c118efa13c7de92 Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Wed, 8 Nov 2023 05:03:51 -0800 Subject: [PATCH 15/28] D_801AEFA0 (#1473) --- tools/ZAPDConfigs/MM/SymbolMap_MM.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/ZAPDConfigs/MM/SymbolMap_MM.txt b/tools/ZAPDConfigs/MM/SymbolMap_MM.txt index cc7b36b5e..677a1cafe 100644 --- a/tools/ZAPDConfigs/MM/SymbolMap_MM.txt +++ b/tools/ZAPDConfigs/MM/SymbolMap_MM.txt @@ -1 +1,2 @@ 801D1DE0 gIdentityMtx +801AEFA0 D_801AEFA0 From 5b17c3793e9bd73b1aed65f6d940e3502640e41d Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Thu, 9 Nov 2023 22:56:33 +1100 Subject: [PATCH 16/28] Match `Environment_UpdateLights` (z_kankyo OK) (#1478) * Match Environment_UpdateLights * cleanup --- src/code/z_kankyo.c | 66 ++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index 86aeaa330..82a7a8df5 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -1253,9 +1253,6 @@ s32 Environment_IsSceneUpsideDown(PlayState* play) { return ret; } -#ifdef NON_MATCHING -// Something is happening with the indexing of: -// `lightSettingsList[(s32)envCtx->lightSetting]` and `lightSettingsList[(s32)envCtx->prevLightSetting]` void Environment_UpdateLights(PlayState* play, EnvironmentContext* envCtx, LightContext* lightCtx) { EnvLightSettings* lightSettingsList; f32 var_fs3; @@ -1418,30 +1415,29 @@ void Environment_UpdateLights(PlayState* play, EnvironmentContext* envCtx, Light } } } else { + u8 lightSetting; + u8 var_v0_3; + if ((envCtx->lightSetting >= envCtx->numLightSettings) && !D_801BDBA8) { D_801BDBA8 = true; } if (!envCtx->lightBlendEnabled) { for (i = 0; i < 3; i++) { - envCtx->lightSettings.ambientColor[i] = - lightSettingsList[(s32)envCtx->lightSetting].ambientColor[i]; - envCtx->lightSettings.light1Dir[i] = lightSettingsList[(s32)envCtx->lightSetting].light1Dir[i]; - envCtx->lightSettings.light1Color[i] = lightSettingsList[(s32)envCtx->lightSetting].light1Color[i]; - envCtx->lightSettings.light2Dir[i] = lightSettingsList[(s32)envCtx->lightSetting].light2Dir[i]; - envCtx->lightSettings.light2Color[i] = lightSettingsList[(s32)envCtx->lightSetting].light2Color[i]; - envCtx->lightSettings.fogColor[i] = lightSettingsList[(s32)envCtx->lightSetting].fogColor[i]; + envCtx->lightSettings.ambientColor[i] = lightSettingsList[envCtx->lightSetting].ambientColor[i]; + envCtx->lightSettings.light1Dir[i] = lightSettingsList[envCtx->lightSetting].light1Dir[i]; + envCtx->lightSettings.light1Color[i] = lightSettingsList[envCtx->lightSetting].light1Color[i]; + envCtx->lightSettings.light2Dir[i] = lightSettingsList[envCtx->lightSetting].light2Dir[i]; + envCtx->lightSettings.light2Color[i] = lightSettingsList[envCtx->lightSetting].light2Color[i]; + envCtx->lightSettings.fogColor[i] = lightSettingsList[envCtx->lightSetting].fogColor[i]; } + + lightSetting = envCtx->lightSetting; envCtx->lightSettings.fogNear = - ENV_LIGHT_SETTINGS_FOG_NEAR(lightSettingsList[(s32)envCtx->lightSetting].blendRateAndFogNear); - envCtx->lightSettings.zFar = lightSettingsList[(s32)envCtx->lightSetting].zFar; + ENV_LIGHT_SETTINGS_FOG_NEAR(lightSettingsList[(s32)lightSetting].blendRateAndFogNear); + envCtx->lightSettings.zFar = lightSettingsList[(s32)lightSetting].zFar; envCtx->lightBlend = 1.0f; } else { - u8 var_v0_3; - - //! FAKE: - if (1) {} - var_v0_3 = ENV_LIGHT_SETTINGS_BLEND_RATE_U8(lightSettingsList[(s32)envCtx->lightSetting].blendRateAndFogNear); @@ -1463,33 +1459,33 @@ void Environment_UpdateLights(PlayState* play, EnvironmentContext* envCtx, Light for (i = 0; i < 3; i++) { envCtx->lightSettings.ambientColor[i] = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].ambientColor[i], - lightSettingsList[(s32)envCtx->lightSetting].ambientColor[i], envCtx->lightBlend); + LERPIMP_ALT(lightSettingsList[envCtx->prevLightSetting].ambientColor[i], + lightSettingsList[envCtx->lightSetting].ambientColor[i], envCtx->lightBlend); envCtx->lightSettings.light1Dir[i] = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].light1Dir[i], - lightSettingsList[(s32)envCtx->lightSetting].light1Dir[i], envCtx->lightBlend); + LERPIMP_ALT(lightSettingsList[envCtx->prevLightSetting].light1Dir[i], + lightSettingsList[envCtx->lightSetting].light1Dir[i], envCtx->lightBlend); envCtx->lightSettings.light1Color[i] = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].light1Color[i], - lightSettingsList[(s32)envCtx->lightSetting].light1Color[i], envCtx->lightBlend); + LERPIMP_ALT(lightSettingsList[envCtx->prevLightSetting].light1Color[i], + lightSettingsList[envCtx->lightSetting].light1Color[i], envCtx->lightBlend); envCtx->lightSettings.light2Dir[i] = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].light2Dir[i], - lightSettingsList[(s32)envCtx->lightSetting].light2Dir[i], envCtx->lightBlend); + LERPIMP_ALT(lightSettingsList[envCtx->prevLightSetting].light2Dir[i], + lightSettingsList[envCtx->lightSetting].light2Dir[i], envCtx->lightBlend); envCtx->lightSettings.light2Color[i] = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].light2Color[i], - lightSettingsList[(s32)envCtx->lightSetting].light2Color[i], envCtx->lightBlend); + LERPIMP_ALT(lightSettingsList[envCtx->prevLightSetting].light2Color[i], + lightSettingsList[envCtx->lightSetting].light2Color[i], envCtx->lightBlend); envCtx->lightSettings.fogColor[i] = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].fogColor[i], - lightSettingsList[(s32)envCtx->lightSetting].fogColor[i], envCtx->lightBlend); + LERPIMP_ALT(lightSettingsList[envCtx->prevLightSetting].fogColor[i], + lightSettingsList[envCtx->lightSetting].fogColor[i], envCtx->lightBlend); } + lightSetting = envCtx->lightSetting; envCtx->lightSettings.fogNear = LERPIMP_ALT( ENV_LIGHT_SETTINGS_FOG_NEAR(lightSettingsList[(s32)envCtx->prevLightSetting].blendRateAndFogNear), - ENV_LIGHT_SETTINGS_FOG_NEAR(lightSettingsList[(s32)envCtx->lightSetting].blendRateAndFogNear), + ENV_LIGHT_SETTINGS_FOG_NEAR(lightSettingsList[(s32)lightSetting].blendRateAndFogNear), envCtx->lightBlend); - envCtx->lightSettings.zFar = - LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].zFar, - lightSettingsList[(s32)envCtx->lightSetting].zFar, envCtx->lightBlend); + envCtx->lightSettings.zFar = LERPIMP_ALT(lightSettingsList[(s32)envCtx->prevLightSetting].zFar, + lightSettingsList[(s32)lightSetting].zFar, envCtx->lightBlend); } } } @@ -1568,10 +1564,6 @@ void Environment_UpdateLights(PlayState* play, EnvironmentContext* envCtx, Light envCtx->dirLight2.params.dir.x = 1; } } -#else -void Environment_UpdateLights(PlayState* play, EnvironmentContext* envCtx, LightContext* lightCtx); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_UpdateLights.s") -#endif void Environment_UpdateSun(PlayState* play) { f32 temp_f0; From 7681c97df002c2ab07f942d077f5ff3efbe9471d Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Fri, 10 Nov 2023 02:57:56 +1100 Subject: [PATCH 17/28] Match Both Message Decodes (#1479) * WIP * match Message_DecodeNES * cleanup * another cleanup * match Message_Decode * more cleanup * oops * add back void --- src/code/z_message.c | 284 ++++++++++++++++---------------- src/code/z_message_nes.c | 344 +++++++++++++++++++-------------------- 2 files changed, 302 insertions(+), 326 deletions(-) diff --git a/src/code/z_message.c b/src/code/z_message.c index 3cc79e649..f3bf144a6 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -2151,36 +2151,30 @@ u16 D_801D027C[] = { 0x2001, 0x2003, 0x2004, 0x2002 }; // Counterpart to NES sMaskCodeTextENG u16 D_801D0284[] = { 0x90D4, 0x90C2, 0x89A9, 0x97CE }; -#ifdef NON_MATCHING -// https://decomp.me/scratch/ZTbP4 void Message_Decode(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; - Font* font = &msgCtx->font; // spF0 - Player* player; // spEC - s16 decodedBufPos; // spEA + Font* font = &msgCtx->font; + Player* player = GET_PLAYER(play); + s16 decodedBufPos; + s16 loadChar; u32 timeToMoonCrash; - s16 temp2; - s16 spE0; - s32 pad4; - s16 digits[4]; // spD4/D6/D8/DA + s16 var_v0; + s16 numLines; + u8* fontBuf; + s16 digits[4]; s16 spD2; f32 timeInSeconds; - s32 charTexIdx; // spC8 - s16 var_v0; - s16 loadChar; - f32 spC0; + s32 charTexIndex; f32 var_fs0; + f32 spC0; s16 index; s16 value; s16 playerNameLen; - s16 i; // s1 + s16 i; + u16 index2 = 0; s16 spAC[4]; - u8 var_s3_8; u16 curChar; - u32 temp; - u8* ptr2; - player = GET_PLAYER(play); msgCtx->textDelayTimer = 0; msgCtx->textDelay = msgCtx->textDelayTimer; msgCtx->textFade = 0; @@ -2189,9 +2183,9 @@ void Message_Decode(PlayState* play) { if ((gSaveContext.options.language == LANGUAGE_JPN) && !msgCtx->textIsCredits) { spD2 = 0; - spE0 = 0; + numLines = 0; decodedBufPos = 0; - charTexIdx = 0; + charTexIndex = 0; Message_SetupLoadItemIcon(play); while (true) { @@ -2211,29 +2205,27 @@ void Message_Decode(PlayState* play) { spC0 = 0.0f; if (curChar == 0xB) { if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { - if (spE0 < 2) { + if (numLines < 2) { msgCtx->unk11FFA = msgCtx->textboxY + 0x16; - } else if (spE0 == 2) { + } else if (numLines == 2) { msgCtx->unk11FFA = msgCtx->textboxY + 0xE; } } } else { + s32 requiredScopeTemp; + if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { - if (spE0 == 0) { + if (numLines == 0) { msgCtx->unk11FFA = msgCtx->textboxY + 0x16; - } else if (spE0 == 1) { + } else if (numLines == 1) { msgCtx->unk11FFA = msgCtx->textboxY + 0xE; } } } - { - s32 pad; - - if ((curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112)) { - msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos + 1]; - msgCtx->msgBufPos += 2; - } + if ((curChar == 0x110) || (curChar == 0x111) || (curChar == 0x112)) { + msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[msgCtx->msgBufPos + 1]; + msgCtx->msgBufPos += 2; } msgCtx->decodedTextLen = decodedBufPos; @@ -2243,6 +2235,7 @@ void Message_Decode(PlayState* play) { (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) { msgCtx->textDrawPos = msgCtx->decodedTextLen; } + msgCtx->unk120C8 = msgCtx->unk120CE; msgCtx->unk120CA = msgCtx->unk120D0; msgCtx->unk120CC = msgCtx->unk120D2; @@ -2252,32 +2245,35 @@ void Message_Decode(PlayState* play) { if (curChar == 0x100) { for (playerNameLen = ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); playerNameLen > 0; playerNameLen--) { - if (gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1] != 0x3E) { + if (((void)0, gSaveContext.save.saveInfo.playerData.playerName[playerNameLen - 1]) != 0x3E) { break; } } for (i = 0; i < playerNameLen; i++) { - ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.playerData.playerName[i]) * - FONT_CHAR_TEX_SIZE]; + curChar = gSaveContext.save.saveInfo.playerData.playerName[i]; + index2 = curChar & 0xFFFF; + fontBuf = &font->fontBuf[index2 * FONT_CHAR_TEX_SIZE]; msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x100; for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) { - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 0] = - ptr2[var_v0 + 0] & 0xFF; //! FAKE: Fixes later regalloc - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1]; - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2]; - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 0] = fontBuf[var_v0 + 0]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 1] = fontBuf[var_v0 + 1]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 2] = fontBuf[var_v0 + 2]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 3] = fontBuf[var_v0 + 3]; } - charTexIdx += FONT_CHAR_TEX_SIZE; + charTexIndex += FONT_CHAR_TEX_SIZE; } + //! FAKE: + fontBuf = &font->fontBuf[index2 * FONT_CHAR_TEX_SIZE]; + decodedBufPos += playerNameLen - 1; spC0 += playerNameLen * (16.0f * msgCtx->textCharScale); } else if (curChar == 0x201) { DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); - spE0 = 2; + numLines = 2; spD2 = 2; msgCtx->unk12012 = msgCtx->textboxY + 8; msgCtx->unk11F18 = 1; @@ -2298,7 +2294,7 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, spAC[i + 3] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, spAC[i + 3] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } @@ -2313,7 +2309,7 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, spAC[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, spAC[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } @@ -2335,18 +2331,18 @@ void Message_Decode(PlayState* play) { } for (i = 0; i < 4; i++) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; if (i == 1) { - Font_LoadChar(play, 0x8E9E, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x8E9E, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E; decodedBufPos++; } else if (i == 3) { - Font_LoadChar(play, 0x95AA, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x95AA, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA; } } @@ -2374,28 +2370,28 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } } - Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x9543, &charTexIndex, &spC0, decodedBufPos); } else if (curChar == 0x20C) { decodedBufPos++; msgCtx->unk120BE = spD2; msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 2; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; digits[0] = digits[1] = digits[2] = 0; for (i = 0; i < 3; i++) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } - func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + func_8014CCB4(play, &decodedBufPos, &charTexIndex, &spC0); } else if (curChar == 0x20D) { digits[0] = digits[1] = 0; digits[2] = msgCtx->bankRupeesSelected; @@ -2416,11 +2412,11 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } - func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + func_8014CCB4(play, &decodedBufPos, &charTexIndex, &spC0); } else if (curChar == 0x20E) { digits[0] = digits[1] = digits[2] = 0; digits[3] = msgCtx->bankRupees; @@ -2444,13 +2440,13 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } - func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + func_8014CCB4(play, &decodedBufPos, &charTexIndex, &spC0); } else if (curChar == 0x20F) { - Message_LoadTime(play, curChar, &charTexIdx, &spC0, &decodedBufPos); + Message_LoadTime(play, curChar, &charTexIndex, &spC0, &decodedBufPos); } else if (curChar == 0x21C) { digits[0] = digits[1] = 0; digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex]; @@ -2470,13 +2466,13 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } - Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x906C, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; - Message_LoadChar(play, 0x96DA, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x96DA, &charTexIndex, &spC0, decodedBufPos); } else if (curChar == 0x21D) { digits[0] = digits[1] = 0; digits[2] = Inventory_GetSkullTokenCount(play->sceneId); @@ -2496,11 +2492,11 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } - Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x9543, &charTexIndex, &spC0, decodedBufPos); } else if (curChar == 0x21E) { digits[0] = 0; digits[1] = gSaveContext.minigameScore; @@ -2512,7 +2508,7 @@ void Message_Decode(PlayState* play) { for (i = 0; i < 2; i++) { if ((i == 1) || (digits[i] != 0)) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } @@ -2540,7 +2536,7 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } @@ -2551,59 +2547,58 @@ void Message_Decode(PlayState* play) { msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 0; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; digits[0] = digits[1] = digits[2] = 0; for (i = 0; i < 2; i++) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } - func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + func_8014CCB4(play, &decodedBufPos, &charTexIndex, &spC0); } else if (curChar == 0x221) { decodedBufPos++; msgCtx->unk120BE = spD2; msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 0; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; for (i = 0; i < 5; i++) { msgCtx->unk12054[i] = 1; - Message_LoadChar(play, 0x8250, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x8250, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } decodedBufPos--; } else if (curChar == 0x223) { - if (gSaveContext.save.timeSpeedOffset == 0x12) { - var_s3_8 = 0; - } else if (gSaveContext.save.timeSpeedOffset == 0) { - var_s3_8 = 1; + if (((void)0, gSaveContext.save.timeSpeedOffset) == 0x12) { + index = 0; + } else if (((void)0, gSaveContext.save.timeSpeedOffset) == 0) { + index = 1; } else { - var_s3_8 = 2; + index = 2; } - for (i = 0; i < 3; i++) { - msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D0268[var_s3_8][i]; - Font_LoadChar(play, D_801D0268[var_s3_8][i], charTexIdx); - decodedBufPos++; - charTexIdx += FONT_CHAR_TEX_SIZE; + for (i = 0; i < 3; i++, decodedBufPos++) { + msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D0268[index][i]; + Font_LoadChar(play, D_801D0268[index][i], charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; } decodedBufPos--; spC0 += 3.0f * (16.0f * msgCtx->textCharScale); - msgCtx->choiceIndex = var_s3_8; + msgCtx->choiceIndex = index; } else if (curChar == 0x224) { - Message_LoadOwlWarpText(play, &charTexIdx, &spC0, &decodedBufPos); + Message_LoadOwlWarpText(play, &charTexIndex, &spC0, &decodedBufPos); } else if (curChar == 0x225) { decodedBufPos++; msgCtx->unk120BE = spD2; msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 0; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; for (i = 0; i < 3; i++) { msgCtx->unk12054[i] = 1; - Font_LoadChar(play, 0x8250, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x8250, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8250; spC0 += 16.0f * msgCtx->textCharScale; decodedBufPos++; @@ -2614,13 +2609,14 @@ void Message_Decode(PlayState* play) { msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])]; decodedBufPos++; - Message_LoadChar(play, i + 0x8250, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, i + 0x8250, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000; } else if ((curChar >= 0x227) && (curChar < 0x22B)) { digits[0] = digits[1] = 0; - digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0x227]; + digits[2] = + STRAY_FAIRY_SCATTERED_TOTAL - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0x227]; while (digits[2] >= 100) { digits[0]++; @@ -2637,14 +2633,14 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } } - Message_LoadChar(play, 0x906C, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x906C, &charTexIndex, &spC0, decodedBufPos); } else if (curChar == 0x22B) { digits[0] = digits[1] = digits[2] = 0; digits[3] = gSaveContext.minigameScore; @@ -2668,14 +2664,14 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } } - Message_LoadChar(play, 0x94AD, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x94AD, &charTexIndex, &spC0, decodedBufPos); } else if ((curChar == 0x22C) || (curChar == 0x22D)) { if (curChar == 0x22C) { digits[0] = gSaveContext.save.saveInfo.lotteryCodes[CURRENT_DAY - 1][0]; @@ -2687,8 +2683,8 @@ void Message_Decode(PlayState* play) { digits[2] = HS_GET_LOTTERY_CODE_GUESS() & 0xF; } for (i = 0; i < 3; i++) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; @@ -2717,33 +2713,32 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } } - func_8014CCB4(play, &decodedBufPos, &charTexIdx, &spC0); + func_8014CCB4(play, &decodedBufPos, &charTexIndex, &spC0); } else if (curChar == 0x22F) { for (i = 0; i < 5; i++) { digits[i] = gSaveContext.save.saveInfo.bomberCode[i]; - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } decodedBufPos--; } else if ((curChar >= 0x231) && (curChar < 0x237)) { - // index = curChar - 0x231; msgCtx->decodedBuffer.wchar[decodedBufPos] = D_801D027C[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])]; decodedBufPos++; Message_LoadChar( play, D_801D0284[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0x231)])], - &charTexIdx, &spC0, decodedBufPos); + &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x2000; } else if (curChar == 0x237) { @@ -2762,20 +2757,20 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadChar(play, digits[i] + 0x824F, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, digits[i] + 0x824F, &charTexIndex, &spC0, decodedBufPos); decodedBufPos++; } } - Font_LoadChar(play, 0x8E9E, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x8E9E, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E; decodedBufPos++; - Font_LoadChar(play, 0x8AD4, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x8AD4, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x8E9E; spC0 += 2.0f * (16.0f * msgCtx->textCharScale); } else if (curChar == 0x238) { - Message_LoadTime(play, curChar, &charTexIdx, &spC0, &decodedBufPos); + Message_LoadTime(play, curChar, &charTexIndex, &spC0, &decodedBufPos); } else if ((curChar == 0x300) || (curChar == 0x301) || (curChar == 0x302) || (curChar == 0x308)) { if (curChar == 0x308) { value = (s32)HS_GET_HIGH_SCORE_3_LOWER(); @@ -2811,8 +2806,8 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; @@ -2837,8 +2832,8 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, spAC[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, spAC[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = spAC[i] + 0x824F; decodedBufPos++; } else { @@ -2848,9 +2843,9 @@ void Message_Decode(PlayState* play) { spC0 += var_fs0 * (16.0f * msgCtx->textCharScale); decodedBufPos--; } else if ((curChar == 0x303) || (curChar == 0x304) || (curChar == 0x305)) { - temp2 = HIGH_SCORE(curChar - 0x303 + HS_BOAT_ARCHERY); + value = HIGH_SCORE(curChar - 0x303 + HS_BOAT_ARCHERY); digits[0] = digits[1] = digits[2] = 0; - digits[3] = temp2; + digits[3] = value; while (digits[3] >= 60) { digits[1]++; @@ -2866,18 +2861,18 @@ void Message_Decode(PlayState* play) { } for (i = 0; i < 4; i++) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; if (i == 1) { - Font_LoadChar(play, 0x95AA, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x95AA, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x95AA; decodedBufPos++; } else if (i == 3) { - Font_LoadChar(play, 0x9562, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, 0x9562, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = 0x9562; } } @@ -2905,38 +2900,37 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } } - Message_LoadChar(play, 0x9543, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x9543, &charTexIndex, &spC0, decodedBufPos); } else if ((curChar == 0x30D) || (curChar == 0x30E) || (curChar == 0x30F)) { - //! Removing index and casting one version causes gSaveContext to be reloaded - // index = curChar - 0x30D; + index = curChar - 0x30D; for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) { - if (gSaveContext.save.saveInfo.inventory - .dekuPlaygroundPlayerName[(s16)(curChar - 0x30D)][playerNameLen - 1] != 0x3E) { + if (gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[index][playerNameLen - 1] != + 0x3E) { break; } } for (i = 0; i < playerNameLen; i++) { - ptr2 = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory - .dekuPlaygroundPlayerName[curChar - 0x30D][i]) * - FONT_CHAR_TEX_SIZE]; + curChar = ((void)0, gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[index][i]); + //! FAKE: 0xFFFF + fontBuf = &font->fontBuf[(curChar & 0xFFFF) * FONT_CHAR_TEX_SIZE]; msgCtx->decodedBuffer.wchar[decodedBufPos + i] = 0x30D; for (var_v0 = 0; var_v0 < FONT_CHAR_TEX_SIZE; var_v0 += 4) { - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 0] = ptr2[var_v0 + 0]; - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 1] = ptr2[var_v0 + 1]; - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 2] = ptr2[var_v0 + 2]; - font->charBuf[font->unk_11D88][charTexIdx + var_v0 + 3] = ptr2[var_v0 + 3]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 0] = fontBuf[var_v0 + 0]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 1] = fontBuf[var_v0 + 1]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 2] = fontBuf[var_v0 + 2]; + font->charBuf[font->unk_11D88][charTexIndex + var_v0 + 3] = fontBuf[var_v0 + 3]; } - charTexIdx += FONT_CHAR_TEX_SIZE; + charTexIndex += FONT_CHAR_TEX_SIZE; } decodedBufPos += playerNameLen - 1; spC0 += playerNameLen * (16.0f * msgCtx->textCharScale); @@ -2963,14 +2957,14 @@ void Message_Decode(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadChar(play, digits[i] + 0x824F, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.wchar[decodedBufPos] = digits[i] + 0x824F; decodedBufPos++; spC0 += 16.0f * msgCtx->textCharScale; } } - Message_LoadChar(play, 0x94AD, &charTexIdx, &spC0, decodedBufPos); + Message_LoadChar(play, 0x94AD, &charTexIndex, &spC0, decodedBufPos); } else if (curChar == 0x1F) { decodedBufPos--; for (i = 0; i < font->msgBuf.wchar[msgCtx->msgBufPos + 1]; i++) { @@ -2986,7 +2980,7 @@ void Message_Decode(PlayState* play) { spD2++; spC0 = 0.0f; if (curChar == 0xA) { - spE0++; + numLines++; } } else if ((curChar == 0x101) || (curChar == 0x102) || (curChar == 0x104) || ((curChar >= 0x130) && (curChar < 0x137))) { @@ -3005,8 +2999,8 @@ void Message_Decode(PlayState* play) { } else if (curChar == 0x128) { msgCtx->decodedBuffer.wchar[++decodedBufPos] = font->msgBuf.wchar[++msgCtx->msgBufPos]; } else if ((curChar != 0x20) && ((curChar < 0x2000) || (curChar >= 0x2009))) { - Font_LoadChar(play, curChar, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadChar(play, curChar, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; if ((curChar == 0x8169) || (curChar == 0x8175)) { spC0 += 10.0f * msgCtx->textCharScale; } else if (curChar == 0x8145) { @@ -3038,10 +3032,6 @@ void Message_Decode(PlayState* play) { Message_DecodeNES(play); } } -#else -void Message_Decode(PlayState* play); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message/Message_Decode.s") -#endif void func_80150A84(PlayState* play) { MessageContext* msgCtx = &play->msgCtx; diff --git a/src/code/z_message_nes.c b/src/code/z_message_nes.c index 3775b5b26..ceb921bae 100644 --- a/src/code/z_message_nes.c +++ b/src/code/z_message_nes.c @@ -544,11 +544,9 @@ void Message_DrawTextNES(PlayState* play, Gfx** gfxP, u16 textDrawPos) { case 0x17: // MESSAGE_QUICKTEXT_ENABLE if ((i + 1) == msgCtx->textDrawPos) { - j = i; if ((msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) || ((msgCtx->msgMode >= MSGMODE_OCARINA_STARTING) && (msgCtx->msgMode <= MSGMODE_26))) { - //! FAKE: - dummy:; + j = i; while (true) { if ((msgCtx->decodedBuffer.schar[j] != 0x18) && (msgCtx->decodedBuffer.schar[j] != 0x1A) && (msgCtx->decodedBuffer.schar[j] != 0x19) && (msgCtx->decodedBuffer.schar[j] != 0xE0) && @@ -954,41 +952,33 @@ u8 sMaskCodeTextLengthENG[] = { sizeof(GREEN_STR) - 1, }; -#ifdef NON_MATCHING -// https://decomp.me/scratch/w2ckG void Message_DecodeNES(PlayState* play) { - f32 var_fs0; MessageContext* msgCtx = &play->msgCtx; - u8* ptr; - Font* font = &msgCtx->font; // spE0 - Player* player; // spDC - s16 decodedBufPos; // spDA + Font* font = &msgCtx->font; + Player* player = GET_PLAYER(play); + s16 decodedBufPos = 0; s16 value; u32 timeToMoonCrash; - s16 i; // s1 - s16 spD0; // numLines - s16 digits[4]; // spC8/CA/CC/CE - s16 spC6; - f32 timeInSeconds; - s32 charTexIdx; // spBC + s16 i; + s16 numLines; + s16 digits[4]; + s16 spC6 = 0; + u16 sfxHi; + f32 var_fs0; + s32 charTexIndex = 0; s16 loadChar; + s16 index; s16 spA8[8]; f32 spA4; - s16 playerNameLen; // s0 + u8* fontBuf; + s16 playerNameLen; s16 var_v1_3; - u8 curChar; // sp78 - s8 charOffset; - s16 temp_s2_2; - s16 var_s2_9; + u8 curChar; - player = GET_PLAYER(play); - decodedBufPos = 0; - spC6 = 0; - charTexIdx = 0; - spD0 = 0; + numLines = 0; msgCtx->textDelayTimer = 0; msgCtx->textDelay = msgCtx->textDelayTimer; - msgCtx->textFade = 0; + msgCtx->textFade = false; spA4 = 0.0f; font->unk_11D88 = (font->unk_11D88 ^ 1) & 1; Message_SetupLoadItemIcon(play); @@ -1010,39 +1000,44 @@ void Message_DecodeNES(PlayState* play) { if (msgCtx->unk11F18 != 0) { msgCtx->unk11F1A[spC6] = (s16)((msgCtx->textCharScale * 16.0f * 16.0f) - spA4) / 2; } + spA4 = 0.0f; + if (curChar == 0x12) { if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { - if (spD0 < 2) { + if (numLines < 2) { msgCtx->unk11FFA = msgCtx->textboxY + XREG(10); - } else if (spD0 == 2) { + } else if (numLines == 2) { msgCtx->unk11FFA = msgCtx->textboxY + XREG(11); - } else if (spD0 == 3) { + } else if (numLines == 3) { msgCtx->unk11FFA = msgCtx->textboxY + XREG(12); } } } else { if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { - if (spD0 == 0) { + if (numLines == 0) { msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(10); - } else if (spD0 == 1) { + } else if (numLines == 1) { msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(11); - } else if (spD0 == 2) { + } else if (numLines == 2) { msgCtx->unk11FFA = msgCtx->textboxY + XREG(13) + XREG(12); } } } - //! FAKE: Perhaps a locally required temp for scoping - dummy:; - if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) { - //! FAKE: & 0xFFFF to fix regalloc - msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 1] & 0xFFFF; - msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2]; - msgCtx->msgBufPos += 3; + { + s8 requiredScopeTemp; + + if ((curChar == 0x1B) || (curChar == 0x1C) || (curChar == 0x1D)) { + //! FAKE: & 0xFFFF to fix regalloc + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[(msgCtx->msgBufPos & 0xFFFF) + 1]; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[msgCtx->msgBufPos + 2]; + msgCtx->msgBufPos += 3; + } } + msgCtx->decodedTextLen = decodedBufPos; - msgCtx->unk120D8 = spD0; + msgCtx->unk120D8 = numLines; if (msgCtx->textboxSkipped || (msgCtx->textBoxType == TEXTBOX_TYPE_1) || (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) || (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) || @@ -1071,29 +1066,28 @@ void Message_DecodeNES(PlayState* play) { } else if (curChar == 0x3F) { curChar = '-'; } else if (curChar < 0xA) { - charOffset = curChar; - curChar = '0' + charOffset; + curChar += 0; + curChar = '0' + curChar; } else if (curChar < 0x24) { - charOffset = curChar; - curChar = 'A' - 10 + charOffset; + curChar += 0; + curChar = 'A' - 10 + curChar; } else if (curChar < 0x3E) { - charOffset = curChar; - curChar = 'a' - 36 + charOffset; + curChar += 0; + curChar = 'a' - 36 + curChar; } if (curChar != ' ') { - Font_LoadCharNES(play, curChar, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, curChar, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; } msgCtx->decodedBuffer.schar[decodedBufPos] = curChar; decodedBufPos++; } decodedBufPos--; } else if (curChar == 0xC1) { - //! TODO: + 0x900 on the first one? DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1000, SEGMENT_ROM_START(message_texture_static), 0x900); - DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, - (uintptr_t)SEGMENT_ROM_START(message_texture_static) + 0x900, 0x900); - spD0 = 2; + DmaMgr_SendRequest0(msgCtx->textboxSegment + 0x1900, SEGMENT_ROM_START(message_texture_static) + 0x900, + 0x900); + numLines = 2; spC6 = 2; msgCtx->unk12012 = msgCtx->textboxY + 8; msgCtx->unk11F18 = 1; @@ -1114,7 +1108,7 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, spA8[i + 3], &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, spA8[i + 3], &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } @@ -1129,41 +1123,39 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, spA8[i], &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, spA8[i], &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } decodedBufPos--; } else if (curChar == 0xCA) { digits[0] = 0; - timeInSeconds = TIME_TO_MINUTES_F(gSaveContext.save.time); - - digits[1] = timeInSeconds / 60.0f; + digits[1] = TIME_TO_MINUTES_F(gSaveContext.save.time) / 60.0f; while (digits[1] >= 10) { digits[0]++; digits[1] -= 10; } digits[2] = 0; - digits[3] = (s32)timeInSeconds % 60; + digits[3] = (s32)TIME_TO_MINUTES_F(gSaveContext.save.time) % 60; while (digits[3] >= 10) { digits[2]++; digits[3] -= 10; } for (i = 0; i < 4; i++) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; if (i == 1) { - Font_LoadCharNES(play, '"', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, '"', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = 0x22; decodedBufPos++; } else if (i == 3) { - Font_LoadCharNES(play, 0x27, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, 0x27, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27; } } @@ -1191,8 +1183,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1205,14 +1197,14 @@ void Message_DecodeNES(PlayState* play) { msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 2; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; digits[0] = digits[1] = digits[2] = 0; for (i = 0; i < 3; i++) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } - Message_LoadLocalizedRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4); + Message_LoadLocalizedRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4); } else if (curChar == 0xCD) { digits[0] = digits[1] = 0; digits[2] = msgCtx->bankRupeesSelected; @@ -1233,11 +1225,11 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } - Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupeesSelected); + Message_LoadRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4, msgCtx->bankRupeesSelected); } else if (curChar == 0xCE) { digits[0] = digits[1] = digits[2] = 0; digits[3] = msgCtx->bankRupees; @@ -1261,13 +1253,13 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } - Message_LoadRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4, msgCtx->bankRupees); + Message_LoadRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4, msgCtx->bankRupees); } else if (curChar == 0xCF) { - Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos); + Message_LoadTimeNES(play, curChar, &charTexIndex, &spA4, &decodedBufPos); } else if (curChar == 0xC) { digits[0] = digits[1] = 0; digits[2] = gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex]; @@ -1287,30 +1279,30 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 1) || (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 21)) { - Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 's', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos); } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 2) || (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 22)) { - Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'n', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos); } else if ((gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 3) || (gSaveContext.save.saveInfo.inventory.strayFairies[(void)0, gSaveContext.dungeonIndex] == 23)) { - Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'r', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos); } else { - Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'h', &charTexIndex, &spA4, decodedBufPos); } } else if (curChar == 0xD) { digits[0] = digits[1] = 0; @@ -1331,30 +1323,30 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } if ((Inventory_GetSkullTokenCount(play->sceneId) == 1) || (Inventory_GetSkullTokenCount(play->sceneId) == 21)) { - Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 's', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos); } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 2) || (Inventory_GetSkullTokenCount(play->sceneId) == 22)) { - Message_LoadCharNES(play, 'n', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'n', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos); } else if ((Inventory_GetSkullTokenCount(play->sceneId) == 3) || (Inventory_GetSkullTokenCount(play->sceneId) == 23)) { - Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'r', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'd', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'd', &charTexIndex, &spA4, decodedBufPos); } else { - Message_LoadCharNES(play, 't', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 't', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'h', &charTexIndex, &spA4, decodedBufPos); } } else if (curChar == 0xE) { digits[0] = 0; @@ -1367,7 +1359,7 @@ void Message_DecodeNES(PlayState* play) { for (i = 0; i < 2; i++) { if ((i == 1) || (digits[i] != 0)) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } @@ -1396,7 +1388,7 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } @@ -1407,59 +1399,58 @@ void Message_DecodeNES(PlayState* play) { msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 0; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; digits[0] = digits[1] = digits[2] = 0; for (i = 0; i < 2; i++) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } - Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4); + Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4); } else if (curChar == 0xD1) { decodedBufPos++; msgCtx->unk120BE = spC6; msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 0; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; for (i = 0; i < 5; i++) { msgCtx->unk12054[i] = 1; - Message_LoadCharNES(play, '1', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, '1', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } decodedBufPos--; } else if (curChar == 0xD3) { - if (gSaveContext.save.timeSpeedOffset == 18) { - var_s2_9 = 0; - } else if (gSaveContext.save.timeSpeedOffset == 0) { - var_s2_9 = 1; + if (((void)0, gSaveContext.save.timeSpeedOffset) == 18) { + index = 0; + } else if (((void)0, gSaveContext.save.timeSpeedOffset) == 0) { + index = 1; } else { - var_s2_9 = 2; + index = 2; } - for (i = 0; i < 4; i++) { - msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[var_s2_9][i]; - Font_LoadCharNES(play, D_801D08D8[var_s2_9][i], charTexIdx); - decodedBufPos++; - charTexIdx += FONT_CHAR_TEX_SIZE; + for (i = 0; i < 4; i++, decodedBufPos++) { + msgCtx->decodedBuffer.schar[decodedBufPos] = D_801D08D8[index][i]; + Font_LoadCharNES(play, D_801D08D8[index][i], charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; } decodedBufPos--; spA4 += 3.0f * (16.0f * msgCtx->textCharScale); - msgCtx->choiceIndex = var_s2_9; + msgCtx->choiceIndex = index; } else if (curChar == 0xD4) { - Message_LoadOwlWarpTextNES(play, &charTexIdx, &spA4, &decodedBufPos); + Message_LoadOwlWarpTextNES(play, &charTexIndex, &spA4, &decodedBufPos); } else if (curChar == 0xD5) { decodedBufPos++; msgCtx->unk120BE = spC6; msgCtx->unk120C0 = decodedBufPos; msgCtx->unk120C2 = 0; msgCtx->bankRupeesSelected = 0; - msgCtx->unk120C4 = charTexIdx; + msgCtx->unk120C4 = charTexIndex; for (i = 0; i < 3; i++) { msgCtx->unk12054[i] = 1; - Font_LoadCharNES(play, '1', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, '1', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = '1'; spA4 += 16.0f * msgCtx->textCharScale; decodedBufPos++; @@ -1468,15 +1459,15 @@ void Message_DecodeNES(PlayState* play) { } else if (curChar == 0xD6) { for (i = 0; i < 6; i++) { msgCtx->decodedBuffer.schar[decodedBufPos] = - (s8)D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])]; + D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[i])]; decodedBufPos++; - Message_LoadCharNES(play, i + '1', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, i + '1', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } msgCtx->decodedBuffer.schar[decodedBufPos] = 0; } else if ((curChar >= 0xD7) && (curChar < 0xDB)) { digits[0] = digits[1] = 0; - digits[2] = 15 - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0xD7]; + digits[2] = STRAY_FAIRY_SCATTERED_TOTAL - gSaveContext.save.saveInfo.inventory.strayFairies[curChar - 0xD7]; while (digits[2] >= 100) { digits[0]++; @@ -1493,8 +1484,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1523,8 +1514,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1543,8 +1534,8 @@ void Message_DecodeNES(PlayState* play) { } for (i = 0; i < 3; i++) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1573,38 +1564,35 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; } } - Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIdx, &spA4); + Message_LoadPluralRupeesNES(play, &decodedBufPos, &charTexIndex, &spA4); } else if (curChar == 0xDF) { for (i = 0; i < 5; i++) { digits[i] = gSaveContext.save.saveInfo.bomberCode[i]; - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; } decodedBufPos--; } else if ((curChar >= 0xE1) && (curChar < 0xE7)) { - msgCtx->decodedBuffer.schar[decodedBufPos] = + msgCtx->decodedBuffer.schar[decodedBufPos++] = D_801D08E4[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]; - temp_s2_2 = sMaskCodeTextLengthENG[( - (void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]; - decodedBufPos++; - - for (i = 0; i < temp_s2_2; i++) { + index = sMaskCodeTextLengthENG[((void)0, + gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])]; + for (playerNameLen = 0; playerNameLen < index; playerNameLen++, decodedBufPos++) { Message_LoadCharNES( play, sMaskCodeTextENG[((void)0, gSaveContext.save.saveInfo.spiderHouseMaskOrder[(s16)(curChar - 0xE1)])] - [i], - &charTexIdx, &spA4, decodedBufPos); - decodedBufPos++; + [playerNameLen], + &charTexIndex, &spA4, decodedBufPos); } msgCtx->decodedBuffer.schar[decodedBufPos] = 0; @@ -1624,25 +1612,25 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Message_LoadCharNES(play, digits[i] + '0', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, digits[i] + '0', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; } } msgCtx->decodedBuffer.schar[decodedBufPos] = ' '; decodedBufPos++; - Message_LoadCharNES(play, 'h', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'h', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'o', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'o', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'u', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'u', &charTexIndex, &spA4, decodedBufPos); decodedBufPos++; - Message_LoadCharNES(play, 'r', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 'r', &charTexIndex, &spA4, decodedBufPos); if ((digits[0] != 0) || (digits[1] != 1)) { decodedBufPos++; - Message_LoadCharNES(play, 's', &charTexIdx, &spA4, decodedBufPos); + Message_LoadCharNES(play, 's', &charTexIndex, &spA4, decodedBufPos); } } else if (curChar == 0xE8) { - Message_LoadTimeNES(play, curChar, &charTexIdx, &spA4, &decodedBufPos); + Message_LoadTimeNES(play, curChar, &charTexIndex, &spA4, &decodedBufPos); } else if ((curChar == 0xF0) || (curChar == 0xF1) || (curChar == 0xF2) || (curChar == 0xF8)) { if (curChar == 0xF8) { @@ -1679,8 +1667,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1705,8 +1693,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, spA8[i], charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, spA8[i], charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = spA8[i]; decodedBufPos++; } else { @@ -1734,18 +1722,18 @@ void Message_DecodeNES(PlayState* play) { } for (i = 0; i < 4; i++) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; if (i == 1) { - Font_LoadCharNES(play, '"', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, '"', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = '"'; decodedBufPos++; } else if (i == 3) { - Font_LoadCharNES(play, 0x27, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, 0x27, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = 0x27; } } @@ -1773,8 +1761,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1782,26 +1770,26 @@ void Message_DecodeNES(PlayState* play) { } decodedBufPos--; } else if ((curChar == 0xFD) || (curChar == 0xFE) || (curChar == 0xFF)) { + index = curChar - 0xFD; for (playerNameLen = 8; playerNameLen > 0; playerNameLen--) { - if (gSaveContext.save.saveInfo.inventory - .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][playerNameLen - 1] != 0x3E) { + if (((void)0, + gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[index][playerNameLen - 1]) != 0x3E) { break; } } for (i = 0; i < playerNameLen; i++) { - ptr = &font->fontBuf[((void)0, gSaveContext.save.saveInfo.inventory - .dekuPlaygroundPlayerName[(s16)(curChar - 0xFD)][i]) * - FONT_CHAR_TEX_SIZE]; + curChar = ((void)0, gSaveContext.save.saveInfo.inventory.dekuPlaygroundPlayerName[index][i]); msgCtx->decodedBuffer.schar[decodedBufPos + i] = 0xFD; + fontBuf = &font->fontBuf[(curChar & 0xFFFF) * FONT_CHAR_TEX_SIZE]; for (var_v1_3 = 0; var_v1_3 < FONT_CHAR_TEX_SIZE; var_v1_3 += 4) { - font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 0] = ptr[var_v1_3 + 0]; - font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 1] = ptr[var_v1_3 + 1]; - font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 2] = ptr[var_v1_3 + 2]; - font->charBuf[font->unk_11D88][charTexIdx + var_v1_3 + 3] = ptr[var_v1_3 + 3]; + font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 0] = fontBuf[var_v1_3 + 0]; + font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 1] = fontBuf[var_v1_3 + 1]; + font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 2] = fontBuf[var_v1_3 + 2]; + font->charBuf[font->unk_11D88][charTexIndex + var_v1_3 + 3] = fontBuf[var_v1_3 + 3]; } - charTexIdx += FONT_CHAR_TEX_SIZE; + charTexIndex += FONT_CHAR_TEX_SIZE; } decodedBufPos += playerNameLen - 1; spA4 += playerNameLen * (16.0f * msgCtx->textCharScale); @@ -1828,8 +1816,8 @@ void Message_DecodeNES(PlayState* play) { loadChar = true; } if (loadChar) { - Font_LoadCharNES(play, digits[i] + '0', charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, digits[i] + '0', charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; msgCtx->decodedBuffer.schar[decodedBufPos] = digits[i] + '0'; decodedBufPos++; spA4 += 16.0f * msgCtx->textCharScale; @@ -1851,7 +1839,7 @@ void Message_DecodeNES(PlayState* play) { spC6++; spA4 = 0.0f; if (curChar == 0x11) { - spD0++; + numLines++; } } else if ((curChar == 0x17) || (curChar == 0x18) || (curChar == 0x1A)) { // pass @@ -1859,8 +1847,8 @@ void Message_DecodeNES(PlayState* play) { decodedBufPos++; } else if (curChar == 0x1C) { msgCtx->textFade = true; - msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; - msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF; + msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos] & 0xFF; } else if (curChar == 0x1E) { msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; @@ -1868,15 +1856,16 @@ void Message_DecodeNES(PlayState* play) { (msgCtx->textBoxType == TEXTBOX_TYPE_3) || (msgCtx->textBoxType == TEXTBOX_TYPE_6) || (msgCtx->textBoxType == TEXTBOX_TYPE_8) || (msgCtx->textBoxType == TEXTBOX_TYPE_9) || (msgCtx->textBoxType == TEXTBOX_TYPE_B) || (msgCtx->unk11F0C == 3)) { - Audio_PlaySfx((msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8) | - msgCtx->decodedBuffer.schar[decodedBufPos]); + sfxHi = msgCtx->decodedBuffer.schar[decodedBufPos - 1] << 8; + sfxHi |= msgCtx->decodedBuffer.schar[decodedBufPos]; + Audio_PlaySfx(sfxHi); } } else if (curChar == 0x1F) { msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; msgCtx->decodedBuffer.schar[++decodedBufPos] = font->msgBuf.schar[++msgCtx->msgBufPos]; } else if ((curChar != 0x20) && (curChar >= 9)) { - Font_LoadCharNES(play, curChar, charTexIdx); - charTexIdx += FONT_CHAR_TEX_SIZE; + Font_LoadCharNES(play, curChar, charTexIndex); + charTexIndex += FONT_CHAR_TEX_SIZE; spA4 += sNESFontWidths[curChar - ' '] * msgCtx->textCharScale; } else if (curChar == 0x20) { spA4 += 6.0f; @@ -1885,6 +1874,3 @@ void Message_DecodeNES(PlayState* play) { msgCtx->msgBufPos++; } } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_message_nes/Message_DecodeNES.s") -#endif From f2347000b0d91e96ad9477a16b0bb43b48210fbd Mon Sep 17 00:00:00 2001 From: Parker <20159000+jpburnett@users.noreply.github.com> Date: Thu, 9 Nov 2023 14:18:34 -0800 Subject: [PATCH 18/28] Update README with python venv instructions (#1372) This change updates the README to include instructions for setting up a python virtual environment. --- .gitignore | 1 + README.md | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index ee2d1e325..8c5705f18 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,4 @@ docs/doxygen/ # Per-user configuration .python-version .make_options +.*env diff --git a/README.md b/README.md index 89d651dbd..d5f2255fd 100644 --- a/README.md +++ b/README.md @@ -68,12 +68,13 @@ The build process has the following package requirements: * python3 * pip3 * libpng-dev +* python3-venv Under Debian / Ubuntu (which we recommend using), you can install them with the following commands: ```bash sudo apt update -sudo apt install make git build-essential binutils-mips-linux-gnu python3 python3-pip libpng-dev +sudo apt install make git build-essential binutils-mips-linux-gnu python3 python3-pip libpng-dev python3-venv ``` #### 2. Clone the repository @@ -94,12 +95,27 @@ cd mm The build process has a few python packages required that are located in `requirements.txt`. -To install them simply run in a terminal: +It is recommend to setup a virtual environment for python to localize all dependencies. To create a virtual environment: ```bash -python3 -m pip install -r requirements.txt +python3 -m venv .mm-env ``` +To activate or deactivate the virtual environment run either: +```bash +# Activates the mm-env virtual environment +source .mm-env/bin/activate +# Deactivates the active virtual environment +deactivate +``` + +Once activated you can install the required dependencies: +```bash +pip install -r requirements.txt # or python3 -m pip if you want +``` + +**Important:** This virtual environment will need to be activated everytime you enter the repo. + #### 4. Prepare a base ROM Copy your ROM to inside the root of this new project directory, and rename the file of the baserom to reflect the version of ROM you are using. ex: `baserom.mm.us.rev1.z64` From 70637abca9c4c44f7989c76937ab87771ed03804 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Thu, 9 Nov 2023 19:52:32 -0300 Subject: [PATCH 19/28] `ovl_En_An` OK and somewhat documented (#1457) * Init and Destroy * EnAn_Update * EnAn_Draw * the overrides * func_80B54124 * two more * more funcs * SCHEDULE_CALC_TIME_ALT * moar * mor * mas * scriiiipts * mor funcs * almost everythihng * migrate data * func_80B57B48 NON_EQUIVALENT * object symbols * face * fix merge * slots * schedule result enum * func_80B57B48 * format * name some easy to name struct members * stateFlags * object stuff * accessories * text ids * more function naming * more naming * name some anims * trying to make sense out of the schedule * convert schedule to ifs * clean it up * schedule algorithm * many placeholder names * name most of the important schedule values * Add notes to every reamining schedule enum value * dec * HandleSchedule * more naming * name flags * name some of the ProcessSchedule functions * and more naming * a bit of asset naming * some typos * asset naming * more asset naming * printing code * WEEKEVENTREG_COUPLES_MASK_CUTSCENE_* * name the mouths * idk * whoops * format * Name the remaining weekeventregs from anju * name more flags * whoops * a * Incorporate SCHEDULE_TIME * format * fix merge * cleanup * remove debug stuff * clean * WEEKEVENTREG_TALKED_ANJU_IN_LAUNDRY_POOL * whoops * remove some gotos * whoops * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * review * whoops * review * ENAN_GET_8000 * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: Derek Hensley * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: Derek Hensley * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: Isghj <42048411+isghj5@users.noreply.github.com> * review * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: Derek Hensley * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: Isghj <42048411+isghj5@users.noreply.github.com> * fix merge * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * Update src/overlays/actors/ovl_En_An/z_en_an.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * review * review --------- Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> Co-authored-by: Derek Hensley Co-authored-by: Isghj <42048411+isghj5@users.noreply.github.com> --- include/z64save.h | 12 +- spec | 3 +- src/overlays/actors/ovl_En_An/z_en_an.c | 3439 ++++++++++++++++- src/overlays/actors/ovl_En_An/z_en_an.h | 90 +- src/overlays/actors/ovl_En_Door/z_en_door.c | 8 +- src/overlays/actors/ovl_En_Door/z_en_door.h | 4 +- src/overlays/actors/ovl_En_Drs/z_en_drs.c | 3 +- src/overlays/actors/ovl_En_Gm/z_en_gm.c | 4 +- src/overlays/actors/ovl_En_Ig/z_en_ig.c | 4 +- .../actors/ovl_En_Pamera/z_en_pamera.c | 2 +- src/overlays/actors/ovl_En_Pm/z_en_pm.c | 6 +- .../actors/ovl_En_Suttari/z_en_suttari.c | 2 +- src/overlays/actors/ovl_En_Tk/z_en_tk.c | 4 +- tools/disasm/functions.txt | 110 +- tools/disasm/variables.txt | 68 +- tools/weekeventregconvert.py | 6 +- undefined_syms.txt | 9 - 17 files changed, 3572 insertions(+), 202 deletions(-) diff --git a/include/z64save.h b/include/z64save.h index 5fffb73c3..1a43308f9 100644 --- a/include/z64save.h +++ b/include/z64save.h @@ -1018,7 +1018,10 @@ typedef enum { #define WEEKEVENTREG_51_08 PACK_WEEKEVENTREG_FLAG(51, 0x08) #define WEEKEVENTREG_51_10 PACK_WEEKEVENTREG_FLAG(51, 0x10) #define WEEKEVENTREG_ESCAPED_SAKONS_HIDEOUT PACK_WEEKEVENTREG_FLAG(51, 0x20) + +// Set by Kafei #define WEEKEVENTREG_COUPLES_MASK_CUTSCENE_FINISHED PACK_WEEKEVENTREG_FLAG(51, 0x40) + #define WEEKEVENTREG_51_80 PACK_WEEKEVENTREG_FLAG(51, 0x80) // Protected Cremia @@ -1056,7 +1059,7 @@ typedef enum { #define WEEKEVENTREG_TALKED_PART_TIMER_AS_GORON PACK_WEEKEVENTREG_FLAG(55, 0x04) #define WEEKEVENTREG_TALKED_PART_TIMER_AS_ZORA PACK_WEEKEVENTREG_FLAG(55, 0x08) #define WEEKEVENTREG_TALKED_PART_TIMER_AS_DEKU PACK_WEEKEVENTREG_FLAG(55, 0x10) -#define WEEKEVENTREG_55_20 PACK_WEEKEVENTREG_FLAG(55, 0x20) +#define WEEKEVENTREG_TALKED_ANJU_IN_LAUNDRY_POOL PACK_WEEKEVENTREG_FLAG(55, 0x20) #define WEEKEVENTREG_55_40 PACK_WEEKEVENTREG_FLAG(55, 0x40) // Gyorg has been defeated @@ -1354,13 +1357,16 @@ typedef enum { #define WEEKEVENTREG_86_01 PACK_WEEKEVENTREG_FLAG(86, 0x01) #define WEEKEVENTREG_86_02 PACK_WEEKEVENTREG_FLAG(86, 0x02) #define WEEKEVENTREG_86_04 PACK_WEEKEVENTREG_FLAG(86, 0x04) -#define WEEKEVENTREG_86_08 PACK_WEEKEVENTREG_FLAG(86, 0x08) +#define WEEKEVENTREG_LISTENED_ANJU_POSTMAN_CONVERSATION PACK_WEEKEVENTREG_FLAG(86, 0x08) #define WEEKEVENTREG_86_10 PACK_WEEKEVENTREG_FLAG(86, 0x10) #define WEEKEVENTREG_86_20 PACK_WEEKEVENTREG_FLAG(86, 0x20) #define WEEKEVENTREG_86_40 PACK_WEEKEVENTREG_FLAG(86, 0x40) #define WEEKEVENTREG_86_80 PACK_WEEKEVENTREG_FLAG(86, 0x80) #define WEEKEVENTREG_87_01 PACK_WEEKEVENTREG_FLAG(87, 0x01) -#define WEEKEVENTREG_87_02 PACK_WEEKEVENTREG_FLAG(87, 0x02) + +// Set by Anju +#define WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED PACK_WEEKEVENTREG_FLAG(87, 0x02) + #define WEEKEVENTREG_87_04 PACK_WEEKEVENTREG_FLAG(87, 0x04) #define WEEKEVENTREG_87_08 PACK_WEEKEVENTREG_FLAG(87, 0x08) #define WEEKEVENTREG_87_10 PACK_WEEKEVENTREG_FLAG(87, 0x10) diff --git a/spec b/spec index 705786d9b..9a2a66908 100644 --- a/spec +++ b/spec @@ -3752,8 +3752,7 @@ beginseg name "ovl_En_An" compress include "build/src/overlays/actors/ovl_En_An/z_en_an.o" - include "build/data/ovl_En_An/ovl_En_An.data.o" - include "build/data/ovl_En_An/ovl_En_An.reloc.o" + include "build/src/overlays/actors/ovl_En_An/ovl_En_An_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_An/z_en_an.c b/src/overlays/actors/ovl_En_An/z_en_an.c index 58738d22e..f53fd37a2 100644 --- a/src/overlays/actors/ovl_En_An/z_en_an.c +++ b/src/overlays/actors/ovl_En_An/z_en_an.c @@ -5,6 +5,13 @@ */ #include "z_en_an.h" +#include "overlays/actors/ovl_En_Door/z_en_door.h" + +#include "assets/objects/object_an2/object_an2.h" +#include "assets/objects/object_an3/object_an3.h" +#include "assets/objects/object_an4/object_an4.h" +#include "assets/objects/object_mask_kerfay/object_mask_kerfay.h" +#include "assets/objects/object_msmo/object_msmo.h" #define FLAGS (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20) @@ -13,12 +20,746 @@ void EnAn_Init(Actor* thisx, PlayState* play); void EnAn_Destroy(Actor* thisx, PlayState* play); void EnAn_Update(Actor* thisx, PlayState* play); +void EnAn_Draw(Actor* thisx, PlayState* play); -void func_80B577F0(EnAn* this, PlayState* play); -void func_80B578F8(EnAn* this, PlayState* play); -void func_80B57A44(EnAn* this, PlayState* play); +// Action funcs +void EnAn_FinishInit(EnAn* this, PlayState* play); +void EnAn_FollowSchedule(EnAn* this, PlayState* play); +void EnAn_Talk(EnAn* this, PlayState* play); + +typedef enum AnjuScheduleResult { + /* 0 */ ANJU_SCH_NONE, + // Waiting for Kafei on the night of Day 3 + /* 1 */ ANJU_SCH_WAITING_FOR_KAFEI, + // unused + /* 2 */ ANJU_SCH_2, + // Day 2, 13:45 ~ 15:25, No midnight meeting. Sit on the Laundry Pool under the rain + /* 3 */ ANJU_SCH_LAUNDRY_POOL_SIT, + // unused + /* 4 */ ANJU_SCH_4, + // unused + /* 5 */ ANJU_SCH_5, + // unused + /* 6 */ ANJU_SCH_6, + // unused + /* 7 */ ANJU_SCH_7, + // unused + /* 8 */ ANJU_SCH_8, + // unused + /* 9 */ ANJU_SCH_9, + // unused + /* 10 */ ANJU_SCH_10, + // unused + /* 11 */ ANJU_SCH_11, + // Day 3, Night, if not delivered the Pendant of Memories + /* 12 */ ANJU_SCH_RANCH, + // unused + /* 13 */ ANJU_SCH_13, + // Cooking lunch for Granny at 11:10 ~ 11:30 on Day 1 and Day 2 (if did had the Midnight meeting) + /* 14 */ ANJU_SCH_COOKING, + // unused + /* 15 */ ANJU_SCH_15, + // Day 1, 14:08 ~ 14:18. Receive Kafei's letter from Postman + /* 16 */ ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN, + // Day 1, 16:10 ~ 16:30. Attends the goron named after the player + /* 17 */ ANJU_SCH_ATTEND_GORON, + // Just standing on the front desk of the Inn + /* 18 */ ANJU_SCH_RECEPTIONIST_IDLE, + // Standing next to the Inn's front door at closing time + /* 19 */ ANJU_SCH_WAITING_CLOSING_TIME, + // unused + /* 20 */ ANJU_SCH_20, + // 12:00 ~ 12:15, Day 1 and Day 2 (if did had the Midnight meeting). Give lunch to Granny + /* 21 */ ANJU_SCH_GIVE_LUNCH_TO_GRANNY, + // Day 3, 06:00 ~ 11:00. Sweeping the Suite room. TODO: maybe rename to "cleaning Suite room"? + /* 22 */ ANJU_SCH_SWEEPING, + // Day 1, 00:00 ~ 06:00. Waiting for player at the kitchen to have the Midnight meeting. + /* 23 */ ANJU_SCH_MIDNIGHT_MEETING, + // Day 2, 21:30 ~ 23:00. On the staff room talking with her mom. This can be seen from the Knife Chamber + /* 24 */ ANJU_SCH_TALKING_WITH_MOM, + // Reunited with Kafei on the Staff room. Set manually in code instead of via script + /* 25 */ ANJU_SCH_WITH_KAFEI, + // Passing through to Granny's door (entering) + /* 26 */ ANJU_SCH_DOOR_26, + // Passing through to Granny's door (leaving) + /* 27 */ ANJU_SCH_DOOR_27, + // Passing through the door of the staff room (entering), after giving Granny's lunch + /* 28 */ ANJU_SCH_DOOR_28, + // Passing through the door of the staff room (leaving), after giving Granny's lunch + /* 29 */ ANJU_SCH_DOOR_29, + // Passing through the door of the staff room (entering), after closing the Inn + /* 30 */ ANJU_SCH_DOOR_30, + // Passing through the door of the staff room (leaving), to have the midnight meeting + /* 31 */ ANJU_SCH_DOOR_31, + // Passing through the door of the staff room (leaving), going to the Laundry Pool + /* 32 */ ANJU_SCH_DOOR_32, + // Passing through the Inn's front door (leaving) (inside the Inn), going to the Laundry Pool + /* 33 */ ANJU_SCH_DOOR_33, + // Passing through the Inn's front door (entering) (inside the Inn), going from the Laundry Pool + /* 34 */ ANJU_SCH_DOOR_34, + // Passing through the door of the staff room (entering), after going to the Laundry Pool + /* 35 */ ANJU_SCH_DOOR_35, + // Passing through the door of the Large Suite (leaving), after sweeping the floor + /* 36 */ ANJU_SCH_DOOR_36, + // Passing through the Inn's front door (leaving) (East Clock Town), going to the Laundry Pool + /* 37 */ ANJU_SCH_DOOR_37, + // Passing through the Inn's front door (entering) (East Clock Town), going from the Laundry Pool + /* 38 */ ANJU_SCH_DOOR_38, + // Passing through the door of the staff room (entering), after sweeping the floor + /* 39 */ ANJU_SCH_DOOR_39, + // Going from the front desk to the kitchen + /* 40 */ ANJU_SCH_WALKING_40, + // unused + /* 41 */ ANJU_SCH_41, + // Walking from the kitchen to Granny's room + /* 42 */ ANJU_SCH_WALKING_42, + // Inside Granny's room, walking to give her her food + /* 43 */ ANJU_SCH_WALKING_43, + // Inside Granny's room, walking out + /* 44 */ ANJU_SCH_WALKING_44, + // Left Granny's room, walking towards staff room + /* 45 */ ANJU_SCH_WALKING_45, + // Left staff room, walking to front desk + /* 46 */ ANJU_SCH_WALKING_46, + // Walking from the front desk to right next to the Inn's front door + /* 47 */ ANJU_SCH_WALKING_47, + // Walking from the Inn's front door after closing, to the staff room + /* 48 */ ANJU_SCH_WALKING_48, + // Walking from the staff room to the kitchen, to have the midnight meeting + /* 49 */ ANJU_SCH_WALKING_49, + // Walking from the staff room to Inn's front door, to go to the Laundry Pool + /* 50 */ ANJU_SCH_WALKING_50, + // Walking from the Inn's front door to the staff room, after going to the Laundry Pool + /* 51 */ ANJU_SCH_WALKING_51, + // Day 3, 11:00 ~ 11:25, Stopped sweeping, walking out of the room + /* 52 */ ANJU_SCH_WALKING_52, + // Day 3, 11:00 ~ 11:25, Walking through the hallway after sweeping + /* 53 */ ANJU_SCH_WALKING_53, + // Walking through East Clock Town, going to the Laundry Pool + /* 54 */ ANJU_SCH_WALKING_54, + // Walking through South Clock Town, East Clock Town perspective, going to the Laundry Pool + /* 55 */ ANJU_SCH_WALKING_55, + // Walking through Laundry Pool, entering + /* 56 */ ANJU_SCH_WALKING_56, + // Walking through Laundry Pool, leaving + /* 57 */ ANJU_SCH_WALKING_57, + // Walking through South Clock Town, East Clock Town perspective, going to the Inn from the Laundry Pool + /* 58 */ ANJU_SCH_WALKING_58, + // Walking through East Clock Town, going to the Inn from the Laundry Pool + /* 59 */ ANJU_SCH_WALKING_59, + // Walking through East Clock Town, South Clock Town perspective, going to the Laundry Pool + /* 60 */ ANJU_SCH_WALKING_60, + // Walking through South Clock Town, going to the Laundry Pool + /* 61 */ ANJU_SCH_WALKING_61, + // Walking through South Clock Town, going to the Inn from the Laundry Pool + /* 62 */ ANJU_SCH_WALKING_62, + // Walking through East Clock Town, South Clock Town perspective, going to the Inn from the Laundry Pool + /* 63 */ ANJU_SCH_WALKING_63, + /* 64 */ ANJU_SCH_MAX +} AnjuScheduleResult; + +static u8 sScheduleScript[] = { + /* 0x000 */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_L(1, 0x151 - 0x005), + /* 0x005 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_L(SCENE_YADOYA, 0x150 - 0x00A), + /* 0x00A */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(6, 0, 10, 55, 0x14A - 0x011), + /* 0x011 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(10, 55, 11, 10, 0x144 - 0x018), + /* 0x018 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 10, 11, 30, 0x13E - 0x01F), + /* 0x01F */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 30, 11, 50, 0x138 - 0x026), + /* 0x026 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 50, 11, 55, 0x132 - 0x02D), + /* 0x02D */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 55, 12, 0, 0x12C - 0x034), + /* 0x034 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 0, 12, 15, 0x126 - 0x03B), + /* 0x03B */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 15, 12, 20, 0x120 - 0x042), + /* 0x042 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 20, 12, 25, 0x11A - 0x049), + /* 0x049 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 25, 12, 55, 0x114 - 0x050), + /* 0x050 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 55, 13, 0, 0x10E - 0x057), + /* 0x057 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(13, 15, 13, 20, 0x108 - 0x05E), + /* 0x05E */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(13, 20, 13, 50, 0x102 - 0x065), + /* 0x065 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(13, 50, 14, 8, 0x0FC - 0x06C), + /* 0x06C */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(14, 8, 14, 18, 0x0F6 - 0x073), + /* 0x073 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(14, 18, 16, 10, 0x0F0 - 0x079), + /* 0x079 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 10, 16, 30, 0x0EA - 0x07F), + /* 0x07F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 30, 19, 50, 0x0E4 - 0x085), + /* 0x085 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(19, 50, 20, 20, 0x0DE - 0x08B), + /* 0x08B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(20, 20, 20, 30, 0x0D8 - 0x091), + /* 0x091 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(20, 30, 21, 5, 0x0D2 - 0x097), + /* 0x097 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 5, 21, 10, 0x0CC - 0x09D), + /* 0x09D */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING, 0x0A2 - 0x0A1), + /* 0x0A1 */ SCHEDULE_CMD_RET_NONE(), + /* 0x0A2 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(23, 10, 23, 15, 0x0C6 - 0x0A8), + /* 0x0A8 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(23, 15, 0, 0, 0x0C0 - 0x0AE), + /* 0x0AE */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(0, 0, 6, 0, 0x0B5 - 0x0B4), + /* 0x0B4 */ SCHEDULE_CMD_RET_NONE(), + /* 0x0B5 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x0BF - 0x0B9), + /* 0x0B9 */ SCHEDULE_CMD_RET_TIME(0, 0, 6, 0, ANJU_SCH_MIDNIGHT_MEETING), + /* 0x0BF */ SCHEDULE_CMD_RET_NONE(), + /* 0x0C0 */ SCHEDULE_CMD_RET_TIME(23, 15, 0, 0, ANJU_SCH_WALKING_49), + /* 0x0C6 */ SCHEDULE_CMD_RET_TIME(23, 10, 23, 15, ANJU_SCH_DOOR_31), + /* 0x0CC */ SCHEDULE_CMD_RET_TIME(21, 5, 21, 10, ANJU_SCH_DOOR_30), + /* 0x0D2 */ SCHEDULE_CMD_RET_TIME(20, 30, 21, 5, ANJU_SCH_WALKING_48), + /* 0x0D8 */ SCHEDULE_CMD_RET_TIME(20, 20, 20, 30, ANJU_SCH_WAITING_CLOSING_TIME), + /* 0x0DE */ SCHEDULE_CMD_RET_TIME(19, 50, 20, 20, ANJU_SCH_WALKING_47), + /* 0x0E4 */ SCHEDULE_CMD_RET_TIME(16, 30, 19, 50, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x0EA */ SCHEDULE_CMD_RET_TIME(16, 10, 16, 30, ANJU_SCH_ATTEND_GORON), + /* 0x0F0 */ SCHEDULE_CMD_RET_TIME(14, 18, 16, 10, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x0F6 */ SCHEDULE_CMD_RET_TIME(14, 8, 14, 18, ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN), + /* 0x0FC */ SCHEDULE_CMD_RET_TIME(13, 50, 14, 8, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x102 */ SCHEDULE_CMD_RET_TIME(13, 20, 13, 50, ANJU_SCH_WALKING_46), + /* 0x108 */ SCHEDULE_CMD_RET_TIME(13, 15, 13, 20, ANJU_SCH_DOOR_29), + /* 0x10E */ SCHEDULE_CMD_RET_TIME(12, 55, 13, 0, ANJU_SCH_DOOR_28), + /* 0x114 */ SCHEDULE_CMD_RET_TIME(12, 25, 12, 55, ANJU_SCH_WALKING_45), + /* 0x11A */ SCHEDULE_CMD_RET_TIME(12, 20, 12, 25, ANJU_SCH_DOOR_27), + /* 0x120 */ SCHEDULE_CMD_RET_TIME(12, 15, 12, 20, ANJU_SCH_WALKING_44), + /* 0x126 */ SCHEDULE_CMD_RET_TIME(12, 0, 12, 15, ANJU_SCH_GIVE_LUNCH_TO_GRANNY), + /* 0x12C */ SCHEDULE_CMD_RET_TIME(11, 55, 12, 0, ANJU_SCH_WALKING_43), + /* 0x132 */ SCHEDULE_CMD_RET_TIME(11, 50, 11, 55, ANJU_SCH_DOOR_26), + /* 0x138 */ SCHEDULE_CMD_RET_TIME(11, 30, 11, 50, ANJU_SCH_WALKING_42), + /* 0x13E */ SCHEDULE_CMD_RET_TIME(11, 10, 11, 30, ANJU_SCH_COOKING), + /* 0x144 */ SCHEDULE_CMD_RET_TIME(10, 55, 11, 10, ANJU_SCH_WALKING_40), + /* 0x14A */ SCHEDULE_CMD_RET_TIME(6, 0, 10, 55, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x150 */ SCHEDULE_CMD_RET_NONE(), + /* 0x151 */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_L(2, 0x391 - 0x156), + /* 0x156 */ SCHEDULE_CMD_CHECK_FLAG_L(WEEKEVENTREG_HAD_MIDNIGHT_MEETING, 0x29E - 0x15B), + /* 0x15B */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_L(SCENE_YADOYA, 0x1F2 - 0x160), + /* 0x160 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 3, 11, 9, 0x1EC - 0x167), + /* 0x167 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 9, 11, 29, 0x1E6 - 0x16D), + /* 0x16D */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 29, 11, 39, 0x1E0 - 0x173), + /* 0x173 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(17, 24, 17, 30, 0x1DA - 0x179), + /* 0x179 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(17, 30, 17, 55, 0x1D4 - 0x17F), + /* 0x17F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(17, 55, 18, 0, 0x1CE - 0x185), + /* 0x185 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(18, 0, 19, 50, 0x1C8 - 0x18B), + /* 0x18B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(19, 50, 20, 20, 0x1C2 - 0x191), + /* 0x191 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(20, 20, 20, 30, 0x1BC - 0x197), + /* 0x197 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(20, 30, 21, 0, 0x1B6 - 0x19D), + /* 0x19D */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 0, 21, 5, 0x1B0 - 0x1A3), + /* 0x1A3 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 30, 23, 0, 0x1AA - 0x1A9), + /* 0x1A9 */ SCHEDULE_CMD_RET_NONE(), + /* 0x1AA */ SCHEDULE_CMD_RET_TIME(21, 30, 23, 0, ANJU_SCH_TALKING_WITH_MOM), + /* 0x1B0 */ SCHEDULE_CMD_RET_TIME(21, 0, 21, 5, ANJU_SCH_DOOR_30), + /* 0x1B6 */ SCHEDULE_CMD_RET_TIME(20, 30, 21, 0, ANJU_SCH_WALKING_48), + /* 0x1BC */ SCHEDULE_CMD_RET_TIME(20, 20, 20, 30, ANJU_SCH_WAITING_CLOSING_TIME), + /* 0x1C2 */ SCHEDULE_CMD_RET_TIME(19, 50, 20, 20, ANJU_SCH_WALKING_47), + /* 0x1C8 */ SCHEDULE_CMD_RET_TIME(18, 0, 19, 50, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x1CE */ SCHEDULE_CMD_RET_TIME(17, 55, 18, 0, ANJU_SCH_DOOR_35), + /* 0x1D4 */ SCHEDULE_CMD_RET_TIME(17, 30, 17, 55, ANJU_SCH_WALKING_51), + /* 0x1DA */ SCHEDULE_CMD_RET_TIME(17, 24, 17, 30, ANJU_SCH_DOOR_34), + /* 0x1E0 */ SCHEDULE_CMD_RET_TIME(11, 29, 11, 39, ANJU_SCH_DOOR_33), + /* 0x1E6 */ SCHEDULE_CMD_RET_TIME(11, 9, 11, 29, ANJU_SCH_WALKING_50), + /* 0x1EC */ SCHEDULE_CMD_RET_TIME(11, 3, 11, 9, ANJU_SCH_DOOR_32), + /* 0x1F2 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_TOWN, 0x23F - 0x1F6), + /* 0x1F6 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 29, 11, 39, 0x239 - 0x1FC), + /* 0x1FC */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 39, 12, 25, 0x233 - 0x202), + /* 0x202 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(12, 25, 13, 15, 0x22D - 0x208), + /* 0x208 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 55, 16, 45, 0x227 - 0x20E), + /* 0x20E */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 45, 17, 24, 0x221 - 0x214), + /* 0x214 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(17, 24, 17, 30, 0x21B - 0x21A), + /* 0x21A */ SCHEDULE_CMD_RET_NONE(), + /* 0x21B */ SCHEDULE_CMD_RET_TIME(17, 24, 17, 30, ANJU_SCH_DOOR_38), + /* 0x221 */ SCHEDULE_CMD_RET_TIME(16, 45, 17, 24, ANJU_SCH_WALKING_59), + /* 0x227 */ SCHEDULE_CMD_RET_TIME(15, 55, 16, 45, ANJU_SCH_WALKING_58), + /* 0x22D */ SCHEDULE_CMD_RET_TIME(12, 25, 13, 15, ANJU_SCH_WALKING_55), + /* 0x233 */ SCHEDULE_CMD_RET_TIME(11, 39, 12, 25, ANJU_SCH_WALKING_54), + /* 0x239 */ SCHEDULE_CMD_RET_TIME(11, 29, 11, 39, ANJU_SCH_DOOR_37), + /* 0x23F */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_CLOCKTOWER, 0x274 - 0x243), + /* 0x243 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 39, 12, 25, 0x26E - 0x249), + /* 0x249 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(12, 25, 13, 15, 0x268 - 0x24F), + /* 0x24F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 55, 16, 45, 0x262 - 0x255), + /* 0x255 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(16, 45, 17, 24, 0x25C - 0x25B), + /* 0x25B */ SCHEDULE_CMD_RET_NONE(), + /* 0x25C */ SCHEDULE_CMD_RET_TIME(16, 45, 17, 24, ANJU_SCH_WALKING_63), + /* 0x262 */ SCHEDULE_CMD_RET_TIME(15, 55, 16, 45, ANJU_SCH_WALKING_62), + /* 0x268 */ SCHEDULE_CMD_RET_TIME(12, 25, 13, 15, ANJU_SCH_WALKING_61), + /* 0x26E */ SCHEDULE_CMD_RET_TIME(11, 39, 12, 25, ANJU_SCH_WALKING_60), + /* 0x274 */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_ALLEY, 0x29D - 0x278), + /* 0x278 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(13, 15, 13, 45, 0x297 - 0x27E), + /* 0x27E */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(13, 45, 15, 25, 0x291 - 0x284), + /* 0x284 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(15, 25, 15, 55, 0x28B - 0x28A), + /* 0x28A */ SCHEDULE_CMD_RET_NONE(), + /* 0x28B */ SCHEDULE_CMD_RET_TIME(15, 25, 15, 55, ANJU_SCH_WALKING_57), + /* 0x291 */ SCHEDULE_CMD_RET_TIME(13, 45, 15, 25, ANJU_SCH_LAUNDRY_POOL_SIT), + /* 0x297 */ SCHEDULE_CMD_RET_TIME(13, 15, 13, 45, ANJU_SCH_WALKING_56), + /* 0x29D */ SCHEDULE_CMD_RET_NONE(), + /* 0x29E */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_L(SCENE_YADOYA, 0x390 - 0x2A3), + /* 0x2A3 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(6, 0, 10, 55, 0x38A - 0x2AA), + /* 0x2AA */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(10, 55, 11, 10, 0x384 - 0x2B1), + /* 0x2B1 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 10, 11, 30, 0x37E - 0x2B8), + /* 0x2B8 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 30, 11, 50, 0x378 - 0x2BF), + /* 0x2BF */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 50, 11, 55, 0x372 - 0x2C6), + /* 0x2C6 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(11, 55, 12, 0, 0x36C - 0x2CD), + /* 0x2CD */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 0, 12, 15, 0x366 - 0x2D4), + /* 0x2D4 */ SCHEDULE_CMD_CHECK_TIME_RANGE_L(12, 15, 12, 20, 0x360 - 0x2DB), + /* 0x2DB */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(12, 20, 12, 25, 0x35A - 0x2E1), + /* 0x2E1 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(12, 25, 12, 55, 0x354 - 0x2E7), + /* 0x2E7 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(12, 55, 13, 0, 0x34E - 0x2ED), + /* 0x2ED */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(13, 15, 13, 20, 0x348 - 0x2F3), + /* 0x2F3 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(13, 20, 13, 50, 0x342 - 0x2F9), + /* 0x2F9 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(13, 50, 19, 50, 0x33C - 0x2FF), + /* 0x2FF */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(19, 50, 20, 20, 0x336 - 0x305), + /* 0x305 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(20, 20, 20, 30, 0x330 - 0x30B), + /* 0x30B */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(20, 30, 21, 5, 0x32A - 0x311), + /* 0x311 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 5, 21, 10, 0x324 - 0x317), + /* 0x317 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(21, 30, 23, 0, 0x31E - 0x31D), + /* 0x31D */ SCHEDULE_CMD_RET_NONE(), + /* 0x31E */ SCHEDULE_CMD_RET_TIME(21, 30, 23, 0, ANJU_SCH_TALKING_WITH_MOM), + /* 0x324 */ SCHEDULE_CMD_RET_TIME(21, 5, 21, 10, ANJU_SCH_DOOR_30), + /* 0x32A */ SCHEDULE_CMD_RET_TIME(20, 30, 21, 5, ANJU_SCH_WALKING_48), + /* 0x330 */ SCHEDULE_CMD_RET_TIME(20, 20, 20, 30, ANJU_SCH_WAITING_CLOSING_TIME), + /* 0x336 */ SCHEDULE_CMD_RET_TIME(19, 50, 20, 20, ANJU_SCH_WALKING_47), + /* 0x33C */ SCHEDULE_CMD_RET_TIME(13, 50, 19, 50, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x342 */ SCHEDULE_CMD_RET_TIME(13, 20, 13, 50, ANJU_SCH_WALKING_46), + /* 0x348 */ SCHEDULE_CMD_RET_TIME(13, 15, 13, 20, ANJU_SCH_DOOR_29), + /* 0x34E */ SCHEDULE_CMD_RET_TIME(12, 55, 13, 0, ANJU_SCH_DOOR_28), + /* 0x354 */ SCHEDULE_CMD_RET_TIME(12, 25, 12, 55, ANJU_SCH_WALKING_45), + /* 0x35A */ SCHEDULE_CMD_RET_TIME(12, 20, 12, 25, ANJU_SCH_DOOR_27), + /* 0x360 */ SCHEDULE_CMD_RET_TIME(12, 15, 12, 20, ANJU_SCH_WALKING_44), + /* 0x366 */ SCHEDULE_CMD_RET_TIME(12, 0, 12, 15, ANJU_SCH_GIVE_LUNCH_TO_GRANNY), + /* 0x36C */ SCHEDULE_CMD_RET_TIME(11, 55, 12, 0, ANJU_SCH_WALKING_43), + /* 0x372 */ SCHEDULE_CMD_RET_TIME(11, 50, 11, 55, ANJU_SCH_DOOR_26), + /* 0x378 */ SCHEDULE_CMD_RET_TIME(11, 30, 11, 50, ANJU_SCH_WALKING_42), + /* 0x37E */ SCHEDULE_CMD_RET_TIME(11, 10, 11, 30, ANJU_SCH_COOKING), + /* 0x384 */ SCHEDULE_CMD_RET_TIME(10, 55, 11, 10, ANJU_SCH_WALKING_40), + /* 0x38A */ SCHEDULE_CMD_RET_TIME(6, 0, 10, 55, ANJU_SCH_RECEPTIONIST_IDLE), + /* 0x390 */ SCHEDULE_CMD_RET_NONE(), + /* 0x391 */ SCHEDULE_CMD_CHECK_NOT_IN_DAY_L(3, 0x447 - 0x396), + /* 0x396 */ SCHEDULE_CMD_CHECK_FLAG_S(WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES, 0x3ED - 0x39A), + /* 0x39A */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_YADOYA, 0x3DB - 0x39E), + /* 0x39E */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(6, 0, 11, 0, 0x3D5 - 0x3A4), + /* 0x3A4 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 0, 11, 25, 0x3CF - 0x3AA), + /* 0x3AA */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 25, 11, 30, 0x3C9 - 0x3B0), + /* 0x3B0 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 30, 11, 50, 0x3C3 - 0x3B6), + /* 0x3B6 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 50, 12, 0, 0x3BD - 0x3BC), + /* 0x3BC */ SCHEDULE_CMD_RET_NONE(), + /* 0x3BD */ SCHEDULE_CMD_RET_TIME(11, 50, 12, 0, ANJU_SCH_DOOR_39), + /* 0x3C3 */ SCHEDULE_CMD_RET_TIME(11, 30, 11, 50, ANJU_SCH_WALKING_53), + /* 0x3C9 */ SCHEDULE_CMD_RET_TIME(11, 25, 11, 30, ANJU_SCH_DOOR_36), + /* 0x3CF */ SCHEDULE_CMD_RET_TIME(11, 0, 11, 25, ANJU_SCH_WALKING_52), + /* 0x3D5 */ SCHEDULE_CMD_RET_TIME(6, 0, 11, 0, ANJU_SCH_SWEEPING), + /* 0x3DB */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_OMOYA, 0x3EC - 0x3DF), + /* 0x3DF */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(18, 0, 6, 0, 0x3E6 - 0x3E5), + /* 0x3E5 */ SCHEDULE_CMD_RET_NONE(), + /* 0x3E6 */ SCHEDULE_CMD_RET_TIME(18, 0, 6, 0, ANJU_SCH_RANCH), + /* 0x3EC */ SCHEDULE_CMD_RET_NONE(), + /* 0x3ED */ SCHEDULE_CMD_CHECK_NOT_IN_SCENE_S(SCENE_YADOYA, 0x446 - 0x3F1), + /* 0x3F1 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(6, 0, 11, 0, 0x440 - 0x3F7), + /* 0x3F7 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 0, 11, 25, 0x43A - 0x3FD), + /* 0x3FD */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 25, 11, 30, 0x434 - 0x403), + /* 0x403 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 30, 11, 50, 0x42E - 0x409), + /* 0x409 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(11, 50, 12, 0, 0x428 - 0x40F), + /* 0x40F */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(18, 0, 5, 0, 0x422 - 0x415), + /* 0x415 */ SCHEDULE_CMD_CHECK_TIME_RANGE_S(5, 0, 6, 0, 0x41C - 0x41B), + /* 0x41B */ SCHEDULE_CMD_RET_NONE(), + /* 0x41C */ SCHEDULE_CMD_RET_TIME(5, 0, 6, 0, ANJU_SCH_WAITING_FOR_KAFEI), + /* 0x422 */ SCHEDULE_CMD_RET_TIME(18, 0, 5, 0, ANJU_SCH_WAITING_FOR_KAFEI), + /* 0x428 */ SCHEDULE_CMD_RET_TIME(11, 50, 12, 0, ANJU_SCH_DOOR_39), + /* 0x42E */ SCHEDULE_CMD_RET_TIME(11, 30, 11, 50, ANJU_SCH_WALKING_53), + /* 0x434 */ SCHEDULE_CMD_RET_TIME(11, 25, 11, 30, ANJU_SCH_DOOR_36), + /* 0x43A */ SCHEDULE_CMD_RET_TIME(11, 0, 11, 25, ANJU_SCH_WALKING_52), + /* 0x440 */ SCHEDULE_CMD_RET_TIME(6, 0, 11, 0, ANJU_SCH_SWEEPING), + /* 0x446 */ SCHEDULE_CMD_RET_NONE(), + /* 0x447 */ SCHEDULE_CMD_RET_NONE(), +}; + +/** + * The schedule script is roughly equivalent to the following pseudo-code: + +s32 scheduleScript(PlayState* play) { + if (gSaveContext.save.day == 1) { + if (play->sceneId == SCENE_YADOYA) { + if ((6, 0) <= NOW <= (10, 55)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((10, 55) <= NOW <= (11, 10)) { + return ANJU_SCH_WALKING_40; + } else if ((11, 10) <= NOW <= (11, 30)) { + return ANJU_SCH_COOKING; + } else if ((11, 30) <= NOW <= (11, 50)) { + return ANJU_SCH_WALKING_42; + } else if ((11, 50) <= NOW <= (11, 55)) { + return ANJU_SCH_DOOR_26; + } else if ((11, 55) <= NOW <= (12, 0)) { + return ANJU_SCH_WALKING_43; + } else if ((12, 0) <= NOW <= (12, 15)) { + return ANJU_SCH_GIVE_LUNCH_TO_GRANNY; + } else if ((12, 15) <= NOW <= (12, 20)) { + return ANJU_SCH_WALKING_44; + } else if ((12, 20) <= NOW <= (12, 25)) { + return ANJU_SCH_DOOR_27; + } else if ((12, 25) <= NOW <= (12, 55)) { + return ANJU_SCH_WALKING_45; + } else if ((12, 55) <= NOW <= (13, 0)) { + return ANJU_SCH_DOOR_28; + } else if ((13, 15) <= NOW <= (13, 20)) { + return ANJU_SCH_DOOR_29; + } else if ((13, 20) <= NOW <= (13, 50)) { + return ANJU_SCH_WALKING_46; + } else if ((13, 50) <= NOW <= (14, 8)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((14, 8) <= NOW <= (14, 18)) { + return ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN; + } else if ((14, 18) <= NOW <= (16, 10)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((16, 10) <= NOW <= (16, 30)) { + return ANJU_SCH_ATTEND_GORON; + } else if ((16, 30) <= NOW <= (19, 50)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((19, 50) <= NOW <= (20, 20)) { + return ANJU_SCH_WALKING_47; + } else if ((20, 20) <= NOW <= (20, 30)) { + return ANJU_SCH_WAITING_CLOSING_TIME; + } else if ((20, 30) <= NOW <= (21, 5)) { + return ANJU_SCH_WALKING_48; + } else if ((21, 5) <= NOW <= (21, 10)) { + return ANJU_SCH_DOOR_30; + } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING)) { + if ((23, 10) <= NOW <= (23, 15)) { + return ANJU_SCH_DOOR_31; + } else if ((23, 15) <= NOW <= (0, 0)) { + return ANJU_SCH_WALKING_49; + } else if ((0, 0) <= NOW <= (6, 0)) { + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_HAD_MIDNIGHT_MEETING)) { + return None; + } + return ANJU_SCH_MIDNIGHT_MEETING; + } else { + return None; + } + } else { + return None; + } + } else { + return None; + } + } else if (gSaveContext.save.day == 2) { + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_HAD_MIDNIGHT_MEETING)) { + if (play->sceneId == SCENE_YADOYA) { + if ((6, 0) <= NOW <= (10, 55)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((10, 55) <= NOW <= (11, 10)) { + return ANJU_SCH_WALKING_40; + } else if ((11, 10) <= NOW <= (11, 30)) { + return ANJU_SCH_COOKING; + } else if ((11, 30) <= NOW <= (11, 50)) { + return ANJU_SCH_WALKING_42; + } else if ((11, 50) <= NOW <= (11, 55)) { + return ANJU_SCH_DOOR_26; + } else if ((11, 55) <= NOW <= (12, 0)) { + return ANJU_SCH_WALKING_43; + } else if ((12, 0) <= NOW <= (12, 15)) { + return ANJU_SCH_GIVE_LUNCH_TO_GRANNY; + } else if ((12, 15) <= NOW <= (12, 20)) { + return ANJU_SCH_WALKING_44; + } else if ((12, 20) <= NOW <= (12, 25)) { + return ANJU_SCH_DOOR_27; + } else if ((12, 25) <= NOW <= (12, 55)) { + return ANJU_SCH_WALKING_45; + } else if ((12, 55) <= NOW <= (13, 0)) { + return ANJU_SCH_DOOR_28; + } else if ((13, 15) <= NOW <= (13, 20)) { + return ANJU_SCH_DOOR_29; + } else if ((13, 20) <= NOW <= (13, 50)) { + return ANJU_SCH_WALKING_46; + } else if ((13, 50) <= NOW <= (19, 50)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((19, 50) <= NOW <= (20, 20)) { + return ANJU_SCH_WALKING_47; + } else if ((20, 20) <= NOW <= (20, 30)) { + return ANJU_SCH_WAITING_CLOSING_TIME; + } else if ((20, 30) <= NOW <= (21, 5)) { + return ANJU_SCH_WALKING_48; + } else if ((21, 5) <= NOW <= (21, 10)) { + return ANJU_SCH_DOOR_30; + } else if ((21, 30) <= NOW <= (23, 0)) { + return ANJU_SCH_TALKING_WITH_MOM; + } else { + return None; + } + } else { + return None; + } + } else if (play->sceneId == SCENE_YADOYA) { + if ((11, 3) <= NOW <= (11, 9)) { + return ANJU_SCH_DOOR_32; + } else if ((11, 9) <= NOW <= (11, 29)) { + return ANJU_SCH_WALKING_50; + } else if ((11, 29) <= NOW <= (11, 39)) { + return ANJU_SCH_DOOR_33; + } else if ((17, 24) <= NOW <= (17, 30)) { + return ANJU_SCH_DOOR_34; + } else if ((17, 30) <= NOW <= (17, 55)) { + return ANJU_SCH_WALKING_51; + } else if ((17, 55) <= NOW <= (18, 0)) { + return ANJU_SCH_DOOR_35; + } else if ((18, 0) <= NOW <= (19, 50)) { + return ANJU_SCH_RECEPTIONIST_IDLE; + } else if ((19, 50) <= NOW <= (20, 20)) { + return ANJU_SCH_WALKING_47; + } else if ((20, 20) <= NOW <= (20, 30)) { + return ANJU_SCH_WAITING_CLOSING_TIME; + } else if ((20, 30) <= NOW <= (21, 0)) { + return ANJU_SCH_WALKING_48; + } else if ((21, 0) <= NOW <= (21, 5)) { + return ANJU_SCH_DOOR_30; + } else if ((21, 30) <= NOW <= (23, 0)) { + return ANJU_SCH_TALKING_WITH_MOM; + } else { + return None; + } + } else if (play->sceneId == SCENE_TOWN) { + if ((11, 29) <= NOW <= (11, 39)) { + return ANJU_SCH_DOOR_37; + } else if ((11, 39) <= NOW <= (12, 25)) { + return ANJU_SCH_WALKING_54; + } else if ((12, 25) <= NOW <= (13, 15)) { + return ANJU_SCH_WALKING_55; + } else if ((15, 55) <= NOW <= (16, 45)) { + return ANJU_SCH_WALKING_58; + } else if ((16, 45) <= NOW <= (17, 24)) { + return ANJU_SCH_WALKING_59; + } else if ((17, 24) <= NOW <= (17, 30)) { + return ANJU_SCH_DOOR_38; + } else { + return None; + } + } else if (play->sceneId == SCENE_CLOCKTOWER) { + if ((11, 39) <= NOW <= (12, 25)) { + return ANJU_SCH_WALKING_60; + } else if ((12, 25) <= NOW <= (13, 15)) { + return ANJU_SCH_WALKING_61; + } else if ((15, 55) <= NOW <= (16, 45)) { + return ANJU_SCH_WALKING_62; + } else if ((16, 45) <= NOW <= (17, 24)) { + return ANJU_SCH_WALKING_63; + } else { + return None; + } + } else if (play->sceneId == SCENE_ALLEY) { + if ((13, 15) <= NOW <= (13, 45)) { + return ANJU_SCH_WALKING_56; + } else if ((13, 45) <= NOW <= (15, 25)) { + return ANJU_SCH_LAUNDRY_POOL_SIT; + } else if ((15, 25) <= NOW <= (15, 55)) { + return ANJU_SCH_WALKING_57; + } else { + return None; + } + } else { + return None; + } + } else if (gSaveContext.save.day == 3) { + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DELIVERED_PENDANT_OF_MEMORIES)) { + if (play->sceneId == SCENE_YADOYA) { + if ((6, 0) <= NOW <= (11, 0)) { + return ANJU_SCH_SWEEPING; + } else if ((11, 0) <= NOW <= (11, 25)) { + return ANJU_SCH_WALKING_52; + } else if ((11, 25) <= NOW <= (11, 30)) { + return ANJU_SCH_DOOR_36; + } else if ((11, 30) <= NOW <= (11, 50)) { + return ANJU_SCH_WALKING_53; + } else if ((11, 50) <= NOW <= (12, 0)) { + return ANJU_SCH_DOOR_39; + } else if ((18, 0) <= NOW <= (5, 0)) { + return ANJU_SCH_WAITING_FOR_KAFEI; + } else if ((5, 0) <= NOW <= (6, 0)) { + return ANJU_SCH_WAITING_FOR_KAFEI; + } else { + return None; + } + } else { + return None; + } + } else if (play->sceneId == SCENE_YADOYA) { + if ((6, 0) <= NOW <= (11, 0)) { + return ANJU_SCH_SWEEPING; + } else if ((11, 0) <= NOW <= (11, 25)) { + return ANJU_SCH_WALKING_52; + } else if ((11, 25) <= NOW <= (11, 30)) { + return ANJU_SCH_DOOR_36; + } else if ((11, 30) <= NOW <= (11, 50)) { + return ANJU_SCH_WALKING_53; + } else if ((11, 50) <= NOW <= (12, 0)) { + return ANJU_SCH_DOOR_39; + } else { + return None; + } + } else if (play->sceneId == SCENE_OMOYA) { + if ((18, 0) <= NOW <= (6, 0)) { + return ANJU_SCH_RANCH; + } else { + return None; + } + } else { + return None; + } + } else { + return None; + } +} + */ + +static s32 sSearchTimePathLimit[ANJU_SCH_MAX] = { + -1, // ANJU_SCH_NONE + 10, // ANJU_SCH_WAITING_FOR_KAFEI + -1, // ANJU_SCH_2 + 0, // ANJU_SCH_LAUNDRY_POOL_SIT + -1, // ANJU_SCH_4 + -1, // ANJU_SCH_5 + -1, // ANJU_SCH_6 + -1, // ANJU_SCH_7 + -1, // ANJU_SCH_8 + -1, // ANJU_SCH_9 + -1, // ANJU_SCH_10 + -1, // ANJU_SCH_11 + -1, // ANJU_SCH_RANCH + -1, // ANJU_SCH_13 + 0, // ANJU_SCH_COOKING + -1, // ANJU_SCH_15 + 10, // ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN + 10, // ANJU_SCH_ATTEND_GORON + 10, // ANJU_SCH_RECEPTIONIST_IDLE + 11, // ANJU_SCH_WAITING_CLOSING_TIME + -1, // ANJU_SCH_20 + 4, // ANJU_SCH_GIVE_LUNCH_TO_GRANNY + 22, // ANJU_SCH_SWEEPING + 15, // ANJU_SCH_MIDNIGHT_MEETING + -1, // ANJU_SCH_TALKING_WITH_MOM + -1, // ANJU_SCH_WITH_KAFEI + 3, // ANJU_SCH_DOOR_26 + 6, // ANJU_SCH_DOOR_27 + 8, // ANJU_SCH_DOOR_28 + 9, // ANJU_SCH_DOOR_29 + 13, // ANJU_SCH_DOOR_30 + 14, // ANJU_SCH_DOOR_31 + 16, // ANJU_SCH_DOOR_32 + 18, // ANJU_SCH_DOOR_33 + 19, // ANJU_SCH_DOOR_34 + 21, // ANJU_SCH_DOOR_35 + 23, // ANJU_SCH_DOOR_36 + 0, // ANJU_SCH_DOOR_37 + 5, // ANJU_SCH_DOOR_38 + 25, // ANJU_SCH_DOOR_39 + 0, // ANJU_SCH_WALKING_40 + 1, // ANJU_SCH_41 + 2, // ANJU_SCH_WALKING_42 + 4, // ANJU_SCH_WALKING_43 + 5, // ANJU_SCH_WALKING_44 + 7, // ANJU_SCH_WALKING_45 + 10, // ANJU_SCH_WALKING_46 + 11, // ANJU_SCH_WALKING_47 + 12, // ANJU_SCH_WALKING_48 + 15, // ANJU_SCH_WALKING_49 + 17, // ANJU_SCH_WALKING_50 + 20, // ANJU_SCH_WALKING_51 + 22, // ANJU_SCH_WALKING_52 + 24, // ANJU_SCH_WALKING_53 + 1, // ANJU_SCH_WALKING_54 + 2, // ANJU_SCH_WALKING_55 + 0, // ANJU_SCH_WALKING_56 + 1, // ANJU_SCH_WALKING_57 + 3, // ANJU_SCH_WALKING_58 + 4, // ANJU_SCH_WALKING_59 + 0, // ANJU_SCH_WALKING_60 + 1, // ANJU_SCH_WALKING_61 + 2, // ANJU_SCH_WALKING_62 + 3, // ANJU_SCH_WALKING_63 +}; + +s32 sAnjuMsgScript_SchReceiveLetterFromPostman[0x1B] = { + 0x00560800, 0x44090000, 0x0E28BA0C, 0x09000017, 0x0E28BB0C, 0x09000018, 0x0E28BC0C, 0x09000017, 0x0E28BD0C, + 0x09000018, 0x0E28BE0C, 0x09000017, 0x0E28BF0C, 0x09000018, 0x0E28C02D, 0x00012D00, 0x0B0C0900, 0x00115608, + 0x10090000, 0x0E295C0C, 0x09000017, 0x0E295D0C, 0x09000018, 0x0E295E2D, 0x00012D00, 0x0B0C0900, 0x00100000, +}; + +s32 sAnjuMsgScript_SchAttendGoron[0x21] = { + 0x09000000, 0x4B10001E, 0x0E28B10C, 0x09000017, 0x0E28B20C, 0x09000018, 0x0E28B32D, 0x00011137, 0x020C0900, + 0x00100056, 0x10002E0E, 0x28B10C09, 0x0000170E, 0x28B50C09, 0x0000180E, 0x28B60C09, 0x0000170E, 0x28B70C09, + 0x0000180E, 0x28B82D00, 0x010C0900, 0x00115610, 0x10090000, 0x170E2956, 0x0C090000, 0x180E2957, 0x0C090000, + 0x170E2958, 0x0C090000, 0x180E2959, 0x2D00010C, 0x09000012, 0x10000000, +}; + +s32 sAnjuMsgScript_SchGiveLunchToGranny[0x15] = { + 0x09000017, 0x0E28C70C, 0x09000018, 0x0E28C80C, 0x09000017, 0x0E28C90C, 0x09000018, + 0x0E28CA0C, 0x09000017, 0x0E28CB0C, 0x09000018, 0x0E28CC0C, 0x09000017, 0x0E28CD0C, + 0x09000018, 0x0E28CE0C, 0x09000017, 0x0E28CF2D, 0x12D00, 0x0E0C0900, 0x100000, +}; + +s32 sAnjuMsgScript_ReceptionistDay1[0x37] = { + 0x220B0000, 0x69002020, 0x64004B, 0x1000B700, 0x370100AA, 0x370200, 0x550E28A0, 0x0C090000, + 0x0F28A80C, 0x05000000, 0x30000030, 0x0E28A90C, 0x0F28AA0C, 0x0F28AB0C, 0x120600A0, 0x1300, + 0xA02F0000, 0x2E2D0014, 0x0C114B10, 0x0700000E, 0x28AD2D00, 0x010C2400, 0x41161031, 0x0E28A30C, + 0x0900000F, 0x28A52D00, 0x010C1137, 0x01100020, 0x2000340E, 0x28A00C09, 0xF28, 0xA10C0500, + 0xF00, 0x300E28, 0xA20C0900, 0xF28A3, 0x0C190008, 0x310E28A4, 0x0C090000, 0x0F28A52D, + 0x10C11, 0x20201023, 0x400012, 0x0E28A00C, 0x0900000F, 0x28A62D00, 0x010C2400, 0x40100E28, + 0xA72D0001, 0x0C102300, 0x41000B0E, 0x28AC2D00, 0x010C2400, 0x41100E28, 0xAD0C1000, +}; + +s32 sAnjuMsgScript_InnCloseTime[3] = { 0x0E18852D, 0x10C12, 0x10000000 }; + +s32 sAnjuMsgScript_80B58944[2] = { 0x0E28AF2D, 0x10C10 }; + +s32 sAnjuMsgScript_80B5894C[2] = { 0x0E28C12D, 0x10C10 }; + +s32 sAnjuMsgScript_SchCooking[0xB] = { + 0x350100, 0x1C0E28C3, 0x0C0F28C4, 0x0C150900, 0xE28C5, 0x2D00010C, + 0x15090000, 0x11350112, 0x100E28C2, 0x2D00010C, 0x10000000, +}; + +s32 sAnjuMsgScript_80B58980[2] = { 0x0E28C62D, 0x10C10 }; + +s32 sAnjuMsgScript_SchSweeping[3] = { 0x0E28F70C, 0x0F28F82D, 0x10C10 }; + +s32 sAnjuMsgScript_80B58994[2] = { 0x0E28F82D, 0x10C10 }; + +s32 sAnjuMsgScript_SchRanch[4] = { 0x0E28F90C, 0x0F28FA0C, 0x0F28FB2D, 0x10C10 }; + +s32 sAnjuMsgScript_SchMidnightMeeting[0x14] = { + 0x0E28D70C, 0x0F28D80C, 0x0F28D90C, 0x0F28DA0C, 0x0F28DB0C, 0x05000700, 0x731, + 0x0E28D919, -0x16CFF2, 0x28DC0C11, 0x32201132, 0x10120600, 0xAA000013, 0xAA2F00, + 0x2E2D00, 0x012D0017, 0x2D00160C, 0x0700000E, 0x28DE0C15, 0x09000010, +}; + +// Surprised: nevermind +s32 sAnjuMsgScript_80B589FC[2] = { 0x0E28D62D, 0x10C10 }; + +s32 sAnjuMsgScript_DekuDefault[8] = { + 0x522000, 0x100E294F, 0x0C0F2950, 0x2D00010C, 0x12115220, 0x100E2951, 0x2D00010C, 0x12100000, +}; + +s32 sAnjuMsgScript_SchLaundryPoolDeku[6] = { 0x524000, 0x0B0E2952, 0x2D00010C, 0x11524010, 0x0E29532D, 0x10C10 }; + +s32 sAnjuMsgScript_Receptionist[2] = { 0x0E28E02D, 0x10C10 }; + +s32 sAnjuMsgScript_80B58A44[0x1E] = { + 0x320800, 0x080E28D5, 0x2D00010C, 0x10003220, 0x80E28, -0x2BD2FFFF, 0x0C100033, 0x01001A25, + 0x30001D, 0x27000300, 0x080E28E3, 0x2D00010C, 0x100E28E2, 0x2D00010C, 0x100E28E1, 0x2D00010C, + 0x100E28E4, 0x0C0E00FF, 0x1E003600, 0x0E000000, 0x0C2C28E7, 0x0C2F0000, 0x2D00010C, 0x1012102C, + 0x28E50C2F, 0xC2A, 0x300F28, -0x19D2FFFF, 0x2D001A0C, 0x11330110, +}; + +s32 sAnjuMsgScript_80B58ABC[2] = { 0x0E28D02D, 0x10C10 }; + +s32 sAnjuMsgScript_80B58AC4[9] = { + 0x320800, 0x160E28D1, 0x0C0F28D2, 0x0C0F28D3, 0x2D00152D, 0x10C11, 0x3208100E, 0x28D32D00, 0x010C1000, +}; + +s32 sAnjuMsgScript_SchWaitingForKafei[3] = { 0x0E28DF2D, 0x10C12, 0x10000000 }; + +s32 sAnjuMsgScript_SchLaundryPoolDefault[0x12] = { + 0x372000, 0x29003208, 0x2A0E28, -0x17F3EAF7, 0xE28, -0x16F3F0D8, -0x15F3EAF7, 0xE28, -0x14F3F0D8, + -0x13D2FFFF, 0x0C121137, 0x20100E28, -0x13F3EDF0, 0x0E28EE0C, 0x0F28EB0C, 0x0F28EC2D, 0x10C12, 0x11372010, +}; + +s32 sAnjuMsgScript_SchLaundryPoolKafeiMask[0x10] = { + 0x372000, 0x21003208, 0x220E28, -0x17F3F0D8, -0x12F3EAF7, 0xE28, -0x14F3F0D8, -0x13D2FFFF, + 0x0C121137, 0x20100E28, -0x13F3EDF0, 0x0E28EE0C, 0x0F28EB0C, 0x0F28EC2D, 0x10C12, 0x11372010, +}; + +// Anju says the Inn is full and tell the player to tell that to his mother +s32 sAnjuMsgScript_80B58B7C[3] = { 0x0E29512D, 0x10C12, 0x10000000 }; + +// Tells player that they should talk in the kitchen instead +s32 sAnjuMsgScript_80B58B88[2] = { 0x0E29612D, 0x10C10 }; + +s32 sAnjuMsgScript_SchWithKafei[3] = { 0x0E291B2D, 0x10C12, 0x10000000 }; -#if 0 ActorInit En_An_InitVars = { /**/ ACTOR_EN_AN, /**/ ACTORCAT_NPC, @@ -31,142 +772,2688 @@ ActorInit En_An_InitVars = { /**/ NULL, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_80B58BBC = { - { COLTYPE_HIT1, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, }, +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_HIT1, + AT_NONE, + AC_NONE, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_1, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK1, + { 0x00000000, 0x00, 0x00 }, + { 0x00000000, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_NONE, + OCELEM_ON, + }, { 14, 62, 0, { 0, 0, 0 } }, }; -// sColChkInfoInit -static CollisionCheckInfoInit2 D_80B58BE8 = { 0, 0, 0, 0, MASS_IMMOVABLE }; +static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE }; -#endif +s32 EnAn_InitObjectSlots(EnAn* this, PlayState* play) { + s32 ret = false; -extern ColliderCylinderInit D_80B58BBC; -extern CollisionCheckInfoInit2 D_80B58BE8; + if ((this->roomNum != play->roomCtx.curRoom.num) && (play->roomCtx.status == 0) && !this->slotsInitialized) { + this->msmoObjectSlot = SubS_GetObjectSlot(OBJECT_MSMO, play); + this->an4ObjectSlot = SubS_GetObjectSlot(OBJECT_AN4, play); + this->maskKerfayObjectSlot = SubS_GetObjectSlot(OBJECT_MASK_KERFAY, play); + this->an3ObjectSlot = SubS_GetObjectSlot(OBJECT_AN3, play); + this->an2ObjectSlot = SubS_GetObjectSlot(OBJECT_AN2, play); + this->actor.draw = NULL; + this->roomNum = play->roomCtx.curRoom.num; + this->slotsInitialized = true; + } -extern UNK_TYPE D_060111E8; -extern UNK_TYPE D_06012618; + if (!this->slotsInitialized) { + return false; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53840.s") + if (((this->an2ObjectSlot > OBJECT_SLOT_NONE) && !SubS_IsObjectLoaded(this->an2ObjectSlot, play)) || + ((this->an3ObjectSlot > OBJECT_SLOT_NONE) && !SubS_IsObjectLoaded(this->an3ObjectSlot, play)) || + ((this->maskKerfayObjectSlot > OBJECT_SLOT_NONE) && !SubS_IsObjectLoaded(this->maskKerfayObjectSlot, play)) || + ((this->an4ObjectSlot > OBJECT_SLOT_NONE) && !SubS_IsObjectLoaded(this->an4ObjectSlot, play)) || + ((this->msmoObjectSlot > OBJECT_SLOT_NONE) && !SubS_IsObjectLoaded(this->msmoObjectSlot, play))) { + ret = true; + } else { + this->actor.draw = EnAn_Draw; + this->slotsInitialized = false; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B539CC.s") + return ret; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53A7C.s") +Actor* EnAn_FindActor(EnAn* this, PlayState* play, u8 actorCategory, s16 actorId) { + Actor* foundActor = NULL; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53B3C.s") + while (true) { + foundActor = SubS_FindActor(play, foundActor, actorCategory, actorId); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53BA8.s") + if (foundActor == NULL) { + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53CE8.s") + if ((this != (EnAn*)foundActor) && (foundActor->update != NULL)) { + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53ED4.s") + if (foundActor->next == NULL) { + foundActor = NULL; + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B53F84.s") + foundActor = foundActor->next; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54124.s") + return foundActor; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54678.s") +// Name after ENAN_8000 +Actor* func_80B53A7C(EnAn* this, PlayState* play, u8 actorCategory, s16 actorId) { + Actor* foundActor = NULL; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B546F4.s") + while (true) { + foundActor = SubS_FindActor(play, foundActor, actorCategory, actorId); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54750.s") + if (foundActor == NULL) { + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B547C8.s") + if ((this != (EnAn*)foundActor) && (foundActor->update != NULL)) { + if (!ENAN_GET_8000(foundActor)) { + break; + } + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B5492C.s") + if (foundActor->next == NULL) { + foundActor = NULL; + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54A94.s") + foundActor = foundActor->next; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54BC4.s") + return foundActor; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54C5C.s") +EnDoor* EnAn_FindDoor(PlayState* play, AnjuScheduleResult scheduleOutputResult) { + s32 switchFlag; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54D18.s") + switch (scheduleOutputResult) { + case ANJU_SCH_DOOR_26: + case ANJU_SCH_DOOR_27: + switchFlag = 0xD; + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B54DF4.s") + case ANJU_SCH_DOOR_33: + case ANJU_SCH_DOOR_34: + case ANJU_SCH_DOOR_37: + case ANJU_SCH_DOOR_38: + switchFlag = 0xB; + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55180.s") + case ANJU_SCH_DOOR_36: + switchFlag = 0x10; + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B552E4.s") + case ANJU_SCH_DOOR_28: + case ANJU_SCH_DOOR_29: + case ANJU_SCH_DOOR_30: + case ANJU_SCH_DOOR_31: + case ANJU_SCH_DOOR_32: + case ANJU_SCH_DOOR_35: + case ANJU_SCH_DOOR_39: + switchFlag = 0xE; + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B553AC.s") + default: + return NULL; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B554E8.s") + return SubS_FindDoor(play, switchFlag); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B555C8.s") +/** + * Anju stores her animations across 4 objects and all of them are put together right next to each other in the + * sAnimationInfo array. Due to this, animation functions check which object to load by comparing index ranges. To make + * this a bit easier to read, this enum includes `ENAN_ANIMOBJ_*` values that mark when a range of animations of a + * certain object start + */ +typedef enum EnAnAnimation { + /* -1 */ ENAN_ANIM_NONE = -1, + /* 0 */ ENAN_ANIM_HOLD_HANDS, + /* 1 */ ENAN_ANIM_IDLE, + /* 2 */ ENAN_ANIM_IDLE_MORPH, + /* 3 */ ENAN_ANIM_BOW, + /* 4 */ ENAN_ANIM_BOW_MORPH, + /* 5 */ ENAN_ANIM_SURPRISED, + /* 6 */ ENAN_ANIM_LOOK_UP_RELIEVED, + /* 7 */ ENAN_ANIM_WALK, + /* 8 */ ENAN_ANIM_WALK2, // Duplicate of ENAN_ANIM_WALK + /* 9 */ ENAN_ANIM_SIT, + /* 10 */ ENAN_ANIM_SIT_MORPH, + /* 11 */ ENAN_ANIM_SITTING_IN_DISBELIEF, + /* 12 */ ENAN_ANIM_COOK, + /* 13 */ ENAN_ANIM_TASTE, + /* 14 */ ENAN_ANIM_TASTE_END, + /* 15 */ ENAN_ANIM_WAIT_WITH_TRAY, + /* 16 */ ENAN_ANIM_WALK_WITH_TRAY, -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B556F8.s") + /* 17 */ ENAN_ANIMOBJ_AN2, + /* 17 */ ENAN_ANIM_UMBRELLA_IDLE = ENAN_ANIMOBJ_AN2, + /* 18 */ ENAN_ANIM_UMBRELLA_WALK, + /* 19 */ ENAN_ANIM_UMBRELLA_SIT, + /* 20 */ ENAN_ANIM_UMBRELLA_CRY, -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B557AC.s") + /* 21 */ ENAN_ANIMOBJ_AN3, + /* 21 */ ENAN_ANIM_BROOM_IDLE = ENAN_ANIMOBJ_AN3, + /* 22 */ ENAN_ANIM_BROOM_WALK, + /* 23 */ ENAN_ANIM_BROOM_SWEEP, + /* 24 */ ENAN_ANIM_24, //! @bug See note at `sAnimationInfo` -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55860.s") + /* 25 */ ENAN_ANIMOBJ_AN4, + /* 25 */ ENAN_ANIM_MASK_STAND_LOOP = ENAN_ANIMOBJ_AN4, + /* 26 */ ENAN_ANIM_MASK_KNEEL, + /* 27 */ ENAN_ANIM_MASK_KNEEL_LOOP, + /* 28 */ ENAN_ANIM_HUG, + /* 29 */ ENAN_ANIM_HUG_LOOP, + /* 30 */ ENAN_ANIM_HUG_RELEASE, + /* 31 */ ENAN_ANIM_HUG_RELEASE_LOOP, + /* 32 */ ENAN_ANIM_COMBINE_MASKS_1, + /* 33 */ ENAN_ANIM_COMBINE_MASKS_2, + /* 34 */ ENAN_ANIM_LOOK_UP, + /* 35 */ ENAN_ANIM_LOOK_UP_LOOP, + /* 36 */ ENAN_ANIM_MAX +} EnAnAnimation; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55914.s") +static AnimationInfoS sAnimationInfo[ENAN_ANIM_MAX] = { + { &gAnju1HoldHandsAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_HOLD_HANDS + { &gAnju1IdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_IDLE + { &gAnju1IdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 }, // ENAN_ANIM_IDLE_MORPH + { &gAnju1BowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_BOW + { &gAnju1BowAnim, 1.0f, 0, -1, ANIMMODE_ONCE, -6 }, // ENAN_ANIM_BOW_MORPH + { &gAnju1SurprisedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_SURPRISED + { &gAnju1LookUpRelievedAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_LOOK_UP_RELIEVED + { &gAnju1WalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_WALK + { &gAnju1WalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_WALK2 + { &gAnju1SitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_SIT + { &gAnju1SitAnim, 1.0f, 0, -1, ANIMMODE_LOOP, -6 }, // ENAN_ANIM_SIT_MORPH + { &gAnju1SittingInDisbeliefAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_SITTING_IN_DISBELIEF + { &gAnju1CookAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_COOK + { &gAnju1TasteAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_TASTE + { &gAnju1TasteEndAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_TASTE_END + { &gAnju1WaitWithTrayAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_WAIT_WITH_TRAY + { &gAnju1WalkWithTrayAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_WALK_WITH_TRAY -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55D20.s") + // ENAN_ANIMOBJ_AN2 + { &gAnju2UmbrellaIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_UMBRELLA_IDLE + { &gAnju2UmbrellaWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_UMBRELLA_WALK + { &gAnju2UmbrellaSitAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_UMBRELLA_SIT + { &gAnju2UmbrellaCryAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_UMBRELLA_CRY -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55D98.s") + // ENAN_ANIMOBJ_AN3 + { &gAnju3BroomIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_BROOM_IDLE + { &gAnju3BroomWalkAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_BROOM_WALK + { &gAnju3BroomSweepAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_BROOM_SWEEP + //! @bug Uses symbol from OBJECT_AN2 instead of OBJECT_AN3. Because of this entry being in the OBJECT_AN3 block, + //! then the actor will try to load this address from OBJECT_AN3, but this address is way outside said object, + //! producing an OoB read and reading garbage, possible from other object. This will likely produce a crash. + { &gAnju2UmbrellaSitAnim, -1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_24 -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55ECC.s") + // ENAN_ANIMOBJ_AN4 + { &gAnju4MaskStandLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_MASK_STAND_LOOP + { &gAnju4MaskKneelAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_MASK_KNEEL + { &gAnju4MaskKneelLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_MASK_KNEEL_LOOP + { &gAnju4HugAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_HUG + { &gAnju4HugLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_HUG_LOOP + { &gAnju4HugReleaseAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_HUG_RELEASE + { &gAnju4HugReleaseLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_HUG_RELEASE_LOOP + { &gAnju4CombineMasks1Anim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_COMBINE_MASKS_1 + { &gAnju4CombineMasks2Anim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_COMBINE_MASKS_2 + { &gAnju4LookUpAnim, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // ENAN_ANIM_LOOK_UP + { &gAnju4LookUpLoopAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // ENAN_ANIM_LOOK_UP_LOOP +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B55F8C.s") +s32 EnAn_UpdateSkelAnime(EnAn* this, PlayState* play) { + s8 originalObjectSlot = this->actor.objectSlot; + s8 otherObjectSlot = OBJECT_SLOT_NONE; + s32 ret = false; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B5600C.s") + if ((this->animIndex >= ENAN_ANIMOBJ_AN4) && (this->an4ObjectSlot > OBJECT_SLOT_NONE)) { + otherObjectSlot = this->an4ObjectSlot; + } else if ((this->animIndex >= ENAN_ANIMOBJ_AN3) && (this->an3ObjectSlot > OBJECT_SLOT_NONE)) { + otherObjectSlot = this->an3ObjectSlot; + } else if ((this->animIndex >= ENAN_ANIMOBJ_AN2) && (this->an2ObjectSlot > OBJECT_SLOT_NONE)) { + otherObjectSlot = this->an2ObjectSlot; + } else if (this->animIndex < ENAN_ANIMOBJ_AN2) { + otherObjectSlot = originalObjectSlot; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56094.s") + if (otherObjectSlot <= OBJECT_SLOT_NONE) { + return 0; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B5611C.s") + if (otherObjectSlot > OBJECT_SLOT_NONE) { + gSegments[0x6] = OS_K0_TO_PHYSICAL(play->objectCtx.slots[otherObjectSlot].segment); + this->skelAnime.playSpeed = this->animPlaySpeed; + ret = SkelAnime_Update(&this->skelAnime); + gSegments[0x6] = OS_K0_TO_PHYSICAL(play->objectCtx.slots[originalObjectSlot].segment); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B561A4.s") + return ret; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56418.s") +s32 EnAn_ChangeAnim(EnAn* this, PlayState* play, EnAnAnimation animIndex) { + s8 originalObjectSlot = this->actor.objectSlot; + s8 otherObjectSlot = OBJECT_SLOT_NONE; + s32 changeAnim = false; + s32 didAnimChange = false; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56744.s") + if ((animIndex >= ENAN_ANIMOBJ_AN4) && (this->an4ObjectSlot > OBJECT_SLOT_NONE)) { + otherObjectSlot = this->an4ObjectSlot; + } else if ((animIndex >= ENAN_ANIMOBJ_AN3) && (this->an3ObjectSlot > OBJECT_SLOT_NONE)) { + otherObjectSlot = this->an3ObjectSlot; + } else if ((animIndex >= ENAN_ANIMOBJ_AN2) && (this->an2ObjectSlot > OBJECT_SLOT_NONE)) { + otherObjectSlot = this->an2ObjectSlot; + } else if (animIndex < ENAN_ANIMOBJ_AN2) { + otherObjectSlot = originalObjectSlot; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56880.s") + if (otherObjectSlot <= OBJECT_SLOT_NONE) { + return false; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56B00.s") + switch (animIndex) { + case ENAN_ANIM_IDLE: + case ENAN_ANIM_IDLE_MORPH: + if ((this->animIndex != ENAN_ANIM_IDLE) && (this->animIndex != ENAN_ANIM_IDLE_MORPH)) { + changeAnim = true; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56BC0.s") + case ENAN_ANIM_WALK: + case ENAN_ANIM_WALK2: + if ((this->animIndex != ENAN_ANIM_WALK) && (this->animIndex != ENAN_ANIM_WALK2)) { + changeAnim = true; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56CAC.s") + case ENAN_ANIM_SIT: + case ENAN_ANIM_SIT_MORPH: + if ((this->animIndex != ENAN_ANIM_SIT) && (this->animIndex != ENAN_ANIM_SIT_MORPH)) { + changeAnim = true; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56D28.s") + default: + if (animIndex != this->animIndex) { + changeAnim = true; + } + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56E44.s") + if (changeAnim && (otherObjectSlot > OBJECT_SLOT_NONE)) { + gSegments[0x6] = OS_K0_TO_PHYSICAL(play->objectCtx.slots[otherObjectSlot].segment); + this->animIndex = animIndex; + didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex); + this->animPlaySpeed = this->skelAnime.playSpeed; + gSegments[0x6] = OS_K0_TO_PHYSICAL(play->objectCtx.slots[originalObjectSlot].segment); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B56EB4.s") + return didAnimChange; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B5702C.s") +void EnAn_UpdateCollider(EnAn* this, PlayState* play) { + f32 height; + s32 pad; + Vec3f sp24; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B572D4.s") + if (this->scheduleResult == ANJU_SCH_WITH_KAFEI) { + static Vec3f D_80B58E34 = { 0.0f, 0.0f, 8.0f }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B573F4.s") + Lib_Vec3f_TranslateAndRotateY(&this->actor.world.pos, this->actor.shape.rot.y, &D_80B58E34, &sp24); + this->collider.dim.radius = 20; + Math_Vec3f_ToVec3s(&this->collider.dim.pos, &sp24); + } else { + Collider_UpdateCylinder(&this->actor, &this->collider); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B575BC.s") + height = this->actor.focus.pos.y - this->actor.world.pos.y; + this->collider.dim.height = TRUNCF_BINANG(height); + CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B57674.s") +typedef enum EnAnEyes { + /* 0 */ ENAN_EYES_OPEN, + /* 1 */ ENAN_EYES_HALF1, + /* 2 */ ENAN_EYES_CLOSED, + /* 3 */ ENAN_EYES_HALF2, + /* 4 */ ENAN_EYES_COMFORT, + /* 5 */ ENAN_EYES_SAD, + /* 6 */ ENAN_EYES_RELIEVED_CLOSED, + /* 7 */ ENAN_EYES_MAX +} EnAnEyes; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B57718.s") +typedef enum EnAnMouth { + /* 0 */ ENAN_MOUTH_CLOSED, + /* 1 */ ENAN_MOUTH_HAPPY, + /* 2 */ ENAN_MOUTH_OPEN, + /* 3 */ ENAN_MOUTH_MAX +} EnAnMouth; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B577F0.s") +typedef enum EnAnFace { + /* 0 */ ENAN_FACE_0, + /* 1 */ ENAN_FACE_1, + /* 2 */ ENAN_FACE_2, + /* 3 */ ENAN_FACE_3, + /* 4 */ ENAN_FACE_4, + /* 5 */ ENAN_FACE_5, + /* 6 */ ENAN_FACE_6, + /* 7 */ ENAN_FACE_7, // RELIEVED? + /* 8 */ ENAN_FACE_8, // COMFORTING + /* 9 */ ENAN_FACE_9, // HAPPY_BLINK? + /* 10 */ ENAN_FACE_MAX +} EnAnFace; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B578F8.s") +void EnAn_UpdateFace(EnAn* this) { + static s16 sMouthIndices[ENAN_FACE_MAX] = { + ENAN_MOUTH_CLOSED, // ENAN_FACE_0 + ENAN_MOUTH_OPEN, // ENAN_FACE_1 + ENAN_MOUTH_CLOSED, // ENAN_FACE_2 + ENAN_MOUTH_HAPPY, // ENAN_FACE_3 + ENAN_MOUTH_OPEN, // ENAN_FACE_4 + ENAN_MOUTH_CLOSED, // ENAN_FACE_5 + ENAN_MOUTH_HAPPY, // ENAN_FACE_6 + ENAN_MOUTH_OPEN, // ENAN_FACE_7 + ENAN_MOUTH_HAPPY, // ENAN_FACE_8 + ENAN_MOUTH_HAPPY, // ENAN_FACE_9 + }; + s32 skipBlink = false; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B57A44.s") + if (this->stateFlags & ENAN_STATE_UPDATE_EYES) { + if (DECR(this->eyeTimer) == 0) { + switch (this->faceIndex) { + case ENAN_FACE_2: + case ENAN_FACE_4: + case ENAN_FACE_6: + if ((this->eyeTexIndex == ENAN_EYES_SAD) || (this->eyeTexIndex == ENAN_EYES_CLOSED)) { + skipBlink = true; + this->eyeTexIndex = ENAN_EYES_SAD; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B57B48.s") + case ENAN_FACE_5: + case ENAN_FACE_7: + if ((this->eyeTexIndex == ENAN_EYES_RELIEVED_CLOSED) || (this->eyeTexIndex == ENAN_EYES_HALF1)) { + skipBlink = true; + this->eyeTexIndex = ENAN_EYES_RELIEVED_CLOSED; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/EnAn_Init.s") + case ENAN_FACE_8: + if ((this->eyeTexIndex == ENAN_EYES_COMFORT) || (this->eyeTexIndex == ENAN_EYES_CLOSED)) { + skipBlink = true; + this->eyeTexIndex = ENAN_EYES_COMFORT; + } + break; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/EnAn_Destroy.s") + if (!skipBlink) { + if ((this->eyeTexIndex == ENAN_EYES_COMFORT) || (this->eyeTexIndex == ENAN_EYES_SAD)) { + this->eyeTexIndex = ENAN_EYES_OPEN; + } else if (this->eyeTexIndex == ENAN_EYES_RELIEVED_CLOSED) { + this->eyeTexIndex = ENAN_EYES_HALF1; + } + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/EnAn_Update.s") + if (!skipBlink) { + this->eyeTexIndex++; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B57EE8.s") + if (this->eyeTexIndex > ENAN_EYES_HALF2) { + if ((this->faceIndex == ENAN_FACE_0) || (this->faceIndex == ENAN_FACE_1) || + (this->faceIndex == ENAN_FACE_3)) { + this->eyeTimer = Rand_S16Offset(30, 30); + } else { + this->eyeTimer = 8; + } + this->eyeTexIndex = ENAN_EYES_OPEN; + } + } + } + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B57FC4.s") + this->mouthTexIndex = sMouthIndices[this->faceIndex]; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_An/func_80B580C0.s") +typedef enum EnAnAccessory { + /* 0 */ ENAN_ACCESSORY_FOOD_TRAY, + /* 1 */ ENAN_ACCESSORY_KAFEI_MASK, + /* 2 */ ENAN_ACCESSORY_UMBRELLA, + /* 3 */ ENAN_ACCESSORY_BROOM, + /* 4 */ ENAN_ACCESSORY_CHOPSTICKS, + /* 5 */ ENAN_ACCESSORY_MOON_MASK +} EnAnAccessory; + +void EnAn_DrawAccessory(EnAn* this, PlayState* play, EnAnAccessory accessoryId) { + s32 pad; + s8 originalObjectSlot = this->actor.objectSlot; + s8 otherObjectSlot; + + OPEN_DISPS(play->state.gfxCtx); + + Matrix_Push(); + + switch (accessoryId) { + case ENAN_ACCESSORY_FOOD_TRAY: + if ((this->stateFlags & ENAN_STATE_DRAW_TRAY) && !this->forceDraw) { + this->trayTexScrollTimer1++; + this->trayTexScrollTimer2 -= 2; + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(play->state.gfxCtx, 0, this->trayTexScrollTimer1, 0, 16, 16, 1, 0, + this->trayTexScrollTimer2, 16, 16)); + gSPDisplayList(POLY_XLU_DISP++, gAnju1FoodTrayDL); + + Gfx_SetupDL25_Opa(play->state.gfxCtx); + } + break; + + case ENAN_ACCESSORY_KAFEI_MASK: + otherObjectSlot = this->maskKerfayObjectSlot; + if ((this->stateFlags & ENAN_STATE_DRAW_KAFEIS_MASK) && !this->forceDraw && + (otherObjectSlot > OBJECT_SLOT_NONE)) { + static Vec3f D_80B58E54 = { 190.0f, -130.0f, 0.0f }; + static Vec3s D_80B58E60 = { 0, 0, 0x4168 }; + + gSPSegment(POLY_OPA_DISP++, 0x0A, play->objectCtx.slots[otherObjectSlot].segment); + + Matrix_TranslateRotateZYX(&D_80B58E54, &D_80B58E60); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gKafeisMaskDL); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[originalObjectSlot].segment); + } + break; + + case ENAN_ACCESSORY_UMBRELLA: + otherObjectSlot = this->an2ObjectSlot; + if ((this->stateFlags & ENAN_STATE_DRAW_UMBRELLA) && !this->forceDraw && + (otherObjectSlot > OBJECT_SLOT_NONE)) { + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[otherObjectSlot].segment); + gSPDisplayList(POLY_OPA_DISP++, gAnju2UmbrellaDL); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[originalObjectSlot].segment); + } + break; + + case ENAN_ACCESSORY_BROOM: + otherObjectSlot = this->an3ObjectSlot; + if ((this->stateFlags & ENAN_STATE_DRAW_BROOM) && !this->forceDraw && + (otherObjectSlot > OBJECT_SLOT_NONE)) { + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[otherObjectSlot].segment); + gSPDisplayList(POLY_OPA_DISP++, gAnju3BroomDL); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[originalObjectSlot].segment); + } + break; + + case ENAN_ACCESSORY_CHOPSTICKS: + if ((this->stateFlags & ENAN_STATE_DRAW_CHOPSTICKS) && !this->forceDraw) { + gSPDisplayList(POLY_OPA_DISP++, gAnju1ChopsticksDL); + } + break; + + case ENAN_ACCESSORY_MOON_MASK: + otherObjectSlot = this->msmoObjectSlot; + if (this->drawMoonMask && (otherObjectSlot > OBJECT_SLOT_NONE)) { + static Vec3f D_80B58E68 = { 450.0f, 700.0f, -760.0f }; + static Vec3s D_80B58E74 = { 0x238C, 0, -0x3FFC }; + + Matrix_TranslateRotateZYX(&D_80B58E68, &D_80B58E74); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[otherObjectSlot].segment); + gSPDisplayList(POLY_OPA_DISP++, gMoonMaskDL); + gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[originalObjectSlot].segment); + } + break; + + default: + break; + } + + Matrix_Pop(); + + CLOSE_DISPS(play->state.gfxCtx); +} + +s32 EnAn_ChangeCutscene(EnAn* this, s16 csId) { + s32 ret = false; + + if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) { + CutsceneManager_Stop(CS_ID_GLOBAL_TALK); + CutsceneManager_Queue(csId); + } else if (CutsceneManager_IsNext(csId)) { + CutsceneManager_StartWithPlayerCs(csId, &this->actor); + ret = true; + } else { + CutsceneManager_Queue(csId); + } + + return ret; +} + +s16 EnAn_GetCsId(EnAn* this, s32 numCutscenes) { + s16 csId = this->actor.csId; + s32 i; + + for (i = 0; i < numCutscenes; i++) { + csId = CutsceneManager_GetAdditionalCsId(csId); + } + + return csId; +} + +s16 EnAn_GetChildCsId(EnAn* this, s32 numCutscenes) { + Actor* child = this->actor.child; + s16 csId = CS_ID_NONE; + s32 i; + + if ((child != NULL) && (child->update != NULL)) { + csId = child->csId; + + for (i = 0; i < numCutscenes; i++) { + csId = CutsceneManager_GetAdditionalCsId(csId); + } + } + + return csId; +} + +s32 EnAn_MsgEvent_ReceiveLetterFromPostman(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + s16 csId = EnAn_GetCsId(this, 0); + s32 ret = false; + + switch (this->msgEventState) { + case 0x0: + ret = false; + if (!EnAn_ChangeCutscene(this, csId)) { + break; + } + FALLTHROUGH; + case 0x2: + case 0x4: + case 0x6: + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor); + ret = true; + this->msgEventState++; + break; + + case 0x1: + case 0x3: + case 0x5: + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_LISTENED_ANJU_POSTMAN_CONVERSATION) && (this->msgEventState == 3)) { + CutsceneManager_Stop(csId); + } else if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) { + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), + this->actor.child); + } + this->msgEventState++; + ret = true; + break; + + case 0x7: + CutsceneManager_Stop(csId); + ret = true; + this->msgEventState++; + break; + + default: + break; + } + + return ret; +} + +s32 EnAn_MsgEvent_AttendGoron(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + s16 csId = EnAn_GetCsId(this, 0); + s32 ret = false; + + switch (this->msgEventState) { + case 0x0: + ret = false; + if (!EnAn_ChangeCutscene(this, csId)) { + break; + } + FALLTHROUGH; + case 0x2: + case 0x4: + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor); + ret = true; + this->msgEventState++; + break; + + case 0x1: + case 0x3: + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_RECEIVED_ROOM_KEY) && (this->msgEventState == 3)) { + CutsceneManager_Stop(csId); + this->msgEventState = 5; + } else if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) { + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), + this->actor.child); + } + this->msgEventState++; + ret = true; + break; + + case 0x5: + CutsceneManager_Stop(csId); + ret = true; + this->msgEventState++; + break; + + default: + break; + } + + return ret; +} + +s32 EnAn_MsgEvent_GiveLunchToGranny(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + s16 csId = EnAn_GetChildCsId(this, 0); + s32 ret = false; + + switch (this->msgEventState) { + case 0x0: + ret = false; + if (!EnAn_ChangeCutscene(this, csId)) { + break; + } + FALLTHROUGH; + case 0x2: + case 0x4: + case 0x6: + case 0x8: + if ((this->actor.child != NULL) && (this->actor.child->update != NULL)) { + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), + this->actor.child); + } + ret = true; + this->msgEventState++; + break; + + case 0x1: + case 0x3: + case 0x5: + case 0x7: + Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor); + ret = true; + this->msgEventState++; + break; + + case 0x9: + CutsceneManager_Stop(csId); + ret = true; + this->msgEventState++; + break; + + default: + break; + } + + return ret; +} + +// Only used if Player is using Kafei's Mask or if Human and Promised midnight meeting +s32 EnAn_MsgEvent_MidnightMeeting(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + + if (this->msgEventState == 0) { + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); + play->nextEntrance = ENTRANCE(STOCK_POT_INN, 3); + gSaveContext.nextCutsceneIndex = 0; + play->transitionTrigger = TRANS_TRIGGER_START; + play->transitionType = TRANS_TYPE_FADE_BLACK; + gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK_SLOW; + this->msgEventState++; + } + + return false; +} + +s32 EnAn_MsgEvent_Cooking(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + s32 ret = false; + + switch (this->msgEventState) { + case 0x0: + EnAn_ChangeAnim(this, play, ENAN_ANIM_TASTE); + this->msgEventState++; + break; + + case 0x1: + case 0x3: + if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + this->msgEventState++; + ret = true; + } + break; + + case 0x2: + EnAn_ChangeAnim(this, play, ENAN_ANIM_TASTE_END); + this->msgEventState++; + break; + + default: + break; + } + + return ret; +} + +s32 EnAn_MsgEvent_LaundryPool(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + s32 ret = false; + + switch (this->msgEventState) { + case 0x0: + if ((Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) || + CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ANJU_IN_LAUNDRY_POOL)) { + this->msgEventState++; + // fallthrough + } else { + ret = true; + this->stateFlags |= ENAN_STATE_DRAW_KAFEIS_MASK; + this->msgEventState++; + break; + } + FALLTHROUGH; + case 0x1: + this->stateFlags &= ~(ENAN_STATE_ENGAGED | ENAN_STATE_DRAW_KAFEIS_MASK); + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_CRY); + ret = true; + this->msgEventState++; + break; + + default: + break; + } + + return ret; +} + +s32* EnAn_GetMsgEventScript(EnAn* this, PlayState* play) { + Player* player = GET_PLAYER(play); + + switch (this->scheduleResult) { + case ANJU_SCH_GIVE_LUNCH_TO_GRANNY: + this->msgEventFunc = EnAn_MsgEvent_GiveLunchToGranny; + return sAnjuMsgScript_SchGiveLunchToGranny; + + case ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN: + this->msgEventFunc = EnAn_MsgEvent_ReceiveLetterFromPostman; + return sAnjuMsgScript_SchReceiveLetterFromPostman; + + case ANJU_SCH_ATTEND_GORON: + this->msgEventFunc = EnAn_MsgEvent_AttendGoron; + return sAnjuMsgScript_SchAttendGoron; + + case ANJU_SCH_COOKING: + this->msgEventFunc = EnAn_MsgEvent_Cooking; + return sAnjuMsgScript_SchCooking; + + case ANJU_SCH_RANCH: + return sAnjuMsgScript_SchRanch; + + case ANJU_SCH_WITH_KAFEI: + return sAnjuMsgScript_SchWithKafei; + + default: + break; + } + + if (player->transformation == PLAYER_FORM_DEKU) { + switch (this->scheduleResult) { + case ANJU_SCH_WAITING_FOR_KAFEI: + return sAnjuMsgScript_SchWaitingForKafei; + + case ANJU_SCH_WALKING_40: + case ANJU_SCH_WALKING_42: + case ANJU_SCH_WALKING_43: + case ANJU_SCH_WALKING_44: + case ANJU_SCH_WALKING_45: + case ANJU_SCH_WALKING_47: + return sAnjuMsgScript_80B58B7C; + + case ANJU_SCH_LAUNDRY_POOL_SIT: + return sAnjuMsgScript_SchLaundryPoolDeku; + + case ANJU_SCH_WALKING_49: + return sAnjuMsgScript_80B589FC; + + default: + return sAnjuMsgScript_DekuDefault; + } + } + + if (Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) { + if (this->scheduleResult == ANJU_SCH_WALKING_49) { + return sAnjuMsgScript_80B58B88; + } + + if (this->scheduleResult == ANJU_SCH_MIDNIGHT_MEETING) { + this->msgEventFunc = EnAn_MsgEvent_MidnightMeeting; + return sAnjuMsgScript_SchMidnightMeeting; + } + + if (this->scheduleResult == ANJU_SCH_LAUNDRY_POOL_SIT) { + this->msgEventFunc = EnAn_MsgEvent_LaundryPool; + return sAnjuMsgScript_SchLaundryPoolKafeiMask; + } + + if (gSaveContext.save.day >= 2) { + return sAnjuMsgScript_80B58A44; + } + + if (SCHEDULE_TIME_NOW < SCHEDULE_TIME(14, 18)) { + return sAnjuMsgScript_80B58ABC; + } + + return sAnjuMsgScript_80B58AC4; + } + + if ((player->transformation == PLAYER_FORM_HUMAN) && CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING)) { + if (this->scheduleResult == ANJU_SCH_MIDNIGHT_MEETING) { + this->msgEventFunc = EnAn_MsgEvent_MidnightMeeting; + return sAnjuMsgScript_SchMidnightMeeting; + } + + if (this->scheduleResult == ANJU_SCH_LAUNDRY_POOL_SIT) { + this->msgEventFunc = EnAn_MsgEvent_LaundryPool; + return sAnjuMsgScript_SchLaundryPoolDefault; + } + + if (gSaveContext.save.day >= 2) { + return sAnjuMsgScript_80B58A44; + } + } + + switch (this->scheduleResult) { + case ANJU_SCH_WAITING_FOR_KAFEI: + return sAnjuMsgScript_SchWaitingForKafei; + + case ANJU_SCH_WALKING_40: + return sAnjuMsgScript_80B5894C; + + case ANJU_SCH_WALKING_42: + case ANJU_SCH_WALKING_43: + case ANJU_SCH_WALKING_44: + case ANJU_SCH_WALKING_45: + return sAnjuMsgScript_80B58980; + + case ANJU_SCH_LAUNDRY_POOL_SIT: + this->msgEventFunc = EnAn_MsgEvent_LaundryPool; + return sAnjuMsgScript_SchLaundryPoolDefault; + + case ANJU_SCH_RECEPTIONIST_IDLE: + if (gSaveContext.save.day >= 2) { + return sAnjuMsgScript_Receptionist; + } + return sAnjuMsgScript_ReceptionistDay1; + + case ANJU_SCH_WAITING_CLOSING_TIME: + case ANJU_SCH_WALKING_47: + return sAnjuMsgScript_InnCloseTime; + + case ANJU_SCH_SWEEPING: + return sAnjuMsgScript_SchSweeping; + + case ANJU_SCH_MIDNIGHT_MEETING: + return sAnjuMsgScript_80B589FC; + + case ANJU_SCH_WALKING_48: + return sAnjuMsgScript_80B58944; + + case ANJU_SCH_WALKING_49: + if (player->transformation == PLAYER_FORM_HUMAN) { + return sAnjuMsgScript_80B58B88; + } + return sAnjuMsgScript_80B589FC; + + case ANJU_SCH_WALKING_52: + case ANJU_SCH_WALKING_53: + return sAnjuMsgScript_80B58994; + + default: + break; + } + + return NULL; +} + +// TODO: consider renaming this (and similar functions of other schedule actors) to `TryTalking` +s32 EnAn_CheckTalk(EnAn* this, PlayState* play) { + s32 ret = false; + + if ((this->stateFlags & SUBS_OFFER_MODE_MASK) && Actor_ProcessTalkRequest(&this->actor, &play->state)) { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK); + this->unk_3C4 = 0; + this->msgEventState = 0; + this->msgEventFunc = NULL; + this->actor.child = this->lookAtActor; + this->msgEventScript = EnAn_GetMsgEventScript(this, play); + + if ((this->scheduleResult == ANJU_SCH_WAITING_FOR_KAFEI) || + (this->scheduleResult == ANJU_SCH_LAUNDRY_POOL_SIT) || + (this->scheduleResult == ANJU_SCH_RECEPTIONIST_IDLE) || + (this->scheduleResult == ANJU_SCH_WAITING_CLOSING_TIME) || + (this->scheduleResult == ANJU_SCH_MIDNIGHT_MEETING) || (this->scheduleResult == ANJU_SCH_SWEEPING) || + (this->scheduleResult == ANJU_SCH_WALKING_40) || (this->scheduleResult == ANJU_SCH_WALKING_42) || + (this->scheduleResult == ANJU_SCH_WALKING_43) || (this->scheduleResult == ANJU_SCH_WALKING_44) || + (this->scheduleResult == ANJU_SCH_WALKING_45) || (this->scheduleResult == ANJU_SCH_WALKING_47) || + (this->scheduleResult == ANJU_SCH_WALKING_48) || (this->scheduleResult == ANJU_SCH_WALKING_49) || + (this->scheduleResult == ANJU_SCH_WALKING_52) || (this->scheduleResult == ANJU_SCH_WALKING_53)) { + this->stateFlags |= ENAN_STATE_ENGAGED; + } + + if ((this->scheduleResult == ANJU_SCH_LAUNDRY_POOL_SIT) && + CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ANJU_IN_LAUNDRY_POOL)) { + this->stateFlags &= ~ENAN_STATE_ENGAGED; + } + + this->actionFunc = EnAn_Talk; + ret = true; + } + + return ret; +} + +s32 EnAn_IsCouplesMaskCsPlaying(EnAn* this, PlayState* play) { + u16 scriptIndex = play->csCtx.scriptIndex; + s32 ret = false; + + if ((play->csCtx.state != CS_STATE_IDLE) && (play->sceneId == SCENE_YADOYA) && (gSaveContext.sceneLayer == 0) && + ((scriptIndex == 0) || (scriptIndex == 1))) { + if (!this->forceDraw) { + this->savedFaceIndex = ENAN_FACE_0; + this->faceIndex = ENAN_FACE_0; + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->eyeTimer = 8; + this->cueId = -1; + this->forceDraw = true; + this->drawMoonMask = false; + } + + ret = true; + } else if (this->forceDraw) { + this->forceDraw = false; + this->drawMoonMask = false; + this->unk_3C0 = true; + this->actor.room = play->roomCtx.curRoom.num; + this->actionFunc = EnAn_FollowSchedule; + } + + return ret; +} + +void EnAn_UpdateHeadRot(EnAn* this) { + Actor* lookAtActor; + Vec3f lookAtPos; + Vec3f pos; + Player* player; + + Math_Vec3f_Copy(&lookAtPos, &this->lookAtActor->world.pos); + Math_Vec3f_Copy(&pos, &this->actor.world.pos); + Math_ApproachS(&this->headRotY, Math_Vec3f_Yaw(&pos, &lookAtPos) - this->actor.shape.rot.y, 4, 0x2AA8); + + this->headRotY = CLAMP(this->headRotY, -0x1FFE, 0x1FFE); + + Math_Vec3f_Copy(&pos, &this->actor.focus.pos); + + lookAtActor = this->lookAtActor; + if (lookAtActor->id == ACTOR_PLAYER) { + player = (Player*)lookAtActor; + + lookAtPos.y = player->bodyPartsPos[PLAYER_BODYPART_HEAD].y + 3.0f; + } else { + Math_Vec3f_Copy(&lookAtPos, &lookAtActor->focus.pos); + } + + Math_ApproachS(&this->headRotZ, Math_Vec3f_Pitch(&pos, &lookAtPos), 4, 0x2AA8); + + this->headRotZ = CLAMP(this->headRotZ, -0x1554, 0x1554); +} + +void EnAn_UpdateAttention(EnAn* this) { + if (this->stateFlags & ENAN_STATE_ENGAGED) { + if ((this->lookAtActor != NULL) && (this->lookAtActor->update != NULL)) { + if (DECR(this->loseAttentionTimer) == 0) { + EnAn_UpdateHeadRot(this); + this->stateFlags &= ~ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_FACE_TARGET; + return; + } + } + } + + if (this->stateFlags & ENAN_STATE_FACE_TARGET) { + this->stateFlags &= ~ENAN_STATE_FACE_TARGET; + this->headRotZ = 0; + this->headRotY = 0; + this->loseAttentionTimer = 20; + return; + } + + if (DECR(this->loseAttentionTimer) == 0) { + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + } +} + +s32 EnAn_ChooseAnimAfterTalking(EnAn* this, PlayState* play) { + switch (this->scheduleResult) { + case ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN: + case ANJU_SCH_ATTEND_GORON: + case ANJU_SCH_RECEPTIONIST_IDLE: + case ANJU_SCH_WAITING_CLOSING_TIME: + case ANJU_SCH_MIDNIGHT_MEETING: + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE); + break; + + case ANJU_SCH_SWEEPING: + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_SWEEP); + this->stateFlags |= ENAN_STATE_DRAW_BROOM; + break; + + case ANJU_SCH_COOKING: + EnAn_ChangeAnim(this, play, ENAN_ANIM_COOK); + break; + + case ANJU_SCH_GIVE_LUNCH_TO_GRANNY: + EnAn_ChangeAnim(this, play, ENAN_ANIM_WAIT_WITH_TRAY); + break; + + case ANJU_SCH_WALKING_47: + case ANJU_SCH_WALKING_49: + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK); + break; + + case ANJU_SCH_WALKING_52: + case ANJU_SCH_WALKING_53: + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_WALK); + this->stateFlags |= ENAN_STATE_DRAW_BROOM; + break; + + default: + if (this->animIndex == ENAN_ANIM_WAIT_WITH_TRAY) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK_WITH_TRAY); + } + if (this->animIndex == ENAN_ANIM_UMBRELLA_IDLE) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_WALK); + } + if ((this->animIndex == ENAN_ANIM_IDLE) || (this->animIndex == ENAN_ANIM_IDLE_MORPH)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK2); + } + break; + } + + return 0; +} + +void EnAn_DialogueFunc_80B556F8(EnAn* this, PlayState* play) { + if (this->dialogueFuncState == 0) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_LOOK_UP_RELIEVED); + this->stateFlags &= ~ENAN_STATE_ENGAGED; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + this->dialogueFuncState++; + } else if ((this->dialogueFuncState == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE_MORPH); + this->stateFlags &= ~ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_ENGAGED; + this->dialogueFuncState++; + } +} + +void EnAn_DialogueFunc_80B557AC(EnAn* this, PlayState* play) { + if (this->dialogueFuncState == 0) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_BOW); + this->stateFlags &= ~ENAN_STATE_ENGAGED; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + this->dialogueFuncState++; + } else if ((this->dialogueFuncState == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE_MORPH); + this->stateFlags &= ~ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_ENGAGED; + this->dialogueFuncState++; + } +} + +void EnAn_DialogueFunc_80B55860(EnAn* this, PlayState* play) { + if (this->dialogueFuncState == 0) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_BOW_MORPH); + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + this->stateFlags &= ~ENAN_STATE_ENGAGED; + this->dialogueFuncState++; + } else if ((this->dialogueFuncState == 1) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE_MORPH); + this->stateFlags &= ~ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_ENGAGED; + this->dialogueFuncState++; + } +} + +s32 EnAn_HandleDialogue(EnAn* this, PlayState* play) { + Player* player = GET_PLAYER(play); + u16 textId = play->msgCtx.currentTextId; + + if (player->stateFlags1 & PLAYER_STATE1_40) { + this->stateFlags |= ENAN_STATE_TALKING; + + if (this->prevTextId != textId) { + switch (textId) { + case 0x28E5: // Ah! + EnAn_ChangeAnim(this, play, ENAN_ANIM_SURPRISED); + this->stateFlags &= ~ENAN_STATE_DRAW_BROOM; + break; + + case 0x28BA: // What's this? + case 0x28D1: // You are looking for Kafei? + EnAn_ChangeAnim(this, play, ENAN_ANIM_SURPRISED); + break; + + case 0x28AF: // Good night + case 0x28C1: // I need to hurry and cook for grandmother + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE); + break; + + case 0x28BC: // Where did you got that letter? + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE_MORPH); + break; + + case 0x28C6: // Don't talk to me or I'll drop this plate + EnAn_ChangeAnim(this, play, ENAN_ANIM_WAIT_WITH_TRAY); + break; + + case 0x28F5: // The town will be crushed by the moon. Forget about the letter + EnAn_ChangeAnim(this, play, ENAN_ANIM_SIT_MORPH); + break; + + case 0x28F7: // Everyone will be taking refuge by tomorrow + case 0x28F8: // We'll go to Romani Ranch to take refuge + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_IDLE); + break; + + case 0x28EB: // I'm afraid to meet him... + if (this->animIndex != ENAN_ANIM_UMBRELLA_CRY) { + this->stateFlags &= ~(ENAN_STATE_ENGAGED | ENAN_STATE_DRAW_KAFEIS_MASK); + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_CRY); + } + break; + + case 0x28A4: // That's good. We're totally booked right before the carnival + case 0x28A9: // You do have a reservation? + case 0x28BE: // From what postbox did you got that letter?! + case 0x28C0: // Not what I mean! + case 0x295E: // I need to know! + this->dialogueFunc = EnAn_DialogueFunc_80B556F8; + this->dialogueFuncState = 0; + break; + + case 0x28E6: // It's from Kafei + this->stateFlags &= ~ENAN_STATE_DRAW_BROOM; + this->dialogueFunc = EnAn_DialogueFunc_80B55860; + this->dialogueFuncState = 0; + break; + + case 0x1885: // It's 8:30 pm and the Inn is locking the door + case 0x28A0: // Welcome to the Inn. + case 0x28A3: // I'm sorry, there are no vacancies. We are always booked at the carnival + case 0x28A5: // Visit us again in the future + case 0x28B1: // I'm sorry, there are no vacancies + case 0x28D2: // I have a clue that will help find Kafei + case 0x28D9: // Please + case 0x28DC: // Thank you + case 0x28DE: // Mail it in the morning + this->dialogueFunc = EnAn_DialogueFunc_80B557AC; + this->dialogueFuncState = 0; + break; + + case 0x28A1: // Are you staying the night? + case 0x28A2: // You are staying the night!? + case 0x28A6: // Are you staying the night? Did I ask you the same earlier? + case 0x28A7: // Enjoy the carnival + case 0x28A8: // Did you have a reservation? + case 0x28AA: // One moment please + case 0x28AB: // I expected your arrival for afternoon. Your room is on the second floor + case 0x28AC: // Have you been to the plaza yet? They are putting up the carnival stuff + case 0x28AD: // Relax... + case 0x28AE: // doesn't exist + case 0x28B0: // It's hard to find one's way on the city, goro + case 0x28B2: // I should have a reservation-goro + case 0x28B3: // I do have your reservation. Your room is on the second floor + case 0x28B4: // The place is falling apart-goro + case 0x28B5: // I made a reservation. I'm [Player]-goro + case 0x28B6: // [Player]-goro? There's a reservation under a similar name, but it's taken + case 0x28B7: // Really-goro? I'll just sleep outside then-goro + case 0x28B8: // I'm sorry + case 0x28B9: // It's a hard world-goro + case 0x28BB: // I delivered this to you! + case 0x28BD: // From the postbox + case 0x28BF: // From somewhere + case 0x28C2: // I need to hurry! The afternoon guest will arrive soon + case 0x28C3: // Used to be a cafeteria + case 0x28C4: + case 0x28C5: // Mmm? + case 0x28C7: // Tortus, I've already had lunch + case 0x28C8: // I'm Anju! Tortus was my dad... + case 0x28C9: // I've already had lunch + case 0x28CA: // Please eat... + case 0x28CB: // I already ate lunch + case 0x28CC: // Don't eat my food then + case 0x28CD: // Phew + case 0x28CE: // Phew? + case 0x28CF: // Want me to read a story? + case 0x28D0: // That mask... You are looking for Kafei + case 0x28D3: // Come to our kitchen at 11:30 + case 0x28D4: // I'll find him myself + case 0x28D5: // I wonder where Kafei could have gone + case 0x28D6: // Nevermind! + case 0x28D7: // I'm sorry to bother you late at night + case 0x28D8: // I received a letter from Kafei + case 0x28DA: // Put my letter in a postbox + case 0x28DB: // Can I ask this to you? + case 0x28DD: // oesn't exis + case 0x28DF: // You won't take refuge? + case 0x28E0: // Today's weather + case 0x28E1: // I'll wait for him + case 0x28E2: // Did you see him? It's too late + case 0x28E3: // Did you see him? It's too early + case 0x28E4: // Did you meet him? + case 0x28E7: // What's that? + case 0x28E8: // Have you seen a man around here? + case 0x28E9: // He looks like this + case 0x28EA: // He disappeared a month ago + case 0x28EC: // Should I wait? + case 0x28ED: // You are looking for him too + case 0x28EE: // I came here to look for him myself + case 0x28EF: // What a ramshackle inn + case 0x28F0: // Everything is falling apart + case 0x28F1: // We are leaving in the evening for the ranch + case 0x28F2: // I wonder if Kafei is really at Cremia's + case 0x28F3: + case 0x28F4: // But he said in the letter he'll come back + case 0x28F6: // Mother thank you + default: + if (this->animIndex == ENAN_ANIM_WALK_WITH_TRAY) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_WAIT_WITH_TRAY); + } + if (this->animIndex == ENAN_ANIM_UMBRELLA_WALK) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_IDLE); + } + if ((this->animIndex == ENAN_ANIM_BROOM_WALK) || (this->animIndex == ENAN_ANIM_BROOM_SWEEP)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_IDLE); + } + if ((this->animIndex == ENAN_ANIM_WALK) || (this->animIndex == ENAN_ANIM_WALK2)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE_MORPH); + } + break; + } + + switch (textId) { + case 0x28F5: // The town will be crushed by the moon. Forget about the letter + this->savedFaceIndex = ENAN_FACE_0; + FALLTHROUGH; + case 0x28A5: // Visit us again in the future + case 0x28AA: // One moment please + case 0x28F8: // We'll go to Romani Ranch to take refuge + this->faceIndex = ENAN_FACE_0; + this->eyeTimer = 8; + break; + + case 0x1885: // It's 8:30 pm and the Inn is locking the door + case 0x28A0: // Welcome to the Inn. + case 0x28A6: // Are you staying the night? Did I ask you the same earlier? + case 0x28AF: // Good night + case 0x28C1: // I need to hurry and cook for grandmother + this->faceIndex = ENAN_FACE_3; + this->eyeTimer = 8; + break; + + case 0x28A2: // You are staying the night!? + case 0x28B3: // I do have your reservation. Your room is on the second floor + case 0x28B6: // [Player]-goro? There's a reservation under a similar name, but it's taken + case 0x28BA: // What's this? + case 0x28BE: // From what postbox did you got that letter?! + case 0x28CE: // Phew? + case 0x28D0: // That mask... You are looking for Kafei + case 0x28D6: // Nevermind! + case 0x28E5: // Ah! + case 0x28E7: // What's that? + case 0x28ED: // You are looking for him too + this->faceIndex = ENAN_FACE_1; + this->eyeTimer = 8; + break; + + case 0x28AD: // Relax... + this->faceIndex = ENAN_FACE_8; + this->eyeTimer = 8; + break; + + case 0x28C0: // Not what I mean! + case 0x28D7: // I'm sorry to bother you late at night + case 0x28DE: // Mail it in the morning + this->faceIndex = ENAN_FACE_2; + this->eyeTimer = 8; + break; + + case 0x28E6: // It's from Kafei + case 0x28F7: // Everyone will be taking refuge by tomorrow + this->faceIndex = ENAN_FACE_6; + this->eyeTimer = 8; + break; + + case 0x28A3: // I'm sorry, there are no vacancies. We are always booked at the carnival + case 0x28B1: // I'm sorry, there are no vacancies + case 0x28B8: // I'm sorry + case 0x28C6: // Don't talk to me or I'll drop this plate + case 0x28CA: // Please eat... + case 0x28CC: // Don't eat my food then + case 0x28D5: // I wonder where Kafei could have gone + case 0x28E2: // Did you see him? It's too late + case 0x28E3: // Did you see him? It's too early + case 0x28E4: // Did you meet him? + this->faceIndex = ENAN_FACE_4; + this->eyeTimer = 8; + break; + + case 0x28EC: // Should I wait? + this->savedFaceIndex = ENAN_FACE_5; + FALLTHROUGH; + case 0x28DC: // Thank you + case 0x28EB: // I'm afraid to meet him... + case 0x28F2: // I wonder if Kafei is really at Cremia's + case 0x28F9: // Perhaps I was wrong... + this->faceIndex = ENAN_FACE_5; + this->eyeTimer = 8; + break; + + case 0x28F6: // Mother thank you + this->faceIndex = ENAN_FACE_9; + this->eyeTimer = 8; + break; + + case 0x28A4: // That's good. We're totally booked right before the carnival + case 0x28A9: // You do have a reservation? + this->faceIndex = ENAN_FACE_7; + this->eyeTimer = 8; + break; + + default: + break; + } + } + + this->prevTextId = textId; + } else if (this->stateFlags & ENAN_STATE_TALKING) { + // Player stopped talking with Anju + + this->dialogueFunc = NULL; + this->prevTextId = 0; + this->stateFlags &= ~ENAN_STATE_TALKING; + this->faceIndex = this->savedFaceIndex; + this->eyeTimer = 4; + EnAn_ChooseAnimAfterTalking(this, play); + } + + if (this->dialogueFunc != NULL) { + this->dialogueFunc(this, play); + } + + return 0; +} + +Actor* EnAn_FindLookAtActor(EnAn* this, PlayState* play) { + Actor* actor; + + switch (this->scheduleResult) { + case ANJU_SCH_GIVE_LUNCH_TO_GRANNY: + actor = EnAn_FindActor(this, play, ACTORCAT_NPC, ACTOR_EN_NB); + break; + + case ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN: + actor = EnAn_FindActor(this, play, ACTORCAT_NPC, ACTOR_EN_PM); + break; + + case ANJU_SCH_ATTEND_GORON: + actor = EnAn_FindActor(this, play, ACTORCAT_NPC, ACTOR_EN_IG); + break; + + default: + actor = &GET_PLAYER(play)->actor; + break; + } + + return actor; +} + +// Known uses: looks for En_Ig, En_Nb, En_Pm +s32 func_80B55D98(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput, u8 actorCategory, s16 actorId) { + u8 pathIndex = ENAN_GET_PATH_INDEX(&this->actor); + Vec3s* points; + Vec3f sp3C; + Vec3f sp30; + Actor* actor; + s32 limit; + s32 ret = false; + + actor = EnAn_FindActor(this, play, actorCategory, actorId); + this->timePath = NULL; + + limit = sSearchTimePathLimit[scheduleOutput->result]; + if (limit >= 0) { + this->timePath = SubS_GetAdditionalPath(play, pathIndex, limit); + } + + if ((actor != NULL) && (actor->update != NULL)) { + if (this->timePath != NULL) { + points = Lib_SegmentedToVirtual(this->timePath->points); + Math_Vec3s_ToVec3f(&sp3C, &points[this->timePath->count - 2]); + Math_Vec3s_ToVec3f(&sp30, &points[this->timePath->count - 1]); + this->actor.shape.shadowDraw = NULL; + this->actor.world.rot.y = Math_Vec3f_Yaw(&sp3C, &sp30); + Math_Vec3f_Copy(&this->actor.world.pos, &sp30); + ret = true; + } + } + + return ret; +} + +s32 EnAn_IsFacingAndNearPlayer(EnAn* this) { + s32 ret = false; + + // TODO: why is the range variable? + if (Actor_IsFacingAndNearPlayer(&this->actor, this->unk_3BC ? 150.0f : 100.0f, 0x2800)) { + ret = true; + } + + if (DECR(this->unk_386) == 0) { + this->unk_3BC ^= 1; + this->unk_386 = Rand_S16Offset(60, 60); // 3~6 seconds + } + + return ret; +} + +s32 func_80B55F8C(PlayState* play) { + Player* player = GET_PLAYER(play); + s32 ret = false; + + if ((Player_GetMask(play) == PLAYER_MASK_KAFEIS_MASK) && + CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING)) { + ret = true; + } else if ((player->transformation == PLAYER_FORM_HUMAN) && + CHECK_WEEKEVENTREG(WEEKEVENTREG_PROMISED_MIDNIGHT_MEETING)) { + ret = true; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_ReceiveLetterFromPostman(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + s32 ret = false; + + if (func_80B55D98(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_PM)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + ret = true; + + this->stateFlags |= ENAN_STATE_ENGAGED | ENAN_STATE_UPDATE_EYES; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_AttendGoron(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + s32 ret = false; + + if (func_80B55D98(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_IG)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + ret = true; + + this->stateFlags |= ENAN_STATE_ENGAGED | ENAN_STATE_UPDATE_EYES; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_GiveLunchToGranny(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + s32 ret = false; + + if (func_80B55D98(this, play, scheduleOutput, ACTORCAT_NPC, ACTOR_EN_NB)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_WAIT_WITH_TRAY); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + ret = true; + + this->stateFlags |= ENAN_STATE_ENGAGED | ENAN_STATE_UPDATE_EYES; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION | ENAN_STATE_DRAW_TRAY; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_Door(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + u16 now = SCHEDULE_TIME_NOW; + u8 pathIndex = ENAN_GET_PATH_INDEX(&this->actor); + EnDoor* door; + Vec3s* points; + Vec3f firstPos; + Vec3f secondPos; + s32 limit; + s32 ret = false; + + this->timePath = NULL; + door = EnAn_FindDoor(play, scheduleOutput->result); + + limit = sSearchTimePathLimit[scheduleOutput->result]; + if (limit >= 0) { + this->timePath = SubS_GetAdditionalPath(play, pathIndex, limit); + } + + if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) { + if (this->timePath != NULL) { + points = Lib_SegmentedToVirtual(this->timePath->points); + Math_Vec3s_ToVec3f(&firstPos, &points[0]); + Math_Vec3s_ToVec3f(&secondPos, &points[1]); + + Math_Vec3f_Copy(&this->doorEntrancePos, &firstPos); + Math_Vec3f_Copy(&this->doorExitPos, &secondPos); + this->actor.world.rot.y = Math_Vec3f_Yaw(&firstPos, &secondPos); + Math_Vec3f_Copy(&this->actor.world.pos, &firstPos); + + if (ABS_ALT(BINANG_SUB(this->actor.world.rot.y, door->knobDoor.dyna.actor.shape.rot.y)) <= 0x4000) { + this->doorOpenTimer = -75; + } else { + this->doorOpenTimer = 75; + } + + this->doorTimeTotalDiff = scheduleOutput->time1 - scheduleOutput->time0; + this->schState.doorTimeProgress = now - scheduleOutput->time0; + + switch (scheduleOutput->result) { + case ANJU_SCH_DOOR_27: + case ANJU_SCH_DOOR_28: + case ANJU_SCH_DOOR_32: + case ANJU_SCH_DOOR_33: + case ANJU_SCH_DOOR_34: + case ANJU_SCH_DOOR_35: + case ANJU_SCH_DOOR_37: + case ANJU_SCH_DOOR_38: + this->savedFaceIndex = ENAN_FACE_2; + this->faceIndex = ENAN_FACE_2; + this->eyeTimer = 8; + break; + + default: + break; + } + + switch (scheduleOutput->result) { + case ANJU_SCH_DOOR_26: + case ANJU_SCH_DOOR_27: + case ANJU_SCH_DOOR_28: + this->stateFlags |= ENAN_STATE_DRAW_TRAY | ENAN_STATE_UPDATE_EYES; + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK_WITH_TRAY); + break; + + case ANJU_SCH_DOOR_36: + case ANJU_SCH_DOOR_39: + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_DRAW_BROOM; + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_WALK); + break; + + default: + this->stateFlags |= ENAN_STATE_UPDATE_EYES; + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK); + break; + } + + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + this->actor.gravity = 0.0f; + ret = true; + } + } + + return ret; +} + +s32 EnAn_ProcessSchedule_Walking(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + u16 now = SCHEDULE_TIME_NOW; + u16 startTime; + u8 pathIndex = ENAN_GET_PATH_INDEX(&this->actor); + s32 pad; + s32 ret = false; + s32 limit; + + this->timePath = NULL; + + limit = sSearchTimePathLimit[scheduleOutput->result]; + if (limit >= 0) { + this->timePath = SubS_GetAdditionalPath(play, pathIndex, limit); + } + + if ((this->timePath != NULL) && (this->timePath->count < 3)) { + this->timePath = NULL; + } + + if (this->timePath != NULL) { + if ((this->scheduleResult < ANJU_SCH_WALKING_40) && (this->scheduleResult != ANJU_SCH_NONE) && + (this->timePathTimeSpeed >= 0)) { + startTime = now; + } else { + startTime = scheduleOutput->time0; + } + + if (scheduleOutput->time1 < startTime) { + this->timePathTotalTime = (startTime - scheduleOutput->time1) + 0xFFFF; + } else { + this->timePathTotalTime = scheduleOutput->time1 - startTime; + } + + this->timePathElapsedTime = now - startTime; + startTime = (this->timePath->count - 2); + this->timePathWaypointTime = this->timePathTotalTime / startTime; + + this->timePathWaypoint = (this->timePathElapsedTime / this->timePathWaypointTime) + 2; + this->stateFlags &= ~ENAN_STATE_8; + this->stateFlags &= ~ENAN_STATE_REACHED_PATH_END; + + switch (scheduleOutput->result) { + case ANJU_SCH_WALKING_44: + case ANJU_SCH_WALKING_45: + case ANJU_SCH_WALKING_50: + case ANJU_SCH_WALKING_51: + case ANJU_SCH_WALKING_54: + case ANJU_SCH_WALKING_55: + case ANJU_SCH_WALKING_56: + case ANJU_SCH_WALKING_57: + case ANJU_SCH_WALKING_58: + case ANJU_SCH_WALKING_59: + case ANJU_SCH_WALKING_60: + case ANJU_SCH_WALKING_61: + case ANJU_SCH_WALKING_62: + case ANJU_SCH_WALKING_63: + this->savedFaceIndex = ENAN_FACE_2; + this->faceIndex = ENAN_FACE_2; + this->eyeTimer = 8; + break; + + default: + break; + } + + switch (scheduleOutput->result) { + case ANJU_SCH_WALKING_42: + case ANJU_SCH_WALKING_43: + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + FALLTHROUGH; + case ANJU_SCH_WALKING_44: + case ANJU_SCH_WALKING_45: + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK_WITH_TRAY); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_DRAW_TRAY; + break; + + case ANJU_SCH_WALKING_52: + case ANJU_SCH_WALKING_53: + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_WALK); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_DRAW_BROOM; + break; + + case ANJU_SCH_WALKING_50: + case ANJU_SCH_WALKING_51: + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + break; + + case ANJU_SCH_WALKING_54: + case ANJU_SCH_WALKING_55: + case ANJU_SCH_WALKING_56: + case ANJU_SCH_WALKING_57: + case ANJU_SCH_WALKING_58: + case ANJU_SCH_WALKING_59: + case ANJU_SCH_WALKING_60: + case ANJU_SCH_WALKING_61: + case ANJU_SCH_WALKING_62: + case ANJU_SCH_WALKING_63: + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_WALK); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_DRAW_UMBRELLA; + break; + + case ANJU_SCH_WALKING_40: + case ANJU_SCH_WALKING_47: + case ANJU_SCH_WALKING_48: + case ANJU_SCH_WALKING_49: + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + FALLTHROUGH; + default: + EnAn_ChangeAnim(this, play, ENAN_ANIM_WALK); + break; + } + + ret = true; + this->actor.gravity = -1.0f; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_Sweeping(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + u8 pathIndex = ENAN_GET_PATH_INDEX(&this->actor); + Vec3f firstPos; + Vec3f secondPos; + Vec3s* points; + s32 limit; + s32 ret = false; + + this->timePath = NULL; + + limit = sSearchTimePathLimit[scheduleOutput->result]; + if (limit >= 0) { + this->timePath = SubS_GetAdditionalPath(play, pathIndex, limit); + } + + if ((this->timePath != NULL) && (this->timePath->count >= 2)) { + points = Lib_SegmentedToVirtual(this->timePath->points); + Math_Vec3s_ToVec3f(&firstPos, &points[0]); + Math_Vec3s_ToVec3f(&secondPos, &points[1]); + + this->actor.world.rot.y = Math_Vec3f_Yaw(&firstPos, &secondPos); + Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot); + Math_Vec3f_Copy(&this->actor.world.pos, &firstPos); + Math_Vec3f_Copy(&this->actor.prevPos, &firstPos); + + if (scheduleOutput->result == ANJU_SCH_SWEEPING) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_BROOM_SWEEP); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_DRAW_BROOM; + } + + ret = true; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_80B56880(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + u8 pathIndex = ENAN_GET_PATH_INDEX(&this->actor); + Vec3f lastPos; + Vec3f penultimatePos; + Vec3s* points; + s32 limit; + s32 ret = false; + + this->timePath = NULL; + limit = sSearchTimePathLimit[scheduleOutput->result]; + if (limit >= 0) { + this->timePath = SubS_GetAdditionalPath(play, pathIndex, limit); + } + + if ((this->timePath != NULL) && (this->timePath->count >= 2)) { + points = Lib_SegmentedToVirtual(this->timePath->points); + Math_Vec3s_ToVec3f(&lastPos, &points[this->timePath->count - 1]); + Math_Vec3s_ToVec3f(&penultimatePos, &points[this->timePath->count - 2]); + + this->actor.world.rot.y = Math_Vec3f_Yaw(&penultimatePos, &lastPos); + + Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot); + Math_Vec3s_Copy(&this->actor.home.rot, &this->actor.world.rot); + Math_Vec3f_Copy(&this->actor.world.pos, &lastPos); + Math_Vec3f_Copy(&this->actor.prevPos, &lastPos); + + switch (scheduleOutput->result) { + case ANJU_SCH_WAITING_CLOSING_TIME: + this->actor.world.rot.y += 0x7FF8; + FALLTHROUGH; + case ANJU_SCH_RECEPTIONIST_IDLE: + case ANJU_SCH_MIDNIGHT_MEETING: + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + this->schState.followScheduleState = 0; + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + if (scheduleOutput->result == ANJU_SCH_RECEPTIONIST_IDLE) { + this->offerRange = 70.0f; + } + break; + + case ANJU_SCH_LAUNDRY_POOL_SIT: + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_DRAW_UMBRELLA; + + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_TALKED_ANJU_IN_LAUNDRY_POOL)) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_CRY); + this->stateFlags |= ENAN_STATE_IGNORE_GRAVITY; + this->actor.world.rot.y += 0x7FF8; + this->actor.shape.rot.y = this->actor.world.rot.y; + this->schState.laundryPoolState = 4; + } else { + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_WALK); + this->schState.laundryPoolState = 0; + } + + this->savedFaceIndex = ENAN_FACE_2; + this->faceIndex = ENAN_FACE_2; + this->eyeTimer = 8; + break; + + case ANJU_SCH_COOKING: + EnAn_ChangeAnim(this, play, ENAN_ANIM_COOK); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_DRAW_CHOPSTICKS; + break; + + default: + break; + } + + ret = true; + } + + return ret; +} + +s32 EnAn_ProcessSchedule_Ranch(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + static Vec3f D_80B58E7C = { 905.0f, 260.0f, -64.0f }; + static Vec3s D_80B58E88 = { 0, 0, 0 }; + s32 pad; + + Math_Vec3f_Copy(&this->actor.world.pos, &D_80B58E7C); + Math_Vec3s_Copy(&this->actor.shape.rot, &D_80B58E88); + Math_Vec3s_Copy(&this->actor.world.rot, &this->actor.shape.rot); + + if (scheduleOutput->result == ANJU_SCH_RANCH) { + EnAn_ChangeAnim(this, play, ENAN_ANIM_SITTING_IN_DISBELIEF); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_IGNORE_GRAVITY; + + this->savedFaceIndex = ENAN_FACE_5; + this->faceIndex = ENAN_FACE_5; + this->eyeTimer = 8; + } + + return true; +} + +s32 EnAn_ProcessSchedule_StaffRoom(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + static Vec3f D_80B58E90 = { -508.0f, 210.0f, -162.0f }; + static Vec3s D_80B58E9C = { 0, 0x3FFC, 0 }; + s32 pad; + + Math_Vec3f_Copy(&this->actor.world.pos, &D_80B58E90); + Math_Vec3s_Copy(&this->actor.shape.rot, &D_80B58E9C); + Math_Vec3s_Copy(&this->actor.world.rot, &this->actor.shape.rot); + + switch (scheduleOutput->result) { + case ANJU_SCH_WAITING_FOR_KAFEI: + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + EnAn_ChangeAnim(this, play, ENAN_ANIM_SIT); + break; + + case ANJU_SCH_TALKING_WITH_MOM: + EnAn_ChangeAnim(this, play, ENAN_ANIM_SITTING_IN_DISBELIEF); + this->savedFaceIndex = ENAN_FACE_5; + this->faceIndex = ENAN_FACE_5; + this->eyeTimer = 8; + break; + + default: + break; + } + + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + this->stateFlags |= ENAN_STATE_IGNORE_GRAVITY; + + this->actor.gravity = 0.0f; + return true; +} + +s32 EnAn_ProcessSchedule_WithKafei(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + static Vec3s D_80B58EA4 = { 0, -0x2AAD, 0 }; + s32 pad; + + Math_Vec3s_Copy(&this->actor.shape.rot, &D_80B58EA4); + Math_Vec3s_Copy(&this->actor.world.rot, &this->actor.shape.rot); + EnAn_ChangeAnim(this, play, ENAN_ANIM_HOLD_HANDS); + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + this->stateFlags |= ENAN_STATE_UPDATE_EYES | ENAN_STATE_LOST_ATTENTION; + + return true; +} + +s32 EnAn_ProcessScheduleOutput(EnAn* this, PlayState* play, ScheduleOutput* scheduleOutput) { + s32 ret; + + this->actor.flags |= ACTOR_FLAG_TARGETABLE; + this->actor.targetMode = TARGET_MODE_6; + this->stateFlags = 0; + this->savedFaceIndex = ENAN_FACE_0; + this->faceIndex = ENAN_FACE_0; + this->eyeTimer = 8; + this->offerRange = 40.0f; + + switch (scheduleOutput->result) { + case ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN: + ret = EnAn_ProcessSchedule_ReceiveLetterFromPostman(this, play, scheduleOutput); + break; + + case ANJU_SCH_ATTEND_GORON: + ret = EnAn_ProcessSchedule_AttendGoron(this, play, scheduleOutput); + break; + + case ANJU_SCH_GIVE_LUNCH_TO_GRANNY: + ret = EnAn_ProcessSchedule_GiveLunchToGranny(this, play, scheduleOutput); + break; + + case ANJU_SCH_RANCH: + ret = EnAn_ProcessSchedule_Ranch(this, play, scheduleOutput); + break; + + case ANJU_SCH_WAITING_FOR_KAFEI: + case ANJU_SCH_TALKING_WITH_MOM: + ret = EnAn_ProcessSchedule_StaffRoom(this, play, scheduleOutput); + break; + + case ANJU_SCH_LAUNDRY_POOL_SIT: + case ANJU_SCH_COOKING: + case ANJU_SCH_RECEPTIONIST_IDLE: + case ANJU_SCH_WAITING_CLOSING_TIME: + case ANJU_SCH_MIDNIGHT_MEETING: + ret = EnAn_ProcessSchedule_80B56880(this, play, scheduleOutput); + break; + + case ANJU_SCH_SWEEPING: + ret = EnAn_ProcessSchedule_Sweeping(this, play, scheduleOutput); + break; + + case ANJU_SCH_WITH_KAFEI: + ret = EnAn_ProcessSchedule_WithKafei(this, play, scheduleOutput); + break; + + case ANJU_SCH_DOOR_26: + case ANJU_SCH_DOOR_27: + case ANJU_SCH_DOOR_28: + case ANJU_SCH_DOOR_29: + case ANJU_SCH_DOOR_30: + case ANJU_SCH_DOOR_31: + case ANJU_SCH_DOOR_32: + case ANJU_SCH_DOOR_33: + case ANJU_SCH_DOOR_34: + case ANJU_SCH_DOOR_35: + case ANJU_SCH_DOOR_36: + case ANJU_SCH_DOOR_37: + case ANJU_SCH_DOOR_38: + case ANJU_SCH_DOOR_39: + ret = EnAn_ProcessSchedule_Door(this, play, scheduleOutput); + break; + + case ANJU_SCH_WALKING_40: + case ANJU_SCH_WALKING_42: + case ANJU_SCH_WALKING_43: + case ANJU_SCH_WALKING_44: + case ANJU_SCH_WALKING_45: + case ANJU_SCH_WALKING_46: + case ANJU_SCH_WALKING_47: + case ANJU_SCH_WALKING_48: + case ANJU_SCH_WALKING_49: + case ANJU_SCH_WALKING_50: + case ANJU_SCH_WALKING_51: + case ANJU_SCH_WALKING_52: + case ANJU_SCH_WALKING_53: + case ANJU_SCH_WALKING_54: + case ANJU_SCH_WALKING_55: + case ANJU_SCH_WALKING_56: + case ANJU_SCH_WALKING_57: + case ANJU_SCH_WALKING_58: + case ANJU_SCH_WALKING_59: + case ANJU_SCH_WALKING_60: + case ANJU_SCH_WALKING_61: + case ANJU_SCH_WALKING_62: + case ANJU_SCH_WALKING_63: + ret = EnAn_ProcessSchedule_Walking(this, play, scheduleOutput); + break; + + default: + ret = false; + break; + } + + return ret; +} + +/* Start of HandleShedule functions */ + +// RotateTowardsLookAtActor? +s32 EnAn_HandleSch_InteractActor(EnAn* this, PlayState* play) { + Vec3f lookAtActorPos; + Vec3f pos; + + if ((this->lookAtActor != NULL) && (this->lookAtActor->update != NULL)) { + Math_Vec3f_Copy(&lookAtActorPos, &this->lookAtActor->world.pos); + Math_Vec3f_Copy(&pos, &this->actor.world.pos); + this->actor.world.rot.y = Math_Vec3f_Yaw(&pos, &lookAtActorPos); + } + + return true; +} + +s32 EnAn_HandleSch_Door(EnAn* this, PlayState* play) { + EnDoor* door = EnAn_FindDoor(play, this->scheduleResult); + Vec3f sp38; + f32 distance; + s32 pad; + + if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) { + if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) { + // Tell the door actor to be open while passing through it and which orientation + if ((this->schState.doorTimeProgress / (f32)this->doorTimeTotalDiff) <= 0.9f) { + door->openTimer = this->doorOpenTimer; + } else { + door->openTimer = 0; + } + } + + this->schState.doorTimeProgress = CLAMP(this->schState.doorTimeProgress, 0, this->doorTimeTotalDiff); + distance = Math_Vec3f_DistXZ(&this->doorEntrancePos, &this->doorExitPos) / this->doorTimeTotalDiff; + + sp38.x = 0.0f; + sp38.y = 0.0f; + sp38.z = this->schState.doorTimeProgress * distance; + + Lib_Vec3f_TranslateAndRotateY(&this->doorEntrancePos, this->actor.world.rot.y, &sp38, &this->actor.world.pos); + + this->schState.doorTimeProgress += this->timePathTimeSpeed; + if (Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) { + Actor_PlaySfx(&this->actor, NA_SE_EV_PIRATE_WALK); + } + } + + return false; +} + +s32 EnAn_HandleSch_FollowTimePath(EnAn* this, PlayState* play) { + f32 knots[265]; + Vec3f worldPos; + Vec3f sp64; + Vec3f sp58; + s32 timePathElapsedTime; + s32 timePathWaypoint; + s32 pad; + + timePathWaypoint = 0; + timePathElapsedTime = 0; + SubS_TimePathing_FillKnots(knots, SUBS_TIME_PATHING_ORDER, this->timePath->count + SUBS_TIME_PATHING_ORDER); + + if (!(this->stateFlags & ENAN_STATE_8)) { + sp58 = gZeroVec3f; + SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime, + this->timePathWaypointTime, this->timePathTotalTime, &this->timePathWaypoint, knots, + &sp58, this->timePathTimeSpeed); + SubS_TimePathing_ComputeInitialY(play, this->timePath, this->timePathWaypoint, &sp58); + this->actor.world.pos.y = sp58.y; + this->stateFlags |= ENAN_STATE_8; + } else { + sp58 = this->timePathTargetPos; + } + + this->actor.world.pos.x = sp58.x; + this->actor.world.pos.z = sp58.z; + + if (SubS_InCsMode(play)) { + timePathElapsedTime = this->timePathElapsedTime; + timePathWaypoint = this->timePathWaypoint; + sp58 = this->actor.world.pos; + } + this->timePathTargetPos = gZeroVec3f; + + if (SubS_TimePathing_Update(this->timePath, &this->timePathProgress, &this->timePathElapsedTime, + this->timePathWaypointTime, this->timePathTotalTime, &this->timePathWaypoint, knots, + &this->timePathTargetPos, this->timePathTimeSpeed)) { + this->stateFlags |= ENAN_STATE_REACHED_PATH_END; + } else { + worldPos = this->actor.world.pos; + sp64 = this->timePathTargetPos; + this->actor.world.rot.y = Math_Vec3f_Yaw(&worldPos, &sp64); + } + + if (SubS_InCsMode(play)) { + this->timePathElapsedTime = timePathElapsedTime; + this->timePathWaypoint = timePathWaypoint; + this->timePathTargetPos = sp58; + } else if (Animation_OnFrame(&this->skelAnime, 3.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) { + Actor_PlaySfx(&this->actor, NA_SE_EV_PIRATE_WALK); + } + + return false; +} + +s32 EnAn_HandleSch_80B572D4(EnAn* this, PlayState* play) { + switch (this->scheduleResult) { + case ANJU_SCH_MIDNIGHT_MEETING: + if (func_80B55F8C(play) && EnAn_IsFacingAndNearPlayer(this)) { + this->stateFlags |= ENAN_STATE_ENGAGED; + } else { + this->stateFlags &= ~ENAN_STATE_ENGAGED; + } + break; + + case ANJU_SCH_WAITING_FOR_KAFEI: + if (EnAn_IsFacingAndNearPlayer(this)) { + this->stateFlags |= ENAN_STATE_ENGAGED; + } else { + this->stateFlags &= ~ENAN_STATE_ENGAGED; + } + break; + + case ANJU_SCH_RECEPTIONIST_IDLE: + case ANJU_SCH_WAITING_CLOSING_TIME: + if (EnAn_IsFacingAndNearPlayer(this)) { + this->stateFlags |= ENAN_STATE_ENGAGED; + } else { + this->stateFlags &= ~ENAN_STATE_ENGAGED; + } + break; + + case ANJU_SCH_SWEEPING: + if (Animation_OnFrame(&this->skelAnime, 6.0f) && (this->animIndex == ENAN_ANIM_BROOM_SWEEP)) { + Actor_PlaySfx(&this->actor, NA_SE_EV_SWEEP); + } + break; + + default: + break; + } + + return 0; +} + +s32 EnAn_HandleSch_LaundryPool(EnAn* this, PlayState* play) { + s16 worldRot; + s16 shapeRot; + + switch (this->schState.laundryPoolState) { + case 0x0: + this->actor.world.rot.y += 0x7FF8; + this->schState.laundryPoolState++; + break; + + case 0x1: + worldRot = (this->actor.world.rot.y / 0xB6) * 0xB6; + shapeRot = (this->actor.shape.rot.y / 0xB6) * 0xB6; + if (worldRot == shapeRot) { + Math_Vec3s_Copy(&this->actor.shape.rot, &this->actor.world.rot); + EnAn_ChangeAnim(this, play, ENAN_ANIM_UMBRELLA_SIT); + this->stateFlags |= ENAN_STATE_IGNORE_GRAVITY; + this->schState.laundryPoolState++; + } + break; + + case 0x2: + if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + this->schState.laundryPoolState++; + } + break; + + case 0x3: + if (ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, this->actor.shape.rot.y)) < 0x3000) { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + } else { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK); + } + break; + + case 0x4: + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + this->schState.laundryPoolState++; + break; + + default: + break; + } + + return 0; +} + +s32 EnAn_HandleSch_WaitingForKafei(EnAn* this, PlayState* play) { + s32 yRot = this->actor.shape.rot.y; + s16 yaw = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, yRot)); + + if (yaw < 0x4000) { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + } else { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK); + } + + if (EnAn_IsFacingAndNearPlayer(this)) { + this->stateFlags |= ENAN_STATE_ENGAGED; + } else { + this->stateFlags &= ~ENAN_STATE_ENGAGED; + } + + return 1; +} + +s32 EnAn_HandleSch_WithKafei(EnAn* this, PlayState* play) { + s16 yRot = BINANG_ADD(this->actor.shape.rot.y, 0x3000); + s16 yaw = ABS_ALT(BINANG_SUB(this->actor.yawTowardsPlayer, yRot)); + + if (yaw < 0x3000) { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + } else { + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_NONE, SUBS_OFFER_MODE_MASK); + } + + this->stateFlags &= ~ENAN_STATE_ENGAGED; + return 1; +} + +/* End of HandleShedule functions */ + +void EnAn_HandleSchedule(EnAn* this, PlayState* play) { + switch (this->scheduleResult) { + case ANJU_SCH_RECEIVE_LETTER_FROM_POSTMAN: + case ANJU_SCH_ATTEND_GORON: + case ANJU_SCH_GIVE_LUNCH_TO_GRANNY: + EnAn_HandleSch_InteractActor(this, play); + break; + + case ANJU_SCH_LAUNDRY_POOL_SIT: + EnAn_HandleSch_LaundryPool(this, play); + break; + + case ANJU_SCH_WAITING_FOR_KAFEI: + EnAn_HandleSch_WaitingForKafei(this, play); + break; + + case ANJU_SCH_WITH_KAFEI: + EnAn_HandleSch_WithKafei(this, play); + break; + + case ANJU_SCH_RANCH: + case ANJU_SCH_COOKING: + case ANJU_SCH_RECEPTIONIST_IDLE: + case ANJU_SCH_WAITING_CLOSING_TIME: + case ANJU_SCH_SWEEPING: + case ANJU_SCH_TALKING_WITH_MOM: + EnAn_HandleSch_80B572D4(this, play); + break; + + case ANJU_SCH_MIDNIGHT_MEETING: + EnAn_HandleSch_80B572D4(this, play); + break; + + case ANJU_SCH_DOOR_26: + case ANJU_SCH_DOOR_27: + case ANJU_SCH_DOOR_28: + case ANJU_SCH_DOOR_29: + case ANJU_SCH_DOOR_30: + case ANJU_SCH_DOOR_31: + case ANJU_SCH_DOOR_32: + case ANJU_SCH_DOOR_33: + case ANJU_SCH_DOOR_34: + case ANJU_SCH_DOOR_35: + case ANJU_SCH_DOOR_36: + case ANJU_SCH_DOOR_37: + case ANJU_SCH_DOOR_38: + case ANJU_SCH_DOOR_39: + EnAn_HandleSch_Door(this, play); + break; + + case ANJU_SCH_WALKING_40: + case ANJU_SCH_WALKING_42: + case ANJU_SCH_WALKING_43: + case ANJU_SCH_WALKING_44: + case ANJU_SCH_WALKING_45: + case ANJU_SCH_WALKING_46: + case ANJU_SCH_WALKING_47: + case ANJU_SCH_WALKING_48: + case ANJU_SCH_WALKING_49: + case ANJU_SCH_WALKING_50: + case ANJU_SCH_WALKING_51: + case ANJU_SCH_WALKING_52: + case ANJU_SCH_WALKING_53: + case ANJU_SCH_WALKING_54: + case ANJU_SCH_WALKING_55: + case ANJU_SCH_WALKING_56: + case ANJU_SCH_WALKING_57: + case ANJU_SCH_WALKING_58: + case ANJU_SCH_WALKING_59: + case ANJU_SCH_WALKING_60: + case ANJU_SCH_WALKING_61: + case ANJU_SCH_WALKING_62: + case ANJU_SCH_WALKING_63: + EnAn_HandleSch_FollowTimePath(this, play); + break; + + default: + break; + } + + Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8); +} + +void EnAn_FinishInit(EnAn* this, PlayState* play) { + ActorShape_Init(&this->actor.shape, 0.0f, NULL, 14.0f); + SkelAnime_InitFlex(play, &this->skelAnime, &gAnju1Skel, NULL, this->jointTable, this->morphTable, ANJU1_LIMB_MAX); + + this->animIndex = ENAN_ANIM_NONE; + EnAn_ChangeAnim(this, play, ENAN_ANIM_IDLE); + Collider_InitAndSetCylinder(play, &this->collider, &this->actor, &sCylinderInit); + CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit); + + if (ENAN_GET_8000(&this->actor)) { + this->unk_3C0 = true; + } + + this->actor.draw = EnAn_Draw; + Actor_SetScale(&this->actor, 0.01f); + this->stateFlags = 0; + this->scheduleResult = ANJU_SCH_NONE; + + this->actionFunc = EnAn_FollowSchedule; + this->actionFunc(this, play); +} + +void EnAn_FollowSchedule(EnAn* this, PlayState* play) { + ScheduleOutput scheduleOutput; + + this->timePathTimeSpeed = R_TIME_SPEED + ((void)0, gSaveContext.save.timeSpeedOffset); + + if (!ENAN_GET_8000(&this->actor) && !this->unk_3C0 && + CHECK_WEEKEVENTREG(WEEKEVENTREG_COUPLES_MASK_CUTSCENE_FINISHED)) { + Actor_Kill(&this->actor); + return; + } + + if (this->unk_3C0) { + scheduleOutput.result = ANJU_SCH_WITH_KAFEI; + if (this->scheduleResult != ANJU_SCH_WITH_KAFEI) { + EnAn_ProcessScheduleOutput(this, play, &scheduleOutput); + } + } else if (!Schedule_RunScript(play, sScheduleScript, &scheduleOutput) || + ((this->scheduleResult != scheduleOutput.result) && + !EnAn_ProcessScheduleOutput(this, play, &scheduleOutput))) { + this->actor.shape.shadowDraw = NULL; + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + scheduleOutput.result = ANJU_SCH_NONE; + } else { + this->actor.shape.shadowDraw = ActorShadow_DrawCircle; + this->actor.flags |= ACTOR_FLAG_TARGETABLE; + } + + this->scheduleResult = scheduleOutput.result; + this->lookAtActor = EnAn_FindLookAtActor(this, play); + EnAn_HandleSchedule(this, play); +} + +void EnAn_Talk(EnAn* this, PlayState* play) { + if (func_8010BF58(&this->actor, play, this->msgEventScript, this->msgEventFunc, &this->msgScriptResumePos)) { + // Message event script is done + + SubS_SetOfferMode(&this->stateFlags, SUBS_OFFER_MODE_ONSCREEN, SUBS_OFFER_MODE_MASK); + + this->stateFlags &= ~ENAN_STATE_ENGAGED; + this->stateFlags |= ENAN_STATE_LOST_ATTENTION; + this->loseAttentionTimer = 20; + this->msgScriptResumePos = 0; + this->actionFunc = EnAn_FollowSchedule; + + return; + } + + if ((this->scheduleResult == ANJU_SCH_WAITING_FOR_KAFEI) || (this->scheduleResult == ANJU_SCH_LAUNDRY_POOL_SIT) || + (this->scheduleResult == ANJU_SCH_RANCH) || (this->scheduleResult == ANJU_SCH_COOKING) || + (this->scheduleResult == ANJU_SCH_WITH_KAFEI)) { + return; + } + + if ((this->lookAtActor != NULL) && (this->lookAtActor->update != NULL)) { + // Rotate towards actor + s16 yaw; + Vec3f lookAtPos; + Vec3f pos; + + Math_Vec3f_Copy(&lookAtPos, &this->lookAtActor->world.pos); + Math_Vec3f_Copy(&pos, &this->actor.world.pos); + yaw = Math_Vec3f_Yaw(&pos, &lookAtPos); + + Math_ApproachS(&this->actor.shape.rot.y, yaw, 4, 0x2AA8); + } +} + +void EnAn_HandleCouplesMaskCutscene(EnAn* this, PlayState* play) { + s32 csAnimIndex[] = { + /* 0 */ 0, // no cue + /* 1 */ ENAN_ANIM_SITTING_IN_DISBELIEF, + /* 2 */ ENAN_ANIM_LOOK_UP, + /* 3 */ ENAN_ANIM_MASK_STAND_LOOP, + /* 4 */ ENAN_ANIM_MASK_KNEEL, + /* 5 */ ENAN_ANIM_HUG, + /* 6 */ ENAN_ANIM_HUG_RELEASE, + /* 7 */ ENAN_ANIM_COMBINE_MASKS_1, + /* 8 */ ENAN_ANIM_COMBINE_MASKS_2, + /* 9 */ ENAN_ANIM_HOLD_HANDS, + }; + s32 pad; + + //! FAKE + if (1) {} + + if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_557)) { + s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_557); + u16 cueId = play->csCtx.actorCues[cueChannel]->id; + + if (this->cueId != (u8)cueId) { + this->cueId = cueId; + + if (this->cueId == 3) { + SET_WEEKEVENTREG(WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED); + this->drawMoonMask = true; + } + if (this->cueId == 9) { + this->drawMoonMask = false; + } + + EnAn_ChangeAnim(this, play, csAnimIndex[cueId]); + } + + if ((this->animIndex == ENAN_ANIM_MASK_KNEEL) || (this->animIndex == ENAN_ANIM_HUG) || + (this->animIndex == ENAN_ANIM_HUG_RELEASE) || (this->animIndex == ENAN_ANIM_LOOK_UP)) { + if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + EnAn_ChangeAnim(this, play, this->animIndex + 1); + } + } + + Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); + } +} + +void EnAn_Init(Actor* thisx, PlayState* play) { + s32 pad; + EnAn* this = THIS; + s32 temp_v1; + s32 watchedCouplesMaskCs; + + if (play->sceneId != SCENE_YADOYA) { + this->actor.params &= (s16)~ENAN_8000; + } + + temp_v1 = ENAN_GET_8000(&this->actor) >> 0xF; + watchedCouplesMaskCs = CHECK_WEEKEVENTREG(WEEKEVENTREG_COUPLES_MASK_CUTSCENE_FINISHED); + + if ((!watchedCouplesMaskCs && (temp_v1 == 1)) || (watchedCouplesMaskCs && (temp_v1 == 0))) { + Actor_Kill(&this->actor); + return; + } + + // Check if there's an Anju actor with the ENAN_8000 flag, if there's one then give priority to that Anju and Kill + // all the others + if (temp_v1 == 0) { + if (func_80B53A7C(this, play, ACTORCAT_NPC, ACTOR_EN_AN) != NULL) { + Actor_Kill(&this->actor); + return; + } + } + + this->roomNum = -0x80; + this->slotsInitialized = false; + if (temp_v1 == 0) { + this->actor.room = -1; + } + + this->actionFunc = EnAn_FinishInit; +} + +void EnAn_Destroy(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + + Collider_DestroyCylinder(play, &this->collider); +} + +void EnAn_Update(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + + if (EnAn_InitObjectSlots(this, play)) { + return; + } + + if ((this->actionFunc != EnAn_FinishInit) && !EnAn_CheckTalk(this, play) && + EnAn_IsCouplesMaskCsPlaying(this, play)) { + EnAn_HandleCouplesMaskCutscene(this, play); + EnAn_UpdateSkelAnime(this, play); + EnAn_UpdateFace(this); + return; + } + + this->actionFunc(this, play); + if (this->scheduleResult != ANJU_SCH_NONE) { + EnAn_HandleDialogue(this, play); + EnAn_UpdateSkelAnime(this, play); + EnAn_UpdateFace(this); + EnAn_UpdateAttention(this); + SubS_Offer(&this->actor, play, this->offerRange, 30.0f, 0, this->stateFlags & SUBS_OFFER_MODE_MASK); + + if (!(this->stateFlags & ENAN_STATE_IGNORE_GRAVITY)) { + Actor_MoveWithGravity(&this->actor); + Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4); + } + + EnAn_UpdateCollider(this, play); + } +} + +void EnAn_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + EnAn* this = THIS; + + if (limbIndex == ANJU1_LIMB_HEAD) { + static Vec3f D_80B58ED4 = { 1000.0f, 0.0f, 0.0f }; + + Matrix_MultVec3f(&D_80B58ED4, &this->actor.focus.pos); + Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot); + EnAn_DrawAccessory(this, play, ENAN_ACCESSORY_KAFEI_MASK); + } else if (limbIndex == ANJU1_LIMB_RIGHT_HAND) { + EnAn_DrawAccessory(this, play, ENAN_ACCESSORY_FOOD_TRAY); + EnAn_DrawAccessory(this, play, ENAN_ACCESSORY_CHOPSTICKS); + EnAn_DrawAccessory(this, play, ENAN_ACCESSORY_UMBRELLA); + EnAn_DrawAccessory(this, play, ENAN_ACCESSORY_BROOM); + } else if (limbIndex == ANJU1_LIMB_LEFT_HAND) { + EnAn_DrawAccessory(this, play, ENAN_ACCESSORY_MOON_MASK); + } +} + +void EnAn_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { + EnAn* this = THIS; + s32 stepRot; + s32 overrideRot; + + if (!(this->stateFlags & ENAN_STATE_LOST_ATTENTION)) { + if (this->stateFlags & ENAN_STATE_FACE_TARGET) { + overrideRot = true; + } else { + overrideRot = false; + } + stepRot = true; + } else { + overrideRot = false; + stepRot = false; + } + + if (limbIndex == ANJU1_LIMB_HEAD) { + SubS_UpdateLimb(this->headRotZ + 0x4000, this->headRotY + this->actor.shape.rot.y + 0x4000, + &this->headComputedPos, &this->headComputedRot, stepRot, overrideRot); + Matrix_Pop(); + Matrix_Translate(this->headComputedPos.x, this->headComputedPos.y, this->headComputedPos.z, MTXMODE_NEW); + Matrix_Scale(this->actor.scale.x, this->actor.scale.y, this->actor.scale.z, MTXMODE_APPLY); + Matrix_RotateYS(this->headComputedRot.y, MTXMODE_APPLY); + Matrix_RotateXS(this->headComputedRot.x, MTXMODE_APPLY); + Matrix_RotateZS(this->headComputedRot.z, MTXMODE_APPLY); + Matrix_Push(); + } +} + +void EnAn_Draw(Actor* thisx, PlayState* play) { + EnAn* this = THIS; + + if ((this->scheduleResult != ANJU_SCH_NONE) || this->forceDraw) { + static TexturePtr sMouthTextures[ENAN_MOUTH_MAX] = { + gAnju1MouthClosedTex, // ENAN_MOUTH_CLOSED + gAnju1MouthHappyTex, // ENAN_MOUTH_HAPPY + gAnju1MouthOpenTex, // ENAN_MOUTH_OPEN + }; + static TexturePtr sEyeTextures[ENAN_EYES_MAX] = { + gAnju1EyeOpenTex, // ENAN_EYES_OPEN + gAnju1EyeHalfTex, // ENAN_EYES_HALF1 + gAnju1EyeClosedTex, // ENAN_EYES_CLOSED + gAnju1EyeHalfTex, // ENAN_EYES_HALF2 + gAnju1EyeComfortTex, // ENAN_EYES_COMFORT + gAnju1EyeSadTex, // ENAN_EYES_SAD + gAnju1EyeRelievedClosedTex, // ENAN_EYES_RELIEVED_CLOSED + }; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Opa(play->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTexIndex])); + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTexIndex])); + + SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + this->skelAnime.dListCount, NULL, EnAn_PostLimbDraw, EnAn_TransformLimbDraw, + &this->actor); + + CLOSE_DISPS(play->state.gfxCtx); + } +} diff --git a/src/overlays/actors/ovl_En_An/z_en_an.h b/src/overlays/actors/ovl_En_An/z_en_an.h index 7f1a11930..86a357d66 100644 --- a/src/overlays/actors/ovl_En_An/z_en_an.h +++ b/src/overlays/actors/ovl_En_An/z_en_an.h @@ -2,16 +2,102 @@ #define Z_EN_AN_H #include "global.h" +#include "assets/objects/object_an1/object_an1.h" struct EnAn; typedef void (*EnAnActionFunc)(struct EnAn*, PlayState*); +typedef void (*EnAnDialogueFunc)(struct EnAn*, PlayState*); +typedef s32 (*MsgEventFunc)(Actor*, PlayState*); + +#define ENAN_8000 0x8000 + +#define ENAN_GET_PATH_INDEX(thisx) ((thisx)->params & 0xFF) +#define ENAN_GET_8000(thisx) ((thisx)->params & ENAN_8000) + +#define ENAN_STATE_8 (1 << 3) // path related +#define ENAN_STATE_REACHED_PATH_END (1 << 4) +#define ENAN_STATE_ENGAGED (1 << 5) +#define ENAN_STATE_IGNORE_GRAVITY (1 << 6) +#define ENAN_STATE_FACE_TARGET (1 << 7) +#define ENAN_STATE_UPDATE_EYES (1 << 8) +#define ENAN_STATE_LOST_ATTENTION (1 << 9) +#define ENAN_STATE_TALKING (1 << 10) +#define ENAN_STATE_DRAW_TRAY (1 << 11) +#define ENAN_STATE_DRAW_UMBRELLA (1 << 12) +#define ENAN_STATE_DRAW_BROOM (1 << 13) +#define ENAN_STATE_DRAW_KAFEIS_MASK (1 << 14) +#define ENAN_STATE_DRAW_CHOPSTICKS (1 << 15) typedef struct EnAn { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x44]; + /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ EnAnActionFunc actionFunc; - /* 0x18C */ char unk_18C[0x23C]; + /* 0x18C */ EnAnDialogueFunc dialogueFunc; + /* 0x190 */ ColliderCylinder collider; + /* 0x1DC */ Path* timePath; + /* 0x1E0 */ Vec3f timePathTargetPos; + /* 0x1EC */ f32 timePathProgress; + /* 0x1F0 */ s32 timePathTotalTime; + /* 0x1F4 */ s32 timePathWaypointTime; + /* 0x1F8 */ s32 timePathWaypoint; + /* 0x1FC */ s32 timePathElapsedTime; + /* 0x200 */ u8 scheduleResult; + /* 0x204 */ s32* msgEventScript; + /* 0x208 */ s8 an2ObjectSlot; + /* 0x209 */ s8 an3ObjectSlot; + /* 0x20A */ s8 maskKerfayObjectSlot; + /* 0x20B */ s8 an4ObjectSlot; + /* 0x20C */ s8 msmoObjectSlot; + /* 0x210 */ s32 msgScriptResumePos; + /* 0x214 */ s8 roomNum; + /* 0x215 */ s8 doorOpenTimer; + /* 0x218 */ Actor* lookAtActor; // interactActor + /* 0x21C */ UNK_TYPE1 unk_21C[0xC]; + /* 0x228 */ Vec3f doorEntrancePos; // Position of the point just before entering the door + /* 0x234 */ Vec3f doorExitPos; // Position of the point just after passing through the door + /* 0x240 */ Vec3f headComputedPos; + /* 0x24C */ UNK_TYPE1 unk_24C[0xC]; + /* 0x258 */ Vec3s headComputedRot; + /* 0x25E */ UNK_TYPE1 unk_25E[0x6]; + /* 0x264 */ Vec3s jointTable[ANJU1_LIMB_MAX]; + /* 0x2E2 */ Vec3s morphTable[ANJU1_LIMB_MAX]; + /* 0x360 */ u16 stateFlags; + /* 0x362 */ u16 prevTextId; + /* 0x364 */ u8 cueId; + /* 0x368 */ f32 animPlaySpeed; + /* 0x36C */ UNK_TYPE1 unk_36C[0x8]; + /* 0x374 */ f32 offerRange; + /* 0x378 */ s16 doorTimeTotalDiff; // Time difference between the point before going through a door and after going through it + /* 0x37A */ union { + s16 doorTimeProgress; // schedule time diff + s16 laundryPoolState; + s16 followScheduleState; // unused + } schState; + /* 0x37C */ s16 headRotZ; + /* 0x37E */ s16 headRotY; + /* 0x380 */ UNK_TYPE1 unk_380[0x4]; + /* 0x384 */ s16 timePathTimeSpeed; + /* 0x386 */ s16 unk_386; // timer + /* 0x388 */ s16 loseAttentionTimer; + /* 0x38A */ s16 savedFaceIndex; // EnAnFace enum + /* 0x38C */ s16 faceIndex; // EnAnFace enum + /* 0x38E */ s16 eyeTimer; + /* 0x390 */ s16 eyeTexIndex; + /* 0x392 */ s16 mouthTexIndex; + /* 0x394 */ s16 msgEventState; + /* 0x396 */ s16 dialogueFuncState; + /* 0x398 */ MsgEventFunc msgEventFunc; + /* 0x39C */ s32 animIndex; // EnAnAnimation enum + /* 0x3A0 */ UNK_TYPE1 unk_3A0[0x8]; + /* 0x3A8 */ u32 trayTexScrollTimer1; // TwoTexScroll + /* 0x3AC */ u32 trayTexScrollTimer2; // TwoTexScroll + /* 0x3B0 */ s32 forceDraw; + /* 0x3B4 */ s32 drawMoonMask; + /* 0x3B8 */ s32 slotsInitialized; + /* 0x3BC */ s32 unk_3BC; + /* 0x3C0 */ s32 unk_3C0; // true if ENAN_8000 + /* 0x3C4 */ s32 unk_3C4; // set but not read } EnAn; // size = 0x3C8 #endif // Z_EN_AN_H diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.c b/src/overlays/actors/ovl_En_Door/z_en_door.c index 7777c8570..8ecab48f9 100644 --- a/src/overlays/actors/ovl_En_Door/z_en_door.c +++ b/src/overlays/actors/ovl_En_Door/z_en_door.c @@ -514,7 +514,7 @@ void func_80866B20(EnDoor* this, PlayState* play) { Flags_SetSwitch(play, this->switchFlag); Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK); } - } else if (this->unk_1A7 != 0) { + } else if (this->openTimer != 0) { this->actionFunc = func_80866F94; Actor_PlaySfx(&this->knobDoor.dyna.actor, NA_SE_EV_DOOR_OPEN); } else if (!Player_InCsMode(play)) { @@ -585,14 +585,14 @@ void func_80866B20(EnDoor* this, PlayState* play) { void func_80866F94(EnDoor* this, PlayState* play) { s32 direction; - if (this->unk_1A7 != 0) { - if (this->unk_1A7 >= 0) { + if (this->openTimer != 0) { + if (this->openTimer >= 0) { direction = 1; } else { direction = -1; } if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, direction * 0x3E80, 0x7D0)) { - Math_StepToC(&this->unk_1A7, 0, 1); + Math_StepToC(&this->openTimer, 0, 1); } } else { if (Math_ScaledStepToS(&this->knobDoor.dyna.actor.world.rot.y, 0, 0x7D0)) { diff --git a/src/overlays/actors/ovl_En_Door/z_en_door.h b/src/overlays/actors/ovl_En_Door/z_en_door.h index 5ea0b7df3..8d13e3d76 100644 --- a/src/overlays/actors/ovl_En_Door/z_en_door.h +++ b/src/overlays/actors/ovl_En_Door/z_en_door.h @@ -25,10 +25,10 @@ typedef enum EnDoorType { typedef struct EnDoor { /* 0x000 */ KnobDoorActor knobDoor; - /* 0x1A4 */ u8 doorType; + /* 0x1A4 */ u8 doorType; // EnDoorType enum /* 0x1A5 */ u8 switchFlag; /* 0x1A6 */ u8 unk_1A6; - /* 0x1A7 */ s8 unk_1A7; + /* 0x1A7 */ s8 openTimer; // For how long the door will be open. positive/negative means the opening direction /* 0x1A8 */ Vec3s limbTable[DOOR_LIMB_MAX]; /* 0x1C8 */ EnDoorActionFunc actionFunc; } EnDoor; diff --git a/src/overlays/actors/ovl_En_Drs/z_en_drs.c b/src/overlays/actors/ovl_En_Drs/z_en_drs.c index 10d960d20..8de21d00e 100644 --- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c +++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c @@ -115,7 +115,8 @@ void EnDrs_PostLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3s* rot // Anju removes the Moon Mask at the start of the Couple's Mask cutscene // after that it will no longer be rendered. - if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_87_02) && (limbIndex == WEDDING_DRESS_MANNEQUIN_LIMB_MASK)) { + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED) && + (limbIndex == WEDDING_DRESS_MANNEQUIN_LIMB_MASK)) { OPEN_DISPS(play->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x06, play->objectCtx.slots[temp].segment); diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c index df7a4e82a..c18cdf08c 100644 --- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c +++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c @@ -1480,9 +1480,9 @@ s32 func_80950804(EnGm* this, PlayState* play) { if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) { if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) { if ((this->unk_3BA / (f32)this->unk_3B8) <= 0.9f) { - door->unk_1A7 = this->unk_261; + door->openTimer = this->unk_261; } else { - door->unk_1A7 = 0; + door->openTimer = 0; } } diff --git a/src/overlays/actors/ovl_En_Ig/z_en_ig.c b/src/overlays/actors/ovl_En_Ig/z_en_ig.c index 19d3bdf46..f7061a53b 100644 --- a/src/overlays/actors/ovl_En_Ig/z_en_ig.c +++ b/src/overlays/actors/ovl_En_Ig/z_en_ig.c @@ -767,9 +767,9 @@ s32 func_80BF2470(EnIg* this, PlayState* play) { if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) { if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) { if (((f32)this->unk_3E2 / this->unk_3E0) <= 0.9f) { - door->unk_1A7 = this->unk_2A4; + door->openTimer = this->unk_2A4; } else { - door->unk_1A7 = 0; + door->openTimer = 0; } } this->unk_3E2 = CLAMP(this->unk_3E2, 0, this->unk_3E0); diff --git a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c index fd34a16b0..8c6585dd3 100644 --- a/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c +++ b/src/overlays/actors/ovl_En_Pamera/z_en_pamera.c @@ -473,7 +473,7 @@ void func_80BD9338(EnPamera* this, PlayState* play) { func_80BD84F0(this, play); actor = this->actor.child; if ((actor != NULL) && (actor->id == ACTOR_EN_DOOR)) { - ((EnDoor*)actor)->unk_1A7 = -0x32; + ((EnDoor*)actor)->openTimer = -50; } } diff --git a/src/overlays/actors/ovl_En_Pm/z_en_pm.c b/src/overlays/actors/ovl_En_Pm/z_en_pm.c index 02cb7dbec..143df78aa 100644 --- a/src/overlays/actors/ovl_En_Pm/z_en_pm.c +++ b/src/overlays/actors/ovl_En_Pm/z_en_pm.c @@ -843,7 +843,7 @@ s32 func_80AF81E8(EnPm* this, PlayState* play) { case 1: case 3: case 5: - if (CHECK_WEEKEVENTREG(WEEKEVENTREG_86_08) && (this->unk_378 == 3)) { + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_LISTENED_ANJU_POSTMAN_CONVERSATION) && (this->unk_378 == 3)) { CutsceneManager_Stop(csId); } else { Camera_SetTargetActor(Play_GetCamera(play, CutsceneManager_GetCurrentSubCamId(csId)), &this->actor); @@ -1711,9 +1711,9 @@ s32 func_80AF9D04(EnPm* this, PlayState* play) { if (!SubS_InCsMode(play) && (this->timePathTimeSpeed != 0)) { if ((door != NULL) && (door->knobDoor.dyna.actor.update != NULL)) { if (((f32)this->unk_36E / this->unk_36C) <= 0.9f) { - door->unk_1A7 = this->unk_260; + door->openTimer = this->unk_260; } else { - door->unk_1A7 = 0; + door->openTimer = 0; } } this->unk_36E = CLAMP(this->unk_36E, 0, this->unk_36C); diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c index d16f96754..7a8f82f84 100644 --- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c +++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c @@ -768,7 +768,7 @@ s32 func_80BABDD8(EnSuttari* this, PlayState* play, ScheduleOutput* scheduleOutp this->unk434 = sp44 - scheduleOutput->time0; this->unk436 = scheduleOutput->time1 - scheduleOutput->time0; if ((scheduleOutput->result != 10) && (scheduleOutput->result != 11)) { - sp48->unk_1A7 = 0x4B; + sp48->openTimer = 75; } Math_Vec3f_Copy(&this->unk438, &sp38); Math_Vec3f_Copy(&this->unk444, &sp2C); diff --git a/src/overlays/actors/ovl_En_Tk/z_en_tk.c b/src/overlays/actors/ovl_En_Tk/z_en_tk.c index 1ed23698e..d6e7d4667 100644 --- a/src/overlays/actors/ovl_En_Tk/z_en_tk.c +++ b/src/overlays/actors/ovl_En_Tk/z_en_tk.c @@ -472,7 +472,7 @@ s32 func_80AECE60(EnTk* this, PlayState* play) { Vec3f sp5C; Actor_OffsetOfPointInActorCoords(&this->actor, &sp5C, &door->knobDoor.dyna.actor.world.pos); - door->unk_1A7 = 2; + door->openTimer = 2; if (sp5C.z < -20.0f) { this->unk_2CA &= ~0x400; this->unk_2CA |= 0x800; @@ -480,7 +480,7 @@ s32 func_80AECE60(EnTk* this, PlayState* play) { } if (door != NULL) { - if ((this->unk_2CA & 0x800) && (door->unk_1A7 == 0)) { + if ((this->unk_2CA & 0x800) && (door->openTimer == 0)) { this->unk_2CA &= ~0x800; } } diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index e93ec53ae..4b40d54fa 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -14007,67 +14007,67 @@ 0x80B52AF0:("EnGk_PostLimbDraw",), 0x80B52D8C:("EnGk_TransformLimbDraw",), 0x80B52F74:("EnGk_Draw",), - 0x80B53840:("func_80B53840",), - 0x80B539CC:("func_80B539CC",), + 0x80B53840:("EnAn_InitObjectSlots",), + 0x80B539CC:("EnAn_FindActor",), 0x80B53A7C:("func_80B53A7C",), - 0x80B53B3C:("func_80B53B3C",), - 0x80B53BA8:("func_80B53BA8",), - 0x80B53CE8:("func_80B53CE8",), - 0x80B53ED4:("func_80B53ED4",), - 0x80B53F84:("func_80B53F84",), - 0x80B54124:("func_80B54124",), - 0x80B54678:("func_80B54678",), - 0x80B546F4:("func_80B546F4",), - 0x80B54750:("func_80B54750",), - 0x80B547C8:("func_80B547C8",), - 0x80B5492C:("func_80B5492C",), - 0x80B54A94:("func_80B54A94",), - 0x80B54BC4:("func_80B54BC4",), - 0x80B54C5C:("func_80B54C5C",), - 0x80B54D18:("func_80B54D18",), - 0x80B54DF4:("func_80B54DF4",), - 0x80B55180:("func_80B55180",), - 0x80B552E4:("func_80B552E4",), - 0x80B553AC:("func_80B553AC",), - 0x80B554E8:("func_80B554E8",), - 0x80B555C8:("func_80B555C8",), - 0x80B556F8:("func_80B556F8",), - 0x80B557AC:("func_80B557AC",), - 0x80B55860:("func_80B55860",), - 0x80B55914:("func_80B55914",), - 0x80B55D20:("func_80B55D20",), + 0x80B53B3C:("EnAn_FindDoor",), + 0x80B53BA8:("EnAn_UpdateSkelAnime",), + 0x80B53CE8:("EnAn_ChangeAnim",), + 0x80B53ED4:("EnAn_UpdateCollider",), + 0x80B53F84:("EnAn_UpdateFace",), + 0x80B54124:("EnAn_DrawAccessory",), + 0x80B54678:("EnAn_ChangeCutscene",), + 0x80B546F4:("EnAn_GetCsId",), + 0x80B54750:("EnAn_GetChildCsId",), + 0x80B547C8:("EnAn_MsgEvent_ReceiveLetterFromPostman",), + 0x80B5492C:("EnAn_MsgEvent_AttendGoron",), + 0x80B54A94:("EnAn_MsgEvent_GiveLunchToGranny",), + 0x80B54BC4:("EnAn_MsgEvent_MidnightMeeting",), + 0x80B54C5C:("EnAn_MsgEvent_Cooking",), + 0x80B54D18:("EnAn_MsgEvent_LaundryPool",), + 0x80B54DF4:("EnAn_GetMsgEventScript",), + 0x80B55180:("EnAn_CheckTalk",), + 0x80B552E4:("EnAn_IsCouplesMaskCsPlaying",), + 0x80B553AC:("EnAn_UpdateHeadRot",), + 0x80B554E8:("EnAn_UpdateAttention",), + 0x80B555C8:("EnAn_ChooseAnimAfterTalking",), + 0x80B556F8:("EnAn_DialogueFunc_80B556F8",), + 0x80B557AC:("EnAn_DialogueFunc_80B557AC",), + 0x80B55860:("EnAn_DialogueFunc_80B55860",), + 0x80B55914:("EnAn_HandleDialogue",), + 0x80B55D20:("EnAn_FindLookAtActor",), 0x80B55D98:("func_80B55D98",), - 0x80B55ECC:("func_80B55ECC",), + 0x80B55ECC:("EnAn_IsFacingAndNearPlayer",), 0x80B55F8C:("func_80B55F8C",), - 0x80B5600C:("func_80B5600C",), - 0x80B56094:("func_80B56094",), - 0x80B5611C:("func_80B5611C",), - 0x80B561A4:("func_80B561A4",), - 0x80B56418:("func_80B56418",), - 0x80B56744:("func_80B56744",), - 0x80B56880:("func_80B56880",), - 0x80B56B00:("func_80B56B00",), - 0x80B56BC0:("func_80B56BC0",), - 0x80B56CAC:("func_80B56CAC",), - 0x80B56D28:("func_80B56D28",), - 0x80B56E44:("func_80B56E44",), - 0x80B56EB4:("func_80B56EB4",), - 0x80B5702C:("func_80B5702C",), - 0x80B572D4:("func_80B572D4",), - 0x80B573F4:("func_80B573F4",), - 0x80B575BC:("func_80B575BC",), - 0x80B57674:("func_80B57674",), - 0x80B57718:("func_80B57718",), - 0x80B577F0:("func_80B577F0",), - 0x80B578F8:("func_80B578F8",), - 0x80B57A44:("func_80B57A44",), - 0x80B57B48:("func_80B57B48",), + 0x80B5600C:("EnAn_ProcessSchedule_ReceiveLetterFromPostman",), + 0x80B56094:("EnAn_ProcessSchedule_AttendGoron",), + 0x80B5611C:("EnAn_ProcessSchedule_GiveLunchToGranny",), + 0x80B561A4:("EnAn_ProcessSchedule_Door",), + 0x80B56418:("EnAn_ProcessSchedule_Walking",), + 0x80B56744:("EnAn_ProcessSchedule_Sweeping",), + 0x80B56880:("EnAn_ProcessSchedule_80B56880",), + 0x80B56B00:("EnAn_ProcessSchedule_Ranch",), + 0x80B56BC0:("EnAn_ProcessSchedule_StaffRoom",), + 0x80B56CAC:("EnAn_ProcessSchedule_WithKafei",), + 0x80B56D28:("EnAn_ProcessScheduleOutput",), + 0x80B56E44:("EnAn_HandleSch_InteractActor",), + 0x80B56EB4:("EnAn_HandleSch_Door",), + 0x80B5702C:("EnAn_HandleSch_FollowTimePath",), + 0x80B572D4:("EnAn_HandleSch_80B572D4",), + 0x80B573F4:("EnAn_HandleSch_LaundryPool",), + 0x80B575BC:("EnAn_HandleSch_WaitingForKafei",), + 0x80B57674:("EnAn_HandleSch_WithKafei",), + 0x80B57718:("EnAn_HandleSchedule",), + 0x80B577F0:("EnAn_FinishInit",), + 0x80B578F8:("EnAn_FollowSchedule",), + 0x80B57A44:("EnAn_Talk",), + 0x80B57B48:("EnAn_HandleCouplesMaskCutscene",), 0x80B57C9C:("EnAn_Init",), 0x80B57D70:("EnAn_Destroy",), 0x80B57D9C:("EnAn_Update",), - 0x80B57EE8:("func_80B57EE8",), - 0x80B57FC4:("func_80B57FC4",), - 0x80B580C0:("func_80B580C0",), + 0x80B57EE8:("EnAn_PostLimbDraw",), + 0x80B57FC4:("EnAn_TransformLimbDraw",), + 0x80B580C0:("EnAn_Draw",), 0x80B5A720:("EnBee_Init",), 0x80B5A828:("EnBee_Destroy",), 0x80B5A854:("func_80B5A854",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index fe97f2b48..65add1c07 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -14428,40 +14428,40 @@ 0x80B534A4:("D_80B534A4","f32","",0x4), 0x80B534A8:("D_80B534A8","f32","",0x4), 0x80B534AC:("D_80B534AC","f32","",0x4), - 0x80B581D0:("D_80B581D0","UNK_TYPE1","",0x1), - 0x80B58618:("D_80B58618","UNK_TYPE1","",0x1), - 0x80B58718:("D_80B58718","UNK_TYPE1","",0x1), - 0x80B58784:("D_80B58784","UNK_TYPE1","",0x1), - 0x80B58808:("D_80B58808","UNK_TYPE1","",0x1), - 0x80B5885C:("D_80B5885C","UNK_TYPE1","",0x1), - 0x80B58938:("D_80B58938","UNK_TYPE1","",0x1), - 0x80B58944:("D_80B58944","UNK_TYPE1","",0x1), - 0x80B5894C:("D_80B5894C","UNK_TYPE1","",0x1), - 0x80B58954:("D_80B58954","UNK_TYPE1","",0x1), - 0x80B58980:("D_80B58980","UNK_TYPE1","",0x1), - 0x80B58988:("D_80B58988","UNK_TYPE1","",0x1), - 0x80B58994:("D_80B58994","UNK_TYPE1","",0x1), - 0x80B5899C:("D_80B5899C","UNK_TYPE1","",0x1), - 0x80B589AC:("D_80B589AC","UNK_TYPE1","",0x1), - 0x80B589FC:("D_80B589FC","UNK_TYPE1","",0x1), - 0x80B58A04:("D_80B58A04","UNK_TYPE1","",0x1), - 0x80B58A24:("D_80B58A24","UNK_TYPE1","",0x1), - 0x80B58A3C:("D_80B58A3C","UNK_TYPE1","",0x1), - 0x80B58A44:("D_80B58A44","UNK_TYPE1","",0x1), - 0x80B58ABC:("D_80B58ABC","UNK_TYPE1","",0x1), - 0x80B58AC4:("D_80B58AC4","UNK_TYPE1","",0x1), - 0x80B58AE8:("D_80B58AE8","UNK_TYPE1","",0x1), - 0x80B58AF4:("D_80B58AF4","UNK_TYPE1","",0x1), - 0x80B58B3C:("D_80B58B3C","UNK_TYPE1","",0x1), - 0x80B58B7C:("D_80B58B7C","UNK_TYPE1","",0x1), - 0x80B58B88:("D_80B58B88","UNK_TYPE1","",0x1), - 0x80B58B90:("D_80B58B90","UNK_TYPE1","",0x1), + 0x80B581D0:("sScheduleScript","UNK_TYPE1","",0x1), + 0x80B58618:("sSearchTimePathLimit","UNK_TYPE1","",0x1), + 0x80B58718:("sAnjuMsgScript_SchReceiveLetterFromPostman","UNK_TYPE1","",0x1), + 0x80B58784:("sAnjuMsgScript_SchAttendGoron","UNK_TYPE1","",0x1), + 0x80B58808:("sAnjuMsgScript_SchGiveLunchToGranny","UNK_TYPE1","",0x1), + 0x80B5885C:("sAnjuMsgScript_ReceptionistDay1","UNK_TYPE1","",0x1), + 0x80B58938:("sAnjuMsgScript_InnCloseTime","UNK_TYPE1","",0x1), + 0x80B58944:("sAnjuMsgScript_80B58944","UNK_TYPE1","",0x1), + 0x80B5894C:("sAnjuMsgScript_80B5894C","UNK_TYPE1","",0x1), + 0x80B58954:("sAnjuMsgScript_SchCooking","UNK_TYPE1","",0x1), + 0x80B58980:("sAnjuMsgScript_80B58980","UNK_TYPE1","",0x1), + 0x80B58988:("sAnjuMsgScript_SchSweeping","UNK_TYPE1","",0x1), + 0x80B58994:("sAnjuMsgScript_80B58994","UNK_TYPE1","",0x1), + 0x80B5899C:("sAnjuMsgScript_SchRanch","UNK_TYPE1","",0x1), + 0x80B589AC:("sAnjuMsgScript_SchMidnightMeeting","UNK_TYPE1","",0x1), + 0x80B589FC:("sAnjuMsgScript_80B589FC","UNK_TYPE1","",0x1), + 0x80B58A04:("sAnjuMsgScript_DekuDefault","UNK_TYPE1","",0x1), + 0x80B58A24:("sAnjuMsgScript_SchLaundryPoolDeku","UNK_TYPE1","",0x1), + 0x80B58A3C:("sAnjuMsgScript_Receptionist","UNK_TYPE1","",0x1), + 0x80B58A44:("sAnjuMsgScript_80B58A44","UNK_TYPE1","",0x1), + 0x80B58ABC:("sAnjuMsgScript_80B58ABC","UNK_TYPE1","",0x1), + 0x80B58AC4:("sAnjuMsgScript_80B58AC4","UNK_TYPE1","",0x1), + 0x80B58AE8:("sAnjuMsgScript_SchWaitingForKafei","UNK_TYPE1","",0x1), + 0x80B58AF4:("sAnjuMsgScript_SchLaundryPoolDefault","UNK_TYPE1","",0x1), + 0x80B58B3C:("sAnjuMsgScript_SchLaundryPoolKafeiMask","UNK_TYPE1","",0x1), + 0x80B58B7C:("sAnjuMsgScript_80B58B7C","UNK_TYPE1","",0x1), + 0x80B58B88:("sAnjuMsgScript_80B58B88","UNK_TYPE1","",0x1), + 0x80B58B90:("sAnjuMsgScript_SchWithKafei","UNK_TYPE1","",0x1), 0x80B58B9C:("En_An_InitVars","UNK_TYPE1","",0x1), - 0x80B58BBC:("D_80B58BBC","UNK_TYPE1","",0x1), - 0x80B58BE8:("D_80B58BE8","UNK_TYPE1","",0x1), - 0x80B58BF4:("D_80B58BF4","UNK_TYPE1","",0x1), + 0x80B58BBC:("sCylinderInit","UNK_TYPE1","",0x1), + 0x80B58BE8:("sColChkInfoInit","UNK_TYPE1","",0x1), + 0x80B58BF4:("sAnimationInfo","UNK_TYPE1","",0x1), 0x80B58E34:("D_80B58E34","UNK_TYPE1","",0x1), - 0x80B58E40:("D_80B58E40","UNK_TYPE1","",0x1), + 0x80B58E40:("sMouthIndices","UNK_TYPE1","",0x1), 0x80B58E54:("D_80B58E54","UNK_TYPE1","",0x1), 0x80B58E60:("D_80B58E60","UNK_TYPE1","",0x1), 0x80B58E68:("D_80B58E68","UNK_TYPE1","",0x1), @@ -14473,8 +14473,8 @@ 0x80B58EA4:("D_80B58EA4","UNK_TYPE1","",0x1), 0x80B58EAC:("D_80B58EAC","UNK_TYPE4","",0x4), 0x80B58ED4:("D_80B58ED4","UNK_TYPE1","",0x1), - 0x80B58EE0:("D_80B58EE0","UNK_TYPE1","",0x1), - 0x80B58EEC:("D_80B58EEC","UNK_TYPE1","",0x1), + 0x80B58EE0:("sMouthTextures","UNK_TYPE1","",0x1), + 0x80B58EEC:("sEyeTextures","UNK_TYPE1","",0x1), 0x80B58F10:("jtbl_80B58F10","UNK_PTR","",0x4), 0x80B58F48:("jtbl_80B58F48","UNK_PTR","",0x4), 0x80B58F70:("jtbl_80B58F70","UNK_PTR","",0x4), diff --git a/tools/weekeventregconvert.py b/tools/weekeventregconvert.py index 671407ad1..0d721654e 100755 --- a/tools/weekeventregconvert.py +++ b/tools/weekeventregconvert.py @@ -449,7 +449,7 @@ weekEventReg = { (55 << 8) | 0x04: "WEEKEVENTREG_TALKED_PART_TIMER_AS_GORON", (55 << 8) | 0x08: "WEEKEVENTREG_TALKED_PART_TIMER_AS_ZORA", (55 << 8) | 0x10: "WEEKEVENTREG_TALKED_PART_TIMER_AS_DEKU", - (55 << 8) | 0x20: "WEEKEVENTREG_55_20", + (55 << 8) | 0x20: "WEEKEVENTREG_TALKED_ANJU_IN_LAUNDRY_POOL", (55 << 8) | 0x40: "WEEKEVENTREG_55_40", (55 << 8) | 0x80: "WEEKEVENTREG_CLEARED_GREAT_BAY_TEMPLE", (56 << 8) | 0x01: "WEEKEVENTREG_56_01", @@ -695,13 +695,13 @@ weekEventReg = { (86 << 8) | 0x01: "WEEKEVENTREG_86_01", (86 << 8) | 0x02: "WEEKEVENTREG_86_02", (86 << 8) | 0x04: "WEEKEVENTREG_86_04", - (86 << 8) | 0x08: "WEEKEVENTREG_86_08", + (86 << 8) | 0x08: "WEEKEVENTREG_LISTENED_ANJU_POSTMAN_CONVERSATION", (86 << 8) | 0x10: "WEEKEVENTREG_86_10", (86 << 8) | 0x20: "WEEKEVENTREG_86_20", (86 << 8) | 0x40: "WEEKEVENTREG_86_40", (86 << 8) | 0x80: "WEEKEVENTREG_86_80", (87 << 8) | 0x01: "WEEKEVENTREG_87_01", - (87 << 8) | 0x02: "WEEKEVENTREG_87_02", + (87 << 8) | 0x02: "WEEKEVENTREG_COUPLES_MASK_CUTSCENE_STARTED", (87 << 8) | 0x04: "WEEKEVENTREG_87_04", (87 << 8) | 0x08: "WEEKEVENTREG_87_08", (87 << 8) | 0x10: "WEEKEVENTREG_87_10", diff --git a/undefined_syms.txt b/undefined_syms.txt index c3b6862a0..4c272d644 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -302,15 +302,6 @@ D_06014040 = 0x06014040; D_06002D30 = 0x06002D30; D_06011458 = 0x06011458; -// ovl_En_An - -D_06000308 = 0x06000308; -D_06000378 = 0x06000378; -D_06000E70 = 0x06000E70; -D_060111E8 = 0x060111E8; -D_06012478 = 0x06012478; -D_06012618 = 0x06012618; - // ovl_En_Bal D_060005FC = 0x060005FC; From e96f18d4e720663f79c6a7dc74c19b3c7f83ea5f Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Thu, 9 Nov 2023 15:08:21 -0800 Subject: [PATCH 20/28] Small boot cleanup (#1475) --- include/carthandle.h | 8 ++++++++ include/variables.h | 1 - spec | 4 ++-- src/{libultra/libc => boot/O2}/sprintf.c | 0 src/boot/boot_main.c | 2 +- src/boot/carthandle.c | 3 +++ src/boot/viconfig.c | 2 +- src/boot/z_std_dma.c | 2 ++ tools/disasm/files.txt | 2 +- 9 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 include/carthandle.h rename src/{libultra/libc => boot/O2}/sprintf.c (100%) create mode 100644 src/boot/carthandle.c diff --git a/include/carthandle.h b/include/carthandle.h new file mode 100644 index 000000000..72d0821e5 --- /dev/null +++ b/include/carthandle.h @@ -0,0 +1,8 @@ +#ifndef CARTHANDLE_H +#define CARTHANDLE_H + +#include "ultra64.h" + +extern OSPiHandle* gCartHandle; + +#endif diff --git a/include/variables.h b/include/variables.h index 2b088fa0c..7b1313415 100644 --- a/include/variables.h +++ b/include/variables.h @@ -10,7 +10,6 @@ extern u16 gFramebuffer1[SCREEN_HEIGHT][SCREEN_WIDTH]; // at 0x80000500 extern u8 D_80025D00[]; // data -extern OSPiHandle* gCartHandle; extern size_t gDmaMgrDmaBuffSize; extern vs32 gIrqMgrResetStatus; extern volatile OSTime sIrqMgrResetTime; diff --git a/spec b/spec index 9a2a66908..1344fcade 100644 --- a/spec +++ b/spec @@ -17,7 +17,7 @@ beginseg include "build/data/boot/rspboot.data.o" include "build/src/boot/idle.o" include "build/src/boot/viconfig.o" - include "build/data/boot/viconfig.data.o" + include "build/src/boot/carthandle.o" include "build/src/boot/z_std_dma.o" include "build/src/boot/yaz0.o" include "build/src/boot/irqmgr.o" @@ -42,7 +42,7 @@ beginseg include "build/src/boot/O2/system_malloc.o" include "build/src/boot/O2/rand.o" include "build/src/boot/O2/__osMalloc.o" - include "build/src/libultra/libc/sprintf.o" + include "build/src/boot/O2/sprintf.o" include "build/src/boot/O2/printutils.o" include "build/src/boot/O2/sleep.o" include "build/asm/boot/setcause.text.o" diff --git a/src/libultra/libc/sprintf.c b/src/boot/O2/sprintf.c similarity index 100% rename from src/libultra/libc/sprintf.c rename to src/boot/O2/sprintf.c diff --git a/src/boot/boot_main.c b/src/boot/boot_main.c index cc2097f0f..0f95871ea 100644 --- a/src/boot/boot_main.c +++ b/src/boot/boot_main.c @@ -1,5 +1,5 @@ #include "prevent_bss_reordering.h" -#include "global.h" +#include "carthandle.h" #include "idle.h" #include "stack.h" #include "stackcheck.h" diff --git a/src/boot/carthandle.c b/src/boot/carthandle.c new file mode 100644 index 000000000..9a4cf542d --- /dev/null +++ b/src/boot/carthandle.c @@ -0,0 +1,3 @@ +#include "carthandle.h" + +OSPiHandle* gCartHandle = NULL; diff --git a/src/boot/viconfig.c b/src/boot/viconfig.c index ccba4e932..1b9f1135c 100644 --- a/src/boot/viconfig.c +++ b/src/boot/viconfig.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "libc/stdbool.h" #include "idle.h" void ViConfig_UpdateVi(u32 black) { diff --git a/src/boot/z_std_dma.c b/src/boot/z_std_dma.c index ac4992264..5b5265629 100644 --- a/src/boot/z_std_dma.c +++ b/src/boot/z_std_dma.c @@ -1,8 +1,10 @@ #include "prevent_bss_reordering.h" #include "global.h" +#include "carthandle.h" #include "fault.h" #include "stack.h" #include "stackcheck.h" +#include "z64dma.h" #include "z64thread.h" size_t gDmaMgrDmaBuffSize = 0x2000; diff --git a/tools/disasm/files.txt b/tools/disasm/files.txt index 23539f5f0..e170e97e3 100644 --- a/tools/disasm/files.txt +++ b/tools/disasm/files.txt @@ -247,7 +247,7 @@ # .data section 0x800969C0 : "rspboot", 0x80096B20 : "idle", - 0x80096B40 : "viconfig", + 0x80096B40 : "carthandle", 0x80096B50 : "z_std_dma", 0x80096B60 : "irqmgr", 0x80096B80 : "fault", From 2823a720bc1081a48cd142788622087adfd3e5dc Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Fri, 10 Nov 2023 10:28:16 +1100 Subject: [PATCH 21/28] Match `Environment_DrawSkyboxStarsImpl` (z_kankyo OK), introduce `rand.h` (#1476) * match Environment_DrawSkyboxStarsImpl * revert * PR Review * small fix * group pads together * Color_RGBA8_u32 --- include/alignment.h | 6 ++++++ include/color.h | 4 ++-- include/functions.h | 9 --------- include/rand.h | 23 +++++++++++++++++++++ include/variables.h | 1 - include/z64.h | 1 + src/boot/O2/rand.c | 8 +------- src/code/z_kankyo.c | 49 ++++++++++++++++++++------------------------- 8 files changed, 55 insertions(+), 46 deletions(-) create mode 100644 include/rand.h diff --git a/include/alignment.h b/include/alignment.h index f2fd65750..9e6fe11e6 100644 --- a/include/alignment.h +++ b/include/alignment.h @@ -13,6 +13,12 @@ #define ALIGNED(x) __attribute__ ((aligned (x))) #endif +#ifdef __sgi /* IDO compiler */ +#define UNALIGNED __unaligned +#else +#define UNALIGNED +#endif + #ifdef __sgi /* IDO compiler */ #define ALIGNOF(x) __builtin_alignof(x) #elif (__STDC_VERSION__ >= 201112L) /* C11 */ diff --git a/include/color.h b/include/color.h index def50caa8..7c0cd7d9f 100644 --- a/include/color.h +++ b/include/color.h @@ -1,5 +1,5 @@ -#ifndef _COLOR_H_ -#define _COLOR_H_ +#ifndef COLOR_H +#define COLOR_H #include "PR/ultratypes.h" diff --git a/include/functions.h b/include/functions.h index 0e0e3dcbb..330510a1d 100644 --- a/include/functions.h +++ b/include/functions.h @@ -65,15 +65,6 @@ void MtxConv_L2F(MtxF* mtx, Mtx* mf); s32 func_80086620(OSMesgQueue* param_1, PadMgr* param_2, OSContStatus* param_3); -u32 Rand_Next(void); -void Rand_Seed(u32 seed); -f32 Rand_ZeroOne(void); -f32 Rand_Centered(void); -void Rand_Seed_Variable(u32* rndNum, u32 seed); -u32 Rand_Next_Variable(u32* rndNum); -f32 Rand_ZeroOne_Variable(u32* rndNum); -f32 Rand_Centered_Variable(u32* rndNum); - s32 PrintUtils_VPrintf(PrintCallback* pfn, const char* fmt, va_list args); s32 PrintUtils_Printf(PrintCallback* pfn, const char* fmt, ...); void Sleep_Cycles(OSTime time); diff --git a/include/rand.h b/include/rand.h new file mode 100644 index 000000000..ad13e22a4 --- /dev/null +++ b/include/rand.h @@ -0,0 +1,23 @@ +#ifndef RAND_H +#define RAND_H + +#include "PR/ultratypes.h" + +//! These values are recommended by the algorithms book *Numerical Recipes in C. The Art of Scientific Computing*, 2nd +//! Edition, 1992, ISBN 0-521-43108-5. (p. 284): +//! > This is about as good as any 32-bit linear congruential generator, entirely adequate for many uses. +#define RAND_MULTIPLIER 1664525 +#define RAND_INCREMENT 1013904223 + +u32 Rand_Next(void); +void Rand_Seed(u32 seed); +f32 Rand_ZeroOne(void); +f32 Rand_Centered(void); +void Rand_Seed_Variable(u32* rndNum, u32 seed); +u32 Rand_Next_Variable(u32* rndNum); +f32 Rand_ZeroOne_Variable(u32* rndNum); +f32 Rand_Centered_Variable(u32* rndNum); + +extern u32 gRandFloat; + +#endif diff --git a/include/variables.h b/include/variables.h index 7b1313415..a2e1c6f63 100644 --- a/include/variables.h +++ b/include/variables.h @@ -31,7 +31,6 @@ extern u8* sYaz0MaxPtr; extern void* gYaz0DecompressDstEnd; // extern UNK_TYPE4 D_8009CD10; -extern u32 gRandFloat; // extern UNK_TYPE4 sArenaLockMsg; extern DmaEntry dmadata[1568]; diff --git a/include/z64.h b/include/z64.h index 28ae04de7..d8aa31074 100644 --- a/include/z64.h +++ b/include/z64.h @@ -24,6 +24,7 @@ #include "gfx.h" #include "gfxprint.h" #include "padutils.h" +#include "rand.h" #include "sys_matrix.h" #include "tha.h" #include "thga.h" diff --git a/src/boot/O2/rand.c b/src/boot/O2/rand.c index 9f3051717..152c8a0e7 100644 --- a/src/boot/O2/rand.c +++ b/src/boot/O2/rand.c @@ -1,4 +1,4 @@ -#include "global.h" +#include "rand.h" //! The latest generated random number, used to generate the next number in the sequence. static u32 sRandInt = 1; @@ -7,12 +7,6 @@ static u32 sRandInt = 1; //! This can't be static because it is used in z_kankyo. u32 gRandFloat; -//! These values are recommended by the algorithms book *Numerical Recipes in C. The Art of Scientific Computing*, 2nd -//! Edition, 1992, ISBN 0-521-43108-5. (p. 284): -//! > This is about as good as any 32-bit linear congruential generator, entirely adequate for many uses. -#define RAND_MULTIPLIER 1664525 -#define RAND_INCREMENT 1013904223 - /** * Generates the next pseudo-random integer. */ diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index 82a7a8df5..933d9f3b7 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -3108,10 +3108,6 @@ void Environment_DrawSkyboxStar(Gfx** gfxp, f32 x, f32 y, s32 width, s32 height) *gfxp = gfx; } -#ifdef NON_MATCHING -// `D_801DD900`is loading unaligned but storing aligned -// Also small float regalloc at the gRandFloat section -// https://decomp.me/scratch/3zFop void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { static const Vec3s D_801DD880[] = { { 0x0384, 0x2328, 0xD508 }, { 0x09C4, 0x2328, 0xDA1C }, { 0x0E74, 0x22D8, 0xDA1C }, { 0x1450, 0x2468, 0xD8F0 }, @@ -3119,24 +3115,26 @@ void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { { 0xD058, 0x4C2C, 0x3A98 }, { 0xD8F0, 0x36B0, 0x47E0 }, { 0xD954, 0x3264, 0x3E1C }, { 0xD8F0, 0x3070, 0x37DC }, { 0xD8F0, 0x1F40, 0x5208 }, { 0xD760, 0x1838, 0x27D8 }, { 0x0000, 0x4E20, 0x4A38 }, { 0x076C, 0x2328, 0xDCD8 }, }; - // Possibly Color_RGBA8_u32 - static const u32 D_801DD8E0[] = { - 0x41A4FFFF, 0x83A4E6FF, 0x62CDFFFF, 0x5252FFFF, 0x7BA4A4FF, 0x62CDFFFF, 0x62A4E6FF, 0xFF5A00FF, + static const Color_RGBA8_u32 D_801DD8E0[] = { + { 65, 164, 255, 255 }, { 131, 164, 230, 255 }, { 98, 205, 255, 255 }, { 82, 82, 255, 255 }, + { 123, 164, 164, 255 }, { 98, 205, 255, 255 }, { 98, 164, 230, 255 }, { 255, 90, 0, 255 }, }; - static const u32 D_801DD900[] = { - 0x405070FF, 0x606080FF, 0x807090FF, 0xA080A0FF, 0xC090A8FF, 0xE0A0B0FF, 0xE0A0B0FF, 0x686888FF, - 0x887898FF, 0xA888A8FF, 0xC898B8FF, 0xE8A8B8FF, 0xE0B0B8FF, 0xF0C0C0FF, 0xE8B8C0FF, 0xF8C8C0FF, + UNALIGNED static const Color_RGBA8_u32 D_801DD900[] = { + { 64, 80, 112, 255 }, { 96, 96, 128, 255 }, { 128, 112, 144, 255 }, { 160, 128, 160, 255 }, + { 192, 144, 168, 255 }, { 224, 160, 176, 255 }, { 224, 160, 176, 255 }, { 104, 104, 136, 255 }, + { 136, 120, 152, 255 }, { 168, 136, 168, 255 }, { 200, 152, 184, 255 }, { 232, 168, 184, 255 }, + { 224, 176, 184, 255 }, { 240, 192, 192, 255 }, { 232, 184, 192, 255 }, { 248, 200, 192, 255 }, }; Vec3f pos; - s32 pad1; - f32 imgY; // spF4 - f32 imgX; // spF0 + f32 temp; + f32 imgY; + f32 imgX; Gfx* gfx; - s32 phi_v1; // spE8 - s32 negateY; // spE4 + s32 phi_v1; + s32 negateY; f32 invScale; f32 temp_f20; - Gfx* gfxTemp; // spD8 + Gfx* gfxTemp; f32 scale; s32 i; u32 randInt; @@ -3190,17 +3188,18 @@ void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { f32 temp_f2; // temp_f4 = Rand_ZeroOne_Variable(&randInt); - randInt = (randInt * 1664525) + 1013904223; + randInt = (randInt * RAND_MULTIPLIER) + RAND_INCREMENT; gRandFloat = (randInt >> 9) | 0x3F800000; - temp_f4 = *((f32*)&gRandFloat) - 1.0f; + temp = *((f32*)&gRandFloat); + temp_f4 = temp - 1.0f; // temp_f20 = Rand_ZeroOne_Variable(&randInt); - randInt = (randInt * 1664525) + 1013904223; + randInt = (randInt * RAND_MULTIPLIER) + RAND_INCREMENT; gRandFloat = (randInt >> 9) | 0x3F800000; temp_f20 = ((*((f32*)&gRandFloat) - 1.0f) + temp_f4) * 0.5f; // randInt = Rand_Next_Variable(&randInt); - randInt = (randInt * 1664525) + 1013904223; + randInt = (randInt * RAND_MULTIPLIER) + RAND_INCREMENT; // Set random position pos.y = play->view.eye.y + (SQ(temp_f20) * SQ(128.0f)) - 1000.0f; @@ -3208,7 +3207,7 @@ void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { pos.z = play->view.eye.z + (Math_CosS(randInt) * (1.2f - temp_f20) * SQ(128.0f)); // temp_f2 = Rand_ZeroOne_Variable(&randInt); - randInt = (randInt * 1664525) + 1013904223; + randInt = (randInt * RAND_MULTIPLIER) + RAND_INCREMENT; gRandFloat = ((randInt >> 9) | 0x3F800000); temp_f2 = *((f32*)&gRandFloat) - 1.0f; @@ -3221,9 +3220,9 @@ void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { } if ((i < 15) || ((i == 15) && ((((void)0, gSaveContext.save.day) % 7) == 0))) { - gDPSetColor(gfx++, G_SETPRIMCOLOR, D_801DD8E0[i % ARRAY_COUNTU(D_801DD8E0)]); + gDPSetColor(gfx++, G_SETPRIMCOLOR, D_801DD8E0[i % ARRAY_COUNTU(D_801DD8E0)].rgba); } else if (((i & 0x3F) == 0) || (i == 16)) { - gDPSetColor(gfx++, G_SETPRIMCOLOR, D_801DD900[phi_v1 % ARRAY_COUNTU(D_801DD900)]); + gDPSetColor(gfx++, G_SETPRIMCOLOR, D_801DD900[phi_v1 % ARRAY_COUNTU(D_801DD900)].rgba); phi_v1++; } @@ -3265,10 +3264,6 @@ void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP) { gDPPipeSync(gfx++); *gfxP = gfx; } -#else -void Environment_DrawSkyboxStarsImpl(PlayState* play, Gfx** gfxP); -#pragma GLOBAL_ASM("asm/non_matchings/code/z_kankyo/Environment_DrawSkyboxStarsImpl.s") -#endif void Environment_Draw(PlayState* play) { Environment_SetupSkyboxStars(play); From a441a3cb2d51632f07b79579f0b100b962a3be76 Mon Sep 17 00:00:00 2001 From: Tharo <17233964+Thar0@users.noreply.github.com> Date: Fri, 10 Nov 2023 12:52:11 +0000 Subject: [PATCH 22/28] Decompile ovl_En_Po_Composer (#1391) * Decompiled, mostly named * Few more labels and document object * Review changes * Further review changes * Improve EnPoComposer_UpdateEnvColor * PO_COMPOSER -> POE_COMPOSER, tweak animation names * More changes * OCARINA_MODE_EVENT * fix merge --------- Co-authored-by: angie --- assets/xml/objects/object_po_composer.xml | 86 ++- spec | 3 +- .../ovl_En_Po_Composer/z_en_po_composer.c | 709 ++++++++++++++++-- .../ovl_En_Po_Composer/z_en_po_composer.h | 47 +- 4 files changed, 726 insertions(+), 119 deletions(-) diff --git a/assets/xml/objects/object_po_composer.xml b/assets/xml/objects/object_po_composer.xml index c45cf9039..81042139f 100644 --- a/assets/xml/objects/object_po_composer.xml +++ b/assets/xml/objects/object_po_composer.xml @@ -1,35 +1,37 @@  + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - + - - - - - + + + + + + + @@ -42,17 +44,21 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/spec b/spec index 1344fcade..be052f9e8 100644 --- a/spec +++ b/spec @@ -4229,8 +4229,7 @@ beginseg name "ovl_En_Po_Composer" compress include "build/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.o" - include "build/data/ovl_En_Po_Composer/ovl_En_Po_Composer.data.o" - include "build/data/ovl_En_Po_Composer/ovl_En_Po_Composer.reloc.o" + include "build/src/overlays/actors/ovl_En_Po_Composer/ovl_En_Po_Composer_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c index ed8606208..c668b054c 100644 --- a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c +++ b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.c @@ -1,7 +1,7 @@ /* * File: z_en_po_composer.c * Overlay: ovl_En_Po_Composer - * Description: Poe Composers + * Description: Poe Composers Flat and Sharp */ #include "z_en_po_composer.h" @@ -15,19 +15,23 @@ void EnPoComposer_Destroy(Actor* thisx, PlayState* play); void EnPoComposer_Update(Actor* thisx, PlayState* play); void EnPoComposer_Draw(Actor* thisx, PlayState* play); -void func_80BC5294(EnPoComposer* this, PlayState* play); -void func_80BC52F0(EnPoComposer* this, PlayState* play); -void func_80BC53A0(EnPoComposer* this, PlayState* play); -void func_80BC5404(EnPoComposer* this, PlayState* play); -void func_80BC5570(EnPoComposer* this, PlayState* play); -void func_80BC55E0(EnPoComposer* this, PlayState* play); -void func_80BC5670(EnPoComposer* this, PlayState* play); -void func_80BC56D0(EnPoComposer* this, PlayState* play); -void func_80BC5780(EnPoComposer* this, PlayState* play); -void func_80BC5830(EnPoComposer* this, PlayState* play); -void func_80BC58E0(EnPoComposer* this, PlayState* play); +void EnPoComposer_AwaitPlayer(EnPoComposer* this, PlayState* play); +void EnPoComposer_StartCutscene(EnPoComposer* this, PlayState* play); +void EnPoComposer_StartedCutscene(EnPoComposer* this, PlayState* play); +void EnPoComposer_PlayCurse(EnPoComposer* this, PlayState* play); +void EnPoComposer_IdleStill(EnPoComposer* this, PlayState* play); +void EnPoComposer_Appear(EnPoComposer* this, PlayState* play); +void EnPoComposer_Idle(EnPoComposer* this, PlayState* play); +void EnPoComposer_RaiseArms(EnPoComposer* this, PlayState* play); +void EnPoComposer_LowerArms(EnPoComposer* this, PlayState* play); +void EnPoComposer_CutscenePlayCurse(EnPoComposer* this, PlayState* play); +void EnPoComposer_Roll(EnPoComposer* this, PlayState* play); + +void EnPoComposer_SetupAwaitPlayer(EnPoComposer* this); +void EnPoComposer_SetupStartCutscene(EnPoComposer* this); +void EnPoComposer_SetupStartedCutscene(EnPoComposer* this); +void EnPoComposer_StepLightAlpha(EnPoComposer* this); -#if 0 ActorInit En_Po_Composer_InitVars = { /**/ ACTOR_EN_PO_COMPOSER, /**/ ACTORCAT_ITEMACTION, @@ -40,32 +44,56 @@ ActorInit En_Po_Composer_InitVars = { /**/ EnPoComposer_Draw, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_80BC6780 = { - { COLTYPE_HIT3, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, }, +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_HIT3, + AT_NONE, + AC_ON | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_1, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_ON, + }, { 20, 40, 20, { 0, 0, 0 } }, }; -// static ColliderJntSphElementInit sJntSphElementsInit[1] = { -static ColliderJntSphElementInit D_80BC67AC[1] = { +static ColliderJntSphElementInit sJntSphElementsInit[1] = { { - { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x08 }, { 0x00000000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, }, - { 9, { { 0, -1500, 0 }, 10 }, 100 }, + { + ELEMTYPE_UNK0, + { 0xF7CFFFFF, 0x00, 0x08 }, + { 0x00000000, 0x00, 0x00 }, + TOUCH_ON | TOUCH_SFX_NORMAL, + BUMP_NONE, + OCELEM_ON, + }, + { POE_COMPOSER_LIMB_LANTERN, { { 0, -1500, 0 }, 10 }, 100 }, }, }; -// static ColliderJntSphInit sJntSphInit = { -static ColliderJntSphInit D_80BC67D0 = { - { COLTYPE_HIT3, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, }, - ARRAY_COUNT(sJntSphElementsInit), D_80BC67AC, // sJntSphElementsInit, +static ColliderJntSphInit sJntSphInit = { + { + COLTYPE_HIT3, + AT_ON | AT_TYPE_ENEMY, + AC_ON | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_1, + COLSHAPE_JNTSPH, + }, + ARRAY_COUNT(sJntSphElementsInit), + sJntSphElementsInit, }; -// sColChkInfoInit -static CollisionCheckInfoInit D_80BC67E0 = { 4, 25, 50, 40 }; +static CollisionCheckInfoInit sColChkInfoInit = { 4, 25, 50, 40 }; -// static DamageTable sDamageTable = { -static DamageTable D_80BC67E8 = { +static DamageTable sDamageTable = { /* Deku Nut */ DMG_ENTRY(0, 0x0), /* Deku Stick */ DMG_ENTRY(2, 0x0), /* Horse trample */ DMG_ENTRY(1, 0x0), @@ -100,88 +128,619 @@ static DamageTable D_80BC67E8 = { /* Powder Keg */ DMG_ENTRY(0, 0x0), }; -// static InitChainEntry sInitChain[] = { -static InitChainEntry D_80BC6958[] = { +typedef enum { + /* 0 */ POE_COMPOSER_ANIM_STILL, + /* 1 */ POE_COMPOSER_ANIM_APPEAR_DISAPPEAR, + /* 2 */ POE_COMPOSER_ANIM_IDLE, + /* 3 */ POE_COMPOSER_ANIM_RAISE_ARMS, + /* 4 */ POE_COMPOSER_ANIM_ARMS_RAISED, + /* 5 */ POE_COMPOSER_ANIM_LOWER_ARMS, + /* 6 */ POE_COMPOSER_ANIM_LOOKING_DOWN, + /* 7 */ POE_COMPOSER_ANIM_BEGIN_PLAYING_CURSE, + /* 8 */ POE_COMPOSER_ANIM_PLAYING_CURSE, + /* 9 */ POE_COMPOSER_ANIM_BEGIN_ROLLING, + /* 10 */ POE_COMPOSER_ANIM_ROLLING, + /* 11 */ POE_COMPOSER_ANIM_FLEE, + /* 12 */ POE_COMPOSER_ANIM_ATTACK, + /* 13 */ POE_COMPOSER_ANIM_MAX +} EnPoComposerAnim; + +static AnimationInfo sAnimationInfo[POE_COMPOSER_ANIM_MAX] = { + /* 0 */ { &gPoeComposerStillAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 1 */ { &gPoeComposerAppearDisappearAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + /* 2 */ { &gPoeComposerIdleAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 3 */ { &gPoeComposerRaiseArmsAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 4 */ { &gPoeComposerArmsRaisedAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 5 */ { &gPoeComposerLowerArmsAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 6 */ { &gPoeComposerLookDownAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 7 */ { &gPoeComposerBeginPlayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 8 */ { &gPoeComposerPlayAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 9 */ { &gPoeComposerBeginRollAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 10 */ { &gPoeComposerRollAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 11 */ { &gPoeComposerFleeAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, + /* 12 */ { &gPoeComposerAttackAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f }, +}; + +static Color_RGBA8 sLightColorInit = { 255, 255, 210, 0 }; + +static Color_RGBA8 sEnvColorInit = { 0, 0, 0, 255 }; + +static Color_RGBA8 sSharpClothingColor1 = { 75, 20, 25, 255 }; + +static Color_RGBA8 sFlatClothingColor1 = { 80, 110, 90, 255 }; + +static Color_RGBA8 sSharpClothingColor2 = { 90, 85, 50, 255 }; + +static Color_RGBA8 sFlatClothingColor2 = { 100, 90, 100, 255 }; + +static InitChainEntry sInitChain[] = { ICHAIN_F32(targetArrowOffset, 3200, ICHAIN_STOP), }; -#endif +static s32 sPlayerIsPlayingOcarina = false; -extern ColliderCylinderInit D_80BC6780; -extern ColliderJntSphElementInit D_80BC67AC[1]; -extern ColliderJntSphInit D_80BC67D0; -extern CollisionCheckInfoInit D_80BC67E0; -extern DamageTable D_80BC67E8; -extern InitChainEntry D_80BC6958[]; +void EnPoComposer_Init(Actor* thisx, PlayState* play) { + EnPoComposer* this = THIS; -extern UNK_TYPE D_0600188C; -extern UNK_TYPE D_06006E08; -extern UNK_TYPE D_06006FD8; + Actor_ProcessInitChain(&this->actor, sInitChain); + ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); + SkelAnime_InitFlex(play, &this->skelAnime, &gPoeComposerSkel, &gPoeComposerIdleAnim, this->jointTable, + this->morphTable, POE_COMPOSER_LIMB_MAX); + Collider_InitJntSph(play, &this->lanternCollider); + Collider_SetJntSph(play, &this->lanternCollider, &this->actor, &sJntSphInit, this->lanternColliderElements); + Collider_InitCylinder(play, &this->bodyCollider); + Collider_SetCylinder(play, &this->bodyCollider, &this->actor, &sCylinderInit); + CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit); + this->lightNode = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo); + Lights_PointGlowSetInfo(&this->lightInfo, this->actor.home.pos.x, this->actor.home.pos.y, this->actor.home.pos.z, + 255, 255, 255, 0); + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->lightColor = sLightColorInit; + this->envColor = sEnvColorInit; + this->cueId = POE_COMPOSER_CUEID_NONE; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/EnPoComposer_Init.s") + if (POE_COMPOSER_IS_FLAT(&this->actor)) { + this->sharpCsNum = 0; + this->inCutscene = true; + EnPoComposer_SetupStartedCutscene(this); + } else if (POE_COMPOSER_4000(&this->actor)) { + if (gSaveContext.save.entrance != ENTRANCE(IKANA_CANYON, 10)) { + Actor_Kill(&this->actor); + return; + } + this->sharpCsNum = SHARP_CS_ENCOUNTER_FIRST; + this->inCutscene = true; + EnPoComposer_SetupStartedCutscene(this); + } else { + s32 i; + s16 csId = this->actor.csId; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/EnPoComposer_Destroy.s") + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_04)) { + Actor_Kill(&this->actor); + return; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5250.s") + for (i = 0; i < ARRAY_COUNT(this->csIds); i++) { + if (csId == CS_ID_NONE) { + break; + } + this->csIds[i] = csId; + csId = CutsceneManager_GetAdditionalCsId(csId); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5294.s") + if (CHECK_WEEKEVENTREG(WEEKEVENTREG_14_02)) { + this->sharpCsNum = SHARP_CS_ENCOUNTER_OTHER; + } else { + this->sharpCsNum = SHARP_CS_ENCOUNTER_FIRST; + } + this->inCutscene = false; + EnPoComposer_SetupAwaitPlayer(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC52D4.s") +void EnPoComposer_Destroy(Actor* thisx, PlayState* play) { + EnPoComposer* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC52F0.s") + LightContext_RemoveLight(play, &play->lightCtx, this->lightNode); + Collider_DestroyJntSph(play, &this->lanternCollider); + Collider_DestroyCylinder(play, &this->bodyCollider); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC538C.s") +void EnPoComposer_SetupAwaitPlayer(EnPoComposer* this) { + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_STILL); + this->actionFunc = EnPoComposer_AwaitPlayer; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC53A0.s") +void EnPoComposer_AwaitPlayer(EnPoComposer* this, PlayState* play) { + if (this->actor.xzDistToPlayer < 200.0f) { + EnPoComposer_SetupStartCutscene(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC53B0.s") +void EnPoComposer_SetupStartCutscene(EnPoComposer* this) { + this->inCutscene = true; + this->actionFunc = EnPoComposer_StartCutscene; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5404.s") +void EnPoComposer_StartCutscene(EnPoComposer* this, PlayState* play) { + if (CutsceneManager_IsNext(this->csIds[this->sharpCsNum])) { + CutsceneManager_Start(this->csIds[this->sharpCsNum], &this->actor); + EnPoComposer_SetupStartedCutscene(this); + } else { + if (CutsceneManager_GetCurrentCsId() == CS_ID_GLOBAL_TALK) { + CutsceneManager_Stop(CS_ID_GLOBAL_TALK); + } + CutsceneManager_Queue(this->csIds[this->sharpCsNum]); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC552C.s") +void EnPoComposer_SetupStartedCutscene(EnPoComposer* this) { + this->actionFunc = EnPoComposer_StartedCutscene; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5570.s") +void EnPoComposer_StartedCutscene(EnPoComposer* this, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5580.s") +void EnPoComposer_SetupPlayCurse(EnPoComposer* this) { + this->actionTimer = 0; + this->actor.flags |= ACTOR_FLAG_TARGETABLE; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_PLAYING_CURSE); + this->actionFunc = EnPoComposer_PlayCurse; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC55E0.s") +void EnPoComposer_PlayCurse(EnPoComposer* this, PlayState* play) { + Player* player = GET_PLAYER(play); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC562C.s") + // Damage the player every second + if (this->actionTimer == 20) { + func_800B8D10(play, &this->actor, 0.0f, 0, 0.0f, 1, 4); + this->actionTimer = 0; + } else { + this->actionTimer++; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5670.s") + // Ocarina check + if (player->stateFlags2 & PLAYER_STATE2_8000000) { + if (!sPlayerIsPlayingOcarina) { + // Play sound whenever the player begins playing the Ocarina + Audio_PlaySfx(NA_SE_SY_TRE_BOX_APPEAR); + } + sPlayerIsPlayingOcarina = true; + } else { + sPlayerIsPlayingOcarina = false; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5680.s") + // Song check, check if player just played song of storms or song of healing + if (play->msgCtx.ocarinaMode == OCARINA_MODE_EVENT) { + switch (play->msgCtx.lastPlayedSong) { + case OCARINA_SONG_STORMS: + this->sharpCsNum = SHARP_CS_SONG_STORMS; + EnPoComposer_SetupStartCutscene(this); + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC56D0.s") + case OCARINA_SONG_HEALING: + this->sharpCsNum = SHARP_CS_SONG_HEALING; + EnPoComposer_SetupStartCutscene(this); + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5738.s") + default: + break; + } + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5780.s") + // Play sharp's curse bgm + Audio_PlaySequenceAtPos(SEQ_PLAYER_BGM_SUB, &this->actor.projectedPos, NA_BGM_SHARPS_CURSE, 2000.0f); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC57E8.s") +void EnPoComposer_SetupIdleStill(EnPoComposer* this) { + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_STILL); + this->actionFunc = EnPoComposer_IdleStill; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5830.s") +void EnPoComposer_IdleStill(EnPoComposer* this, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5898.s") +void EnPoComposer_SetupAppear(EnPoComposer* this) { + this->actionTimer = 0; + Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_APPEAR); + Actor_PlaySfx(&this->actor, NA_SE_EN_PO_LAUGH); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_APPEAR_DISAPPEAR); + this->actionFunc = EnPoComposer_Appear; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC58E0.s") +void EnPoComposer_Appear(EnPoComposer* this, PlayState* play) { + this->actionTimer++; + this->actor.shape.rot.y += 0x1000; + if (this->actionTimer == 32) { + EnPoComposer_SetupIdleStill(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC59BC.s") +void EnPoComposer_SetupIdle(EnPoComposer* this) { + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_IDLE); + this->actionFunc = EnPoComposer_Idle; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC59EC.s") +void EnPoComposer_Idle(EnPoComposer* this, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5CC8.s") +void EnPoComposer_SetupRaiseArms(EnPoComposer* this) { + this->csCueTimer = 0; + Actor_PlaySfx(&this->actor, NA_SE_EN_SHARP_REACTION); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_RAISE_ARMS); + this->actionFunc = EnPoComposer_RaiseArms; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5D34.s") +void EnPoComposer_RaiseArms(EnPoComposer* this, PlayState* play) { + if ((this->csCueTimer == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + this->csCueTimer++; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_ARMS_RAISED); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5DEC.s") +void EnPoComposer_SetupLowerArms(EnPoComposer* this) { + this->csCueTimer = 0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_LOWER_ARMS); + this->actionFunc = EnPoComposer_LowerArms; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC5FE8.s") +void EnPoComposer_LowerArms(EnPoComposer* this, PlayState* play) { + if ((this->csCueTimer == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + this->csCueTimer++; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_LOOKING_DOWN); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/EnPoComposer_Update.s") +void EnPoComposer_SetupCutscenePlayCurse(EnPoComposer* this) { + this->csCueTimer = 0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_BEGIN_PLAYING_CURSE); + this->actionFunc = EnPoComposer_CutscenePlayCurse; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC60BC.s") +void EnPoComposer_CutscenePlayCurse(EnPoComposer* this, PlayState* play) { + if ((this->csCueTimer == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + this->csCueTimer++; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_PLAYING_CURSE); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/func_80BC617C.s") +void EnPoComposer_SetupRoll(EnPoComposer* this) { + this->csCueTimer = 0; + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_BEGIN_ROLLING); + this->actionFunc = EnPoComposer_Roll; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Po_Composer/EnPoComposer_Draw.s") +void EnPoComposer_Roll(EnPoComposer* this, PlayState* play) { + if (this->csCueTimer == 0) { + if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + this->csCueTimer++; + Actor_PlaySfx(&this->actor, NA_SE_EN_SHARP_REACTION); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, POE_COMPOSER_ANIM_ROLLING); + } + } else if (Animation_OnFrame(&this->skelAnime, 1.0f) && (this->lightColor.a > 32)) { + if (this->csCueTimer == 1) { + Actor_PlaySfx(&this->actor, NA_SE_EN_LAST3_DEAD_WIND2_OLD); + this->csCueTimer = 2; + } else { + Actor_PlaySfx(&this->actor, NA_SE_EN_LAST3_DEAD_WIND3_OLD); + this->csCueTimer = 1; + } + } +} + +void EnPoComposer_SharpCutsceneDone(EnPoComposer* this) { + SET_WEEKEVENTREG(WEEKEVENTREG_14_04); + Actor_Kill(&this->actor); +} + +s32 EnPoComposer_UpdateAction(EnPoComposer* this, PlayState* play) { + u16 cueType = POE_COMPOSER_IS_FLAT(&this->actor) ? CS_CMD_ACTOR_CUE_482 : CS_CMD_ACTOR_CUE_481; + s32 cueChannel; + + if (!this->inCutscene) { + return false; + } + + if (Cutscene_IsCueInChannel(play, cueType)) { + cueChannel = Cutscene_GetCueChannel(play, cueType); + + if (this->cueId != play->csCtx.actorCues[cueChannel]->id) { + this->cueId = play->csCtx.actorCues[cueChannel]->id; + + switch (play->csCtx.actorCues[cueChannel]->id) { + case POE_COMPOSER_CUEID_IDLE: // loop idle + EnPoComposer_SetupIdleStill(this); + break; + + case POE_COMPOSER_CUEID_APPEAR_SPIN: // appear/disappear -> loop idle + EnPoComposer_SetupAppear(this); + break; + + case POE_COMPOSER_CUEID_IDLE2: // loop sharp idle + EnPoComposer_SetupIdle(this); + break; + + case POE_COMPOSER_CUEID_RAISE_ARMS: // raise arms -> loop arms raised + EnPoComposer_SetupRaiseArms(this); + break; + + case POE_COMPOSER_CUEID_LOWER_ARMS: // lower arms -> loop idle + EnPoComposer_SetupLowerArms(this); + break; + + case POE_COMPOSER_CUEID_PLAY_CURSE: // begin playing -> loop playing + EnPoComposer_SetupCutscenePlayCurse(this); + break; + + case POE_COMPOSER_CUEID_ROLL: // begin rolling -> loop rolling + EnPoComposer_SetupRoll(this); + break; + + case POE_COMPOSER_CUEID_APPEAR: // appear + this->visible = true; + break; + + case POE_COMPOSER_CUEID_DISAPPEAR: // disappear + this->visible = false; + Actor_PlaySfx(&this->actor, NA_SE_EN_PO_DISAPPEAR); + break; + + case POE_COMPOSER_CUEID_DONE: + if (cueType == CS_CMD_ACTOR_CUE_481) { + EnPoComposer_SharpCutsceneDone(this); + } else { + Actor_Kill(&this->actor); + } + break; + + default: + break; + } + } + + if (this->actionFunc != EnPoComposer_Appear) { + Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); + } else { + Cutscene_ActorTranslate(&this->actor, play, cueChannel); + } + + EnPoComposer_StepLightAlpha(this); + + if ((this->sharpCsNum == SHARP_CS_SONG_STORMS) && (play->csCtx.curFrame == 204)) { + Audio_PlaySfx(NA_SE_SY_DIZZY_EFFECT); + } + + if (this->visible == true) { + Actor_PlaySfx_Flagged(&this->actor, NA_SE_EN_SHARP_FLOAT - SFX_FLAG); + } + return true; + } + + if ((this->actionFunc != EnPoComposer_StartedCutscene) && (this->actionFunc != EnPoComposer_StartCutscene) && + (this->actionFunc != EnPoComposer_PlayCurse) && (play->csCtx.state == CS_STATE_IDLE)) { + + if (POE_COMPOSER_IS_FLAT(&this->actor)) { + EnPoComposer_SetupStartedCutscene(this); + } else if (POE_COMPOSER_4000(&this->actor)) { + EnPoComposer_SetupStartedCutscene(this); + } else { + this->inCutscene = false; + + if (this->sharpCsNum < SHARP_CS_SONG_STORMS) { + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_14_02)) { + SET_WEEKEVENTREG(WEEKEVENTREG_14_02); + } + EnPoComposer_SetupPlayCurse(this); + } else { + EnPoComposer_SetupStartedCutscene(this); + } + } + } + + this->cueId = POE_COMPOSER_CUEID_NONE; + return false; +} + +void EnPoComposer_StepLightAlpha(EnPoComposer* this) { + if ((this->visible == true) && (this->lightColor.a != 255)) { + if (this->lightColor.a > 247) { + this->lightColor.a = 255; + } else { + this->lightColor.a += 7; + } + } else if (!this->visible && (this->lightColor.a != 0)) { + if (this->lightColor.a < 8) { + this->lightColor.a = 0; + } else { + this->lightColor.a -= 7; + } + } +} + +void EnPoComposer_StepLightColor(EnPoComposer* this) { + s16 color; + + color = this->lightColor.r + 5; + this->lightColor.r = CLAMP_MAX(color, 255); + + color = this->lightColor.g + 5; + this->lightColor.g = CLAMP_MAX(color, 255); + + if (this->lightColor.b > 210) { + color = this->lightColor.b - 5; + this->lightColor.b = CLAMP_MIN(color, 210); + } else { + color = this->lightColor.b + 5; + this->lightColor.b = CLAMP_MAX(color, 210); + } +} + +void EnPoComposer_UpdateEnvColor(EnPoComposer* this) { + if ((this->actionFunc == EnPoComposer_Appear) && (this->skelAnime.curFrame < 12.0f)) { + // Step rgb from 55 to 255 and alpha from 0 to 200 over the first 12 frames of the appear anim + this->envColor.r = this->envColor.g = this->envColor.b = 55.0f + this->skelAnime.curFrame * 16.66f; + this->envColor.a = this->skelAnime.curFrame * (200.0f / 12.0f); + } else { + f32 rand = Rand_ZeroOne(); + + this->envColor.r = 225 + (s32)(rand * 30.0f); + this->envColor.g = 155 + (s32)(rand * 100.0f); + this->envColor.b = 95 + (s32)(rand * 160.0f); + this->envColor.a = 200; + } + if (this->lightColor.a == 0) { + this->envColor.a = 0; + } +} + +void EnPoComposer_UpdateCollision(EnPoComposer* this, PlayState* play) { + Collider_UpdateCylinder(&this->actor, &this->bodyCollider); + CollisionCheck_SetOC(play, &play->colChkCtx, &this->bodyCollider.base); + CollisionCheck_SetOC(play, &play->colChkCtx, &this->lanternCollider.base); +} + +void EnPoComposer_Update(Actor* thisx, PlayState* play) { + EnPoComposer* this = THIS; + + EnPoComposer_UpdateEnvColor(this); + SkelAnime_Update(&this->skelAnime); + Actor_SetFocus(&this->actor, 42.0f); + + this->actionFunc(this, play); + + if (!EnPoComposer_UpdateAction(this, play)) { + EnPoComposer_UpdateCollision(this, play); + } +} + +s32 EnPoComposer_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx, + Gfx** gfx) { + EnPoComposer* this = THIS; + + if ((this->lightColor.a == 0) || (limbIndex == POE_COMPOSER_LIMB_LANTERN)) { + *dList = NULL; + } else if (POE_COMPOSER_IS_FLAT(&this->actor) && (limbIndex == POE_COMPOSER_LIMB_HEAD)) { + *dList = gPoeComposerFlatHeadDL; + } + + if (limbIndex == 19) { + //! @bug skeleton does not have a limb 19, this is leftover from OoT Poes + gDPPipeSync((*gfx)++); + gDPSetEnvColor((*gfx)++, this->lightColor.r, this->lightColor.g, this->lightColor.b, this->lightColor.a); + } + + return false; +} + +void EnPoComposer_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) { + EnPoComposer* this = THIS; + + Collider_UpdateSpheres(limbIndex, &this->lanternCollider); + if (limbIndex == POE_COMPOSER_LIMB_LANTERN) { + Matrix_Get(&this->lanternMtxF); + } +} + +void EnPoComposer_Draw(Actor* thisx, PlayState* play) { + EnPoComposer* this = THIS; + s32 pad; + Gfx* dl; + Color_RGBA8* clothingColor; + Color_RGBA8* var_t0; + Vec3f lightOffset; + Vec3s lightPos; + + OPEN_DISPS(play->state.gfxCtx); + + EnPoComposer_StepLightColor(this); + + // Select colors + + if (POE_COMPOSER_IS_FLAT(&this->actor)) { + clothingColor = &sFlatClothingColor1; + var_t0 = &sFlatClothingColor2; + } else { + clothingColor = &sSharpClothingColor1; + var_t0 = &sSharpClothingColor2; + } + + // Draw skeleton + + if ((this->lightColor.a == 255) || (this->lightColor.a == 0)) { + Gfx_SetupDL25_Opa(play->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0x08, + Gfx_EnvColor(play->state.gfxCtx, this->lightColor.r, this->lightColor.g, this->lightColor.b, + this->lightColor.a)); + gSPSegment( + POLY_OPA_DISP++, 0x0A, + Gfx_EnvColor(play->state.gfxCtx, clothingColor->r, clothingColor->g, clothingColor->b, this->lightColor.a)); + gSPSegment(POLY_OPA_DISP++, 0x0B, + Gfx_EnvColor(play->state.gfxCtx, var_t0->r, var_t0->g, var_t0->b, this->lightColor.a)); + gSPSegment(POLY_OPA_DISP++, 0x0C, D_801AEFA0); + + POLY_OPA_DISP = + SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, + EnPoComposer_OverrideLimbDraw, EnPoComposer_PostLimbDraw, &this->actor, POLY_OPA_DISP); + } else { + Gfx_SetupDL25_Opa(play->state.gfxCtx); + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_EnvColor(play->state.gfxCtx, this->lightColor.r, this->lightColor.g, this->lightColor.b, + this->lightColor.a)); + gSPSegment( + POLY_XLU_DISP++, 0x0A, + Gfx_EnvColor(play->state.gfxCtx, clothingColor->r, clothingColor->g, clothingColor->b, this->lightColor.a)); + gSPSegment(POLY_XLU_DISP++, 0x0B, + Gfx_EnvColor(play->state.gfxCtx, var_t0->r, var_t0->g, var_t0->b, this->lightColor.a)); + gSPSegment(POLY_XLU_DISP++, 0x0C, D_801AEF88); + + POLY_XLU_DISP = + SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, + EnPoComposer_OverrideLimbDraw, EnPoComposer_PostLimbDraw, &this->actor, POLY_XLU_DISP); + } + + if (this->lightColor.a != 0) { + // Draw lantern if visible + + if (this->lightColor.a == 255) { + Scene_SetRenderModeXlu(play, 0, 1); + dl = POLY_OPA_DISP; + } else { + Scene_SetRenderModeXlu(play, 1, 2); + dl = POLY_XLU_DISP; + } + + gDPPipeSync(&dl[0]); + gDPSetEnvColor(&dl[1], this->envColor.r, this->envColor.g, this->envColor.b, this->lightColor.a); + + Matrix_Put(&this->lanternMtxF); + gSPMatrix(&dl[2], Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPDisplayList(&dl[3], gPoeComposerLanternBaseDL); + gSPDisplayList(&dl[4], gPoeComposerLanternGlassDL); + + gDPPipeSync(&dl[5]); + gDPSetEnvColor(&dl[6], clothingColor->r, clothingColor->g, clothingColor->b, this->lightColor.a); + gSPDisplayList(&dl[7], gPoeComposerLanternTopDL); + + if (this->lightColor.a == 255) { + POLY_OPA_DISP = &dl[8]; + } else { + POLY_XLU_DISP = &dl[8]; + } + } + + Matrix_Put(&play->billboardMtxF); + Matrix_MultVecZ(15.0f, &lightOffset); + lightPos = this->lanternCollider.elements[0].dim.worldSphere.center; + lightPos.x += (s16)lightOffset.x; + lightPos.y += (s16)lightOffset.y; + lightPos.z += (s16)lightOffset.z; + + Lights_PointGlowSetInfo(&this->lightInfo, lightPos.x, lightPos.y, lightPos.z, this->envColor.r, this->envColor.g, + this->envColor.b, this->envColor.a * (200.0f / 255.0f)); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h index a42b5048f..55d751839 100644 --- a/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h +++ b/src/overlays/actors/ovl_En_Po_Composer/z_en_po_composer.h @@ -2,6 +2,32 @@ #define Z_EN_PO_COMPOSER_H #include "global.h" +#include "objects/object_po_composer/object_po_composer.h" + +#define POE_COMPOSER_IS_FLAT(thisx) ((thisx)->params & 0x8000) +#define POE_COMPOSER_4000(thisx) ((thisx)->params & 0x4000) + +typedef enum { + /* 1 */ POE_COMPOSER_CUEID_IDLE = 1, + /* 2 */ POE_COMPOSER_CUEID_APPEAR_SPIN, + /* 3 */ POE_COMPOSER_CUEID_IDLE2, + /* 4 */ POE_COMPOSER_CUEID_RAISE_ARMS, + /* 5 */ POE_COMPOSER_CUEID_LOWER_ARMS, + /* 6 */ POE_COMPOSER_CUEID_PLAY_CURSE, + /* 7 */ POE_COMPOSER_CUEID_ROLL, + /* 8 */ POE_COMPOSER_CUEID_APPEAR, + /* 9 */ POE_COMPOSER_CUEID_DISAPPEAR, + /* 10 */ POE_COMPOSER_CUEID_DONE, + /* 99 */ POE_COMPOSER_CUEID_NONE = 99 +} EnPoComposerCueId; + +typedef enum { + /* 0 */ SHARP_CS_ENCOUNTER_FIRST, + /* 1 */ SHARP_CS_ENCOUNTER_OTHER, + /* 2 */ SHARP_CS_SONG_HEALING, + /* 3 */ SHARP_CS_SONG_STORMS, + /* 4 */ SHARP_CS_MAX +} SharpCsIdIndex; struct EnPoComposer; @@ -9,9 +35,26 @@ typedef void (*EnPoComposerActionFunc)(struct EnPoComposer*, PlayState*); typedef struct EnPoComposer { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0xF0]; + /* 0x144 */ ColliderCylinder bodyCollider; + /* 0x190 */ ColliderJntSph lanternCollider; + /* 0x1B0 */ ColliderJntSphElement lanternColliderElements[1]; + /* 0x1F0 */ SkelAnime skelAnime; /* 0x234 */ EnPoComposerActionFunc actionFunc; - /* 0x238 */ char unk_238[0x108]; + /* 0x238 */ MtxF lanternMtxF; + /* 0x278 */ LightNode* lightNode; + /* 0x27C */ LightInfo lightInfo; + /* 0x28A */ UNK_TYPE1 unk_28A[0x6]; + /* 0x290 */ s32 sharpCsNum; + /* 0x294 */ Vec3s jointTable[POE_COMPOSER_LIMB_MAX]; + /* 0x2DC */ Vec3s morphTable[POE_COMPOSER_LIMB_MAX]; + /* 0x324 */ s16 csIds[SHARP_CS_MAX]; + /* 0x32C */ s16 actionTimer; + /* 0x32E */ s16 csCueTimer; + /* 0x330 */ s16 inCutscene; + /* 0x332 */ s16 visible; + /* 0x334 */ u16 cueId; + /* 0x336 */ Color_RGBA8 lightColor; + /* 0x33A */ Color_RGBA8 envColor; } EnPoComposer; // size = 0x340 #endif // Z_EN_PO_COMPOSER_H From b2535fc75a845adffbec760f58c2d654b99f2964 Mon Sep 17 00:00:00 2001 From: Tharo <17233964+Thar0@users.noreply.github.com> Date: Sat, 11 Nov 2023 12:34:27 +0000 Subject: [PATCH 23/28] Fix aliasing in Cutscene_SetActorCue (#1483) Co-authored-by: Revo --- src/code/z_demo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code/z_demo.c b/src/code/z_demo.c index fa0419de4..26221708c 100644 --- a/src/code/z_demo.c +++ b/src/code/z_demo.c @@ -1127,7 +1127,7 @@ void Cutscene_SetActorCue(CutsceneContext* csCtx, u8** script, s16 cueChannel) { *script += sizeof(numCues); for (i = 0; i < numCues; i++) { - CsCmdActorCue* cue = *(CsCmdActorCue**)script; + CsCmdActorCue* cue = (CsCmdActorCue*)(*script); if ((csCtx->curFrame >= cue->startFrame) && (csCtx->curFrame < cue->endFrame)) { csCtx->actorCues[cueChannel] = cue; From 8d33d36a9b15f7484f44efe926deac8fd7ee81db Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sun, 12 Nov 2023 00:27:01 +1100 Subject: [PATCH 24/28] fix Misc Data (#1484) --- src/code/z_parameter.c | 1 + src/overlays/actors/ovl_En_Pr2/z_en_pr2.c | 2 +- src/overlays/actors/ovl_En_Zog/z_en_zog.c | 75 ++++++++--------------- tools/disasm/variables.txt | 2 +- 4 files changed, 28 insertions(+), 52 deletions(-) diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 898de0b41..1d0b35e93 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -4344,6 +4344,7 @@ void Interface_DrawClock(PlayState* play) { CLOCK_TIME(10, 0), CLOCK_TIME(11, 0), CLOCK_TIME(12, 0), CLOCK_TIME(13, 0), CLOCK_TIME(14, 0), CLOCK_TIME(15, 0), CLOCK_TIME(16, 0), CLOCK_TIME(17, 0), CLOCK_TIME(18, 0), CLOCK_TIME(19, 0), CLOCK_TIME(20, 0), CLOCK_TIME(21, 0), CLOCK_TIME(22, 0), CLOCK_TIME(23, 0), CLOCK_TIME(24, 0) - 1, + CLOCK_TIME(0, 0), }; static TexturePtr sThreeDayClockHourTextures[] = { gThreeDayClockHour12Tex, gThreeDayClockHour1Tex, gThreeDayClockHour2Tex, gThreeDayClockHour3Tex, diff --git a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c index 6eed95020..e4f6a6fad 100644 --- a/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c +++ b/src/overlays/actors/ovl_En_Pr2/z_en_pr2.c @@ -99,7 +99,7 @@ static AnimationHeader* sAnimations[] = { &object_pr_Anim_003904, }; -u8 D_80A75C38[] = { ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP }; +u8 D_80A75C38[] = { ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE }; s16 D_80A75C3C[] = { 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, diff --git a/src/overlays/actors/ovl_En_Zog/z_en_zog.c b/src/overlays/actors/ovl_En_Zog/z_en_zog.c index a09670a99..a4945b2e0 100644 --- a/src/overlays/actors/ovl_En_Zog/z_en_zog.c +++ b/src/overlays/actors/ovl_En_Zog/z_en_zog.c @@ -69,42 +69,17 @@ static TexturePtr D_80B958AC[] = { object_zog_Tex_024750, object_zog_Tex_024F50, static TexturePtr D_80B958B8[] = { object_zog_Tex_025F50, object_zog_Tex_026750 }; -static AnimationHeader* D_80B958C0[] = { +static AnimationHeader* sAnimations[] = { &object_zog_Anim_00FC0C, &object_zog_Anim_0106B0, &object_zog_Anim_0166F4, &object_zog_Anim_017170, - &object_zog_Anim_014B10, &object_zog_Anim_018600, &object_zog_Anim_01A06C, + &object_zog_Anim_014B10, &object_zog_Anim_018600, &object_zog_Anim_01A06C, &object_zog_Anim_00CA94, + &object_zog_Anim_00F110, &object_zog_Anim_01579C, &object_zog_Anim_015B80, &object_zog_Anim_00ECBC, + &object_zog_Anim_008EB8, &object_zog_Anim_0099A4, &object_zog_Anim_00931C, &object_zog_Anim_009EC4, + &object_zog_Anim_00B01C, &object_zog_Anim_00BF38, &object_zog_Anim_01A990, &object_zog_Anim_01AD58, + &object_zog_Anim_01B72C, &object_zog_Anim_01BC88, &object_zog_Anim_001000, &object_zog_Anim_001970, + &object_zog_Anim_002344, &object_zog_Anim_002894, &object_zog_Anim_0030E0, &object_zog_Anim_0037F8, + &object_zog_Anim_0041D0, &object_zog_Anim_004BDC, &object_zog_Anim_0055B4, }; -static AnimationHeader* D_80B958DC[] = { &object_zog_Anim_00CA94, &object_zog_Anim_00F110 }; - -static AnimationHeader* D_80B958E4[] = { &object_zog_Anim_01579C, &object_zog_Anim_015B80, &object_zog_Anim_00ECBC }; - -static AnimationHeader* D_80B958F0[] = { &object_zog_Anim_008EB8, &object_zog_Anim_0099A4 }; - -static AnimationHeader* D_80B958F8[] = { &object_zog_Anim_00931C, &object_zog_Anim_009EC4, &object_zog_Anim_00B01C }; - -static AnimationHeader* D_80B95904[] = { - &object_zog_Anim_00BF38, &object_zog_Anim_01A990, &object_zog_Anim_01AD58, - &object_zog_Anim_01B72C, &object_zog_Anim_01BC88, -}; - -static AnimationHeader* D_80B95918 = &object_zog_Anim_001000; - -static AnimationHeader* D_80B9591C = &object_zog_Anim_001970; - -static AnimationHeader* D_80B95920 = &object_zog_Anim_002344; - -static AnimationHeader* D_80B95924 = &object_zog_Anim_002894; - -static AnimationHeader* D_80B95928 = &object_zog_Anim_0030E0; - -static AnimationHeader* D_80B9592C = &object_zog_Anim_0037F8; - -static AnimationHeader* D_80B95930 = &object_zog_Anim_0041D0; - -static AnimationHeader* D_80B95934 = &object_zog_Anim_004BDC; - -static AnimationHeader* D_80B95938 = &object_zog_Anim_0055B4; - static s16 D_80B9593C[] = { 0, 1, 2, 3 }; static s16 D_80B95944[] = { 4, 5 }; @@ -272,7 +247,7 @@ void EnZog_Init(Actor* thisx, PlayState* play) { this->unk_31C = 2; this->unk_31E = 0; - Animation_PlayLoop(&this->skelAnime, D_80B958DC[0]); + Animation_PlayLoop(&this->skelAnime, sAnimations[7]); this->actor.textId = 0x1009; if (CHECK_WEEKEVENTREG(WEEKEVENTREG_91_02)) { this->actor.textId = 0x103C; @@ -296,7 +271,7 @@ void EnZog_Destroy(Actor* thisx, PlayState* play) { } void func_80B939C0(EnZog* this, s16 arg1, u8 arg2) { - Animation_Change(&this->skelAnime, D_80B958C0[arg1], 1.0f, 0.0f, Animation_GetLastFrame(D_80B958C0[arg1]), arg2, + Animation_Change(&this->skelAnime, sAnimations[arg1], 1.0f, 0.0f, Animation_GetLastFrame(sAnimations[arg1]), arg2, -5.0f); this->unk_304 = arg1; } @@ -324,7 +299,7 @@ void func_80B93A48(EnZog* this, PlayState* play) { table = D_80B95974[this->unk_2FC]; this->unk_304 = table[this->unk_302]; - Animation_PlayOnce(&this->skelAnime, D_80B958C0[this->unk_304]); + Animation_PlayOnce(&this->skelAnime, sAnimations[this->unk_304]); SkelAnime_Update(&this->skelAnime); } } @@ -407,13 +382,13 @@ s32 func_80B93EA0(EnZog* this, PlayState* play) { switch (this->cueId) { case 2: case 3: - Animation_PlayLoop(&this->skelAnime, *D_80B958F0); + Animation_PlayLoop(&this->skelAnime, sAnimations[12]); this->unk_31C = 0; this->unk_31E = 1; break; case 4: - Animation_PlayLoop(&this->skelAnime, *D_80B958F8); + Animation_PlayLoop(&this->skelAnime, sAnimations[14]); this->unk_31C = 2; this->unk_31E = 1; break; @@ -421,38 +396,38 @@ s32 func_80B93EA0(EnZog* this, PlayState* play) { case 5: switch (this->unk_304) { case 16: - Animation_PlayOnce(&this->skelAnime, *D_80B95904); + Animation_PlayOnce(&this->skelAnime, sAnimations[17]); this->unk_304 = 17; this->unk_31C = 2; this->unk_31E = 0; break; case 17: - Animation_Change(&this->skelAnime, *D_80B958DC, 0.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f); + Animation_Change(&this->skelAnime, sAnimations[7], 0.0f, 0.0f, 0.0f, ANIMMODE_LOOP, 0.0f); break; } break; case 6: - Animation_PlayLoop(&this->skelAnime, *D_80B958E4); + Animation_PlayLoop(&this->skelAnime, sAnimations[9]); this->unk_31C = 1; this->unk_31E = 1; break; case 12: - Animation_PlayLoop(&this->skelAnime, D_80B95930); + Animation_PlayLoop(&this->skelAnime, sAnimations[28]); break; case 13: - Animation_PlayLoop(&this->skelAnime, D_80B95938); + Animation_PlayLoop(&this->skelAnime, sAnimations[30]); break; case 14: - Animation_PlayLoop(&this->skelAnime, D_80B95928); + Animation_PlayLoop(&this->skelAnime, sAnimations[26]); break; case 15: - Animation_PlayLoop(&this->skelAnime, D_80B9591C); + Animation_PlayLoop(&this->skelAnime, sAnimations[23]); break; } SkelAnime_Update(&this->skelAnime); @@ -559,24 +534,24 @@ s32 func_80B93EA0(EnZog* this, PlayState* play) { break; case 11: - Animation_PlayLoop(&this->skelAnime, D_80B95920); + Animation_PlayLoop(&this->skelAnime, sAnimations[24]); break; case 12: - Animation_PlayOnce(&this->skelAnime, D_80B9592C); + Animation_PlayOnce(&this->skelAnime, sAnimations[27]); break; case 13: - Animation_PlayOnce(&this->skelAnime, D_80B95934); + Animation_PlayOnce(&this->skelAnime, sAnimations[29]); break; case 14: this->unk_30A |= 2; - Animation_PlayOnce(&this->skelAnime, D_80B95924); + Animation_PlayOnce(&this->skelAnime, sAnimations[25]); break; case 15: - Animation_PlayOnce(&this->skelAnime, D_80B95918); + Animation_PlayOnce(&this->skelAnime, sAnimations[22]); break; } } diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 65add1c07..ea7ef1dac 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -15075,7 +15075,7 @@ 0x80B95880:("D_80B95880","UNK_TYPE1","",0x1), 0x80B958AC:("D_80B958AC","UNK_TYPE4","",0x4), 0x80B958B8:("D_80B958B8","UNK_TYPE4","",0x4), - 0x80B958C0:("D_80B958C0","UNK_TYPE1","",0x1), + 0x80B958C0:("sAnimations","UNK_TYPE1","",0x1), 0x80B958DC:("D_80B958DC","UNK_TYPE4","",0x4), 0x80B958E4:("D_80B958E4","UNK_TYPE4","",0x4), 0x80B958F0:("D_80B958F0","UNK_TYPE4","",0x4), From 71d83a5e15c69e5f2e91f45f55448f49bb215897 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Sun, 12 Nov 2023 09:08:39 +1100 Subject: [PATCH 25/28] Match `func_801457CC` (z_sram_NES.c OK) (#1472) * Match func_801457CC * cleanup * pads * ITEM_NUM_SLOTS * fix macro --- src/code/z_parameter.c | 2 +- src/code/z_sram_NES.c | 125 +++++++++--------- .../actors/ovl_En_Thiefbird/z_en_thiefbird.c | 3 +- .../ovl_kaleido_scope/z_kaleido_debug.c | 10 +- 4 files changed, 69 insertions(+), 71 deletions(-) diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index 1d0b35e93..cf3b93b7d 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -3121,7 +3121,7 @@ void Inventory_UnequipItem(s16 item) { s32 Inventory_ReplaceItem(PlayState* play, u8 oldItem, u8 newItem) { u8 i; - for (i = 0; i < 24; i++) { + for (i = 0; i < ITEM_NUM_SLOTS; i++) { if (gSaveContext.save.saveInfo.inventory.items[i] == oldItem) { gSaveContext.save.saveInfo.inventory.items[i] = newItem; diff --git a/src/code/z_sram_NES.c b/src/code/z_sram_NES.c index 696d79823..e4eb1ef9a 100644 --- a/src/code/z_sram_NES.c +++ b/src/code/z_sram_NES.c @@ -1,6 +1,7 @@ #include "global.h" #include "z64horse.h" #include "overlays/gamestates/ovl_file_choose/z_file_select.h" +#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" void Sram_SyncWriteToFlash(SramContext* sramCtx, s32 curPage, s32 numPages); void func_80147314(SramContext* sramCtx, s32 fileNum); @@ -270,7 +271,7 @@ u32 gSramSlotOffsets[] = { OOT_SLOT_OFFSET(5), }; -u8 gAmmoItems[] = { +u8 gAmmoItems[ITEM_NUM_SLOTS] = { ITEM_NONE, // SLOT_OCARINA ITEM_BOW, // SLOT_BOW ITEM_NONE, // SLOT_ARROW_FIRE @@ -529,7 +530,7 @@ void Sram_SaveEndOfCycle(PlayState* play) { } } - for (i = 0; i < ARRAY_COUNT(gAmmoItems); i++) { + for (i = 0; i < ITEM_NUM_SLOTS; i++) { if (gAmmoItems[i] != ITEM_NONE) { if ((gSaveContext.save.saveInfo.inventory.items[i] != ITEM_NONE) && (i != SLOT_PICTOGRAPH_BOX)) { item = gSaveContext.save.saveInfo.inventory.items[i]; @@ -1375,18 +1376,17 @@ void func_80145698(SramContext* sramCtx) { } // Verifies save and use backup if corrupted? -#ifdef NON_EQUIVALENT void func_801457CC(GameState* gameState, SramContext* sramCtx) { FileSelectState* fileSelect = (FileSelectState*)gameState; u16 sp7A; - u16 oldCheckSum; // s2 + u16 oldCheckSum; u16 sp76; - u16 sp64; // sp74? + u16 sp64; u16 phi_s2; - u16 phi_s7; + u16 pad; u16 sp6E; - u16 newCheckSum; // v0 - u16 phi_a0; // maskCount + u16 newCheckSum; + u16 maskCount; if (gSaveContext.flashSaveAvailable) { D_801F6AF0 = gSaveContext.save.time; @@ -1424,23 +1424,23 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); // test checksum of main save - oldCheckSum = gSaveContext.save.saveInfo.checksum; + phi_s2 = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]); - gSaveContext.save.saveInfo.checksum = oldCheckSum; + gSaveContext.save.saveInfo.checksum = phi_s2; - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) { + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (newCheckSum != phi_s2)) { // checksum didnt match, try backup save sp6E = 1; if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') && - (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) { - phi_s2 = false; - } - - // phi_s2 = false; + (gSaveContext.save.saveInfo.playerData.newf[1] == 'E') && + (gSaveContext.save.saveInfo.playerData.newf[2] == 'L') && + (gSaveContext.save.saveInfo.playerData.newf[3] == 'D') && + (gSaveContext.save.saveInfo.playerData.newf[4] == 'A')) {} // read backup save from flash + phi_s2 = false; if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]) != 0) { // backup save didn't work @@ -1453,9 +1453,8 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { oldCheckSum = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; - //! FAKE: (s32)sp64 if (phi_s2 || CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || - (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[(s32)sp64]))) { + (oldCheckSum != Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]))) { // backup save didn't work bzero(sramCtx->saveBuf, SAVE_BUFFER_SIZE); Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); @@ -1465,9 +1464,8 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { } gSaveContext.save.saveInfo.checksum = 0; - // FAKE: Needed? - gSaveContext.save.saveInfo.checksum = - Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]); + //! FAKE: [sp64 + 0]? + gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 + 0]); for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) { fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A]; @@ -1490,14 +1488,14 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees; fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET); - for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) { - if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) { - phi_a0++; + for (sp7A = 0, maskCount = 0; sp7A < MASK_NUM_SLOTS; sp7A++) { + if (gSaveContext.save.saveInfo.inventory.items[sp7A + ITEM_NUM_SLOTS] == ITEM_NONE) { + continue; } + maskCount++; } - fileSelect->maskCount[sp76] = phi_a0; - fileSelect->heartPieceCount[sp76] = - ((gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C); + fileSelect->maskCount[sp76] = maskCount; + fileSelect->heartPieceCount[sp76] = GET_QUEST_HEART_PIECE_COUNT; } if (sp6E == 1) { @@ -1506,20 +1504,20 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64], gFlashSpecialSaveNumPages[sp64]); } else if (!sp6E) { // main save - phi_s7 = gSaveContext.save.saveInfo.checksum; + oldCheckSum = gSaveContext.save.saveInfo.checksum; if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]) != 0) { - oldCheckSum = 1; + phi_s2 = 1; } else { Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); - oldCheckSum = gSaveContext.save.saveInfo.checksum; + phi_s2 = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; sp7A = Sram_CalcChecksum(&gSaveContext.save, sizeof(Save)); } - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) || - (oldCheckSum != phi_s7)) { + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (sp7A != phi_s2) || + (oldCheckSum != phi_s2)) { SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]); Lib_MemCpy(&gSaveContext.save, sramCtx->saveBuf, sizeof(Save)); Lib_MemCpy(&sramCtx->saveBuf[0x2000], &gSaveContext.save, sizeof(Save)); @@ -1539,24 +1537,26 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); } else { Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); - oldCheckSum = gSaveContext.save.saveInfo.checksum; + phi_s2 = gSaveContext.save.saveInfo.checksum; // test checksum of main save gSaveContext.save.saveInfo.checksum = 0; newCheckSum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]); - gSaveContext.save.saveInfo.checksum = oldCheckSum; + gSaveContext.save.saveInfo.checksum = phi_s2; - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != newCheckSum)) { + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (newCheckSum != phi_s2)) { // checksum didnt match, try backup save sp6E = 1; if ((gSaveContext.save.saveInfo.playerData.newf[0] == 'Z') && - (gSaveContext.save.saveInfo.playerData.newf[1] == 'E')) { - phi_s2 = false; - } + (gSaveContext.save.saveInfo.playerData.newf[1] == 'E') && + (gSaveContext.save.saveInfo.playerData.newf[2] == 'L') && + (gSaveContext.save.saveInfo.playerData.newf[3] == 'D') && + (gSaveContext.save.saveInfo.playerData.newf[4] == 'A')) {} + phi_s2 = false; // read backup save from flash if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], - gFlashSaveNumPages[sp64 + 1])) { + gFlashSaveNumPages[sp64 + 1]) != 0) { // backup save didn't work phi_s2 = true; } @@ -1577,9 +1577,8 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { } gSaveContext.save.saveInfo.checksum = 0; - // FAKE: Needed? - gSaveContext.save.saveInfo.checksum = - Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 & 0xFFFFFFFF]); + // FAKE: [sp64 + 0]? + gSaveContext.save.saveInfo.checksum = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64 + 0]); for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.newf); sp7A++) { fileSelect->newf[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.newf[sp7A]; @@ -1589,7 +1588,8 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { fileSelect->threeDayResetCount[sp76] = gSaveContext.save.saveInfo.playerData.threeDayResetCount; for (sp7A = 0; sp7A < ARRAY_COUNT(gSaveContext.save.saveInfo.playerData.playerName); sp7A++) { - fileSelect->fileNames[sp76][sp7A] = gSaveContext.save.saveInfo.playerData.playerName[sp7A]; + fileSelect->fileNames[sp76][sp7A] = + (u32)gSaveContext.save.saveInfo.playerData.playerName[sp7A]; } fileSelect->healthCapacity[sp76] = gSaveContext.save.saveInfo.playerData.healthCapacity; @@ -1602,14 +1602,14 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { fileSelect->rupees[sp76] = gSaveContext.save.saveInfo.playerData.rupees; fileSelect->walletUpgrades[sp76] = CUR_UPG_VALUE(UPG_WALLET); - for (sp7A = 0, phi_a0 = 0; sp7A < 24; sp7A++) { - if (gSaveContext.save.saveInfo.inventory.items[sp7A + 24] != 0xFF) { - phi_a0++; + for (sp7A = 0, maskCount = 0; sp7A < MASK_NUM_SLOTS; sp7A++) { + if (gSaveContext.save.saveInfo.inventory.items[sp7A + ITEM_NUM_SLOTS] == ITEM_NONE) { + continue; } + maskCount++; } - fileSelect->maskCount[sp76] = phi_a0; - fileSelect->heartPieceCount[sp76] = - ((gSaveContext.save.saveInfo.inventory.questItems & 0xF0000000) >> 0x1C); + fileSelect->maskCount[sp76] = maskCount; + fileSelect->heartPieceCount[sp76] = GET_QUEST_HEART_PIECE_COUNT; } if (sp6E == 1) { @@ -1618,20 +1618,20 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { Sram_SyncWriteToFlash(sramCtx, gFlashSaveStartPages[sp64 + 1], gFlashSaveNumPages[sp64 + 1]); } else if (!sp6E) { // main save - phi_s7 = gSaveContext.save.saveInfo.checksum; + oldCheckSum = gSaveContext.save.saveInfo.checksum; if (SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64 + 1], - gFlashSaveNumPages[sp64 + 1])) { - oldCheckSum = 1; + gFlashSaveNumPages[sp64 + 1]) != 0) { + phi_s2 = 1; } else { Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); - oldCheckSum = gSaveContext.save.saveInfo.checksum; + phi_s2 = gSaveContext.save.saveInfo.checksum; gSaveContext.save.saveInfo.checksum = 0; sp7A = Sram_CalcChecksum(&gSaveContext, gFlashSaveSizes[sp64]); } - if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (oldCheckSum != sp7A) || - (oldCheckSum != phi_s7)) { + if (CHECK_NEWF(gSaveContext.save.saveInfo.playerData.newf) || (sp7A != phi_s2) || + (oldCheckSum != phi_s2)) { SysFlashrom_ReadData(sramCtx->saveBuf, gFlashSaveStartPages[sp64], gFlashSaveNumPages[sp64]); Lib_MemCpy(&gSaveContext, sramCtx->saveBuf, gFlashSaveSizes[sp64]); @@ -1673,9 +1673,6 @@ void func_801457CC(GameState* gameState, SramContext* sramCtx) { gSaveContext.options.language = LANGUAGE_ENG; } -#else -#pragma GLOBAL_ASM("asm/non_matchings/code/z_sram_NES/func_801457CC.s") -#endif void Sram_EraseSave(FileSelectState* fileSelect2, SramContext* sramCtx, s32 fileNum) { FileSelectState* fileSelect = fileSelect2; @@ -1722,8 +1719,8 @@ void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) { fileSelect->rupees[fileSelect->copyDestFileIndex + 2] = gSaveContext.save.saveInfo.playerData.rupees; fileSelect->walletUpgrades[fileSelect->copyDestFileIndex + 2] = CUR_UPG_VALUE(UPG_WALLET); - for (i = 0, maskCount = 0; i < 24; i++) { - if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) { + for (i = 0, maskCount = 0; i < MASK_NUM_SLOTS; i++) { + if (gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS] != ITEM_NONE) { maskCount++; } } @@ -1763,8 +1760,8 @@ void Sram_CopySave(FileSelectState* fileSelect2, SramContext* sramCtx) { fileSelect->rupees[fileSelect->copyDestFileIndex] = gSaveContext.save.saveInfo.playerData.rupees; fileSelect->walletUpgrades[fileSelect->copyDestFileIndex] = CUR_UPG_VALUE(UPG_WALLET); - for (i = 0, maskCount = 0; i < 24; i++) { - if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) { + for (i = 0, maskCount = 0; i < MASK_NUM_SLOTS; i++) { + if (gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS] != ITEM_NONE) { maskCount++; } } @@ -1827,8 +1824,8 @@ void Sram_InitSave(FileSelectState* fileSelect2, SramContext* sramCtx) { fileSelect->rupees[fileSelect->buttonIndex] = gSaveContext.save.saveInfo.playerData.rupees; fileSelect->walletUpgrades[fileSelect->buttonIndex] = CUR_UPG_VALUE(UPG_WALLET); - for (i = 0, maskCount = 0; i < 24; i++) { - if (gSaveContext.save.saveInfo.inventory.items[i + 24] != ITEM_NONE) { + for (i = 0, maskCount = 0; i < MASK_NUM_SLOTS; i++) { + if (gSaveContext.save.saveInfo.inventory.items[i + ITEM_NUM_SLOTS] != ITEM_NONE) { maskCount++; } } diff --git a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c index 48272b8d9..efcd9e08e 100644 --- a/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c +++ b/src/overlays/actors/ovl_En_Thiefbird/z_en_thiefbird.c @@ -7,6 +7,7 @@ #include "prevent_bss_reordering.h" #include "z_en_thiefbird.h" #include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h" +#include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" #define FLAGS \ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_200 | ACTOR_FLAG_IGNORE_QUAKE | ACTOR_FLAG_80000000) @@ -224,7 +225,7 @@ s32 func_80C10B0C(EnThiefbird* this, PlayState* play) { s32 itemId1; s16 itemId2 = 0; - for (; slotId < 24; slotId++) { + for (; slotId < ITEM_NUM_SLOTS; slotId++) { if ((gSaveContext.save.saveInfo.inventory.items[slotId] >= ITEM_BOTTLE) && (gSaveContext.save.saveInfo.inventory.items[slotId] <= ITEM_POTION_BLUE)) { isItemFound = true; diff --git a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c index e658251e4..f8cb77624 100644 --- a/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c +++ b/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_debug.c @@ -422,9 +422,9 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) { // Items // Loop over rows (i) - for (slot = 0, i = 0, rectTop = 38; i < 4; i++, rectTop += 14) { + for (slot = 0, i = 0, rectTop = 38; i < ITEM_GRID_ROWS; i++, rectTop += 14) { // Loop over columns (j) - for (j = 0, rectLeft = 44; j < 6; j++, slot++, rectLeft += 23) { + for (j = 0, rectLeft = 44; j < ITEM_GRID_COLS; j++, slot++, rectLeft += 23) { counterDigits[3] = 0; counterDigits[2] = 0; if ((slot == SLOT_BOW) || ((slot >= SLOT_BOMB) && (slot <= SLOT_DEKU_NUT)) || (slot == SLOT_POWDER_KEG) || @@ -456,12 +456,12 @@ void KaleidoScope_DrawInventoryEditor(PlayState* play) { // Masks // Loop over rows (i) - for (slot = 0, i = 0, rectTop = 38; i < 4; i++, rectTop += 14) { + for (slot = 0, i = 0, rectTop = 38; i < MASK_GRID_ROWS; i++, rectTop += 14) { // Loop over columns (j) - for (j = 0, rectLeft = 204; j < 6; j++, slot++, rectLeft += 14) { + for (j = 0, rectLeft = 204; j < MASK_GRID_COLS; j++, slot++, rectLeft += 14) { counterDigits[2] = 0; - if (gSaveContext.save.saveInfo.inventory.items[SLOT_MASK_POSTMAN + slot] != ITEM_NONE) { + if (gSaveContext.save.saveInfo.inventory.items[slot + ITEM_NUM_SLOTS] != ITEM_NONE) { counterDigits[2] = 1; } KaleidoScope_DrawDigit(play, counterDigits[2], rectLeft, rectTop); From 60ddc5891e1cdef2e32f695c96e60344d7a51c26 Mon Sep 17 00:00:00 2001 From: Tom Overton Date: Mon, 13 Nov 2023 04:41:51 -0800 Subject: [PATCH 26/28] EnJso2 (Garo Master) OK and documented (#1485) * EnJso2 (Garo Master) OK and documented * Name all the override input things * Respond to reviews --- spec | 3 +- src/overlays/actors/ovl_En_Jso/z_en_jso.c | 107 +- src/overlays/actors/ovl_En_Jso/z_en_jso.h | 15 +- src/overlays/actors/ovl_En_Jso2/z_en_jso2.c | 1960 +++++++++++++++++-- src/overlays/actors/ovl_En_Jso2/z_en_jso2.h | 97 +- tools/disasm/functions.txt | 84 +- tools/disasm/variables.txt | 42 +- undefined_syms.txt | 6 - 8 files changed, 2066 insertions(+), 248 deletions(-) diff --git a/spec b/spec index be052f9e8..61b84f795 100644 --- a/spec +++ b/spec @@ -2862,8 +2862,7 @@ beginseg name "ovl_En_Jso2" compress include "build/src/overlays/actors/ovl_En_Jso2/z_en_jso2.o" - include "build/data/ovl_En_Jso2/ovl_En_Jso2.data.o" - include "build/data/ovl_En_Jso2/ovl_En_Jso2.reloc.o" + include "build/src/overlays/actors/ovl_En_Jso2/ovl_En_Jso2_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Jso/z_en_jso.c b/src/overlays/actors/ovl_En_Jso/z_en_jso.c index 637552704..0efa7799e 100644 --- a/src/overlays/actors/ovl_En_Jso/z_en_jso.c +++ b/src/overlays/actors/ovl_En_Jso/z_en_jso.c @@ -18,8 +18,8 @@ void EnJso_Destroy(Actor* thisx, PlayState* play); void EnJso_Update(Actor* thisx, PlayState* play); void EnJso_Draw(Actor* thisx, PlayState* play); -void EnJso_SetupHandleIntroCutscene(EnJso* this); -void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play); +void EnJso_SetupIntroCutscene(EnJso* this); +void EnJso_IntroCutscene(EnJso* this, PlayState* play); void EnJso_Reappear(EnJso* this, PlayState* play); void EnJso_SetupCirclePlayer(EnJso* this, PlayState* play); void EnJso_CirclePlayer(EnJso* this, PlayState* play); @@ -46,8 +46,8 @@ void EnJso_FallDownAndTalk(EnJso* this, PlayState* play); void EnJso_TellHint(EnJso* this, PlayState* play); void EnJso_BurstIntoFlames(EnJso* this, PlayState* play); -typedef enum { - /* 0 */ EN_JSO_ACTION_HANDLE_INTRO_CUTSCENE, +typedef enum EnJsoAction { + /* 0 */ EN_JSO_ACTION_INTRO_CUTSCENE, /* 1 */ EN_JSO_ACTION_REAPPEAR, /* 2 */ EN_JSO_ACTION_CIRCLE_PLAYER, /* 3 */ EN_JSO_ACTION_GUARD, @@ -65,30 +65,35 @@ typedef enum { /* 15 */ EN_JSO_ACTION_UNK_15 // Checked in EnJso_Update, but never actually used } EnJsoAction; -typedef enum { +typedef enum EnJsoIntroType { /* 0 */ EN_JSO_INTRO_SPIN_UP_FROM_GROUND, /* 1 */ EN_JSO_INTRO_JUMP_OUT_FROM_GROUND, /* 2 */ EN_JSO_INTRO_LAND_FROM_ABOVE, /* 3 */ EN_JSO_INTRO_SCALE_UP } EnJsoIntroType; -typedef enum { +typedef enum EnJsoIntroCsState { // Either the cutscene started (in which case, we'll transition to the next state on the next frame) or it's done. /* 0 */ EN_JSO_INTRO_CS_STATE_DONE_OR_STARTED, + // Waits for the Garo to finish their intro animation and open the first textbox. /* 1 */ EN_JSO_INTRO_CS_STATE_WAITING_FOR_TEXTBOX_TO_APPEAR, + // Waits for the player to press a button to continue on from the Garo's first textbox. /* 2 */ EN_JSO_INTRO_CS_STATE_WAITING_FOR_TEXTBOX_TO_CONTINUE, + // Lifts the Garo's right arm such that, when they draw their sword, it's pointed at the player. Waits until the // player has finished reading all of the Garo's dialogue before continuing. /* 3 */ EN_JSO_INTRO_CS_STATE_RAISE_ARM_AND_DRAW_RIGHT_SWORD, + // Waits 10 frames, then the Garo draws its left sword and continues to the next state. /* 4 */ EN_JSO_INTRO_CS_STATE_DRAW_LEFT_SWORD, + // Waits 10 frames, then the Garo jumps back and the cutscene ends. /* 5 */ EN_JSO_INTRO_CS_STATE_ENDING } EnJsoIntroCsState; -typedef enum { +typedef enum EnJsoSwordState { /* 0 */ EN_JSO_SWORD_STATE_BOTH_DRAWN, /* 1 */ EN_JSO_SWORD_STATE_KNOCKED_OUT_OF_HANDS, /* 2 */ EN_JSO_SWORD_STATE_RIGHT_DRAWN, @@ -102,7 +107,7 @@ static s32 sIsAttacking = false; // Seemingly a duplicate of the isPlayerLockedOn instance variable. Its purpose is unknown. static s32 sIsPlayerLockedOn = false; -typedef enum { +typedef enum EnJsoDamageEffect { /* 0x0 */ EN_JSO_DMGEFF_IMMUNE, // Deals no damage and has no special effect /* 0x1 */ EN_JSO_DMGEFF_STUN, // Deals no damage but stuns the Garo /* 0x2 */ EN_JSO_DMGEFF_FIRE, // Damages and sets the Garo on fire @@ -208,7 +213,7 @@ static u16 sTextIds[] = { 0x1399, }; -typedef enum { +typedef enum EnJsoAnimation { /* 0 */ EN_JSO_ANIM_APPEAR, /* 1 */ EN_JSO_ANIM_IDLE, /* 2 */ EN_JSO_ANIM_BOUNCE, @@ -301,7 +306,7 @@ void EnJso_Init(Actor* thisx, PlayState* play) { this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON; this->hintType = EN_JSO_GET_HINT_TYPE(&this->actor); this->introCsType = this->hintType & EN_JSO_INTRO_SCALE_UP; - EnJso_SetupHandleIntroCutscene(this); + EnJso_SetupIntroCutscene(this); } void EnJso_Destroy(Actor* thisx, PlayState* play) { @@ -338,14 +343,14 @@ void EnJso_ChangeAnim(EnJso* this, s32 animIndex) { sAnimationModes[animIndex], morphFrames); } -void EnJso_SetupHandleIntroCutscene(EnJso* this) { +void EnJso_SetupIntroCutscene(EnJso* this) { EnEncount3* parent = (EnEncount3*)this->actor.parent; this->csId = parent->csId; this->swordState = EN_JSO_SWORD_STATE_NONE_DRAWN; - this->action = EN_JSO_ACTION_HANDLE_INTRO_CUTSCENE; + this->action = EN_JSO_ACTION_INTRO_CUTSCENE; this->actor.flags |= ACTOR_FLAG_100000; - this->actionFunc = EnJso_HandleIntroCutscene; + this->actionFunc = EnJso_IntroCutscene; } /** @@ -353,13 +358,13 @@ void EnJso_SetupHandleIntroCutscene(EnJso* this) { * appear in one of four different ways, activating the ring of fire, etc. When the cutscene is over, the Garo will * jump back to start the fight. */ -void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { +void EnJso_IntroCutscene(EnJso* this, PlayState* play) { Player* player = GET_PLAYER(play); f32 curFrame = this->skelAnime.curFrame; s16 showTextbox; s16 diffToTargetRobeRightRot; - switch (this->introCsState) { + switch (this->cutsceneState) { case EN_JSO_INTRO_CS_STATE_DONE_OR_STARTED: if (!CutsceneManager_IsNext(this->csId)) { CutsceneManager_Queue(this->csId); @@ -412,8 +417,8 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { break; } - this->introCsTimer = 0; - this->introCsState++; + this->cutsceneTimer = 0; + this->cutsceneState++; break; case EN_JSO_INTRO_CS_STATE_WAITING_FOR_TEXTBOX_TO_APPEAR: @@ -476,8 +481,8 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { Message_StartTextbox(play, sTextIds[this->textIndex], &this->actor); this->textIndex++; this->actor.shape.yOffset = 970.0f; - this->introCsTimer = 0; - this->introCsState++; + this->cutsceneTimer = 0; + this->cutsceneState++; } break; @@ -493,9 +498,9 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); Message_ContinueTextbox(play, sTextIds[this->textIndex]); - this->introCsTimer = 0; + this->cutsceneTimer = 0; this->textIndex++; - this->introCsState++; + this->cutsceneState++; } break; @@ -531,8 +536,8 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { Message_CloseTextbox(play); this->targetRightArmRot.x = this->targetRightArmRot.y = this->targetRightArmRot.z = this->targetRobeRightRot.x = this->targetRobeRightRot.y = this->targetRobeRightRot.z = 0; - this->introCsTimer = 0; - this->introCsState++; + this->cutsceneTimer = 0; + this->cutsceneState++; } break; @@ -543,9 +548,9 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { this->subCamAtNext.x = player->actor.world.pos.x - 30.0f; this->subCamAtNext.y = player->actor.world.pos.y + 40.0f; this->subCamAtNext.z = player->actor.world.pos.z - 130.0f; - this->introCsTimer++; + this->cutsceneTimer++; - if (this->introCsTimer >= 10) { + if (this->cutsceneTimer >= 10) { this->swordState = EN_JSO_SWORD_STATE_BOTH_DRAWN; Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_SWORD); if ((this->actor.parent != NULL) && (this->actor.parent->update != NULL)) { @@ -558,8 +563,8 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { } EnJso_ChangeAnim(this, EN_JSO_ANIM_IDLE); - this->introCsTimer = 0; - this->introCsState++; + this->cutsceneTimer = 0; + this->cutsceneState++; } break; @@ -570,14 +575,14 @@ void EnJso_HandleIntroCutscene(EnJso* this, PlayState* play) { this->subCamAtNext.x = player->actor.world.pos.x - 30.0f; this->subCamAtNext.y = player->actor.world.pos.y + 40.0f; this->subCamAtNext.z = player->actor.world.pos.z - 130.0f; - this->introCsTimer++; + this->cutsceneTimer++; - if (this->introCsTimer >= 10) { + if (this->cutsceneTimer >= 10) { Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); CutsceneManager_Stop(this->csId); this->rightArmRot.x = this->rightArmRot.y = this->rightArmRot.z = this->robeRightRot.x = this->robeRightRot.y = this->robeRightRot.z = 0; - this->introCsState = EN_JSO_INTRO_CS_STATE_DONE_OR_STARTED; + this->cutsceneState = EN_JSO_INTRO_CS_STATE_DONE_OR_STARTED; this->subCamId = SUB_CAM_ID_DONE; this->actor.flags &= ~ACTOR_FLAG_100000; this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON; @@ -683,7 +688,7 @@ void EnJso_SetupCirclePlayer(EnJso* this, PlayState* play) { /** * Makes the Garo bounce in a circle around the player, sometimes randomly switching the direction it's traveling, until - * the attack wait timer reaches 0. Once it does, then the Garo will prepare to attack. + * the attack timer reaches 0. Once it does, then the Garo will prepare to attack. */ void EnJso_CirclePlayer(EnJso* this, PlayState* play) { f32 curFrame = this->skelAnime.curFrame; @@ -692,7 +697,8 @@ void EnJso_CirclePlayer(EnJso* this, PlayState* play) { s32 pad; Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_MOVING - SFX_FLAG); - if ((this->action != EN_JSO_ACTION_REAPPEAR) && (this->action != EN_JSO_ACTION_HANDLE_INTRO_CUTSCENE) && + + if ((this->action != EN_JSO_ACTION_REAPPEAR) && (this->action != EN_JSO_ACTION_INTRO_CUTSCENE) && (fabsf(player->actor.world.pos.y - this->actor.world.pos.y) > 60.0f)) { EnJso_SetupReappear(this, play); return; @@ -722,7 +728,7 @@ void EnJso_CirclePlayer(EnJso* this, PlayState* play) { //! @note: Since sIsPlayerLockedOn always mirrors the value of this->isPlayerLockedOn, the last part of this //! if-statement is always true and has no impact on the logic. In other words, the Garo doesn't care whether or not //! the player is locked on; it will attack regardless as long as the other conditions are met. - if ((this->attackWaitTimer == 0) && !sIsAttacking && (!sIsPlayerLockedOn || this->isPlayerLockedOn)) { + if ((this->attackTimer == 0) && !sIsAttacking && (!sIsPlayerLockedOn || this->isPlayerLockedOn)) { sIsAttacking = true; this->isAttacking = true; this->action = EN_JSO_ACTION_SPIN_BEFORE_ATTACK; @@ -797,7 +803,7 @@ void EnJso_SpinBeforeAttack(EnJso* this, PlayState* play) { void EnJso_SetupDashAttack(EnJso* this) { this->action = EN_JSO_ACTION_DASH_ATTACK; - this->dashAttackTimer = 40; + this->attackMovementTimer = 40; this->bodyCollider.base.colType = COLTYPE_HIT2; this->bodyCollider.base.acFlags &= ~AC_HARD; this->actor.speed = 15.0f; @@ -829,7 +835,7 @@ void EnJso_DashAttack(EnJso* this, PlayState* play) { knockbackVelocity.z = -10.0f; Matrix_MultVec3f(&knockbackVelocity, &this->knockbackVelocity); this->swordState = EN_JSO_SWORD_STATE_KNOCKED_OUT_OF_HANDS; - this->dashAttackTimer = 0; + this->attackMovementTimer = 0; this->disableBlure = true; AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); EnJso_SetupKnockedBack(this); @@ -848,7 +854,7 @@ void EnJso_DashAttack(EnJso* this, PlayState* play) { yawDiff = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; absYawDiff = ABS_ALT(yawDiff); - if ((this->dashAttackTimer == 0) || (this->actor.xzDistToPlayer < 100.0f) || (absYawDiff > 0x4300)) { + if ((this->attackMovementTimer == 0) || (this->actor.xzDistToPlayer < 100.0f) || (absYawDiff > 0x4300)) { AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); Math_ApproachZeroF(&this->actor.speed, 0.3f, 3.0f); EnJso_SetupSlash(this, play); @@ -861,7 +867,7 @@ void EnJso_SetupSlash(EnJso* this, PlayState* play) { Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, 8.0f, 500, 10, true); Math_ApproachZeroF(&this->actor.speed, 0.3f, 3.0f); - this->swordHitSomething = false; + this->slashHitSomething = false; Actor_PlaySfx(&this->actor, NA_SE_IT_SWORD_SWING_HARD); this->actionFunc = EnJso_Slash; } @@ -881,7 +887,7 @@ void EnJso_Slash(EnJso* this, PlayState* play) { } if ((this->rightSwordCollider.base.atFlags & AT_HIT) || (this->leftSwordCollider.base.atFlags & AT_HIT)) { - this->swordHitSomething = true; + this->slashHitSomething = true; this->rightSwordCollider.base.atFlags &= ~AT_HIT; this->leftSwordCollider.base.atFlags &= ~AT_HIT; } @@ -913,7 +919,7 @@ void EnJso_Slash(EnJso* this, PlayState* play) { } void EnJso_SetupWaitAfterSlash(EnJso* this) { - if (this->swordHitSomething) { + if (this->slashHitSomething) { EnJso_ChangeAnim(this, EN_JSO_ANIM_SLASH_LOOP); this->timer = 20; } else { @@ -931,10 +937,10 @@ void EnJso_SetupWaitAfterSlash(EnJso* this) { */ void EnJso_WaitAfterSlash(EnJso* this, PlayState* play) { if (this->timer == 0) { - this->attackWaitTimer = Rand_S16Offset(30, 30); + this->attackTimer = Rand_S16Offset(30, 30); this->bodyCollider.base.colType = COLTYPE_NONE; this->bodyCollider.base.acFlags |= AC_HARD; - this->swordHitSomething = false; + this->slashHitSomething = false; sIsAttacking = false; this->isAttacking = false; EnJso_SetupCirclePlayer(this, play); @@ -986,9 +992,12 @@ void EnJso_SetupStunned(EnJso* this) { AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); EnJso_ChangeAnim(this, EN_JSO_ANIM_DAMAGED); - // This assignment is immediately overriden below. + //! @note: This assignment is immediately overriden below. This is probably a leftover from EnJso2's version of this + //! function, where the Garo Master is stunned for longer if it's frozen. Garos just use the longer stun + //! unconditionally, resulting in this useless assignment here. this->timer = 30; this->actor.speed = 0.0f; + if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) && (this->drawDmgEffAlpha == 0)) { @@ -1032,7 +1041,7 @@ void EnJso_SetupDamaged(EnJso* this, PlayState* play) { AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); EnJso_ChangeAnim(this, EN_JSO_ANIM_DAMAGED); - this->swordHitSomething = false; + this->slashHitSomething = false; this->actor.velocity.y = 10.0f; this->actor.speed = 0.0f; Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW); @@ -1104,7 +1113,7 @@ void EnJso_JumpBack(EnJso* this, PlayState* play) { sIsAttacking = false; this->isAttacking = false; this->actor.world.rot.y = this->actor.shape.rot.y; - this->attackWaitTimer = Rand_S16Offset(10, 10); + this->attackTimer = Rand_S16Offset(10, 10); EnJso_SetupCirclePlayer(this, play); } } @@ -1449,8 +1458,8 @@ void EnJso_Update(Actor* thisx, PlayState* play) { } this->actionFunc(this, play); - DECR(this->dashAttackTimer); - DECR(this->attackWaitTimer); + DECR(this->attackMovementTimer); + DECR(this->attackTimer); DECR(this->timer); DECR(this->drawDmgEffAlpha); @@ -1501,7 +1510,7 @@ void EnJso_Update(Actor* thisx, PlayState* play) { this->afterimageCount = 0; } - if ((this->action != EN_JSO_ACTION_HANDLE_INTRO_CUTSCENE) && (this->action != EN_JSO_ACTION_CIRCLE_PLAYER) && + if ((this->action != EN_JSO_ACTION_INTRO_CUTSCENE) && (this->action != EN_JSO_ACTION_CIRCLE_PLAYER) && (this->action != EN_JSO_ACTION_SPIN_BEFORE_ATTACK) && (this->action != EN_JSO_ACTION_DAMAGED) && (this->action != EN_JSO_ACTION_JUMP_BACK)) { this->actor.shape.rot.y = this->actor.world.rot.y; @@ -1510,14 +1519,14 @@ void EnJso_Update(Actor* thisx, PlayState* play) { this->actor.shape.rot.x = this->actor.world.rot.x; Collider_UpdateCylinder(&this->actor, &this->bodyCollider); - if ((this->action != EN_JSO_ACTION_HANDLE_INTRO_CUTSCENE) && (this->action != EN_JSO_ACTION_REAPPEAR) && + if ((this->action != EN_JSO_ACTION_INTRO_CUTSCENE) && (this->action != EN_JSO_ACTION_REAPPEAR) && (this->action != EN_JSO_ACTION_DAMAGED) && (this->action != EN_JSO_ACTION_SPIN_BEFORE_ATTACK) && (this->action != EN_JSO_ACTION_DEAD) && (this->action != EN_JSO_ACTION_FALL_DOWN_AND_TALK) && (this->action != EN_JSO_ACTION_UNK_15)) { CollisionCheck_SetOC(play, &play->colChkCtx, &this->bodyCollider.base); CollisionCheck_SetAC(play, &play->colChkCtx, &this->bodyCollider.base); - if ((this->action == EN_JSO_ACTION_SLASH) && !this->swordHitSomething && + if ((this->action == EN_JSO_ACTION_SLASH) && !this->slashHitSomething && (this->swordState == EN_JSO_SWORD_STATE_BOTH_DRAWN)) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->rightSwordCollider.base); CollisionCheck_SetAT(play, &play->colChkCtx, &this->leftSwordCollider.base); diff --git a/src/overlays/actors/ovl_En_Jso/z_en_jso.h b/src/overlays/actors/ovl_En_Jso/z_en_jso.h index 7f97e5008..1f68cffc5 100644 --- a/src/overlays/actors/ovl_En_Jso/z_en_jso.h +++ b/src/overlays/actors/ovl_En_Jso/z_en_jso.h @@ -15,7 +15,7 @@ typedef void (*EnJsoActionFunc)(struct EnJso*, PlayState*); // For the four `VARIABLE` hint types, the former hint is used if the player hasn't restored the river in // Ikana Canyon yet, and the latter hint is used if the player has. If the player has the Elegy of Emptiness, // then all hints will be replaced with a hint telling the player to use the song to climb Stone Tower. -typedef enum { +typedef enum EnJsoHintType { /* 0 */ EN_JSO_HINT_FREEZE_OCTOROKS, /* 1 */ EN_JSO_HINT_FLATS_LOCATION, /* 2 */ EN_JSO_HINT_VARIABLE_1, // Hints that Pamela's family is in the house or that the Song of Healing can heal Pamela's father @@ -28,7 +28,7 @@ typedef enum { /* 9 */ EN_JSO_HINT_KING_WEAK_TO_MIRROR_SHIELD } EnJsoHintType; -typedef enum { +typedef enum EnJsoBodyPart { /* 0 */ EN_JSO_BODYPART_LEFT_SWORD, /* 1 */ EN_JSO_BODYPART_RIGHT_SWORD, /* 2 */ EN_JSO_BODYPART_ROBE_TOP, @@ -44,7 +44,6 @@ typedef enum { /* 12 */ EN_JSO_BODYPART_MAX } EnJsoBodyPart; - typedef struct EnJso { /* 0x000 */ Actor actor; /* 0x144 */ SkelAnime skelAnime; @@ -54,9 +53,9 @@ typedef struct EnJso { /* 0x27C */ s16 action; /* 0x27E */ s16 circlingAngle; /* 0x280 */ s16 circlingAngularVelocity; - /* 0x282 */ s16 dashAttackTimer; + /* 0x282 */ s16 attackMovementTimer; /* 0x284 */ UNK_TYPE1 unk_284[0x2]; - /* 0x286 */ s16 attackWaitTimer; // while bouncing, the Garo cannot start an attack until this reaches 0 + /* 0x286 */ s16 attackTimer; // while bouncing, the Garo cannot start an attack until this reaches 0 /* 0x288 */ s16 timer; /* 0x28A */ s16 isGuarding; // Set to false when the guard animation ends, never checked or set otherwise. Name is inferred based on how it's being set. /* 0x28C */ s16 isPlayerLockedOn; @@ -76,7 +75,7 @@ typedef struct EnJso { /* 0x34A */ s16 hintType; /* 0x34C */ u8 disableBlure; /* 0x34D */ u8 swordState; - /* 0x34E */ u8 swordHitSomething; + /* 0x34E */ u8 slashHitSomething; /* 0x350 */ f32 animEndFrame; /* 0x354 */ f32 scale; /* 0x358 */ UNK_TYPE1 unk_358[0x4]; @@ -88,8 +87,8 @@ typedef struct EnJso { /* 0x4B0 */ s16 afterimageIndex; /* 0x4B4 */ s32 afterimageCount; /* 0x4B8 */ s16 csId; - /* 0x4BC */ u32 introCsTimer; - /* 0x4C0 */ s16 introCsState; + /* 0x4BC */ u32 cutsceneTimer; + /* 0x4C0 */ s16 cutsceneState; /* 0x4C2 */ s16 subCamId; /* 0x4C4 */ UNK_TYPE1 unk_4C4[0x4]; /* 0x4C8 */ Vec3f subCamEye; diff --git a/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c b/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c index f4ff79480..6a5cc38e1 100644 --- a/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c +++ b/src/overlays/actors/ovl_En_Jso2/z_en_jso2.c @@ -5,6 +5,9 @@ */ #include "z_en_jso2.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" +#include "overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.h" +#include "overlays/actors/ovl_En_Col_Man/z_en_col_man.h" #define FLAGS \ (ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_100000 | \ @@ -15,62 +18,197 @@ void EnJso2_Init(Actor* thisx, PlayState* play); void EnJso2_Destroy(Actor* thisx, PlayState* play); void EnJso2_Update(Actor* thisx, PlayState* play); -void EnJso2_Draw(Actor* thisx, PlayState* play); +void EnJso2_Draw(Actor* thisx, PlayState* play2); -void func_80A778F8(EnJso2* this, PlayState* play); -void func_80A785E4(EnJso2* this, PlayState* play); -void func_80A78868(EnJso2* this, PlayState* play); -void func_80A78ACC(EnJso2* this, PlayState* play); -void func_80A78B70(EnJso2* this, PlayState* play); -void func_80A78C7C(EnJso2* this, PlayState* play); -void func_80A78F04(EnJso2* this, PlayState* play); -void func_80A79038(EnJso2* this, PlayState* play); -void func_80A7919C(EnJso2* this, PlayState* play); -void func_80A79364(EnJso2* this, PlayState* play); -void func_80A794C8(EnJso2* this, PlayState* play); -void func_80A79600(EnJso2* this, PlayState* play); -void func_80A7980C(EnJso2* this, PlayState* play); -void func_80A798C8(EnJso2* this, PlayState* play); -void func_80A79A84(EnJso2* this, PlayState* play); -void func_80A79BA0(EnJso2* this, PlayState* play); -void func_80A7A124(EnJso2* this, PlayState* play); -void func_80A7A2EC(EnJso2* this, PlayState* play); +void EnJso2_SetupIntroCutscene(EnJso2* this); +void EnJso2_IntroCutscene(EnJso2* this, PlayState* play); +void EnJso2_SetupAppear(EnJso2* this); +void EnJso2_Appear(EnJso2* this, PlayState* play); +void EnJso2_SetupCirclePlayer(EnJso2* this, PlayState* play); +void EnJso2_CirclePlayer(EnJso2* this, PlayState* play); +void EnJso2_Guard(EnJso2* this, PlayState* play); +void EnJso2_SetupSpinBeforeAttack(EnJso2* this); +void EnJso2_SpinBeforeAttack(EnJso2* this, PlayState* play); +void EnJso2_SetupDashAttack(EnJso2* this); +void EnJso2_DashAttack(EnJso2* this, PlayState* play); +void EnJso2_SetupTeleport(EnJso2* this); +void EnJso2_Teleport(EnJso2* this, PlayState* play); +void EnJso2_SetupFallFromTeleport(EnJso2* this, PlayState* play); +void EnJso2_FallFromTeleport(EnJso2* this, PlayState* play); +void EnJso2_SetupSlash(EnJso2* this, PlayState* play); +void EnJso2_Slash(EnJso2* this, PlayState* play); +void EnJso2_SpinAttack(EnJso2* this, PlayState* play); +void EnJso2_SetupWaitAfterSlash(EnJso2* this); +void EnJso2_WaitAfterSlash(EnJso2* this, PlayState* play); +void EnJso2_Stunned(EnJso2* this, PlayState* play); +void EnJso2_Damaged(EnJso2* this, PlayState* play); +void EnJso2_SetupJumpBack(EnJso2* this); +void EnJso2_JumpBack(EnJso2* this, PlayState* play); +void EnJso2_Dead(EnJso2* this, PlayState* play); +void EnJso2_SetupDeathCutscene(EnJso2* this); +void EnJso2_DeathCutscene(EnJso2* this, PlayState* play); +void EnJso2_SetupBlowUp(EnJso2* this); +void EnJso2_BlowUp(EnJso2* this, PlayState* play); +void EnJso2_FadeAway(EnJso2* this, PlayState* play); -#if 0 -// static DamageTable sDamageTable = { -static DamageTable D_80A7B4F0 = { - /* Deku Nut */ DMG_ENTRY(0, 0x1), - /* Deku Stick */ DMG_ENTRY(1, 0xF), - /* Horse trample */ DMG_ENTRY(0, 0x0), - /* Explosives */ DMG_ENTRY(1, 0xF), - /* Zora boomerang */ DMG_ENTRY(1, 0xF), - /* Normal arrow */ DMG_ENTRY(1, 0xF), - /* UNK_DMG_0x06 */ DMG_ENTRY(0, 0x0), - /* Hookshot */ DMG_ENTRY(0, 0x1), - /* Goron punch */ DMG_ENTRY(1, 0xF), - /* Sword */ DMG_ENTRY(1, 0xF), - /* Goron pound */ DMG_ENTRY(1, 0xF), - /* Fire arrow */ DMG_ENTRY(2, 0x2), - /* Ice arrow */ DMG_ENTRY(2, 0x3), - /* Light arrow */ DMG_ENTRY(2, 0x4), - /* Goron spikes */ DMG_ENTRY(1, 0xF), - /* Deku spin */ DMG_ENTRY(0, 0x1), - /* Deku bubble */ DMG_ENTRY(1, 0xF), - /* Deku launch */ DMG_ENTRY(2, 0xF), - /* UNK_DMG_0x12 */ DMG_ENTRY(0, 0x1), - /* Zora barrier */ DMG_ENTRY(0, 0x5), - /* Normal shield */ DMG_ENTRY(0, 0x0), - /* Light ray */ DMG_ENTRY(0, 0x0), - /* Thrown object */ DMG_ENTRY(1, 0xF), - /* Zora punch */ DMG_ENTRY(1, 0xF), - /* Spin attack */ DMG_ENTRY(1, 0xF), - /* Sword beam */ DMG_ENTRY(0, 0x0), - /* Normal Roll */ DMG_ENTRY(0, 0x0), - /* UNK_DMG_0x1B */ DMG_ENTRY(0, 0x0), - /* UNK_DMG_0x1C */ DMG_ENTRY(0, 0x0), - /* Unblockable */ DMG_ENTRY(0, 0x0), - /* UNK_DMG_0x1E */ DMG_ENTRY(0, 0x0), - /* Powder Keg */ DMG_ENTRY(1, 0xF), +typedef enum EnJso2Action { + /* 0 */ EN_JSO2_ACTION_INTRO_CUTSCENE, + /* 1 */ EN_JSO2_ACTION_UNK_1, // Checked in EnJso2_Update, but never actually used + /* 2 */ EN_JSO2_ACTION_UNK_2, // Checked in EnJso2_UpdateDamage, but never actually used + /* 3 */ EN_JSO2_ACTION_CIRCLE_PLAYER, + /* 4 */ EN_JSO2_ACTION_GUARD, + /* 5 */ EN_JSO2_ACTION_SPIN_BEFORE_ATTACK, + /* 6 */ EN_JSO2_ACTION_DASH_ATTACK, + /* 7 */ EN_JSO2_ACTION_SLASH, + /* 8 */ EN_JSO2_ACTION_SPIN_ATTACK, + /* 9 */ EN_JSO2_ACTION_WAIT_AFTER_SLASH, + /* 10 */ EN_JSO2_ACTION_STUNNED, + /* 11 */ EN_JSO2_ACTION_DAMAGED, + /* 12 */ EN_JSO2_ACTION_JUMP_BACK, + /* 13 */ EN_JSO2_ACTION_DEAD, + /* 14 */ EN_JSO2_ACTION_BLOW_UP, + /* 15 */ EN_JSO2_ACTION_TELEPORT, + /* 16 */ EN_JSO2_ACTION_FALL_FROM_TELEPORT +} EnJso2Action; + +typedef enum EnJso2IntroCsState { + // Waits for the player to walk toward the Garo Master, then starts the cutscene and transitions to the next state. + /* 0 */ EN_JSO2_INTRO_CS_STATE_WAITING_FOR_PLAYER_TO_APPROACH, + + // Positions the Garo Master, player, and sub camera variables appropriately, then transitions to the next state. + /* 1 */ EN_JSO2_INTRO_CS_STATE_STARTED, + + // Automatically moves the player forward a little bit to get closer to the center of the room. + /* 2 */ EN_JSO2_INTRO_CS_STATE_MOVE_PLAYER_FORWARD, + + // Waits 9 frames, then spawns some rocks to fall from the ceiling. + /* 3 */ EN_JSO2_INTRO_CS_STATE_SPAWN_FALLING_ROCKS, + + // Waits 25 frames for the rocks that were spawned in the previous state to fall down and hit the ground. + /* 4 */ EN_JSO2_INTRO_CS_STATE_WAIT_FOR_ROCKS_TO_FALL, + + // Makes the player perform their "surprised" animation, and waits 20 frames. + /* 5 */ EN_JSO2_INTRO_CS_STATE_PLAYER_SURPRISED, + + // Slowly pans the camera upwards to look at the Garo Master standing above the hole in the ceiling. + /* 6 */ EN_JSO2_INTRO_CS_STATE_PAN_CAMERA_UPWARDS, + + // Waits for 5 frames, doing nothing, before the Garo Master laughs. + /* 7 */ EN_JSO2_INTRO_CS_STATE_WAIT_BEFORE_LAUGH, + + // Waits for 45 frames to let the Garo Master's laugh play out. + /* 8 */ EN_JSO2_INTRO_CS_STATE_LAUGH, + + // Makes the Garo Master jump down from the hole in the ceiling, drawing afterimages as it falls, until it lands. + /* 9 */ EN_JSO2_INTRO_CS_STATE_JUMP_DOWN, + + // Spawns a ring of dust, draws afterimages, and plays the landing animation to completion. + /* 10 */ EN_JSO2_INTRO_CS_STATE_LAND, + + // Makes the Garo Master draw its swords, and gradually scales up the flames on the swords. This state also ends the + // cutscene once the animation for drawing the swords completes. + /* 11 */ EN_JSO2_INTRO_CS_STATE_DRAW_SWORDS +} EnJso2IntroCsState; + +typedef enum EnJso2AppearState { + // Spawns a dust ring, disables the current BGM, plays the "appearance" SFX, and transitions to the next state. + /* 0 */ EN_JSO2_APPEAR_STATE_STARTED, + + // This state handles all other aspects of the Garo Master's appearance (starting the mini-boss BGM, scaling up the + // flames on the swords, etc.) + /* 1 */ EN_JSO2_APPEAR_STATE_APPEARING +} EnJso2AppearState; + +typedef enum EnJso2DeathCsState { + // Starts the cutscene and immediately transitions to the next state. + /* 0 */ EN_JSO2_DEATH_CS_STATE_STARTED, + + // Plays the animation of the Garo Master collapsing down onto one knee. + /* 1 */ EN_JSO2_DEATH_CS_STATE_COLLAPSE, + + // Plays one loop of the animation where the Garo Master is trembling. + /* 2 */ EN_JSO2_DEATH_CS_STATE_TREMBLE, + + // Tells the player a hint about using the Light Arrow. The Garo Master also takes its bomb out in this state. + /* 3 */ EN_JSO2_DEATH_CS_STATE_TELL_HINT, + + // Detonates the Garo Master's bomb and slowly reduces its alpha until it completely fades away. + /* 4 */ EN_JSO2_DEATH_CS_STATE_BLOW_UP_AND_FADE_AWAY, + + // Waits for 50 frames to let the Garo Master's laugh play out, then ends the cutscene. + /* 5 */ EN_JSO2_DEATH_CS_STATE_WAIT_AND_END +} EnJso2DeathCsState; + +typedef enum EnJso2SwordState { + /* 0 */ EN_JSO2_SWORD_STATE_BOTH_DRAWN, + + // If the Garo Master is about to blow itself up, it will use this sword state, but EnJso2_OverrideLimbDraw will + // draw the left sword anyway. When the Garo Master is defeated, the animations for its "weakened" state has it + // support itself with its left sword, so it wouldn't look right if the sword wasn't drawn. + /* 2 */ EN_JSO2_SWORD_STATE_NONE_DRAWN = 2 +} EnJso2SwordState; + +typedef enum EnJso2DamageEffect { + /* 0x0 */ EN_JSO2_DMGEFF_IMMUNE, // Deals no damage and has no special effect + /* 0x1 */ EN_JSO2_DMGEFF_STUN, // Deals no damage but stuns the Garo Master + /* 0x2 */ EN_JSO2_DMGEFF_FIRE, // Damages and sets the Garo Master on fire + /* 0x3 */ EN_JSO2_DMGEFF_FREEZE, // Damages and surrounds the Garo Master with ice + /* 0x4 */ EN_JSO2_DMGEFF_LIGHT_ORB, // Damages and surrounds the Garo Master with light orbs + /* 0x5 */ EN_JSO2_DMGEFF_ELECTRIC_STUN, // Behaves like EN_JSO2_DMGEFF_STUN, but also applies an electric effect + /* 0xF */ EN_JSO2_DMGEFF_NONE = 0xF // Damages the Garo Master and has no special effect +} EnJso2DamageEffect; + +static DamageTable sDamageTable = { + /* Deku Nut */ DMG_ENTRY(0, EN_JSO2_DMGEFF_STUN), + /* Deku Stick */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Horse trample */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Explosives */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Zora boomerang */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Normal arrow */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* UNK_DMG_0x06 */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Hookshot */ DMG_ENTRY(0, EN_JSO2_DMGEFF_STUN), + /* Goron punch */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Sword */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Goron pound */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Fire arrow */ DMG_ENTRY(2, EN_JSO2_DMGEFF_FIRE), + /* Ice arrow */ DMG_ENTRY(2, EN_JSO2_DMGEFF_FREEZE), + /* Light arrow */ DMG_ENTRY(2, EN_JSO2_DMGEFF_LIGHT_ORB), + /* Goron spikes */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Deku spin */ DMG_ENTRY(0, EN_JSO2_DMGEFF_STUN), + /* Deku bubble */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Deku launch */ DMG_ENTRY(2, EN_JSO2_DMGEFF_NONE), + /* UNK_DMG_0x12 */ DMG_ENTRY(0, EN_JSO2_DMGEFF_STUN), + /* Zora barrier */ DMG_ENTRY(0, EN_JSO2_DMGEFF_ELECTRIC_STUN), + /* Normal shield */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Light ray */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Thrown object */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Zora punch */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Spin attack */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), + /* Sword beam */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Normal Roll */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* UNK_DMG_0x1B */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* UNK_DMG_0x1C */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Unblockable */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* UNK_DMG_0x1E */ DMG_ENTRY(0, EN_JSO2_DMGEFF_IMMUNE), + /* Powder Keg */ DMG_ENTRY(1, EN_JSO2_DMGEFF_NONE), +}; + +/** + * When the Garo Master draws its swords, the flames on the swords will gradually scale up to match these scales. + */ +static Vec3f sTargetFlameScales[] = { + { 0.003f, 0.003f, 0.003f }, { 0.002f, 0.002f, 0.002f }, { 0.001f, 0.001f, 0.001f }, + { 0.003f, 0.003f, 0.003f }, { 0.002f, 0.002f, 0.002f }, { 0.001f, 0.001f, 0.001f }, +}; + +static Vec3f sFlameOffsets[] = { + { 800.0f, -20.0f, -50.0f }, { 500.0f, -20.0f, -70.0f }, { 300.0f, -20.0f, -90.0f }, + { 800.0f, -20.0f, 50.0f }, { 500.0f, -20.0f, 70.0f }, { 300.0f, -20.0f, 90.0f }, +}; + +static Vec3f sSlashFlameOffsets[] = { + { 600.0f, -100.0f, 100.0f }, { 300.0f, -100.0f, 80.0f }, { 100.0f, -100.0f, 60.0f }, + { 600.0f, -100.0f, -100.0f }, { 300.0f, -100.0f, -80.0f }, { 100.0f, -100.0f, -60.0f }, }; ActorInit En_Jso2_InitVars = { @@ -85,115 +223,1711 @@ ActorInit En_Jso2_InitVars = { /**/ EnJso2_Draw, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_80A7B608 = { - { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x08, 0x04 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, }, +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_ON | AT_TYPE_ENEMY, + AC_ON | AC_HARD | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_1, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0xF7CFFFFF, 0x08, 0x04 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_ON | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_ON, + }, { 22, 70, 0, { 0, 0, 0 } }, }; -// static ColliderQuadInit sQuadInit = { -static ColliderQuadInit D_80A7B634 = { - { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_NONE, OC1_NONE, OC2_NONE, COLSHAPE_QUAD, }, - { ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x09, 0x10 }, { 0x00000000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL | TOUCH_UNK7, BUMP_NONE, OCELEM_NONE, }, +static ColliderQuadInit sQuadInit = { + { + COLTYPE_NONE, + AT_ON | AT_TYPE_ENEMY, + AC_NONE, + OC1_NONE, + OC2_NONE, + COLSHAPE_QUAD, + }, + { + ELEMTYPE_UNK0, + { 0xF7CFFFFF, 0x09, 0x10 }, + { 0x00000000, 0x00, 0x00 }, + TOUCH_ON | TOUCH_SFX_NORMAL | TOUCH_UNK7, + BUMP_NONE, + OCELEM_NONE, + }, { { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } } }, }; -#endif +typedef enum EnJso2Animation { + /* 0 */ EN_JSO2_ANIM_DASH_ATTACK, + /* 1 */ EN_JSO2_ANIM_SLASH_START, + /* 2 */ EN_JSO2_ANIM_SLASH_LOOP, + /* 3 */ EN_JSO2_ANIM_JUMP_BACK, + /* 4 */ EN_JSO2_ANIM_DAMAGED, + /* 5 */ EN_JSO2_ANIM_GUARD, + /* 6 */ EN_JSO2_ANIM_APPEAR, // unused + /* 7 */ EN_JSO2_ANIM_IDLE, // unused + /* 8 */ EN_JSO2_ANIM_BOUNCE, + /* 9 */ EN_JSO2_ANIM_FALL_DOWN, // unused + /* 10 */ EN_JSO2_ANIM_KNOCKED_BACK, // unused + /* 11 */ EN_JSO2_ANIM_COWER, // unused + /* 12 */ EN_JSO2_ANIM_LOOK_AROUND, + /* 13 */ EN_JSO2_ANIM_APPEAR_AND_DRAW_SWORDS, + /* 14 */ EN_JSO2_ANIM_SPIN_ATTACK, + /* 15 */ EN_JSO2_ANIM_LAND, + /* 16 */ EN_JSO2_ANIM_JUMP_DOWN, + /* 17 */ EN_JSO2_ANIM_LAUGH, + /* 18 */ EN_JSO2_DRAW_SWORDS, + /* 19 */ EN_JSO2_COLLAPSE, + /* 20 */ EN_JSO2_TREMBLE, + /* 21 */ EN_JSO2_TAKE_OUT_BOMB, + /* 22 */ EN_JSO2_ANIM_MAX +} EnJso2Animation; -extern DamageTable D_80A7B4F0; -extern ColliderCylinderInit D_80A7B608; -extern ColliderQuadInit D_80A7B634; +static AnimationHeader* sAnimations[EN_JSO2_ANIM_MAX] = { + &gGaroDashAttackAnim, // EN_JSO2_ANIM_DASH_ATTACK + &gGaroSlashStartAnim, // EN_JSO2_ANIM_SLASH_START + &gGaroSlashLoopAnim, // EN_JSO2_ANIM_SLASH_LOOP + &gGaroJumpBackAnim, // EN_JSO2_ANIM_JUMP_BACK + &gGaroDamagedAnim, // EN_JSO2_ANIM_DAMAGED + &gGaroGuardAnim, // EN_JSO2_ANIM_GUARD + &gGaroAppearAnim, // EN_JSO2_ANIM_APPEAR + &gGaroIdleAnim, // EN_JSO2_ANIM_IDLE + &gGaroBounceAnim, // EN_JSO2_ANIM_BOUNCE + &gGaroFallDownAnim, // EN_JSO2_ANIM_FALL_DOWN + &gGaroKnockedBackAnim, // EN_JSO2_ANIM_KNOCKED_BACK + &gGaroCowerAnim, // EN_JSO2_ANIM_COWER + &gGaroLookAroundAnim, // EN_JSO2_ANIM_LOOK_AROUND + &gGaroAppearAndDrawSwordsAnim, // EN_JSO2_ANIM_APPEAR_AND_DRAW_SWORDS + &gGaroSpinAttackAnim, // EN_JSO2_ANIM_SPIN_ATTACK + &gGaroLandAnim, // EN_JSO2_ANIM_LAND + &gGaroJumpDownAnim, // EN_JSO2_ANIM_JUMP_DOWN + &gGaroLaughAnim, // EN_JSO2_ANIM_LAUGH + &gGaroDrawSwordsAnim, // EN_JSO2_DRAW_SWORDS + &gGaroCollapseAnim, // EN_JSO2_COLLAPSE + &gGaroTrembleAnim, // EN_JSO2_TREMBLE + &gGaroTakeOutBombAnim, // EN_JSO2_TAKE_OUT_BOMB +}; -extern UNK_TYPE D_06002ED8; -extern UNK_TYPE D_060081F4; +static u8 sAnimationModes[EN_JSO2_ANIM_MAX] = { + ANIMMODE_ONCE, // EN_JSO2_ANIM_DASH_ATTACK + ANIMMODE_ONCE, // EN_JSO2_ANIM_SLASH_START + ANIMMODE_LOOP, // EN_JSO2_ANIM_SLASH_LOOP + ANIMMODE_ONCE, // EN_JSO2_ANIM_JUMP_BACK + ANIMMODE_LOOP, // EN_JSO2_ANIM_DAMAGED + ANIMMODE_ONCE, // EN_JSO2_ANIM_GUARD + ANIMMODE_LOOP, // EN_JSO2_ANIM_APPEAR + ANIMMODE_LOOP, // EN_JSO2_ANIM_IDLE + ANIMMODE_LOOP, // EN_JSO2_ANIM_BOUNCE + ANIMMODE_ONCE, // EN_JSO2_ANIM_FALL_DOWN + ANIMMODE_ONCE, // EN_JSO2_ANIM_KNOCKED_BACK + ANIMMODE_LOOP, // EN_JSO2_ANIM_COWER + ANIMMODE_LOOP, // EN_JSO2_ANIM_LOOK_AROUND + ANIMMODE_ONCE, // EN_JSO2_ANIM_APPEAR_AND_DRAW_SWORDS + ANIMMODE_LOOP, // EN_JSO2_ANIM_SPIN_ATTACK + ANIMMODE_ONCE, // EN_JSO2_ANIM_LAND + ANIMMODE_ONCE, // EN_JSO2_ANIM_JUMP_DOWN + ANIMMODE_LOOP, // EN_JSO2_ANIM_LAUGH + ANIMMODE_ONCE, // EN_JSO2_DRAW_SWORDS + ANIMMODE_ONCE, // EN_JSO2_COLLAPSE + ANIMMODE_LOOP, // EN_JSO2_TREMBLE + ANIMMODE_ONCE, // EN_JSO2_TAKE_OUT_BOMB +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/EnJso2_Init.s") +void EnJso2_Init(Actor* thisx, PlayState* play) { + EnJso2* this = THIS; + EffectBlureInit1 rightSwordBlureInit; + EffectBlureInit1 leftSwordBlureInit; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/EnJso2_Destroy.s") + this->actor.hintId = TATL_HINT_ID_GARO_MASTER; + this->actor.targetMode = TARGET_MODE_5; + this->actor.colChkInfo.mass = 80; + this->actor.colChkInfo.health = 14; + ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 0.0f); + this->actor.colChkInfo.damageTable = &sDamageTable; + this->actor.shape.shadowScale = 0.0f; + SkelAnime_InitFlex(play, &this->skelAnime, &gGaroMasterSkel, &gGaroAppearAnim, this->jointTable, this->morphTable, + GARO_MASTER_LIMB_MAX); + Collider_InitAndSetCylinder(play, &this->bodyCollider, &this->actor, &sCylinderInit); + Collider_InitAndSetQuad(play, &this->rightSwordCollider, &this->actor, &sQuadInit); + Collider_InitAndSetQuad(play, &this->leftSwordCollider, &this->actor, &sQuadInit); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A776E0.s") + rightSwordBlureInit.p1StartColor[0] = leftSwordBlureInit.p1StartColor[0] = 255; + rightSwordBlureInit.p1StartColor[1] = leftSwordBlureInit.p1StartColor[1] = 0; + rightSwordBlureInit.p1StartColor[2] = leftSwordBlureInit.p1StartColor[2] = 0; + rightSwordBlureInit.p1StartColor[3] = leftSwordBlureInit.p1StartColor[3] = 128; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A77790.s") + rightSwordBlureInit.p2StartColor[0] = leftSwordBlureInit.p2StartColor[0] = 255; + rightSwordBlureInit.p2StartColor[1] = leftSwordBlureInit.p2StartColor[1] = 0; + rightSwordBlureInit.p2StartColor[2] = leftSwordBlureInit.p2StartColor[2] = 0; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A77880.s") + rightSwordBlureInit.p1EndColor[0] = leftSwordBlureInit.p1EndColor[0] = 255; + rightSwordBlureInit.p1EndColor[1] = leftSwordBlureInit.p1EndColor[1] = 0; + rightSwordBlureInit.p1EndColor[2] = leftSwordBlureInit.p1EndColor[2] = 0; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A778D8.s") + rightSwordBlureInit.p2EndColor[0] = leftSwordBlureInit.p2EndColor[0] = 255; + rightSwordBlureInit.p2EndColor[1] = leftSwordBlureInit.p2EndColor[1] = 0; + rightSwordBlureInit.p2EndColor[2] = leftSwordBlureInit.p2EndColor[2] = 255; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A778F8.s") + rightSwordBlureInit.p2StartColor[3] = leftSwordBlureInit.p2StartColor[3] = 64; + rightSwordBlureInit.p1EndColor[3] = leftSwordBlureInit.p1EndColor[3] = rightSwordBlureInit.p2EndColor[3] = + leftSwordBlureInit.p2EndColor[3] = 0; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78588.s") + rightSwordBlureInit.elemDuration = leftSwordBlureInit.elemDuration = 8; + rightSwordBlureInit.unkFlag = leftSwordBlureInit.unkFlag = 0; + rightSwordBlureInit.calcMode = leftSwordBlureInit.calcMode = 2; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A785E4.s") + Effect_Add(play, &this->rightSwordBlureIndex, EFFECT_BLURE1, 0, 0, &rightSwordBlureInit); + Effect_Add(play, &this->leftSwordBlureIndex, EFFECT_BLURE1, 0, 0, &leftSwordBlureInit); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A787FC.s") + this->scale = 0.042f; + this->type = EN_JSO2_GET_TYPE(&this->actor); + this->flameScroll = Rand_S16Offset(0, 7); + this->bodyPartsCount = EN_JSO2_BODYPART_MAX; + this->alpha = 255; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78868.s") + if (this->type == EN_JSO2_TYPE_LIGHT_ARROW_ROOM) { + this->actor.draw = NULL; + this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON; + this->actor.flags &= ~ACTOR_FLAG_TARGETABLE; + this->actor.shape.yOffset = 0.0f; + EnJso2_SetupIntroCutscene(this); + } else { + this->actor.gravity = -3.0f; + this->actor.world.rot.y = this->actor.shape.rot.y = this->actor.yawTowardsPlayer; + this->actor.shape.yOffset = 960.0f; + EnJso2_SetupAppear(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78A70.s") +void EnJso2_Destroy(Actor* thisx, PlayState* play) { + EnJso2* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78ACC.s") + Collider_DestroyCylinder(play, &this->bodyCollider); + Collider_DestroyQuad(play, &this->rightSwordCollider); + Collider_DestroyQuad(play, &this->leftSwordCollider); + Effect_Destroy(play, this->rightSwordBlureIndex); + Effect_Destroy(play, this->leftSwordBlureIndex); + Audio_SetMainBgmVolume(0x7F, 0); + Audio_RestorePrevBgm(); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78B04.s") +void EnJso2_ChangeAnim(EnJso2* this, s32 animIndex) { + f32 playSpeed; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78B70.s") + this->animEndFrame = Animation_GetLastFrame(sAnimations[animIndex]); + this->animIndex = animIndex; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78C08.s") + playSpeed = 1.0f; + if (animIndex == EN_JSO2_ANIM_BOUNCE) { + playSpeed = 2.0f; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78C7C.s") + Animation_Change(&this->skelAnime, sAnimations[animIndex], playSpeed, 0.0f, this->animEndFrame, + sAnimationModes[animIndex], -2.0f); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78E8C.s") +/** + * Updates all of the various sub-camera variables to approach their "next" value, then updates the sub-camera. Used for + * the Garo Master's intro and death cutscenes. + */ +void EnJso2_UpdateSubCam(EnJso2* this, PlayState* play) { + if (this->subCamId != SUB_CAM_ID_DONE) { + Math_ApproachF(&this->subCamEye.x, this->subCamEyeNext.x, this->subCamMaxVelocityFrac, this->subCamVelocity); + Math_ApproachF(&this->subCamEye.y, this->subCamEyeNext.y, this->subCamMaxVelocityFrac, this->subCamVelocity); + Math_ApproachF(&this->subCamEye.z, this->subCamEyeNext.z, this->subCamMaxVelocityFrac, this->subCamVelocity); + Math_ApproachF(&this->subCamAt.x, this->subCamAtNext.x, this->subCamMaxVelocityFrac, this->subCamVelocity); + Math_ApproachF(&this->subCamAt.y, this->subCamAtNext.y, this->subCamMaxVelocityFrac, this->subCamVelocity); + Math_ApproachF(&this->subCamAt.z, this->subCamAtNext.z, this->subCamMaxVelocityFrac, this->subCamVelocity); + Math_ApproachF(&this->subCamFov, this->subCamFovNext, 0.3f, 10.0f); + Play_SetCameraAtEye(play, this->subCamId, &this->subCamAt, &this->subCamEye); + Play_SetCameraFov(play, this->subCamId, this->subCamFov); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78F04.s") +s32 EnJso2_ShouldAdvanceMessage(PlayState* play) { + if ((Message_GetState(&play->msgCtx) == TEXT_STATE_5) && Message_ShouldAdvance(play)) { + Message_CloseTextbox(play); + return true; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A78F80.s") + return false; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79038.s") +void EnJso2_SetupIntroCutscene(EnJso2* this) { + this->action = EN_JSO2_ACTION_INTRO_CUTSCENE; + this->swordState = EN_JSO2_SWORD_STATE_NONE_DRAWN; + this->actionFunc = EnJso2_IntroCutscene; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A790E4.s") +static Vec3s sPlayerOverrideInputPosList[] = { { 350, -20, -3430 } }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7919C.s") +/** + * Responsible for handling all aspects of the intro cutscene, including manipulating the sub-camera, making the Garo + * Master jump down from the ceiling, spawning the falling rocks, igniting the Garo Master's swords, etc. When the + * cutscene is over, the Garo Master will start circling the player. + */ +void EnJso2_IntroCutscene(EnJso2* this, PlayState* play) { + Player* player = GET_PLAYER(play); + f32 curFrame = this->skelAnime.curFrame; + Vec3f pos; + s32 i; + s32 pad; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79300.s") + switch (this->cutsceneState) { + case EN_JSO2_INTRO_CS_STATE_WAITING_FOR_PLAYER_TO_APPROACH: + if (this->actor.xzDistToPlayer < 400.0f) { + Audio_SetMainBgmVolume(0, 10); + this->actor.gravity = 0.0f; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79364.s") + case EN_JSO2_INTRO_CS_STATE_STARTED: + if (!CutsceneManager_IsNext(this->actor.csId)) { + CutsceneManager_Queue(this->actor.csId); + } else { + CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); + this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId); + this->subCamMaxVelocityFrac = 0.4f; + this->subCamVelocity = 40.0f; + player->actor.world.pos.x = 420.0f; + player->actor.world.pos.z = -3430.0f; + this->actor.draw = EnJso2_Draw; + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_LAUGH); + pos.x = sPlayerOverrideInputPosList[0].x; + pos.y = sPlayerOverrideInputPosList[0].y; + pos.z = sPlayerOverrideInputPosList[0].z; + this->actor.world.rot.y = Math_Vec3f_Yaw(&this->actor.world.pos, &pos); + this->subCamFov = this->subCamFovNext = 60.0f; + this->actor.world.pos.x = -285.0f; + this->actor.world.pos.y = 535.0f; + this->actor.world.pos.z = -3425.0f; + this->subCamEyeNext.x = 82.0f; + this->subCamEyeNext.y = -586.0f; + this->subCamEyeNext.z = 780.0f; + this->subCamEyeNext.y += 500.0f; + this->subCamAtNext.y = this->subCamEyeNext.y; + Math_Vec3f_Copy(&pos, &this->subCamEyeNext); + OLib_Vec3fAdd(&this->actor.world, &pos, &this->subCamEyeNext, OLIB_ADD_OFFSET); + this->subCamAtNext.x = this->actor.world.pos.x - 90.0f; + this->subCamAtNext.z = this->actor.world.pos.z + 100.0f; + Math_Vec3f_Copy(&this->subCamEye, &this->subCamEyeNext); + Math_Vec3f_Copy(&this->subCamAt, &this->subCamAtNext); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); + func_80122744(play, &this->overrideInputEntry, ARRAY_COUNT(sPlayerOverrideInputPosList), + sPlayerOverrideInputPosList); + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79450.s") + case EN_JSO2_INTRO_CS_STATE_MOVE_PLAYER_FORWARD: + this->actor.world.pos.x = -285.0f; + this->actor.world.pos.y = 535.0f; + this->actor.world.pos.z = -3425.0f; + this->subCamEyeNext.x = 82.0f; + this->subCamEyeNext.y = -516.0f; + this->subCamEyeNext.z = 800.0f; + Math_Vec3f_Copy(&pos, &this->subCamEyeNext); + OLib_Vec3fAdd(&this->actor.world, &pos, &this->subCamEyeNext, OLIB_ADD_OFFSET); + this->subCamAtNext.x = this->actor.world.pos.x - 90.0f; + this->subCamAtNext.y = this->actor.world.pos.y - 591.0f; + this->subCamAtNext.z = this->actor.world.pos.z + 100.0f; + Math_Vec3f_Copy(&this->subCamEye, &this->subCamEyeNext); + Math_Vec3f_Copy(&this->subCamAt, &this->subCamAtNext); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A794C8.s") + if (func_80122760(play, &this->overrideInputEntry, 60.0f)) { + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_19); + this->cutsceneTimer = 10; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79524.s") + case EN_JSO2_INTRO_CS_STATE_SPAWN_FALLING_ROCKS: + if (this->cutsceneTimer == 1) { + Vec3f rockPos; + s32 i; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79600.s") + for (i = 0; i < 2; i++) { + Math_Vec3f_Copy(&rockPos, &this->actor.home.pos); + rockPos.x += Rand_CenteredFloat(80.0f); + rockPos.y = this->actor.world.pos.y + (i * 120.0f); + rockPos.z += Rand_CenteredFloat(80.0f); + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_COL_MAN, rockPos.x, rockPos.y, rockPos.z, 0, + this->actor.world.rot.y, 0, EN_COL_MAN_FALLING_ROCK); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A796BC.s") + this->cutsceneTimer = 25; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7980C.s") + case EN_JSO2_INTRO_CS_STATE_WAIT_FOR_ROCKS_TO_FALL: + if (this->cutsceneTimer == 0) { + Player_SetCsActionWithHaltedActors(play, NULL, PLAYER_CSACTION_4); + this->cutsceneTimer = 20; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79864.s") + case EN_JSO2_INTRO_CS_STATE_PLAYER_SURPRISED: + if (this->cutsceneTimer == 0) { + this->cutsceneTimer = 20; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A798C8.s") + case EN_JSO2_INTRO_CS_STATE_PAN_CAMERA_UPWARDS: + this->subCamEyeNext.x = 82.0f; + this->subCamEyeNext.y = -533.0f; + this->subCamEyeNext.z = 800.0f; + Math_Vec3f_Copy(&pos, &this->subCamEyeNext); + OLib_Vec3fAdd(&this->actor.world, &pos, &this->subCamEyeNext, OLIB_ADD_OFFSET); + this->subCamAtNext.x = this->actor.focus.pos.x - 80.0f; + this->subCamAtNext.y = this->actor.focus.pos.y - 360.0f; + this->subCamAtNext.z = this->actor.focus.pos.z + 100.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7998C.s") + if (this->cutsceneTimer == 0) { + this->cutsceneTimer = 5; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79A84.s") + case EN_JSO2_INTRO_CS_STATE_WAIT_BEFORE_LAUGH: + if (this->cutsceneTimer == 0) { + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_LAUGH); + this->cutsceneTimer = 45; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79B60.s") + case EN_JSO2_INTRO_CS_STATE_LAUGH: + if (this->cutsceneTimer == 0) { + this->actor.speed = 3.0f; + this->actor.velocity.y = 10.0f; + this->actor.gravity = -1.0f; + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_JUMP_DOWN); + this->subCamMaxVelocityFrac = 0.4f; + this->subCamVelocity = 40.0f; + Actor_PlaySfx(&this->actor, NA_SE_EN_PO_ROLL); + Math_Vec3f_Copy(&this->baseSubCamEye, &this->subCamEye); + this->cutsceneTimer = 25; + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A79BA0.s") + case EN_JSO2_INTRO_CS_STATE_JUMP_DOWN: + this->afterimageIndex++; + if (this->afterimageIndex >= EN_JSO2_AFTERIMAGE_COUNT) { + this->afterimageIndex = 0; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7A0D0.s") + if (this->afterimageCount < EN_JSO2_AFTERIMAGE_COUNT - 1) { + this->afterimageCount++; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7A124.s") + Math_Vec3f_Copy(&this->afterimagePos[this->afterimageIndex], &this->actor.world.pos); + Math_Vec3s_Copy(&this->afterimageRot[this->afterimageIndex], &this->actor.world.rot); + this->afterimagePos[this->afterimageIndex].y += 40.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7A2EC.s") + for (i = 0; i < EN_JSO2_AFTERIMAGE_COUNT; i++) { + this->afterimageJointTable[this->afterimageIndex][i] = this->jointTable[i]; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7A360.s") + Math_ApproachF(&this->actor.shape.shadowScale, 17.0f, 0.4f, 4.0f); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/EnJso2_Update.s") + if (this->cutsceneTimer == 0) { + this->subCamEyeNext.x = this->baseSubCamEye.x - 490.0f; + this->subCamEyeNext.y = this->baseSubCamEye.y; + this->subCamEyeNext.z = this->baseSubCamEye.z + 100.0f; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7AA48.s") + this->subCamAtNext.x = this->actor.focus.pos.x - 80.0f; + this->subCamAtNext.y = this->actor.focus.pos.y - 130.0f; + this->subCamAtNext.z = this->actor.focus.pos.z; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/func_80A7AA9C.s") + if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_ONGND); + this->actor.gravity = 0.0f; + this->actor.velocity.y = 0.0f; + this->actor.speed = 0.0f; + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_LAND); + Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 10, + 4.0f, 500, 50, true); + this->cutsceneTimer = 1; + Actor_PlaySfx(&this->actor, NA_SE_EN_EYEGOLE_ATTACK); + this->cutsceneState++; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Jso2/EnJso2_Draw.s") + case EN_JSO2_INTRO_CS_STATE_LAND: + this->afterimageIndex++; + if (this->afterimageIndex >= EN_JSO2_AFTERIMAGE_COUNT) { + this->afterimageIndex = 0; + } + + if (this->afterimageCount < EN_JSO2_AFTERIMAGE_COUNT - 1) { + this->afterimageCount++; + } + + Math_Vec3f_Copy(&this->afterimagePos[this->afterimageIndex], &this->actor.world.pos); + Math_Vec3s_Copy(&this->afterimageRot[this->afterimageIndex], &this->actor.world.rot); + this->afterimagePos[this->afterimageIndex].y += 40.0f; + + for (i = 0; i < EN_JSO2_AFTERIMAGE_COUNT; i++) { + this->afterimageJointTable[this->afterimageIndex][i] = this->jointTable[i]; + } + + if (this->cutsceneTimer == 0) { + this->subCamEyeNext.x = this->baseSubCamEye.x - 518.0f; + this->subCamEyeNext.y = this->baseSubCamEye.y - 11.0f; + this->subCamEyeNext.z = this->baseSubCamEye.z + 100.0f; + } + + this->subCamAtNext.x = this->actor.focus.pos.x + 20.0f; + this->subCamAtNext.y = this->actor.focus.pos.y - 50.0f; + this->subCamAtNext.z = this->actor.focus.pos.z; + + if (curFrame >= this->animEndFrame) { + this->afterimageCount = 0; + this->afterimageIndex = 0; + this->cutsceneTimer = 20; + EnJso2_ChangeAnim(this, EN_JSO2_DRAW_SWORDS); + this->cutsceneState++; + } + break; + + case EN_JSO2_INTRO_CS_STATE_DRAW_SWORDS: + if (Animation_OnFrame(&this->skelAnime, 17.0f)) { + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_SWORD); + Actor_PlaySfx(&this->actor, NA_SE_EV_FLAME_IGNITION); + this->swordState = EN_JSO2_SWORD_STATE_BOTH_DRAWN; + Audio_SetMainBgmVolume(0x7F, 0); + Audio_PlayBgm_StorePrevBgm(NA_BGM_MINI_BOSS); + } + + if (this->cutsceneTimer == 0) { + this->subCamEyeNext.x = this->baseSubCamEye.x - 470.0f; + this->subCamEyeNext.y = this->baseSubCamEye.y - 10.0f; + this->subCamEyeNext.z = this->baseSubCamEye.z + 100.0f; + this->subCamAtNext.x = this->actor.focus.pos.x - 80.0f; + this->subCamAtNext.y = this->actor.focus.pos.y - 30.0f; + this->subCamAtNext.z = this->actor.focus.pos.z; + + if (this->swordState == EN_JSO2_SWORD_STATE_BOTH_DRAWN) { + for (i = 0; i < EN_JSO2_FLAME_COUNT; i++) { + Math_ApproachF(&this->flameScale[i].x, sTargetFlameScales[i].x, 0.3f, 0.0005f); + this->flameScale[i].y = this->flameScale[i].x; + this->flameScale[i].z = this->flameScale[i].x; + } + } + } + + if (curFrame >= this->animEndFrame) { + CutsceneManager_Stop(this->actor.csId); + this->subCamId = SUB_CAM_ID_DONE; + this->actor.flags &= ~ACTOR_FLAG_100000; + this->actor.gravity = -3.0f; + this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON; + this->actor.flags |= ACTOR_FLAG_TARGETABLE; + EnJso2_SetupCirclePlayer(this, play); + } + break; + + default: + break; + } + + this->actor.shape.yOffset = 960.0f; + EnJso2_UpdateSubCam(this, play); +} + +void EnJso2_SetupAppear(EnJso2* this) { + this->swordState = EN_JSO2_SWORD_STATE_NONE_DRAWN; + this->bodyCollider.base.acFlags |= AC_HARD; + this->actor.flags &= ~ACTOR_FLAG_100000; + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_APPEAR_AND_DRAW_SWORDS); + this->actionFunc = EnJso2_Appear; +} + +/** + * Makes the Garo Master jump out of the ground, draw its sword, and start the fight. This function is roughly analogous + * to the function for handling the intro cutscene, however this function does not actually start a cutscene, and all of + * the Garo Master's actions happen during gameplay. + */ +void EnJso2_Appear(EnJso2* this, PlayState* play) { + f32 curFrame = this->skelAnime.curFrame; + s32 i; + + this->actor.world.rot.y = this->actor.shape.rot.y = this->actor.yawTowardsPlayer; + + switch (this->appearState) { + case EN_JSO2_APPEAR_STATE_STARTED: + Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, 8.0f, + 500, 10, true); + Audio_SetMainBgmVolume(0, 10); + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_ENTRY); + this->appearState++; + break; + + case EN_JSO2_APPEAR_STATE_APPEARING: + if (Animation_OnFrame(&this->skelAnime, 18.0f)) { + Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, + 8.0f, 500, 10, true); + } + + Math_ApproachF(&this->actor.shape.shadowScale, 17.0f, 0.4f, 4.0f); + + if (Animation_OnFrame(&this->skelAnime, 45.0f)) { + Audio_SetMainBgmVolume(0x7F, 0); + Audio_PlayBgm_StorePrevBgm(NA_BGM_MINI_BOSS); + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_SWORD); + Actor_PlaySfx(&this->actor, NA_SE_EV_FLAME_IGNITION); + this->swordState = EN_JSO2_SWORD_STATE_BOTH_DRAWN; + } + + if (this->swordState == EN_JSO2_SWORD_STATE_BOTH_DRAWN) { + for (i = 0; i < EN_JSO2_FLAME_COUNT; i++) { + Math_ApproachF(&this->flameScale[i].x, sTargetFlameScales[i].x, 0.3f, 0.0005f); + this->flameScale[i].y = this->flameScale[i].x; + this->flameScale[i].z = this->flameScale[i].x; + } + } + + if (curFrame >= this->animEndFrame) { + EnJso2_SetupCirclePlayer(this, play); + } + break; + + default: + break; + } +} + +void EnJso2_SetupCirclePlayer(EnJso2* this, PlayState* play) { + Player* player = GET_PLAYER(play); + + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_BOUNCE); + this->circlingAngle = player->actor.shape.rot.y; + this->circlingAngularVelocity = 0x258; + this->action = EN_JSO2_ACTION_CIRCLE_PLAYER; + this->isTeleporting = false; + this->bodyCollider.base.acFlags |= AC_HARD; + this->actionFunc = EnJso2_CirclePlayer; +} + +/** + * Makes the Garo Master bounce in a circle around the player, sometimes randomly switching the direction it's + * traveling, until the attack timer reaches 0. Once it does, then the Garo Master will prepare to attack. + */ +void EnJso2_CirclePlayer(EnJso2* this, PlayState* play) { + f32 curFrame = this->skelAnime.curFrame; + Player* player = GET_PLAYER(play); + Vec3f targetPos; + s32 pad; + + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_MOVING - SFX_FLAG); + + if (curFrame < this->animEndFrame) { + SkelAnime_Update(&this->skelAnime); + } else if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { + SkelAnime_Update(&this->skelAnime); + } + + if (Animation_OnFrame(&this->skelAnime, 6.0f)) { + this->actor.velocity.y = 10.0f; + if ((play->gameplayFrames % 2) == 0) { + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_CRYING); + } + } + + if (Animation_OnFrame(&this->skelAnime, 12.0f)) { + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_SKIP); + this->actor.speed = 0.0f; + if (Rand_ZeroFloat(1.0f) < 0.5f) { + this->circlingAngularVelocity = -this->circlingAngularVelocity; + } + } + + if (this->attackTimer == 0) { + this->actor.speed = 0.0f; + EnJso2_SetupSpinBeforeAttack(this); + return; + } + + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0x14); + Math_ApproachF(&this->actor.speed, 5.0f, 0.3f, 2.0f); + this->circlingAngle += this->circlingAngularVelocity; + targetPos.x = (Math_SinS(this->circlingAngle) * 200.0f) + player->actor.world.pos.x; + targetPos.y = this->actor.world.pos.y; + targetPos.z = (Math_CosS(this->circlingAngle) * 200.0f) + player->actor.world.pos.z; + Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &targetPos), 0xA, 0xFA0, 0x14); +} + +void EnJso2_SetupGuard(EnJso2* this) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_GUARD); + this->actor.world.rot.y = this->actor.yawTowardsPlayer; + Actor_PlaySfx(&this->actor, NA_SE_IT_SHIELD_BOUND); + this->bodyCollider.base.acFlags |= AC_HARD; + this->action = EN_JSO2_ACTION_GUARD; + this->actionFunc = EnJso2_Guard; +} + +/** + * Plays the guard animation to completion, then goes back to circling the player. + */ +void EnJso2_Guard(EnJso2* this, PlayState* play) { + f32 curFrame = this->skelAnime.curFrame; + + if (curFrame >= this->animEndFrame) { + EnJso2_SetupCirclePlayer(this, play); + } +} + +void EnJso2_SetupSpinBeforeAttack(EnJso2* this) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_DASH_ATTACK); + this->actor.world.rot.y = -this->actor.yawTowardsPlayer; + this->bodyCollider.base.acFlags |= AC_HARD; + this->action = EN_JSO2_ACTION_SPIN_BEFORE_ATTACK; + this->actor.speed = 10.0f; + this->actor.velocity.y = 20.0f; + this->actionFunc = EnJso2_SpinBeforeAttack; +} + +/** + * Leaps into the air while spinning forward. Once the Garo Master touches the ground, it will begin a dash attack. + */ +void EnJso2_SpinBeforeAttack(EnJso2* this, PlayState* play) { + this->actor.world.rot.x += 0x1770; + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0x14); + + if (this->actor.velocity.y > 0.0f) { + return; + } + + if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { + this->actor.world.rot.x = 0; + this->actor.velocity.y = 0.0f; + this->actor.speed = 0.0f; + this->actor.world.rot.y = this->actor.shape.rot.y = this->actor.yawTowardsPlayer; + EnJso2_SetupDashAttack(this); + } +} + +void EnJso2_SetupDashAttack(EnJso2* this) { + this->attackMovementTimer = 40; + this->bodyCollider.base.acFlags |= AC_HARD; + this->actor.speed = 15.0f; + this->actor.velocity.y = 13.0f; + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_ENTRY); + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_DASH_2); + this->action = EN_JSO2_ACTION_DASH_ATTACK; + this->actionFunc = EnJso2_DashAttack; +} + +/** + * Dashes toward the player with its swords out. If the player shields the attack, the Garo Master will jump backwards a + * small amount. The Garo Master also has a random chance of teleporting every time it touches the ground. Assuming it + * does not teleport, the Garo Master will stop dashing and perform a slash if it's close enough to the player, if the + * difference between its y-rotation and the yaw towards the player is large enough (usually indicating that it has + * dashed past the player), or if 40 frames have passed, whichever comes first. + */ +void EnJso2_DashAttack(EnJso2* this, PlayState* play) { + f32 curFrame = this->skelAnime.curFrame; + s16 yawDiff; + s16 absYawDiff; + Vec3f knockbackVelocity; + + if ((this->rightSwordCollider.base.atFlags & AT_BOUNCED) || (this->leftSwordCollider.base.atFlags & AT_BOUNCED)) { + this->rightSwordCollider.base.atFlags &= ~(AT_HIT | AT_BOUNCED); + this->leftSwordCollider.base.atFlags &= ~(AT_HIT | AT_BOUNCED); + Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW); + Matrix_MultVecZ(-10.0f, &knockbackVelocity); + Math_Vec3f_Copy(&this->knockbackVelocity, &knockbackVelocity); + this->disableBlure = true; + this->attackMovementTimer = 0; + AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); + EnJso2_SetupJumpBack(this); + return; + } + + if ((this->actor.velocity.y < 0.0f) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) { + if (Rand_ZeroOne() < ((BREG(22) * 0.1f) + 0.7f)) { + this->actor.velocity.y = 13.0f; + } else { + AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); + this->disableBlure = true; + this->isTeleporting = true; + this->actor.speed = 0.0f; + EnJso2_SetupTeleport(this); + return; + } + } + + if (curFrame < this->animEndFrame) { + return; + } + + yawDiff = this->actor.yawTowardsPlayer - this->actor.shape.rot.y; + absYawDiff = ABS_ALT(yawDiff); + + if ((this->attackMovementTimer == 0) || (this->actor.xzDistToPlayer < 120.0f) || (absYawDiff > 0x4300)) { + AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); + Math_ApproachZeroF(&this->actor.speed, 0.3f, 3.0f); + EnJso2_SetupSlash(this, play); + } +} + +void EnJso2_SetupTeleport(EnJso2* this) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_DASH_ATTACK); + this->attackMovementTimer = 20; + this->actor.speed = 0.0f; + this->actor.gravity = 0.0f; + this->actor.velocity.y = 10.0f; + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_JUMP); + this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON; + this->action = EN_JSO2_ACTION_TELEPORT; + this->actionFunc = EnJso2_Teleport; +} + +/** + * Jump into the air while spinning around and shrinking. After 20 frames, this function will move the Garo Master to be + * directly above the player's current location. + */ +void EnJso2_Teleport(EnJso2* this, PlayState* play) { + this->actor.shape.rot.y -= 0x1D4C; + Math_ApproachZeroF(&this->scale, 0.3f, 0.01f); + Math_ApproachZeroF(&this->actor.shape.shadowScale, 0.3f, 3.0f); + + if (this->attackMovementTimer == 0) { + EnJso2_SetupFallFromTeleport(this, play); + } +} + +void EnJso2_SetupFallFromTeleport(EnJso2* this, PlayState* play) { + Player* player = GET_PLAYER(play); + + Math_Vec3f_Copy(&this->actor.world.pos, &player->actor.world.pos); + this->actor.world.pos.y += 300.0f + BREG(52); + this->actor.velocity.y = 0.0f; + this->actor.gravity = BREG(53) + -3.0f; + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_FALL); + this->action = EN_JSO2_ACTION_FALL_FROM_TELEPORT; + this->actionFunc = EnJso2_FallFromTeleport; +} + +/** + * Makes the Garo Master grow back to its original size and fall down onto where the player was standing when + * EnJso2_SetupFallFromTeleport was called. When it touches the ground, it will perform a slash. + */ +void EnJso2_FallFromTeleport(EnJso2* this, PlayState* play) { + Math_ApproachF(&this->scale, 0.042f, 0.3f, 0.03f); + Math_ApproachF(&this->actor.shape.shadowScale, 17.0f, 0.4f, 4.0f); + + if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { + this->isTeleporting = false; + this->scale = 0.042f; + this->actor.shape.shadowScale = 17.0f; + this->actor.flags &= ~ACTOR_FLAG_CANT_LOCK_ON; + EnJso2_SetupSlash(this, play); + } +} + +void EnJso2_SetupSlash(EnJso2* this, PlayState* play) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_SLASH_START); + Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, 8.0f, 500, + 10, true); + Math_ApproachZeroF(&this->actor.speed, 0.3f, 3.0f); + this->slashHitSomething = false; + Actor_PlaySfx(&this->actor, NA_SE_IT_SWORD_SWING_HARD); + this->action = EN_JSO2_ACTION_SLASH; + this->bodyCollider.base.acFlags &= ~AC_HARD; + this->actionFunc = EnJso2_Slash; +} + +/** + * Slash in place with both swords. If the player shields the attack, the Garo Master will jump backwards. + * Once the slash animation ends, this function will transition the Garo Master to a waiting state. + */ +void EnJso2_Slash(EnJso2* this, PlayState* play) { + Vec3f knockbackVelocity; + f32 curFrame = this->skelAnime.curFrame; + + Math_ApproachZeroF(&this->actor.speed, 0.5f, 5.0f); + + if ((play->gameplayFrames % 8) == 0) { + Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, 8.0f, + 500, 10, true); + } + + if ((this->rightSwordCollider.base.atFlags & AT_HIT) || (this->leftSwordCollider.base.atFlags & AT_HIT)) { + this->slashHitSomething = true; + this->rightSwordCollider.base.atFlags &= ~AT_HIT; + this->leftSwordCollider.base.atFlags &= ~AT_HIT; + } + + if ((this->rightSwordCollider.base.atFlags & AT_BOUNCED) || (this->leftSwordCollider.base.atFlags & AT_BOUNCED)) { + this->rightSwordCollider.base.atFlags &= ~(AT_HIT | AT_BOUNCED); + this->leftSwordCollider.base.atFlags &= ~(AT_HIT | AT_BOUNCED); + Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW); + Matrix_MultVecZ(-10.0f, &knockbackVelocity); + Math_Vec3f_Copy(&this->knockbackVelocity, &knockbackVelocity); + this->disableBlure = true; + EnJso2_SetupJumpBack(this); + return; + } + + if (curFrame >= this->animEndFrame) { + this->actor.speed = 0.0f; + this->disableBlure = true; + EnJso2_SetupWaitAfterSlash(this); + } +} + +void EnJso2_SetupSpinAttack(EnJso2* this) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_SPIN_ATTACK); + this->slashHitSomething = false; + Actor_PlaySfx(&this->actor, NA_SE_IT_SWORD_SWING_HARD); + this->disableBlure = false; + this->attackTimer = 15; + this->action = EN_JSO2_ACTION_SPIN_ATTACK; + this->actor.speed = 12.0f; + this->actionFunc = EnJso2_SpinAttack; +} + +/** + * Spins around rapidly with its swords out. If 15 frames pass, the Garo Master hits the player, or the Garo Master + * bounces off the player's shield, it will end the spin attack and jump backwards. + */ +void EnJso2_SpinAttack(EnJso2* this, PlayState* play) { + this->actor.shape.rot.y -= 0x1770; + Actor_SpawnFloorDustRing(play, &this->actor, &this->actor.world.pos, this->actor.shape.shadowScale, 1, 4.0f, 300, 5, + true); + Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 1, 0xFA0, 0x14); + + if ((this->attackTimer == 0) || (this->rightSwordCollider.base.atFlags & AT_HIT) || + (this->rightSwordCollider.base.atFlags & AT_BOUNCED) || (this->leftSwordCollider.base.atFlags & AT_HIT) || + (this->leftSwordCollider.base.atFlags & AT_BOUNCED)) { + this->rightSwordCollider.base.atFlags &= ~(AT_HIT | AT_BOUNCED); + this->leftSwordCollider.base.atFlags &= ~(AT_HIT | AT_BOUNCED); + EnJso2_SetupJumpBack(this); + } +} + +void EnJso2_SetupWaitAfterSlash(EnJso2* this) { + if (this->slashHitSomething) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_SLASH_LOOP); + this->timer = 20; + } else { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_LOOK_AROUND); + this->timer = 40; + } + + this->bodyCollider.base.acFlags &= ~AC_HARD; + this->action = EN_JSO2_ACTION_WAIT_AFTER_SLASH; + this->actionFunc = EnJso2_WaitAfterSlash; +} + +/** + * Waits either 20 or 40 frames, depending on whether or not the Garo Master hit the player with its slash attack. If + * the slash didn't hit anything, the Garo Master will play its looking around animation; otherwise, it will just hold + * its swords out. Once this waiting period ends, the Garo Master starts circling the player again. + */ +void EnJso2_WaitAfterSlash(EnJso2* this, PlayState* play) { + if (this->timer == 0) { + this->attackTimer = Rand_S16Offset(30, 30); + this->slashHitSomething = false; + this->bodyCollider.base.acFlags |= AC_HARD; + EnJso2_SetupCirclePlayer(this, play); + } +} + +/** + * Unlike most enemies, this will make the Garo Master play its damaged animation rather than stopping all animations. + */ +void EnJso2_SetupStunned(EnJso2* this) { + Vec3f knockbackVelocity; + + AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_DAMAGED); + this->timer = 30; + this->bodyCollider.base.acFlags &= ~AC_HARD; + this->actor.speed = 0.0f; + Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW); + Matrix_MultVecZ(-10.0f, &knockbackVelocity); + Math_Vec3f_Copy(&this->knockbackVelocity, &knockbackVelocity); + + if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) && + (this->drawDmgEffAlpha == 0)) { + this->drawDmgEffAlpha = 0; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; + } + + if ((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) && + (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) { + this->timer = 40; + } + + this->action = EN_JSO2_ACTION_STUNNED; + this->actionFunc = EnJso2_Stunned; +} + +/** + * Makes the Garo Master play its damaged animation and stop moving until 40 frames have passed, then it jumps back. + */ +void EnJso2_Stunned(EnJso2* this, PlayState* play) { + if (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) { + if ((this->drawDmgEffAlpha != 0) && (this->drawDmgEffAlpha < 60)) { + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX; + } + } + + if ((this->timer == 0) && (this->drawDmgEffAlpha == 0)) { + if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) { + Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_JSO2_BODYPART_MAX, 2, 0.7f, 0.4f); + this->drawDmgEffAlpha = 0; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; + } + + EnJso2_SetupJumpBack(this); + } +} + +void EnJso2_SetupDamaged(EnJso2* this, PlayState* play) { + Vec3f knockbackVelocity; + + AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_DAMAGED); + this->slashHitSomething = false; + this->actor.velocity.y = 10.0f; + this->actor.speed = 0.0f; + Matrix_RotateYS(this->actor.yawTowardsPlayer, MTXMODE_NEW); + Matrix_MultVecZ(-20.0f, &knockbackVelocity); + Math_Vec3f_Copy(&this->knockbackVelocity, &knockbackVelocity); + + if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) && + (this->drawDmgEffAlpha != 0)) { + Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_JSO2_BODYPART_MAX, 2, 0.7f, 0.4f); + this->drawDmgEffAlpha = 0; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; + } + + CollisionCheck_GreenBlood(play, NULL, &this->actor.focus.pos); + CollisionCheck_GreenBlood(play, NULL, &this->actor.focus.pos); + CollisionCheck_GreenBlood(play, NULL, &this->actor.focus.pos); + Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_RED, 255, COLORFILTER_BUFFLAG_OPA, 8); + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_DAMAGE); + this->action = EN_JSO2_ACTION_DAMAGED; + this->actionFunc = EnJso2_Damaged; +} + +/** + * Plays the damaged animation until the Garo Master is touching the ground and no longer has its red color filter, at + * which point it will perform a spin attack. + */ +void EnJso2_Damaged(EnJso2* this, PlayState* play) { + if (this->actor.velocity.y > 0.0f) { + return; + } + + if ((this->actor.colorFilterTimer == 0) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) { + EnJso2_SetupSpinAttack(this); + } +} + +void EnJso2_SetupJumpBack(EnJso2* this) { + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_JUMP_BACK); + this->actor.world.rot.y = -this->actor.world.rot.y; + this->isTeleporting = false; + this->action = EN_JSO2_ACTION_JUMP_BACK; + this->actor.speed = 7.0f; + this->actor.velocity.y = 20.0f; + this->actionFunc = EnJso2_JumpBack; +} + +/** + * Jump backwards away from the player. After the Garo Master touches the ground and the jump back animation completes, + * the Garo Master will transition to circling the player. + */ +void EnJso2_JumpBack(EnJso2* this, PlayState* play) { + f32 curFrame = this->skelAnime.curFrame; + + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xBB8, 0x14); + + if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { + this->actor.speed = 0.0f; + } + + if ((curFrame >= this->animEndFrame) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) { + this->actor.world.rot.x = 0; + this->actor.velocity.y = 0.0f; + this->actor.speed = 0.0f; + this->actor.world.rot.y = this->actor.shape.rot.y; + this->attackTimer = Rand_S16Offset(10, 10); + EnJso2_SetupCirclePlayer(this, play); + } +} + +void EnJso2_SetupDead(EnJso2* this, PlayState* play) { + AudioSfx_SetChannelIO(&this->actor.projectedPos, NA_SE_EN_ANSATSUSYA_DASH_2, 0); + EnJso2_ChangeAnim(this, EN_JSO2_ANIM_DAMAGED); + + if (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) && + (this->drawDmgEffAlpha == 0)) { + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; + } + + this->actor.flags |= ACTOR_FLAG_CANT_LOCK_ON; + this->actor.flags &= ~(ACTOR_FLAG_TARGETABLE | ACTOR_FLAG_UNFRIENDLY); + this->actor.speed = 0.0f; + this->disableBlure = true; + this->timer = 30; + this->swordState = EN_JSO2_SWORD_STATE_NONE_DRAWN; + this->actor.world.rot.x = this->actor.shape.rot.x = this->actor.world.rot.z = this->actor.shape.rot.z = 0; + Enemy_StartFinishingBlow(play, &this->actor); + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_DEAD); + Math_Vec3f_Copy(&this->knockbackVelocity, &gZeroVec3f); + this->action = EN_JSO2_ACTION_DEAD; + this->actionFunc = EnJso2_Dead; +} + +/** + * Plays the damaged animation for 30 frames, then transitions the Garo Master to collapsing onto one knee and blowing + * itself up. Whether or not this happens in a cutscene or in gameplay depends on the Garo Master's type. + */ +void EnJso2_Dead(EnJso2* this, PlayState* play) { + Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0x14); + + if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) { + if (this->drawDmgEffAlpha != 0) { + Actor_SpawnIceEffects(play, &this->actor, this->bodyPartsPos, EN_JSO2_BODYPART_MAX, 2, 0.7f, 0.4f); + this->drawDmgEffAlpha = 0; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; + } else { + return; + } + } + + if (this->timer == 0) { + this->subCamFov = this->subCamFovNext = 60.0f; + if (this->type == EN_JSO2_TYPE_LIGHT_ARROW_ROOM) { + EnJso2_SetupDeathCutscene(this); + } else { + EnJso2_SetupBlowUp(this); + } + } +} + +void EnJso2_SetupDeathCutscene(EnJso2* this) { + this->cutsceneState = EN_JSO2_DEATH_CS_STATE_STARTED; + this->cutsceneTimer = 0; + this->subCamId = SUB_CAM_ID_DONE; + this->actor.flags |= ACTOR_FLAG_100000; + this->timer = 30; + this->action = EN_JSO2_ACTION_BLOW_UP; + this->actionFunc = EnJso2_DeathCutscene; +} + +/** + * Responsible for handling all aspects of the intro cutscene, including making the Garo Master take out a bomb, + * displaying the messages that give the player a hint on how to use the Light Arrow, detonating the bomb and making the + * Garo Master fade away, etc. + */ +void EnJso2_DeathCutscene(EnJso2* this, PlayState* play) { + Player* player = GET_PLAYER(play); + f32 curFrame = this->skelAnime.curFrame; + Vec3f subCamEyeNextOffset; + + if ((this->animIndex == EN_JSO2_TAKE_OUT_BOMB) && (curFrame >= this->animEndFrame) && (this->bomb == NULL)) { + this->bomb = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_COL_MAN, this->bombPos.x, + this->bombPos.y, this->bombPos.z, 0, 0, 0, EN_COL_MAN_CUTSCENE_BOMB); + } + + if (this->bomb != NULL) { + this->bomb->world.pos.x = this->bombPos.x; + this->bomb->world.pos.y = this->bombPos.y; + this->bomb->world.pos.z = this->bombPos.z; + } + + switch (this->cutsceneState) { + case EN_JSO2_DEATH_CS_STATE_STARTED: + if (!CutsceneManager_IsNext(this->actor.csId)) { + CutsceneManager_Queue(this->actor.csId); + } else { + CutsceneManager_StartWithPlayerCs(this->actor.csId, &this->actor); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); + this->actor.world.rot.y = this->actor.shape.rot.y = + Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos); + Audio_SetMainBgmVolume(0, 10); + EnJso2_ChangeAnim(this, EN_JSO2_COLLAPSE); + this->subCamId = CutsceneManager_GetCurrentSubCamId(this->actor.csId); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); + this->subCamMaxVelocityFrac = 0.4f; + this->subCamVelocity = 40.0f; + this->cutsceneState++; + } + break; + + case EN_JSO2_DEATH_CS_STATE_COLLAPSE: + if (curFrame >= this->animEndFrame) { + EnJso2_ChangeAnim(this, EN_JSO2_TREMBLE); + this->cutsceneState++; + } + break; + + case EN_JSO2_DEATH_CS_STATE_TREMBLE: + if (curFrame >= this->animEndFrame) { + this->actor.textId = 0x13AE; + Message_StartTextbox(play, this->actor.textId, &this->actor); + this->cutsceneState++; + } + break; + + case EN_JSO2_DEATH_CS_STATE_TELL_HINT: + if (EnJso2_ShouldAdvanceMessage(play)) { + if (this->actor.textId == 0x13AE) { + this->actor.textId = 0x13AF; + } else if (this->actor.textId == 0x13AF) { + this->actor.textId = 0x13B0; + EnJso2_ChangeAnim(this, EN_JSO2_TAKE_OUT_BOMB); + } else if (this->actor.textId == 0x13B0) { + play->msgCtx.msgLength = 0; + if (this->bomb != NULL) { + this->bomb->world.rot.z = 1; + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_47); + this->isFadingAway = true; + } + + this->cutsceneTimer = 30; + this->cutsceneState++; + break; + } + + Message_ContinueTextbox(play, this->actor.textId); + } + break; + + case EN_JSO2_DEATH_CS_STATE_BLOW_UP_AND_FADE_AWAY: + Math_SmoothStepToS(&this->alpha, 0, 1, 15, 50); + Math_ApproachZeroF(&this->actor.shape.shadowScale, 0.3f, 3.0f); + if (this->cutsceneTimer == 0) { + this->actor.textId = 0x13B1; + Message_StartTextbox(play, this->actor.textId, &this->actor); + Actor_PlaySfx(&this->actor, NA_SE_EN_ANSATSUSYA_LAUGH); + this->timer = 50; + this->cutsceneState++; + } + break; + + case EN_JSO2_DEATH_CS_STATE_WAIT_AND_END: + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_WAIT); + if (this->timer == 0) { + CutsceneManager_Stop(this->actor.csId); + Player_SetCsActionWithHaltedActors(play, &this->actor, PLAYER_CSACTION_END); + Actor_Kill(&this->actor); + } + break; + + default: + break; + } + + if (this->subCamId != SUB_CAM_ID_DONE) { + player->actor.world.pos.x = (Math_SinS(this->actor.world.rot.y) * 170.0f) + this->actor.world.pos.x; + player->actor.world.pos.z = (Math_CosS(this->actor.world.rot.y) * 170.0f) + this->actor.world.pos.z; + player->actor.world.rot.y = player->actor.shape.rot.y = this->actor.world.rot.y + 0x8000; + Matrix_RotateYS(((BREG(49) * 0x100) + this->actor.shape.rot.y + 0x1000), MTXMODE_NEW); + Matrix_MultVecZ(BREG(48) + 230.0f, &subCamEyeNextOffset); + this->subCamEyeNext.x = this->actor.world.pos.x + subCamEyeNextOffset.x; + this->subCamEyeNext.y = BREG(50) + -43.0f + this->actor.world.pos.y + 50.0f; + this->subCamEyeNext.z = this->actor.world.pos.z + subCamEyeNextOffset.z; + this->subCamAtNext.x = F32_LERPIMP(player->actor.world.pos.x, this->actor.world.pos.x, 0.5f); + this->subCamAtNext.y = BREG(51) + 6.0f + player->actor.world.pos.y + 5.0f; + this->subCamAtNext.z = F32_LERPIMP(player->actor.world.pos.z, this->actor.world.pos.z, 0.5f); + } + + EnJso2_UpdateSubCam(this, play); +} + +void EnJso2_SetupBlowUp(EnJso2* this) { + this->cutsceneTimer = 0; + Audio_SetMainBgmVolume(0, 10); + EnJso2_ChangeAnim(this, EN_JSO2_COLLAPSE); + this->action = EN_JSO2_ACTION_BLOW_UP; + this->actionFunc = EnJso2_BlowUp; +} + +/** + * This function makes the Garo Master collapse onto one knee, take out a bomb, and blow itself up. It is roughly + * analogous to part of the death cutscene, however all of the Garo Master's actions happen during regular gameplay, and + * the bomb can even damage the player if they're too close when it detonates. After the Garo Master blows up, this + * function will make it start fading away. + */ +void EnJso2_BlowUp(EnJso2* this, PlayState* play) { + f32 curFrame = this->skelAnime.curFrame; + + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, 0xFA0, 0x14); + + if ((this->animIndex == EN_JSO2_COLLAPSE) && (curFrame >= this->animEndFrame)) { + this->blowUpFrameCounter = 0; + EnJso2_ChangeAnim(this, EN_JSO2_TREMBLE); + } + + if ((this->animIndex == EN_JSO2_TREMBLE) && (curFrame >= this->animEndFrame)) { + this->blowUpFrameCounter++; + if (this->blowUpFrameCounter >= 2) { + this->blowUpFrameCounter = 0; + EnJso2_ChangeAnim(this, EN_JSO2_TAKE_OUT_BOMB); + } + } + + if ((this->animIndex == EN_JSO2_TAKE_OUT_BOMB) && (curFrame >= this->animEndFrame)) { + if (this->bomb == NULL) { + this->bomb = Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_COL_MAN, this->bombPos.x, + this->bombPos.y, this->bombPos.z, 0, 0, 0, EN_COL_MAN_GAMEPLAY_BOMB); + } else if (this->blowUpFrameCounter >= 10) { + if (this->bomb != NULL) { + this->bomb->world.rot.z = 1; + this->isFadingAway = true; + this->actionFunc = EnJso2_FadeAway; + return; + } + } else { + this->blowUpFrameCounter++; + } + } + + if (this->bomb != NULL) { + this->bomb->world.pos.x = this->bombPos.x; + this->bomb->world.pos.y = this->bombPos.y; + this->bomb->world.pos.z = this->bombPos.z; + } + + CollisionCheck_SetOC(play, &play->colChkCtx, &this->bodyCollider.base); +} + +/** + * Slowly reduces the Garo Master's alpha until it almost reaches zero, then kills the Garo Master actor. + */ +void EnJso2_FadeAway(EnJso2* this, PlayState* play) { + Math_SmoothStepToS(&this->alpha, 0, 1, 15, 50); + Math_ApproachZeroF(&this->actor.shape.shadowScale, 0.3f, 3.0f); + + if (this->alpha < 2) { + Actor_Kill(&this->actor); + } +} + +void EnJso2_UpdateDamage(EnJso2* this, PlayState* play) { + s32 attackDealsDamage = false; + + if ((this->action != EN_JSO2_ACTION_DAMAGED) && (this->action != EN_JSO2_ACTION_JUMP_BACK) && + (this->action != EN_JSO2_ACTION_DEAD) && (this->action != EN_JSO2_ACTION_BLOW_UP) && + (this->bodyCollider.base.acFlags & AC_HIT)) { + this->bodyCollider.base.acFlags &= ~AC_HIT; + if ((this->actor.colChkInfo.damageEffect == EN_JSO2_DMGEFF_STUN) || + (this->actor.colChkInfo.damageEffect == EN_JSO2_DMGEFF_ELECTRIC_STUN)) { + this->actor.world.rot.x = this->actor.shape.rot.x = 0; + + if (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) && + (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) || + (this->drawDmgEffAlpha == 0)) { + Actor_PlaySfx(&this->actor, NA_SE_EN_COMMON_FREEZE); + if (this->actor.colChkInfo.damageEffect == EN_JSO2_DMGEFF_ELECTRIC_STUN) { + this->drawDmgEffAlpha = 40; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_ELECTRIC_SPARKS_LARGE; + } + + Actor_SetColorFilter(&this->actor, COLORFILTER_COLORFLAG_BLUE, 255, COLORFILTER_BUFFLAG_OPA, 40); + EnJso2_SetupStunned(this); + } + } else { + switch (this->action) { + case EN_JSO2_ACTION_UNK_2: + case EN_JSO2_ACTION_CIRCLE_PLAYER: + case EN_JSO2_ACTION_GUARD: + this->actor.speed = 0.0f; + EnJso2_SetupGuard(this); + attackDealsDamage = false; + break; + + case EN_JSO2_ACTION_SLASH: + case EN_JSO2_ACTION_WAIT_AFTER_SLASH: + case EN_JSO2_ACTION_STUNNED: + switch (this->actor.colChkInfo.damageEffect) { + case EN_JSO2_DMGEFF_NONE: + attackDealsDamage = true; + break; + + case EN_JSO2_DMGEFF_FIRE: + this->drawDmgEffAlpha = 40; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FIRE; + attackDealsDamage = true; + break; + + case EN_JSO2_DMGEFF_LIGHT_ORB: + if (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) && + (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) || + (this->drawDmgEffAlpha == 0)) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_CLEAR_TAG, this->actor.focus.pos.x, + this->actor.focus.pos.y, this->actor.focus.pos.z, 0, 0, 0, + CLEAR_TAG_PARAMS(CLEAR_TAG_LARGE_LIGHT_RAYS)); + this->drawDmgEffAlpha = 20; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_LIGHT_ORBS; + attackDealsDamage = true; + } + break; + + case EN_JSO2_DMGEFF_FREEZE: + if (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) && + (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) || + (this->drawDmgEffAlpha == 0)) { + attackDealsDamage = false; + Actor_ApplyDamage(&this->actor); + this->drawDmgEffAlpha = 80; + this->drawDmgEffType = ACTOR_DRAW_DMGEFF_FROZEN_SFX; + this->drawDmgEffScale = 0.0f; + this->drawDmgEffFrozenSteamScale = 1.5f; + } + + if (this->actor.colChkInfo.health <= 0) { + EnJso2_SetupDead(this, play); + attackDealsDamage = false; + } else { + EnJso2_SetupStunned(this); + attackDealsDamage = false; + } + break; + + default: + break; + } + break; + + default: + break; + } + + if (attackDealsDamage) { + Actor_ApplyDamage(&this->actor); + if (this->actor.colChkInfo.health > 0) { + EnJso2_SetupDamaged(this, play); + } else { + EnJso2_SetupDead(this, play); + } + } + } + } +} + +void EnJso2_Update(Actor* thisx, PlayState* play) { + EnJso2* this = THIS; + s32 pad; + s32 i; + + if (this->action != EN_JSO2_ACTION_CIRCLE_PLAYER) { + SkelAnime_Update(&this->skelAnime); + } + + DECR(this->attackMovementTimer); + DECR(this->attackTimer); + DECR(this->timer); + DECR(this->cutsceneTimer); + DECR(this->drawDmgEffAlpha); + + EnJso2_UpdateDamage(this, play); + Actor_SetScale(&this->actor, this->scale); + this->actionFunc(this, play); + Actor_SetFocus(&this->actor, 80.0f); + Actor_MoveWithGravity(&this->actor); + + if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) { + this->actor.world.pos.x += this->knockbackVelocity.x; + this->actor.world.pos.z += this->knockbackVelocity.z; + Math_ApproachZeroF(&this->knockbackVelocity.x, 1.0f, 2.0f); + Math_ApproachZeroF(&this->knockbackVelocity.z, 1.0f, 2.0f); + } + + Actor_UpdateBgCheckInfo(play, &this->actor, 35.0f, 60.0f, 60.0f, + UPDBGCHECKINFO_FLAG_1 | UPDBGCHECKINFO_FLAG_4 | UPDBGCHECKINFO_FLAG_8 | + UPDBGCHECKINFO_FLAG_10); + + if ((this->action == EN_JSO2_ACTION_SPIN_BEFORE_ATTACK) || (this->action == EN_JSO2_ACTION_DASH_ATTACK) || + (this->action == EN_JSO2_ACTION_TELEPORT) || (this->action == EN_JSO2_ACTION_FALL_FROM_TELEPORT)) { + this->afterimageIndex++; + if (this->afterimageIndex >= EN_JSO2_AFTERIMAGE_COUNT) { + this->afterimageIndex = 0; + } + + if (this->afterimageCount < EN_JSO2_AFTERIMAGE_COUNT - 1) { + this->afterimageCount++; + } + + Math_Vec3f_Copy(&this->afterimagePos[this->afterimageIndex], &this->actor.world.pos); + Math_Vec3s_Copy(&this->afterimageRot[this->afterimageIndex], &this->actor.world.rot); + this->afterimagePos[this->afterimageIndex].y += 40.0f; + + for (i = 0; i < EN_JSO2_AFTERIMAGE_COUNT; i++) { + this->afterimageJointTable[this->afterimageIndex][i] = this->jointTable[i]; + } + } else if (this->action != EN_JSO2_ACTION_INTRO_CUTSCENE) { + this->afterimageCount = 0; + } + + if ((this->action != EN_JSO2_ACTION_CIRCLE_PLAYER) && (this->action != EN_JSO2_ACTION_SPIN_BEFORE_ATTACK) && + (this->action != EN_JSO2_ACTION_DAMAGED) && (this->action != EN_JSO2_ACTION_SPIN_ATTACK) && + (this->action != EN_JSO2_ACTION_TELEPORT) && (this->action != EN_JSO2_ACTION_JUMP_BACK)) { + this->actor.shape.rot.y = this->actor.world.rot.y; + } + + this->actor.shape.rot.x = this->actor.world.rot.x; + Collider_UpdateCylinder(&this->actor, &this->bodyCollider); + + if ((this->action != EN_JSO2_ACTION_INTRO_CUTSCENE) && (this->action != EN_JSO2_ACTION_SPIN_ATTACK) && + (this->action != EN_JSO2_ACTION_TELEPORT)) { + CollisionCheck_SetOC(play, &play->colChkCtx, &this->bodyCollider.base); + if ((this->action != EN_JSO2_ACTION_UNK_1) && (this->action != EN_JSO2_ACTION_SPIN_ATTACK)) { + CollisionCheck_SetAC(play, &play->colChkCtx, &this->bodyCollider.base); + } + } + + if (((this->action == EN_JSO2_ACTION_SLASH) || (this->action == EN_JSO2_ACTION_FALL_FROM_TELEPORT) || + (this->action == EN_JSO2_ACTION_DASH_ATTACK) || (this->action == EN_JSO2_ACTION_SPIN_ATTACK)) && + !this->slashHitSomething && (this->swordState == EN_JSO2_SWORD_STATE_BOTH_DRAWN)) { + CollisionCheck_SetAT(play, &play->colChkCtx, &this->rightSwordCollider.base); + CollisionCheck_SetAT(play, &play->colChkCtx, &this->leftSwordCollider.base); + } +} + +s32 EnJso2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { + EnJso2* this = THIS; + + if (this->swordState == EN_JSO2_SWORD_STATE_NONE_DRAWN) { + if ((limbIndex == GARO_MASTER_LIMB_LEFT_SWORD) && (this->action != EN_JSO2_ACTION_BLOW_UP)) { + *dList = NULL; + } + + if (limbIndex == GARO_MASTER_LIMB_RIGHT_SWORD) { + *dList = NULL; + } + } + + return false; +} + +void EnJso2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + static Vec3f sSwordTipOffset = { 1600.0f, 0.0f, 0.0f }; + static Vec3f sSwordBaseOffset = { 0.0f, 0.0f, 0.0f }; + static Vec3f sSwordTipQuadOffset = { 1700.0f, 0.0f, 0.0f }; + static Vec3f sSwordBaseQuadOffset = { 0.0f, 0.0f, 0.0f }; + EnJso2* this = THIS; + Vec3f swordTipPos; + Vec3f swordBasePos; + Vec3f bombOffset = { 0.0f, 0.0f, 0.0f }; + + if (limbIndex == GARO_MASTER_LIMB_LEFT_SWORD) { + Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Math_Vec3f_Copy(&this->leftSwordCollider.dim.quad[3], &this->leftSwordCollider.dim.quad[1]); + Math_Vec3f_Copy(&this->leftSwordCollider.dim.quad[2], &this->leftSwordCollider.dim.quad[0]); + Matrix_MultVec3f(&sSwordTipQuadOffset, &this->leftSwordCollider.dim.quad[1]); + Matrix_MultVec3f(&sSwordBaseQuadOffset, &this->leftSwordCollider.dim.quad[0]); + Collider_SetQuadVertices(&this->leftSwordCollider, &this->leftSwordCollider.dim.quad[0], + &this->leftSwordCollider.dim.quad[1], &this->leftSwordCollider.dim.quad[2], + &this->leftSwordCollider.dim.quad[3]); + Matrix_MultVec3f(&sSwordTipOffset, &swordTipPos); + Matrix_MultVec3f(&sSwordBaseOffset, &swordBasePos); + + if ((this->action == EN_JSO2_ACTION_SLASH) || (this->action == EN_JSO2_ACTION_WAIT_AFTER_SLASH)) { + Matrix_MultVec3f(&sSlashFlameOffsets[0], &this->flamePos[0]); + Matrix_MultVec3f(&sSlashFlameOffsets[1], &this->flamePos[1]); + Matrix_MultVec3f(&sSlashFlameOffsets[2], &this->flamePos[2]); + } else { + Matrix_MultVec3f(&sFlameOffsets[0], &this->flamePos[0]); + Matrix_MultVec3f(&sFlameOffsets[1], &this->flamePos[1]); + Matrix_MultVec3f(&sFlameOffsets[2], &this->flamePos[2]); + } + + if (((this->action == EN_JSO2_ACTION_SLASH) || (this->action == EN_JSO2_ACTION_SPIN_ATTACK) || + (this->action == EN_JSO2_ACTION_DASH_ATTACK) || (this->action == EN_JSO2_ACTION_FALL_FROM_TELEPORT)) && + !this->disableBlure) { + EffectBlure_AddVertex(Effect_GetByIndex(this->leftSwordBlureIndex), &swordTipPos, &swordBasePos); + } else if (this->disableBlure == true) { + EffectBlure_AddSpace(Effect_GetByIndex(this->leftSwordBlureIndex)); + } + } + + if (limbIndex == GARO_MASTER_LIMB_RIGHT_SWORD) { + Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_APPLY); + Math_Vec3f_Copy(&this->rightSwordCollider.dim.quad[3], &this->rightSwordCollider.dim.quad[1]); + Math_Vec3f_Copy(&this->rightSwordCollider.dim.quad[2], &this->rightSwordCollider.dim.quad[0]); + Matrix_MultVec3f(&sSwordTipQuadOffset, &this->rightSwordCollider.dim.quad[1]); + Matrix_MultVec3f(&sSwordBaseQuadOffset, &this->rightSwordCollider.dim.quad[0]); + Collider_SetQuadVertices(&this->rightSwordCollider, &this->rightSwordCollider.dim.quad[0], + &this->rightSwordCollider.dim.quad[1], &this->rightSwordCollider.dim.quad[2], + &this->rightSwordCollider.dim.quad[3]); + Matrix_MultVec3f(&sSwordTipOffset, &swordTipPos); + Matrix_MultVec3f(&sSwordBaseOffset, &swordBasePos); + + if ((this->action == EN_JSO2_ACTION_SLASH) || (this->action == EN_JSO2_ACTION_WAIT_AFTER_SLASH)) { + Matrix_MultVec3f(&sSlashFlameOffsets[3], &this->flamePos[3]); + Matrix_MultVec3f(&sSlashFlameOffsets[4], &this->flamePos[4]); + Matrix_MultVec3f(&sSlashFlameOffsets[5], &this->flamePos[5]); + } else { + Matrix_MultVec3f(&sFlameOffsets[3], &this->flamePos[3]); + Matrix_MultVec3f(&sFlameOffsets[4], &this->flamePos[4]); + Matrix_MultVec3f(&sFlameOffsets[5], &this->flamePos[5]); + } + + if (((this->action == EN_JSO2_ACTION_SLASH) || (this->action == EN_JSO2_ACTION_SPIN_ATTACK) || + (this->action == EN_JSO2_ACTION_DASH_ATTACK) || (this->action == EN_JSO2_ACTION_FALL_FROM_TELEPORT)) && + !this->disableBlure) { + EffectBlure_AddVertex(Effect_GetByIndex(this->rightSwordBlureIndex), &swordTipPos, &swordBasePos); + } else if (this->disableBlure == true) { + EffectBlure_AddSpace(Effect_GetByIndex(this->rightSwordBlureIndex)); + this->disableBlure = false; + } + } + + if (limbIndex == GARO_MASTER_LIMB_ROBE_RIGHT) { + bombOffset.x = 900.0f; + bombOffset.y = 50.0f; + bombOffset.z = -330.0f; + Matrix_MultVec3f(&bombOffset, &this->bombPos); + } + + if ((this->action != EN_JSO2_ACTION_BLOW_UP) && + ((limbIndex == GARO_MASTER_LIMB_LEFT_SWORD) || (limbIndex == GARO_MASTER_LIMB_RIGHT_SWORD) || + (limbIndex == GARO_MASTER_LIMB_ROBE_TOP) || (limbIndex == GARO_MASTER_LIMB_ROBE_BACK) || + (limbIndex == GARO_MASTER_LIMB_ROBE_LEFT) || (limbIndex == GARO_MASTER_LIMB_ROBE_RIGHT) || + (limbIndex == GARO_MASTER_LIMB_ROBE_FRONT) || (limbIndex == GARO_MASTER_LIMB_HEAD) || + (limbIndex == GARO_MASTER_LIMB_RIGHT_THIGH) || (limbIndex == GARO_MASTER_LIMB_RIGHT_FOOT) || + (limbIndex == GARO_MASTER_LIMB_LEFT_THIGH) || (limbIndex == GARO_MASTER_LIMB_LEFT_FOOT))) { + Matrix_MultZero(&this->bodyPartsPos[this->bodyPartIndex]); + this->bodyPartIndex++; + if (this->bodyPartIndex >= EN_JSO2_BODYPART_MAX) { + this->bodyPartIndex = 0; + } + } + + if (limbIndex == GARO_MASTER_LIMB_HEAD) { + Matrix_Push(); + Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY); + + OPEN_DISPS(play->state.gfxCtx); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gGaroMasterEyesDL); + + CLOSE_DISPS(play->state.gfxCtx); + + Matrix_Pop(); + } +} + +void EnJso2_Draw(Actor* thisx, PlayState* play2) { + static s16 sAfterimageAlpha[EN_JSO2_AFTERIMAGE_COUNT] = { + 128, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128, 0, 0, 0, 0, 128, 0, 0, 0, 0, + }; + EnJso2* this = THIS; + PlayState* play = play2; + + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL25_Xlu(play->state.gfxCtx); + Gfx_SetupDL25_Opa(play->state.gfxCtx); + + if (!this->isFadingAway) { + Scene_SetRenderModeXlu(play, 0, 1); + SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, + EnJso2_OverrideLimbDraw, EnJso2_PostLimbDraw, &this->actor); + } else { + gDPPipeSync(POLY_XLU_DISP++); + gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha); + Scene_SetRenderModeXlu(play, 1, 2); + POLY_XLU_DISP = SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + this->skelAnime.dListCount, NULL, NULL, &this->actor, POLY_XLU_DISP); + } + + if (this->afterimageCount > 0) { + s32 i; + s32 index = this->afterimageIndex; + + for (i = 0; i < this->afterimageCount; i++) { + if (sAfterimageAlpha[i] == 0) { + continue; + } + + Matrix_Translate(this->afterimagePos[index].x, this->afterimagePos[index].y, this->afterimagePos[index].z, + MTXMODE_NEW); + Matrix_Scale(this->scale, this->scale, this->scale, MTXMODE_APPLY); + Matrix_RotateYS(this->afterimageRot[index].y, MTXMODE_APPLY); + Matrix_RotateXS(this->afterimageRot[index].x, MTXMODE_APPLY); + Matrix_RotateZS(this->afterimageRot[index].z, MTXMODE_APPLY); + + gDPPipeSync(POLY_XLU_DISP++); + gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, sAfterimageAlpha[i]); + Scene_SetRenderModeXlu(play, 1, 2); + POLY_XLU_DISP = SkelAnime_DrawFlex(play, this->skelAnime.skeleton, this->afterimageJointTable[index], + this->skelAnime.dListCount, NULL, NULL, &this->actor, POLY_XLU_DISP); + + index--; + if (index < 0) { + index = EN_JSO2_AFTERIMAGE_COUNT - 1; + } + } + } + + if ((this->action < EN_JSO2_ACTION_TELEPORT) && (this->swordState == EN_JSO2_SWORD_STATE_BOTH_DRAWN) && + (((this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_SFX) && + (this->drawDmgEffType != ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) || + (((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) && + (this->drawDmgEffAlpha == 0)))) { + s32 i; + + for (i = 0; i < EN_JSO2_FLAME_COUNT; i++) { + Matrix_Push(); + Matrix_Translate(this->flamePos[i].x, this->flamePos[i].y, this->flamePos[i].z, MTXMODE_NEW); + Matrix_Scale(this->flameScale[i].x, this->flameScale[i].y, this->flameScale[i].z, MTXMODE_APPLY); + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, 0, 32, 64, 1, 0, + ((this->flameScroll * 10) - (play->state.frames * 20)) & 0x1FF, 32, 128)); + gDPPipeSync(POLY_XLU_DISP++); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 170, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 50, 0, 255); + Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, gEffFire1DL); + Matrix_Pop(); + } + } + + if (this->drawDmgEffAlpha != 0) { + f32 drawDmgEffAlpha = this->drawDmgEffAlpha * 0.05f; + + if ((this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_SFX) || + (this->drawDmgEffType == ACTOR_DRAW_DMGEFF_FROZEN_NO_SFX)) { + this->drawDmgEffScale += 0.3f; + if (this->drawDmgEffScale > 0.5f) { + this->drawDmgEffScale = 0.5f; + } + + Math_ApproachF(&this->drawDmgEffFrozenSteamScale, this->drawDmgEffScale, 0.1f, 0.04f); + } + + Actor_DrawDamageEffects(play, &this->actor, this->bodyPartsPos, this->bodyPartsCount, this->drawDmgEffScale, + this->drawDmgEffFrozenSteamScale, drawDmgEffAlpha, this->drawDmgEffType); + } + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Jso2/z_en_jso2.h b/src/overlays/actors/ovl_En_Jso2/z_en_jso2.h index 274aaa284..cac660add 100644 --- a/src/overlays/actors/ovl_En_Jso2/z_en_jso2.h +++ b/src/overlays/actors/ovl_En_Jso2/z_en_jso2.h @@ -2,16 +2,109 @@ #define Z_EN_JSO2_H #include "global.h" +#include "assets/objects/object_jso/object_jso.h" struct EnJso2; +#define EN_JSO2_GET_TYPE(thisx) ((thisx)->params) + +#define EN_JSO2_AFTERIMAGE_COUNT 20 +#define EN_JSO2_FLAME_COUNT 6 + typedef void (*EnJso2ActionFunc)(struct EnJso2*, PlayState*); +typedef enum EnJso2Type { + // This type is exclusively used by the Garo Master in Stone Tower Temple who guards the Light Arrow. + // It has an intro and death cutscene, and the intro cutscene uses many hardcoded coordinates which + // assume the Garo Master is in the Light Arrow room. + /* 0 */ EN_JSO2_TYPE_LIGHT_ARROW_ROOM, + + // This type is used everywhere outside of Stone Tower Temple, and it lacks an intro or death cutscene. + /* 1 */ EN_JSO2_TYPE_NORMAL +} EnJso2Type; + +typedef enum EnJso2BodyPart { + /* 0 */ EN_JSO2_BODYPART_LEFT_SWORD, + /* 1 */ EN_JSO2_BODYPART_RIGHT_SWORD, + /* 2 */ EN_JSO2_BODYPART_ROBE_TOP, + /* 3 */ EN_JSO2_BODYPART_ROBE_BACK, + /* 4 */ EN_JSO2_BODYPART_ROBE_LEFT, + /* 5 */ EN_JSO2_BODYPART_ROBE_RIGHT, + /* 6 */ EN_JSO2_BODYPART_ROBE_FRONT, + /* 7 */ EN_JSO2_BODYPART_HEAD, + /* 8 */ EN_JSO2_BODYPART_RIGHT_THIGH, + /* 9 */ EN_JSO2_BODYPART_RIGHT_FOOT, + /* 10 */ EN_JSO2_BODYPART_LEFT_THIGH, + /* 11 */ EN_JSO2_BODYPART_LEFT_FOOT, + /* 12 */ EN_JSO2_BODYPART_MAX +} EnJso2BodyPart; + typedef struct EnJso2 { /* 0x0000 */ Actor actor; - /* 0x0144 */ char unk_144[0x134]; + /* 0x0144 */ SkelAnime skelAnime; + /* 0x0188 */ Vec3s jointTable[GARO_MASTER_LIMB_MAX]; + /* 0x0200 */ Vec3s morphTable[GARO_MASTER_LIMB_MAX]; /* 0x0278 */ EnJso2ActionFunc actionFunc; - /* 0x027C */ char unk_27C[0xE14]; + /* 0x027C */ struct_80122744_arg1 overrideInputEntry; + /* 0x0284 */ s16 action; + /* 0x0286 */ s16 circlingAngle; + /* 0x0288 */ s16 circlingAngularVelocity; + /* 0x028A */ s16 attackMovementTimer; + /* 0x028C */ UNK_TYPE1 unk_28C[2]; + /* 0x028E */ s16 attackTimer; + /* 0x0290 */ s16 timer; + /* 0x0294 */ f32 subCamMaxVelocityFrac; + /* 0x0298 */ f32 subCamVelocity; + /* 0x029C */ s32 type; + /* 0x02A0 */ s16 drawDmgEffAlpha; + /* 0x02A2 */ s16 drawDmgEffType; + /* 0x02A4 */ f32 drawDmgEffScale; + /* 0x02A8 */ f32 drawDmgEffFrozenSteamScale; + /* 0x02AC */ UNK_TYPE1 unk_2AC[4]; + /* 0x02B0 */ s16 bodyPartsCount; + /* 0x02B4 */ s32 isFadingAway; + /* 0x02B8 */ Vec3f baseSubCamEye; + /* 0x02C4 */ Vec3f bombPos; + /* 0x02D0 */ Actor* bomb; + /* 0x02D4 */ Vec3f bodyPartsPos[EN_JSO2_BODYPART_MAX]; + /* 0x0364 */ s16 bodyPartIndex; + /* 0x0366 */ s16 alpha; + /* 0x0368 */ u8 disableBlure; + /* 0x036C */ s32 swordState; + /* 0x0370 */ u8 isTeleporting; // set, but never checked + /* 0x0371 */ u8 slashHitSomething; + /* 0x0374 */ f32 animEndFrame; + /* 0x0378 */ f32 scale; + /* 0x037C */ UNK_TYPE1 unk_37C[4]; + /* 0x0380 */ s32 rightSwordBlureIndex; + /* 0x0384 */ s32 leftSwordBlureIndex; + /* 0x0388 */ s32 afterimageCount; + /* 0x038C */ s16 afterimageIndex; + /* 0x038E */ s16 flameScroll; + /* 0x0390 */ Vec3f afterimagePos[EN_JSO2_AFTERIMAGE_COUNT]; + /* 0x0480 */ Vec3s afterimageRot[EN_JSO2_AFTERIMAGE_COUNT]; + /* 0x04F8 */ Vec3s afterimageJointTable[EN_JSO2_AFTERIMAGE_COUNT][GARO_MASTER_LIMB_MAX]; + /* 0x0E58 */ Vec3f knockbackVelocity; // Adds a little push backwards when the Garo Master is bounced off the player's shield, damaged, or stunned + /* 0x0E64 */ Vec3f flamePos[EN_JSO2_FLAME_COUNT]; + /* 0x0EAC */ Vec3f flameScale[EN_JSO2_FLAME_COUNT]; + /* 0x0EF4 */ ColliderCylinder bodyCollider; + /* 0x0F40 */ ColliderQuad rightSwordCollider; + /* 0x0FC0 */ ColliderQuad leftSwordCollider; + /* 0x1040 */ s32 animIndex; + /* 0x1044 */ s16 cutsceneTimer; + /* 0x1046 */ union { + s16 cutsceneState; // exclusively used by the EN_JSO2_TYPE_LIGHT_ARROW_ROOM type + s16 appearState; // exclusively used by the EN_JSO2_TYPE_NORMAL type + }; + /* 0x1048 */ s16 subCamId; + /* 0x104A */ s16 blowUpFrameCounter; + /* 0x104C */ f32 subCamFov; + /* 0x1050 */ f32 subCamFovNext; + /* 0x1054 */ Vec3f subCamEye; + /* 0x1060 */ Vec3f subCamAt; + /* 0x106C */ Vec3f unk_106C; // unused, type inferred from surrounding members + /* 0x1078 */ Vec3f subCamEyeNext; + /* 0x1084 */ Vec3f subCamAtNext; } EnJso2; // size = 0x1090 #endif // Z_EN_JSO2_H diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 4b40d54fa..c51c01863 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -8847,8 +8847,8 @@ 0x809AD8E0:("EnJso_Init",), 0x809ADB24:("EnJso_Destroy",), 0x809ADBC8:("EnJso_ChangeAnim",), - 0x809ADC7C:("EnJso_SetupHandleIntroCutscene",), - 0x809ADCB8:("EnJso_HandleIntroCutscene",), + 0x809ADC7C:("EnJso_SetupIntroCutscene",), + 0x809ADCB8:("EnJso_IntroCutscene",), 0x809AE754:("EnJso_SetupReappear",), 0x809AE87C:("EnJso_Reappear",), 0x809AE9B0:("EnJso_SetupCirclePlayer",), @@ -11054,48 +11054,48 @@ 0x80A77040:("EnPrz_Draw",), 0x80A773C0:("EnJso2_Init",), 0x80A77664:("EnJso2_Destroy",), - 0x80A776E0:("func_80A776E0",), + 0x80A776E0:("EnJso2_ChangeAnim",), 0x80A77790:("func_80A77790",), - 0x80A77880:("func_80A77880",), - 0x80A778D8:("func_80A778D8",), - 0x80A778F8:("func_80A778F8",), - 0x80A78588:("func_80A78588",), - 0x80A785E4:("func_80A785E4",), - 0x80A787FC:("func_80A787FC",), - 0x80A78868:("func_80A78868",), - 0x80A78A70:("func_80A78A70",), - 0x80A78ACC:("func_80A78ACC",), - 0x80A78B04:("func_80A78B04",), - 0x80A78B70:("func_80A78B70",), - 0x80A78C08:("func_80A78C08",), - 0x80A78C7C:("func_80A78C7C",), - 0x80A78E8C:("func_80A78E8C",), - 0x80A78F04:("func_80A78F04",), - 0x80A78F80:("func_80A78F80",), - 0x80A79038:("func_80A79038",), - 0x80A790E4:("func_80A790E4",), - 0x80A7919C:("func_80A7919C",), - 0x80A79300:("func_80A79300",), - 0x80A79364:("func_80A79364",), - 0x80A79450:("func_80A79450",), - 0x80A794C8:("func_80A794C8",), - 0x80A79524:("func_80A79524",), - 0x80A79600:("func_80A79600",), - 0x80A796BC:("func_80A796BC",), - 0x80A7980C:("func_80A7980C",), - 0x80A79864:("func_80A79864",), - 0x80A798C8:("func_80A798C8",), - 0x80A7998C:("func_80A7998C",), - 0x80A79A84:("func_80A79A84",), - 0x80A79B60:("func_80A79B60",), - 0x80A79BA0:("func_80A79BA0",), - 0x80A7A0D0:("func_80A7A0D0",), - 0x80A7A124:("func_80A7A124",), - 0x80A7A2EC:("func_80A7A2EC",), - 0x80A7A360:("func_80A7A360",), + 0x80A77880:("EnJso2_ShouldAdvanceMessage",), + 0x80A778D8:("EnJso2_SetupIntroCutscene",), + 0x80A778F8:("EnJso2_IntroCutscene",), + 0x80A78588:("EnJso2_SetupAppear",), + 0x80A785E4:("EnJso2_Appear",), + 0x80A787FC:("EnJso2_SetupCirclePlayer",), + 0x80A78868:("EnJso2_CirclePlayer",), + 0x80A78A70:("EnJso2_SetupGuard",), + 0x80A78ACC:("EnJso2_Guard",), + 0x80A78B04:("EnJso2_SetupSpinBeforeAttack",), + 0x80A78B70:("EnJso2_SpinBeforeAttack",), + 0x80A78C08:("EnJso2_SetupDashAttack",), + 0x80A78C7C:("EnJso2_DashAttack",), + 0x80A78E8C:("EnJso2_SetupTeleport",), + 0x80A78F04:("EnJso2_Teleport",), + 0x80A78F80:("EnJso2_SetupFallFromTeleport",), + 0x80A79038:("EnJso2_FallFromTeleport",), + 0x80A790E4:("EnJso2_SetupSlash",), + 0x80A7919C:("EnJso2_Slash",), + 0x80A79300:("EnJso2_SetupSpinAttack",), + 0x80A79364:("EnJso2_SpinAttack",), + 0x80A79450:("EnJso2_SetupWaitAfterSlash",), + 0x80A794C8:("EnJso2_WaitAfterSlash",), + 0x80A79524:("EnJso2_SetupStunned",), + 0x80A79600:("EnJso2_Stunned",), + 0x80A796BC:("EnJso2_SetupDamaged",), + 0x80A7980C:("EnJso2_Damaged",), + 0x80A79864:("EnJso2_SetupJumpBack",), + 0x80A798C8:("EnJso2_JumpBack",), + 0x80A7998C:("EnJso2_SetupDead",), + 0x80A79A84:("EnJso2_Dead",), + 0x80A79B60:("EnJso2_SetupDeathCutscene",), + 0x80A79BA0:("EnJso2_DeathCutscene",), + 0x80A7A0D0:("EnJso2_SetupBlowUp",), + 0x80A7A124:("EnJso2_BlowUp",), + 0x80A7A2EC:("EnJso2_FadeAway",), + 0x80A7A360:("EnJso2_UpdateDamage",), 0x80A7A61C:("EnJso2_Update",), - 0x80A7AA48:("func_80A7AA48",), - 0x80A7AA9C:("func_80A7AA9C",), + 0x80A7AA48:("EnJso2_OverrideLimbDraw",), + 0x80A7AA9C:("EnJso2_PostLimbDraw",), 0x80A7AFA8:("EnJso2_Draw",), 0x80A7BC70:("ObjEtcetera_Init",), 0x80A7BD80:("ObjEtcetera_Destroy",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index ea7ef1dac..8c6e69c72 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -11974,32 +11974,22 @@ 0x80A7727C:("D_80A7727C","f32","",0x4), 0x80A77280:("D_80A77280","f32","",0x4), 0x80A77284:("D_80A77284","f32","",0x4), - 0x80A7B4F0:("D_80A7B4F0","UNK_TYPE1","",0x1), - 0x80A7B510:("D_80A7B510","UNK_TYPE4","",0x4), - 0x80A7B558:("D_80A7B558","UNK_TYPE1","",0x1), - 0x80A7B564:("D_80A7B564","UNK_TYPE1","",0x1), - 0x80A7B570:("D_80A7B570","UNK_TYPE1","",0x1), - 0x80A7B57C:("D_80A7B57C","UNK_TYPE1","",0x1), - 0x80A7B588:("D_80A7B588","UNK_TYPE1","",0x1), - 0x80A7B594:("D_80A7B594","UNK_TYPE1","",0x1), - 0x80A7B5A0:("D_80A7B5A0","UNK_TYPE1","",0x1), - 0x80A7B5AC:("D_80A7B5AC","UNK_TYPE1","",0x1), - 0x80A7B5B8:("D_80A7B5B8","UNK_TYPE1","",0x1), - 0x80A7B5C4:("D_80A7B5C4","UNK_TYPE1","",0x1), - 0x80A7B5D0:("D_80A7B5D0","UNK_TYPE1","",0x1), - 0x80A7B5DC:("D_80A7B5DC","UNK_TYPE1","",0x1), - 0x80A7B5E8:("En_Jso2_InitVars","UNK_TYPE1","",0x1), - 0x80A7B608:("D_80A7B608","UNK_TYPE1","",0x1), - 0x80A7B634:("D_80A7B634","UNK_TYPE1","",0x1), - 0x80A7B684:("D_80A7B684","UNK_TYPE1","",0x1), - 0x80A7B6DC:("D_80A7B6DC","UNK_TYPE1","",0x1), - 0x80A7B6F4:("D_80A7B6F4","UNK_TYPE2","",0x2), - 0x80A7B6FC:("D_80A7B6FC","UNK_TYPE4","",0x4), - 0x80A7B708:("D_80A7B708","UNK_TYPE1","",0x1), - 0x80A7B714:("D_80A7B714","UNK_TYPE1","",0x1), - 0x80A7B720:("D_80A7B720","UNK_TYPE1","",0x1), - 0x80A7B72C:("D_80A7B72C","UNK_TYPE1","",0x1), - 0x80A7B738:("D_80A7B738","UNK_TYPE2","",0x2), + 0x80A7B4F0:("sDamageTable","DamageTable","",0x20), + 0x80A7B510:("sTargetFlameScales","Vec3f","[6]",0x48), + 0x80A7B558:("sFlameOffsets","Vec3f","[6]",0x48), + 0x80A7B5A0:("sSlashFlameOffsets","Vec3f","[6]",0x48), + 0x80A7B5E8:("En_Jso2_InitVars","ActorInit","",0x20), + 0x80A7B608:("sCylinderInit","ColliderCylinderInit","",0x2C), + 0x80A7B634:("sQuadInit","ColliderQuadInit","",0x50), + 0x80A7B684:("sAnimations","AnimationHeader*","[22]",0x58), + 0x80A7B6DC:("sAnimationModes","u8","[22]",0x16), + 0x80A7B6F4:("sPlayerOverrideInputPosList","Vec3s","[1]",0x6), + 0x80A7B6FC:("bombOffset","Vec3f","",0xC), + 0x80A7B708:("sSwordTipOffset","Vec3f","",0xC), + 0x80A7B714:("sSwordBaseOffset","Vec3f","",0xC), + 0x80A7B720:("sSwordTipQuadOffset","Vec3f","",0xC), + 0x80A7B72C:("sSwordBaseQuadOffset","Vec3f","",0xC), + 0x80A7B738:("sAfterimageAlpha","s16","[20]",0x28), 0x80A7B760:("D_80A7B760","f32","",0x4), 0x80A7B764:("jtbl_80A7B764","UNK_PTR","",0x4), 0x80A7B794:("D_80A7B794","f32","",0x4), diff --git a/undefined_syms.txt b/undefined_syms.txt index 4c272d644..cb3fea946 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -402,12 +402,6 @@ D_06015C28 = 0x06015C28; D_060156D8 = 0x060156D8; D_06016720 = 0x06016720; -// ovl_En_Jso2 - -D_06002ED8 = 0x06002ED8; -D_06003168 = 0x06003168; -D_060081F4 = 0x060081F4; - // ovl_En_Kitan D_06000CE8 = 0x06000CE8; From 3d150f3e1d84259b05f2831be35fa6fd38e43232 Mon Sep 17 00:00:00 2001 From: Anghelo Carvajal Date: Tue, 14 Nov 2023 08:46:22 -0300 Subject: [PATCH 27/28] Misc fixes 1 (#1491) * Some low-hanging UB * document bug on z_file_nameset_NES.c * ALIGNED on audio data * document bug on decode * document bugs on Message_Decode * Format * More ALIGNED * Put the ALIGNED macro at the right like the other uses in the repo * review * fix Message Decode (cherry picked from commit abfbc7068816756f7ea3fa4a36ee0fe664c54c72) Co-authored-by: engineer124 * remove comments * Update src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> * format --------- Co-authored-by: engineer124 Co-authored-by: engineer124 <47598039+engineer124@users.noreply.github.com> --- include/z64environment.h | 4 +++- src/audio/lib/data.c | 24 +++++++++---------- src/boot/yaz0.c | 2 +- src/code/z_common_data.c | 10 ++++++-- src/code/z_message.c | 24 +++++++++---------- src/code/z_parameter.c | 2 +- src/code/z_player_lib.c | 2 +- src/libultra/io/motor.c | 3 ++- src/overlays/actors/ovl_En_Dnh/z_en_dnh.c | 2 +- .../actors/ovl_En_Tanron2/z_en_tanron2.c | 2 ++ src/overlays/actors/ovl_En_Test3/z_en_test3.c | 10 ++++---- .../ovl_file_choose/z_file_choose_NES.c | 6 ++--- .../ovl_file_choose/z_file_nameset_NES.c | 2 ++ tools/disasm/variables.txt | 2 +- 14 files changed, 54 insertions(+), 41 deletions(-) diff --git a/include/z64environment.h b/include/z64environment.h index 18e1fbf70..0988355f4 100644 --- a/include/z64environment.h +++ b/include/z64environment.h @@ -3,8 +3,10 @@ #include "PR/ultratypes.h" #include "PR/os_message.h" -#include "z64math.h" +#include "color.h" #include "z64dma.h" +#include "z64light.h" +#include "z64math.h" #include "unk.h" struct GameOverContext; diff --git a/src/audio/lib/data.c b/src/audio/lib/data.c index eb931262b..ee56e5d10 100644 --- a/src/audio/lib/data.c +++ b/src/audio/lib/data.c @@ -1,6 +1,6 @@ #include "global.h" -s16 gLowPassFilterData[16 * 8] = { +s16 gLowPassFilterData[16 * 8] ALIGNED(16) = { /* 0x0 */ 0, 0, 0, 32767, 0, 0, 0, 0, // Identity filter (delta function) /* 0x1 */ 3854, 4188, 4398, 4469, 4398, 4188, 3854, 3416, // low-freq cutoff (more filtering) /* 0x2 */ 3415, 4314, 4915, 5126, 4915, 4314, 3415, 2351, @@ -19,7 +19,7 @@ s16 gLowPassFilterData[16 * 8] = { /* 0xF */ 841, -853, 863, 26829, 863, -853, 841, -820, // high-freq cutoff (less filtering) }; -s16 gHighPassFilterData[15 * 8] = { +s16 gHighPassFilterData[15 * 8] ALIGNED(16) = { /* 0x0 */ -289, -291, -289, 30736, -289, -291, -289, -290, // low-freq cutoff (less filtering) /* 0x1 */ -464, -467, -467, 29506, -467, -467, -464, -463, /* 0x2 */ -662, -670, -672, 28101, -672, -670, -662, -656, @@ -38,7 +38,7 @@ s16 gHighPassFilterData[15 * 8] = { }; // clang-format off -s16 gBandStopFilterData[105 * 8] = { +s16 gBandStopFilterData[105 * 8] ALIGNED(16) = { // Block 0 /* 0x00 */ -43, -716, -1205, 28210, -1205, -716, -43, 629, /* 0x01 */ 249, -919, -1819, 25489, -1819, -919, 249, 1301, @@ -173,7 +173,7 @@ s16 gBandStopFilterData[105 * 8] = { /* 0x68 */ 434, -453, 467, 29652, 467, -453, 434, -405, }; -s16 gBandPassFilterData[105 * 8] = { +s16 gBandPassFilterData[105 * 8] ALIGNED(16) = { // Block 0 /* 0x00 */ 687, 4058, 6599, 7544, 6599, 4058, 687, -2532, /* 0x01 */ -1303, 2777, 6337, 7745, 6337, 2777, -1303, -4185, @@ -308,7 +308,7 @@ s16 gBandPassFilterData[105 * 8] = { /* 0x68 */ -3854, 4188, -4398, 4469, -4398, 4188, -3854, 3415, }; -s16 gSawtoothWaveSample[] = { +s16 gSawtoothWaveSample[] ALIGNED(16) = { // 1st Harmonic 0, 1023, 2047, 3071, 4095, 5119, 6143, 7167, 8191, 9215, 10239, 11263, 12287, 13311, 14335, 15359, @@ -350,7 +350,7 @@ s16 gSawtoothWaveSample[] = { 0, 8191, 16383, 24575, -32767, -24575, -16383, -8191, }; -s16 gTriangleWaveSample[] = { +s16 gTriangleWaveSample[] ALIGNED(16) = { // 1st Harmonic 0, 2047, 4095, 6143, 8191, 10239, 12287, 14335, 16383, 18431, 20479, 22527, 24575, 26623, 28671, 30719, @@ -392,7 +392,7 @@ s16 gTriangleWaveSample[] = { 0, 16383, 32767, 16383, 0, -16383, -32767, -16383, }; -s16 gSineWaveSample[] = { +s16 gSineWaveSample[] ALIGNED(16) = { // 1st Harmonic 0, 3211, 6392, 9511, 12539, 15446, 18204, 20787, 23169, 25329, 27244, 28897, 30272, 31356, 32137, 32609, @@ -434,7 +434,7 @@ s16 gSineWaveSample[] = { 0, 23169, 32767, 23169, 0, -23169, -32767, -23169, }; -s16 gSquareWaveSample[] = { +s16 gSquareWaveSample[] ALIGNED(16) = { // 1st Harmonic 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -476,7 +476,7 @@ s16 gSquareWaveSample[] = { 0, 0, 32767, 32767, 0, 0, -32767, -32767, }; -s16 gWhiteNoiseSample[] = { +s16 gWhiteNoiseSample[] ALIGNED(16) = { // 1st Harmonic 0, -25689, -25791, 27803, -27568, -21030, 22174, 6298, 27071, -18531, 28649, 2284, 3380, 6890, -12682, -21114, @@ -519,7 +519,7 @@ s16 gWhiteNoiseSample[] = { }; // Sine White Noise? -s16 D_801D4790[] = { +s16 D_801D4790[] ALIGNED(16) = { // 1st Harmonic 0, 16316, 20148, 20257, 27209, -32657, 29264, 27259, -29394, -21494, -26410, 30770, 30033, 29130, 20206, 14129, @@ -562,7 +562,7 @@ s16 D_801D4790[] = { }; // Pulse Wave (duty cycle = 12.5%) -s16 gEighthPulseWaveSample[] = { +s16 gEighthPulseWaveSample[] ALIGNED(16) = { // 1st Harmonic 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -605,7 +605,7 @@ s16 gEighthPulseWaveSample[] = { }; // Pulse Wave (duty cycle = 25%) -s16 gQuarterPulseWaveSample[] = { +s16 gQuarterPulseWaveSample[] ALIGNED(16) = { // 1st Harmonic 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/src/boot/yaz0.c b/src/boot/yaz0.c index edb7fc5cc..54a3481f1 100644 --- a/src/boot/yaz0.c +++ b/src/boot/yaz0.c @@ -1,7 +1,7 @@ #include "global.h" #include "fault.h" -u8 sYaz0DataBuffer[0x400]; +u8 sYaz0DataBuffer[0x400] ALIGNED(16); u8* sYaz0CurDataEnd; uintptr_t sYaz0CurRomStart; u32 sYaz0CurSize; diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c index f0805c46b..e6d291831 100644 --- a/src/code/z_common_data.c +++ b/src/code/z_common_data.c @@ -1,6 +1,12 @@ -#include "global.h" +#include "z64save.h" -SaveContext gSaveContext; +#include "alignment.h" +#include "sequence.h" +#include "libc/stdbool.h" +#include "z64environment.h" +#include "z64transition.h" + +SaveContext gSaveContext ALIGNED(16); void SaveContext_Init(void) { bzero(&gSaveContext, sizeof(SaveContext)); diff --git a/src/code/z_message.c b/src/code/z_message.c index f3bf144a6..2044077db 100644 --- a/src/code/z_message.c +++ b/src/code/z_message.c @@ -1921,7 +1921,7 @@ void func_8014CCB4(PlayState* play, s16* decodedBufPos, s32* offset, f32* arg3) * every digit will be added 0x824F to get an actual S-JIS * printable character. */ -void Message_GetTimerDigits(OSTime time, s16* digits) { +void Message_GetTimerDigits(OSTime time, s16 digits[8]) { OSTime t = time; // 6 minutes @@ -2160,20 +2160,20 @@ void Message_Decode(PlayState* play) { u32 timeToMoonCrash; s16 var_v0; s16 numLines; - u8* fontBuf; - s16 digits[4]; + s16 value; + s16 digits[5]; s16 spD2; f32 timeInSeconds; s32 charTexIndex; - f32 var_fs0; + u8* fontBuf; f32 spC0; s16 index; - s16 value; s16 playerNameLen; + s16 spAC[8]; + f32 var_fs0; s16 i; - u16 index2 = 0; - s16 spAC[4]; u16 curChar; + u8 index2 = 0; msgCtx->textDelayTimer = 0; msgCtx->textDelay = msgCtx->textDelayTimer; @@ -2212,7 +2212,7 @@ void Message_Decode(PlayState* play) { } } } else { - s32 requiredScopeTemp; + s8 requiredScopeTemp; if ((msgCtx->textBoxType != TEXTBOX_TYPE_3) && (msgCtx->textBoxType != TEXTBOX_TYPE_4)) { if (numLines == 0) { @@ -2289,7 +2289,7 @@ void Message_Decode(PlayState* play) { Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC); loadChar = false; - for (i = 0; i < 5; i++) { + for (i = 0; i < ARRAY_COUNT(spAC) - 3; i++) { if ((i == 1) || (spAC[i + 3] != 0)) { loadChar = true; } @@ -2304,7 +2304,7 @@ void Message_Decode(PlayState* play) { Message_GetTimerDigits(((void)0, gSaveContext.timerCurTimes[curChar - 0x204]), spAC); loadChar = false; - for (i = 0; i < 8; i++) { + for (i = 0; i < ARRAY_COUNT(spAC); i++) { if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) { loadChar = true; } @@ -2722,7 +2722,7 @@ void Message_Decode(PlayState* play) { } func_8014CCB4(play, &decodedBufPos, &charTexIndex, &spC0); } else if (curChar == 0x22F) { - for (i = 0; i < 5; i++) { + for (i = 0; i < ARRAY_COUNT(gSaveContext.save.saveInfo.bomberCode); i++) { digits[i] = gSaveContext.save.saveInfo.bomberCode[i]; Font_LoadChar(play, digits[i] + 0x824F, charTexIndex); charTexIndex += FONT_CHAR_TEX_SIZE; @@ -2827,7 +2827,7 @@ void Message_Decode(PlayState* play) { } loadChar = false; - for (i = 0; i < 8; i++) { + for (i = 0; i < ARRAY_COUNT(spAC); i++) { if ((i == 4) || ((i != 2) && (i != 5) && (spAC[i] != '\0'))) { loadChar = true; } diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index cf3b93b7d..cf7fbd1e3 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -5441,7 +5441,7 @@ void Interface_StartMoonCrash(PlayState* play) { play->transitionType = TRANS_TYPE_FADE_WHITE; } -void Interface_GetTimerDigits(OSTime time, s16* timerArr) { +void Interface_GetTimerDigits(OSTime time, s16 timerArr[8]) { OSTime t = time; // 6 minutes diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index 749096a06..6d056dd58 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -2036,7 +2036,7 @@ s32 Player_OverrideLimbDrawGameplayCommon(PlayState* play, s32 limbIndex, Gfx** // Note: The increment would not be done for the root limb, even if it had a non-NULL `dList`. // So if the root limb had a non-NULL `dList` (which is not the case in vanilla), // an out-of-bounds write to `bodyPartsPos` would occur. - sPlayerCurBodyPartPos = &player->bodyPartsPos[-1]; + sPlayerCurBodyPartPos = &player->bodyPartsPos[0] - 1; if (player->transformation != PLAYER_FORM_FIERCE_DEITY) { if (!(player->skelAnime.moveFlags & ANIM_FLAG_4) || (player->skelAnime.moveFlags & ANIM_FLAG_1)) { diff --git a/src/libultra/io/motor.c b/src/libultra/io/motor.c index 343047e7b..92cc69e87 100644 --- a/src/libultra/io/motor.c +++ b/src/libultra/io/motor.c @@ -1,11 +1,12 @@ #include "ultra64.h" #include "PR/os_motor.h" #include "PR/controller.h" +#include "alignment.h" #define BANK_ADDR 0x400 #define MOTOR_ID 0x80 -OSPifRam __MotorDataBuf[MAXCONTROLLERS]; +OSPifRam __MotorDataBuf[MAXCONTROLLERS] ALIGNED(16); s32 __osPfsSelectBank(OSPfs* pfs, u8 bank); diff --git a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c index c2c08bfe6..88c049633 100644 --- a/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c +++ b/src/overlays/actors/ovl_En_Dnh/z_en_dnh.c @@ -110,7 +110,7 @@ s32 func_80A50E40(EnDnh* this, PlayState* play) { return 1; } -s32 func_80A50EC0(EnDnh* this) { +void func_80A50EC0(EnDnh* this) { if (DECR(this->blinkTimer) == 0) { this->eyeTexIndex++; if (this->eyeTexIndex >= ARRAY_COUNT(sEyeTextures)) { diff --git a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c index c667753e6..3993a9c91 100644 --- a/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c +++ b/src/overlays/actors/ovl_En_Tanron2/z_en_tanron2.c @@ -261,6 +261,8 @@ void func_80BB6BD8(EnTanron2* this, PlayState* play) { } break; } + + //! @bug: sp32 may be used uninitialized Matrix_RotateYS(sp32, MTXMODE_NEW); Matrix_MultVecZ(this->actor.speed, &this->actor.velocity); this->actor.velocity.y = Rand_ZeroFloat(5.0f) + 12.0f; diff --git a/src/overlays/actors/ovl_En_Test3/z_en_test3.c b/src/overlays/actors/ovl_En_Test3/z_en_test3.c index 4fa177013..5386d415e 100644 --- a/src/overlays/actors/ovl_En_Test3/z_en_test3.c +++ b/src/overlays/actors/ovl_En_Test3/z_en_test3.c @@ -274,7 +274,7 @@ s32 D_80A41D5C; s32 D_80A41D60; s32 D_80A41D64; s32 D_80A41D68; -Vec3f* D_80A41D6C; +Vec3f* sKafeiCurBodyPartPos; s32 func_80A3E7E0(EnTest3* this, EnTest3ActionFunc actionFunc) { if (actionFunc == this->unk_D94) { @@ -1098,7 +1098,7 @@ s32 EnTest3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* EnTest3* this = THIS; if (limbIndex == KAFEI_LIMB_ROOT) { - D_80A41D6C = &this->player.bodyPartsPos[-1]; + sKafeiCurBodyPartPos = &this->player.bodyPartsPos[0] - 1; if (!(this->player.skelAnime.moveFlags & ANIM_FLAG_4) || (this->player.skelAnime.moveFlags & ANIM_FLAG_1)) { pos->x *= this->player.ageProperties->unk_08; pos->z *= this->player.ageProperties->unk_08; @@ -1118,7 +1118,7 @@ s32 EnTest3_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* } } else { if (*dList != NULL) { - D_80A41D6C++; + sKafeiCurBodyPartPos++; } if (D_80A418C8) { *dList = NULL; @@ -1153,13 +1153,13 @@ void EnTest3_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList1, Gfx** dL EnTest3* this = THIS; if (*dList2 != NULL) { - Matrix_MultZero(D_80A41D6C); + Matrix_MultZero(sKafeiCurBodyPartPos); } if (limbIndex == KAFEI_LIMB_LEFT_HAND) { MtxF curMtxF; Actor* leftHandActor; - Math_Vec3f_Copy(&this->player.leftHandWorld.pos, D_80A41D6C); + Math_Vec3f_Copy(&this->player.leftHandWorld.pos, sKafeiCurBodyPartPos); if (*dList1 != NULL) { func_80128640(play, &this->player, *dList1); if (this->player.stateFlags3 & PLAYER_STATE3_20000000) { diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c index 9ec0a396f..fa1edaf6b 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c @@ -2452,9 +2452,9 @@ void FileSelect_InitContext(GameState* thisx) { this->nameBoxAlpha[2] = this->nameAlpha[0] = this->nameAlpha[1] = this->nameAlpha[2] = this->connectorAlpha[0] = this->connectorAlpha[1] = this->connectorAlpha[2] = this->fileInfoAlpha[0] = this->fileInfoAlpha[1] = this->fileInfoAlpha[2] = this->actionButtonAlpha[FS_BTN_ACTION_COPY] = - this->actionButtonAlpha[FS_BTN_ACTION_ERASE] = this->actionButtonAlpha[2] = - this->actionButtonAlpha[3] = this->optionButtonAlpha = this->nameEntryBoxAlpha = - this->controlsAlpha = this->emptyFileTextAlpha = 0; + this->actionButtonAlpha[FS_BTN_ACTION_ERASE] = this->confirmButtonAlpha[FS_BTN_CONFIRM_YES] = + this->confirmButtonAlpha[FS_BTN_CONFIRM_QUIT] = this->optionButtonAlpha = + this->nameEntryBoxAlpha = this->controlsAlpha = this->emptyFileTextAlpha = 0; this->windowPosX = 6; this->actionTimer = 4; diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c index e61512695..005fc7eb9 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_NES.c @@ -1027,6 +1027,8 @@ void FileSelect_DrawOptionsImpl(GameState* thisx) { gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); } + //! @bug the gOptionsMenuHeaders usage here will produce an OoB read for i == 5. It reads the first element of + //! `gOptionsMenuSettings` gDPLoadTextureBlock(POLY_OPA_DISP++, gOptionsMenuSettings[i].texture, G_IM_FMT_IA, G_IM_SIZ_8b, gOptionsMenuSettings[i].width, gOptionsMenuHeaders[i].height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 8c6e69c72..09a347992 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -11302,7 +11302,7 @@ 0x80A41D60:("D_80A41D60","UNK_TYPE1","",0x1), 0x80A41D64:("D_80A41D64","UNK_TYPE1","",0x1), 0x80A41D68:("D_80A41D68","UNK_TYPE1","",0x1), - 0x80A41D6C:("D_80A41D6C","UNK_TYPE1","",0x1), + 0x80A41D6C:("sKafeiCurBodyPartPos","UNK_TYPE1","",0x1), 0x80A43320:("En_Test4_InitVars","ActorInit","",0x20), 0x80A43340:("sIsLoaded","s32","[3]",0x6), 0x80A43342:("sNightMessages1","s16","[3]",0x6), From d9585d7444cdd3a3fe0c49807163ce8132c11956 Mon Sep 17 00:00:00 2001 From: engineer124 <47598039+engineer124@users.noreply.github.com> Date: Wed, 15 Nov 2023 11:46:54 +1100 Subject: [PATCH 28/28] Animation Cleanup: En_L* and some En_M* (#1493) * cleanup L, some M * small fix * typo * brackets * more brackets --- src/code/z_actor.c | 2 +- src/code/z_camera.c | 2 +- .../actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c | 2 +- .../actors/ovl_En_Bom_Chu/z_en_bom_chu.c | 2 +- .../actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c | 88 +++++----- .../actors/ovl_En_Look_Nuts/z_en_look_nuts.c | 9 + .../actors/ovl_En_M_Thunder/z_en_m_thunder.c | 17 +- src/overlays/actors/ovl_En_Ma4/z_en_ma4.c | 126 ++++++++------ .../actors/ovl_En_Ma_Yto/z_en_ma_yto.c | 159 +++++++++++------- .../actors/ovl_En_Ma_Yts/z_en_ma_yts.c | 103 ++++++++---- src/overlays/actors/ovl_En_Mkk/z_en_mkk.c | 2 +- src/overlays/actors/ovl_En_Mm2/z_en_mm2.c | 2 +- .../actors/ovl_En_Sekihi/z_en_sekihi.c | 2 +- src/overlays/actors/ovl_En_Slime/z_en_slime.c | 2 +- .../actors/ovl_player_actor/z_player.c | 2 +- 15 files changed, 310 insertions(+), 210 deletions(-) diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 887e08dcd..015ee3958 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -3526,7 +3526,7 @@ s32 Target_InTargetableScreenRegion(PlayState* play, Actor* actor) { * - Must not be blocked by a surface (?) * * This function also checks for the nearest enemy actor, which allows determining if enemy background music should be - * played. This actor is stored in `targetContext.bgmEnemy` and its distance is stored in `sBgmEnemyDistSq` + * played. This actor is stored in `targetCtx.bgmEnemy` and its distance is stored in `sBgmEnemyDistSq` * * This function is expected to be called with almost every actor category in each cycle. On a new cycle its global * variables must be reset by the caller, otherwise the information of the previous cycle will be retained on this one. diff --git a/src/code/z_camera.c b/src/code/z_camera.c index b0721592a..29a1db30c 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -7484,7 +7484,7 @@ Vec3s Camera_Update(Camera* camera) { bgCamIndex = Camera_GetBgCamIndex(camera, &bgId, sp90); if ((bgCamIndex != -1) && (camera->bgId == BGCHECK_SCENE)) { - if (Camera_IsUsingZoraFins(camera) == 0) { + if (!Camera_IsUsingZoraFins(camera)) { camera->nextCamSceneDataId = bgCamIndex | CAM_DATA_IS_BG; } } diff --git a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c index 0addd3520..ec5c63fc1 100644 --- a/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c +++ b/src/overlays/actors/ovl_Bg_Numa_Hana/z_bg_numa_hana.c @@ -405,7 +405,7 @@ void BgNumaHana_Draw(Actor* thisx, PlayState* play2) { } objectSlot = Object_GetSlot(&play->objectCtx, OBJECT_SYOKUDAI); - if ((objectSlot > OBJECT_SLOT_NONE) && (Object_IsLoaded(&play->objectCtx, objectSlot))) { + if ((objectSlot > OBJECT_SLOT_NONE) && Object_IsLoaded(&play->objectCtx, objectSlot)) { Matrix_SetTranslateRotateYXZ(this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.y - 64.5f, this->dyna.actor.world.pos.z, &this->dyna.actor.shape.rot); Matrix_Scale(1.5f, 1.5f, 1.5f, MTXMODE_APPLY); diff --git a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c index 4c2003f6a..ce6c2d7e8 100644 --- a/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c +++ b/src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c @@ -474,7 +474,7 @@ void EnBomChu_Update(Actor* thisx, PlayState* play) { this->actionFunc(this, play); if ((this->actionFunc != EnBomChu_WaitForDeath) && - (SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId))) { + SurfaceType_IsWallDamage(&play->colCtx, this->actor.floorPoly, this->actor.floorBgId)) { EnBomChu_Explode(this, play); return; } diff --git a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c index bc82301c5..88c259312 100644 --- a/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c +++ b/src/overlays/actors/ovl_En_Lift_Nuts/z_en_lift_nuts.c @@ -84,26 +84,27 @@ typedef enum { /* 19 */ ENLIFTNUTS_ANIM_MAX } EnLiftNutsAnimation; -static AnimationInfo sAnimations[ENLIFTNUTS_ANIM_MAX] = { - { &gBusinessScrubStandingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubWalkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubRiseUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubBurrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubExcitedStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, - { &gBusinessScrubExcitedLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubExcitedEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, - { &gBusinessScrubTakeOffHatAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubFlyStartAnim, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubFlyLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubShockedStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -2.0f }, +static AnimationInfo sAnimationInfo[ENLIFTNUTS_ANIM_MAX] = { + { &gBusinessScrubStandingAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENLIFTNUTS_ANIM_STANDING + { &gBusinessScrubWalkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENLIFTNUTS_ANIM_WALK + { &gBusinessScrubRiseUpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_RISE_UP + { &gBusinessScrubBurrowAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_BURROW_LONG + { &gBusinessScrubExcitedStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // ENLIFTNUTS_ANIM_EXCITED_START + { &gBusinessScrubExcitedLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENLIFTNUTS_ANIM_EXCITED_LOOP + { &gBusinessScrubExcitedEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // ENLIFTNUTS_ANIM_EXCITED_END + { &gBusinessScrubTakeOffHatAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_TAKE_OFF_HAT + { &gBusinessScrubFlyStartAnim, 0.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_FLY_START + { &gBusinessScrubFlyLoopAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENLIFTNUTS_ANIM_FLY_LOOP + { &gBusinessScrubShockedStartAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -2.0f }, // ENLIFTNUTS_ANIM_SHOCKED_START + // ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD { &gBusinessScrubShockedShakeHeadAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubShockedPoundAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubShockedEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, - { &gBusinessScrubThinkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubBobAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, - { &gBusinessScrubJumpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubBurrowAnim, 1.0f, 4.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, - { &gBusinessScrubBurrowAnim, 1.0f, 8.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, + { &gBusinessScrubShockedPoundAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_SHOCKED_POUND + { &gBusinessScrubShockedEndAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -1.0f }, // ENLIFTNUTS_ANIM_SHOCKED_END + { &gBusinessScrubThinkAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENLIFTNUTS_ANIM_THINK + { &gBusinessScrubBobAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -4.0f }, // ENLIFTNUTS_ANIM_BOB + { &gBusinessScrubJumpAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_JUMP + { &gBusinessScrubBurrowAnim, 1.0f, 4.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // ENLIFTNUTS_ANIM_BURROW_HALF + { &gBusinessScrubBurrowAnim, 1.0f, 8.0f, 0.0f, ANIMMODE_ONCE, 0.0f }, // ENLIFTNUTS_ANIM_BURROW_SHORT }; Gfx* sEyeTextures[] = { gBusinessScrubEyesDL, gBusinessScrubEyesWideDL, gBusinessScrubEyesSquintDL }; @@ -323,7 +324,7 @@ void EnLiftNuts_Destroy(Actor* thisx, PlayState* play) { } void EnLiftNuts_SetupIdleHidden(EnLiftNuts* this) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_SHORT); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_BURROW_SHORT); this->actionFunc = EnLiftNuts_IdleHidden; this->timer = 0; } @@ -338,9 +339,9 @@ void EnLiftNuts_IdleHidden(EnLiftNuts* this, PlayState* play) { void EnLiftNuts_SetupBurrow(EnLiftNuts* this) { if (this->actionFunc == EnLiftNuts_Idle) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_HALF); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_BURROW_HALF); } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_LONG); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_BURROW_LONG); } Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE); @@ -359,7 +360,7 @@ void EnLiftNuts_SetupIdle(EnLiftNuts* this) { if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_STARTING)) { this->actionFunc = EnLiftNuts_Idle; } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_RISE_UP); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_RISE_UP); Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE); this->actionFunc = EnLiftNuts_RiseUp; } @@ -367,7 +368,7 @@ void EnLiftNuts_SetupIdle(EnLiftNuts* this) { void EnLiftNuts_RiseUp(EnLiftNuts* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BOB); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_BOB); this->actionFunc = EnLiftNuts_Idle; } else if (Animation_OnFrame(&this->skelAnime, 8.0f)) { EnLiftNuts_SpawnDust(this, play); @@ -441,12 +442,15 @@ void EnLiftNuts_Idle(EnLiftNuts* this, PlayState* play) { this->textId = 0x27E1; } break; + + default: + break; } } else if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_AFTER)) { if (Flags_GetSwitch(play, 0x40)) { Flags_UnsetSwitch(play, 0x40); - Inventory_SaveDekuPlaygroundHighScore(4); + Inventory_SaveDekuPlaygroundHighScore(TIMER_ID_MINIGAME_2); if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1) && CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2) && (CURRENT_DAY == 3)) { this->timer = 0; @@ -527,13 +531,13 @@ void EnLiftNuts_HandleConversationChoice(EnLiftNuts* this, PlayState* play) { Rupees_ChangeBy(-10); } else { Audio_PlaySfx(NA_SE_SY_ERROR); - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); Message_StartTextbox(play, 0x27E4, &this->actor); this->textId = 0x27E4; } } else { Audio_PlaySfx_MessageCancel(); - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); Message_StartTextbox(play, 0x27E3, &this->actor); this->textId = 0x27E3; } @@ -586,7 +590,7 @@ void EnLiftNuts_HandleConversation5(EnLiftNuts* this, PlayState* play) { break; case 0x27E6: - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); switch (CURRENT_DAY) { case 1: Message_StartTextbox(play, 0x27E7, &this->actor); @@ -622,7 +626,7 @@ void EnLiftNuts_HandleConversation5(EnLiftNuts* this, PlayState* play) { break; case 0x27EE: - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_JUMP); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_JUMP); Message_StartTextbox(play, 0x27EF, &this->actor); this->textId = 0x27EF; break; @@ -639,7 +643,7 @@ void EnLiftNuts_HandleConversation5(EnLiftNuts* this, PlayState* play) { break; case 0x27F2: - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); Message_StartTextbox(play, 0x27F3, &this->actor); this->textId = 0x27F3; break; @@ -675,7 +679,7 @@ void EnLiftNuts_SetupStartConversation(EnLiftNuts* this) { if (EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_CHECK, ENLIFTNUTS_MINIGAME_STATE_NONE)) { Actor_PlaySfx(&this->actor, NA_SE_EN_AKINDONUTS_HIDE); } - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_JUMP); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_JUMP); } this->actionFunc = EnLiftNuts_StartConversation; } @@ -683,9 +687,9 @@ void EnLiftNuts_SetupStartConversation(EnLiftNuts* this) { void EnLiftNuts_StartConversation(EnLiftNuts* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { if ((this->textId == 0x27EE) || (this->textId == 0x27F4) || (this->textId == 0x27F5)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_START); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_SHOCKED_START); } else { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_STANDING); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_STANDING); } this->actionFunc = EnLiftNuts_HandleConversation; } @@ -728,19 +732,19 @@ void EnLiftNuts_HandleConversation(EnLiftNuts* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { switch (this->textId) { case 0x27EE: - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD); break; case 0x27EF: - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); break; case 0x27F4: if (this->timer == 0) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_SHOCKED_SHAKE_HEAD); this->timer++; } else if (this->timer == 4) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_POUND); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_SHOCKED_POUND); this->timer = 0; } else { this->timer++; @@ -756,7 +760,7 @@ void EnLiftNuts_HandleConversation(EnLiftNuts* this, PlayState* play) { void EnLiftNuts_SetupMove(EnLiftNuts* this) { this->actor.speed = 2.0f; - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); EnLiftNuts_Autotalk(this, ENLIFTNUTS_AUTOTALK_MODE_SET_ON); EnLiftNuts_MinigameState(ENLIFTNUTS_MINIGAME_STATE_MODE_SET, ENLIFTNUTS_MINIGAME_STATE_STARTING); this->actionFunc = EnLiftNuts_Move; @@ -943,11 +947,11 @@ void EnLiftNuts_ResumeConversation(EnLiftNuts* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { if (CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_1) && CHECK_WEEKEVENTREG(WEEKEVENTREG_WON_DEKU_PLAYGROUND_DAY_2) && (CURRENT_DAY == 3)) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_SHOCKED_END); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_SHOCKED_END); Message_StartTextbox(play, 0x27F5, &this->actor); this->textId = 0x27F5; } else if (EnLiftNuts_GetNumDaysWon() > 0) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_WALK); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_WALK); Message_StartTextbox(play, 0x27F0, &this->actor); this->textId = 0x27F0; } else { @@ -983,7 +987,7 @@ void EnLiftNuts_SetupStartHiding(EnLiftNuts* this) { this->isFirstTimeHiding = true; } if (this->actionFunc == EnLiftNuts_IdleHidden) { - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BOB); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_BOB); } this->timer = 0; this->actionFunc = EnLiftNuts_StartHiding; @@ -995,7 +999,7 @@ void EnLiftNuts_StartHiding(EnLiftNuts* this, PlayState* play) { Message_StartTextbox(play, 0x27F6, &this->actor); this->textId = 0x27F6; } - Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimations, ENLIFTNUTS_ANIM_BURROW_HALF); + Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, ENLIFTNUTS_ANIM_BURROW_HALF); this->actionFunc = EnLiftNuts_Hide; } this->timer++; diff --git a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c index 947ac60c6..68945dd24 100644 --- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c +++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c @@ -219,12 +219,14 @@ void EnLookNuts_StandAndWait(EnLookNuts* this, PlayState* play) { this->waitTimer++; this->headRotTarget.y *= -1.0f; break; + case 5: this->headRotTarget.y = 0.0f; randOffset = Rand_S16Offset(1, 2); this->eventTimer = 0; this->waitTimer += randOffset; break; + case 6: if (fabsf(this->headRotTarget.y - this->headRotation.y) < 10.0f) { this->waitTimer = 10; @@ -232,27 +234,34 @@ void EnLookNuts_StandAndWait(EnLookNuts* this, PlayState* play) { this->eventTimer = 5; } break; + case 7: if (fabsf(this->headRotTarget.y - this->headRotation.y) < 10.0f) { this->headRotTarget.z = 4000.0f; this->waitTimer++; } break; + case 8: this->waitTimer = 10; this->eventTimer = 20; this->headRotTarget.z = -8000.0f; break; + case 10: Math_Vec3f_Copy(&this->headRotTarget, &gZeroVec3f); this->waitTimer = 11; break; + case 11: if ((fabsf(this->headRotation.x) < 30.0f) && (fabsf(this->headRotation.y) < 30.0f) && (fabsf(this->headRotation.z) < 30.0f)) { this->waitTimer = 12; } break; + + default: + break; } if (this->waitTimer == 12) { this->waitTimer = 0; diff --git a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c index 3140ad744..766d832c0 100644 --- a/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c +++ b/src/overlays/actors/ovl_En_M_Thunder/z_en_m_thunder.c @@ -66,7 +66,15 @@ static u8 sDamages[] = { 1, 2, 3, 4, // Great Spin }; -static u16 sChargingSfxIds[] = { +typedef enum { + /* 0 */ ENMTHUNDER_SUBTYPE_SPIN_GREAT, + /* 1 */ ENMTHUNDER_SUBTYPE_SPIN_REGULAR, + /* 2 */ ENMTHUNDER_SUBTYPE_SWORDBEAM_GREAT, + /* 3 */ ENMTHUNDER_SUBTYPE_SWORDBEAM_REGULAR, + /* 4 */ ENMTHUNDER_SUBTYPE_MAX +} EnMThunderSubType; + +static u16 sChargingSfxIds[ENMTHUNDER_SUBTYPE_MAX] = { NA_SE_IT_ROLLING_CUT_LV2, // ENMTHUNDER_SUBTYPE_SPIN_GREAT NA_SE_IT_ROLLING_CUT_LV1, // ENMTHUNDER_SUBTYPE_SPIN_REGULAR NA_SE_IT_ROLLING_CUT_LV2, // ENMTHUNDER_SUBTYPE_SWORDBEAM_GREAT @@ -75,13 +83,6 @@ static u16 sChargingSfxIds[] = { static f32 sScales[] = { 0.1f, 0.15f, 0.2f, 0.25f, 0.3f, 0.25f, 0.2f, 0.15f, 0.0f }; -typedef enum { - /* 0 */ ENMTHUNDER_SUBTYPE_SPIN_GREAT, - /* 1 */ ENMTHUNDER_SUBTYPE_SPIN_REGULAR, - /* 2 */ ENMTHUNDER_SUBTYPE_SWORDBEAM_GREAT, - /* 3 */ ENMTHUNDER_SUBTYPE_SWORDBEAM_REGULAR -} EnMThunderSubType; - void EnMThunder_UnkType_Setup(EnMThunder* this, PlayState* play) { Player* player = GET_PLAYER(play); diff --git a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c index b14919a8e..0c54cf761 100644 --- a/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c +++ b/src/overlays/actors/ovl_En_Ma4/z_en_ma4.c @@ -111,33 +111,58 @@ void EnMa4_UpdateEyes(EnMa4* this) { } } -static AnimationSpeedInfo sAnimationInfo[] = { - { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, - { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, - { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniShootBowAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, - { &gRomaniShootBowAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, - { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, +typedef enum EnMa4Animation { + /* -1 */ ENMA4_ANIM_NONE = -1, + /* 0 */ ENMA4_ANIM_0, + /* 1 */ ENMA4_ANIM_1, + /* 2 */ ENMA4_ANIM_2, + /* 3 */ ENMA4_ANIM_3, + /* 4 */ ENMA4_ANIM_4, + /* 5 */ ENMA4_ANIM_5, + /* 6 */ ENMA4_ANIM_6, + /* 7 */ ENMA4_ANIM_7, + /* 8 */ ENMA4_ANIM_8, + /* 9 */ ENMA4_ANIM_9, + /* 10 */ ENMA4_ANIM_10, + /* 11 */ ENMA4_ANIM_11, + /* 12 */ ENMA4_ANIM_12, + /* 13 */ ENMA4_ANIM_13, + /* 14 */ ENMA4_ANIM_14, + /* 15 */ ENMA4_ANIM_15, + /* 16 */ ENMA4_ANIM_16, + /* 17 */ ENMA4_ANIM_17, + /* 18 */ ENMA4_ANIM_18, + /* 19 */ ENMA4_ANIM_19, + /* 20 */ ENMA4_ANIM_MAX +} EnMa4Animation; + +static AnimationSpeedInfo sAnimationSpeedInfo[ENMA4_ANIM_MAX] = { + { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_0 + { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_1 + { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_2 + { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_3 + { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // ENMA4_ANIM_4 + { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, // ENMA4_ANIM_5 + { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_6 + { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_7 + { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_8 + { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_9 + { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_10 + { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_11 + { &gRomaniShootBowAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // ENMA4_ANIM_12 + { &gRomaniShootBowAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, // ENMA4_ANIM_13 + { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_14 + { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_15 + { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_16 + { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_17 + { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMA4_ANIM_18 + { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMA4_ANIM_19 }; void EnMa4_ChangeAnim(EnMa4* this, s32 animIndex) { - Animation_Change(&this->skelAnime, sAnimationInfo[animIndex].animation, 1.0f, 0.0f, - Animation_GetLastFrame(sAnimationInfo[animIndex].animation), sAnimationInfo[animIndex].mode, - sAnimationInfo[animIndex].morphFrames); + Animation_Change(&this->skelAnime, sAnimationSpeedInfo[animIndex].animation, 1.0f, 0.0f, + Animation_GetLastFrame(sAnimationSpeedInfo[animIndex].animation), + sAnimationSpeedInfo[animIndex].mode, sAnimationSpeedInfo[animIndex].morphFrames); } void func_80ABDD9C(EnMa4* this, PlayState* play) { @@ -210,24 +235,24 @@ void EnMa4_Init(Actor* thisx, PlayState* play) { } if (Cutscene_GetSceneLayer(play) != 0) { - EnMa4_ChangeAnim(this, 0); + EnMa4_ChangeAnim(this, ENMA4_ANIM_0); this->state = MA4_STATE_HORSEBACKGAME; EnMa4_InitHorsebackGame(this, play); } else { EnMa4_InitPath(this, play); if (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 1)) { - EnMa4_ChangeAnim(this, 0); + EnMa4_ChangeAnim(this, ENMA4_ANIM_0); this->state = MA4_STATE_AFTERHORSEBACKGAME; } else if (gSaveContext.save.entrance == ENTRANCE(ROMANI_RANCH, 10)) { - EnMa4_ChangeAnim(this, 0); + EnMa4_ChangeAnim(this, ENMA4_ANIM_0); this->state = MA4_STATE_AFTERDESCRIBETHEMCS; } else { if (this->type == MA4_TYPE_ALIENS_WON) { - EnMa4_ChangeAnim(this, 14); + EnMa4_ChangeAnim(this, ENMA4_ANIM_14); this->actor.shape.shadowScale = 0.0f; } else { - EnMa4_ChangeAnim(this, 8); + EnMa4_ChangeAnim(this, ENMA4_ANIM_8); } this->state = MA4_STATE_DEFAULT; } @@ -245,30 +270,30 @@ void EnMa4_Destroy(Actor* thisx, PlayState* play) { // Running in circles in the ranch void EnMa4_RunInCircles(EnMa4* this, PlayState* play) { - static s32 sAnimIndex = 9; + static s32 sAnimIndex = ENMA4_ANIM_9; static s32 D_80AC0250 = 0; static s16 D_80AC0254 = 10; Vec3f sp34; s32 pad; s16 sp2E; - if ((sAnimIndex != 9) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - if (sAnimIndex == 3) { + if ((sAnimIndex != ENMA4_ANIM_9) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { + if (sAnimIndex == ENMA4_ANIM_3) { if (D_80AC0250 < 3) { D_80AC0250++; } else { D_80AC0250 = 0; - EnMa4_ChangeAnim(this, 13); - sAnimIndex = 13; + EnMa4_ChangeAnim(this, ENMA4_ANIM_13); + sAnimIndex = ENMA4_ANIM_13; } } else { this->actor.speed = 2.7f; - EnMa4_ChangeAnim(this, 9); - sAnimIndex = 9; + EnMa4_ChangeAnim(this, ENMA4_ANIM_9); + sAnimIndex = ENMA4_ANIM_9; } } - if ((sAnimIndex == 13) && Animation_OnFrame(&this->skelAnime, 37.0f)) { + if ((sAnimIndex == ENMA4_ANIM_13) && Animation_OnFrame(&this->skelAnime, 37.0f)) { Actor_PlaySfx(&this->actor, NA_SE_EV_ROMANI_BOW_FLICK); } @@ -283,8 +308,8 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) { if ((D_80AC0254 == 0) && ((Rand_Next() % 4) == 0)) { this->actor.speed = 0.0f; D_80AC0254 = 2; - EnMa4_ChangeAnim(this, 3); - sAnimIndex = 3; + EnMa4_ChangeAnim(this, ENMA4_ANIM_3); + sAnimIndex = ENMA4_ANIM_3; } else { if (D_80AC0254 > 0) { D_80AC0254--; @@ -310,14 +335,14 @@ void EnMa4_RunInCircles(EnMa4* this, PlayState* play) { void EnMa4_SetupWait(EnMa4* this) { if ((this->state != MA4_STATE_AFTERHORSEBACKGAME) && (this->state != MA4_STATE_AFTERDESCRIBETHEMCS)) { if (this->type != MA4_TYPE_ALIENS_WON) { - EnMa4_ChangeAnim(this, 9); + EnMa4_ChangeAnim(this, ENMA4_ANIM_9); this->actor.speed = 2.7f; } else { - EnMa4_ChangeAnim(this, 15); + EnMa4_ChangeAnim(this, ENMA4_ANIM_15); this->actor.speed = 0.0f; } } else { - EnMa4_ChangeAnim(this, 1); + EnMa4_ChangeAnim(this, ENMA4_ANIM_1); this->actor.speed = 0.0f; } @@ -338,10 +363,10 @@ void EnMa4_Wait(EnMa4* this, PlayState* play) { } else if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { this->animTimer++; if (this->animTimer == 5) { - EnMa4_ChangeAnim(this, 17); // Traumatized anim + EnMa4_ChangeAnim(this, ENMA4_ANIM_17); // Traumatized anim } else if (this->animTimer == 8) { this->animTimer = 0; - EnMa4_ChangeAnim(this, 15); // Sitting anim + EnMa4_ChangeAnim(this, ENMA4_ANIM_15); // Sitting anim } } @@ -626,9 +651,9 @@ void EnMa4_ChooseNextDialogue(EnMa4* this, PlayState* play) { void EnMa4_SetupDialogueHandler(EnMa4* this) { if (this->type != MA4_TYPE_ALIENS_WON) { - EnMa4_ChangeAnim(this, 1); + EnMa4_ChangeAnim(this, ENMA4_ANIM_1); } else { - EnMa4_ChangeAnim(this, 15); + EnMa4_ChangeAnim(this, ENMA4_ANIM_15); } this->actionFunc = EnMa4_DialogueHandler; } @@ -720,7 +745,7 @@ void EnMa4_HorsebackGameWait(EnMa4* this, PlayState* play) { player->stateFlags3 |= PLAYER_STATE3_400; EnMa4_HorsebackGameCheckPlayerInteractions(this, play); - if (this->poppedBalloonCounter != D_80AC0258) { + if (D_80AC0258 != this->poppedBalloonCounter) { D_80AC0258 = this->poppedBalloonCounter; play->interfaceCtx.minigamePoints = 1; } @@ -805,6 +830,7 @@ void EnMa4_SetupEponasSongCs(EnMa4* this) { } static u16 sCueId = 99; + void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) { if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_120)) { s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_120); @@ -817,12 +843,12 @@ void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) { switch (play->csCtx.actorCues[cueChannel]->id) { case 1: this->hasBow = true; - EnMa4_ChangeAnim(this, 1); + EnMa4_ChangeAnim(this, ENMA4_ANIM_1); break; case 2: this->hasBow = false; - EnMa4_ChangeAnim(this, 4); + EnMa4_ChangeAnim(this, ENMA4_ANIM_4); break; default: @@ -833,7 +859,7 @@ void EnMa4_EponasSongCs(EnMa4* this, PlayState* play) { Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); if ((sCueId == 2) && (this->animTimer == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - EnMa4_ChangeAnim(this, 7); + EnMa4_ChangeAnim(this, ENMA4_ANIM_7); } } else { Player* player = GET_PLAYER(play); diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c index 0e95ee354..86c70ae69 100644 --- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c +++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c @@ -105,31 +105,60 @@ static CollisionCheckInfoInit2 sColChkInfoInit2 = { 0, 0, 0, 0, MASS_IMMOVABLE, }; -static AnimationSpeedInfo sAnimationInfo[] = { - { &gCremiaIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gCremiaSpreadArmsStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, - { &gCremiaSpreadArmsStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, - { &gCremiaSpreadArmsLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaSpreadArmsLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gCremiaWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaWalkAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaThinkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaThinkAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaPetCowAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaPetCowAnim, 1.0f, ANIMMODE_LOOP, -10.0f }, - { &gCremiaSittingPetCowAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaSittingPetCowAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaSittingAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaHugStartAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaHugStartAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaHugLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaHugLoopAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, - { &gCremiaClapAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gCremiaClapAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, +typedef enum CremiaAnimation { + /* -1 */ CREMIA_ANIM_NONE = -1, + /* 0 */ CREMIA_ANIM_0, + /* 1 */ CREMIA_ANIM_1, + /* 2 */ CREMIA_ANIM_2, + /* 3 */ CREMIA_ANIM_3, + /* 4 */ CREMIA_ANIM_4, + /* 5 */ CREMIA_ANIM_5, + /* 6 */ CREMIA_ANIM_6, + /* 7 */ CREMIA_ANIM_7, + /* 8 */ CREMIA_ANIM_8, + /* 9 */ CREMIA_ANIM_9, + /* 10 */ CREMIA_ANIM_10, + /* 11 */ CREMIA_ANIM_11, + /* 12 */ CREMIA_ANIM_12, + /* 13 */ CREMIA_ANIM_13, + /* 14 */ CREMIA_ANIM_14, + /* 15 */ CREMIA_ANIM_15, + /* 16 */ CREMIA_ANIM_16, + /* 17 */ CREMIA_ANIM_17, + /* 18 */ CREMIA_ANIM_18, + /* 19 */ CREMIA_ANIM_19, + /* 20 */ CREMIA_ANIM_20, + /* 21 */ CREMIA_ANIM_21, + /* 22 */ CREMIA_ANIM_22, + /* 23 */ CREMIA_ANIM_23, + /* 24 */ CREMIA_ANIM_MAX +} CremiaAnimation; + +static AnimationSpeedInfo sAnimationSpeedInfo[CREMIA_ANIM_MAX] = { + { &gCremiaIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_0 + { &gCremiaIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // CREMIA_ANIM_1 + { &gCremiaSpreadArmsStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // CREMIA_ANIM_2 + { &gCremiaSpreadArmsStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, // CREMIA_ANIM_3 + { &gCremiaSpreadArmsLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_4 + { &gCremiaSpreadArmsLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // CREMIA_ANIM_5 + { &gCremiaWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_6 + { &gCremiaWalkAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_7 + { &gCremiaThinkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_8 + { &gCremiaThinkAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_9 + { &gCremiaPetCowAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_10 + { &gCremiaPetCowAnim, 1.0f, ANIMMODE_LOOP, -10.0f }, // CREMIA_ANIM_11 + { &gCremiaSittingPetCowAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_12 + { &gCremiaSittingPetCowAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_13 + { &gCremiaSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_14 + { &gCremiaSittingAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_15 + { &gCremiaSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_16 + { &gCremiaSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_17 + { &gCremiaHugStartAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_18 + { &gCremiaHugStartAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_19 + { &gCremiaHugLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_20 + { &gCremiaHugLoopAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_21 + { &gCremiaClapAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // CREMIA_ANIM_22 + { &gCremiaClapAnim, 1.0f, ANIMMODE_LOOP, -8.0f }, // CREMIA_ANIM_23 }; static TexturePtr sMouthTextures[] = { @@ -228,35 +257,35 @@ s32 EnMaYto_CheckValidSpawn(EnMaYto* this, PlayState* play) { void EnMaYto_InitAnimation(EnMaYto* this, PlayState* play) { switch (this->type) { case MA_YTO_TYPE_DEFAULT: - EnMaYto_ChangeAnim(this, 10); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_10); break; case MA_YTO_TYPE_DINNER: if (CURRENT_DAY == 1) { - EnMaYto_ChangeAnim(this, 14); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_14); } else { - EnMaYto_ChangeAnim(this, 16); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_16); } break; case MA_YTO_TYPE_BARN: if (CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) { - EnMaYto_ChangeAnim(this, 12); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_12); } else { - EnMaYto_ChangeAnim(this, 8); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_8); } break; case MA_YTO_TYPE_AFTERMILKRUN: - EnMaYto_ChangeAnim(this, 0); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_0); break; case MA_YTO_TYPE_4: - EnMaYto_ChangeAnim(this, 0); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_0); break; default: - EnMaYto_ChangeAnim(this, 0); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_0); break; } } @@ -310,10 +339,10 @@ s32 EnMaYto_SearchRomani(EnMaYto* this, PlayState* play) { this->actor.child = &romani->actor; romani->actor.parent = &this->actor; return true; - } else { - npcActor = npcActor->next; - continue; } + + npcActor = npcActor->next; + continue; } npcActor = npcActor->next; } @@ -355,9 +384,10 @@ s32 EnMaYto_TryFindRomani(EnMaYto* this, PlayState* play) { case MA_YTO_TYPE_4: return 0; - } - return 0; + default: + return 0; + } } void EnMaYto_Destroy(Actor* thisx, PlayState* play) { @@ -378,11 +408,11 @@ void EnMaYto_KeepLookingForRomani(EnMaYto* this, PlayState* play) { void EnMaYto_SetupDefaultWait(EnMaYto* this) { if (this->actor.shape.rot.y == this->actor.home.rot.y) { - this->animIndex = 11; - EnMaYto_ChangeAnim(this, 11); + this->animIndex = CREMIA_ANIM_11; + EnMaYto_ChangeAnim(this, CREMIA_ANIM_11); } else { - this->animIndex = 1; - EnMaYto_ChangeAnim(this, 1); + this->animIndex = CREMIA_ANIM_1; + EnMaYto_ChangeAnim(this, CREMIA_ANIM_1); } EnMaYto_InitFaceExpression(this); @@ -396,9 +426,9 @@ void EnMaYto_DefaultWait(EnMaYto* this, PlayState* play) { direction = rotY - this->actor.yawTowardsPlayer; if (!Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x3000, 0x100) && - (this->animIndex == 1)) { - this->animIndex = 11; - EnMaYto_ChangeAnim(this, 11); + (this->animIndex == CREMIA_ANIM_1)) { + this->animIndex = CREMIA_ANIM_11; + EnMaYto_ChangeAnim(this, CREMIA_ANIM_11); } if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { @@ -410,7 +440,7 @@ void EnMaYto_DefaultWait(EnMaYto* this, PlayState* play) { } void EnMaYto_SetupDefaultDialogueHandler(EnMaYto* this) { - EnMaYto_ChangeAnim(this, 1); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_1); this->unk31E = 2; this->actionFunc = EnMaYto_DefaultDialogueHandler; } @@ -436,13 +466,14 @@ void EnMaYto_DefaultDialogueHandler(EnMaYto* this, PlayState* play) { case TEXT_STATE_1: case TEXT_STATE_CLOSING: case TEXT_STATE_3: + default: break; } Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x3000, 0x100); if ((this->textId == 0x3395) && (this->skelAnime.animation == &gCremiaSpreadArmsStartAnim) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - EnMaYto_ChangeAnim(this, 4); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_4); } } @@ -451,12 +482,10 @@ void EnMaYto_DefaultHandlePlayerChoice(EnMaYto* this, PlayState* play) { if (play->msgCtx.choiceIndex == 0) { // Yes Audio_PlaySfx_MessageDecide(); EnMaYto_SetFaceExpression(this, 0, 3); - // "Milk Road is fixed!" Message_StartTextbox(play, 0x3392, &this->actor); this->textId = 0x3392; } else { // No Audio_PlaySfx_MessageCancel(); - // "Don't lie!" Message_StartTextbox(play, 0x3391, &this->actor); this->textId = 0x3391; } @@ -480,13 +509,13 @@ void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, PlayState* play) { break; case 0x3394: - EnMaYto_ChangeAnim(this, 2); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_2); Message_StartTextbox(play, 0x3395, &this->actor); this->textId = 0x3395; break; case 0x3395: - EnMaYto_ChangeAnim(this, 1); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_1); Message_StartTextbox(play, 0x3396, &this->actor); this->textId = 0x3396; Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA); @@ -570,6 +599,7 @@ void EnMaYto_DinnerDialogueHandler(EnMaYto* this, PlayState* play) { case TEXT_STATE_1: case TEXT_STATE_CLOSING: case TEXT_STATE_3: + default: break; } } @@ -579,12 +609,10 @@ void EnMaYto_DinnerHandlePlayerChoice(EnMaYto* this, PlayState* play) { if (play->msgCtx.choiceIndex == 0) { // Yes Audio_PlaySfx_MessageDecide(); EnMaYto_SetFaceExpression(this, 0, 3); - // "Milk Road is fixed!" Message_StartTextbox(play, 0x3399, &this->actor); this->textId = 0x3399; } else { // No Audio_PlaySfx_MessageCancel(); - // "Don't lie!" Message_StartTextbox(play, 0x3398, &this->actor); this->textId = 0x3398; } @@ -695,12 +723,12 @@ void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, PlayState* play) { void EnMaYto_SetupBarnWait(EnMaYto* this) { if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) { - EnMaYto_ChangeAnim(this, 13); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_13); func_80B90E50(this, 0); this->unk31E = 0; } else { this->unk320 = 0; - EnMaYto_ChangeAnim(this, 9); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_9); func_80B90E50(this, 2); this->unk31E = 2; } @@ -761,6 +789,7 @@ void EnMaYto_BarnDialogueHandler(EnMaYto* this, PlayState* play) { case TEXT_STATE_CLOSING: case TEXT_STATE_3: case TEXT_STATE_CHOICE: + default: break; } } @@ -821,7 +850,6 @@ void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, PlayState* play) { case 0x33B1: this->unk31E = 2; EnMaYto_SetFaceExpression(this, 5, 3); - // "I should had believed what Romani said" Message_StartTextbox(play, 0x33B2, &this->actor); this->textId = 0x33B2; Message_BombersNotebookQueueEvent(play, BOMBERS_NOTEBOOK_EVENT_MET_CREMIA); @@ -935,6 +963,9 @@ void EnMaYto_AfterMilkRunDialogueHandler(EnMaYto* this, PlayState* play) { case TEXT_STATE_5: EnMaYto_AfterMilkRunChooseNextDialogue(this, play); break; + + default: + break; } Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x71C, 0xB6); @@ -945,7 +976,6 @@ void EnMaYto_AfterMilkRunChooseNextDialogue(EnMaYto* this, PlayState* play) { switch (this->textId) { case 0x33C1: EnMaYto_SetFaceExpression(this, 3, 1); - // "Thank you. You were cool back there." Message_StartTextbox(play, 0x33C2, &this->actor); this->textId = 0x33C2; break; @@ -1040,22 +1070,23 @@ void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) { if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) { u16 cueId = play->csCtx.actorCues[cueChannel]->id; + //! FAKE: if (1) {} if (cueId != sCueId) { sCueId = cueId; switch (cueId) { case 1: - EnMaYto_ChangeAnim(this, 0); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_0); break; case 2: SET_WEEKEVENTREG(WEEKEVENTREG_14_01); - EnMaYto_ChangeAnim(this, 18); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_18); break; case 3: - EnMaYto_ChangeAnim(this, 22); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_22); break; default: @@ -1067,7 +1098,7 @@ void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, PlayState* play) { Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel); if ((sCueId == 2) && (this->skelAnime.animation == &gCremiaHugStartAnim) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { - EnMaYto_ChangeAnim(this, 20); + EnMaYto_ChangeAnim(this, CREMIA_ANIM_20); } } else { sCueId = 99; @@ -1277,9 +1308,9 @@ void EnMaYto_BarnStartDialogue(EnMaYto* this, PlayState* play) { } void EnMaYto_ChangeAnim(EnMaYto* this, s32 animIndex) { - Animation_Change(&this->skelAnime, sAnimationInfo[animIndex].animation, 1.0f, 0.0f, - Animation_GetLastFrame(sAnimationInfo[animIndex].animation), sAnimationInfo[animIndex].mode, - sAnimationInfo[animIndex].morphFrames); + Animation_Change(&this->skelAnime, sAnimationSpeedInfo[animIndex].animation, 1.0f, 0.0f, + Animation_GetLastFrame(sAnimationSpeedInfo[animIndex].animation), + sAnimationSpeedInfo[animIndex].mode, sAnimationSpeedInfo[animIndex].morphFrames); } void func_80B90C78(EnMaYto* this, PlayState* play) { diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c index d1e9c91f5..134d890ae 100644 --- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c +++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c @@ -77,29 +77,56 @@ static CollisionCheckInfoInit2 sColChkInfoInit2 = { 0, 0, 0, 0, MASS_IMMOVABLE, }; -static AnimationSpeedInfo sAnimationInfo[] = { - { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, - { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, - { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniShootBowAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniShootBowAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, - { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, - { &gRomaniTurnAroundAndFlickHairAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, - { &gRomaniTurnAroundAndFlickHairAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, +typedef enum EnMaYtsAnimation { + /* -1 */ ENMATYS_ANIM_NONE = -1, + /* 0 */ ENMATYS_ANIM_0, + /* 1 */ ENMATYS_ANIM_1, + /* 2 */ ENMATYS_ANIM_2, + /* 3 */ ENMATYS_ANIM_3, + /* 4 */ ENMATYS_ANIM_4, + /* 5 */ ENMATYS_ANIM_5, + /* 6 */ ENMATYS_ANIM_6, + /* 7 */ ENMATYS_ANIM_7, + /* 8 */ ENMATYS_ANIM_8, + /* 9 */ ENMATYS_ANIM_9, + /* 10 */ ENMATYS_ANIM_10, + /* 11 */ ENMATYS_ANIM_11, + /* 12 */ ENMATYS_ANIM_12, + /* 13 */ ENMATYS_ANIM_13, + /* 14 */ ENMATYS_ANIM_14, + /* 15 */ ENMATYS_ANIM_15, + /* 16 */ ENMATYS_ANIM_16, + /* 17 */ ENMATYS_ANIM_17, + /* 18 */ ENMATYS_ANIM_18, + /* 19 */ ENMATYS_ANIM_19, + /* 20 */ ENMATYS_ANIM_20, + /* 21 */ ENMATYS_ANIM_21, + /* 22 */ ENMATYS_ANIM_MAX +} EnMaYtsAnimation; + +static AnimationSpeedInfo sAnimationSpeedInfo[ENMATYS_ANIM_MAX] = { + { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_0 + { &gRomaniIdleAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_1 + { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // ENMATYS_ANIM_2 + { &gRomaniSingStartAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, // ENMATYS_ANIM_3 + { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_4 + { &gRomaniSingLoopAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_5 + { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_6 + { &gRomaniRunAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_7 + { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_8 + { &gRomaniWalkAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_9 + { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_10 + { &gRomaniLookAroundAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_11 + { &gRomaniShootBowAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_12 + { &gRomaniShootBowAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_13 + { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_14 + { &gRomaniSittingAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_15 + { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_16 + { &gRomaniSittingHeadShakeAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_17 + { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, 0.0f }, // ENMATYS_ANIM_18 + { &gRomaniSittingLookDownAnim, 1.0f, ANIMMODE_LOOP, -6.0f }, // ENMATYS_ANIM_19 + { &gRomaniTurnAroundAndFlickHairAnim, 1.0f, ANIMMODE_ONCE, 0.0f }, // ENMATYS_ANIM_20 + { &gRomaniTurnAroundAndFlickHairAnim, 1.0f, ANIMMODE_ONCE, -6.0f }, // ENMATYS_ANIM_21 }; static TexturePtr sMouthTextures[] = { @@ -114,9 +141,9 @@ static TexturePtr sEyeTextures[] = { }; void EnMaYts_ChangeAnim(EnMaYts* this, s32 animIndex) { - Animation_Change(&this->skelAnime, sAnimationInfo[animIndex].animation, 1.0f, 0.0f, - Animation_GetLastFrame(sAnimationInfo[animIndex].animation), sAnimationInfo[animIndex].mode, - sAnimationInfo[animIndex].morphFrames); + Animation_Change(&this->skelAnime, sAnimationSpeedInfo[animIndex].animation, 1.0f, 0.0f, + Animation_GetLastFrame(sAnimationSpeedInfo[animIndex].animation), + sAnimationSpeedInfo[animIndex].mode, sAnimationSpeedInfo[animIndex].morphFrames); } void func_80B8D12C(EnMaYts* this, PlayState* play) { @@ -138,32 +165,32 @@ void EnMaYts_InitAnimation(EnMaYts* this, PlayState* play) { switch (this->type) { case MA_YTS_TYPE_BARN: this->actor.targetMode = TARGET_MODE_0; - EnMaYts_ChangeAnim(this, 0); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_0); break; case MA_YTS_TYPE_SITTING: this->actor.targetMode = TARGET_MODE_6; // Day 1 or "Winning" the alien invasion if ((CURRENT_DAY == 1) || CHECK_WEEKEVENTREG(WEEKEVENTREG_DEFENDED_AGAINST_THEM)) { - EnMaYts_ChangeAnim(this, 14); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_14); } else { - EnMaYts_ChangeAnim(this, 18); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_18); } break; case MA_YTS_TYPE_SLEEPING: this->actor.targetMode = TARGET_MODE_0; this->actor.draw = EnMaYts_DrawSleeping; - EnMaYts_ChangeAnim(this, 0); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_0); break; case MA_YTS_TYPE_ENDCREDITS: this->actor.targetMode = TARGET_MODE_0; - EnMaYts_ChangeAnim(this, 0); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_0); break; default: - EnMaYts_ChangeAnim(this, 0); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_0); break; } } @@ -374,6 +401,7 @@ void EnMaYts_DialogueHandler(EnMaYts* this, PlayState* play) { case TEXT_STATE_CLOSING: case TEXT_STATE_3: case TEXT_STATE_CHOICE: + default: break; } } @@ -385,6 +413,7 @@ void EnMaYts_SetupEndCreditsHandler(EnMaYts* this) { } static u16 sCueId = 99; + void EnMaYts_EndCreditsHandler(EnMaYts* this, PlayState* play) { if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_120)) { s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_120); @@ -396,22 +425,22 @@ void EnMaYts_EndCreditsHandler(EnMaYts* this, PlayState* play) { switch (play->csCtx.actorCues[cueChannel]->id) { case 1: this->hasBow = true; - EnMaYts_ChangeAnim(this, 0); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_0); break; case 2: this->hasBow = false; - EnMaYts_ChangeAnim(this, 2); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_2); break; case 3: this->hasBow = true; - EnMaYts_ChangeAnim(this, 12); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_12); break; case 4: this->hasBow = true; - EnMaYts_ChangeAnim(this, 20); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_20); break; default: @@ -424,7 +453,7 @@ void EnMaYts_EndCreditsHandler(EnMaYts* this, PlayState* play) { if ((sCueId == 2) && (this->endCreditsFlag == 0) && Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) { this->endCreditsFlag++; - EnMaYts_ChangeAnim(this, 5); + EnMaYts_ChangeAnim(this, ENMATYS_ANIM_5); } } else { sCueId = 99; diff --git a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c index 1eca74125..d4cea0be1 100644 --- a/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c +++ b/src/overlays/actors/ovl_En_Mkk/z_en_mkk.c @@ -281,7 +281,7 @@ void func_80A4E2E8(EnMkk* this, PlayState* play) { func_80A4E190(this); } else if ((this->unk_149 == 0) && (!(player->stateFlags3 & PLAYER_STATE3_100)) && (Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) && - (Actor_IsFacingPlayer(&this->actor, 0x1800)) && (this->actor.xzDistToPlayer < 120.0f) && + Actor_IsFacingPlayer(&this->actor, 0x1800) && (this->actor.xzDistToPlayer < 120.0f) && (fabsf(this->actor.playerHeightRel) < 100.0f)) { func_80A4E58C(this); } diff --git a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c index 4d956a954..bb8da5efe 100644 --- a/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c +++ b/src/overlays/actors/ovl_En_Mm2/z_en_mm2.c @@ -68,7 +68,7 @@ void EnMm2_WaitForRead(EnMm2* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->actor, &play->state)) { Message_StartTextbox(play, 0x277B, &this->actor); this->actionFunc = EnMm2_Reading; - } else if ((this->actor.xzDistToPlayer < 60.0f) && (Player_IsFacingActor(&this->actor, 0x3000, play))) { + } else if ((this->actor.xzDistToPlayer < 60.0f) && Player_IsFacingActor(&this->actor, 0x3000, play)) { Actor_OfferTalk(&this->actor, play, 110.0f); } } diff --git a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c index 099bc07c2..204d3892f 100644 --- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c +++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c @@ -161,7 +161,7 @@ void func_80A44F40(EnSekihi* this, PlayState* play) { void func_80A450B0(EnSekihi* this, PlayState* play) { if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state)) { this->actionFunc = func_80A44F40; - } else if ((this->dyna.actor.xzDistToPlayer < 100.0f) && (Player_IsFacingActor(&this->dyna.actor, 0x2600, play))) { + } else if ((this->dyna.actor.xzDistToPlayer < 100.0f) && Player_IsFacingActor(&this->dyna.actor, 0x2600, play)) { Actor_OfferTalk(&this->dyna.actor, play, 120.0f); } } diff --git a/src/overlays/actors/ovl_En_Slime/z_en_slime.c b/src/overlays/actors/ovl_En_Slime/z_en_slime.c index 79af2640e..d091ed925 100644 --- a/src/overlays/actors/ovl_En_Slime/z_en_slime.c +++ b/src/overlays/actors/ovl_En_Slime/z_en_slime.c @@ -407,7 +407,7 @@ void EnSlime_MoveInDirection(EnSlime* this, PlayState* play) { // If actor is too far from home, start return home cycle EnSlime_SetupMoveToHome(this); } else if ((Player_GetMask(play) != PLAYER_MASK_STONE) && (this->actor.xzDistToPlayer < 280.0f) && - (Actor_IsFacingPlayer(&this->actor, 0x5000))) { + Actor_IsFacingPlayer(&this->actor, 0x5000)) { // If player is close enough to chuchu while not wearing the stone mask, and the chuchu is facing player, // initialize attack cycle EnSlime_SetupTurnToPlayer(this); diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index 38f62b2b0..069663f31 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -4074,7 +4074,7 @@ s32 func_80830E30(Player* this, PlayState* play) { } PlayerAnimation_PlayOnce(play, &this->skelAnimeUpper, - (Player_IsHoldingHookshot(this)) + Player_IsHoldingHookshot(this) ? &gPlayerAnim_link_hook_shot_ready : ((this->transformation == PLAYER_FORM_DEKU) ? &gPlayerAnim_pn_tamahakidf : &gPlayerAnim_link_bow_bow_ready));